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

QQ登錄

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

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

STM32煙霧檢測(cè)程序 DHT11溫濕度采集 ESP8266WIFI傳輸數(shù)據(jù) 1602液顯

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


單片機(jī)源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "adc.h"
  5. #include "timer.h"
  6. #include "usart1.h"
  7. #include "LCD1602.h"
  8. #include "string.h"
  9. #include "stdio.h"
  10. #include "dht11.h"

  11. void Change_data_handle(void);
  12. void  SHOW_AND_BAOJING_Handle(void);
  13. u8 KEY_SCAN(void);             //按鍵函數(shù)


  14. u8 key,PPM,Temperature,HUM;
  15. u16 PPM_MAX=60,Temperature_MAX=40,HUM_MAX=70;//煙霧溫濕度上限初始值

  16. unsigned char Alarm_Buf[16]="Warning";
  17. char buf[30];

  18. extern unsigned char RxCounter,Usart1RecBuf[64];
  19. extern char bUsart1RecFlag;

  20. //ESP8266相關(guān)函數(shù)

  21. #define ESP_RECV_PTYPE_NULL 0
  22. #define ESP_RECV_PTYPE_DATA 1

  23. unsigned char cur_conn_id;
  24. char *strx=0;

  25. void Clear_Buffer(void)//清空緩存
  26. {
  27.     u8 i;
  28.     for(i=0;i<64;i++)
  29.     Usart1RecBuf[i]=0;//緩存
  30.     RxCounter=0;
  31. }

  32. void esp_ap_mode(void)
  33. {
  34.     Clear_Buffer();
  35.     Uart1_SendStr("AT+CWMODE=2\r\n");            ////<mode>:1-Station模式,2-AP模式,3-AP兼Station模式            
  36.     strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
  37.     while(strx == NULL)
  38.     {
  39.         Clear_Buffer();
  40.         Uart1_SendStr("AT+CWMODE=2\r\n");
  41.         delay_ms(500);
  42.         strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
  43.     }
  44.    
  45.     /*
  46.     <ssid>:字符串參數(shù),接入點(diǎn)名稱
  47.     <pwd>:字符串參數(shù),密碼最長(zhǎng)64字節(jié),ASCII
  48.     <chl>:通道號(hào)
  49.     < ecn >:0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK
  50.     */   
  51.     Clear_Buffer();
  52.     Uart1_SendStr("AT+CWSAP=\"TEST\",\"12345678\",1,3\r\n");                        
  53.     strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
  54.     while(strx == NULL)
  55.     {
  56.         Clear_Buffer();
  57.         Uart1_SendStr("AT+CWSAP=\"TEST\",\"12345678\",1,3\r\n");
  58.         delay_ms(500);
  59.         strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
  60.     }
  61.    
  62.     /*
  63.     AT+CIPMUX=1

  64.     OK
  65.     */
  66.     Clear_Buffer();
  67.     Uart1_SendStr("AT+CIPMUX=1\r\n");                        
  68.     strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
  69.     while(strx == NULL)
  70.     {
  71.         Clear_Buffer();
  72.         Uart1_SendStr("AT+CIPMUX=1\r\n");
  73.         delay_ms(500);
  74.         strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
  75.     }

  76.     /*
  77.     AT+CIPMUX=1時(shí)才能開(kāi)啟服務(wù)器;關(guān)閉server模式需要重啟?
  78.     AT+CIPSERVER=1,8080

  79.     OK
  80.     */
  81.     Clear_Buffer();
  82.     Uart1_SendStr("AT+CIPSERVER=1,8080\r\n");                        
  83.     strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
  84.     while(strx == NULL)
  85.     {
  86.         Clear_Buffer();
  87.         Uart1_SendStr("AT+CIPSERVER=1,8080\r\n");
  88.         delay_ms(500);
  89.         strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
  90.     }   
  91. }

  92. void esp8266_init()
  93. {
  94.     Usart1_Init(115200);
  95.     Uart1_SendStr("ESP8266 Init\r\n");
  96.     Uart1_SendStr("AT\r\n");                        //模塊測(cè)試
  97.     strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
  98.     while(strx == NULL)
  99.     {
  100.         Clear_Buffer();
  101.         Uart1_SendStr("AT\r\n");
  102.         delay_ms(500);
  103.         strx=strstr((const char*)Usart1RecBuf,(const char*)"OK");
  104.     }
  105.    
  106.     esp_ap_mode();
  107. }   


  108. void  esp_send_buf(unsigned char conn_id, char * buf, unsigned char len)
  109. {
  110.    
  111.         printf("AT+CIPSEND=%d,%d\r\n",cur_conn_id,len);
  112.         strx = strstr((const char*)Usart1RecBuf,(const char*)">");
  113.       delay_ms(200);
  114.         if(strx==NULL)
  115.         {
  116.                 return;
  117.         }
  118.         
  119.         Uart1_SendStr(buf);
  120.         strx = strstr((const char*)Usart1RecBuf,(const char*)"SEND OK");
  121.         delay_ms(100);
  122.         if(strx==NULL)
  123.         {
  124.                 return;
  125.         }   
  126.         
  127. }
  128. int main(void)
  129. {   
  130.   u16 test,test_adc;
  131.    
  132.     delay_init();             //延時(shí)函數(shù)初始化      
  133.     NVIC_Configuration();      //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
  134.     KEY_IO_Init();                                                                                
  135.     TIM2_Int_Init(1000-1,72-1);  //定時(shí)器初始化,定時(shí)1MS
  136.     //Tout = ((arr+1)*(psc+1))/Tclk ;  72000/72=1000us
  137.     //Tclk:定時(shí)器輸入頻率(單位MHZ)
  138.     //Tout:定時(shí)器溢出時(shí)間(單位us)
  139.     delay_ms(300);
  140.   DHT11_Init();    //DHT11初始化
  141.     RELAY_Init();//繼電器初始化
  142.   BEEP_DISENABLE();   //蜂鳴器初始化
  143.     LCD_Init();          // 1602初始化
  144.     Adc_Init();  //ADC初始化
  145.     esp8266_init();//ESP8266初始化
  146.   while(1)
  147.     {
  148.             test_adc = Get_Adc_Average(ADC_Channel_9,20);//讀取通道9的AD值,讀取20次的平均值
  149.             PPM = test_adc*99/4096;//12位AD,把AD值轉(zhuǎn)換成百分比0~99
  150.             PPM = PPM >= 99? 99: PPM;//最大值不能超過(guò)99
  151.           DHT11_Read_Data(&Temperature,&HUM);//讀取溫濕度值
  152.             SHOW_AND_BAOJING_Handle();
  153.       Change_data_handle();//按鍵調(diào)節(jié)

  154.             if(test++>20)//ESP8266延時(shí)一段時(shí)間,發(fā)送一次數(shù)據(jù)
  155.             {
  156.                     esp_send_buf(0,buf,27);
  157.                     test = 0;
  158.             }
  159.             delay_ms(1);
  160.   }
  161. }


  162. extern u8 FLICKER;

  163. void  SHOW_AND_BAOJING_Handle(void)
  164. {
  165.     unsigned char show_buf[16];//顯示緩存區(qū)
  166.       
  167.       if(Temperature >= Temperature_MAX)//溫度超限
  168.         {
  169.              memcpy(buf,Alarm_Buf,8);//把Alarm_Buf里的字符串拷貝到buf中
  170.              buf[7] = '!';
  171.              if(FLICKER)//超標(biāo)顯示閃爍
  172.              {
  173.                     LCD_Write_String(0,0,"         ");
  174.              }
  175.              else
  176.              {
  177.                     sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//轉(zhuǎn)換顯示格式為T(mén)EMP:00C
  178.                     LCD_Write_String(0,0,show_buf);//顯示
  179.              }
  180.         }
  181.         else
  182.         {
  183.             sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//轉(zhuǎn)換顯示格式為T(mén)EMP:00C
  184.             LCD_Write_String(0,0,show_buf);//顯示
  185.             memcpy(buf,show_buf,8);//將溫度顯示字符拷貝到buf中
  186.         }
  187.         buf[8] = ',';
  188.         if(HUM >= HUM_MAX)//濕度超限
  189.         {
  190.        memcpy(buf+9,Alarm_Buf,8);//把Alarm_Buf里的字符串拷貝到buf中
  191.              if(FLICKER)//超標(biāo)顯示閃爍
  192.              {
  193.                     LCD_Write_String(9,0,"       ");
  194.              }
  195.              else
  196.              {
  197.                     sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//轉(zhuǎn)換顯示格式為HUM:00%
  198.                     LCD_Write_String(9,0,show_buf);//顯示
  199.              }
  200.         }
  201.         else
  202.         {
  203.             sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//轉(zhuǎn)換顯示格式為HUM:00%
  204.             LCD_Write_String(9,0,show_buf);
  205.             memcpy(buf+9,show_buf,7);//將濕度顯示字符拷貝到buf中
  206.         }
  207.         buf[16] = ',';
  208.         if(PPM >= PPM_MAX)//煙霧超限
  209.         {
  210.        memcpy(buf+17,Alarm_Buf,7);
  211.              buf[24] = '!';
  212.              buf[25] = '!';
  213.              if(FLICKER)//超標(biāo)顯示閃爍
  214.              {
  215.                     LCD_Write_String(0,1,"             ");
  216.              }
  217.              else
  218.              {
  219.                     sprintf(show_buf,"SMOKE:%02d%%",PPM);//轉(zhuǎn)換顯示格式為SMOKE:00%
  220.                     LCD_Write_String(0,1,show_buf);
  221.              }
  222.         }
  223.         else
  224.         {
  225.             sprintf(show_buf,"SMOKE:%02d%%",PPM);//轉(zhuǎn)換顯示格式為SMOKE:00%
  226.             LCD_Write_String(0,1,show_buf);
  227.             memcpy(buf+17,show_buf,9);
  228.         }
  229.         buf[26] = '\r';
  230.         buf[26] = '\n';
  231.     if(Temperature >= Temperature_MAX || HUM >= HUM_MAX || PPM >= PPM_MAX)//溫度濕度煙霧超限
  232.         {
  233.             RELAY = 1;//繼電器開(kāi)啟
  234.       BEEP_ENABLE(); //蜂鳴器報(bào)警        
  235.         }            
  236.         else
  237.         {
  238.             RELAY = 0;
  239.             BEEP_DISENABLE();
  240.         }            
  241. }

  242. u8 KEY_SCAN(void)
  243. {
  244.       u8 res = 0;
  245.     if(!KEY1)
  246.         {
  247.            delay_ms(10);
  248.              if(!KEY1)
  249.            {
  250.                     while(!KEY1);//卡死
  251.                     res = 1;         
  252.            }
  253.          }
  254.     if(!KEY2)
  255.         {
  256.            delay_ms(10);
  257.              if(!KEY2)
  258.            {
  259.                     while(!KEY2);//卡死
  260.                     res = 2;         
  261.            }
  262.          }
  263.     if(!KEY3)
  264.         {
  265.            delay_ms(10);
  266.              if(!KEY3)
  267.            {
  268.                     while(!KEY3);//卡死
  269.                     res = 3;         
  270.            }
  271.          }         
  272.          return res;
  273. }

  274. void Change_data_handle(void)
  275. {
  276.     u8 key;
  277.       static u8 MODE = 0;
  278.       key = KEY_SCAN();//讀取按鍵值
  279.       if(key == 1)//按鍵1按下
  280.         {
  281.              MODE++;
  282.              LCD_Clear();//清屏
  283.              delay_ms(100);
  284.       }
  285.         while(MODE)
  286.         {
  287.             key = KEY_SCAN();
  288.               switch(MODE)
  289.                 {
  290.                   case 1: //設(shè)置溫度
  291.                             //顯示
  292.                             LCD_Write_String(0,0,"Set  the  TEMP ");
  293.                           LCD_Write_String(0,1,"max:");
  294.                           LCD_Write_Char(8,1,0xdf);
  295.                           LCD_Write_Char(9,1,'C');
  296.                             if(key == 2 && Temperature_MAX < 99) Temperature_MAX++;//按鍵2按下,值加1
  297.                           if(key == 3 && Temperature_MAX > 0) Temperature_MAX--;//按鍵3按下,值減1
  298.                               LCD1602_write_long(6,1,Temperature_MAX,2);//顯示值

  299.                    delay_ms(10);                           
  300.                         break;
  301.                     case 2: //設(shè)置濕度
  302.                             //顯示
  303.                             LCD_Write_String(0,0,"Set  the  HUM ");
  304.                           LCD_Write_String(0,1,"max:");
  305.                           LCD_Write_String(8,1,"%");
  306.                             if(key == 2 && HUM_MAX < 99) HUM_MAX += 1;//按鍵2按下,值加1
  307.                           if(key == 3 && HUM_MAX > 0) HUM_MAX -= 1;//按鍵3按下,值減1
  308.                               LCD1602_write_long(6,1,HUM_MAX,2);
  309.                    delay_ms(10);                           
  310.                         break;
  311.                     case 3: //設(shè)置煙霧
  312.                             //顯示
  313.                             LCD_Write_String(0,0,"Set the  SMOKE ");
  314.                           LCD_Write_String(0,1,"max:");
  315.                           LCD_Write_String(10,1,"% ");
  316.                             if(key == 2 && PPM_MAX < 99) PPM_MAX += 1;//按鍵2按下,值加1
  317.                           if(key == 3 && PPM_MAX > 0) PPM_MAX -= 1;//按鍵3按下,值減1
  318.                 LCD1602_write_long(8,1,PPM_MAX,2);

  319.                    delay_ms(10);                           
  320.                         break;
  321.                     default: break;
  322.                 }
  323.             if(key == 1)
  324.                 {
  325.               MODE++;
  326.                   LCD_Clear();
  327.                     if(MODE == 4)//按下次數(shù)等于4退出設(shè)置
  328.                     {
  329.                         MODE = 0;   
  330.                     }
  331.                 }
  332.             }
  333.         
  334. }   
