本帖最后由 RRoy 于 2025-1-8 18:01 编辑
这周为大家带来一个非常实用的项目——便携式空气质量检测仪。
检测仪使用MQ135传感器监测空气质量,并通过FireBeetle ESP32 E V1在OLED显示屏上直观地显示读数。
由于其小巧的体积并且内置电源,用户可以随时随地获取空气质量读数。
PS:该空气质量检测仪虽然会显示特定气体在空气中的浓度,但并不等同于完整的空气质量指数(AQI)评估。
通常,空气质量监测中会监测颗粒物(PM2.5和PM10)、氧气、二氧化氮、二氧化硫和一氧化碳等。这个设备只能检测二氧化碳、烟雾、苯、酒精、氮氧化物和氨气等气体。虽然用于公共健康建议的标准化AQI仍然是获取信息的最佳来源,但这个空气质量检测仪是了解特定气体空气质量的一个很好的工具。
材料清单步骤1:MQ135空气质量传感器
MQ135传感器可以集成到许多项目中来监测空气质量,适合检测大气中的有害气体。
该传感器具有两个输出:一个模拟输出,根据气体浓度生成0–5V的模拟电压信号;一个数字信号,当气体浓度超过阈值时输出0V或5V。它运行在3.3V供电下,但最大可承受5V。
传感器需要预热20秒以稳定并提供准确读数,使用时电流150mA。
该传感器能够检测氨气(NH3)、氮氧化物(NOx)、二氧化碳(CO2)、苯、烟雾等有害气体。
步骤2:使用树莓派 Pico进行基本设置
我们首先将MQ135传感器与新发布的树莓派 PICO 2连接起来,搭建最简单的配置。
在这里,我们将MQ135传感器的VCC连接到PICO的3.3V引脚,将GND连接到GND,将GPIO26和GPIO21分别用于模拟输出和数字输出。
- #include <Wire.h>
- // Define the pins
- const int analogPin = 26; // GP26
- const int digitalPin = 21; // GP21
- void setup() {
- Serial.begin(9600);
- pinMode(digitalPin, INPUT);
- }
- void loop() {
- int analogValue = analogRead(analogPin);
- int digitalValue = digitalRead(digitalPin);
- Serial.print("Analog Value: ");
- Serial.print(analogValue);
- Serial.print(", Digital Value: ");
- Serial.println(digitalValue);
- delay(1000);
- }
复制代码
MQ135传感器需要约20到30秒进行预热,然后才能提供准确读数。小伙伴们可以通过上述代码在串口监视器中观察传感器值。
步骤3:设计阶段
我们制作了一个小型外壳,尺寸为80 x 55 x 30毫米。它分为两个部分:底座和顶部盖子。OLED屏幕安装在顶部盖子内部。
Firebeetle 开发板、MQ135传感器、电源开关和电池都放置在底座内部。
为了使这个外壳更舒适易握,我们在底座两侧添加了握把。
为了方便佩戴或携带,我们添加了一个挂钩组件,可以用来连接ID卡绳或钥匙链。
为了增强视觉效果,我们创建了两个类似字母O和X的组件,并将它们放置在外壳顶部盖子上。为了提升设备的美观性,这两个部分将用橙色PLA打印,而整个外壳则用灰色PLA打印。
3D打印文件可以在文末下载。
步骤4:为何选择FireBeetle而非树莓派 Pico
在本项目的第二阶段,我们将主要微控制器从树莓派 Pico 2更换为Firebeetle 2 ESP32-E。这一更换是由于外壳内部空间的问题,尽管这两个板看起来几乎相同大小,但Pico实际上比Firebeetle会更小一点。我们不得不修改外壳设计,使其稍微增大,因为使用Pico需要添加第二块板来充电锂电池。
我们选择Firebeetle来解决这个问题,因为它具有由TP4056驱动的内置锂离子电池充电电路,该电路专门为单节锂离子电池设计,是便携设备中可靠且高效的锂离子电池充电解决方案。
步骤5:主要代码
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #define SCREEN_WIDTH 128
- #define SCREEN_HEIGHT 64
- #define OLED_RESET -1
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
- const int analogPin = 35; // A3
- const int digitalPin = 2; // D2
- void setup() {
- Serial.begin(9600);
- pinMode(digitalPin, INPUT);
- // SSD1306 OLED display initialization
- if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
- Serial.println(F("SSD1306 allocation failed"));
- for(;;);
- }
- display.display();
- delay(2000); // Pause for 2 seconds
- display.clearDisplay();
- }
- void loop() {
- int analogValueRaw = analogRead(analogPin);
- int analogValue = map(analogValueRaw, 0, 4095, 0, 1023); // Scale the value to match the Pico's range
- int digitalValue = digitalRead(digitalPin);
- String airQuality = getAirQuality(analogValue);
- Serial.print("Analog Value (Raw): ");
- Serial.print(analogValueRaw);
- Serial.print(", Scaled Value: ");
- Serial.print(analogValue);
- Serial.print(", Digital Value: ");
- Serial.println(digitalValue);
- // Display scaled analog value and air quality condition on OLED
- display.clearDisplay();
- display.setTextSize(2); // Normal 1:1 pixel scale
- display.setTextColor(SSD1306_WHITE); // Draw white text
- display.setCursor(0, 10); // Start at top-left corner
- display.print("Value: ");
- display.println(analogValue);
- display.setTextSize(1);
- display.setCursor(0, 40);
- display.print("Air Quality: ");
- display.println(airQuality);
- display.display();
- delay(1000);
- }
- String getAirQuality(int analogValue) {
- if (analogValue <= 200) {
- return "Excellent";
- } else if (analogValue <= 400) {
- return "Good";
- } else if (analogValue <= 600) {
- return "Moderate";
- } else if (analogValue <= 800) {
- return "Poor";
- } else {
- return "Very Poor";
- }
- }
复制代码
代码中添加了三个主要库,以使用I2C通信驱动SSD1306 OLED显示屏。
MQ135传感器提供两个输出:一个模拟输出连接到Firebeetle的A3引脚,一个数字输出连接到Firebeetle的D2引脚。
为了获得所需的空气质量测量值,我们必须将原始模拟值(约0-4095)缩减到0-1023范围内。
使用Serial.println函数,可以在屏幕上显示这些值,但这里有个小变化。我们添加了getAirQuality函数,它接受缩放后的模拟值并返回表示空气质量状态的字符串:
- <=200: "优良"
- <=400: "良好"
- <=600: "中等"
- <=800: "差"
- >800: "极差"
步骤6:FireBeetle SSD1306显示屏与MQ135接线
- 将Firebeetle的3.3V和GND线连接到MQ135传感器的VCC和GND
- 然后,我们用两根线将Firebeetle的5V和GND连接到SSD1306的VCC和GND引脚
- 接下来,用连接线将MQ135传感器的模拟输出和数字输出分别连接到Firebeetle的A3和D2引脚
- 然后以类似方式将Firebeetle的SDA和SCL引脚连接到OLED屏幕的SDA和SCL引脚
步骤7:电源接线
我们使用一块紧凑型14500 3.7V 600mAh锂离子电池,并结合一个保护电路模块(PCM),这是一个小型电路,可防止过充、过放、短路等问题,作为本项目的电源供应。
我们只需将锂电池正极接到Firebeetle的正极,将锂电池负极焊接到摇臂开关的一端,另一端连接到Firebeetle负极。摇臂开关位于电池与Firebeetle之间,是设备主要开关。
步骤8:机身组装
- 我们首先将OLED屏幕放置在顶部盖内,然后用热熔胶固定显示屏。
- 在底座内部,将MQ135传感器放入适当位置。
- 然后,将电池和电源开关固定到位,Firebeetle开发板放置在底座中央,并用热熔胶固定。
- 确保所有组件都放置正确后,将顶部盖放置到底座上,并用四个M2螺钉固定。
- 最后,在字母O和X部件背面涂上胶水,然后将它们固定到设备上。
组装过程完成了。
步骤9:最后
我们在城市中的两个不同地点进行了测试:我的屋顶附近和靠近绿地。在绿地中低碳浓度与城市中的高碳浓度形成对比,因此得到了不同读数。
城市中的读数范围从550到620不等,这取决于区域是否靠近主要道路、工业区或绿树成荫且车辆稀少的绿地。如果我们在气体较少出现的位置进行测试,例如山区或丘陵,值可能会进一步降低。
总体而言,这个项目已经完成,但我希望未来对这个项目进行修改,进一步缩小尺寸,使其更加便携。
原文地址:https://www.instructables.com/Portable-Air-Quality-Meter/
项目作者:Arnov Sharma
译文首发于:DF创客社区
转载请注明来源信息
|