Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。
Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。


一种低成本的空气质量监测设备,旨在检测由于交通拥堵或工厂排放而造成的污染热点。

本项目使用的东西
硬件组件
Arduino Nano R3
× 1
NodeMCU ESP8266 分线板
× 1
TGS2600
× 1
TGS2602
× 1
DHT11 温度和湿度传感器(4 针)
× 1
MQ135 系列
× 1
软件应用程序和在线服务
ThingSpeak API
Arduino IDE
Autodesk EAGLE CAD
用于设计容纳传感器的 PCB 的软件
Autodesk AutoCAD
用于设计 PCB 硬件外壳的软件(带传感器)
手动工具和制造机
3D 打印机(通用)
烙铁(通用)
焊锡丝,无铅
助焊剂, 焊接
多功能工具, 螺丝刀
故事
前言
该项目的旅程始于一个“设计思维”项目,其动机是设计一个系统来测量局部空气质量数据,以检测污染热点并提醒通勤者。我们的想法是在某个地理位置部署大量低成本设备,以获取这些数据、分析这些数据并将其用于交通管理和城市规划。尽管这个项目非常有远见和雄心勃勃,但在各个层面上都受到了很多赞赏,并在各种比赛中表现出色,但它并没有真正进入实施阶段。缺乏资金、专业知识和较少的技术机会阻碍了项目的进展。然而,我决定发布这个项目(虽然相当晚 - 在 2018 年开发了这个项目),作为激励感兴趣的黑客的尝试,不仅鼓励学习,而且希望人们继续前进。
硬件概述
项目中的硬件大致分为:
传感器及其与 Arduino Nano 的接口
Arduino Nano 和 NodeMCU 接口
在这个项目中,费加罗TGS2600检查甲烷和一氧化碳,费加罗TGS2602检查氨、硫化氢和甲苯,而不太准确和便宜的 MQ135 检查二氧化碳和氮氧化物。虽然单个传感器用于检测多种气体,但如果您想要更高的准确性和可靠性,最好为每种气体使用专用传感器。
Arduino Nano 和 NodeMCU 的总成本应该低于 15 美元左右,并且将很好地满足我们的基本要求。
传感器:使用 Nano 进行接口和测试
市场上大多数低成本气体传感器都是电化学型接触式传感器。传感元件用于检测某种气体。传感器电导率根据空气中的气体浓度增加/减少。一个简单的电路可以将电导率的变化转换为与气体浓度相对应的输出信号。要对此进行建模,了解数据表和 Rs/Ro Vs PPM 或灵敏度特性非常重要。
用于 TGS2600/TGS2602 传感器与 Arduino 的接口
该传感器需要两个电压输入来检测气体浓度:加热器电压 (VH) 和电路电压 (VC)。该传感器有 4 个端子。两个专用于加热器,以保持传感器中的最佳感应温度,另外两个用于测量与传感器串联的负载电阻器 (RL) 上的输出电压。由于传感器具有极性,因此电路电压需要直流电压。VC 和 VH 均可采用公共电源电路,以满足传感器的电气要求。
应选择负载电阻 (RL) 的值以优化警报阈值,将半导体的功耗 (PS) 保持在 15mW 以下。当 Rs 值等于暴露于气体中的 RL 时,功耗 (PS) 将最高(来源:TGS2600 数据表)。
引脚连接:
1: 加热器
2: 传感器电极 (-)
3: 传感器电极 (+)
4: 加热器

