2025-1-7 16:57:40 [显示全部楼层]
7822浏览
查看: 7822|回复: 2

[项目] 用FireBeetle ESP32自制一个便携式空气质量检测仪

[复制链接]
本帖最后由 RRoy 于 2025-1-8 18:01 编辑

这周为大家带来一个非常实用的项目——便携式空气质量检测仪。

用FireBeetle ESP32自制一个便携式空气质量检测仪图1

检测仪使用MQ135传感器监测空气质量,并通过FireBeetle ESP32 E V1在OLED显示屏上直观地显示读数。

用FireBeetle ESP32自制一个便携式空气质量检测仪图2

由于其小巧的体积并且内置电源,用户可以随时随地获取空气质量读数。

用FireBeetle ESP32自制一个便携式空气质量检测仪图3

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空气质量传感器
用FireBeetle ESP32自制一个便携式空气质量检测仪图4

用FireBeetle ESP32自制一个便携式空气质量检测仪图5

MQ135传感器可以集成到许多项目中来监测空气质量,适合检测大气中的有害气体。

该传感器具有两个输出:一个模拟输出,根据气体浓度生成0–5V的模拟电压信号;一个数字信号,当气体浓度超过阈值时输出0V或5V。它运行在3.3V供电下,但最大可承受5V。

传感器需要预热20秒以稳定并提供准确读数,使用时电流150mA。

该传感器能够检测氨气(NH3)、氮氧化物(NOx)、二氧化碳(CO2)、苯、烟雾等有害气体。
步骤2:使用树莓派 Pico进行基本设置
我们首先将MQ135传感器与新发布的树莓派 PICO 2连接起来,搭建最简单的配置。

用FireBeetle ESP32自制一个便携式空气质量检测仪图6

在这里,我们将MQ135传感器的VCC连接到PICO的3.3V引脚,将GND连接到GND,将GPIO26和GPIO21分别用于模拟输出和数字输出。

用FireBeetle ESP32自制一个便携式空气质量检测仪图7

  1. #include <Wire.h>
  2. // Define the pins
  3. const int analogPin = 26; // GP26
  4. const int digitalPin = 21; // GP21
  5. void setup() {
  6. Serial.begin(9600);
  7. pinMode(digitalPin, INPUT);
  8. }
  9. void loop() {
  10. int analogValue = analogRead(analogPin);
  11. int digitalValue = digitalRead(digitalPin);
  12. Serial.print("Analog Value: ");
  13. Serial.print(analogValue);
  14. Serial.print(", Digital Value: ");
  15. Serial.println(digitalValue);
  16. delay(1000);
  17. }
复制代码


用FireBeetle ESP32自制一个便携式空气质量检测仪图8

MQ135传感器需要约20到30秒进行预热,然后才能提供准确读数。小伙伴们可以通过上述代码在串口监视器中观察传感器值。
步骤3:设计阶段
用FireBeetle ESP32自制一个便携式空气质量检测仪图9

我们制作了一个小型外壳,尺寸为80 x 55 x 30毫米。它分为两个部分:底座和顶部盖子。OLED屏幕安装在顶部盖子内部。

Firebeetle 开发板、MQ135传感器、电源开关和电池都放置在底座内部。

为了使这个外壳更舒适易握,我们在底座两侧添加了握把。

用FireBeetle ESP32自制一个便携式空气质量检测仪图10

为了方便佩戴或携带,我们添加了一个挂钩组件,可以用来连接ID卡绳或钥匙链。

为了增强视觉效果,我们创建了两个类似字母O和X的组件,并将它们放置在外壳顶部盖子上。为了提升设备的美观性,这两个部分将用橙色PLA打印,而整个外壳则用灰色PLA打印。

3D打印文件可以在文末下载。
步骤4:为何选择FireBeetle而非树莓派 Pico
用FireBeetle ESP32自制一个便携式空气质量检测仪图11

在本项目的第二阶段,我们将主要微控制器从树莓派 Pico 2更换为Firebeetle 2 ESP32-E。这一更换是由于外壳内部空间的问题,尽管这两个板看起来几乎相同大小,但Pico实际上比Firebeetle会更小一点。我们不得不修改外壳设计,使其稍微增大,因为使用Pico需要添加第二块板来充电锂电池。

用FireBeetle ESP32自制一个便携式空气质量检测仪图12

