找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 498|回复: 0
收起左侧

基于STM32F103ZET6单片机的阿里云方案 源程序

[复制链接]
ID:1095937 发表于 2023-12-20 13:11 | 显示全部楼层 |阅读模式
方案实现温湿度阈值报警,器件STM32F103ZET6、低电平出发继电器、低电平有源蜂鸣器、ESP8266-01S、0.96OLED四针
注意ESP8266-01S需要有支持AT命令的固件版本,如不是请在网上搜索如何刷固件。

单片机源程序如下:
  1. #include "stm32f10x.h"  //包含需要的头文件
  2. #include "timer2.h"     //包含需要的头文件
  3. #include "main.h"
  4. #include "delay.h"      //包含需要的头文件
  5. #include "usart1.h"     //包含需要的头文件
  6. #include "usart2.h"     //包含需要的头文件
  7. #include "timer1.h"     //包含需要的头文件
  8. #include "timer3.h"     //包含需要的头文件
  9. #include "timer4.h"     //包含需要的头文件
  10. #include "wifi.h"            //包含需要的头文件
  11. #include "mqtt.h"       //包含需要的头文件
  12. #include "dht11.h"
  13. #include "timer5.h"     //包含需要的头文件
  14. #include "math.h"
  15. #include "led.h"
  16. #include "OLED.h"
  17. #include "beep.h"

  18. u8 humiH,humiL,tempH,tempL;
  19. u8 tempature,humidity;

  20. void oeld_show(void)
  21. {
  22.         //第一行显示温湿度
  23.         OLED_ShowCHinese(1,5,0);
  24.         OLED_ShowCHinese(1,7,1);
  25.         OLED_ShowCHinese(1,9,2);
  26.         
  27.         //第二行显示温度
  28.         
  29.         OLED_ShowCHinese(2,1,0);
  30.         OLED_ShowCHinese(2,3,2);
  31.         OLED_ShowCHinese(2,5,3);
  32.         OLED_ShowNum(2,7,tempH,1);
  33.         OLED_ShowNum(2,8,tempL,1);
  34.         
  35.         
  36.                 //第三行显示温度
  37.         
  38.         OLED_ShowCHinese(3,1,1);
  39.         OLED_ShowCHinese(3,3,2);
  40.         OLED_ShowCHinese(3,5,3);
  41.         OLED_ShowNum(3,7,humiH,1);
  42.         OLED_ShowNum(3,8,humiL,1);
  43. }

  44. int main(void)
  45. {                 
  46.         
  47.         usart1_init(115200);              //串口1功能初始化,波特率9600
  48.         u1_printf("CONNECT报文成功\r\n");
  49.         Usart2_Init(115200);            //串口2功能初始化,波特率115200        



  50.         tim4_init(500,7200);            //TIM4初始化,定时时间 500*7200*1000/72000000 = 50ms
  51.         delay_init();                   //延时功能初始化
  52.         wifi_reset_io_init();            //初始化WiFi的复位IO
  53.         AliIoT_Parameter_Init();            //初始化连接阿里云IoT平台MQTT服务器的参数        
  54.         DHT11_Init();
  55.         LED_Init();
  56.         OLED_Init();
  57.         BEEP_Init();
  58.         
  59.         while(1)                        //主循环
  60.         {

  61.                 oeld_show();
  62.                
  63. /**
  64.           * @brief   阈值控制,包括温度和湿度
  65.           * @param  温度阈值到了,继电器的绿灯亮   temapture
  66.                    * @param 湿度阈值到了,蜂鸣器叫          humidity
  67.                
  68.           * @retval
  69.           */               
  70.                 tempature=tempH*10+tempL;  //温度
  71.                 humidity=humiH*10+humiL;    //湿度
  72.                 if(tempature>20||tempature<-1)    //温度阈值
  73.                 {
  74.                         GPIO_ResetBits(GPIOC,GPIO_Pin_12);
  75.                 }
  76.                 else
  77.                 {
  78.                         GPIO_SetBits(GPIOC,GPIO_Pin_12);
  79.                 }
  80.                
  81.                         if(humidity>30|| humidity<5)    //湿度阈值
  82.                 {
  83.                         GPIO_ResetBits(GPIOC,GPIO_Pin_11);
  84.                         delay_ms(500);
  85.                         GPIO_SetBits(GPIOC,GPIO_Pin_11);
  86.                         delay_ms(500);
  87.                         GPIO_ResetBits(GPIOC,GPIO_Pin_11);
  88.                         delay_ms(500);
  89.                         GPIO_SetBits(GPIOC,GPIO_Pin_11);
  90.                 }
  91.                 else
  92.                 {
  93.                         GPIO_SetBits(GPIOC,GPIO_Pin_11);
  94.                 }

  95.                
  96.                
  97.                 /*--------------------------------------------------------------------*/
  98.                 /*   Connect_flag=1同服务器建立了连接,我们可以发布数据和接收推送了    */
  99.                 /*--------------------------------------------------------------------*/
  100.                 if(Connect_flag==1){   

  101.                                 
  102.                                                         
  103.                         /*-------------------------------------------------------------*/
  104.                         /*                     处理发送缓冲区数据                      */
  105.                         /*-------------------------------------------------------------*/
  106.                                 if(MQTT_TxDataOutPtr != MQTT_TxDataInPtr){                //if成立的话,说明发送缓冲区有数据了
  107.                                 //3种情况可进入if
  108.                                 //第1种:0x10 连接报文
  109.                                 //第2种:0x82 订阅报文,且ConnectPack_flag置位,表示连接报文成功
  110.                                 //第3种:SubcribePack_flag置位,说明连接和订阅均成功,其他报文可发
  111.                                 if((MQTT_TxDataOutPtr[2]==0x10)||((MQTT_TxDataOutPtr[2]==0x82)&&(ConnectPack_flag==1))||(SubcribePack_flag==1)){   
  112.                                         u1_printf("发送数据:0x%x\r\n",MQTT_TxDataOutPtr[2]);  //串口提示信息
  113.                                         MQTT_TxData(MQTT_TxDataOutPtr);                       //发送数据
  114.                                         MQTT_TxDataOutPtr += TBUFF_UNIT;                      //指针下移
  115.                                         if(MQTT_TxDataOutPtr==MQTT_TxDataEndPtr)              //如果指针到缓冲区尾部了
  116.                                                 MQTT_TxDataOutPtr = MQTT_TxDataBuf[0];            //指针归位到缓冲区开头
  117.                                 }                                 
  118.                         }//处理发送缓冲区数据的else if分支结尾
  119.                         
  120.                         /*-------------------------------------------------------------*/
  121.                         /*                     处理接收缓冲区数据                      */
  122.                         /*-------------------------------------------------------------*/
  123.                         if(MQTT_RxDataOutPtr != MQTT_RxDataInPtr){  //if成立的话,说明接收缓冲区有数据了                                                                                                               
  124.                                 u1_printf("接收到数据:");
  125.                                 /*-----------------------------------------------------*/
  126.                                 /*                    处理CONNACK报文                  */
  127.                                 /*-----------------------------------------------------*/                                
  128.                                 //if判断,如果第一个字节是0x20,表示收到的是CONNACK报文
  129.                                 //接着我们要判断第4个字节,看看CONNECT报文是否成功
  130.                                 if(MQTT_RxDataOutPtr[2]==0x20){                                    
  131.                                     switch(MQTT_RxDataOutPtr[5]){                                       
  132.                                                 case 0x00 : u1_printf("CONNECT报文成功\r\n");                            //串口输出信息        
  133.                                                                     ConnectPack_flag = 1;                                        //CONNECT报文成功,订阅报文可发
  134.                                                                         break;                                                       //跳出分支case 0x00                                             
  135.                                                 case 0x01 : u1_printf("连接已拒绝,不支持的协议版本,准备重启\r\n");     //串口输出信息
  136.                                                                         Connect_flag = 0;                                            //Connect_flag置零,重启连接
  137.                                                                         break;                                                       //跳出分支case 0x01   
  138.                                                 case 0x02 : u1_printf("连接已拒绝,不合格的客户端标识符,准备重启\r\n"); //串口输出信息
  139.                                                                         Connect_flag = 0;                                            //Connect_flag置零,重启连接
  140.                                                                         break;                                                       //跳出分支case 0x02
  141.                                                 case 0x03 : u1_printf("连接已拒绝,服务端不可用,准备重启\r\n");         //串口输出信息
  142.                                                                         Connect_flag = 0;                                            //Connect_flag置零,重启连接
  143.                                                                         break;                                                       //跳出分支case 0x03
  144.                                                 case 0x04 : u1_printf("连接已拒绝,无效的用户名或密码,准备重启\r\n");   //串口输出信息
  145.                                                                         Connect_flag = 0;                                            //Connect_flag置零,重启连接                                                
  146.                                                                         break;                                                       //跳出分支case 0x04
  147.                                                 case 0x05 : u1_printf("连接已拒绝,未授权,准备重启\r\n");               //串口输出信息
  148.                                                                         Connect_flag = 0;                                            //Connect_flag置零,重启连接                                                
  149.                                                                         break;                                                       //跳出分支case 0x05                 
  150.                                                 default   : u1_printf("连接已拒绝,未知状态,准备重启\r\n");             //串口输出信息
  151.                                                                         Connect_flag = 0;                                            //Connect_flag置零,重启连接                                       
  152.                                                                         break;                                                       //跳出分支case default                                                                 
  153.                                         }                                
  154.                                 }                        
  155.                                 //if判断,第一个字节是0x90,表示收到的是SUBACK报文
  156.                                 //接着我们要判断订阅回复,看看是不是成功
  157.                                 else if(MQTT_RxDataOutPtr[2]==0x90){
  158.                                                 switch(MQTT_RxDataOutPtr[6]){                                       
  159.                                                 case 0x00 :
  160.                                                 case 0x01 : u1_printf("订阅成功\r\n");            //串口输出信息
  161.                                                                 SubcribePack_flag = 1;                //SubcribePack_flag置1,表示订阅报文成功,其他报文可发送
  162.                                                                         Ping_flag = 0;                        //Ping_flag清零
  163.                                                                                         TIM3_ENABLE_30S();                    //启动30s的PING定时器
  164.                                                                 set_temp_humid();        //启动数据传输        
  165.                                                                                 TIM2_ENABLE_6S();         //判断开关状态,并发布给服务器  定时器
  166.                                                                         break;                                //跳出分支                                             
  167.                                                 default   : u1_printf("订阅失败,准备重启\r\n");  //串口输出信息
  168.                                                                         Connect_flag = 0;                     //Connect_flag置零,重启连接
  169.                                                                         break;                                //跳出分支                                                                 
  170.                                         }                                       
  171.                                 }
  172.                                 //if判断,第一个字节是0xD0,表示收到的是PINGRESP报文
  173.                                 else if(MQTT_RxDataOutPtr[2]==0xD0){
  174.                                         u1_printf("PING报文回复\r\n");                   //串口输出信息
  175.                                         if(Ping_flag==1){                     //如果Ping_flag=1,表示第一次发送
  176.                                                  Ping_flag = 0;                                      //要清除Ping_flag标志
  177.                                         }else if(Ping_flag>1){                                   //如果Ping_flag>1,表示是多次发送了,而且是2s间隔的快速发送
  178.                                                 Ping_flag = 0;                                       //要清除Ping_flag标志
  179.                                                 TIM3_ENABLE_30S();                                   //PING定时器重回30s的时间
  180.                                                 
  181.                                         }                                
  182.                                 }        
  183.                                 //if判断,如果第一个字节是0x30,表示收到的是服务器发来的推送数据
  184.                                 //我们要提取控制命令
  185.                                 else if((MQTT_RxDataOutPtr[2]==0x30)){
  186.                                         u1_printf("服务器等级0推送\r\n");                    //串口输出信息
  187.                                         MQTT_DealPushdata_Qs0(MQTT_RxDataOutPtr);  //处理等级0推送数据
  188.                                 }                                
  189.                                                                   
  190.                                 MQTT_RxDataOutPtr +=RBUFF_UNIT;                     //指针下移
  191.                                 if(MQTT_RxDataOutPtr==MQTT_RxDataEndPtr)            //如果指针到缓冲区尾部了
  192.                                         MQTT_RxDataOutPtr = MQTT_RxDataBuf[0];          //指针归位到缓冲区开头                        
  193.                         }//处理接收缓冲区数据的else if分支结尾
  194.                         
  195.                         /*-------------------------------------------------------------*/
  196.                         /*                     处理命令缓冲区数据                      */
  197.                         /*-------------------------------------------------------------*/
  198.                         if(MQTT_CMDOutPtr != MQTT_CMDInPtr){                             //if成立的话,说明命令缓冲区有数据了                              
  199.                                 u1_printf("命令:%s\r\n",&MQTT_CMDOutPtr[2]);                 //串口输出信息
  200.                                 if(strstr((char *)MQTT_CMDOutPtr+2,"\"params\":{\"LED\":1}")){      //云平台下发命令控制LED关
  201.         LED_OFF;

  202.         }else if(strstr((char *)MQTT_CMDOutPtr+2,"\"params\":{\"LED\":0}")){          //云平台下发命令控制LED开
  203.         LED_ON;
  204.                                 }
  205.                                 MQTT_CMDOutPtr += CBUFF_UNIT;                                      //指针下移
  206.                                 if(MQTT_CMDOutPtr==MQTT_CMDEndPtr)                                //如果指针到缓冲区尾部了
  207.                                         MQTT_CMDOutPtr = MQTT_CMDBuf[0];                               //指针归位到缓冲区开头                                
  208.                         }//处理命令缓冲区数据的else if分支结尾        
  209.                 }//Connect_flag=1的if分支的结尾
  210.                
  211.                 /*--------------------------------------------------------------------*/
  212.                 /*      Connect_flag=0同服务器断开了连接,我们要重启连接服务器         */
  213.                 /*--------------------------------------------------------------------*/
  214.                 else{
  215.                         u1_printf("需要连接服务器\r\n");                 //串口输出信息
  216.                         TIM_Cmd(TIM4,DISABLE);                           //关闭TIM4
  217.                         TIM_Cmd(TIM3,DISABLE);                         //关闭TIM3
  218.                
  219.                         WiFi_RxCounter=0;                                //WiFi接收数据量变量清零                        
  220.                         memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);          //清空WiFi接收缓冲区
  221.                         if(WiFi_Connect_IoTServer()==0){                                //如果WiFi连接云服务器函数返回0,表示正确,进入if
  222.                                 u1_printf("建立TCP连接成功\r\n");            //串口输出信息
  223.                                 Connect_flag = 1;                            //Connect_flag置1,表示连接成功        
  224.                                 WiFi_RxCounter=0;                            //WiFi接收数据量变量清零                        
  225.                                 memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);      //清空WiFi接收缓冲区
  226.                                 MQTT_Buff_Init();                            //初始化发送缓冲区                    
  227.                         }                                
  228.                 }
  229.                
  230.         
  231.         }
  232. }


  233. void set_temp_humid(void)
  234. {
  235.         
  236.         char temp[256];  
  237.         DHT11_Read_Data(&humiH,&humiL,&tempH,&tempL);
  238.         sprintf(temp,"{\"method\":\"thing.event.property.post\",\"id\":\"12345678\",\"params\":{\"temp\":%d,\"humi\":%d},\"version\":\"1.0.0\"}",(tempH*10+tempL),(humiH*10+humiL));  //构建回复温湿度数据
  239.         MQTT_PublishQs0(P_TOPIC_NAME,temp,strlen(temp));   //添加数据,发布给服务器        
  240.         //delay_ms(100);
  241. }


复制代码
原理图: 无
仿真: 无
代码: 程序.7z (250.98 KB, 下载次数: 20)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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