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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10534|回復: 14
打印 上一主題 下一主題
收起左側

STM32煙霧檢測程序 DHT11溫濕度采集 ESP8266WIFI傳輸數據 1602液顯

  [復制鏈接]
跳轉到指定樓層
樓主


單片機源程序如下:
  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);             //按鍵函數


  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相關函數

  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>:字符串參數,接入點名稱
  47.     <pwd>:字符串參數,密碼最長64字節,ASCII
  48.     <chl>:通道號
  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時才能開啟服務器;關閉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");                        //模塊測試
  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();             //延時函數初始化      
  133.     NVIC_Configuration();      //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  134.     KEY_IO_Init();                                                                                
  135.     TIM2_Int_Init(1000-1,72-1);  //定時器初始化,定時1MS
  136.     //Tout = ((arr+1)*(psc+1))/Tclk ;  72000/72=1000us
  137.     //Tclk:定時器輸入頻率(單位MHZ)
  138.     //Tout:定時器溢出時間(單位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值轉換成百分比0~99
  150.             PPM = PPM >= 99? 99: PPM;//最大值不能超過99
  151.           DHT11_Read_Data(&Temperature,&HUM);//讀取溫濕度值
  152.             SHOW_AND_BAOJING_Handle();
  153.       Change_data_handle();//按鍵調節

  154.             if(test++>20)//ESP8266延時一段時間,發送一次數據
  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];//顯示緩存區
  166.       
  167.       if(Temperature >= Temperature_MAX)//溫度超限
  168.         {
  169.              memcpy(buf,Alarm_Buf,8);//把Alarm_Buf里的字符串拷貝到buf中
  170.              buf[7] = '!';
  171.              if(FLICKER)//超標顯示閃爍
  172.              {
  173.                     LCD_Write_String(0,0,"         ");
  174.              }
  175.              else
  176.              {
  177.                     sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//轉換顯示格式為TEMP:00C
  178.                     LCD_Write_String(0,0,show_buf);//顯示
  179.              }
  180.         }
  181.         else
  182.         {
  183.             sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//轉換顯示格式為TEMP: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)//超標顯示閃爍
  192.              {
  193.                     LCD_Write_String(9,0,"       ");
  194.              }
  195.              else
  196.              {
  197.                     sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//轉換顯示格式為HUM:00%
  198.                     LCD_Write_String(9,0,show_buf);//顯示
  199.              }
  200.         }
  201.         else
  202.         {
  203.             sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//轉換顯示格式為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)//超標顯示閃爍
  214.              {
  215.                     LCD_Write_String(0,1,"             ");
  216.              }
  217.              else
  218.              {
  219.                     sprintf(show_buf,"SMOKE:%02d%%",PPM);//轉換顯示格式為SMOKE:00%
  220.                     LCD_Write_String(0,1,show_buf);
  221.              }
  222.         }
  223.         else
  224.         {
  225.             sprintf(show_buf,"SMOKE:%02d%%",PPM);//轉換顯示格式為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;//繼電器開啟
  234.       BEEP_ENABLE(); //蜂鳴器報警        
  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: //設置溫度
  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: //設置濕度
  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: //設置煙霧
  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)//按下次數等于4退出設置
  328.                     {
  329.                         MODE = 0;   
  330.                     }
  331.                 }
  332.             }
  333.         
  334. }   
復制代碼
代碼: 程序.7z (204.99 KB, 下載次數: 510)

評分

參與人數 2黑幣 +55 收起 理由
mashuiyou + 5 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:643670 發表于 2021-4-10 16:31 | 只看該作者
有沒有仿真圖呀,樓主
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

9#
ID:854496 發表于 2022-3-30 18:03 | 只看該作者
贊一個,可以在此基礎上擴展其他功能
回復

使用道具 舉報

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

使用道具 舉報

11#
ID:837875 發表于 2022-5-20 23:40 | 只看該作者
是不是沒有煙霧啊
回復

使用道具 舉報

12#
ID:58907 發表于 2023-6-19 10:41 | 只看該作者
贊一個,可以在此基礎上擴展其他功能
回復

使用道具 舉報

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

是不是超限,啥也不顯示
回復

使用道具 舉報

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

使用道具 舉報

15#
ID:600469 發表于 2024-4-30 14:12 | 只看該作者
很有參考學習價值
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久一区二区视频 | 91视频入口 | 国产精品久久久久久久久免费丝袜 | 久久精品亚洲精品国产欧美 | 日韩在线播放中文字幕 | 国产一区二区三区亚洲 | 四季久久免费一区二区三区四区 | 欧美视频 | 2020亚洲天堂 | 毛片网站在线观看视频 | 免费美女网站 | 中文字幕高清av | 日本国产精品视频 | 久久久久国产精品一区二区 | 欧美视频一区二区三区 | 毛片av免费在线观看 | 浴室洗澡偷拍一区二区 | 欧美一级视频免费看 | 欧美videosex性极品hd | 亚洲一区久久久 | 自拍 亚洲 欧美 老师 丝袜 | 国产精品久久久久久久久免费 | 午夜精品久久久久久不卡欧美一级 | 午夜av一区二区 | 成人二区 | 日韩一区二区在线观看 | 在线视频国产一区 | 三级黄色片在线 | 天天操夜夜操免费视频 | 亚洲一二视频 | 免费一看一级毛片 | 亚洲精品久久久久中文字幕二区 | 国产黄色小视频在线观看 | 久久综合香蕉 | 狠狠的操| 日韩精品一区二区三区久久 | 亚洲国产精品日本 | 日韩精品一区二区三区中文字幕 | 久久国内精品 | 极品的亚洲 | 一呦二呦三呦国产精品 |