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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2660|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于STM32的物聯(lián)網(wǎng)溫濕度遠(yuǎn)程測(cè)量裝置源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:818516 發(fā)表于 2021-5-1 17:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
所需材料:STM32F103C8T6核心板、ESP8266-01S模塊、DHT11模塊(別的單片機(jī)和wifi模組同樣適用)。ESP8266通過(guò)MQTT協(xié)議將溫濕度數(shù)據(jù)傳輸至OnenNet云平臺(tái)。用的單片機(jī)采用的C8T6,當(dāng)然如果你是別的f1系列的單片機(jī)代碼直接復(fù)制過(guò)去就能用。wifi模塊用的是最入門(mén)的ESP8266,當(dāng)然如果你用別的ESP8266都是可以的,AT指令和接線方式基本都是一樣的。傳感器采集模塊用的是DHT11,因?yàn)檫@個(gè)小模塊可以輸出溫度和濕度信息,非常適合極客開(kāi)發(fā)。

ESP8266-01S(5根線)
PA2——>RX        PA3——>TX        PA4——>復(fù)位        3V3——>VCC        GND——>GND        DHT11(3根線)      PA6——>DATA      3V3——>VCC      GND——>GNDLED(核心板上一般都有一個(gè)led)     PC13——>LED1

大致思路:在 stm32f10x_it.c文件中編寫(xiě)中斷處理函數(shù)。usart1用來(lái)與上位機(jī)通信打印一些調(diào)試信息。usart2用來(lái)與ESP8266通信,并且接收中斷處理上位機(jī)發(fā)送來(lái)的數(shù)據(jù)。timer2的中斷用來(lái)發(fā)送溫濕度數(shù)據(jù),10S發(fā)送一次溫濕度數(shù)據(jù)。timer3的中斷用來(lái)發(fā)送心跳包(ping,用于保持和服務(wù)器連接,長(zhǎng)時(shí)間沒(méi)給服務(wù)器發(fā)送數(shù)據(jù)會(huì)被踢下線),2s和30s兩種模式。timer4將串口2接收到的服務(wù)器數(shù)據(jù)依次存放在MQTT接收緩存數(shù)組中,50ms處理一次。control用來(lái)控制LED燈,并且發(fā)送LED燈開(kāi)關(guān)信號(hào)。

