[Відкритий вихідний код] Розумна навчальна кімната

——З форуму розробників DWIN

У цьому випуску ми представляємо вам відзначений нагородами кейс з відкритим вихідним кодом форуму розробників DWIN – розумну кімнату для вирощування.Інженери впровадили інтелектуальний екран T5L для керування функціями контролю опалення та температури вентилятора через протокол Modbus.Джерело живлення також можна налаштувати для імітації функції освітлення.Система може автоматично працювати відповідно до параметрів, встановлених на екрані, і зберігати записи історії несправностей.

1. Відображення матеріалу інтерфейсу користувача

asvdfb (2)
asvdfb (1)

2. Дизайн інтерфейсу користувача

asvdfb (3)

1.C51 Дизайн

Основні коди для отримання та оновлення даних, таких як температура, вологість і висота над рівнем моря, на головному інтерфейсі, а також за допомогою modbus rtu для керування модулями контролю температури, двигунами, виявленням сигналізації та іншими підлеглими машинами є наступними:

Посилання на код основного інтерфейсу:

#include "main_win.h"

#include "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#include "uart2.h"

#включати

#включати

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

char date [17];

u8 desc;

}ALERT;

#define ALERT_TABLE_LEN 20

статичний u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

статичний 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;

біт 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;

for(i=0;i

{

if(GET_ALERT_BIT(old_alert_val, i))

продовжити;

if(GET_ALERT_BIT(alert_val, i))

{

if(alert_num>=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(old_alert_val, alert_val, sizeof(alert_val));

}

void main_win_disp_alert()

{

u16 i;

u16 val;

u16 len = 0;

common_buf[0] = 0;

for(i=0;i

{

значення = 0;

якщо я

{

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

for(i=0;i

{

якщо (i==0)

продовжити;

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;

якщо (btn_val==0x0B)

{

main_win_disp_alert();

повернення;

}

індекс = btn_val-1;

btn_sta[індекс] = !btn_sta[індекс];

якщо((індекс==3)||(індекс==7))

btn_sta[індекс] = 1;

modbus_write_bit(btn_addr[індекс], btn_sta[індекс]?0xFF00:0x0000);

btn_val = btn_sta[індекс];

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

якщо (індекс==9)

is_main_win = 0;

інакше якщо ((індекс==3)||(індекс==7))

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[індекс], 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 зсув;

msg_len = msg_len;

if(!is_main_win)

повернення;

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

{

зсув = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

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

зсув += 2;

}

main_win_update();

}інакше, якщо((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

зсув = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

alert_val = msg[зсув];

зсув++;

}

main_win_process_alert();

}інакше, якщо((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

зсув = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

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

зсув += 2;

modbus_write_word(5+i, temp_hum_val);

}

main_win_update();

}інакше, якщо((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

зсув = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

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

зсув += 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;//Повернути

}

void main_win_handler()

{

статичний прапор u8 = 0;

if(is_main_win)

{

якщо (alert_read_period==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

повернення;

}

if(date_update_period==DATE_UPDATE_PERIOD)

{

date_update_period = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

повернення;

}

прапор = !прапор;

якщо (прапор)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

інше

main_win_read_temp_hum();

}

}

посилання на код modbus rtu:

#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

#define UART_BAUD 9600

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

#define MODBUS_SEND_INTERVAL 150

#include UART_INCLUDE

статичний біт is_modbus_recv_complete = 0;

статичний u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Загальна прийнятна довжина байтів

static u8 modbus_recv_timeout = 0;//Прийняти час переповнення

static volatile u16 modbus_send_interval = 0;

пакет MODBUS_PACKET;

void modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes(u8 *байт,u16 len)

{

UART_SEND_BYTES(байти,довжина);

}

void modbus_recv_byte(u8 байт)

{

if(is_modbus_recv_complete)

повернення;

якщо (modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = байт;

}

void modbus_check_recv_timeout()

{

якщо (modbus_recv_timeout)

{

modbus_recv_timeout--;

якщо (modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *пакет)

{

u16 лінза;

u16 crc;

u8 код_функції = пакет[1];

while(modbus_send_interval);

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

}інакше, якщо (код_функції==MODBUS_FUNC_CODE_0F)

{

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

((MODBUS_0F_PACKET*)пакет)->byte_num = len/8+(len%8?1:0);

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

}інше

{

len = sizeof(MODBUS_PACKET);

}

crc = crc16(пакет,len-2);

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

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

modbus_send_bytes(packet,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

повернути 0;//Успіх

}

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

void modbus_handler()

{

u16 crc;

if(!is_modbus_recv_complete)

повернення;

//Перевірте значення 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;//Код функції

packet.start_addr = addr;//Адреса

packet.data_len = len;//Записано значення

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

повернути len;

}


Час публікації: 12 січня 2024 р