[Open Source] Intelligent Training Room

——Gikan sa DWIN Developer Forum

Niini nga isyu, gipaila namo kanimo ang award-winning nga open source nga kaso sa DWIN Developer Forum - ang smart cultivation room.Gipatuman sa mga inhenyero ang T5L smart screen aron makontrol ang pagpainit ug mga function sa pagkontrol sa temperatura sa fan pinaagi sa protocol sa Modbus.Ang suplay sa kuryente mahimo usab nga i-adjust aron ma-simulate ang function sa suga.Ang sistema mahimong awtomatik nga modagan sumala sa mga parameter nga gibutang sa screen ug makatipig sa mga rekord sa kasaysayan sa sayup.

1.UI Material Display

asvdfb (2)
asvdfb (1)

2.UI Design

asvdfb (3)

1.C51 Disenyo

Ang mga nag-unang mga code alang sa pag-angkon ug pag-update sa datos sama sa temperatura, humidity, ug altitude sa main interface, ug paggamit sa modbus rtu aron makontrol ang mga module sa pagkontrol sa temperatura, mga motor, alarm detection, ug uban pang mga slave machine mao ang mosunod

Panguna nga interface code reference:

#ilakip ang "main_win.h"

#ilakip ang "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#ilakip ang "uart2.h"

#apil

#apil

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

petsa sa char[17];

u8 desc;

}ALERTO;

#define 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;

walay main_win_update()

{

}

bakante ang main_win_disp_date()

{

u8 len;

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

komon_buf[len+1] = 0;

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

}

bakante ang main_win_process_alert()

{

u8 ako;

kay(i=0;i

{

kung(GET_ALERT_BIT(old_alert_val, i))

magpadayon;

kung(GET_ALERT_BIT(alerto_val, i))

{

kung(alerto_num>=ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

alert_table[alerto_num].desc = i+1;

sprintf(talaan_alerto[num_alerto].petsa, "%u/%u/%u %u:%u",

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

);

alert_num++;

}

}

memcpy(old_alert_val, alert_val, sizeof(alert_val));

}

walay main_win_disp_alert()

{

u16 ako;

u16 val;

u16 len = 0;

komon_buf[0] = 0;

kay(i=0;i

{

val = 0;

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

}

komon_buf[len+1] = 0;

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

}

void main_win_init()

{

float fixed_val;

u8 ako;

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

kay(i=0;i

{

kon(i==0)

magpadayon;

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;

kung(btn_val==0x0B)

{

main_win_disp_alert();

pagbalik;

}

index = btn_val-1;

btn_sta[index] = !btn_sta[index];

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

kung(index==9)

is_main_win = 0;

lain kon((index==3)||(index==7))

{

samtang(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 ako;

u8 offset;

msg_len = msg_len;

kung(! is_main_win)

pagbalik;

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

{

offset = MODBUS_RESPOND_POS_DATA;

kay(i=0;i

{

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

offset += 2;

}

main_win_update();

}lain kon((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

offset = MODBUS_RESPOND_POS_DATA;

kay(i=0;i

{

alert_val = msg [offset];

offset++;

}

main_win_process_alert();

}lain kon((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

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

}lain kon((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

kay(i=0;i

{

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

offset += 2;

}

main_win_disp_date();

}

}

haw-ang 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;//Ibalik

}

void main_win_handler()

{

static nga u8 nga bandila = 0;

kung (mao ang_main_win)

{

kung(alerto_pagbasa_panahon==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

pagbalik;

}

kung(date_update_period==DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

pagbalik;

}

bandera = !bandila;

kung (bandila)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

lain

main_win_read_temp_hum();

}

}

reference sa modbus rtu code:

#ilakip ang "modbus.h"

#ilakip ang "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

#ilakip ang UART_INCLUDE

static bit is_modbus_recv_complete = 0;

static nga u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0; // Kinatibuk-ang gitas-on sa byte nga gidawat

static u8 modbus_recv_timeout = 0;//Dawata ang overflow nga oras

static volatile u16 modbus_send_interval = 0;

MODBUS_PACKET nga pakete;

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)

{

kung(mao_modbus_recv_complete)

pagbalik;

kung(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = byte;

}

walay modbus_check_recv_timeout()

{

kung(modbus_recv_timeout)

{

modbus_recv_timeout--;

kung(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *packet)

{

u16 len;

u16 crc;

u8 func_code = pakete [1];

samtang(modbus_send_interval);

kung(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;

}lain kon(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;

}lain

{

len = gidak-on sa(MODBUS_PACKET);

}

crc = crc16(packet,len-2);

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

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

modbus_send_bytes(packet,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

balik 0; // Kalampusan

}

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

void modbus_handler()

{

u16 crc;

kung(! is_modbus_recv_complete)

pagbalik;

//Susiha ang bili sa crc

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

kung(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;//Bili nga gisulat

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

balik len;

}


Oras sa pag-post: Ene-12-2024