[Atviras šaltinis] Išmanusis mokymo kambarys

——Iš DWIN kūrėjų forumo

Šiame numeryje pristatome apdovanojimus pelniusį atvirojo kodo DWIN kūrėjų forumo dėklą – išmanųjį auginimo kambarį.Inžinieriai įdiegė T5L išmanųjį ekraną, kad valdytų šildymo ir ventiliatoriaus temperatūros valdymo funkcijas per Modbus protokolą.Maitinimo šaltinis taip pat gali būti reguliuojamas, kad imituotų apšvietimo funkciją.Sistema gali automatiškai veikti pagal ekrane nustatytus parametrus ir išsaugoti gedimų istorijos įrašus.

1.UI medžiagos ekranas

asvdfb (2)
asvdfb (1)

2.UI dizainas

asvdfb (3)

1.C51 Dizainas

Pagrindiniai kodai, skirti gauti ir atnaujinti duomenis, pvz., temperatūrą, drėgmę ir aukštį pagrindinėje sąsajoje, ir naudoti modbus rtu temperatūros valdymo moduliams, varikliams, aliarmo aptikimui ir kitoms pagalbinėms mašinoms valdyti, yra šie.

Pagrindinės sąsajos kodo nuoroda:

#include "main_win.h"

#include "modbus.h"

#include "sys_params.h"

#include "func_handler.h"

#include "uart2.h"

#įtraukti

#įtraukti

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

typedef struct{

simbolio data[17];

u8 desc;

}BUDRUS;

#define ALERT_TABLE_LEN 20

statinis u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

statinis 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 data_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_LENTELĖ_LEN];

u16 alert_num = 0;

bitas yra_pagrindinis_laimėjimas = 0;

negalioja main_win_update()

{

}

negalioja main_win_disp_date()

{

u8 len;

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

bendrasis_buf[len+1] = 0;

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

}

negalioja main_win_process_alert()

{

u8 i;

for(i=0;i

{

if(GET_ALERT_BIT(senas_alert_val, i))

Tęsti;

if(GET_ALERT_BIT(alert_val, i))

{

if(alert_num>=ALERT_TABLE_LEN)

įspėjimo_numeris = ALERT_LENTELĖ_LEN-1;

įspėjimo_lentelė[alert_num].desc = i+1;

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

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

);

įspėjimo_numeris++;

}

}

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

}

negalioja main_win_disp_alert()

{

u16 i;

u16 val;

u16 len = 0;

bendrasis_buf[0] = 0;

for(i=0;i

{

val = 0;

jeigu aš

{

val = alert_table.desc;

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

}

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

}

bendrasis_buf[len+1] = 0;

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

}

negalioja main_win_init()

{

float fiksuotas_val;

u8 i;

yra_pagrindinis_laimėjimas = 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

{

jei(i==0)

Tęsti;

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

}

fiksuotas_val = pagrindinis_laimėjimo_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 indeksas;

if(btn_val==0x0B)

{

pagrindinis_win_disp_alert();

grąžinti;

}

indeksas = btn_val-1;

btn_sta[indeksas] = !btn_sta[indeksas];

if((indeksas==3)||(indeksas==7))

btn_sta[indeksas] = 1;

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

btn_val = btn_sta[indeksas];

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

if(indeksas==9)

yra_pagrindinis_laimėjimas = 0;

kitaip if((indeksas==3)||(indeksas==7))

{

while(sys_get_touch_sta());

modbus_write_bit(btn_addr[indeksas], 0x0000);

}

}

void main_win_msg_handler(u8 *msg,u16 msg_len)

{

u8 f_kodas = msg[MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = msg[MODBUS_RESPOND_POS_DATA_LEN];

u8 i;

u8 poslinkis;

msg_len = msg_len;

if(!is_main_win)

grąžinti;

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

{

poslinkis = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

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

poslinkis += 2;

}

main_win_update();

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

{

poslinkis = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

alert_val = msg[offset];

offset++;

}

main_win_process_alert();

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

{

poslinkis = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

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

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

{

poslinkis = MODBUS_RESPOND_POS_DATA;

for(i=0;i

{

data_val = SYS_GET_U16(msg[poslinkis], msg[poslinkis+1]);

poslinkis += 2;

}

main_win_disp_date ();

}

}

void main_win_read_temp_hum()

{

u8 old_slave_addr = VERGO_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;//Grąžinti

}

void main_win_handler()

{

statinė u8 vėliavėlė = 0;

if(yra_main_win)

{

if(alert_read_period==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

grąžinti;

}

if(date_update_period==DATE_UPDATE_PERIOD)

{

data_atnaujinimo_periodas = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

grąžinti;

}

vėliavėlė = !vėliava;

jei (vėliava)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

Kitas

main_win_read_temp_hum();

}

}

modbus RTU kodo nuoroda:

#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

statinis bitas yra_modbus_recv_complete = 0;

statinis u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Priimtas bendras baitų ilgis

static u8 modbus_recv_timeout = 0;//Priimti perpildymo laiką

statinis nepastovus u16 modbus_send_interval = 0;

MODBUS_PACKET paketas;

negalioja modbus_init()

{

UART_INIT(UART_BAUD);

}

void modbus_send_bytes(u8 *bytes,u16 len)

{

UART_SEND_BYTES(baitai,len);

}

negalioja modbus_recv_byte (u8 baitas)

{

if(is_modbus_recv_complete)

grąžinti;

if(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = baitas;

}

negalioja 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 *paketas)

{

u16 len;

u16 crc;

u8 func_code = paketas[1];

while(modbus_send_interval);

if(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PAKETAS*)paketas)->baitų_skaičius = ((MODBUS_10_PAKETAS*)paketas)->žodžio_skaičius*2;

len = 9+((MODBUS_10_PACKET*)paketas)->baitų_skaičius;

}else if(func_code==MODBUS_FUNC_CODE_0F)

{

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

((MODBUS_0F_PACKET*)paketas)->baitų_skaičius = len/8+(len%8?1:0);

len = 9+((MODBUS_0F_PACKET*)paketas)->baitų_skaičius;

}Kitas

{

len = dydis(MODBUS_PAKETAS);

}

crc = crc16(paketas,len-2);

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

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

modbus_send_bytes(paketas,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

grąžinti 0;//Sėkmė

}

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

void modbus_handler()

{

u16 crc;

if(!is_modbus_recv_complete)

grąžinti;

//Patikrinkite crc reikšmę

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)

{

paketas.slave_addr = SLAVE_ADDR;

packet.func_code = fkodas;//Funkcijos kodas

packet.start_addr = addr;//Adresas

packet.data_len = len;//Parašyta reikšmė

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

grįžti len;

}


Paskelbimo laikas: 2024-01-12