[Open Source]Ruang Pelatihan Cerdas

——Saka DWIN Developer Forum

Ing masalah iki, kita ngenalake sampeyan kasus open source sing menang penghargaan saka Forum Pengembang DWIN - ruangan budidaya cerdas.Engineers dipun ginakaken T5L layar pinter kanggo kontrol panas lan fungsi kontrol suhu penggemar liwat protokol Modbus.Sumber daya uga bisa diatur kanggo simulasi fungsi cahya.Sistem bisa mlaku kanthi otomatis miturut paramèter sing disetel ing layar lan nyimpen cathetan riwayat kesalahan.

1. Tampilan Material UI

asvdfb (2)
asvdfb (1)

2. Desain UI

asvdfb (3)

1. C51 Desain

Kode utama kanggo entuk lan nganyari data kayata suhu, kelembapan, lan dhuwur ing antarmuka utama, lan nggunakake modbus rtu kanggo ngontrol modul kontrol suhu, motor, deteksi weker, lan mesin budak liyane kaya ing ngisor iki.

Referensi kode antarmuka utama:

#include "main_win.h"

#include "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#kalebu "uart2.h"

#kalebu

#kalebu

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

tanggal char[17];

u8 desc;

}AWAS;

#define ALERT_TABLE_LEN 20

statis u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

statis 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 tandha_nomer = 0;

bit is_main_win = 0;

batal main_win_update()

{

}

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

}

batal main_win_process_alert()

{

u8 aku;

kanggo (i=0;i

{

yen(GET_ALERT_BIT(old_alert_val, i))

terus;

yen(GET_ALERT_BIT(alert_val, i))

{

yen(nomer_alert>=ALERT_TABLE_LEN)

alert_num = ALERT_TABLE_LEN-1;

tandha_tabel[alert_num].desc = i+1;

sprintf(tabel_siaga[nomer_siaga].tanggal, "%u/%u/%u %u:%u",

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

);

tandha_nomer++;

}

}

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

}

batal main_win_disp_alert()

{

u16 aku;

u16 val;

u16 len = 0;

common_buf[0] = 0;

kanggo (i=0;i

{

val = 0;

yen aku

{

val = tandha_tabel.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 aku;

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

kanggo (i=0;i

{

yen (i == 0)

terus;

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

}

batal main_win_click_handler(u16 btn_val)

{

indeks u8;

yen(btn_val==0x0B)

{

main_win_disp_alert();

bali;

}

indeks = btn_val-1;

btn_sta[indeks] = !btn_sta[indeks];

yen((indeks==3)||(indeks==7))

btn_sta[indeks] = 1;

modbus_write_bit(btn_addr[index], btn_sta[index]?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);

yen (indeks == 9)

is_main_win = 0;

else if((index==3)||(index==7))

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[index], 0x0000);

}

}

batal 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 aku;

u8 ngimbangi;

msg_len = msg_len;

yen (!is_utama_menang)

bali;

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

{

offset = MODBUS_RESPOND_POS_DATA;

kanggo (i=0;i

{

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

ngimbangi += 2;

}

main_win_update();

} Others if((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

offset = MODBUS_RESPOND_POS_DATA;

kanggo (i=0;i

{

alert_val = msg[offset];

ngimbangi++;

}

main_win_process_alert();

} Others if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

kanggo (i=0;i

{

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

ngimbangi += 2;

modbus_write_word(5+i, temp_hum_val);

}

main_win_update();

} Others if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

offset = MODBUS_RESPOND_POS_DATA;

kanggo (i=0;i

{

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

ngimbangi += 2;

}

main_win_disp_date();

}

}

batal 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;//Balik

}

batal main_win_handler()

{

gendera u8 statis = 0;

yen (is_utama_menang)

{

yen (periode_waca_waspada==JAWA_BACA_AWAS)

{

tandha_waca_periode = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

bali;

}

yen (tanggal_update_period==DATE_UPDATE_PERIOD)

{

tanggal_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

bali;

}

gendéra = !flag;

yen (flag)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

liyane

main_win_read_temp_hum();

}

}

referensi kode modbus rtu:

#include "modbus.h"

#kalebu "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

#kalebu UART_INCLUDE

bit statis is_modbus_recv_complete = 0;

statis u8 modbus_recv_buff [270];

statis u16 modbus_recv_len = 0;//Total dawa bita sing ditampa

statis u8 modbus_recv_timeout = 0; // Nampa wektu kebanjiran

statis molah malih u16 modbus_send_interval = 0;

MODBUS_PACKET paket;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes(u8 *byte,u16 len)

{

UART_SEND_BYTES(byte,len);

}

void modbus_recv_byte(u8 byte)

{

yen (is_modbus_recv_complete)

bali;

yen (modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = byte;

}

void modbus_check_recv_timeout()

{

yen (modbus_recv_timeout)

{

modbus_recv_timeout--;

yen (modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *paket)

{

u16 len;

u16 crc;

kode_fungsi u8 = paket[1];

while(modbus_send_interval);

if(kode_fungsi==MODBUS_FUNC_CODE_10)

{

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

len = 9+((MODBUS_10_PAKET*)paket)->byte_num;

} else if(func_code==MODBUS_FUNC_CODE_0F)

{

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

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

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

} liyane

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16(paket,len-2);

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

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

modbus_send_bytes(paket,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

bali 0; // Sukses

}

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

void modbus_handler()

{

u16 crc;

yen (! is_modbus_recv_complete)

bali;

// Priksa nilai crc

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)

{

packet.slave_addr = SLAVE_ADDR;

packet.func_code = fcode;//Kode fungsi

packet.start_addr = addr;//Alamat

packet.data_len = len;//Nilai ditulis

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

bali len;

}


Wektu kirim: Jan-12-2024