0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【开源获奖案例】智能培养室

迪文智能屏 2024-01-09 08:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

——来自迪文开发者论坛
本期为大家推送迪文开发者论坛获奖开源案例——智能培养室工程师通过Modbus协议实现了T5L智能屏控制加热、风机控温功能,还可调节电源功率实现模拟光照功能。系统可根据屏幕上设定的参数自动运行,并保存故障历史记录。


UI素材展示 db96ee72-ae83-11ee-aa22-92fbcf53809c.jpg  dba6d3be-ae83-11ee-aa22-92fbcf53809c.jpg

UI开发示例 dbbe0f16-ae83-11ee-aa22-92fbcf53809c.png C51代码设计

(1)主界面温度、湿度、高度等数据获取和更新,以及使用modbus rtu控制控温模块、电机、报警检测等各个从机的主要代码如下:

主界面代码参考:

#include "main_win.h"#include "modbus.h"#include "sys_params.h"

#include "func_handler.h"

#include "uart2.h"#include #include #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;#defineALERT_TABLE_LEN

20static u8 btn_sta[MAIN_WIN_BTN_MAX_NUM] = {0};static 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;bit 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)) continue;

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 { val = 0; if(i { 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 { if(i==0) continue;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 index; if(btn_val==0x0B) { main_win_disp_alert(); return; } index = btn_val-1; btn_sta[index] = !btn_sta[index];

if((index==3)||(index==7)) btn_sta[index] = 1; modbus_write_bit(btn_addr[index], btn_sta[index]?0xFF00:0x0000); btn_val = btn_sta[index];sys_write_vp(MAIN_WIN_BTN_STA_START_VP+MAIN_WIN_BTN_STA_OFFSET*index, (u8*)&btn_val, 1); if(index==9) is_main_win = 0; else if((index==3)||(index==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 offset; msg_len = msg_len; if(!is_main_win) return;if((f_code==MODBUS_FUNC_CODE_03)&&(data_len==MAIN_WIN_VAL_MAX_NUM*2)) { offset = MODBUS_RESPOND_POS_DATA; for(i=0;i { main_win_val = SYS_GET_U16(msg[offset], msg[offset+1]); offset += 2; } main_win_update(); }

else if((f_code==MODBUS_FUNC_CODE_01)&&(data_len==ALERT_BYTE_NUM)) { offset = 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))

{ offset = MODBUS_RESPOND_POS_DATA; for(i=0;i { temp_hum_val = SYS_GET_U16(msg[offset], msg[offset+1]);

offset += 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)) { offset = MODBUS_RESPOND_POS_DATA; for(i=0;i { date_val = SYS_GET_U16(msg[offset], msg[offset+1]); offset += 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(){ static u8 flag = 0; if(is_main_win) { if(alert_read_period==ALERT_READ_PERIOD) { alert_read_period = 0; modbus_read_bits(510, ALERT_BIT_MAX_NUM); return; } if(date_update_period==DATE_UPDATE_PERIOD) { date_update_period = 0; modbus_read_words(180, MAIN_WIN_DATE_MAX_NUM); return; } flag = !flag; if(flag) modbus_read_words(0, MAIN_WIN_VAL_MAX_NUM); else 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_INCLUDEstatic bit is_modbus_recv_complete = 0;static 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 packet;void modbus_init()

{ UART_INIT(UART_BAUD);}void modbus_send_bytes(u8 *bytes,u16 len){ UART_SEND_BYTES(bytes,len);}

void modbus_recv_byte(u8 byte){ if(is_modbus_recv_complete) return; if(modbus_recv_len

{ modbus_recv_timeout--; if(modbus_recv_timeout==0)

{ is_modbus_recv_complete = 1; } }}

u8 modbus_send_packet(u8 *packet)

{ u16 len; u16 crc; u8 func_code = packet[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; }

else if(func_code==MODBUS_FUNC_CODE_0F) { len = ((MODBUS_0F_PACKET*)packet)->bit_num;

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

len = 9+((MODBUS_0F_PACKET*)packet)->byte_num; }else { len = sizeof(MODBUS_PACKET); } crc = crc16(packet,len-2);

packet[len-2] = (u8)(crc>>8); packet[len-1] = (u8)crc; modbus_send_bytes(packet,len); modbus_send_interval = MODBUS_SEND_INTERVAL; return 0;//成功}extern void modbus_msg_handler(u8 *msg,u16 msg_len);void modbus_handler(){ u16 crc; if(!is_modbus_recv_complete) return; //校验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); return len;}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电源
    +关注

    关注

    185

    文章

    18707

    浏览量

    261324
  • ModBus协议
    +关注

    关注

    3

    文章

    189

    浏览量

    35028
  • 迪文屏
    +关注

    关注

    3

    文章

    87

    浏览量

    5958
  • 智能屏幕
    +关注

    关注

    0

    文章

    73

    浏览量

    3783
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    PLCT实验持续开放100名 RT-Thread 实习名额|甲辰计划开源实习联合培养

    ,积极促进RISC-V技术在全球范围内的普及。本次实习机会为【甲辰计划主理人发起开源实习生联合招聘培养项目】的一部分,委托甲辰计划主理人吴伟进行招聘面试。无论你是
    的头像 发表于 10-03 10:04 548次阅读
    PLCT实验<b class='flag-5'>室</b>持续开放100名 RT-Thread 实习名额|甲辰计划<b class='flag-5'>开源</b>实习联合<b class='flag-5'>培养</b>

    开源鸿蒙人才培养赋能课程共建正式启动

    近日,2025开放原子开源生态大会开源鸿蒙主题演讲在北京国家会议中心隆重举办。会上,开源鸿蒙人才培养赋能课程共建正式启动,该项目旨在推动开源
    的头像 发表于 07-28 17:44 659次阅读

    诚迈科技携多款鸿志智能终端亮相2025开放原子开源生态大会

    人民政府副秘书长许心超出席开幕式并致辞。诚迈科技携多款基于开源鸿蒙的鸿志智能终端亮相大会,并作为首批共建单位共同启动开源鸿蒙人才培养赋能课程共建计划。诚迈科技作为最
    的头像 发表于 07-25 12:37 1068次阅读
    诚迈科技携多款鸿志<b class='flag-5'>智能</b>终端亮相2025开放原子<b class='flag-5'>开源</b>生态大会

    开源获奖案例】AI智能交互新方案:基于T5L智能屏的AI DeepSeek大模型

    ——来自迪文开发者论坛本期为大家推送迪文开发者论坛获奖开源案例——AI智能交互新方案:基于T5L智能屏的AIDeepSeek大模型。该方案通过T5L串口与AI模块开发板进行数据交互,支
    的头像 发表于 07-12 09:02 719次阅读
    【<b class='flag-5'>开源</b><b class='flag-5'>获奖</b>案例】AI<b class='flag-5'>智能</b>交互新方案:基于T5L<b class='flag-5'>智能</b>屏的AI DeepSeek大模型

    全国首个985高校开源鸿蒙微专业落地!深开鸿与华中科技大学联合培养智能信息系统人才

    2025年7月9日,深圳——深开鸿与华中科技大学共同举办“智能信息系统微专业(开源鸿蒙)共建启动仪式”,这标志着全国首个985高校开源鸿蒙微专业正式启动。华中科技大学电信学院教学副院长梁琨教授,微
    的头像 发表于 07-10 19:04 958次阅读
    全国首个985高校<b class='flag-5'>开源</b>鸿蒙微专业落地!深开鸿与华中科技大学联合<b class='flag-5'>培养</b><b class='flag-5'>智能</b>信息系统人才

    deepin社区助力高校开源人才培养

    在数字化浪潮下,开源技术是科技创新的核心引擎。为探索高校参与开源及人才培养新路径,北京化工大学与北京青年政治学院师生近日参访开放原子开源基金会,进行深度交流。
    的头像 发表于 07-10 15:25 607次阅读

    开放原子与北京高校探索开源人才培养新路径

    在数字化浪潮席卷全球的当下,开源技术已成为推动科技创新的核心力量。7月3-4日,北京化工大学与北京青年政治学院组织师生走进开放原子开源基金会,围绕“高校如何参与开源以及开源人才
    的头像 发表于 07-10 10:18 722次阅读

    深开鸿与深信大联合培养的首批开源鸿蒙工程师完成KCA认证考试

    近日,深开鸿与深圳信息职业技术大学(以下简称“深信大”)联合培养的首批38名“开源鸿蒙工程师”顺利完成“KCA-应用开发工程师”认证考试,标志着校企合作的“双主体”育人模式培养开源鸿蒙
    的头像 发表于 07-01 15:36 985次阅读
    深开鸿与深信大联合<b class='flag-5'>培养</b>的首批<b class='flag-5'>开源</b>鸿蒙工程师完成KCA认证考试

    开源获奖案例】基于T5L智能屏的音乐播放与歌词显示方案

    ——来自迪文开发者论坛本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的音乐播放与歌词显示方案。该方案通过T5L串口与通用开发板、解码板进行数据交互,将解析完成的音频和歌词通过串口发送给
    的头像 发表于 05-08 09:52 608次阅读
    【<b class='flag-5'>开源</b><b class='flag-5'>获奖</b>案例】基于T5L<b class='flag-5'>智能</b>屏的音乐播放与歌词显示方案

    开源获奖案例】基于T5L智能屏的零食机

    ——来自迪文开发者论坛本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的零食机。该方案基于T5L芯片,通过PWM接口实现实时调控爪子抓取力度、速度,并支持后台按键长按时间读取,各模块自检
    的头像 发表于 04-30 18:20 444次阅读
    【<b class='flag-5'>开源</b><b class='flag-5'>获奖</b>案例】基于T5L<b class='flag-5'>智能</b>屏的零食机

    DIY开源智能马桶

    []()【开源福利!电子学子专属】某品牌智能马桶:家庭实用与二次开发的绝佳之选 各位电子类专业的同学们,想不想拥有一个既可以用于家庭日常使用,又能作为超棒的二次开发练习平台的神器?今天给大家带来某
    发表于 04-13 21:56

    开源获奖案例】基于T5L智能屏的FM收音机

    ——来自迪文开发者论坛本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的FM收音机。该方案基于T5L智能屏,通过串口4与FM收音机模块进行通讯,实现自动搜索获取不同频段电台
    的头像 发表于 03-28 15:39 722次阅读
    【<b class='flag-5'>开源</b><b class='flag-5'>获奖</b>案例】基于T5L<b class='flag-5'>智能</b>屏的FM收音机

    开源获奖案例】基于T5L智能屏的EQ均衡效果器

    ——来自迪文开发者论坛本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的EQ均衡效果器。工程师采用800×480分辨率屏幕,通过T5L串口4与均衡效果器开发板通讯,调节中心频率、增益、Q/S值等核心参数,实现高品质的
    的头像 发表于 02-14 11:27 911次阅读
    【<b class='flag-5'>开源</b><b class='flag-5'>获奖</b>案例】基于T5L<b class='flag-5'>智能</b>屏的EQ均衡效果器

    黄鹤开源社区正式发布

    联通多平台的开发者、开源企业和开源项目加入,汇聚武汉市全网的开源数据,为政策制定、人才培养、企业激励和项目培养等提供量化、精准支持,助力打造
    的头像 发表于 12-23 11:33 973次阅读

    高校开源开发者培养分论坛亮点前瞻

    数字化时代,开源成为了全球软件与技术创新的重要驱动力,从Linux操作系统到Android移动平台,从人工智能框架到云计算基础设施,一个个开源项目遍地开花。然而,在开源蓬勃发展的背后,
    的头像 发表于 12-17 14:06 768次阅读