復(fù)制代碼
代碼: 程序.7z (204.99 KB, 下載次數(shù): 510)

評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
mashuiyou + 5 贊一個(gè)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:643670 發(fā)表于 2021-4-10 16:31 | 只看該作者
樓主,求一下仿真圖,謝謝了
回復(fù)

使用道具 舉報(bào)

板凳
ID:643670 發(fā)表于 2021-4-10 16:31 | 只看該作者
有沒(méi)有仿真圖呀,樓主
回復(fù)

使用道具 舉報(bào)

地板
ID:928731 發(fā)表于 2021-5-28 16:08 | 只看該作者
樓主有仿真圖嗎!
回復(fù)

使用道具 舉報(bào)

5#
ID:968007 發(fā)表于 2021-9-25 10:46 | 只看該作者
樓主可以加個(gè)雨滴嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:948441 發(fā)表于 2021-12-22 20:51 | 只看該作者
有誰(shuí)知道這個(gè)芯片用的是什么??
回復(fù)

使用道具 舉報(bào)

7#
ID:738020 發(fā)表于 2022-3-25 16:11 | 只看該作者
樓主,麻煩求一下原理圖和仿真圖呀
回復(fù)

使用道具 舉報(bào)

8#
ID:738020 發(fā)表于 2022-3-30 17:32 | 只看該作者
如果將DHT11溫濕度采集修改成MQ-2代碼應(yīng)該哪里需要修改呀
回復(fù)

