[ওপেন সোর্স] ইন্টেলিজেন্ট ট্রেনিং রুম

—— DWIN ডেভেলপার ফোরাম থেকে

এই ইস্যুতে, আমরা আপনাকে DWIN ডেভেলপার ফোরামের পুরষ্কার বিজয়ী ওপেন সোর্স কেস - স্মার্ট চাষ ঘরের সাথে পরিচয় করিয়ে দিচ্ছি।ইঞ্জিনিয়াররা Modbus প্রোটোকলের মাধ্যমে গরম এবং ফ্যানের তাপমাত্রা নিয়ন্ত্রণ ফাংশন নিয়ন্ত্রণ করার জন্য T5L স্মার্ট স্ক্রিন প্রয়োগ করেছে।আলো ফাংশন অনুকরণ করার জন্য পাওয়ার সাপ্লাইও সামঞ্জস্য করা যেতে পারে।সিস্টেমটি স্বয়ংক্রিয়ভাবে পর্দায় সেট করা পরামিতি অনুযায়ী চলতে পারে এবং ত্রুটি ইতিহাসের রেকর্ড সংরক্ষণ করতে পারে।

1.UI উপাদান প্রদর্শন

asvdfb (2)
asvdfb (1)

2.UI ডিজাইন

asvdfb (3)

1.C51 ডিজাইন

প্রধান ইন্টারফেসে তাপমাত্রা, আর্দ্রতা এবং উচ্চতা, এবং তাপমাত্রা নিয়ন্ত্রণ মডিউল, মোটর, অ্যালার্ম সনাক্তকরণ এবং অন্যান্য স্লেভ মেশিন নিয়ন্ত্রণ করতে মডবাস আরটিইউ ব্যবহার করার মতো ডেটা অর্জন এবং আপডেট করার প্রধান কোডগুলি নিম্নরূপ।

প্রধান ইন্টারফেস কোড রেফারেন্স:

# "main_win.h" অন্তর্ভুক্ত করুন

# "modbus.h" অন্তর্ভুক্ত করুন

# "sys_params.h" অন্তর্ভুক্ত করুন

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

চর তারিখ[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;

অকার্যকর main_win_update()

{

}

অকার্যকর main_win_disp_date()

{

u8 লেন;

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

}

অকার্যকর main_win_process_alert()

{

u8 i;

জন্য(i=0;i

{

যদি(GET_ALERT_BIT(পুরাতন_সতর্কতা_ভাল, i))

চালিয়ে যাওয়া

যদি(GET_ALERT_BIT(সতর্ক_ভাল, i))

{

যদি(সতর্ক_সংখ্যা>=ALERT_TABLE_LEN)

সতর্কতা_সংখ্যা = 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]

);

সতর্কতা_সংখ্যা++;

}

}

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

}

void main_win_disp_alert()

{

u16 i;

u16 ভাল;

u16 len = 0;

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

}

অকার্যকর 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))

{

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

যদি (! হয়_প্রধান_জয়)

প্রত্যাবর্তন

যদি((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[অফসেট], msg[অফসেট+1]);

অফসেট += 2;

}

main_win_update();

}অন্যথায় যদি((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM))

{

অফসেট = MODBUS_RESPOND_POS_DATA;

জন্য(i=0;i

{

সতর্কতা_ভাল = বার্তা[অফসেট];

অফসেট++;

}

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[অফসেট], msg[অফসেট+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[অফসেট], msg[অফসেট+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)

{

সতর্কতা_পড়া_কাল = 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 rtu কোড রেফারেন্স:

# "modbus.h" অন্তর্ভুক্ত করুন

# "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;//ওভারফ্লো সময় গ্রহণ করুন

স্ট্যাটিক উদ্বায়ী 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)

প্রত্যাবর্তন

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

while(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*)প্যাকেট)->বাইট_সংখ্যা;

}অন্যথায় যদি(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*)প্যাকেট)->বাইট_সংখ্যা;

}অন্য

{

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 মান পরীক্ষা করুন

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