單片機(jī)源程序如下:
  1. /*-----------------------------------------------------*/
  2. /*                                                     */
  3. /*            程序main函數(shù),入口函數(shù)源文件              */
  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打開(kāi)
  19. char *cmdLED_Off = "LEDOFF";    //LED關(guān)閉

  20. char *cmdDHT11_On = "DHTON";    //溫濕度數(shù)據(jù)傳輸打開(kāi)
  21. char *cmdDHT11_Off = "DHTOFF";  //溫濕度數(shù)據(jù)傳輸關(guān)閉

  22. char *ledFlag = "LEDOFF";       //LED狀態(tài)
  23. int   dhtFlag = 0;                        //溫濕度數(shù)據(jù)傳輸狀態(tài)

  24. int main(void)
  25. {       
  26.         delay_init();          //延時(shí)功能初始化              
  27.         Usart1_Init(9600);     //串口1功能初始化,波特率9600
  28.         Usart2_Init(115200);   //串口2功能初始化,波特率115200       
  29.         TIM4_Init(500,7200);   //TIM4初始化,定時(shí)時(shí)間 500*7200*1000/72000000 = 50ms
  30.         LED_Init();                           //LED初始化
  31.         DHT11_Init();          //初始化DHT11       
  32.        
  33.         WiFi_ResetIO_Init();   //初始化WiFi的復(fù)位IO
  34.         IoT_Parameter_Init();  //初始化云IoT平臺(tái)MQTT服務(wù)器的參數(shù)       

  35.         while(1)
  36.         {               
  37.                 // connectFlag=1同服務(wù)器建立了連接
  38.                 if(connectFlag == 1)
  39.                 {     
  40.                         /*-------------------------------------------------------------*/
  41.                         /*                     處理發(fā)送緩沖區(qū)數(shù)據(jù)                                                 */
  42.                         /*-------------------------------------------------------------*/
  43.                         if(MQTT_TxDataOutPtr != MQTT_TxDataInPtr) //if成立的話,說(shuō)明發(fā)送緩沖區(qū)有數(shù)據(jù)了
  44.                         {               
  45.                                 //3種情況可進(jìn)入if
  46.                                 //第1種:0x10 連接報(bào)文
  47.                                 //第2種:0x82 訂閱報(bào)文,且connectPackFlag置位,表示連接報(bào)文成功
  48.                                 //第3種:subcribePackFlag置位,說(shuō)明連接和訂閱均成功,其他報(bào)文可發(fā)
  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("發(fā)送數(shù)據(jù):0x%x,單片機(jī)數(shù)據(jù)推送至服務(wù)器\r\n", MQTT_TxDataOutPtr[2]);       
  54.                                                 u1_printf("\r\n");
  55.                                         }
  56.                                         else
  57.                                         {
  58.                                                 u1_printf("發(fā)送數(shù)據(jù):0x%x\r\n", MQTT_TxDataOutPtr[2]);//串口提示信息
  59.                                         }
  60.                                        
  61.                                         MQTT_TxData(MQTT_TxDataOutPtr);                                                        //發(fā)送數(shù)據(jù)
  62.                                         MQTT_TxDataOutPtr += TBUFF_UNIT;                                                //指針下移
  63.                                         if(MQTT_TxDataOutPtr == MQTT_TxDataEndPtr)                                //如果指針到緩沖區(qū)尾部了
  64.                                         {
  65.                                                 MQTT_TxDataOutPtr = MQTT_TxDataBuf[0];                                //指針歸位到緩沖區(qū)開(kāi)頭
  66.                                         }       
  67.                                 }                                
  68.                         }
  69.                         /*-------------------------------------------------------------*/
  70.                         /*                     處理接收緩沖區(qū)數(shù)據(jù)                      */
  71.                         /*-------------------------------------------------------------*/
  72.                         if(MQTT_RxDataOutPtr != MQTT_RxDataInPtr) //if成立的話,說(shuō)明接收緩沖區(qū)有數(shù)據(jù)了       
  73.                         {                                                                                               
  74.                                 u1_printf("接收到數(shù)據(jù):");
  75.                                 /*-----------------------------------------------------*/
  76.                                 /*                    處理CONNACK報(bào)文                  */
  77.                                 /*-----------------------------------------------------*/                               
  78.                                 //if判斷,如果第一個(gè)字節(jié)是0x20,表示收到的是CONNACK報(bào)文
  79.                                 //接著我們要判斷第4個(gè)字節(jié),看看CONNECT報(bào)文是否成功
  80.                                 if(MQTT_RxDataOutPtr[2] == 0x20)
  81.                                 {                                    
  82.                                         switch(MQTT_RxDataOutPtr[5])
  83.                                         {                                          
  84.                                                 case 0x00 : u1_printf("CONNECT報(bào)文成功\r\n");                                                        //串口輸出信息       
  85.                                                                                 connectPackFlag = 1;                                                                        //CONNECT報(bào)文成功,訂閱報(bào)文可發(fā)
  86.                                                                         break;                                                                                                                //跳出分支case 0x00                                             
  87.                                                 case 0x01 : u1_printf("連接已拒絕,不支持的協(xié)議版本,準(zhǔn)備重啟\r\n");    //串口輸出信息
  88.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重啟連接
  89.                                                                         break;                                                                                                                //跳出分支case 0x01   
  90.                                                 case 0x02 : u1_printf("連接已拒絕,不合格的客戶端標(biāo)識(shí)符,準(zhǔn)備重啟\r\n");//串口輸出信息
  91.                                                                         connectFlag = 0;                                            //connectFlag置零,重啟連接
  92.                                                                         break;                                                                                                                 //跳出分支case 0x02
  93.                                                 case 0x03 : u1_printf("連接已拒絕,服務(wù)端不可用,準(zhǔn)備重啟\r\n");            //串口輸出信息
  94.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重啟連接
  95.                                                                         break;                                                                                                                //跳出分支case 0x03
  96.                                                 case 0x04 : u1_printf("連接已拒絕,無(wú)效的用戶名或密碼,準(zhǔn)備重啟\r\n");        //串口輸出信息
  97.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重啟連接                                               
  98.                                                                         break;                                                                                                                //跳出分支case 0x04
  99.                                                 case 0x05 : u1_printf("連接已拒絕,未授權(quán),準(zhǔn)備重啟\r\n");                                //串口輸出信息
  100.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重啟連接                                               
  101.                                                                         break;                                                                                                                //跳出分支case 0x05                
  102.                                                 default   : u1_printf("連接已拒絕,未知狀態(tài),準(zhǔn)備重啟\r\n");                    //串口輸出信息
  103.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重啟連接                                       
  104.                                                                         break;                                                                                                                //跳出分支case default                                                                
  105.                                         }                               
  106.                             }                       
  107.                                 //if判斷,第一個(gè)字節(jié)是0x90,表示收到的是SUBACK報(bào)文
  108.                                 //接著我們要判斷訂閱回復(fù),看看是不是成功
  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,表示訂閱報(bào)文成功,其他報(bào)文可發(fā)送
  117.                                                                         pingFlag = 0;                                                //pingFlag清零
  118.                                                                         TIM3_ENABLE_30S();                                        //啟動(dòng)30s的PING定時(shí)器       
  119.                                                                         Send_Data();
  120.                                                                         TIM2_ENABLE_10S();
  121.                                                                         break;                                                                //跳出分支                                             
  122.                                                 default:
  123.                                                                         u1_printf("訂閱失敗,準(zhǔn)備重啟\r\n");//串口輸出信息
  124.                                                                         connectFlag = 0;                                        //connectFlag置零,重啟連接
  125.                                                                         break;                                                                //跳出分支                                                                
  126.                                                 }                                       
  127.                             }
  128.                                 //if判斷,第一個(gè)字節(jié)是0xD0,表示收到的是PINGRESP報(bào)文
  129.                                 else if(MQTT_RxDataOutPtr[2] == 0xD0)
  130.                                 {
  131.                                         u1_printf("PING報(bào)文回復(fù)\r\n");                      //串口輸出信息
  132.                                         if(pingFlag == 1)
  133.                                         {                                                                           //如果pingFlag=1,表示第一次發(fā)送
  134.                                                  pingFlag = 0;                                                                   //要清除pingFlag標(biāo)志
  135.                                         }
  136.                                         else if(pingFlag > 1)       
  137.                                         {                                                                                                          //如果pingFlag>1,表示是多次發(fā)送了,而且是2s間隔的快速發(fā)送
  138.                                                 pingFlag = 0;                                                                   //要清除pingFlag標(biāo)志
  139.                                                 TIM3_ENABLE_30S();                                                               //PING定時(shí)器重回30s的時(shí)間
  140.                                         }                               
  141.                                 }       
  142.                                 //if判斷,如果第一個(gè)字節(jié)是0x30,表示收到的是服務(wù)器發(fā)來(lái)的推送數(shù)據(jù)
  143.                                 //我們要提取控制命令
  144.                                 else if((MQTT_RxDataOutPtr[2] == 0x30))
  145.                             {
  146.                                         u1_printf("服務(wù)器等級(jí)0推送\r\n");                            //串口輸出信息
  147.                                         MQTT_DealPushdata_Qs0(MQTT_RxDataOutPtr);   //處理等級(jí)0推送數(shù)據(jù)
  148.                                 }                                                                       
  149.                                 MQTT_RxDataOutPtr += RBUFF_UNIT;                //指針下移
  150.                                 if(MQTT_RxDataOutPtr == MQTT_RxDataEndPtr)      //如果指針到緩沖區(qū)尾部了
  151.                                 {
  152.                                         MQTT_RxDataOutPtr = MQTT_RxDataBuf[0];      //指針歸位到緩沖區(qū)開(kāi)頭              
  153.                                 }                          
  154.                         }//處理接收緩沖區(qū)數(shù)據(jù)的else if分支結(jié)尾
  155.                                                
  156.                         /*---------------------------------------------------------------------------------------------------------------------*/
  157.                         /*                                                                             處理命令緩沖區(qū)數(shù)據(jù)                                                                              */
  158.                         /*---------------------------------------------------------------------------------------------------------------------*/
  159.                         if(MQTT_CMDOutPtr != MQTT_CMDInPtr)                                                          //if成立的話,說(shuō)明命令緩沖區(qū)有數(shù)據(jù)了       
  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開(kāi)啟
  167.                                 }
  168.                                 else if(!memcmp(&MQTT_CMDOutPtr[2],cmdLED_Off,strlen(cmdLED_Off))) //判斷指令,如果是CMD11
  169.                                 {
  170.                                         ledFlag = "LEDOFF";                                             
  171.                                         LED_Off();                                                                                 //LED關(guān)閉
  172.                                 }
  173.                                 else if(!memcmp(&MQTT_CMDOutPtr[2],cmdDHT11_On,strlen(cmdDHT11_On)))//判斷指令,如果是CMD3
  174.                                 {      
  175.                                         dhtFlag = 1;                 //dataFlag置1,表示處于采集狀態(tài)了
  176.                                         TIM2_ENABLE_10S();           //定時(shí)器2,,10s間隔采集溫濕度   
  177.                                 }
  178.                                 else if(!memcmp(&MQTT_CMDOutPtr[2],cmdDHT11_Off,strlen(cmdDHT11_Off)))//判斷指令,如果是CMD3
  179.                                 {     
  180.                                         dhtFlag = 0;                 //dataFlag置0,表示處于停止?fàn)顟B(tài)了
  181.                                         TIM_Cmd(TIM2,DISABLE);                 //判斷2路開(kāi)關(guān)狀態(tài)和采集狀態(tài),并發(fā)布給服務(wù)器
  182.                                 }                                                               
  183.                                 //不做處理,后面會(huì)發(fā)送狀態(tài)
  184.                                 else u1_printf("未知指令\r\n");                                //串口輸出信息       
  185.                        
  186.                                 MQTT_CMDOutPtr += CBUFF_UNIT;                                //指針下移
  187.                                 if(MQTT_CMDOutPtr == MQTT_CMDEndPtr)            //如果指針到緩沖區(qū)尾部了
  188.                                 MQTT_CMDOutPtr = MQTT_CMDBuf[0];                        //指針歸位到緩沖區(qū)開(kāi)頭       
  189.                                
  190.                                 Send_Data();//發(fā)送控制數(shù)據(jù)
  191.                                 //處理命令緩沖區(qū)數(shù)據(jù)的else if分支結(jié)尾                                       
  192.                         }        //connectFlag=1的if分支的結(jié)尾
  193.                 }
  194.         /*--------------------------------------------------------------------*/
  195.         /*      connectFlag=0同服務(wù)器斷開(kāi)了連接,我們要重啟連接服務(wù)器            */
  196.         /*--------------------------------------------------------------------*/
  197.                 else
  198.                 {
  199.                         u1_printf("需要連接服務(wù)器\r\n");               //串口輸出信息
  200.                         TIM_Cmd(TIM4, DISABLE);                        //關(guān)閉TIM4
  201.                         TIM_Cmd(TIM3, DISABLE);                        //關(guān)閉TIM3  
  202.                         WiFi_RxCounter = 0;                            //WiFi接收數(shù)據(jù)量變量清零                        
  203.                         memset(WiFi_RX_BUF, 0, WiFi_RXBUFF_SIZE);      //清空WiFi接收緩沖區(qū)
  204.                         if(WiFi_Connect_IoTServer() == 0)                           //如果WiFi連接云服務(wù)器函數(shù)返回0,表示正確,進(jìn)入if
  205.                         {                                
  206.                                 u1_printf("建立TCP連接成功\r\n");          //串口輸出信息
  207.                                 connectFlag = 1;                           //connectFlag置1,表示連接成功       
  208.                                 WiFi_RxCounter = 0;                        //WiFi接收數(shù)據(jù)量變量清零                        
  209.                                 memset(WiFi_RX_BUF, 0, WiFi_RXBUFF_SIZE);  //清空WiFi接收緩沖區(qū)
  210.                                 MQTT_Buff_Init();                          //初始化發(fā)送緩沖區(qū)                    
  211.                         }                               
  212.                 }
  213.         }
  214. }
