[Oopbron]Intelligente Opleidingskamer

——Van DWIN-ontwikkelaarsforum

In hierdie uitgawe stel ons die bekroonde oopbron-geval van die DWIN-ontwikkelaarsforum - die slim kweekkamer - aan u bekend.Ingenieurs het die T5L-slimskerm geïmplementeer om verwarming- en waaiertemperatuurbeheerfunksies deur die Modbus-protokol te beheer.Die kragtoevoer kan ook verstel word om die beligtingsfunksie te simuleer.Die stelsel kan outomaties loop volgens die parameters wat op die skerm gestel is en foutgeskiedenisrekords stoor.

1.UI materiaal vertoon

asvdfb (2)
asvdfb (1)

2.UI-ontwerp

asvdfb (3)

1.C51 Ontwerp

Die hoofkodes vir die verkryging en opdatering van data soos temperatuur, humiditeit en hoogte op die hoofkoppelvlak, en die gebruik van modbus rtu om temperatuurbeheermodules, motors, alarmopsporing en ander slawemasjiene te beheer, is soos volg

Hoof koppelvlak kode verwysing:

#sluit "main_win.h" in

#sluit "modbus.h" in

#sluit "sys_params.h" in

#sluit "func_handler.h" in

#sluit "uart2.h" in

#insluit

#insluit

#definieer TEMP_HUM_SLAVE_ADDR 2

#definieer TEMP_HUM_VAL_MAX_NUM 2

#definieer ALERT_BIT_MAX_NUM 30

#definieer 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 struct{

char datum[17];

u8 beskrywing;

}ALERT;

#definieer ALERT_TABLE_LEN 20

statiese u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

statiese u8 btn_addr[MAIN_WIN_BTN_MAX_NUM] = {50, 51, 52, 69, 53, 54, 55, 70, 56, 57, 58, 59};

u16 main_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 old_alert_val[ALERT_BYTE_NUM] = {0};

ALERT waarskuwingstabel[ALERT_TABLE_LEN];

u16 waarskuwing_getal = 0;

bietjie is_hoof_wen = 0;

nietig main_win_update()

{

}

nietig main_win_disp_date()

{

u8 len;

len = sprintf(common_buf, "%u:%u", (u16)datum_val[3], (u16)datum_val[4]);

common_buf[len+1] = 0;

sys_write_vp(MAIN_WIN_DATE_VP, common_buf, len/2+2);

}

void main_win_process_alert()

{

u8 ek;

vir(i=0;i

{

if(GET_ALERT_BIT(ou_waarskuwing_val, i))

aanhou;

if(GET_ALERT_BIT(waarskuwing_val, i))

{

if(alert_num>=ALERT_TABLE_LEN)

waarskuwing_num = ALERT_TABLE_LEN-1;

waarskuwingtabel[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]

);

waarskuwing_nommer++;

}

}

memcpy(ou_alert_val, alert_val, sizeof(alert_val));

}

nietig main_win_disp_alert()

