用FireBeetle ESP32自制一个便携式空气质量检测仪
本帖最后由 RRoy 于 2025-1-8 18:01 编辑这周为大家带来一个非常实用的项目——便携式空气质量检测仪。
检测仪使用MQ135传感器监测空气质量,并通过FireBeetle ESP32 E V1在OLED显示屏上直观地显示读数。
由于其小巧的体积并且内置电源,用户可以随时随地获取空气质量读数。
PS:该空气质量检测仪虽然会显示特定气体在空气中的浓度,但并不等同于完整的空气质量指数(AQI)评估。
通常,空气质量监测中会监测颗粒物(PM2.5和PM10)、氧气、二氧化氮、二氧化硫和一氧化碳等。这个设备只能检测二氧化碳、烟雾、苯、酒精、氮氧化物和氨气等气体。虽然用于公共健康建议的标准化AQI仍然是获取信息的最佳来源,但这个空气质量检测仪是了解特定气体空气质量的一个很好的工具。
材料清单
[*]MQ135空气质量传感器
[*]树莓派 PICO 2
[*]面包板
[*]3D打印外壳
[*]14500 3.7V 600mAh锂离子电池(带PCM保护电路模块)
[*]SPST摇臂开关
[*]FireBeetle 2 ESP32-E开发板
[*]SSD1306 OLED屏幕
[*]连接线
[*]M2螺钉
步骤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:最后
https://dfrobot.loll.cc/video/Air%20Quality%20Meter%20using%20MQ135%20ESP32.mp4
我们在城市中的两个不同地点进行了测试:我的屋顶附近和靠近绿地。在绿地中低碳浓度与城市中的高碳浓度形成对比,因此得到了不同读数。
城市中的读数范围从550到620不等,这取决于区域是否靠近主要道路、工业区或绿树成荫且车辆稀少的绿地。如果我们在气体较少出现的位置进行测试,例如山区或丘陵,值可能会进一步降低。
总体而言,这个项目已经完成,但我希望未来对这个项目进行修改,进一步缩小尺寸,使其更加便携。
原文地址:https://www.instructables.com/Portable-Air-Quality-Meter/
项目作者:Arnov Sharma
译文首发于:DF创客社区
转载请注明来源信息
这里面用的传感器可以呀用SKUSEN0127替代吗 帅帅帅哈哈哈真的帅
页:
[1]