# 环境监控设备 **Repository Path**: hehung/EnvironmentalMonitoring ## Basic Information - **Project Name**: 环境监控设备 - **Description**: 使用GD32L233C开发板制作的环境监控设备,集成了时间显示,温度,湿度,气压测量并显示,可燃气体监测浓度显示,可燃气体浓度超标蜂鸣器报警,按键切换显示界面,设置报警阈值等功能。 - **Primary Language**: C - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 3 - **Created**: 2022-02-26 - **Last Updated**: 2024-11-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 完整帖子内容参考EEWORLD论坛:http://bbs.eeworld.com.cn/thread-1195093-1-1.html [点我跳转](http://bbs.eeworld.com.cn/thread-1195093-1-1.html " 点我跳转") # 前言   使用GD32L233制作了一个室内环境监控装置,使用了嵌入式软件系统RT-Thread。可以实现时间日期显示,温湿度显示,气压显示,可燃气体监控以及蜂鸣器报警等功能,能够对室内环境实时监控,用户可以自行设置可燃气体报警阈值,阈值存储在Flash中,掉电不会丢失。 # 使用板载资源 1. 普通IO输入输出 - 用于LED输出控制以及按键采样输入; 2. PWM - 用于LED呼吸输出以及蜂鸣器输出控制; 3. ADC - 用于可燃气体传感器采样以及模拟按键采样; 4. IIC - 用于温湿度,气压传感器数据采集以及OLED显示控制; 5. RTC - 用于时间输出; 6. FMC - 用于保存可燃气体阈值,上电时读出阈值,设置阈值时保存早指定FLASH地址; 7. 串口 - 用于RT-Thread嵌入式系统的shell; 8. 嵌入式系统RT-Thread。 # 硬件连接以及功能介绍 ## LED功能   本作品使用了两个LED,一个由PWM控制(控制周期性呼吸),一个是普通IO控制(控制周期性闪烁),主要是用于表示环境监控装置是否正常工作。有一个线程专门控制LED呼吸以及闪烁,线程周期是500ms,线程优先级为5。 LED使用了板载的LED1以及LED4: -- LED1作为普通IO口,每500ms翻转一次; -- LED4为PWM控制,呼吸周期为12.5s。 ### 线路连接 **LED1 --> PA7 LED4 --> PC7** ![590115](/data/attachment/forum/202202/27/121242db0pmndf17sv7ll1.png.thumb.jpg) **PC7的端口复用关系如下,使用了Timer2 CH1,复用关系为AF1**: ![590122](/data/attachment/forum/202202/27/145113mg9hc1zzcz9ag993.png.thumb.jpg) ## 按键功能   按键共有三个,其中一个是板载的按键,位普通IO控制,另两个为外部连接的按键,这两个按键是模拟按键,两个按键接在同一个ADC口上。按键采样程序有单独的线程控制,线程周期是40ms,优先级为3。 ### 数字按键 数字按键为板载按键。**电路连接:PA0** ![590116](/data/attachment/forum/202202/27/121302qwxggngg9ggg6wnn.png.thumb.jpg) **定义数字按键为按键1**,模拟按键分别为按键2和按键3。 ### 模拟按键 模拟按键原理图如下,两个按键接在同一个模拟信号上。 ![590117](/data/attachment/forum/202202/27/121302p3lsvvdsg6g03g8x.png.thumb.jpg) 实物图:,**定义左边的按键为按键2,右边的按键为按键3**: ![590131](/data/attachment/forum/202202/27/154223ecafp1p1bbldtczt.png.thumb.jpg) 通过计算就可以算出来每个按键按下的时候switch端口会采集到的电压。 Switch端电压计算(使用12bit精度): --S1按下:Switch = (3.3V)*[1/(4.7+1)] = 0.58V,转换为12bit精度数字为0.58/3.3 * 4096 ≈ **718.6** --S2按下:Switch = (3.3V)*[2/(4.7+2)] = 0.99V,转换为12bit精度数字为0.99/3.3 * 4096 ≈ **1222.7** 实测结果也如上所示。 硬件连接:**switch连接到PA1, 使用的是ADC_IN1** ![590121](/data/attachment/forum/202202/27/144541icraidrye8p3yred.png.thumb.jpg) ## 蜂鸣器   蜂鸣器主要用于报警用,当可燃气体传感器检测到可燃气体超过阈值只有就会报警。使用的是无源蜂鸣器,需要用PWM驱动,人耳能听到的声音频率为20Hz到20kHz,在设置PWM频率的时候要注意保持在这个频率,而且频率不能太高,过高的频率声音很尖锐刺耳,本作品使用的频率为1000Hz,驱动占空比为50%,为最大音量。   蜂鸣器控制有专门的线程,优先级为2.   蜂鸣器根据可燃气体监测的浓度输出两种不同间断的声音,当为一级警报(见可燃气体传感器说明)时,输出声音间断周期为1s;当为二级警报(见可燃气体传感器说明)时,输出声音的间断周期为100ms。 蜂鸣器电路图如下: ![590120](/data/attachment/forum/202202/27/144520qkmczx5pmcxz5k66.png.thumb.jpg) 实物图: ![590133](/data/attachment/forum/202202/27/154224d7rc1tqa8mmstaqq.png.thumb.jpg) **BEEP引脚连接到了PA3**. **PA3复用为Timer1 CH3,复用关系为AF1**,如下图. ![590123](/data/attachment/forum/202202/27/145214poo5kxyk5uky5duy.png.thumb.jpg) ## 可燃气体传感器MQ-2   可燃气体传感器使用的是MQ2,可以高灵敏度的监测大部分可燃气体以及烟雾,其使用ADC输出监测结果,当检测到的可燃气体(如甲烷)溶度越高,输出的ADC值越大。   软件中使用12bit ADC,然后将采集到的值转换成百分比形式,为0%~100%。   可燃气体检测有专门的线程,优先级为1,因为检测可燃气体为最优任务,线程周期为1s。   可燃气体报警阈值设置了两个,一个为一级阈值,一个为二级阈值,一级阈值对应的浓度较低,只是可能存在可燃气体泄漏;二级阈值对应浓度较高,肯定可燃气体存在泄漏的情况,这两个数值可以使用按键进行设置。 **注意:MQ2的供电电压为5V**,最开始我接的是3.3V导致ADC输出总是为0,为此花了很多时间排查问题。 电路图如下: ![590124](/data/attachment/forum/202202/27/150112b8icicdqiqmqv878.png.thumb.jpg) 实物图: ![590132](/data/attachment/forum/202202/27/154224xisi53vss8juhz7z.png.thumb.jpg) **ADC引脚连接到了PA2,即ADC_IN2,采样精度为12bit** ![590125](/data/attachment/forum/202202/27/150204ygvfv38pgggei1zv.png.thumb.jpg) ## 温度、湿度、气压传感器 - 温度传感器使用的是STTS751,用来采集温度; - 湿度传感器使用的是HTS221,用来采集湿度; - 气压传感器使用的是LPS22HH,用来采集大气压强。 上面的传感器使用的详细介绍请参考我的帖子,这里不在赘述: [【GD32L233C-START评测】16. IIC获取x-nucleo-iks01a3板子温湿度以及大气压](http://bbs.eeworld.com.cn/thread-1195070-1-1.html "【GD32L233C-START评测】16. IIC获取x-nucleo-iks01a3板子温湿度以及大气压") 实物图: ![590134](/data/attachment/forum/202202/27/154225vp9bebcbpcovyb8p.png.thumb.jpg) 硬件连接:这个三个传感器都使用了IIC控制,使用的IIC接线为: **SCL - PB10 SDA - PB11** ## OLED显示屏   OLED显示屏单色,分辨率为128*64,控制方式为IIC。 ### 功能 1. 时间显示   间隔读出RTC输出的时钟信息并显示出来。 2. 传感器数值显示   显示温度值,湿度值,气压值,可燃气体浓度值。 3. 设置   显示设置界面,用于设置可燃气体报警阈值,初始一级报警阈值为30,二级报警阈值为45;可以调整参数。 4. 设置完成   在设置完成阈值之后会显示这个界面,表示设置成功。 硬件连接: **SCL - PB10 SDA - PB11** ## RTC   使用RTC实时时钟组件来获取当前的时间并在显示屏上显示出来。 可以参考帖子:[【GD32L233C-START评测】6. 获取RTC时间并通过OLED显示](http://bbs.eeworld.com.cn/thread-1192907-1-1.html "【GD32L233C-START评测】6. 获取RTC时间并通过OLED显示") ## FMC flash擦写控制   主要用于将可燃气体的报警阈值写入到FLASH的固定地址中。上电时先从改地址中读取数值,如果全是0xFFFF,表示没有数据写入,读取默认的阈值,一级阈值30,二级阈值45;如果读出来的数值不是0xFFFF,就将读出来的数值装载到一级阈值以及二级阈值的变量中。   当用于通过按键重新设置了阈值之后,擦除指定FLASH page,然后将阈值数据重新写入到指定地址中。 阈值写入地址: **1. 一级阈值:0x0803E000;** **2. 二级阈值:0x0803E001。** 0x0803E000地址对应的FLASH page为62,当用户重新设置了阈值之后,先擦除FLASH的62页,然后再将两个阈值重新入到0x0803E000以及0x0803E001中。 FMC的操作参考帖子:[【GD32L233C-START评测】15. flash擦写操作,将FLASH当做EEPROM使用](http://bbs.eeworld.com.cn/thread-1194416-1-1.html "【GD32L233C-START评测】15. flash擦写操作,将FLASH当做EEPROM使用") # 功能描述   功能是基于OLED显示界面而有所区分的。 ## 上电时 上面时会显示 环境监控仪界面,持续一秒钟。 ![590130](/data/attachment/forum/202202/27/154223wwy98gbbo2k0gt79.png.thumb.jpg)。 ## 时间显示 时间显示界面会显示从RTC读出来的时间,也会显示日期(年月日)在最下面,左上角显示当前温度,右上角显示当前湿度。 ![590135](/data/attachment/forum/202202/27/154225mv0ewqfsm7f0sdu7.png.thumb.jpg) ** 在这个界面下按下按键3,可以切换到【环境监控界面】 在这个界面下按下按键2,可以切换到【设置界面】 ** ## 环境监控 环境监控显示传感器读取到的温度,湿度,气压,可燃气体浓度等数据并显示出来。 ![590136](/data/attachment/forum/202202/27/154225ka2qt5jtw0a6659q.png.thumb.jpg) ** 在该界面下,按下按键3可以切换到【设置界面】 在该界面下,按下按键2可以切换到【时间显示界面】 ** ## 设置 设置界面可以对可燃气体的浓度进行设置,在开始进入到这个界面的时候,光标在最下面的【开始】上,表示还没有进入到对阈值的设置逻辑中,如下图。 ![590137](/data/attachment/forum/202202/27/154226q3yi9d6nngykj3y3.png.thumb.jpg) ** 在此界面下,按下按键3可以切换到【时间显示界面】 在此界面下,按下按键2可以切换到【环境监控界面】 在此界面下,按下按键1(短按,时间不超过1s)光标会切换到一级阈值设置处。 ** 当光标在一级阈值设置处,如下图 ![590138](/data/attachment/forum/202202/27/154226txmbffuvmt000exk.png.thumb.jpg) ** 按下按键3阈值+1,当阈值等于二级阈值-1时,再次按下会变为101, 按下按键2阈值-1,当阈值=10时,再次按下会变为二级阈值-1. 按下按键1(短按,时间不超过1s)光标会切换到二级阈值设置处。 ** 当光标在二级阈值设置处。 ** 按下按键3阈值+1,当阈值等于99时,再次按下阈值会变为一级阈值+1或者20, 按下按键2阈值-1,当阈值=20或者等于一级阈值+1时,再次按下会变为99. 按下按键1(短按,时间不超过1s)光标会切换到【确认】上。 ** 当光标在【确认】处。 ** 按键2和按键3将失效。 按键1短按(时间不超过1s),光标会切换到一级阈值设置处 按键1长按(时间超过1s),切换到【设置成功界面】,开始存储新的阈值到FLASH中 ** ## 设置完成 设置完成界面,表示阈值设置成功,新的阈值值已经存入了FLASH中,一秒钟之后退回到【设置界面】。光标处变为【开始】,此时可以按照【设置界面】中的描述来做。 ![590139](/data/attachment/forum/202202/27/155925ifzl3c3fww1llgn3.png.thumb.jpg) # 显示效果 显示视频在Bilibili中:https://www.bilibili.com/video/BV1pT4y1Q7sc/ [点击跳转](https://www.bilibili.com/video/BV1pT4y1Q7sc/ "点击跳转")