——Van het DWIN-ontwikkelaarsforum
In dit nummer introduceren we u de bekroonde open source-case van het DWIN Developer Forum - de slimme kweekruimte. Ingenieurs hebben het slimme T5L-scherm geïmplementeerd om de verwarmings- en ventilatortemperatuurregelingsfuncties te regelen via het Modbus-protocol. Ook kan de voeding worden aangepast om de verlichtingsfunctie te simuleren. Het systeem kan automatisch werken volgens de parameters die op het scherm zijn ingesteld en foutgeschiedenisrecords opslaan.
1.UI-materiaalweergave
![asvdfb (2)](https://ecdn6.globalso.com/upload/p/1355/source/2024-03/65f96ba08612736786.jpg)
![asvdfb (1)](https://ecdn6.globalso.com/upload/p/1355/source/2024-03/65f96ba210c7924337.jpg)
2.UI-ontwerp
1.C51 Ontwerp
De belangrijkste codes voor het verkrijgen en bijwerken van gegevens zoals temperatuur, vochtigheid en hoogte op de hoofdinterface, en het gebruik van modbus rtu om temperatuurregelmodules, motoren, alarmdetectie en andere slave-machines te besturen, zijn als volgt
Referentie van de hoofdinterfacecode:
#include "main_win.h"
#include "modbus.h"
#include "sys_params.h"
#include "func_handler.h"
#include "uart2.h"
#erbij betrekken
#erbij betrekken
#define TEMP_HUM_SLAVE_ADDR 2
#define TEMP_HUM_VAL_MAX_NUM 2
#define ALERT_BIT_MAX_NUM 30
#define ALERT_BYTE_NUM (ALERT_BIT_MAX_NUM/8+((ALERT_BIT_MAX_NUM%8)!=0))
#define GET_ALERT_BIT(val, pos) ((val[pos/8]>>(pos%8))&0x01)
typedef-structuur{
tekendatum[17];
u8 beschrijving;
}ALERT;
#define ALERT_TABLE_LEN 20
statisch u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};
statisch u8 btn_addr[MAIN_WIN_BTN_MAX_NUM] = {50, 51, 52, 69, 53, 54, 55, 70, 56, 57, 58, 59};
u16 hoofd_win_val[MAIN_WIN_VAL_MAX_NUM];
u16 temp_hum_val[TEMP_HUM_VAL_MAX_NUM] = {0};
u16 datum_val[MAIN_WIN_DATE_MAX_NUM] = {0};
u8 alert_val[ALERT_BYTE_NUM] = {0};
u8 oude_alert_val[ALERT_BYTE_NUM] = {0};
ALERT alert_tabel[ALERT_TABLE_LEN];
u16 waarschuwingsnummer = 0;
bit is_main_win = 0;
void main_win_update()
{
}
void main_win_disp_date()
{
alleen u8;
len = sprintf(common_buf, "%u:%u", (u16)date_val[3], (u16)date_val[4]);
algemene_buf[len+1] = 0;
sys_write_vp(MAIN_WIN_DATE_VP, common_buf, len/2+2);
}
void main_win_process_alert()
{
u8 ik;
voor(i=0;i
{
if(GET_ALERT_BIT(oude_alert_val, i))
doorgaan;
if(GET_ALERT_BIT(alert_val, i))
{
if(alert_num>=ALERT_TABLE_LEN)
alert_num = ALERT_TABLE_LEN-1;
alert_table[alert_num].desc = i+1;
sprintf(alert_table[alert_num].date, "%u/%u/%u %u:%u",
datum_val[0], datum_val[1], datum_val[2], datum_val[3], datum_val[4]
);
alert_num++;
}
}
memcpy(oude_alert_val, alert_val, sizeof(alert_val));
}
void main_win_disp_alert()
{
u16 en;
met u16;
alleen u16 = 0;
algemene_buf[0] = 0;
voor(i=0;i
{
waarde = 0;
als ik
{
val = alert_table.desc;
len += sprintf(common_buf+len, "%s\r\n", alert_table.date);
}
sys_write_vp(ALERT_WIN_DESC_START_VP+i, (u8*)&val, 1);
}
algemene_buf[len+1] = 0;
sys_write_vp(ALERT_WIN_DATE_VP, common_buf, len/2+2);
}
leegte main_win_init()
{
zweven vaste_val;
u8 ik;
is_main_win = 1;
main_win_val[5] = (u16)(temp_hum_val[0]/10.0+0.5f);
main_win_val[6] = (u16)(temp_hum_val[1]/10.0+0.5f);
voor(i=0;i
{
als(ik==0)
doorgaan;
sys_write_vp(MAIN_WIN_WIND_SPEED_VP+MAIN_WIN_VAL_OFFSET*i, (u8*)&main_win_val, 1);
}
fixed_val = main_win_val[0]/WIND_SPEED_SCALE+FLOAT_FIX_VAL;
sys_write_vp(MAIN_WIN_WIND_SPEED_VP, (u8*)&fixed_val, 2);
}
void main_win_click_handler(u16 btn_val)
{
u8-index;
als(btn_val==0x0B)
{
main_win_disp_alert();
opbrengst;
}
index = btn_val-1;
btn_sta[index] = !btn_sta[index];
als((index==3)||(index==7))
btn_sta[index] = 1;
modbus_write_bit(btn_addr[index], btn_sta[index]?0xFF00:0x0000);
btn_val = btn_sta[index];
sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*index, (u8*)&btn_val, 1);
als(index==9)
is_main_win = 0;
anders als((index==3)||(index==7))
{
while(sys_get_touch_sta());
modbus_write_bit(btn_addr[index], 0x0000);
}
}
void main_win_msg_handler(u8 *msg,u16 msg_len)
{
u8 f_code = bericht[MODBUS_RESPOND_POS_FUNC_CODE];
u8 data_len = bericht[MODBUS_RESPOND_POS_DATA_LEN];
u8 ik;
u8-verschuiving;
msg_len = bericht_len;
als(!is_main_win)
opbrengst;
als((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_VAL_MAX_NUM*2))
{
verschuiving = MODBUS_RESPOND_POS_DATA;
voor(i=0;i
{
main_win_val = SYS_GET_U16(msg[offset], msg[offset+1]);
verschuiving += 2;
}
main_win_update();
}else if((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))
{
verschuiving = MODBUS_RESPOND_POS_DATA;
voor(i=0;i
{
alert_val = bericht[offset];
compensatie++;
}
main_win_process_alert();
}else if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))
{
verschuiving = MODBUS_RESPOND_POS_DATA;
voor(i=0;i
{
temp_hum_val = SYS_GET_U16(msg[offset], msg[offset+1]);
verschuiving += 2;
modbus_write_word(5+i, temp_hum_val);
}
main_win_update();
}else if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))
{
verschuiving = MODBUS_RESPOND_POS_DATA;
voor(i=0;i
{
date_val = SYS_GET_U16(msg[offset], msg[offset+1]);
verschuiving += 2;
}
main_win_disp_date();
}
}
void main_win_read_temp_hum()
{
u8 oude_slaaf_addr = SLAVE_ADDR;
sys_params.user_config[5] = TEMP_HUM_SLAVE_ADDR;
modbus_read_words(0, TEMP_HUM_VAL_MAX_NUM);
sys_params.user_config[5] = old_slave_addr;//Terugzetten
}
leegte main_win_handler()
{
statische u8-vlag = 0;
als(is_main_win)
{
if(alert_read_period==ALERT_READ_PERIOD)
{
alert_read_period = 0;
modbus_read_bits(510, ALERT_BIT_MAX_NUM);
opbrengst;
}
if(date_update_period==DATE_UPDATE_PERIOD)
{
datum_update_periode = 0;
modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);
opbrengst;
}
vlag = !vlag;
als(vlag)
modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);
anders
main_win_read_temp_hum();
}
}
modbus rtu-codereferentie:
#include "modbus.h"
#include "crc16.h"
#include "sys_params.h"
#define UART_INCLUDE "uart2.h"
#define UART_INIT uart2_init
#define UART_SEND_BYTES uart2_send_bytes
#define UART_BAUD 9600
#define MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2)
#define MODBUS_SEND_INTERVAL 150
#include UART_INCLUDE
statisch bit is_modbus_recv_complete = 0;
statische u8 modbus_recv_buff[270];
static u16 modbus_recv_len = 0;//Totale lengte van geaccepteerde bytes
statische u8 modbus_recv_timeout = 0;//Accepteer overlooptijd
statisch vluchtig u16 modbus_send_interval = 0;
MODBUS_PACKET-pakket;
ongeldig modbus_init()
{
UART_INIT(UART_BAUD);
}
void modbus_send_bytes(u8 *bytes,u16 len)
{
UART_SEND_BYTES(bytes,len);
}
ongeldig modbus_recv_byte(u8 byte)
{
if(is_modbus_recv_complete)
opbrengst;
if(modbus_recv_len
modbus_recv_buff[modbus_recv_len++] = byte;
}
void modbus_check_recv_timeout()
{
als(modbus_recv_timeout)
{
modbus_recv_timeout--;
als(modbus_recv_timeout==0)
{
is_modbus_recv_complete = 1;
}
}
}
u8 modbus_send_packet(u8 *pakket)
{
alleen u16;
u16 crc;
u8 func_code = pakket[1];
while(modbus_send_interval);
als(func_code==MODBUS_FUNC_CODE_10)
{
((MODBUS_10_PACKET*)pakket)->byte_num = ((MODBUS_10_PACKET*)pakket)->word_num*2;
len = 9+((MODBUS_10_PACKET*)pakket)->byte_num;
}anders als(func_code==MODBUS_FUNC_CODE_0F)
{
len = ((MODBUS_0F_PACKET*)pakket)->bit_num;
((MODBUS_0F_PACKET*)pakket)->byte_num = len/8+(len%8?1:0);
len = 9+((MODBUS_0F_PACKET*)pakket)->byte_num;
}anders
{
len = groottevan(MODBUS_PACKET);
}
crc = crc16(pakket,len-2);
pakket[len-2] = (u8)(crc>>8);
pakket[len-1] = (u8)crc;
modbus_send_bytes(pakket,len);
modbus_send_interval = MODBUS_SEND_INTERVAL;
retourneert 0;//Succes
}
extern void modbus_msg_handler(u8 *msg,u16 msg_len);
ongeldig modbus_handler()
{
u16 crc;
if(!is_modbus_recv_complete)
opbrengst;
//Controleer de crc-waarde
crc = ((u16)modbus_recv_buff[modbus_recv_len-2]
if(crc16(modbus_recv_buff,modbus_recv_len-2)==crc)
{
modbus_msg_handler(modbus_recv_buff,modbus_recv_len);
}
modbus_recv_len = 0;
is_modbus_recv_complete = 0;
}
u8 modbus_send_fcode(u8 fcode, u16 addr, u16 len)
{
pakket.slave_addr = SLAVE_ADDR;
packet.func_code = fcode;//Functiecode
packet.start_addr = adres;//Adres
packet.data_len = len;//Waarde geschreven
len = modbus_send_packet((u8*)&pakket);
retourlening;
}
Posttijd: 12 januari 2024