• 单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器)


    想要更多项目私wo!!!

    一、电路设计

    室内环境智能监测系统
    主要功能:
            1.检测空气温湿度
            2.检测光照强度
            3.检测烟雾浓度
            4.数据显示在手机端和设备OLED屏幕
            5.当空气温度高于设定的阈值时,风扇开启
            6.当空气湿度低于设定的阈值时,加湿器开启
            7.当光照强度低于设定的阈值时,灯开启
            8.当烟雾浓度高于设定的阈值时,风扇开启蜂鸣器开启
            9.以上5~8条的阈值可以在手机端控制更改或者设备的按键进行更改
            10.设备具有手动和自动两种模式,可以通过手机或设备端更改
            11.可以用手机远程控制设备
            手动模式下可以控制风扇,加湿器,灯,蜂鸣器的开关
            自动模式下就是以上5~8条的阈值自动控制

    二、运行结果

     

     

    三、部分代码

    1. #include "sys.h"
    2. #include "usart.h"
    3. #include "led.h"
    4. #include "timer.h"
    5. #include "ADC.h"
    6. #include "usart3.h"
    7. #include "key.h"
    8. #include "oled.h"
    9. #include "math.h"
    10. #include "dht11.h"
    11. #include "gizwits_product.h"
    12. #include "gizwits_protocol.h"
    13. #include "bh1750.h"
    14. #include "math.h"
    15. int wifi_linking; //wifi连接状态,如果连上,值为1 如果未连接,值为0
    16. int maxmode=0; //手动/自动模式标识符
    17. void key_scanf(void); //WiFi连接控制,按下即可配网
    18. //显示的时间
    19. int display_hour;
    20. int display_minute;
    21. int display_second;
    22. int display_day;
    23. u32 STM32_xx0=0X4E4C4A;
    24. u32 STM32_xx1=0X364B1322;
    25. u32 STM32_xx2=0X132D13 ;
    26. #define FLASH_SAVE_ADDR 0x08010000
    27. u8 buff[30];//OLED显示缓存数组
    28. u8 count;
    29. dataPoint_t currentDataPoint;//云端数据点
    30. u8 display_contrl=0;
    31. //以下几个EXTERN的是定义在机智云产品.c文件里面的传来的参数
    32. extern u16 TEMPYUZHI;
    33. extern u16 HUMYUZHI;
    34. extern u16 M2YUZHI;
    35. extern u16 GZYUZHI;
    36. //从光照的配置文件传来
    37. extern int lux;
    38. //从温湿度的配置文件传来
    39. extern u8 DHT11_Temp,DHT11_Hum; //温湿度
    40. //外设采集来的数值
    41. u16 gz_value; //光照检测值
    42. u16 m2_value; //烟雾检测值
    43. //初始阈值
    44. u16 A_DHT11_Temp=35; //温度阈值
    45. u16 A_DHT11_Hum=10; //湿度阈值
    46. u16 A_gz_value=60; //光照强度阈值
    47. u16 A_m2_value=1000; //烟雾阈值
    48. //此处表示上一次从手机发送来的数值,如果和上一次发来的不同,代表手机端又下发了新的阈值,新的阈值会生效,lastXXXXXX会变成新的
    49. u16 lastTEMPYUZHI;
    50. u16 lastHUMYUZHI;
    51. u16 lastM2YUZHI;
    52. u16 lastGZYUZHI;
    53. //当前数值超标值为1,不超标值为0
    54. int flag_temp;
    55. int flag_mq2;
    56. //风扇,蜂鸣器的工作标志位
    57. int flag;
    58. int flag_2;
    59. int times;
    60. //协议初始化
    61. void Gizwits_Init(void)
    62. {
    63. TIM3_Int_Init(9,7199);//1MS系统定时
    64. usart3_init(9600);//WIFI初始化
    65. memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
    66. gizwitsInit();//缓冲区初始化
    67. }
    68. //数据上传
    69. void userHandle(void)
    70. {
    71. currentDataPoint.valuetemp = DHT11_Temp ;
    72. currentDataPoint.valuehumi = DHT11_Hum;
    73. currentDataPoint.valueLight = gz_value;
    74. currentDataPoint.valueMQ2 = m2_value;
    75. }
    76. void Get_Data(u16 count); //获取传感器数据
    77. void WIFI_Contection(u8 key);//WiFi连接控制
    78. void Canshu_Change(u8 key); //系统参数调节
    79. void Mode_Change(u8 key); //模式切换
    80. int main(void)
    81. {
    82. u8 t=0;
    83. int key_value; //按键值
    84. uart_init(115200); //串口初始化为115200
    85. delay_init(); //延时函数初始化
    86. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    87. Adc1_Channe_Init(); //ADC通道初始化
    88. KEY_Init(); //按键引脚初始化
    89. Gizwits_Init(); //机智云初始化
    90. while(DHT11_Init()) //DHT11模块初始化
    91. {
    92. delay_ms(600);
    93. }; //等待DHT11的初始化
    94. LED_Init(); //LED初始化
    95. bh1750_iic_init(); //光照传感器初始化
    96. RELAY_Init(); //继电器初始化
    97. BEEP=0;
    98. delay_ms(300);
    99. BEEP=1;//全部都初始化完成,蜂鸣器响一下
    100. OLED_Init(); //OLED初始化
    101. OLED_Clear(); //OLED清屏
    102. gizwitsSetMode(WIFI_AIRLINK_MODE); //Air-link模式接入
    103. while(1)
    104. {
    105. if(wifi_linking)
    106. {
    107. times++;
    108. if(times>=2)
    109. {
    110. times=0;
    111. gizwitsGetNTP();//获取网络时间
    112. delay_ms(100);
    113. }
    114. }
    115. Get_Data(0);
    116. if(TEMPYUZHI!=lastTEMPYUZHI) //阈值的获取,如果和上次一样,就代表没变化,如果变化了,新收到的阈值会直接生效
    117. {
    118. A_DHT11_Temp=TEMPYUZHI;
    119. lastTEMPYUZHI=TEMPYUZHI;
    120. }
    121. if(HUMYUZHI!=lastHUMYUZHI)
    122. {
    123. A_DHT11_Hum=HUMYUZHI;
    124. lastHUMYUZHI=HUMYUZHI;
    125. }
    126. if(M2YUZHI!=lastM2YUZHI)
    127. {
    128. A_m2_value=M2YUZHI;
    129. lastM2YUZHI=M2YUZHI;
    130. }
    131. if(GZYUZHI!=lastGZYUZHI)
    132. {
    133. A_gz_value=GZYUZHI;
    134. lastGZYUZHI=GZYUZHI;
    135. }
    136. if(maxmode==0)//如果优先级标志位为0 那么就是自动模式
    137. {
    138. //跑马灯
    139. LED1=~LED1;
    140. delay_ms(100);
    141. //如果当前环境太黑 开灯
    142. if(gz_value<=A_gz_value)
    143. {
    144. LED0=1;
    145. }else
    146. if(gz_value>A_gz_value)
    147. {
    148. LED0=0;
    149. }
    150. //如果当前环境温度太高或者MQ2 MQ135 MQ7数值高于阈值 开风扇 因为是同一个风扇,所以设计了这种方法
    151. if(m2_value
    152. {
    153. flag_mq2=0;
    154. }
    155. if(m2_value>=A_m2_value)
    156. {
    157. flag_mq2=1;
    158. }
    159. if(DHT11_Temp
    160. {
    161. flag_temp=0;
    162. }
    163. if(DHT11_Temp>=A_DHT11_Temp)
    164. {
    165. flag_temp=1;
    166. }
    167. flag=flag_temp+flag_mq2;
    168. if(flag>=1)
    169. {
    170. FAN=FAN_ON;
    171. }
    172. if(flag==0)
    173. {
    174. FAN=FAN_OFF;
    175. }
    176. //如果当前环境三个监测的传感器检测到的数值过高 蜂鸣器会不停的警报至其含量低于设定的阈值
    177. flag_2=flag_mq2;
    178. if(flag_2>=1)
    179. {
    180. BEEP=BEEP_ON;
    181. }
    182. if(flag_2==0)
    183. {
    184. BEEP=BEEP_OFF;
    185. }
    186. //如果当前环境空气湿度低于设置的阈值,开启加湿器
    187. if(DHT11_Hum
    188. {
    189. HUMIPLUS=HUMIPLUS_ON;
    190. }
    191. if(DHT11_Hum>=A_DHT11_Hum)
    192. {
    193. HUMIPLUS=HUMIPLUS_OFF;
    194. }
    195. }
    196. key_value = KEY_Scan(0);
    197. if(key_value==2)
    198. {
    199. display_contrl++;
    200. OLED_Clear(); //OLED清屏
    201. }
    202. if(display_contrl%2==0&&t>=10)
    203. {
    204. OLED_ShowCHinese(0,0,0);
    205. OLED_ShowCHinese(16,0,2);
    206. sprintf((char*)buff,":%2d",DHT11_Temp);
    207. OLED_ShowString(32,0,buff,16); //显示温度
    208. OLED_ShowCHinese(64,0,21);
    209. OLED_ShowCHinese(0,2,1);
    210. OLED_ShowCHinese(16,2,2);
    211. sprintf((char*)buff,":%2d ",DHT11_Hum);
    212. OLED_ShowString(32,2,buff,16);//显示湿度
    213. OLED_ShowCHinese(64,2,22);
    214. OLED_ShowCHinese(0,4,5);
    215. OLED_ShowCHinese(16,4,6);
    216. OLED_ShowCHinese(32,4,7);
    217. OLED_ShowCHinese(48,4,8);
    218. sprintf((char*)buff,":%4dLx",gz_value);
    219. OLED_ShowString(64,4,buff,16);//显示光照强度
    220. OLED_ShowCHinese(0,6,13);
    221. OLED_ShowCHinese(16,6,14);
    222. OLED_ShowCHinese(32,6,15);
    223. OLED_ShowCHinese(48,6,16);
    224. sprintf((char*)buff,":%4dppm",m2_value);
    225. OLED_ShowString(64,6,buff,16);//显示空气质量
    226. }
    227. else if(display_contrl%2==1&&t>=10)
    228. {
    229. OLED_ShowCHinese(0,0,0);
    230. OLED_ShowCHinese(16,0,2);
    231. sprintf((char*)buff,":%2d",DHT11_Temp);
    232. OLED_ShowString(32,0,buff,16); //显示温度
    233. OLED_ShowCHinese(64,0,21);
    234. OLED_ShowCHinese(0,2,1);
    235. OLED_ShowCHinese(16,2,2);
    236. sprintf((char*)buff,":%2d ",DHT11_Hum);
    237. OLED_ShowString(32,2,buff,16);//显示湿度
    238. OLED_ShowCHinese(64,2,22);
    239. OLED_ShowCHinese(0,4,5);
    240. OLED_ShowCHinese(16,4,6);
    241. OLED_ShowCHinese(32,4,7);
    242. OLED_ShowCHinese(48,4,8);
    243. sprintf((char*)buff,":%4dLx",gz_value);
    244. OLED_ShowString(64,4,buff,16);//显示光照强度
    245. OLED_ShowCHinese(0,6,13);
    246. OLED_ShowCHinese(16,6,14);
    247. OLED_ShowCHinese(32,6,15);
    248. OLED_ShowCHinese(48,6,16);
    249. sprintf((char*)buff,":%4dppm",m2_value);
    250. OLED_ShowString(64,6,buff,16);//显示空气质量
    251. }
    252. userHandle(); //用户数据采集
    253. key_scanf();
    254. gizwitsHandle((dataPoint_t *)¤tDataPoint);//机智云协议处理
    255. Canshu_Change(key_value);
    256. t++;
    257. delay_ms(100);
    258. }
    259. }
    260. void key_scanf(void) //控制为自动
    261. {
    262. if(KEY4==RESET)
    263. {
    264. delay_ms(10);
    265. if(KEY4==RESET)
    266. {
    267. maxmode=5;
    268. LED0=LED0_OFF;
    269. LED1=LED1_OFF;
    270. BEEP=BEEP_OFF;
    271. FAN=FAN_OFF;
    272. HUMIPLUS=HUMIPLUS_OFF;
    273. }
    274. while(!KEY4);//松手检测
    275. }
    276. }
    277. void Canshu_Change(u8 key)
    278. {
    279. u8 obj=0;
    280. if(key==1)
    281. {
    282. OLED_Clear();
    283. while(1)
    284. {
    285. key = KEY_Scan(0);
    286. if(key==1)
    287. {
    288. obj++;
    289. if(obj>=5)
    290. {
    291. obj=0;
    292. }
    293. }
    294. sprintf((char *)buff," M_CHANGE");
    295. OLED_ShowString(30,0,buff,12);
    296. sprintf((char *)buff,"M_Temp :%4d",A_DHT11_Temp);
    297. OLED_ShowString(8,1,buff,12);
    298. sprintf((char *)buff,"M_Humi :%4d",A_DHT11_Hum);
    299. OLED_ShowString(8,2,buff,12);
    300. sprintf((char *)buff,"M_Light :%4d",A_gz_value);
    301. OLED_ShowString(8,3,buff,12);
    302. sprintf((char *)buff,"M_MQ2 :%4d",A_m2_value);
    303. OLED_ShowString(8,4,buff,12);
    304. sprintf((char *)buff,"M_mode :%4d",maxmode);
    305. OLED_ShowString(8,5,buff,12);
    306. if(obj==0)
    307. {
    308. OLED_ShowString(0,0," ",12);
    309. OLED_ShowString(0,1,"*",12);
    310. OLED_ShowString(0,2," ",12);
    311. OLED_ShowString(0,3," ",12);
    312. OLED_ShowString(0,4," ",12);
    313. OLED_ShowString(0,5," ",12);
    314. OLED_ShowString(0,6," ",12);
    315. OLED_ShowString(0,7," ",12);
    316. }
    317. if(obj==1)
    318. {
    319. OLED_ShowString(0,0," ",12);
    320. OLED_ShowString(0,1," ",12);
    321. OLED_ShowString(0,2,"*",12);
    322. OLED_ShowString(0,3," ",12);
    323. OLED_ShowString(0,4," ",12);
    324. OLED_ShowString(0,5," ",12);
    325. OLED_ShowString(0,6," ",12);
    326. OLED_ShowString(0,7," ",12);
    327. }
    328. if(obj==2)
    329. {
    330. OLED_ShowString(0,0," ",12);
    331. OLED_ShowString(0,1," ",12);
    332. OLED_ShowString(0,2," ",12);
    333. OLED_ShowString(0,3,"*",12);
    334. OLED_ShowString(0,4," ",12);
    335. OLED_ShowString(0,5," ",12);
    336. OLED_ShowString(0,6," ",12);
    337. OLED_ShowString(0,7," ",12);
    338. }
    339. if(obj==3)
    340. {
    341. OLED_ShowString(0,0," ",12);
    342. OLED_ShowString(0,1," ",12);
    343. OLED_ShowString(0,2," ",12);
    344. OLED_ShowString(0,3," ",12);
    345. OLED_ShowString(0,4,"*",12);
    346. OLED_ShowString(0,5," ",12);
    347. OLED_ShowString(0,6," ",12);
    348. OLED_ShowString(0,7," ",12);
    349. }
    350. if(obj==4)
    351. {
    352. OLED_ShowString(0,0," ",12);
    353. OLED_ShowString(0,1," ",12);
    354. OLED_ShowString(0,2," ",12);
    355. OLED_ShowString(0,3," ",12);
    356. OLED_ShowString(0,4," ",12);
    357. OLED_ShowString(0,5,"*",12);
    358. OLED_ShowString(0,6," ",12);
    359. OLED_ShowString(0,7," ",12);
    360. }
    361. if(obj==0)
    362. {
    363. if(key==3)
    364. {
    365. A_DHT11_Temp+=1;
    366. }
    367. if(key==4)
    368. {
    369. A_DHT11_Temp-=1;
    370. }
    371. }
    372. if(obj==1)
    373. {
    374. if(key==3)
    375. {
    376. A_DHT11_Hum+=1;
    377. }
    378. if(key==4)
    379. {
    380. A_DHT11_Hum-=1;
    381. }
    382. }
    383. if(obj==2)
    384. {
    385. if(key==3)
    386. {
    387. A_gz_value+=2;
    388. }
    389. if(key==4)
    390. {
    391. A_gz_value-=2;
    392. }
    393. }
    394. if(obj==3)
    395. {
    396. if(key==3)
    397. {
    398. A_m2_value+=5;
    399. }
    400. if(key==4)
    401. {
    402. A_m2_value-=5;
    403. }
    404. }
    405. if(obj==4)
    406. {
    407. if(key==3)
    408. {
    409. maxmode=5;
    410. }
    411. if(key==4)
    412. {
    413. maxmode=0;
    414. }
    415. }
    416. if(key==2)
    417. {
    418. OLED_Clear();
    419. break;
    420. }
    421. }
    422. }
    423. }
    424. void Get_Data(u16 count)//获取传感器数据
    425. {
    426. DHT11_Read_Data(&DHT11_Temp,&DHT11_Hum);
    427. Conversion();/// bh1750 光照模块数据采集
    428. gz_value = lux/10; //灯光;
    429. m2_value = get_Adc_Value(0x06)/10;
    430. }

  • 相关阅读:
    webpack 使用 二
    【NI-DAQmx入门】NI-DAQmx之MATLAB/SIMULINK支持
    分布式id解决方法--雪花算法
    有赞商城如何对接ERP、CRM系统?
    SSM基于web的教务管理系统 毕业设计-附源码261620
    MySQL数据库表空间回收问题
    Linux下分布式端口扫描工具DNmap下载安装及使用、流量抓取(更新ing)
    202212 青少年等级考试机器人实操真题六级试卷
    聚观早报 |中国企业成世界杯最大金主;马斯克恐失去世界首富位置
    【C++】C++多态——实现、重写、抽象类、原理
  • 原文地址:https://blog.csdn.net/qq_38393591/article/details/130708143