復(fù)制代碼

所有資料51hei提供下載:
OneNet-esp8266.7z (185.32 KB, 下載次數(shù): 55)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一级在线免费观看 | 久久51| 一区二区视频在线 | 久久人人网 | 日韩中文在线视频 | 久久av资源网 | 欧美一区免费 | 亚洲日本中文 | 九九热这里 | 中文字幕在线观看视频网站 | 久久久精品一区 | 久久久高清 | av免费观看在线 | 久久久久国产一区二区三区四区 | 91资源在线观看 | 亚洲精品视频在线播放 | 国产精品日韩欧美一区二区三区 | 日韩色在线 | 日皮视频免费 | 久久精品电影 | 久久中文字幕一区 | 在线观看国产视频 | 国产高清美女一级a毛片久久w | av毛片 | 久久毛片| 福利片在线| 天天操夜夜爽 | 中文字幕亚洲精品 | 久久久91精品国产一区二区三区 | 51ⅴ精品国产91久久久久久 | 亚洲欧美日韩在线不卡 | 国产精品免费av | 中文字幕一级毛片视频 | 91视频18 | 久久精品国产久精国产 | 欧美另类视频 | 久草青青草| 国产专区在线 | 在线观看黄色电影 | 欧美三级电影在线播放 | 亚洲精品一区二区三区中文字幕 |