我们选择Firebeetle来解决这个问题,因为它具有由TP4056驱动的内置锂离子电池充电电路,该电路专门为单节锂离子电池设计,是便携设备中可靠且高效的锂离子电池充电解决方案。
步骤5:主要代码
  1. #include <Wire.h>
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_SSD1306.h>
  4. #define SCREEN_WIDTH 128
  5. #define SCREEN_HEIGHT 64
  6. #define OLED_RESET -1
  7. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
  8. const int analogPin = 35; // A3
  9. const int digitalPin = 2; // D2
  10. void setup() {
  11. Serial.begin(9600);
  12. pinMode(digitalPin, INPUT);
  13. // SSD1306 OLED display initialization
  14. if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  15. Serial.println(F("SSD1306 allocation failed"));
  16. for(;;);
  17. }
  18. display.display();
  19. delay(2000); // Pause for 2 seconds
  20. display.clearDisplay();
  21. }
  22. void loop() {
  23. int analogValueRaw = analogRead(analogPin);
  24. int analogValue = map(analogValueRaw, 0, 4095, 0, 1023); // Scale the value to match the Pico's range
  25. int digitalValue = digitalRead(digitalPin);
  26. String airQuality = getAirQuality(analogValue);
  27. Serial.print("Analog Value (Raw): ");
  28. Serial.print(analogValueRaw);
  29. Serial.print(", Scaled Value: ");
  30. Serial.print(analogValue);
  31. Serial.print(", Digital Value: ");
  32. Serial.println(digitalValue);
  33. // Display scaled analog value and air quality condition on OLED
  34. display.clearDisplay();
  35. display.setTextSize(2); // Normal 1:1 pixel scale
  36. display.setTextColor(SSD1306_WHITE); // Draw white text
  37. display.setCursor(0, 10); // Start at top-left corner
  38. display.print("Value: ");
  39. display.println(analogValue);
  40. display.setTextSize(1);
  41. display.setCursor(0, 40);
  42. display.print("Air Quality: ");
  43. display.println(airQuality);
  44. display.display();
  45. delay(1000);
  46. }
  47. String getAirQuality(int analogValue) {
  48. if (analogValue <= 200) {
  49. return "Excellent";
  50. } else if (analogValue <= 400) {
  51. return "Good";
  52. } else if (analogValue <= 600) {
  53. return "Moderate";
  54. } else if (analogValue <= 800) {
  55. return "Poor";
  56. } else {
  57. return "Very Poor";
  58. }
  59. }
复制代码

代码中添加了三个主要库,以使用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 ESP32自制一个便携式空气质量检测仪图13
  • 将Firebeetle的3.3V和GND线连接到MQ135传感器的VCC和GND
  • 然后,我们用两根线将Firebeetle的5V和GND连接到SSD1306的VCC和GND引脚
  • 接下来,用连接线将MQ135传感器的模拟输出和数字输出分别连接到Firebeetle的A3和D2引脚
  • 然后以类似方式将Firebeetle的SDA和SCL引脚连接到OLED屏幕的SDA和SCL引脚
步骤7:电源接线
用FireBeetle ESP32自制一个便携式空气质量检测仪图14

我们使用一块紧凑型14500 3.7V 600mAh锂离子电池,并结合一个保护电路模块(PCM),这是一个小型电路,可防止过充、过放、短路等问题,作为本项目的电源供应。

用FireBeetle ESP32自制一个便携式空气质量检测仪图15

用FireBeetle ESP32自制一个便携式空气质量检测仪图16

我们只需将锂电池正极接到Firebeetle的正极,将锂电池负极焊接到摇臂开关的一端,另一端连接到Firebeetle负极。摇臂开关位于电池与Firebeetle之间,是设备主要开关。
步骤8:机身组装
用FireBeetle ESP32自制一个便携式空气质量检测仪图17

  • 我们首先将OLED屏幕放置在顶部盖内,然后用热熔胶固定显示屏。
  • 在底座内部,将MQ135传感器放入适当位置。
  • 然后,将电池和电源开关固定到位,Firebeetle开发板放置在底座中央,并用热熔胶固定。
  • 确保所有组件都放置正确后,将顶部盖放置到底座上,并用四个M2螺钉固定。
  • 最后,在字母O和X部件背面涂上胶水,然后将它们固定到设备上。

组装过程完成了。

步骤9:最后



我们在城市中的两个不同地点进行了测试:我的屋顶附近和靠近绿地。在绿地中低碳浓度与城市中的高碳浓度形成对比,因此得到了不同读数。

用FireBeetle ESP32自制一个便携式空气质量检测仪图18

用FireBeetle ESP32自制一个便携式空气质量检测仪图19

城市中的读数范围从550到620不等,这取决于区域是否靠近主要道路、工业区或绿树成荫且车辆稀少的绿地。如果我们在气体较少出现的位置进行测试,例如山区或丘陵,值可能会进一步降低。

总体而言,这个项目已经完成,但我希望未来对这个项目进行修改,进一步缩小尺寸,使其更加便携。

原文地址:https://www.instructables.com/Portable-Air-Quality-Meter/

项目作者:Arnov Sharma

译文首发于:DF创客社区

转载请注明来源信息

刘睿鹏  中级技师

发表于 2025-1-13 09:03:17

这里面用的传感器可以呀用SKUSEN0127替代吗
回复

使用道具 举报

夏天阿  学徒

发表于 4 天前

帅帅帅哈哈哈真的帅
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail