ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32与迪文屏协同:智能温湿度控制面板的嵌入式开发全解析

STM32与迪文屏协同:智能温湿度控制面板的嵌入式开发全解析 先把这个项目做了什么说清楚它是一块7英寸左右的迪文串口屏配上STM32主控板再加一个温湿度传感器做成了能实时显示环境数据、带历史曲线、能手动/自动控制继电器通断的面板。屏幕上的“温度”“湿度”数字不是屏幕自己编的而是STM32通过串口实时喂给DGUS系统的“开关”“模式”之类的点按动作也不是摆设而是DGUS把触摸事件封装成指令回传给STM32由STM32真正去驱动继电器、加热器或者风扇。这套方案在智能家居圈子里一直很吃香原因就一个迪文屏把“做界面”这件事从单片机开发里彻底剥离了。你不需要会LVGL、不会画UI也没关系DGUS里拖控件、配字库、设变量地址界面开发效率比纯代码高出好几个量级。而STM32这边只干活不搞花活读传感器、处理PID或者简单的回差控制、执行IO输出分工清晰到让人舒服。这篇文章从零开始把硬件的接法、DGUS工程的配置、STM32的串口通信协议、回差控制逻辑以及我在实调中踩过的坑全部过一遍。适合正在做智能家居相关课程设计、毕业设计或者刚接触迪文屏想做点实际东西的开发者参考。1. 项目整体设计与方案选型1.1 为什么选迪文屏而不选其他方案做温湿度面板显示端无非三条路。第一条用普通LCD屏加LVGL或者u8g2所有控件都得自己画、自己刷新按钮状态要自己维护图标要一张张抠图转换字符串要处理编码和字库。做一个像样的面板界面光是UI代码就能写两三千行调布局更是痛苦。第二条用组态屏比如昆仑通态、威纶通稳定性和生态都不错但这类屏偏工业组态价格偏高授权和平台限制也让人头大拿来做个课程设计或者家居原型成本上不划算。第三条就是本项目选的迪文屏加DGUS。迪文把界面运行要干的事情全部收进屏幕自己的固件里变量轮询、触摸反馈、动画、曲线、进度条这些统统由DGUS在屏上自动完成。开发者要做的只是在DGUS软件里配置好UI然后定义一个变量地址表剩下的就是和屏幕互相发串口帧。还有个很现实的原因是学习资料的数量。迪文屏在国内高校和创新项目里用得非常广DGUS的教程、例程、视频满天飞遇到问题能搜到大量现成答案。STM32又是最普及的MCU平台之一这两者组合起来几乎是问一句就能在论坛上得到回应的程度对新手极其友好。1.2 硬件选型清单与理由这个项目的硬件很简单我列一下实际用到的迪文屏推荐选7寸1024x600分辨率DGUS II系统的型号比如DMG80480C070系列。也可以根据外壳需求选5寸或者4.3寸逻辑完全一样。注意一定要选带DGUS II的内核固件版本T5L或者T5UID2都行便宜的旧款T5UIC内核也能用但功能受限。STM32主控STM32F103C8T6也就是大家口中的“最小系统板”性价比极高串口、定时器、ADC、GPIO完全够用。如果手头是F407或者G031也没问题逻辑层面没有依赖。温湿度传感器SHT30。这是首选I2C接口、精度高、有CRC校验数据可靠。退一步用DHT11也行但要注意DHT11精度太差甚至只有±2°C做演示可以真实控制不建议。继电器模组常见的一路或者两路5V继电器模块带光耦隔离。用来控制加热棒、风扇、加湿器等。电源迪文屏需要5V供电STM32板子也吃5V继电器模块同样5V传感器3.3V所以一个5V/2A以上的电源再加一块AMS1117-3.3搭个小稳压电路就够了。串口转USB模块推荐CH340或者CP2102主要用来烧录程序、调试打印实调阶段离不开它。这套组合踩坑概率低、总价便宜而且每个模块的文档都能顺手找到非常适合作为练手对象。1.3 系统架构和通信链路整个系统的信息流是这样的传感器SHT30通过I2C把温度和湿度数据交给STM32。STM32内部做一个简单的滤波和控制算法得出当前环境状态以及要不要开加热、加湿。然后STM32通过串口1USART1把这些数据以迪文的0x82写指令发送给迪文屏迪文屏根据变量地址刷新控件显示。反过来用户在屏幕上点按钮DGUS固件会把触摸事件打包成0x83读指令或者0x82写指令再通过同一根串口回传给STM32STM32解析以后执行对应IO操作。需要注意迪文屏的串口电平是3.3V TTLSTM32也是3.3V TTL所以两者之间不需要转电平直接TX-RX交叉接线就能通信。如果用5V单片机和迪文屏对接才需要加电平转换。电源和信号要分开布线继电器那边如果驱动的是感性负载电机、变压器之类最好在触点两端并联一个续流二极管不然关断瞬间的反电动势很容易干扰串口通信严重时直接复位单片机。这个问题我在第6章详细讲。2. 关键工具链准备DGUS开发环境、Keil工程搭建2.1 DGUS软件版本与工程创建迪文的DGUS软件开发工具从早期的DGUS 5.x到现在常用的DGUS 7.x以及新出的DGUS II对应的DGUS Tool差别其实挺大。这里统一用DGUS Tool 7.1版本左右的界面做演示老版本5.x界面风格不同但操作逻辑大同小异。打开DGUS Tool以后新建工程时需要选择你屏的具体型号和分辨率。关键一步是选择“显示内核”如果你用的是T5L内核的屏应该选择“T5L-DGUS2”如果是老屏就选对应的内核。内核选错生成的工程下到屏里会出现白屏或者触摸无效的现象我一开始就吃过这个亏。新建工程后的目录结构是这样的DWIN_SET文件夹这个文件夹名字不能改。所有要下载到屏里的文件图标、字库、背景图、配置文件都必须放在这个目录下。字库文件默认是0.DWIN_ASCIIASCII字符、1.DWIN_CN中文字库等编号和功能是固定的不要乱动。背景图是32开头的BMP文件比如32_1.bmp就代表第1页的背景图页面编号从32开始递增。这些“潜规则”如果没人提醒光看官方手册很容易被绕进去。2.2 Keil5工程与STM32基础配置STM32侧我用的标准外设库或者HAL库都可以。标准库简单直接适合小项目HAL库代码生成方便适合以后扩展。下面以标准库为例说明串口初始化。串口1的配置代码void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; // TX GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; // RX GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, GPIO_InitStructure); USART_InitStructure.USART_BaudRate 115200; USART_InitStructure.USART_WordLength USART_WordLength_8b; USART_InitStructure.USART_StopBits USART_StopBits_1; USART_InitStructure.USART_Parity USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE); }波特率这里特意选了115200。迪文屏默认出厂波特率是1152008数据位、1停止位、无校验。虽然屏可以修改波特率但没必要改115200对这类数据量已经很宽裕了。GPIO配置里TX要配置成推挽复用输出RX配置成浮空输入这是新人经常搞反的点。如果TX配错了屏幕上会时不时出现乱码数据。3. DGUS界面设计从背景图到变量配置3.1 素材准备与背景图设置DGUS的核心理念是“所见即所得”界面做起来非常像PPT。你得先在Photoshop或者任何画图工具里把背景图做好导出为BMP格式分辨率要和屏幕一致比如1024x600。背景图的内容直接决定了这个面板的高不高级。实际做的时候建议把整体的视觉风格定成深色系深灰或者藏蓝背景加上白色/青色文字夜间放在床头不刺眼录视频也很有科技感。把“温度”“湿度”“当前状态”这些静态文字直接画进背景图里不要在DGUS里用文本控件去放这样能减少变量开销界面也更干净。在DGUS Tool里把做好的背景图复制到DWIN_SET目录重命名为32_1.bmp然后在“页面管理”中确保背景图对应到页面ID 1。注意这里的页面ID不是第几页就是几背景图的命名规则是32开始递增这个是DGUS定死的不能改。3.2 数据变量显示控件配置显示温湿度的最核心控件是“数据变量显示”。以温度为例在DGUS里拖一个数据变量显示控件然后在控件属性里设置变量地址0x1000地址范围可以在0x0000到0xFFFF之间选避开系统占用区域就行变量类型整数16位2字节显示格式整数部分2位小数部分1位显示方式十进制字体和颜色按需选择配置好之后ST运行的时候只要用0x82指令往地址0x1000写入一个新的数值屏幕就会自动刷新显示不需要屏幕侧做任何额外操作。这就是DGUS最爽的地方底层刷新全在屏里单片机只负责发数字。需要特别说明的是小数处理方式。DGUS的数据变量显示控件虽然能显示小数点但传输的数据本身是整数格式比如要显示25.3°C你直接传253进去然后控件里配置“小数位数为1”屏幕就会自动显示成25.3。这个换算逻辑在做通信的时候一定要牢记传值倍率搞错了轻则显示偏差重则逻辑错乱。3.3 触摸按键与状态返回配置在DGUS里做开关按钮用“按键返回”控件最方便。放置这个控件以后关键配置是变量地址0x2000按键值比如开1关0键值类型切换型还是按下型切换型适合做电源开关按一下发1再按一下发0。你还可以设置“按下时返回”和“弹起时返回”两种模式如果要做短按和长按两种逻辑就要分别处理。按键状态在屏幕上的视觉反馈可以通过“位显示”控件或者“图标”控件来实现。比如把一个图片控件关联到地址0x3000当STM32返回0时显示“关闭”图标返回1时显示“开启”图标。图片显示的地址要和你发送的数据一致否则就会出现开关状态和实际设备状态对不上的尴尬情况。迪文的“位显示”控件适合做指示灯这种只有亮/灭两种状态的东西而“图标显示”支持更多状态的切换。两个控件本质都是根据变量值去索引图库里的图片理解了这个思路界面的状态反馈就全靠这几个控件了。3.4 历史曲线与文本显示历史曲线是迪文屏的一大特色在“曲线显示”控件中你可以指定曲线的数据源地址比如温度曲线对应0x4000湿度曲线对应0x4001然后设置坐标范围、背景色、曲线颜色。曲线有两种运行方式一种是单片机定时往地址里写新的当前值屏幕自动平移另一种是单片机一次性往一个缓冲区写一批历史数据屏幕把它画成静态曲线。前者适合做实时变化趋势我建议用这个。写入频率通常1~5秒一次就够太频繁反而刷屏闪烁。文本显示方面DGUS有两种文本控件ASCII文本每个字符占一个字节适合显示英文和数字编码就是ASCII简单得很。中文字符串显示这个要用到UNICODE编码STM32侧需要把中文转换成UTF-16编码再发送不然屏幕上全是乱码。新手最常踩的坑就在这中文文本控件里直接发GBK编码的数据然后屏幕一片空白或者乱码。解决方法是让STM32把中文字符串转成宽字节UTF-16LE以后按每个汉字2字节的方式发送。网上有现成的汉字Unicode码表或者用Python脚本把字符串批量转换后存成一个常量数组程序运行时直接查表发送即可。4. STM32核心代码实现传感器采集、串口通信与联动控制4.1 SHT30温湿度采集与数据预处理SHT30通过I2C访问地址是0x44ADDR引脚拉低或者0x45ADDR引脚拉高。I2C初始化是标准流程这里不展开重点说一下采集周期和数据滤波。SHT30的测量命令是0x2C 0x06对应高重复性、周期模式。发完命令以后延时100ms再读6个字节温度高字节、温度低字节、CRC、湿度高字节、湿度低字节、CRC。读出来的温度原始值按照如下公式转换float temp -45.0f 175.0f * (rawTemp / 65535.0f); float humi 100.0f * (rawHumi / 65535.0f);这个公式是SHT30数据手册里的标准公式直接用就可以。上次采集的值要做一个一阶低通滤波最简单的一次指数平滑filtered alpha * raw (1 - alpha) * filtered;alpha取0.2左右就行。这个滤波在温湿度这种变化缓慢的场景下效果极其明显能让显示数字不再乱跳。前面板显示的数据一定要用滤波后的值而控制逻辑用的是原始值还是滤波值要自己定。我倾向于控制和显示都用同一个滤波值这样屏幕上看到25.0°C系统就是按25.0°C来决定动作的人机理解一致。4.2 DGUS协议0x82和0x83的指令格式迪文屏的串口协议是标准的帧格式帧头是5A A5后面跟数据长度从指令开始到结束的字节数、指令ID、数据区。我先把几个常用帧写出来。写入数据到变量地址0x82指令的例子向地址0x1000写入一个温度值250表示25.0°C5A A5 05 82 10 00 00 FA拆解一下5A A5帧头05数据长度0x82指令1字节 地址2字节 数据2字节 582写变量指令10 00起始变量地址0x100000 FA要写入的数据250的十六进制如果要连续写多个数据比如同时写温度和湿度可以一次写完5A A5 07 82 10 00 00 FA 01 90这里长度变成了7数据区多了两个字节。数据长度一定要数清楚多一个少一个都会导致整个串口帧被丢弃屏幕上就什么都刷新不了。这是新手阶段出现频率极高的错误。读变量0x83指令的格式一样不过这个项目里实际用不到屏主动读单片机。因为所有的反馈都可以通过按键返回控件直接写变量而显示数据又都是由STM32主动推送所以项目里只需要实现0x82的发送和0x83的解析不需要实现指令回复逻辑清晰很多。如果需要用迪文屏带的RTC模块用5A A5 04 82 00 10 00 32之类的指令把时间数据写到0x0010区域屏幕就会自己走时钟然后在界面上放一个RTC显示控件就能把时间显示出来。这个功能做面板装饰或者记录曲线时间轴非常方便。4.3 发送代码封装与缓存处理STM32侧发送迪文协议帧最稳的方式是用一个DMA缓冲区把整帧数据发出去避免逐字节发送时被中断打断导致帧间隔不稳定。我实际用的是标准库加阻塞发送void DWIN_SendData(uint16_t addr, uint8_t *data, uint8_t len) { uint8_t frame[32]; uint8_t i; uint8_t index 0; frame[index] 0x5A; frame[index] 0xA5; frame[index] len 3; // 指令ID 1 地址2 数据len frame[index] 0x82; frame[index] (addr 8) 0xFF; frame[index] addr 0xFF; for (i 0; i len; i) { frame[index] data[i]; } for (i 0; i index; i) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET); USART_SendData(USART1, frame[i]); } }需要注意这里的长度字段计算len是数据区的字节数总帧长是1指令 2地址 len。所以帧长度字段应该是len 3。如果这里写成len 5屏幕就会一直没反应因为帧粘连了。每次发送数据之前最好清空一下发送完成标志或者干脆用while (USART_GetFlagStatus(USART1, USART_FLAG_TC) RESET);等待上一帧发完。不然连续发帧的时候上一次的TC标志没清第一个字节可能直接被吞掉整帧就错位了。4.4 按键指令解析接收中断里收到完整帧以后要做的是解析帧头、长度、指令ID然后提取数据区。按键返回控件的默认行为是触摸按键时屏幕通过0x83指令上报变量地址和数据。也就是说屏幕上电以后如果触摸了一个按键返回控件串口会收到类似下面的帧5A A5 05 83 20 00 00 01解析方式帧头5A A5指令ID是83数据区第一个字节20 00是变量地址0x2000数据区后面是00 01代表这个地址当前的值是1这里有个容易踩坑的地方迪文的0x83上报数据格式有两种一种是自动上传的“地址数据”格式是[地址高][地址低][数据...]另一种可能带附加字节说明数据长度不同固件不太一样。所以拿到数据后不要急着写死解析逻辑先接上串口助手实际看触摸的时候到底收到什么格式的帧再写STM32侧的解析代码。我通常的做法是触摸前后都抓一帧数据对比差异确认数据格式再实现解析。这样能省下大半天的排错时间。解析到按键值以后就可以在主循环里做联动控制了。比如按键地址0x2000收到1就置位一个全局变量manual_heat_on 1如果收到0就清零。这个全局变量会被控制逻辑使用。4.5 回差控制逻辑温湿度控制的经典控制算法是回差控制也叫滞回控制比简单的“低于阈值就开”要稳得多。以加热控制为例假设目标温度是25.0°C温度低于24.5°C时开启加热温度高于25.5°C时关闭加热24.5到25.5之间时保持原状态不变回差是1.0°C。这样可以避免继电器在目标温度附近频繁通断不然继电器会啪啪啪地响触点寿命也会急剧缩短。如果项目之后要升级成PID控制输出量可以直接通过0x82指令发给屏幕的“数据变量显示”或者“进度条”控件做成一个实时的功率指示条。回差控制适合做开关量PID适合做模拟量比如PWM加热功率两者不冲突。5. 从单板联调到系统联调全流程5.1 硬件接线检查清单我每次接完线都会花两分钟过一遍这个清单能避免九成以上的低级错误STM32的TX接到迪文屏的RX屏的2脚STM32的RX接迪文屏的TX屏的3脚GND必须共地。注意是交叉接不是直连。迪文屏的电源是5V不要接到3.3V上否则背光完全不亮或者极暗。SHT30的SCL和SDA需要上拉电阻一般模块上已经有如果是裸芯片要注意加4.7kΩ上拉。继电器模块的IN脚如果是高电平触发就直接接STM32的GPIO如果是低电平触发要看模块上有没有反相器一般常见模块都是高电平触发。5V电源的电流要足够迪文屏背光全开加上STM32板子峰值能到700mA左右用USB口直接供电偶尔会供电不足导致屏幕闪烁重启。5.2 先单独验证屏幕再验证单片机最后联合调试这一步很关键千万不要一上来就把整套程序烧好然后直接通上电出问题了根本不知道是屏幕问题还是MCU问题。第一步先单独验证迪文屏。用串口助手直接连屏幕的串口上电后屏幕应该能正常显示背景图。然后手动发送一帧0x82指令比如5A A5 05 82 10 00 00 FA看温度数字是否变成25.3如果变了说明屏幕和工程没问题。第二步验证STM32。不接屏幕STM32上电后串口输出打印信息确认SHT30读取正常温度湿度值在范围内。这里可以先用固定值测试比如强制往串口发送一帧假数据看打印结果对不对。第三步才是真正联调。把STM32的TX、RX接到屏幕上电后观察屏幕是否每隔一段时间就刷新一次温度和湿度。触摸屏幕的开关看STM32的串口中断是否收到0x83帧串口助手里应该能看到原始收包。我在实测中发现迪文屏上电后会和主机有一个握手或者自动上报的机制如果STM32侧的接收缓冲区太小很容易被屏幕初始化时发过来的数据冲掉。所以接收缓冲区大小至少设置128字节解析时要能处理多条帧粘连的情况。5.3 JTAG/SWD引脚冲突问题STM32的PA13、PA14、PA15、PB3、PB4这些引脚在默认状态下是SWD调试引脚和JTAG引脚。如果你把继电器或者别的外设接在这些引脚上程序里通不通单片机的调试端口和GPIO功能会打架轻则没输出重则直接进不了调试模式。具体到本项目如果用SWD下载调试PA13/PA14必须留给调试器不要接任何外设。如果实在需要PA15比如接继电器要在初始化最前面禁用JTAG只保留SWDGPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);这个设置必须在GPIO配置之前执行否则你的PA15永远不受控制。我上次做类似项目时犯过这个错把继电器接到PA15结果程序里高低电平怎么翻都没反应。后来用示波器测引脚才发现它一直被JTAG逻辑占用。这个坑写出来给后面做扩展的人提个醒。6. 调试中的坑与排查方法6.1 屏幕显示乱码屏幕显示乱码常见原因有这么几个。第一编码问题。数据变量显示控件配置成了“十六进制显示”方式但你发的是十进制数据就会显示成奇怪的数字。检查控件属性里的“数据格式”一般改成“十进制”。第二小数倍率问题。控件设置小数位数太多或者太少导致你发250它显示25.0、发25它显示2.5。确认倍率和实际数据一致就行。第三串口数据错位。帧长度填错导致后续所有帧全部错位。用串口助手查看实际发送出来的十六进制数据和标准帧格式对比重点看长度字段。中文乱码多半是UTF-16编码转换没做对。我常用的方法是用Python一次性生成全部中文文本的Unicode转义数组text 温度正常 data text.encode(utf-16-le) print( .join(f0x{b:02X} for b in data))把生成的一串字节直接复制到STM32的常量数组里发送时按顺序发出去中文显示稳如老狗。6.2 屏幕有显示但数据不刷新这种情况基本能确定是串口通信断了或者地址对不上。先用串口助手拦截STM32的原理数据确认帧头、长度、指令、地址、数据都没问题。如果STM32发送正常再把串口助手直接接屏幕的RX手动发一帧同样指令如果屏上数字变化说明屏的问题不大。如果屏没反应检查DGUS工程里控件的变量地址和当前发送的地址是不是同一个。地址差一个数都白搭。还有一个小概率原因是多个页面都用同一个变量地址但当前显示的页面上没有放对应的控件数据其实已经被屏接收了只是这个页面不显示而已。检查当前显示的页面和对应控件所在页面是否一致。6.3 继电器反复通断、抖动这个问题几乎全是逻辑原因不是硬件原因。首先检查回差控制的实现。如果代码里写成“低于目标温度就开高于目标温度就关”没有回差逻辑那温度在目标值附近震荡时继电器就会高频通断。加一个滞回区间抖动问题立刻消失。其次是传感器滤波不够。就算算法上有滞回如果采集的原始数值一直剧烈跳动也可能反复跨过阈值。把滤波去掉换成一阶低通或者加大alpha的平滑系数都能缓解。然后检查触摸开关和自动控制的优先级。如果手动模式开关和自动模式逻辑同时生效用户关掉了加热主循环里又检测到温度低又自动打开看起来就像继电器在“自己跳”。一定要在软件里定义好状态机手动优先还是自动优先两者冲突时必须只有一个主导。6.4 迪文屏下载工程后白屏这是迪文屏最经典的问题。原因基本是两个一是DGUS工程的内核选错比如用T5L的工程下到T5UID2的屏里二是DWIN_SET目录下的文件命名或者格式不对。解决方法先用SD卡刷回出厂配置再重新生成工程。迪文屏支持SD卡脱机下载把DWIN_SET文件夹整个拷到一张格式化为FAT32的TF卡根目录插到屏幕上电屏幕会自动进入下载状态这个功能在批量生产的时候也很有用。刷机时的注意事项TF卡不能大于32GB必须格式化成FAT328.3短文件名格式要求文件不能有特殊字符文件名必须全英文数字。下载过程中不能断电否则屏幕变砖的风险很高到时候还得靠串口强制恢复。6.5 串口干扰导致数据错乱如果继电器或者加热器一动作屏幕数据就乱一下大概率是电源和信号干扰问题。排查顺序继电器模块的电源是否和传感器、单片机共用一路供电如果是给继电器单独供电或者至少加一个大容量电解电容比如470uF放在电源入口处。继电器触点的感性负载是否加续流二极管如果是直流感性负载反接一个1N4007如果是交流负载用RC吸收电路。串口线是否用的杜邦线飞线杜邦线本身没问题但尽量别和继电器输出线绑在一起走信号线要远离强电走线。STM32的VDDA引脚有没有接滤波电容手册要求VDDA接1uF和0.1uF少一个都会导致ADC波动、串口偶发错误。有一次我调一个类似系统加热一开屏幕就数据乱跳排查到最后发现是给加热棒供电的12V电源和STM32共用了一个劣质开关电源。换了一个电源模块之后问题彻底消失。供电质量对整套系统的稳定性影响实在太大了。7. 扩展方向与心得收尾这个项目做完之后扩展空间其实非常大。接口都留好了加模块就是加代码的事情。比较实用的扩展方向有三个。一个是加联网模块比如ESP8266或者ESP32用串口接到STM32剩余的USART口上把温湿度数据定时上报到MQTT服务器手机App就能远程查看和控制。迪文屏上可以加一个“联网状态”图标把网络状态当成一个变量来刷新。另一个是加语音播报迪文屏本身有音频播放能力可以在温度超限时播放提示音或者语音这个只需要在DGUS里加一个音频控件STM32写一个标志位变量就行。还有一个方向是把单面板升级成多房间控制面板。迪文屏页面很多一页控制一个房间每个房间的温湿度用独立的变量地址段STM32在轮询时逐房间上报。这种方式做出来已经完全是一个小型家居控制主机的雏形了。我实际做完这套项目后最大的感受是迪文屏加STM32这套组合很适合做智能家居产品原型快出活。界面不上代码就能做得很精致业务逻辑集中在单片机里也方便后期迁移到其他平台。如果你正在做课程设计或者想把自己家里的环境监控做成实体的这个方案可以直接照抄硬件的总成本控制在两三百块左右却能得到一个完全可用的成品。最后再分享一个细节调试的时候千万不要把锁存延时的代码放在串口中断里面做宁可牺牲一点实时性也要把迪文数据帧的解析和主逻辑放在主循环里。串口中断只做FIFO收包主循环做解析逻辑清晰了后面加任何功能都顺。就凭这一条遇到问题排查的时候你能比同行少走一半弯路。
返回列表