[Código abierto] Sala de entrenamiento inteligente

——Del foro de desarrolladores de DWIN

En este número, le presentamos el caso de código abierto galardonado del DWIN Developer Forum: la sala de cultivo inteligente.Los ingenieros implementaron la pantalla inteligente T5L para controlar las funciones de control de temperatura de calefacción y ventilador a través del protocolo Modbus.La fuente de alimentación también se puede ajustar para simular la función de iluminación.El sistema puede ejecutarse automáticamente de acuerdo con los parámetros establecidos en la pantalla y guardar registros del historial de fallas.

1. Visualización de materiales de la interfaz de usuario

asvdfb (2)
asvdfb (1)

2.Diseño de interfaz de usuario

asvdfb (3)

1.C51 Diseño

Los códigos principales para adquirir y actualizar datos como temperatura, humedad y altitud en la interfaz principal y usar modbus rtu para controlar módulos de control de temperatura, motores, detección de alarmas y otras máquinas esclavas son los siguientes

Referencia del código de la interfaz principal:

#incluir "main_win.h"

#incluir "modbus.h"

#incluir "sys_params.h"

#incluir "func_handler.h"

#incluir "uart2.h"

#incluir

#incluir

#definir TEMP_HUM_SLAVE_ADDR 2

#definir TEMP_HUM_VAL_MAX_NUM 2

#definir ALERT_BIT_MAX_NUM 30

#definir 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)

estructura typedef {

fecha de carácter[17];

u8 desc;

}ALERTA;

#definir ALERT_TABLE_LEN 20

estático u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};

estático 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 valor_fecha[MAIN_WIN_DATE_MAX_NUM] = {0};

u8 alert_val[ALERT_BYTE_NUM] = {0};

u8 old_alert_val[ALERT_BYTE_NUM] = {0};

ALERT alerta_table[ALERT_TABLE_LEN];

u16 núm_alerta = 0;

bit is_main_win = 0;

anular main_win_update()

{

}

anular main_win_disp_date()

{

u8 len;

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

common_buf[len+1] = 0;

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

}

anular main_win_process_alert()

{

u8 yo;

para(i=0;yo

{

si(GET_ALERT_BIT(old_alert_val, i))

continuar;

si(GET_ALERT_BIT(alerta_val, i))

{

si(alert_num>=ALERT_TABLE_LEN)

alerta_num = ALERT_TABLE_LEN-1;

tabla_alerta[núm_alerta].desc = i+1;

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

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

);

alerta_num++;

}

}

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

}

anular main_win_disp_alert()

