找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2085|回复: 0
打印 上一主题 下一主题
收起左侧

基于STM32的物联网温湿度远程测量装置源程序

[复制链接]
跳转到指定楼层
楼主
ID:818516 发表于 2021-5-1 17:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
所需材料:STM32F103C8T6核心板、ESP8266-01S模块、DHT11模块(别的单片机和wifi模组同样适用)。ESP8266通过MQTT协议将温湿度数据传输至OnenNet云平台。用的单片机采用的C8T6,当然如果你是别的f1系列的单片机代码直接复制过去就能用。wifi模块用的是最入门的ESP8266,当然如果你用别的ESP8266都是可以的,AT指令和接线方式基本都是一样的。传感器采集模块用的是DHT11,因为这个小模块可以输出温度和湿度信息,非常适合极客开发。

ESP8266-01S(5根线)
PA2——>RX        PA3——>TX        PA4——>复位        3V3——>VCC        GND——>GND        DHT11(3根线)      PA6——>DATA      3V3——>VCC      GND——>GNDLED(核心板上一般都有一个led)     PC13——>LED1

大致思路:在 stm32f10x_it.c文件中编写中断处理函数。usart1用来与上位机通信打印一些调试信息。usart2用来与ESP8266通信,并且接收中断处理上位机发送来的数据。timer2的中断用来发送温湿度数据,10S发送一次温湿度数据。timer3的中断用来发送心跳包(ping,用于保持和服务器连接,长时间没给服务器发送数据会被踢下线),2s和30s两种模式。timer4将串口2接收到的服务器数据依次存放在MQTT接收缓存数组中,50ms处理一次。control用来控制LED灯,并且发送LED灯开关信号。

