[Open Source]Yakangwara Yekudzidzisa Kamuri

——Kubva kuDWIN Developer Forum

Muchikamu chino, tinosuma kwauri iyo yekuhwina-yakavhurika sosi kesi yeDWIN Developer Forum - imba yekurima yakangwara.Mainjiniya akashandisa T5L smart screen kudzora kupisa uye kupisa tembiricha ye fan mabasa kuburikidza neModbus protocol.Iyo magetsi inogonawo kugadziriswa kuti ifananidze basa rekuvhenekera.Iyo sisitimu inogona kumhanya otomatiki zvinoenderana nemaparamita akaiswa pachiratidziri uye chengetedza kukanganisa nhoroondo marekodhi.

1.UI Material Display

asvdfb (2)
asvdfb (1)

2.UI Dhizaini

asvdfb (3)

1.C51 Dhizaini

Iwo macode makuru ekutora nekuvandudza data senge tembiricha, humidity, uye urefu pane iyo huru interface, uye kushandisa modbus rtu kudzora tembiricha yekudzora modules, mota, kuona alarm, uye mamwe machina evaranda ndeaya anotevera.

Main interface code reference:

#inosanganisira "main_win.h"

#inosanganisira "modbus.h"

#inosanganisira "sys_params.h"

#inosanganisira "func_handler.h"

#inosanganisira "uart2.h"

#include

#include

#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 chimiro{

char date[17];

u8 desc;

}ALERT;

#tsanangura ALERT_TABLE_LEN 20

static u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

static 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 date_val[MAIN_WIN_DATE_MAX_NUM] = {0};

u8 alert_val[ALERT_BYTE_NUM] = {0};

u8 old_alert_val[ALERT_BYTE_NUM] = {0};

ALERT alert_table[ALERT_TABLE_LEN];

u16 alert_num = 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]);

common_buf[len+1] = 0;

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

}

void main_win_process_alert()

{

u8 i;

zve(i=0;i

{

kana(GET_ALERT_BIT(yekare_chenjedzo_val, i))

continue;

kana(GET_ALERT_BIT(alert_val, i))

{

kana(nhamba_yekuzivisa>=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",

date_val[0], date_val[1], date_val[2], date_val[3], date_val[4]

);

alert_num++;

}

}

memcpy(yekare_yambiro_val, alert_val, sizeof(alert_val));

}

void main_win_disp_alert()

{

u16 i;

u16 val;

u16 len = 0;

common_buf[0] = 0;

zve(i=0;i

{

val = 0;

kana (i

{

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

}

common_buf[len+1] = 0;

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

}

void main_win_init()

{

float fixed_val;

u8 i;

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

zve(i=0;i

{

kana(i==0)

continue;

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;

kana(btn_val==0x0B)

{

main_win_disp_alert();

return;

}

index = btn_val-1;

btn_sta[index] = !btn_sta[index];

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

kana(index==9)

is_main_win = 0;

zvimwe kana((index==3)||(index==7))

{

apo(sys_get_touch_sta());

modbus_write_bit(btn_addr[index], 0x0000);

}

}

void 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 i;

u8 offset;

msg_len = msg_len;

kana(!is_main_win)

return;

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

{

offset = MODBUS_RESPOND_POS_DATA;

zve(i=0;i

{

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

offset += 2;

}

main_win_update();

}zvimwe kana((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

offset = MODBUS_RESPOND_POS_DATA;

zve(i=0;i

{

alert_val = msg[offset];

offset++;

}

main_win_process_alert();

}zvimwe kana((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

zve(i=0;i

{

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

offset += 2;

modbus_write_word(5+i, temp_hum_val);

}

main_win_update();

}zvimwe kana((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

zve(i=0;i

{

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

offset += 2;

}

main_win_disp_date();

}

}

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

{

static u8 mureza = 0;

kana(kuri_kukunda_kukunda)

{

kana(alert_read_period==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

return;

}

kana(date_update_period==DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

return;

}

mureza = !mureza;

kana (mureza)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

zvimwe

main_win_read_temp_hum();

}

}

modbus rtu code reference:

#inosanganisira "modbus.h"

#inosanganisira "crc16.h"

#inosanganisira "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)

#tsanangura MODBUS_SEND_INTERVAL 150

#inosanganisira UART_INCLUDE

static bit is_modbus_recv_complete = 0;

static u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Hurefu hwemabhaiti anogamuchirwa

static u8 modbus_recv_timeout = 0;//Gamuchira mafashama nguva

static volatile u16 modbus_send_interval = 0;

MODBUS_PACKET packet;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes(u8 *bytes,u16 len)

{

UART_SEND_BYTES(bytes,len);

}

void modbus_recv_byte(u8 byte)

{

kana(is_modbus_recv_complete)

return;

kana(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = byte;

}

void modbus_check_recv_timeout()

{

kana (modbus_recv_timeout)

{

modbus_recv_timeout--;

kana(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *packet)

{

u16 len;

u16 crc;

u8 func_code = pakiti[1];

apo(modbus_send_interval);

kana(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)packet)->byte_num = ((MODBUS_10_PACKET*)packet)->word_num*2;

len = 9+((MODBUS_10_PACKET*)packet)->byte_num;

}zvimwe kana(func_code==MODBUS_FUNC_CODE_0F)

{

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

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

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

}zvimwe

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16(packet,len-2);

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

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

modbus_send_bytes(packet,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

dzoka 0;//Kubudirira

}

extern void modbus_msg_handler(u8 *msg,u16 msg_len);

void modbus_handler()

{

u16 crc;

kana(!is_modbus_recv_complete)

return;

// Tarisa crc kukosha

crc = ((u16)modbus_recv_buff[modbus_recv_len-2]<<8)+modbus_recv_buff[modbus_recv_len-1];

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

{

packet.slave_addr = SLAVE_ADDR;

packet.func_code = fcode;//Function code

packet.start_addr = addr;//Address

packet.data_len = len;//Kukosha kwakanyorwa

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

return len;

}


Nguva yekutumira: Jan-12-2024