ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

STM32恒温热水器控制系统设计:从DS18B20采集到继电器滞回控制

STM32恒温热水器控制系统设计:从DS18B20采集到继电器滞回控制 1. 先把需求讲清楚恒温热水器控制系统到底要解决什么问题我估计很多人一开始看到“恒温热水器控制系统”这名字会以为就是一个普通的温度采集显示项目——把水温读出来在LCD上显示就行。真做下去才发现温度采集只是地基整套系统真正的难点在于如何把“检测”变成“控制”加热器要什么时候开、什么时候关、温度过冲怎么抑制、继电器频繁通断怎么避免、超温怎么保护。把这条逻辑理通了这个项目才算是做成了。传统非恒温热水器是“先加热到高温再兑冷水用”水箱里热水分层前一个人洗完第二个人就要等。恒温热水器做的事情是实时采集水温水温低于设定值就继续加热到了设定值就自动停让水箱里的水始终维持在一个比较稳定的温度区间。这套机制在生活场景中对应的是电热水器、即热式饮水机、恒温泳池加热器这类设备本质都是一个带反馈的闭环控制系统。放在STM32这个载体上功能可以拆出四块感知层温度传感器实时读取水温负责把物理量变成电信号再变成数字量。决策层STM32核心处理器比较当前温度和用户设定温度输出加热开关信号。执行层继电器控制加热丝或加热棒的通断电。交互层LCD显示当前温度与设定温度按键完成设定调整蜂鸣器做超温或故障报警。真正的工程点在于感知、决策、执行三层之间的时序匹配。温度传感器不是立刻反映水温的探头附近的水被加热了但整个水箱的温度还没上来加热器断电之后热量还会继续向水中扩散水温会继续惯性上升一小段。如果控制逻辑只盯着“不高于设定就开、高于设定就关”这种简单判定实际效果往往是温度冲过头然后跌回来再冲来回震荡。后面我会专门讲这个问题的处理方式控温策略比你想的要讲究。面向的读者我建议分两类一类是做课程设计或毕业设计的学生把这个项目当成一个完整嵌入式系统的训练样本从需求分析到硬件设计再到软件联调全程走一遍另一类是刚学完STM32基础知识、想找个综合项目练手的开发者你需要把GPIO、定时器、外部中断、通信协议这些东西真正串起来这个项目刚好是一套组合拳。整个项目在Proteus里仿真跑通大概需要一到两天加上程序调试和报告整理三到五天可以做出完整成果。2. 硬件方案选型与仿真电路搭建Proteus里怎么把这套系统搭起来很多人在Proteus里搭电路习惯从库里拖元件、连导线连完就赶紧写程序。但硬件设计如果一开始就选错了方案后面仿真跑不通你根本分不清是电路问题还是软件问题。先说清楚选型逻辑再给你引脚分配表。2.1 主控选型为什么是STM32F103C8T6这个项目的主控用STM32F103C8T6几乎是此类课程设计最稳的选择。原因很简单价格便宜市面上最小系统板十几块钱就能买到Proteus元件库里也直接有仿真模型。资源足够64KB Flash、20KB SRAM跑一个恒温控制系统加LCD显示绰绰有余不需要上F407那种高端芯片。参考资料最多不论你写标准外设库还是HAL库网上随便一搜就是几千篇笔记踩坑容易找到解决方案。Proteus支持度高DS18B20、LCD1602这些外围模型和STM32模型配合稳定仿真速度也快。如果你手头已经有STM32F103C6或者C8的高密度型号也没问题只要Flash能满足编译出来的hex文件大小就行。核心功能对引脚资源消耗很小一个完整的工程编译出来通常十几KB到二十几KB。2.2 温度采集方案对比DS18B20和NTC怎么选温度检测是整套系统的信号源这里选错后面全是白搭。通常有两条路方案一DS18B20数字温度传感器这个方案我强烈推荐。DS18B20和MCU之间只走一根数据线单总线协议测温范围-55到125摄氏度12位分辨率下精度是0.0625摄氏度完全满足热水器的控温需求。最关键的一点是输出直接是数字信号不需要MCU做ADC采样也免去了校准温度曲线的麻烦。Proteus里建模很成熟直接在元件库搜“DS18B20”就能找到。方案二NTC热敏电阻加ADC采集成本确实低但工程麻烦多了。NTC是电阻随温度变化要用电桥或分压电路把电阻变化转成电压MCU再通过ADC读电压然后查表或按公式换算成温度。换算公式里有B值不同厂家B值还不一样仿真里还要自己调分压电阻参数。而且NTC的响应曲线不是线性的低温段和高温段的灵敏度差很多。我见过很多学生项目做NTC方案最后死在校准上你完全没必要给自己加这个难度。温度传感器选型对比表如下对比项DS18B20方案NTCADC方案与MCU接口单总线只需一个GPIO电阻分压后接ADC引脚数据形式数字信号直接读出温度值模拟电压需查表/公式换算温标校准无需校准需要校准电阻值和B值Proteus仿真复杂度元件模型成熟使用简单需要搭分压电路调参麻烦精度±0.5℃以内取决于校准精度通常可达±1℃2.3 加热执行机构继电器方案就够用了加热器控制有两种主流选择。一种是继电器简单粗暴GPIO输出高电平通过三极管或ULN2003驱动继电器线圈继电器触点串接加热丝通断由程序控制。另一种是可控硅晶闸管配合过零检测电路做PWM调功可以通过调节导通角来控制加热功率控温效果更平滑但电路复杂程度立刻上升一个等级。在Proteus仿真里我建议用继电器。原因一是仿真关注的核心是控制逻辑不是功率电子电路二是Proteus里的可控硅模型和过零检测电路调试起来挺费劲你花那个时间不如把控温算法写好。实际做硬件时继电器加一个1N4007二极管做反向续流保护防止线圈断电瞬间产生的高压反电动势损坏IO口仿真里也要加上这个二极管否则某些版本的Proteus模型会报错或不动作。温度控制上继电器采用滞回控制这个后面程序部分详细讲。如果你之后想把方案升级成“恒温更精准”的版本可以在硬件上改成固态继电器或可控硅PWM调功程序上再引入PID算法这就是同一个项目的两档难度可以先做好基础版。2.4 显示方案与按键交互LCD显示选LCD1602还是LCD12864要看你的显示需求。LCD1602能显示两行每行16个字符用于显示“当前温度”和“设定温度”完全够用Proteus里的模型叫LM016L四线模式就能驱动接线省引脚。如果你希望显示中文提示那要选LCD12864带中文字库但Proteus里的12864模型和代码驱动比1602复杂数据手册和例程也少很多入门阶段没必要给自己找不痛快。按键建议放三个设置键、加键、减键。设置键进入参数调整模式加键和减键调整目标温度。按键不需要扫描矩阵直接三个GPIO做输入检测配上软件防抖就够了。2.5 引脚分配与Proteus接线明细以STM32F103C8T6为例我给出一个经过实际仿真验证的引脚分配表功能模块信号线STM32引脚DS18B20温度采集DQ数据线PA0接4.7k上拉电阻到3.3VLCD1602RSPA1LCD1602RWPA2LCD1602ENPA3LCD1602D4-D7PA4-PA7继电器控制IN继电器输入PA8经NPN三极管驱动蜂鸣器BEEPPA9经三极管驱动按键设置KEY_SETPB0按键加KEY_UPPB1按键减KEY_DOWNPB10注意DS18B20的数据线上拉电阻一定要接。单总线协议在没有主机驱动总线时总线处于高阻状态必须靠上拉电阻把电平拉到高否则通信直接失败Proteus里就表现为温度始终读成85度或者干脆不响应。上拉电阻值选4.7k这是DS18B20手册的标准要求。LCD供电和MCU供电都用5VDS18B20用3.3V供电STM32的GPIO输出高电平是3.3VDS18B20刚好兼容3.3V逻辑。这里有个小坑如果你的LCD1602用的是5V供电而STM32是3.3V逻辑Proteus仿真通常没问题但做实物时最好确认LCD模块的IO能否兼容3.3V逻辑输入不行的话要加电平转换或串接限流电阻。3. 程序框架与核心代码控温逻辑和时序是关键程序是整套系统的灵魂。很多人的做法是把代码全写在main函数里从上到下顺序跑结果按键、显示、温度采集互相干扰最后哪个功能都不稳定。这里我建议在工程一开始就按模块拆分代码文件每个模块只干一件事后面调试效率完全不一样。推荐工程结构Project/ ├── System/ 系统初始化时钟配置NVIC配置 ├── Bsp/ 底层驱动LED、按键、蜂鸣器、LCD、DS18B20 ├── App/ 应用逻辑控温策略、状态机 ├── Core/ main.c、中断服务函数 └── 工程输出/ hex文件3.1 主程序状态机设计主循环不要是简单的一句“while(1)里面轮流跑函数”那样程序会一直卡在某些阻塞延时上。比较好的做法是把系统拆成几个状态——正常运行态、参数设定态、报警态不同状态下执行不同的逻辑。我用一个简化的状态机来描述typedef enum { STATE_RUN, // 正常运行采集温度、显示、控制加热 STATE_SETTING, // 参数设定调整目标温度 STATE_ALARM // 超温报警蜂鸣器响关闭加热 } SysState; SysState currentState STATE_RUN; int main(void) { SystemInit(); // 时钟初始化 Key_Init(); // 按键GPIO配置 LCD_Init(); // LCD1602初始化 DS18B20_Init(); // DS18B20初始化 Timer_Init(); // 定时器初始化用于系统心跳 Relay_Init(); // 继电器控制引脚初始化 while (1) { // 按键扫描和状态切换 Key_Scan(); switch (currentState) { case STATE_RUN: if (tempOverAlarm) currentState STATE_ALARM; else runControlLoop(); break; case STATE_SETTING: runSettingLoop(); break; case STATE_ALARM: runAlarmLoop(); break; default: break; } delay_ms(100); // 主循环节拍100ms不需要太频繁 } }状态机的核心价值是让系统在任何时刻都知道自己“该干什么”。参数设定模式下继电器强制关断不能让用户一边调温度一边疯狂加热这是安全逻辑层面的第一道保障。报警模式下无论之前是什么状态只要温度越过安全阈值立刻关闭加热并拉响蜂鸣器不含糊。3.2 DS18B20单总线驱动的时序细节DS18B20用单总线协议读和写都在这根数据线上完成时序要求比较严格。整个驱动函数根据初始化、写时序、读时序三个部分组成。初始化每次温度转换前都要做一次主机拉低总线480到960微秒然后释放总线DS18B20会拉低总线60到240微秒作为应答主机检测到这个低电平信号就认为传感器在线。写逻辑0和写逻辑1的区别在于低电平持续时间的差异写0要先拉低60到120微秒然后释放写1只需要拉低1到15微秒就释放。延时太短或者太长都会导致数据错乱这也是在Proteus仿真中最常遇到问题的点。这里的延时函数如果你用STM32标准库直接用Delay循环就行但要注意在优化等级不同的情况下循环次数和实际微秒数的对应关系会变仿真里最好用示波器观察波形确认时序。温度转换指令和温度读取指令是分开的。每次读取温度要先发0xCC跳过ROM匹配因为整个总线上只挂了一个传感器再发0x44启动温度转换然后等待转换完成。DS18B20默认是12位分辨率转换时间最长需要750毫秒所以不能在发完转换指令后立刻就读温度那样只能读到上一次转换的结果或者垃圾数据。转换完成后同样先发0xCC再发0xBE读暂存器读取两个字节一个是温度低字节一个是温度高字节拼起来再做符号判断和分辨率换算。float DS18B20_ReadTemp(void) { uint8_t tempL 0, tempH 0; int16_t rawValue 0; float temperature 0.0f; DS18B20_Reset(); // 复位并检测在线 DS18B20_WriteByte(0xCC); // 跳过ROM匹配 DS18B20_WriteByte(0x44); // 启动温度转换 delay_ms(750); // 等待转换完成 DS18B20_Reset(); // 再次复位 DS18B20_WriteByte(0xCC); // 跳过ROM匹配 DS18B20_WriteByte(0xBE); // 读取暂存器 tempL DS18B20_ReadByte(); tempH DS18B20_ReadByte(); rawValue (tempH 8) | tempL; // 判断正负温度 if (rawValue 0x8000) { rawValue -(uint16_t)(~rawValue 1); } // 12位分辨率LSB对应0.0625摄氏度 temperature rawValue * 0.0625f; return temperature; }这段代码我建议直接作为标准模板使用唯一要注意的是温度是正还是负的判断。热水器场景水温永远是正数但做人机交互显示时负数温度显示要加“-”号所以这段判断逻辑建议还是保留后续扩展其他项目时也方便。3.3 控温策略滞回控制解决继电器频繁通断你可能会想控温不就是“低于设定值开加热高于设定值关加热”吗如果真这么写系统会在设定温度附近高频切换。假设设定45度水温从44.9度升到45.1度继电器就要断开温度稍微降一点到44.9度又要闭合。继电器每小时动作几百次用不了几天触点就烧蚀了而且温度过冲严重。正确的做法是滞回控制也叫施密特触发式控制。设定一个目标温度T_set再设定一个滞回区间delta。当水温低于T_set - delta时开加热当水温高于T_set delta时关加热。中间区域维持当前状态。比如设置目标温度45度delta取2那实际就是水温低于43度开启加热到达47度停止加热。水温在43到47度之间时维持上次状态这样继电器一天动作次数可能就十几次非常合理。#define TEMP_SET_DEFAULT 45.0f // 默认目标温度 #define TEMP_HYSTERESIS 2.0f // 滞回区间 float targetTemp TEMP_SET_DEFAULT; uint8_t heaterState 0; // 0表示关闭1表示开启 void Control_Update(float currentTemp) { if (heaterState 0) { // 当前是关闭状态只有温度低于下限时才开启 if (currentTemp (targetTemp - TEMP_HYSTERESIS)) { heaterState 1; Relay_On(); } } else { // 当前是开启状态只有温度高于上限时才关闭 if (currentTemp (targetTemp TEMP_HYSTERESIS)) { heaterState 0; Relay_Off(); } } }滞回区间delta的选取直接影响控温效果。delta太小起不到防抖作用delta太大水温波动范围大用户体验差。热水器场景建议2到3度Proteus里可以用虚拟示波器观察继电器开关频率和温度曲线这是我调试时确定参数的主要依据。如果你之后想把系统升级到更高档位可以把滞回控制改成PID控制加PWM调功。从控制原理上说滞回控制本质是一种非线性控制系统状态只在两个离散值切换PID则是连续调节加热功率通过比例、积分、微分三个环节让温度平滑逼近目标值精度能到正负0.5度以内代价是参数整定是个细致活。仿真学习阶段把滞回控制吃透是理解更复杂算法的基础。3.4 LCD1602显示驱动从初始化到动态刷新LCD1602的驱动其实是这个项目里最模式化的部分网上例程一大把关键是要理解他是怎么运作的。LCD1602内部有一个HD44780控制器主机通过RS、RW、EN三根控制线和D0-D7八根数据线或只用D4-D7四根线和它通信。四线模式是更优选择因为少用四个GPIO代码量只多一点点逻辑上是一次发送一个字节的高低四位分两次写。初始化时有一个时序问题容易踩坑LCD上电后要等40毫秒以上再发初始化指令否则LCD可能处于内部复位未完成的状态指令不响应。标准初始化流程是发送0x33进入8位模式检测再发送0x32切换到4位模式然后设置显示模式、清屏、开显示每一步之间都要做小延时。void LCD_Init(void) { delay_ms(50); // 等待LCD内部上电复位完成 LCD_WriteCmd(0x33); // 8位模式初始化指令 LCD_WriteCmd(0x32); // 切换到4位模式 LCD_WriteCmd(0x28); // 设置4位模式、2行显示、5x7字型 LCD_WriteCmd(0x0C); // 显示开光标关闪烁关 LCD_WriteCmd(0x06); // 写入后地址自动加1 LCD_WriteCmd(0x01); // 清屏 delay_ms(2); }显示刷新策略我建议不要“整屏清掉重写”。LCD1602内部有DDRAM地址可以精确控制光标停在第一行某个位置去写字符。刷新时先判断温度是否发生变化如果没变就用两张屏上缓存比较变了才更新对应位置的字符。这样显示不闪烁也能减轻MCU负担。如果不做比较而是每100毫秒全屏重写一次LCD会明显看到字符在闪给人感觉系统很不稳定。显示内容通常是两行第一行显示Temp: xx.x C第二行显示Set: xx.x C。整数和小数部分的格式化可以使用C标准库的sprintf但要注意在STM32标准库中不勾选MicroLib时sprintf会占用很多Flash。如果是做课程设计库够用无所谓如果想节省资源可以自己写一个整数转字符串函数把温度值的整数部分和小数部分分别转换后显示。3.5 按键驱动防抖与生效边界三个按键如果直接用GPIO电平判断按下瞬间会有抖动可能一次按键被识别成三次。最简单的防抖方式是软件延时20毫秒等到电平稳定后再读取一次确认还是按下才认为是一次有效按键。更好的做法是在定时器中断里每5毫秒扫描一次按键连续两次读到相同状态才改变输出的按键事件这是经典的状态机消抖但代码量会大一些。参数设定模式下每按一次加键或减键目标温度按0.5度步进调整。我给按键生效范围做了限定目标温度不能低于30度不能高于75度超过边界就不响应。这个范围是基于热水器场景的实际需求也避免了用户误操作把目标温度设成99度之类的异常值。边界处理这一点在报告里是加分项体现你考虑过工程实用性。4. Proteus仿真调试从点亮第一行字到稳定控温踩过的坑都在这Proteus仿真和实物调试最大的区别是你不需要焊接、不需要万用表但你必须接受“仿真模型和真实器件存在细微差异”这件事。我在调试过程中总结了几个关键步骤和坑按调试顺序说。4.1 电路搭建与程序烧录的前置检查Proteus里新建工程后选好STM32F103C8T6、DS18B20、LM016L、继电器、按键、蜂鸣器、电阻等元件按2.5小节的引脚分配表连线。线连完后先做一次“电气规则检查”Proteus会自动提示有没有悬空引脚、有没有不该连在一起的网络。这里的常见问题是STM32的VDDA、VSSA、VBAT等引脚没有被正确连接。在Proteus模型中这些引脚如果保持默认状态可能会引起启动异常最稳妥的做法是按数据手册把VDDA接3.3VVSSA接地VBAT接3.3V。程序编译生成hex文件后双击STM32芯片在Program File一栏选择hex文件路径然后把Crystal Frequency设置成8MHz如果代码里用的是外部晶振或保持默认值如果用的是内部RC时钟。这里有个容易混淆的地方——STM32F103C8T6的默认时钟源是内部8MHz RC经过PLL倍频后系统跑在72MHz。在Proteus仿真里如果程序里做了时钟初始化SystemInit把时钟配到72MHz那么仿真速度会大幅下降因为Proteus是解释执行指令的。建议在仿真时把系统时钟配置成8MHz或者直接用内部HSI的默认配置功能和时序完全不受影响但仿真速度提升明显。4.2 坑一DS18B20温度读出来始终是85度DS18B20在单总线通信失败的情况下读出来的温度值很容易是85度因为寄存器上电默认值就是0x0550对应85摄氏度。我一开始就撞上了这个问题排查了大概一小时最后锁定原因是数据线上没有接上拉电阻。具体表现温度显示稳定在85.00度怎么变化都不动。查DS18B20的Proteus模型原理单总线空闲状态下总线是高电平主机和传感器都是开漏输出谁拉低总线谁才能传输数据。如果没上拉电阻总线电平浮空读写时序全是乱的。解决方式DQ引脚到3.3V之间接一个4.7k电阻。如果仿真里还是没有反应检查一下电阻是不是接错了网络以及DS18B20的供电脚是不是接到3.3V而不是5V。DS18B20的工作电压范围是3.0V到5.5V两种供电都能工作但信号高电平不同对STM32的GPIO配置也有影响——GPIO输入模式下3.3V供电的DS18B20输出高电平约3.3VSTM32识别为高电平没问题5V供电时高电平接近5V虽然STM32的IO引脚一般容忍5V输入但为了保险起见还是建议3.3V供电。4.3 坑二LCD1602只有背光亮没有字符Proteus里的LM016L模型如果显示不出字符优先检查三件事。第一LCD的第三脚V0对比度调节脚必须接一个电位器调节到合适的电压。一般是在V0和地之间接一个10k电位器滑动端接V0调节电位器使对比度合适。如果你直接把V0接地很多模型里字符会显示不出来因为对比度太高或太低。第二确认RS、RW、EN三个控制脚的连接顺序和程序里一致。Proteus模型对引脚的命名和实际LCD1602模块是一致的但接线时很容易把RS和EN接反。第三四线模式下D0-D3不需要连接D4-D7要按顺序接好。如果你用了四线模式但程序里定义的数据引脚和连线不一致显示出来就是乱码或汉字缺笔画。4.4 坑三继电器在Proteus里不动作继电器模型需要电流驱动。STM32的GPIO输出能力在仿真模型里有限直接接继电器线圈电流不够继电器没有反应。标准的接法是GPIO输出接到NPN三极管的基极三极管集电极接继电器线圈一端线圈另一端接5V发射极接地线圈两端反向并联一个1N4007二极管。Proteus里继电器模型一般叫“RELAY”或“RELAY-SPST”选一个常开触点的就行。校准三极管型号时用2N2222或BC547都可以基极串一个1k限流电阻。如果Proteus仿真里继电器还是不动用示波器看三极管基极波形确认GPIO是不是真的输出了高电平。这个坑出现的根源是软件的GPIO驱动能力模型和实物不同用三极管放大是标准做法实物电路里也要这么接。4.5 系统联调温度变化过程怎么验证Proteus仿真里没法像实物一样用电吹风对着温度传感器吹热风但可以通过修改DS18B20模型属性来模拟温度变化。双击DS18B20元件在属性中找到Current Value或Temperature属性可以动态调整当前温度值。这个功能在联调阶段非常重要你把温度值从26度调到50度观察LCD显示是否更新、继电器是否按预期动作。更直观的做法是右键单击DS18B20选择“属性”在温度输入栏里填入一个值用鼠标点击电位器类似的元件上下调节。调试时我建议按这样的顺序走先只跑LCD程序确认显示正常再跑DS18B20程序确认温度读取正常。把两者合并确认第一行显示当前温度、第二行显示设定温度刷新不闪烁。加入按键程序确认设定温度可以加减且边界值被限制。最后加滞回控制观察温度设定和目标温度的关系确认继电器通断时机正确。人为把DS18B20温度调到异常高值比如80度以上确认超温报警和继电器关断。把每一步的测试结果记录下来这部分是报告里最有力的实验数据。我一般会在每一轮测试后截一次图把显示效果和操作过程都保留下来写报告时直接引用。5. 报告、答辩与讲解视频工程做完了怎么把成果高效呈现出来很多同学代码跑通了烧录完就以为结束了结果在报告和答辩环节丢了分。这个项目之所以是“仿真程序报告讲解视频”的完整组合是因为它模拟了一个真实工程交付的完整链路方案论证、实施、测试、文档、演示一个都不能少。5.1 报告写作的结构与重点报告不要平铺直叙要能回答“为什么这么设计”这个核心问题。推荐结构如下第一章项目背景与设计目标。写清楚恒温热水器系统要解决什么问题对比非恒温和恒温方案的差异列出设计指标测温范围、精度、控温区间、显示方式。第二章方案论证。重点写主控选型对比STM32F103C8T6 vs 51内核芯片 vs Arduino、温度采集方案对比DS18B20 vs NTC、加热执行方案对比继电器 vs 可控硅。每段都要有明确的选型结论和理由。第三章硬件设计。给出系统框图、引脚分配表、Proteus仿真电路截图并对每个模块做简要说明。建议把原理图导出成图片不要只用文字描述。第四章软件设计。给出主程序流程图、状态机图、关键模块的代码片段结合代码解释DS18B20时序和滞回控制策略。流程图可以用Visio或draw.io画Proteus的调试器也可以截图。第五章仿真测试与分析。列出测试表格把每个模块的测试条件、测试结果、现象描述写清楚附上LCD显示截图。第六章总结与展望。总结项目完成的功能和不足说明如果扩展成实物还需要考虑哪些问题比如交流电驱动、绝缘防水、按键耐用性等。报告里最忌讳的是把代码全贴进去。代码占三五十页老师看烦了分数反而低。正确做法是贴关键代码片段最多十行二十行配文字解释就行。完整的代码和工程文件可以在附录里说明存放位置。5.2 答辩环节的高频问题清单答辩老师一般会问这几个方向的问题你提前准备好现场就不慌你用的DS18B20精度是多少为什么选择12位分辨率答案是精度正负0.5摄氏度12位分辨率对应0.0625摄氏度热水器场景足够实际精度还受探头封装和安装位置影响。滞回控制的原理是什么为什么不用简单阈值比较把3.3节的内容讲一遍强调继电器保护和水温惯性问题。如果温度传感器损坏系统会怎么表现这个问题值得提前想清楚。DS18B20如果应答超时读出来的温度是上次的值控制逻辑可能继续工作或失稳。作为安全设计程序里应加入传感器故障检测如果连续多次读温度都没有应答蜂鸣器报警并关闭加热。这个细节论文里不见得写好但答辩必加分。你的设定温度范围为什么是30到75度结合热水器使用场景回答太低没意义太高可能烫伤人而且系统能耗也不合理。5.3 讲解视频怎么做才有完成度讲解视频是这个项目包装的一个关键环节。不需要多高端的剪辑但结构要清楚。我的建议是录5到8分钟分三段第一段整体演示。打开Proteus点击运行展示LCD显示和继电器动作。这一段的目的是让观众一眼看出系统功能。第二段原理与操作。对着仿真电路讲一遍系统框架边说边改DS18B20的温度值让观众看到温度变化带动继电器开关的过程。操作动作要慢鼠标点击的地方要有停顿用画图工具在关键区域圈个红框解说词要讲清楚“现在我把温度值调到多少系统检测到低于设定值于是继电器闭合加热”。第三段程序与调试。打开Keil工程快速过一遍工程结构展示main.c和DS18B20驱动讲一下滞回控制的关键代码。录屏时建议先把代码字号调大不要录代码滚动过程。录讲解视频最容易犯的毛病是一镜到底、边说边想、口头禅太多。我之前录这类视频的习惯是先写个简短脚本每段要说的核心句子写出来然后对着脚本念念错了就重录那一段最后用剪映拼起来。不需要专业录音设备安静环境下用手机或电脑麦克风就行。写在最后的体会做完这个项目我最深的感触是恒温控制的难点不在代码而在对物理过程的认知。水温的变化不是立竿见影的加热有惯性传感器有延迟执行器有机械寿命这些因素必须浇灌到控制策略里而不是简单套一个“if-else判断”就完事。这个道理放在很多工程场景都通用控制算法参透的是系统的动态特性不是堆代码。你在Proteus里把滞回控制调明白了以后接触PID控制、模糊控制、模型预测控制思路才会顺。仿真是手段不是目的。如果之后有机会把系统的继电器换成固态继电器把滞回控制升级成PID限幅输出再把DS18B20的探头安装位置从仿真电路挪到一个真实的水箱里你会发现同一套代码在实物上还有一大堆细节要处理——比如探头防水、水箱保温层、加热器功率匹配、温度梯度分布。把这些都考虑进去才算真正从课设走向了工程。就说到这有做出来的朋友欢迎交流你在仿真里踩到的坑尤其是不常见的奇怪现象。那种“沉闷半天找不到原因最后发现是一根上拉电阻没接”的瞬间才是做嵌入式最上头的时候。
返回列表