单片机源程序如下:
  1. /*-----------------------------------------------------*/
  2. /*                                                     */
  3. /*            程序main函数,入口函数源文件              */
  4. /*                                                     */
  5. /*-----------------------------------------------------*/

  6. #include "stm32f10x.h"   //包含需要的头文件
  7. #include "control.h"     //包含需要的头文件
  8. #include "delay.h"       //包含需要的头文件
  9. #include "usart1.h"      //包含需要的头文件
  10. #include "usart2.h"      //包含需要的头文件
  11. #include "timer2.h"      //包含需要的头文件
  12. #include "timer3.h"      //包含需要的头文件
  13. #include "timer4.h"      //包含需要的头文件
  14. #include "wifi.h"             //包含需要的头文件
  15. #include "led.h"             //包含需要的头文件 LED                                                  
  16. #include "mqtt.h"        //包含需要的头文件
  17. #include "dht11.h"       //包含需要的头文件 空气温湿度


  18. char *cmdLED_On = "LEDON";      //LED打开
  19. char *cmdLED_Off = "LEDOFF";    //LED关闭

  20. char *cmdDHT11_On = "DHTON";    //温湿度数据传输打开
  21. char *cmdDHT11_Off = "DHTOFF";  //温湿度数据传输关闭

  22. char *ledFlag = "LEDOFF";       //LED状态
  23. int   dhtFlag = 0;                        //温湿度数据传输状态

  24. int main(void)
  25. {       
  26.         delay_init();          //延时功能初始化              
  27.         Usart1_Init(9600);     //串口1功能初始化,波特率9600
  28.         Usart2_Init(115200);   //串口2功能初始化,波特率115200       
  29.         TIM4_Init(500,7200);   //TIM4初始化,定时时间 500*7200*1000/72000000 = 50ms
  30.         LED_Init();                           //LED初始化
  31.         DHT11_Init();          //初始化DHT11       
  32.        
  33.         WiFi_ResetIO_Init();   //初始化WiFi的复位IO
  34.         IoT_Parameter_Init();  //初始化云IoT平台MQTT服务器的参数       

  35.         while(1)
  36.         {               
  37.                 // connectFlag=1同服务器建立了连接
  38.                 if(connectFlag == 1)
  39.                 {     
  40.                         /*-------------------------------------------------------------*/
  41.                         /*                     处理发送缓冲区数据                                                 */
  42.                         /*-------------------------------------------------------------*/
  43.                         if(MQTT_TxDataOutPtr != MQTT_TxDataInPtr) //if成立的话,说明发送缓冲区有数据了
  44.                         {               
  45.                                 //3种情况可进入if
  46.                                 //第1种:0x10 连接报文
  47.                                 //第2种:0x82 订阅报文,且connectPackFlag置位,表示连接报文成功
  48.                                 //第3种:subcribePackFlag置位,说明连接和订阅均成功,其他报文可发
  49.                                 if((MQTT_TxDataOutPtr[2] == 0x10)||((MQTT_TxDataOutPtr[2] == 0x82)&&(connectPackFlag == 1))||(subcribePackFlag == 1))
  50.                                 {   
  51.                                         if (MQTT_TxDataOutPtr[2] == 0x30)
  52.                                         {       
  53.                                                 u1_printf("发送数据:0x%x,单片机数据推送至服务器\r\n", MQTT_TxDataOutPtr[2]);       
  54.                                                 u1_printf("\r\n");
  55.                                         }
  56.                                         else
  57.                                         {
  58.                                                 u1_printf("发送数据:0x%x\r\n", MQTT_TxDataOutPtr[2]);//串口提示信息
  59.                                         }
  60.                                        
  61.                                         MQTT_TxData(MQTT_TxDataOutPtr);                                                        //发送数据
  62.                                         MQTT_TxDataOutPtr += TBUFF_UNIT;                                                //指针下移
  63.                                         if(MQTT_TxDataOutPtr == MQTT_TxDataEndPtr)                                //如果指针到缓冲区尾部了
  64.                                         {
  65.                                                 MQTT_TxDataOutPtr = MQTT_TxDataBuf[0];                                //指针归位到缓冲区开头
  66.                                         }       
  67.                                 }                                
  68.                         }
  69.                         /*-------------------------------------------------------------*/
  70.                         /*                     处理接收缓冲区数据                      */
  71.                         /*-------------------------------------------------------------*/
  72.                         if(MQTT_RxDataOutPtr != MQTT_RxDataInPtr) //if成立的话,说明接收缓冲区有数据了       
  73.                         {                                                                                               
  74.                                 u1_printf("接收到数据:");
  75.                                 /*-----------------------------------------------------*/
  76.                                 /*                    处理CONNACK报文                  */
  77.                                 /*-----------------------------------------------------*/                               
  78.                                 //if判断,如果第一个字节是0x20,表示收到的是CONNACK报文
  79.                                 //接着我们要判断第4个字节,看看CONNECT报文是否成功
  80.                                 if(MQTT_RxDataOutPtr[2] == 0x20)
  81.                                 {                                    
  82.                                         switch(MQTT_RxDataOutPtr[5])
  83.                                         {                                          
  84.                                                 case 0x00 : u1_printf("CONNECT报文成功\r\n");                                                        //串口输出信息       
  85.                                                                                 connectPackFlag = 1;                                                                        //CONNECT报文成功,订阅报文可发
  86.                                                                         break;                                                                                                                //跳出分支case 0x00                                             
  87.                                                 case 0x01 : u1_printf("连接已拒绝,不支持的协议版本,准备重启\r\n");    //串口输出信息
  88.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重启连接
  89.                                                                         break;                                                                                                                //跳出分支case 0x01   
  90.                                                 case 0x02 : u1_printf("连接已拒绝,不合格的客户端标识符,准备重启\r\n");//串口输出信息
  91.                                                                         connectFlag = 0;                                            //connectFlag置零,重启连接
  92.                                                                         break;                                                                                                                 //跳出分支case 0x02
  93.                                                 case 0x03 : u1_printf("连接已拒绝,服务端不可用,准备重启\r\n");            //串口输出信息
  94.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重启连接
  95.                                                                         break;                                                                                                                //跳出分支case 0x03
  96.                                                 case 0x04 : u1_printf("连接已拒绝,无效的用户名或密码,准备重启\r\n");        //串口输出信息
  97.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重启连接                                               
  98.                                                                         break;                                                                                                                //跳出分支case 0x04
  99.                                                 case 0x05 : u1_printf("连接已拒绝,未授权,准备重启\r\n");                                //串口输出信息
  100.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重启连接                                               
  101.                                                                         break;                                                                                                                //跳出分支case 0x05                
  102.                                                 default   : u1_printf("连接已拒绝,未知状态,准备重启\r\n");                    //串口输出信息
  103.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重启连接                                       
  104.                                                                         break;                                                                                                                //跳出分支case default                                                                
  105.                                         }                               
  106.                             }                       
  107.                                 //if判断,第一个字节是0x90,表示收到的是SUBACK报文
  108.                                 //接着我们要判断订阅回复,看看是不是成功
  109.                                 else if(MQTT_RxDataOutPtr[2] == 0x90)
  110.                                 {
  111.                                         switch(MQTT_RxDataOutPtr[6])
  112.                                         {                                       
  113.                                                 case 0x00 :
  114.                                                 case 0x01 :
  115.                                                                         u1_printf("订阅成功\r\n");                        //串口输出信息
  116.                                                                         subcribePackFlag = 1;                                //subcribePackFlag置1,表示订阅报文成功,其他报文可发送
  117.                                                                         pingFlag = 0;                                                //pingFlag清零
  118.                                                                         TIM3_ENABLE_30S();                                        //启动30s的PING定时器       
  119.                                                                         Send_Data();
  120.                                                                         TIM2_ENABLE_10S();
  121.                                                                         break;                                                                //跳出分支                                             
  122.                                                 default:
  123.                                                                         u1_printf("订阅失败,准备重启\r\n");//串口输出信息
  124.                                                                         connectFlag = 0;                                        //connectFlag置零,重启连接
  125.                                                                         break;                                                                //跳出分支                                                                
  126.                                                 }                                       
  127.                             }
  128.                                 //if判断,第一个字节是0xD0,表示收到的是PINGRESP报文
  129.                                 else if(MQTT_RxDataOutPtr[2] == 0xD0)
  130.                                 {
  131.                                         u1_printf("PING报文回复\r\n");                      //串口输出信息
  132.                                         if(pingFlag == 1)
  133.                                         {                                                                           //如果pingFlag=1,表示第一次发送
  134.                                                  pingFlag = 0;                                                                   //要清除pingFlag标志
  135.                                         }
  136.                                         else if(pingFlag > 1)       
  137.                                         {                                                                                                          //如果pingFlag>1,表示是多次发送了,而且是2s间隔的快速发送
  138.                                                 pingFlag = 0;                                                                   //要清除pingFlag标志
  139.                                                 TIM3_ENABLE_30S();                                                               //PING定时器重回30s的时间
  140.                                         }                               
  141.                                 }       
  142.                                 //if判断,如果第一个字节是0x30,表示收到的是服务器发来的推送数据
  143.                                 //我们要提取控制命令
  144.                                 else if((MQTT_RxDataOutPtr[2] == 0x30))
  145.                             {
  146.                                         u1_printf("服务器等级0推送\r\n");                            //串口输出信息
  147.                                         MQTT_DealPushdata_Qs0(MQTT_RxDataOutPtr);   //处理等级0推送数据
  148.                                 }                                                                       
  149.                                 MQTT_RxDataOutPtr += RBUFF_UNIT;                //指针下移
  150.                                 if(MQTT_RxDataOutPtr == MQTT_RxDataEndPtr)      //如果指针到缓冲区尾部了
  151.                                 {
  152.                                         MQTT_RxDataOutPtr = MQTT_RxDataBuf[0];      //指针归位到缓冲区开头              
  153.                                 }                          
  154.                         }//处理接收缓冲区数据的else if分支结尾
  155.                                                
  156.                         /*---------------------------------------------------------------------------------------------------------------------*/
  157.                         /*                                                                             处理命令缓冲区数据                                                                              */
  158.                         /*---------------------------------------------------------------------------------------------------------------------*/
  159.                         if(MQTT_CMDOutPtr != MQTT_CMDInPtr)                                                          //if成立的话,说明命令缓冲区有数据了       
  160.                         {                                                    
  161.                                 u1_printf("命令:%s\r\n",&MQTT_CMDOutPtr[2]);              //串口输出信息
  162.                                
  163.                                 if(!memcmp(&MQTT_CMDOutPtr[2],cmdLED_On,strlen(cmdLED_On)))//判断指令,如果是CMD1
  164.                                 {                                            
  165.                                         ledFlag = "LEDON";                                                                               
  166.                                         LED_On();                                                                                             //LED开启
  167.                                 }
  168.                                 else if(!memcmp(&MQTT_CMDOutPtr[2],cmdLED_Off,strlen(cmdLED_Off))) //判断指令,如果是CMD11
  169.                                 {
  170.                                         ledFlag = "LEDOFF";                                             
  171.                                         LED_Off();                                                                                 //LED关闭
  172.                                 }
  173.                                 else if(!memcmp(&MQTT_CMDOutPtr[2],cmdDHT11_On,strlen(cmdDHT11_On)))//判断指令,如果是CMD3
  174.                                 {      
  175.                                         dhtFlag = 1;                 //dataFlag置1,表示处于采集状态了
  176.                                         TIM2_ENABLE_10S();           //定时器2,,10s间隔采集温湿度   
  177.                                 }
  178.                                 else if(!memcmp(&MQTT_CMDOutPtr[2],cmdDHT11_Off,strlen(cmdDHT11_Off)))//判断指令,如果是CMD3
  179.                                 {     
  180.                                         dhtFlag = 0;                 //dataFlag置0,表示处于停止状态了
  181.                                         TIM_Cmd(TIM2,DISABLE);                 //判断2路开关状态和采集状态,并发布给服务器
  182.                                 }                                                               
  183.                                 //不做处理,后面会发送状态
  184.                                 else u1_printf("未知指令\r\n");                                //串口输出信息       
  185.                        
  186.                                 MQTT_CMDOutPtr += CBUFF_UNIT;                                //指针下移
  187.                                 if(MQTT_CMDOutPtr == MQTT_CMDEndPtr)            //如果指针到缓冲区尾部了
  188.                                 MQTT_CMDOutPtr = MQTT_CMDBuf[0];                        //指针归位到缓冲区开头       
  189.                                
  190.                                 Send_Data();//发送控制数据
  191.                                 //处理命令缓冲区数据的else if分支结尾                                       
  192.                         }        //connectFlag=1的if分支的结尾
  193.                 }
  194.         /*--------------------------------------------------------------------*/
  195.         /*      connectFlag=0同服务器断开了连接,我们要重启连接服务器            */
  196.         /*--------------------------------------------------------------------*/
  197.                 else
  198.                 {
  199.                         u1_printf("需要连接服务器\r\n");               //串口输出信息
  200.                         TIM_Cmd(TIM4, DISABLE);                        //关闭TIM4
  201.                         TIM_Cmd(TIM3, DISABLE);                        //关闭TIM3  
  202.                         WiFi_RxCounter = 0;                            //WiFi接收数据量变量清零                        
  203.                         memset(WiFi_RX_BUF, 0, WiFi_RXBUFF_SIZE);      //清空WiFi接收缓冲区
  204.                         if(WiFi_Connect_IoTServer() == 0)                           //如果WiFi连接云服务器函数返回0,表示正确,进入if
  205.                         {                                
  206.                                 u1_printf("建立TCP连接成功\r\n");          //串口输出信息
  207.                                 connectFlag = 1;                           //connectFlag置1,表示连接成功       
  208.                                 WiFi_RxCounter = 0;                        //WiFi接收数据量变量清零                        
  209.                                 memset(WiFi_RX_BUF, 0, WiFi_RXBUFF_SIZE);  //清空WiFi接收缓冲区
  210.                                 MQTT_Buff_Init();                          //初始化发送缓冲区                    
  211.                         }                               
  212.                 }
  213.         }
  214. }
复制代码

所有资料51hei提供下载:
OneNet-esp8266.7z (185.32 KB, 下载次数: 55)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表