[اوپن سورس]انٹیلجنٹ ٹریننگ روم

—— DWIN ڈویلپر فورم سے

اس شمارے میں، ہم آپ کو DWIN ڈویلپر فورم کے ایوارڈ یافتہ اوپن سورس کیس کا تعارف کراتے ہیں - اسمارٹ کاشت کا کمرہ۔انجینئرز نے Modbus پروٹوکول کے ذریعے حرارتی اور پنکھے کے درجہ حرارت کو کنٹرول کرنے کے افعال کو کنٹرول کرنے کے لیے T5L سمارٹ اسکرین کو لاگو کیا۔بجلی کی فراہمی کو روشنی کے فنکشن کی تقلید کے لیے بھی ایڈجسٹ کیا جا سکتا ہے۔سسٹم خود بخود اسکرین پر سیٹ کردہ پیرامیٹرز کے مطابق چل سکتا ہے اور غلطی کی تاریخ کے ریکارڈ کو محفوظ کر سکتا ہے۔

1.UI میٹریل ڈسپلے

asvdfb (2)
asvdfb (1)

2.UI ڈیزائن

asvdfb (3)

1.C51 ڈیزائن

مرکزی انٹرفیس پر درجہ حرارت، نمی، اور اونچائی جیسے ڈیٹا کو حاصل کرنے اور اپ ڈیٹ کرنے اور درجہ حرارت کنٹرول ماڈیولز، موٹرز، الارم کا پتہ لگانے اور دیگر غلام مشینوں کو کنٹرول کرنے کے لیے موڈبس آر ٹی یو کا استعمال کرنے کے اہم کوڈز درج ذیل ہیں۔

مرکزی انٹرفیس کوڈ حوالہ:

# "main_win.h" شامل کریں

# "modbus.h" شامل کریں

# "sys_params.h" کو شامل کریں

#include "func_handler.h"

# "uart2.h" شامل کریں

#شامل

#شامل

#TEMP_HUM_SLAVE_ADDR 2 کی وضاحت کریں۔

#TEMP_HUM_VAL_MAX_NUM 2 کی وضاحت کریں۔

#ALERT_BIT_MAX_NUM 30 کی وضاحت کریں۔

#ALERT_BYTE_NUM کی وضاحت کریں (ALERT_BIT_MAX_NUM/8+((ALERT_BIT_MAX_NUM%8)!=0))

#GET_ALERT_BIT(val, pos) کی وضاحت کریں ((val[pos/8]>>(pos%8))&0x01)

typedef ساخت{

چار تاریخ[17]؛

u8 desc؛

الرٹ؛

#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_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])؛

عام_بف[لین+1] = 0؛

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

}

void main_win_process_alert()

{

u8 i;

کے لیے(i=0;i

{

اگر(GET_ALERT_BIT(old_alert_val, i))

جاری رہے؛

if(GET_ALERT_BIT(alert_val, i))

{

اگر(انتباہ_نمبر>=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;

عام_بف[0] = 0؛

کے لیے(i=0;i

{

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

}

عام_بف[لین+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)؛

کے لیے(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();

واپسی

}

index = btn_val-1;

btn_sta[index] = !btn_sta[انڈیکس]؛

اگر((انڈیکس==3)||(انڈیکس==7))

btn_sta[انڈیکس] = 1؛

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

btn_val = btn_sta[انڈیکس]؛

sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*انڈیکس، (u8*)&btn_val، 1)؛

اگر(انڈیکس==9)

is_main_win = 0;

ورنہ اگر((انڈیکس==3)||(انڈیکس==7))

{

جبکہ(sys_get_touch_sta())؛

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

اگر(! is_main_win)

واپسی

اگر((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_VAL_MAX_NUM*2))

{

آفسیٹ = MODBUS_RESPOND_POS_DATA؛

کے لیے(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؛

کے لیے(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؛

کے لیے(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؛

کے لیے(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؛

اگر(ہے_مین_جیت)

{

اگر (انتباہ_پڑھنا_پیریوڈ==ALERT_READ_PERIOD)

{

alert_read_period = 0;

modbus_read_bits(510, ALERT_BIT_MAX_NUM)؛

واپسی

}

اگر(تاریخ_اپ ڈیٹ_پیریوڈ==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.h" شامل کریں

#include "crc16.h"

# "sys_params.h" کو شامل کریں

#UART_INCLUDE "uart2.h" کی وضاحت کریں

#UART_INIT uart2_init کی وضاحت کریں۔

#UART_SEND_BYTES uart2_send_bytes کی وضاحت کریں۔

#UART_BAUD 9600 کی وضاحت کریں۔

MODBUS_RECV_TIMEOUT (u8)(35000.0f/UART_BAUD+2) کی وضاحت کریں

# MODBUS_SEND_INTERVAL 150 کی وضاحت کریں۔

#UART_INCLUDE کو شامل کریں۔

جامد بٹ is_modbus_recv_complete = 0;

جامد u8 modbus_recv_buff[270]؛

جامد u16 modbus_recv_len = 0؛//بائٹس کی کل لمبائی قبول کی گئی

جامد 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 *bytes,u16 len)

{

UART_SEND_BYTES(بائٹس،لین)؛

}

void modbus_recv_byte(u8 بائٹ)

{

اگر(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 func_code = پیکٹ[1]؛

جبکہ (modbus_send_interval)؛

اگر(func_code==MODBUS_FUNC_CODE_10)

{

((MODBUS_10_PACKET*)پیکٹ)->byte_num = ((MODBUS_10_PACKET*)پیکٹ)->word_num*2؛

len = 9+((MODBUS_10_PACKET*)packet)->byte_num؛

}ورنہ اگر(func_code==MODBUS_FUNC_CODE_0F)

{

len = ((MODBUS_0F_PACKET*)پیکٹ)->bit_num؛

((MODBUS_0F_PACKET*)پیکٹ)->byte_num = len/8+(len%8?1:0)؛

len = 9+((MODBUS_0F_PACKET*)پیکٹ)->byte_num؛

} اور

{

len = sizeof(MODBUS_PACKET)؛

}

crc = crc16 (پیکٹ، لین-2)؛

پیکٹ[len-2] = (u8)(crc>>8)؛

پیکٹ[len-1] = (u8)crc؛

modbus_send_bytes (پیکٹ، لین)؛

modbus_send_interval = MODBUS_SEND_INTERVAL؛

واپسی 0؛//کامیابی

}

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

void modbus_handler()

{

u16 crc؛

اگر(!is_modbus_recv_complete)

واپسی

// سی آر سی کی قیمت چیک کریں۔

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

واپسی لین؛

}


پوسٹ ٹائم: جنوری 12-2024