从灵敏度曲线中,我们使用功率回归获得方程的比例因子 (a) 和指数 (b),即 ppm = a*(Rs/Ro)^b。如果您不明白这一点,请参考 Davide 的博客。
此外,Rs = 不同浓度显示气体中的传感器电阻 Ro = 新鲜空气中的传感器电阻
要计算 Ro:
我们知道 a、b 的值对于“空气”(通常始终保持不变)以及 Rs 值,该值可以计算为:
Rs = ( Vc/Vout - 1) x RL
因此,从方程式中:ppm = a*(Rs/Ro)^b,我们得到:
Ro = Rs * sqrt(a/ppm, b)
获取 Ro 的代码位于页面的 code 部分中。请参阅该端以查看代码。
获得 Ro 值后,您现在可以继续计算最终的 PPM 值。为此,请按照下列步骤作:
将原始模拟值转换为 Vout 或 Vrl 电压值
计算 Rs 值
查找 Rs/Ro 比
通过将获得的值代入公式来获取 PPM 值
VRL_F2600 = analogRead(F2600)*(5.0/1023.0);
Rs_F2600 = ((5.0/VRL_F2600)-1)*(RL_F2600);
ratio_F2600 = Rs_F2600/Ro_F2600;
float ppm_CO = CO_A * pow(ratio_F2600, CO_B);
这应该可以帮助您获得以 PPM 为单位的气体传感器值。但是,作为校准的一部分,您可能需要使用 true 值作为参考,并与测量值进行比较。
使用:参考值 = 校准因子 x 测量值
Arduino Nano 和 NodeMCU 接口
虽然传感器硬件及其与 Arduino Nano 的连接并不令人惊讶,而且相当普遍,但 Arduino Nano 和 NodeMCU 之间的接口可能会让一些人感兴趣。这里的目标是确保设备便宜并且应该连接到 Internet。当需要对来自传感器的数据进行采样时,Arduino Nano 就显得尤为必要。气体传感器输出模拟数据,因此 MCU 必须至少有 3 个模拟引脚(因为我们在这里使用了 3 个气体传感器;可以扩展到更大的数量)才能读取这些模拟数据。
由于 NodeMCU 只有 1 个模拟输入引脚 (A0),因此单独使用它并不适合这项工作。为了解决这个问题,最明显的方法是连接 ADC(模数)转换器并完成这项工作,但我选择了一种相当不常见的方法,即连接 NodeMCU 和 Nano(连接到传感器)。我这样做是因为与 ADC 相比,这两种器件都普遍可用且易于使用,因此非常方便。
连接 Nano 和 NodeMCU 非常简单。我们使用“SoftwareSerial.h”库,它允许我们使用 MCU 上的任何一组数字引脚作为我们的 UART 总线。我们直接使用了 Nano 的默认 Rx/Tx 引脚,并分别与 NodeMCU 上的引脚 6 和 5 交叉连接,以建立 UART 通信。
Rx (Nano) <=> Tx (NodeMCU 上的数字引脚 6)
Tx (Nano) <=> Rx (NodeMCU 上的数字引脚 5)
GND (Nano) <=> GND (NodeMCU)
在测试 UART 通信时,我意识到整个数据没有被传输,我也无法对其进行调试。因此,我决定使用标准的 JSON 格式来传输数据。在“ArduinoJson.h”库的帮助下,我可以打包这些数据,发送它,将其存储在缓冲区中,直到收到整个数据,解压缩它,然后将其上传到 ThingSpeak。要了解如何在项目中实施 Arduino JSON,请前往创建者的网站或阅读 GitHub 上的库文档。

注: 这些值是随机的,不会在此图像中描绘传感器数据。
PCB 设计和硬件外壳
使用用户友好的 EAGLE CAD,设计了一个简单的 PCB 来容纳三个气体传感器和 DHT11 温度传感器。您可以在下载部分找到原理图和电路板文件。除此之外,还使用 AutoCAD 设计了一个简单的硬件外壳来容纳传感器 PCB。然后它是 3D 打印的,并一直使用至今。如果您需要访问其他文档,请访问我的 GitHub 代表。
定制零件和外壳
PCB 文件
查找 EAGLE CAD 设计文件 (.brd/.sch)
在 EAGLE CAD 上生成的电路板图像

图表
示意图
显示各种组件之间连接的简单示意图

