找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8101|回复: 13
打印 上一主题 下一主题
收起左侧

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, 下载次数: 440)

评分

参与人数 2黑币 +55 收起 理由
mashuiyou + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏31 分享淘帖 顶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 | 只看该作者
楼主有仿真图吗!急求仿真图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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