51单片机+中国移动OneNet云平台——物联网项目设计

51单片机+中国移动OneNet云平台——物联网项目设计 把时髦的技术挂在嘴上不如把过时的技术记在心里本篇创建记录2026-07-10本篇更新记录2025-08-27欢迎关注点赞收藏留言【实验图片】【实验视频】目录一、设计要求二、设计方案三、硬件电路设计四、软件程序设计五、图片展示六、设计要点七、资料链接八、关于作者九、后记一、设计要求以51类单片机STC12C5A60S2为主控芯片设计一款可监测环境数据的监测系统同时将数据上传到互联网用户可通过手机、电脑、平板实现远程数据查看、控制主要功能如下1可监测环境湿度、环境温度、可燃气体浓度、水温共4种传感器数据。22.可实现加湿器、风扇、厨房灯、卧室灯共4种开关的本地控制和远程控制远程控制主要基于手机、电脑、平板。33.设备端通过LCD19264液晶屏显示数据和状态客户端通过手机、电脑、平板等设备屏幕显示数据和状态。4发生以下情形之一系统会自动向邮箱发送邮件①设备登录或离线时②可燃气体浓度超过报警值时③其他设置条件可随意增加条件。5远程控制界面具有以下功能①可清晰展示设备信息设备状态、设备名称、数据刷新状态等、传感器数据环境湿度、环境温度、可燃气体浓度、水温共4种、设备状态值加湿器、风扇、厨房灯、卧室灯共4种。②可实现状态设备加湿器、风扇、厨房灯、卧室灯共4种的远程控制手动调节开关状态后显示执行结果已执行、正在执行、执行失败。③具备传感器历史数据存档功能。可记录每种传感器数据环境湿度、环境温度、可燃气体浓度、水温共4种的最近的1000次数据值。④显示作者信息。二、设计方案根据设计要求整个系统方案框图如果所示。它主要由电源管理模块、单片机最小系统、LCD19264显示模块、独立按键模块、可燃气体浓度监测模块、环境温度和环境湿度监测模块、水温监测模块、加湿器控制模块、风扇控制模块、厨房灯控制、卧室灯控制、蜂鸣器控制、ESP8266模块。三、硬件电路设计本系统以51类单片机STC12C5A60S2为主控芯片通过MQ2气体传感器连接ADC0832获取可燃气体浓度通过DS18B20防水型数字温度传感器获取当前水温通过DHT11数字温湿度获取环境湿度和环境温度设备端通过LCD19264实时显示通过4个独立按键可以分别设置打开或关闭加湿器、风扇、厨房灯、卧室灯通过ESP8266连接WIFI将数据上传至中国移动OneNet云平台。1主控芯片本设计主要采用51类单片机作为主控芯片型号为STC12C5A60S2是宏 晶科技全称宏晶微电子科技股份有限公司研制的国产51单片机。本系统中晶振采用11.0592MHZ原因是需要用到串口 通信2可燃气体浓度监测模块MQ2气体传感器是一款基于‌二氧化锡半导体气敏材料‌的气体检测装置主要用于检测‌液化气、丙烷、甲烷、酒精、氢气及烟雾‌等多种可燃气体和有害气体广泛应用于家庭安防、工业环境监测及火灾预警系统 。采用MQ2气体浓度传感器经 ADC0832进行模数转换然同通过计算得到当前空气中可燃气体浓度的百分比。3水温监测模块采用防水型DS18B20数字温度传感器获取当前水温。DS18B20是一款数字型温度传感器其输出的是数字信号具有体积小硬件开销低抗干扰能力强精度高的特点。4环境湿度和环境温度监测模块DHT11是广州奥松有限公司生产的一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机数据采用校验和方式进行校验有效的保证数据传输的准确性。 DHT11 功耗很低 5V 电源电压下工作平均最大电流 0.5mA。性能指标 和特性如下●工作电压范围 3.5V-5.5V●工作电流 平均 0.5mA●湿度测量范围2090RH●温度测量范围050℃●湿度分辨率 1RH 8 位●温度分辨率 1℃ 8 位●采样周期 1S●单总线结构●与 TTL 兼容5V5液晶显示模块液晶显示电路选用LCD19264使用深圳金逸晨电子有限公式的产品。6加湿器控制模块加湿器控制模块采用加湿器专用芯片控制可检测当前水位、以防止干烧。7风扇控制电路采用单片机IO端口连接NPN三极管控制继电器开关以达到打开、关闭风扇的目的。7厨房灯、卧室灯控制通过IO口模拟实际应用中可通过继电器控制8按键模块4个独立按键件可以本地控制计时器、风扇、厨房灯、卧室灯的打开或者关闭。9WIFI模块ESP-01SESP8266模块ESP-01S可以连接WIFI网络将数据上传到互联网本实验中具体是上传至中国移动OneNet云平台注意该模块为3.3V供电与5V单片机的串口相连时不要直接连接。另为了在实验之初对单片机程序、ESP-01S分别调试增加了P5和P6另个接口待单片机程序、ESP-01S模块分别调试成功后用短路帽将P5和P6分别连接起来就可以完成整个作品。10电源管理模块本系统中STC12C5A60S2单片机为5V供电ESP8266模块ESP-01S为3.3V供电因此需要电平转换如下图所示四、软件程序设计1主函数​ //主函数 void main(void) { Systme_Init();//系统初始化 if(ERROR ESP8266_OneNet_Init())//ESP8266及OneNet云平台相关初始化设置 { Alarm_Open(); while(1); } LCD192x64_Display_Hz16_String(7,1,T: OK: R: ); while(1) { Display();//LCD192X64液晶屏显示 KeyScan();//按键扫描 ParseAndExecuteMQTTCommand();//检查OneNet是否下发了指令如果有指令则执行相应操作无指令则跳过 if(Timer0_1S_flag) { Timer0_1S_flag 0; if(Tx_Number 99999) Tx_Number0;//单片机向OneNet云平台发送信息的次数累加 // 发送传感器数据内部会在发送前清空缓冲区 if(SUCCESS MQTT_PublishSensorData()) Tx_SensorData_Ok 1; else Tx_SensorData_Ok 0; //检查OneNet是否下发了指令如果有指令则执行相应操作无指令则跳过 /*因为OneNet下发执行的时间是随机的所以这里增加一层判断因为云平台下发指令、云平台回复单片机上传数据可能同时发生 这里增加一次判断提升操作成功率,否则可能出现云平台下发指令后单片机端因清空了串口接收缓冲区全部内容就无法执行云平台命令*/ ParseAndExecuteMQTTCommand(); // 发送状态数据内部同样会清空缓冲区但此时缓冲区中若有指令会在清空前被上面的检查处理掉 if(SUCCESS MQTT_PublishStatusData()) Tx_Status_Ok 1; else Tx_Status_Ok 0; if((Tx_SensorData_Ok 1) (Tx_Status_Ok 1)) { if(Tx_Number_OK 99999) Tx_Number_OK0; } } } } ​2主程序流程图五、图片展示12D-底层22D-顶层33D-裸板正面43D-裸板背面53D-裸板侧面63D-正面73D-背面83D-侧面9实验图片六、设计要点【1】注意匹配ESP8266模块与单片机的波特率。ESP8266模块ESP-01S模块默认的波特率是115200bpsSTC12C5A60S2设置的波特率为9600bps程序中设计只有匹配一致才能确保他们之间可以正常通信因此需要将ESP-01S的波特率修改为9600可参考安信可官网点击进入资料网页ESP8266的版本号为1471号对应的AT指令集设置波特率有两种办法方法一方法二这里作者采用方法二设置一次之后默认的波特率会保存到flash中即使设备断电重新上电波特率也能按照上次设置的参数运行作者设置模块的默认波特率为9600bps。【2】注意5V单片机与3.3V的ESP8266模块之间的串口连接通信 连接方式。可参考《ESP-01S规格书》中内容【3】注意加湿器防的干烧功能。只有将监测水位的检测线放入水中才能保障正常工作这是由加湿器专用芯片功能所决定的。【4】建议采用独立电源供电。建议采度独立电源作者采用了5V1A适配器。七、资料链接1.作品演示视频视频链接--------点击播放2.硬件电路讲解视频视频链接--------点击播放3.软件程序讲解视频视频链接--------点击播放4.系列视频如何一步步做出本作品当哔哩哔哩本作品播放量达到1000次以上制作这部分视频八、关于作者微创电子工作室刺客阿瑞13630279531九、后记【1】强烈建议使用单片机的“第二串口”协助调试写在这里已经有些晚了建议大家在设计之初就要考虑此方法接下来分两步来说明第一步先说为什么需要借助单片机“第二串口”协助调试。第二步再说如何使用单片机“第二串口”协助调试。第一步先说为什么需要借助单片机“第二串口”协助调试单片机串口调试是常用的调试方法它的优点是可通过打印信息记录程序执行的步骤“告诉”程序开发者程序走到了哪一步进入了哪一个分支可以展示出程序执行的过程。串口打印记录信息的优点是是其他调试方法无法比拟的例如液晶屏虽然也可以显示出信息但可以想象以下几种情形①液晶屏持续显示某一项数据数据刷新显示了10万次但是其中存在80次异常数据是数据本身异常而不是显示异常液晶屏刷新显示速度太快可能程序开发者还没有“反应过来”或者没有观察到这种异常显示的异常数据又被下一次正常的数据覆盖显示了很难通过“肉眼观察”捕捉到异常最终的产品稳定性可能就有问题。②某一个作品中液晶只能显示主要的几个信息如果在测试过程中需要增加显示某一些数据可能要修改整个显示部分的程序框架结构尤其是需要临时性显示很多数据时就需要对程序做较大的修改。而串口协助调试就没有这方面的苦恼串口可以展现出整个程序运行的过程只需要在需要显示数据的地方新增一行代码就可以。好了以上简要解析是针对所有产品开发都适用的现在结合作者的本次作品设计再说说为什么需要用单片机“第二串口”。本质上就只是一句话串口缓冲区的内容可能是几种信息的的组合可能比较复杂借助串口调试在合适的时候打印出整个缓冲区的内容可以帮助程序开发者快速完成接收信息的解析执行对应的操作。STC12C5A60S2单片机有两个串口第一串口就是P3.0和P3.1端口需要预留用于单片机与ESP8266的通信不建议再用此串口打印信息否则容易扰乱与ESP8266的通信例如程序开发者只想串口打印显示某一项数据在电脑端显示出来最终ESP8266也收到了这个信息ESP8266就会把信息发给OneNet云平台云平台又返回一些信息通常是提示错误错误信息被装载到了串口接收缓冲区中对应程序中的Receive_Buffer[300],有可能会产生异常注意只是有可能至于可能性的大小要看程序开发者的程序框架、思路。因此只能另辟蹊径自然就会想到“第二串口”STC12C5A60S2单片机正好有第二串口。现在说说“第二串口”需要打印什么内容来协助调试呢这部分内容比较重要主要是打印第一是单片机运行到哪一步、进入了哪一个分支这里不做说明大家应该都明白。第二是串口缓冲区Receive_Buffer[300]的内容因为缓冲区的内容包含下面的1和21单片机向OneNet云平台发送传感器数据值或状态值数据后云平台“回复”单片机的信息。【具体逻辑是】单片机通过串口通信将传感器数据环境湿度、环境温度、可燃气体浓度、水温共4种传感器数据或者状态值数据风扇、加湿器、厨房灯、卧室灯共4种开关状态发送给ESP8266模块作者的程序设计中将传感器数据和状态值数据发送是分开的这么做的原因是ESP8266模块通信信息长度是有限制的具体是每条 AT 命令的总长度不能超过 256 字节 ESP8266模块再将数据推送给中国移动OneNet云平台然后云平台向ESP8266模块“回复”信息告诉ESP8266模块你发送的信息成功了或者失败了。ESP8266又通过串口通信把云平台发送的信息发送给单片机ESP8266只是桥梁作用。例如单片机成功发送传感器数据至OneNet云平台后云平台会向单片机“回复”如下信息OKMQTTSUBRECV:0,$sys/C4kz6Gkz89/device/thing/property/post/reply,39,{id:123,code:200,msg:success}【说明】作者在程序中规定发送传感器数据的信息ID是123所以当云平台接收到单片机的信息后云平台会“回复”单片机你的编号为ID为123的信息已经成功发送到了云平台了。例如单片机成功发送状态值数据至OneNet云平台后云平台会向单片机“回复”如下信息:OKMQTTSUBRECV:0,$sys/C4kz6Gkz89/device/thing/property/post/reply,39,{id:456,code:200,msg:success}【说明】作者在程序中规定发送状态值数据的信息ID是456所以当云平台接收到单片机的信息后云平台会“回复”单片机你的编号为ID为456的信息已经成功发送到了云平台了。2OneNet云平台向单片机下发的指令信息。【具体逻辑是】用户通过操作界面控制打开或者关闭加湿器、风扇、厨房灯、卧室灯操作界面调用中国移动OneNet云平台操作接口向设备端ESP8266模块下发指令 ESP8266模块又将下发的指令通过串口通信发送给单片机ESP8266只是桥梁作用此时单片机需要对下发的指令进行解析执行对应的操作最重要的是还要“回复”云平台你刚才发送的编号为xxx的信息我已经收到了当然数据的解析和执行相应操作都是“后话”这部分我们主要研究下发指令信息。例如用户操作打开风扇时OneNet云平台会向单片机发送如下信息MQTTSUBRECV:0,$sys/C4kz6Gkz89/device/thing/property/set,49,{id:33,version:1.0,params:{Fan:true}}【说明】这是云平台向单片机段发送信息信息ID是33这个ID值不是一成不变的如果云平台下次继续给单片机发送信息下一次的信息ID就变成了34当单片机接收到此条信息后需要“回复”云平台告诉云平台你的ID编号为33的信息“我”单片机已经收到了当然这属于数据解析是后话了。例如用户同时操作打开风扇、厨房灯、卧室灯时操作界面法无法完成同时打开它们的操作作者是通过云平台的“应用模拟器”完成此操作的OneNet云平台会向单片机发送如下信息MQTTSUBRECV:0,$sys/C4kz6Gkz89/device/thing/property/set,83,{id:17,version:1.0,params:{Fan:true,Led_Bed:true,Led_Kitchen:true}}【说明】这是云平台向单片机段发送信息信息ID是17这个ID值不是一成不变的如果云平台下次继续给单片机发送信息下一次的信息ID就变成了18当单片机接收到此条信息后需要“回复”云平台告诉云平台你的ID编号为17的信息“我”单片机已经收到了当然这属于数据解析是后话了。综上所述串口缓冲区中Receive_Buffer[300]可能存在的数据包含1和2两部分但是因为用户操作的时间是随机的、不确定的因为你不知道用户什么时候会发送指令这里的不确定是站在缓冲区角度来看的。当然对于某一特定时刻用户操作是确定的、此刻缓冲区内的内容也是确定的所以缓冲区内容一般就是1和2的数据组合从整个过程来说缓冲区内容可能是1也可能是2也可能是1和2的组合而且组合还根据顺序不同内容解析方式也不同具体可能是OKMQTTSUBRECV:0,$sys/C4kz6Gkz89/device/thing/property/post/reply,39,{id:456,code:200,msg:success}MQTTSUBRECV:0,$sys/C4kz6Gkz89/device/thing/property/set,49,{id:11,version:1.0,params:{Fan:true}}【说明】这里第一句和第二句是一起的单片机向云平台发送状态值数据后云平台给单片机的“回复”意思是你发送信息已经成功到了云平台了。这里的第三句是云平台向单片机主动发送信息告诉单片机现在需要你打开风扇。也可能是OKMQTTSUBRECV:0,$sys/C4kz6Gkz89/device/thing/property/set,50,{id:12,version:1.0,params:{Fan:false}}MQTTSUBRECV:0,$sys/C4kz6Gkz89/device/thing/property/post/reply,39,{id:123,code:200,msg:success}【说明】这里的第一句和第三句是一起的单片机星云平台发送传感器数据后云平台给单片机的“回复”意思是你发送信息已经成功到了云平台了。这里的第二句是云平台主动向单片机发送信息告诉单片机现在需要你关闭风扇。本来这里第一句、第三句是一起输出的只是恰巧执行完第一句后用户点击了关闭风扇按钮所以先输出了用户的命令才又继续执行输出这里的第三句也可能是MQTTSUBRECV:0,$sys/C4kz6Gkz89/device/thing/property/set,54,{id:14,version:1.0,params:{Led_Bed:false}}OKMQTTSUBRECV:0,$sys/C4kz6Gkz89/device/thing/property/post/reply,39,{id:123,code:200,msg:success}【说明】这里的第一句是云平台主动向单片机发送信息告诉单片机现在需要你关闭卧室灯。这里的第二句、第三句是一起的单片机性云平台成功发送传感器数据后云平台给单片机的“回复”意思是你发送信息已经成功到了云平台了。当然串口缓冲区内容也可能只是单一的信息1或者信息2这里就不再举例了。所以利用串口打印出信息有利于分析不同情况尤其对后续“单片机解析云平台发送来的指令信息”非常有帮助。第二步再说如何使用单片机“第二串口”协助调试。STC12C5A60S2单片机的的“第二串口“位于P1.2接收端和P1.3发送端我们主要关心发送端当然也可以通过软件设置将其映射到引脚P4.2和P4.3端口作者使用的是DIP40封装单片机通过STC12C5A60S2手册可知DIP40封装的STC12C5A60S2没有P4.2和P4.3只有贴片封装的才有这两个引脚具体参考下图但是细心的朋友发现作者已经将P1.3引脚作为了DHT11的数据端口如图所示所以为了测试作者只能先暂时取消了DHT11焊接了排针并且同时在程序中屏蔽了DHT11驱动程序暂时赋值一个固定的温度、湿度数据待我需要的测试、解析都成功后再焊接DHT11、屏蔽第二串口程序、恢复DHT11驱动程序。以上的过程实际上是一个“倒推”的过程是作者在实践中遇到问题需要用串口协助分析、解决问题找到第二串口、暂时取下DHT11调试作者又不想重新制作电路板所以权宜之计。在这里强烈建议大家如果遇到第一串口已经用了要有先见之明把第二串口预留出来不要连接其他器件或者巧妙回避一下。正因为有了“第二串口”的协助作者的程序才能很快成功并且成功率挺高作者测试了93208次发送、485次接收均为成功下图为证关于如何编写代码操作STC12C5A60S2单片机的“第二串口”请参考官网手册这里不再赘述。【2】注意硬件方面一定要牢固连接传感器模块。作者设计的作品中可燃气浓度、环境温度、环境湿度环境温度和环境湿度是通过DHT11实现的2个传感器3个传感器数据在硬件上都是焊接到电路板的所以硬件方面一定是牢固的但是防水型DS18B20是通过插头连接的如下图如果未连接DS18B20或者插头接触不良则会导致数据上传失败 OneNet云平台会向单片机端发送如下信息