{

u16 yo;

valor u16;

u16 longitud = 0;

común_buf[0] = 0;

para(i=0;yo

{

valor = 0;

si yo

{

val = alerta_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);

}

anular main_win_init()

{

flotador valor_fijo;

u8 yo;

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

para(i=0;yo

{

si(yo==0)

continuar;

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

}

valor_fijo = 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)

{

índice u8;

si(btn_val==0x0B)

{

main_win_disp_alert();

devolver;

}

índice = btn_val-1;

btn_sta[índice] = !btn_sta[índice];

if((índice==3)||(índice==7))

btn_sta[índice] = 1;

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

btn_val = btn_sta[índice];

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

si(índice==9)

is_main_win = 0;

de lo contrario si((índice==3)||(índice==7))

{

mientras(sys_get_touch_sta());

modbus_write_bit(btn_addr[índice], 0x0000);

}

}

void main_win_msg_handler(u8 *msg,u16 msg_len)

{

u8 f_code = mensaje[MODBUS_RESPOND_POS_FUNC_CODE];

u8 data_len = mensaje[MODBUS_RESPOND_POS_DATA_LEN];

u8 yo;

compensación u8;

msg_len = msg_len;

si(!is_main_win)

devolver;

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

{

desplazamiento = MODBUS_RESPOND_POS_DATA;

para(i=0;yo

{

main_win_val = SYS_GET_U16(mensaje[desplazamiento], mensaje[desplazamiento+1]);

compensación += 2;

}

main_win_update();

}si no((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

desplazamiento = MODBUS_RESPOND_POS_DATA;

para(i=0;yo

{

alert_val = mensaje[desplazamiento];

desplazamiento++;

}

main_win_process_alert();

}si no((f_code==MODBUS_FUNC_CODE_03)&&(data_len==TEMP_HUM_VAL_MAX_NUM*2))

{

desplazamiento = MODBUS_RESPOND_POS_DATA;

para(i=0;yo

{

temp_hum_val = SYS_GET_U16(mensaje[desplazamiento], mensaje[desplazamiento+1]);

compensación += 2;

modbus_write_word(5+i, temp_hum_val);

}

main_win_update();

}si no((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_DATE_MAX_NUM*2))

{

desplazamiento = MODBUS_RESPOND_POS_DATA;

para(i=0;yo

{

valor_fecha = SYS_GET_U16(mensaje[desplazamiento], mensaje[desplazamiento+1]);

compensación += 2;

}

main_win_disp_date();

}

}

anular 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;//Revertir

}

vacío main_win_handler()

{

bandera estática u8 = 0;

si(is_main_win)

{

si(alert_read_period==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM);

devolver;

}

si(fecha_actualización_período==FECHA_ACTUALIZACIÓN_PERIOD)

{

fecha_actualización_periodo = 0;

modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM);

devolver;

}

bandera = !bandera;

si (bandera)

modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM);

demás

main_win_read_temp_hum();

}

}

Referencia del código modbus rtu:

#incluir "modbus.h"

#incluye "crc16.h"

#incluir "sys_params.h"

#definir UART_INCLUDE "uart2.h"

#definir UART_INIT uart2_init

#definir UART_SEND_BYTES uart2_send_bytes

#definir UART_BAUD 9600

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

#definir MODBUS_SEND_INTERVAL 150

#incluir UART_INCLUDE

bit estático is_modbus_recv_complete = 0;

estático u8 modbus_recv_buff[270];

static u16 modbus_recv_len = 0;//Longitud total de bytes aceptados

static u8 modbus_recv_timeout = 0;//Aceptar tiempo de desbordamiento

estática volátil u16 modbus_send_interval = 0;

paquete MODBUS_PACKET;

anular modbus_init()

{

UART_INIT(UART_BAUD);

}

anular modbus_send_bytes(u8 *bytes,u16 len)

{

UART_SEND_BYTES(bytes,len);

}

vacío modbus_recv_byte (u8 byte)

{

si(is_modbus_recv_complete)

devolver;

si(modbus_recv_len

modbus_recv_buff[modbus_recv_len++] = byte;

}

anular modbus_check_recv_timeout()

{

si(modbus_recv_timeout)

{

modbus_recv_timeout--;

si(modbus_recv_timeout==0)

{

is_modbus_recv_complete = 1;

}

}

}

u8 modbus_send_packet(u8 *paquete)

{

len u16;

u16 crc;

u8 código_función = paquete[1];

mientras(modbus_send_interval);

si(código_función==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)paquete)->byte_num = ((MODBUS_10_PACKET*)paquete)->palabra_num*2;

len = 9+((MODBUS_10_PACKET*)paquete)->byte_num;

}de lo contrario si(func_code==MODBUS_FUNC_CODE_0F)

{

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

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

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

}demás

{

len = tamaño de (MODBUS_PACKET);

}

crc = crc16(paquete,len-2);

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

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

modbus_send_bytes(paquete,len);

modbus_send_interval = MODBUS_SEND_INTERVAL;

devolver 0;//Éxito

}

modbus_msg_handler vacío externo (u8 *msg,u16 msg_len);

vacío modbus_handler()

{

u16 crc;

si(!is_modbus_recv_complete)

devolver;

//Comprueba el valor de crc

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

si(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)

{

paquete.slave_addr = SLAVE_ADDR;

paquete.func_code = fcode;//Código de función

paquete.start_addr = addr;//Dirección

paquete.data_len = len;//Valor escrito

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

devolver len;

}


Hora de publicación: 12 de enero de 2024