[Açık Kaynak]Akıllı Eğitim Odası

——DWIN Geliştirici Forumundan

Bu sayımızda size akıllı yetiştirme odası olan DWIN Geliştirici Forumu'nun ödüllü açık kaynak örneğini tanıtıyoruz.Mühendisler, Modbus protokolü aracılığıyla ısıtma ve fan sıcaklığı kontrol işlevlerini kontrol etmek için T5L akıllı ekranı uyguladı.Güç kaynağı aydınlatma fonksiyonunu simüle edecek şekilde de ayarlanabilir.Sistem, ekranda belirlenen parametrelere göre otomatik olarak çalışabilir ve arıza geçmişi kayıtlarını kaydedebilir.

1.UI Malzeme Gösterimi

asvdfb (2)
asvdfb (1)

2.UI Tasarımı

asvdfb (3)

1.C51 Tasarımı

Ana arayüzde sıcaklık, nem ve rakım gibi verileri almak ve güncellemek ve sıcaklık kontrol modüllerini, motorları, alarm algılamayı ve diğer yardımcı makineleri kontrol etmek için modbus rtu'yu kullanmak için ana kodlar aşağıdaki gibidir

Ana arayüz kodu referansı:

#include "main_win.h"

#include "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#"uart2.h"yi dahil et

#katmak

#katmak

#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, konum) ((val[pos/8]>>(pos%8))&0x01)

typedef yapısı{

karakter tarihi[17];

u8 açıklaması;

}UYARI;

#define ALERT_TABLE_LEN 20

statik u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

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

u8 warning_val[ALERT_BYTE_NUM] = {0};

u8 old_alert_val[ALERT_BYTE_NUM] = {0};

ALERT uyarı_tablosu[ALERT_TABLE_LEN];

u16 uyarı_num = 0;

bit is_main_win = 0;

geçersiz main_win_update()

{

}

geçersiz main_win_disp_date()

{

u8 len;

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

ortak_buf[len+1] = 0;

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

}

geçersiz main_win_process_alert()

{

u8 ben;

for(i=0;i

{

if(GET_ALERT_BIT(eski_alert_val, i))

devam etmek;

if(GET_ALERT_BIT(alert_val, i))

{

if(alert_num>=ALERT_TABLE_LEN)

uyarı_num = ALERT_TABLE_LEN-1;

uyarı_tablo[alert_num].desc = i+1;

sprintf(alert_table[alert_num].date, "%u/%u/%u %u:%u",

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

);

uyarı_num++;

}

}

memcpy(eski_alert_val, uyarı_val, sizeof(alert_val));

}

geçersiz main_win_disp_alert()

{

u16 ben;

u16 val;

u16len = 0;

ortak_buf[0] = 0;

for(i=0;i

{

değer = 0;

Eğer ben

{

val = uyarı_tablo.desc;

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

}

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

}

ortak_buf[len+1] = 0;

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

}

geçersiz main_win_init()

{

float sabit_val;

u8 ben;

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

for(i=0;i

{

eğer(i==0)

devam etmek;

sys_write_vp(MAIN_WIN_WIND_SPEED_VP+MAIN_WIN_VAL_OFFSET*i, (u8*)&main_win_val, 1);

}

sabit_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 dizini;

if(btn_val==0x0B)

{

main_win_disp_alert();

geri dönmek;

}

dizin = btn_val-1;

btn_sta[dizin] = !btn_sta[dizin];

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

btn_sta[dizin] = 1;

modbus_write_bit(btn_addr[index], btn_sta[index]?0xFF00:0x0000);

btn_val = btn_sta[dizin];

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

if(indeks==9)

is_main_win = 0;

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

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[dizin], 0x0000);

}

}

void main_win_msg_handler(u8 *msg,u16 msg_len)

{

u8 f_code = msj[MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = msg[MODBUS_RESPOND_POS_DATA_LEN];

u8 ben;

u8 ofset;

msg_len = msg_len;

if(!is_main_win)

geri dönmek;

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

{

ofset = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

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

ofset += 2;

}

main_win_update();

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

{

ofset = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

warning_val = msg[offset];

ofset++;

}

main_win_process_alert();

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

{

ofset = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

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

ofset += 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))

{

ofset = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

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

ofset += 2;

}

main_win_disp_date();

}

}

geçersiz 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;//Geri Döndür

}

geçersiz main_win_handler()

{

statik u8 bayrağı = 0;

if(is_main_win)

{

if(alert_read_period==ALERT_READ_PERIOD)

{

warning_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

geri dönmek;

}

if(date_update_period==DATE_UPDATE_PERIOD)

{

tarih_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

geri dönmek;

}

bayrak = !bayrak;

eğer(bayrak)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

başka

main_win_read_temp_hum();

}

}

modbus rtu kod referansı:

#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

#UART_BAUD 9600'i tanımlayın

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

#define MODBUS_SEND_INTERVAL 150

#UART_INCLUDE'u dahil et

statik bit is_modbus_recv_complete = 0;

statik u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//kabul edilen baytların toplam uzunluğu

statik u8 modbus_recv_timeout = 0;//Taşma süresini kabul et

statik uçucu u16 modbus_send_interval = 0;

MODBUS_PACKET paketi;

geçersiz modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes(u8 *bytes,u16 len)

{

UART_SEND_BYTES(bayt,uzunluk);

}

void modbus_recv_byte(u8 bayt)

{

if(is_modbus_recv_complete)

geri dönmek;

if(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = bayt;

}

geçersiz 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 *paket)

{

u16 uzunlamasına;

u16 crc;

u8 işlev_kodu = paket[1];

while(modbus_send_interval);

if(func_code==MODBUS_FUNC_CODE_10)

{

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

len = 9+((MODBUS_10_PACKET*)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;

}başka

{

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;

0 değerini döndür;//Başarılı

}

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

geçersiz modbus_handler()

{

u16 crc;

if(!is_modbus_recv_complete)

geri dönmek;

//crc değerini kontrol et

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)

{

package.slave_addr = SLAVE_ADDR;

package.func_code = fcode;//İşlev kodu

package.start_addr = adres;//Adres

package.data_len = uzunluk;//Yazılan değer

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

geri dönüş len;

}


Gönderim zamanı: Ocak-12-2024