用于读取和分析 Sensor 数据的代码
用于将传感器数据上传到 ThingSpeak 的代码
查找 Ro 值的代码
用于读取和分析传感器数据Arduino 的代码
将此代码上传到您的 Arduino Nano,并将传感器连接到相关引脚。
#include <ArduinoJson.h>
//Gas Sensor Pins
#define F2600 A1
#define MQ135 A2
#define F2602 A3
//Gas Sensor Load Resistance (RL)
#define RL_F2600 7.5
#define RL_MQ135 10
#define RL_F2602 7.5
/*2600 GASSES*/
float CO_A = 1.144997421;
float CO_B = -0.21687423;
float CH4_A = 1.05777824;
float CH4_B = -0.0795645;
/*2602 GASSES*/
float NH3_A = 0.92372844;
float NH3_B = -0.291578925;
float H2S_A = 0.38881036;
float H2S_B = -0.35010059;
float VOC_A = 0.3220722;
float VOC_B = -0.6007520;
/*MQ-135 GASSES*/
//MQ-135 CO2
float A_MQ135_CO2 = 112.89808;
float B_MQ135_CO2 = -2.868463517;
//MQ-135 NOx
float A_MQ135_NOx = 34.69756084;
float B_MQ135_NOx = -3.422829698;
void setup()
{
Serial.begin(9600); // opens serial port, sets data rate 9600 bps
}
void loop()
{
//Refer to the documentation mentioned on this page to understand this better
float VRL_F2600;
float Rs_F2600;
float Ro_F2600 = 11.26;
float ratio_F2600;
VRL_F2600 = analogRead(F2600)*(5.0/1023.0);
Rs_F2600 = ((5.0/VRL_F2600)-1)*(RL_F2600);
ratio_F2600 = Rs_F2600/Ro_F2600;
float ppm_CO = CO_A * pow(ratio_F2600, CO_B);
float ppm_CH4 = CH4_A * pow(ratio_F2600, CH4_B);
float VRL_MQ135;
float Rs_MQ135;
float Ro_MQ135 = 20.1;
float ratio_MQ135;
VRL_MQ135 = analogRead(MQ135)*(5.0/1023.0);
Rs_MQ135 = ((5.0/VRL_MQ135)-1)*(RL_MQ135);
ratio_MQ135 = Rs_MQ135/Ro_MQ135;
float ppm_CO2 = A_MQ135_CO2 * pow(ratio_MQ135, B_MQ135_CO2);
float ppm_NOx = A_MQ135_NOx * pow(ratio_MQ135, B_MQ135_NOx);
float VRL_F2602;
float Rs_F2602;
float Ro_F2602 = 64.88;
float ratio_F2602;
VRL_F2602 = analogRead(F2602)*(5.0/1023.0);
Rs_F2602 = ((5.0/VRL_F2602)-1)*(RL_F2602);
ratio_F2602 = Rs_F2602/Ro_F2602;
float ppm_VOC = VOC_A * pow(ratio_F2602, VOC_B);
float ppm_H2S = H2S_A * pow(ratio_F2602, H2S_B);
float ppm_NH3 = NH3_A * pow(ratio_F2602, NH3_B);
//Refer to the author's website: https://arduinojson.org/ and read the documentation to understand ArduinoJSON better
DynamicJsonBuffer jBuffer;
JsonObject& root = jBuffer.createObject();
root["CO2"] = ppm_CO2;
root["CO"] = ppm_CO;
root["CH4"] = ppm_CH4;
root["NOx"] = ppm_NOx;
root["NH3"] = ppm_NH3;
root["H2S"] = ppm_H2S;
root["VOC"] = ppm_VOC;
root.prettyPrintTo(Serial);
Serial.println("");
//Minimum delay required for ThingSpeak to update is 16 seconds
delay(16000);
}
附录
项目链接:https://www.hackster.io/256867/atmospheric-air-analyser-c467b1
项目作者:特哈斯沙阿(Tejas Shah)
视频教程:
项目代码:https://github.com/tejas17shah/Atmospheric-Air-Analyser-
SoftwareSerial.h库:https://docs.arduino.cc/learn/built-in-libraries/software-serial/
电路板图像:https://hacksterio.s3.amazonaws.com/uploads/attachments/1004056/first_floor_sensor_room_f_qaUDf2DHDk.png
PCB 文件:https://hacksterio.s3.amazonaws.com/uploads/attachments/1004055/eagle_files_MN3BjVAVYQ.zip
原理图:https://hacksterio.s3.amazonaws.com/uploads/attachments/1004098/schematic_1_Mg1e2qCGdX.jpg

评论