{

u16 ek;

u16 val;

u16 len = 0;

common_buf[0] = 0;

vir(i=0;i

{

val = 0;

as ek

{

val = waarskuwingtabel.desc;

len += sprintf(common_buf+len, "%s\r\n", alert_table.date);

}

sys_write_vp(ALERT_WIN_DESC_START_VP+i, (u8*)&val, 1);

}

common_buf[len+1] = 0;

sys_write_vp(ALERT_WIN_DATE_VP, common_buf, len/2+2);

}

void main_win_init()

{

dryf vaste_val;

u8 ek;

is_hoof_wen = 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);

vir(i=0;i

{

if(i==0)

aanhou;

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

if(btn_val==0x0B)

{

main_win_disp_alert();

terugkeer;

}

indeks = btn_val-1;

btn_sta[indeks] = !btn_sta[indeks];

if((indeks==3)||(indeks==7))

btn_sta[indeks] = 1;

modbus_skryf_bis(btn_addr[indeks], btn_sta[indeks]?0xFF00:0x0000);

btn_val = btn_sta[indeks];

sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*indeks, (u8*)&btn_val, 1);

if(indeks==9)

is_hoof_wen = 0;

anders as((indeks==3)||(indeks==7))

{

while(sys_get_touch_sta());

modbus_skryf_bis(btn_addr[indeks], 0x0000);

}

}

nietig main_win_msg_handler(u8 *msg,u16 msg_len)

{

u8 f_code = msg[MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = msg[MODBUS_RESPOND_POS_DATA_LEN];

u8 ek;

u8 verreken;

msg_len = msg_len;

as (!is_hoofwin)

terugkeer;

if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_VAL_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

vir(i=0;i

{

main_win_val = SYS_GET_U16(msg[offset], msg[offset+1]);

offset += 2;

}

main_win_update();

}anders as((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

offset = MODBUS_RESPOND_POS_DATA;

vir(i=0;i

{

alert_val = msg[offset];

verreken++;

}

main_win_process_alert();

}anders as((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

vir(i=0;i

{

temp_hum_val = SYS_GET_U16(msg[offset], msg[offset+1]);

offset += 2;

modbus_skryfwoord(5+i, temp_hum_val);

}

main_win_update();

}anders as((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

vir(i=0;i

{

datum_val = SYS_GET_U16(msg[offset], msg[offset+1]);

offset += 2;

}

main_win_disp_date();

}

}

nietig main_win_read_temp_hum()

{

u8 old_slave_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;//Revert

}

void main_win_handler()

{

statiese u8 vlag = 0;

as (is_hoof_wen)

{

if (alert_read_period==ALERT_READ_PERIOD)

{

waarskuwing_leesperiode = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

terugkeer;

}

if (date_update_period==DATE_UPDATE_PERIOD)

{

datum_opdatering_periode = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

terugkeer;

}

vlag = !vlag;

as (vlag)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

anders

main_win_read_temp_hum();

}

}

modbus rtu kode verwysing:

#sluit "modbus.h" in

#sluit "crc16.h" in

#sluit "sys_params.h" in

#define UART_INCLUDE "uart2.h"

#definieer UART_INIT uart2_init

#definieer UART_SEND_BYTES uart2_send_bytes

#definieer UART_BAUD 9600

#define MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2)

#definieer MODBUS_SEND_INTERVAL 150

#sluit UART_INCLUDE in

statiese bietjie is_modbus_recv_complete = 0;

statiese u8 modbus_recv_buff[270];

statiese u16 modbus_recv_len = 0;//Totale lengte van grepe aanvaar

statiese u8 modbus_recv_timeout = 0;//Aanvaar oorlooptyd

statiese vlugtige u16 modbus_send_interval = 0;

MODBUS_PACKET pakkie;

nietig modbus_init()

{

UART_INIT(UART_BAUD);

}

nietig modbus_send_bytes(u8 *grepe,u16 len)

{

UART_SEND_BYTES(grepe,len);

}

void modbus_recv_byte(u8 byte)

{

if (is_modbus_recv_complete)

terugkeer;

if(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = greep;

}

nietig modbus_check_recv_timeout()

{

if (modbus_recv_timeout)

{

modbus_recv_timeout--;

if(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet (u8 *pakkie)

{

u16 len;

u16 krc;

u8 func_code = pakkie[1];

while(modbus_send_interval);

if(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PAKKET*)pakkie)->byte_num = ((MODBUS_10_PAKKET*)pakkie)->woordnommer*2;

len = 9+((MODBUS_10_PAKKET*)pakkie)->byte_num;

}anders as (func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)pakkie)->bit_num;

((MODBUS_0F_PACKET*)pakkie)->byte_num = len/8+(len%8?1:0);

len = 9+((MODBUS_0F_PACKET*)pakkie)->byte_num;

} anders

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16(pakkie,len-2);

pakkie[len-2] = (u8)(crc>>8);

pakkie[len-1] = (u8)crc;

modbus_send_bytes(pakkie,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

gee 0 terug;//Sukses

}

eksterne leemte modbus_msg_handler(u8 *msg,u16 msg_len);

void modbus_handler()

{

u16 krc;

if(!is_modbus_recv_complete)

terugkeer;

//Gaan crc-waarde na

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 adr, u16 len)

{

packet.slave_addr = SLAVE_ADDR;

packet.func_code = fcode;//Funksiekode

packet.start_addr = addr;//Adres

packet.data_len = len;//Waarde geskryf

len = modbus_send_packet((u8*)&pakkie);

terugkeer len;

}


Postyd: Jan-12-2024