久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1764|回復: 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, 下載次數: 28)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线 | 欧美日韩在线电影 | 精品国产免费一区二区三区五区 | 国产亚洲欧美日韩精品一区二区三区 | 中文字幕一区在线观看视频 | 蜜桃视频成人 | 日本在线观看网址 | 精品久久久久久亚洲精品 | 日韩a视频 | 国产一区二区三区在线免费观看 | 国产精品1区 | 日韩aⅴ视频 | 久久在线 | 亚洲综合天堂 | 91精品久久久久久久 | 欧美日韩精品一区二区三区蜜桃 | 色综合久久久 | 欧美一区二区激情三区 | 国产999精品久久久久久 | 久一久 | 久久久久久久久一区 | 二区三区视频 | 亚洲一区二区黄 | 亚洲三区在线观看 | 欧美专区在线 | 四虎影院新网址 | 久久国产美女视频 | 国产剧情一区二区三区 | 日韩www| 日韩一区精品 | 一二三区av | 不卡视频一区二区三区 | 狠狠色香婷婷久久亚洲精品 | 成人在线免费电影 | 亚洲精品久久久久久久久久吃药 | 精品国产高清一区二区三区 | 国产高清一二三区 | 国产97色 | 亚洲欧洲成人av每日更新 | 欧美中文字幕一区 | 欧美日韩中文字幕在线 |