找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STM32F103C8T6的环境监测系统程序 上传OneNET

  [复制链接]
跳转到指定楼层
楼主
通过ESP8266连接WIFI,数据可上传OneNET

能够实现红外人体监测、光照度监测、烟雾浓度监测、一氧化碳浓度监测

当监测的气体浓度达到设定阈值后,可通过PWM调节风扇转速

能够通过OneNET远程调节LED亮度、风扇转速



单片机源程序如下:
  1. //C库
  2. #include <string.h>

  3. //单片机头文件
  4. #include "sys.h"

  5. //网络协议层
  6. #include "onenet.h"

  7. //网络设备
  8. #include "esp8266.h"

  9. //硬件驱动
  10. #include "delay.h"
  11. #include "usart.h"
  12. #include "led.h"
  13. #include "LCD.h"
  14. #include "dht11.h"
  15. #include "adc_dma.h"
  16. #include "mq2.h"
  17. #include "mq7.h"
  18. #include "timer.h"
  19. #include "bh1750.h"
  20. #include "gui.h"
  21. #include "hc_sr501.h"
  22. #include "hc_sr04.h"
  23. #include "TFT_demo.h"
  24. #include "pwm.h"
  25. #include "key.h"
  26. #include "beep.h"



  27. uint32_t time = 0; // ms 计时变量
  28. DHT11_Data_TypeDef DHT11_Data;

  29. float value_light = 0.0;         //光照度
  30. float value_mq2 = 0.0;                //烟雾浓度
  31. float value_mq7 = 0.0;                //一氧化碳浓度
  32. float value_sr04 = 0.0;                //超声波距离
  33. u8 status_sr501 = 0;                //人体红外检测到的值
  34. int max_mq7 = 50;                        //一氧化碳浓度阈值
  35. int max_mq2 = 50;                        //烟雾浓度阈值
  36. u8 LED_Light;                                //PWM灯光亮度
  37. u8 FAN_Speed;                                //风扇转速



  38. //硬件初始化
  39. void Hardware_Init(void)
  40. {
  41.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

  42.     delay_init();                        //延时函数初始化

  43.     LCD_Init();           //液晶屏初始化
  44.     LCD_Clear(GRAY0);

  45.     Usart1_Init(115200);                //串口1初始化为115200
  46.     Usart2_Init(115200);                 //串口2,驱动ESP8266用
  47.     LED_Init();                                        //LED初始化
  48.     SR501_Init();                                //红外热释电
  49.     Hcsr04Init();                                //超声波测距
  50.     ADCx_Init();                                //ADC  DMA初始化
  51.     DHT11_GPIO_Config();                //DHT11温湿度传感器初始化
  52.     BH1750_Init();                                //光照
  53.     KEY_Init();
  54.     BEEP_Init();
  55.     PWM_TIM_Init();                                //PWM频率=72000K/20*180=20Khz
  56.     TIM_SetCompare3(TIM3, 0);

  57.     Gui_DrawFont_GBK16(3, 34, BLUE, GRAY0, (u8 *)"设备初始化完成");
  58.     Gui_DrawFont_GBK16(3, 54, BLUE, GRAY0, (u8 *)"正在连接网络....");

  59. }

  60. void Net_Init()
  61. {
  62.     ESP8266_Init();                                        //初始化ESP8266
  63.     while(OneNet_DevLink())                        //接入OneNET
  64.         delay_ms(500);
  65.     LED1 = 0;                                                //入网成功
  66.     BEEP_SetOnOff(0);
  67.     Gui_DrawFont_GBK16(4, 70, RED, GRAY0, (u8 *)"网络连接完成");
  68.     delay_ms(2000);
  69.     BEEP_SetOnOff(1);
  70. }

  71. int main(void)
  72. {
  73.     unsigned char *dataPtr = NULL;
  74.     unsigned short timeCount = 300;        //发送间隔变量
  75.     char str[] = "";

  76.     Hardware_Init();                                //初始化外围硬件
  77.     Net_Init();                                                //网络初始化
  78.     GENERAL_TIM_Init();                                //1MS系统定时

  79.     LCD_Clear(BLACK);
  80.     Gui_DrawFont_GBK16(25, 4, BLUE, BLACK, (u8 *)" 系统监控 ");
  81.     GUI_DrawRectangle(1, 1, 128 - 2, 128 - 2, WHITE);                //边框

  82.     while(1)
  83.     {
  84.         delay_ms(10);
  85.         timeCount ++;

  86.         //接收数据
  87.         dataPtr = ESP8266_GetIPD(0);
  88.         if(dataPtr != NULL)
  89.         {
  90.             OneNet_RevPro(dataPtr);
  91.         }

  92.         if(timeCount >= 300)        //发送间隔5s
  93.         {
  94.             /* 温湿度传感器获取数据*/
  95.             /*调用Read_DHT11读取温湿度,若成功则输出该信息*/
  96.             if(Read_DHT11(&DHT11_Data) == SUCCESS)
  97.             {
  98.                 sprintf(str, "温度:%d.%d ℃ ", DHT11_Data.temp_int, DHT11_Data.temp_deci);
  99.                 Gui_DrawFont_GBK16(4, 30, RED, BLACK, (u8 *)str);
  100.                 sprintf(str, "湿度:%d.%d %c ", DHT11_Data.humi_int, DHT11_Data.humi_deci, '%');
  101.                 Gui_DrawFont_GBK16(4, 50, RED, BLACK, (u8 *)str);
  102.             }
  103.             else
  104.             {
  105.                 printf("Read DHT11 ERROR!\r\n");//读取数据失败,串口打印:Read DHT11 ERROR.
  106.                 Gui_DrawFont_GBK16(4, 30, RED, BLACK, (u8 *)"ERROR!");
  107.                 Gui_DrawFont_GBK16(4, 50, RED, BLACK, (u8 *)"ERROR!");
  108.             }

  109.             /*光照度传感器获取数据*/
  110.             value_light = LIght_Intensity();
  111.             sprintf(str, "光照:%.1flx  ", value_light);
  112.             Gui_DrawFont_GBK16(4, 70, YELLOW, BLACK, (u8 *)str);

  113.             /*MQ2传感器获取烟雾数据*/
  114.             value_mq2 = MQ2_GetPPM();
  115.             sprintf(str, "烟雾:%.1f ppm ", value_mq2);
  116.             Gui_DrawFont_GBK16(4, 90, BLUE, BLACK, (u8 *)str);

  117.             /*MQ7传感器获取一氧化碳数据*/
  118.             value_mq7 = MQ7_GetPPM();
  119.             sprintf(str, " CO :%.1f ppm ", value_mq7);
  120.             Gui_DrawFont_GBK16(4, 110, GREEN, BLACK, (u8 *)str);



  121.             OneNet_SendData();        //发送数据

  122.             timeCount = 0;
  123.             ESP8266_Clear();
  124.         }
  125.         /*超声波测距获取距离(CM)*/
  126.         //value_sr04 = Hcsr04GetLength();
  127.         /*人体检测*/
  128.         //status_sr501 = SR501_Check();

  129.         //调节灯光亮度
  130.         //PWM_Control(LED_Light);

  131.                 //调节风扇转速
  132.                 PWM_Control(FAN_Speed);
  133.         /**************************************************************************/
  134.         //        //判断一氧化碳浓度是否超过上限
  135.         //        if((int)DHT11_Data.temp_int >=  15)
  136.         //        {
  137.         //            BEEP = 0;        //蜂鸣器报警
  138.         //        }
  139.         //        else
  140.         //        {
  141.         //            BEEP = 1;        //蜂鸣器关闭
  142.         //        }
  143.         //判断一氧化碳浓度或烟雾浓度是否超过上限
  144.         if(((int)value_mq7 >= max_mq7) || ((int)value_mq2 >= max_mq2))
  145.         {
  146.             BEEP = 0;        //蜂鸣器报警
  147.         }
  148.         else
  149.         {
  150.             BEEP = 1;        //蜂鸣器关闭
  151.         }
  152.     }
  153. }
复制代码

Keil代码下载: 代码.7z (250.88 KB, 下载次数: 120)


评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:712167 发表于 2022-5-1 15:32 | 只看该作者
解决了我上云的苦恼
回复

使用道具 举报

板凳
ID:310441 发表于 2022-5-5 07:38 来自手机 | 只看该作者
ONENET收费几何?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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