[Open Source]Intelligente trainingsruimte

——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)
asvdfb (1)

2.UI-ontwerp

asvdfb (3)

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()

{

u8 len;

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 ik;

u16 waarde;

u16 len = 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)

{

u16 len;

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]<<8)+modbus_recv_buff[modbus_recv_len-1];

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