使用道具 舉報(bào)

9#
ID:854496 發(fā)表于 2022-3-30 18:03 | 只看該作者
贊一個(gè),可以在此基礎(chǔ)上擴(kuò)展其他功能
回復(fù)

使用道具 舉報(bào)

10#
ID:1021488 發(fā)表于 2022-4-25 11:10 | 只看該作者
   if(FLICKER)//超標(biāo)顯示閃爍
             {
                    LCD_Write_String(0,0,"         ");
             }
這個(gè)最后的參數(shù)是空格是什么意思呢?這樣會(huì)實(shí)現(xiàn)閃爍功能嗎?跪求大神解答!
回復(fù)

使用道具 舉報(bào)

11#
ID:837875 發(fā)表于 2022-5-20 23:40 | 只看該作者
是不是沒(méi)有煙霧啊
回復(fù)

使用道具 舉報(bào)

12#
ID:58907 發(fā)表于 2023-6-19 10:41 | 只看該作者
贊一個(gè),可以在此基礎(chǔ)上擴(kuò)展其他功能
回復(fù)

使用道具 舉報(bào)

13#
ID:829433 發(fā)表于 2024-1-7 17:29 | 只看該作者
yi_bo 發(fā)表于 2022-4-25 11:10
if(FLICKER)//超標(biāo)顯示閃爍
             {
                    LCD_Write_String(0,0,"         "); ...

是不是超限,啥也不顯示
回復(fù)

使用道具 舉報(bào)

14#
ID:1108583 發(fā)表于 2024-1-9 01:32 | 只看該作者
樓主有仿真圖嗎!急求仿真圖
回復(fù)

使用道具 舉報(bào)

15#
ID:600469 發(fā)表于 2024-4-30 14:12 | 只看該作者
很有參考學(xué)習(xí)價(jià)值
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表