导 言
ESP32教程中,我们将检查从C02传感器使用Arduino核心
注意我们将要开发的代码 基于产品维基页上可用的代码
测试使用dFrobotESP32模块集成ESP32开发板.
关于传感器
模拟红外CO2传感器允许测量0至5000ppm的CO2空气富集度,精度为++3传感器操作基础NDIR系统技术(非分布红外线)并包括温度补偿
可操作波段4.5V和5.5V并输出0V和2V之间的模拟信号[1]
模拟电压对应0V表示自检过程检测出错误0V至0.4V之间,它不代表任何测量值,此范围值输出时传感器预热相程持续3分钟
正常操作期间传感器输出0.4V和2V之间的电压,这与C02丰度分别为0ppm和5000ppm相匹配。从产品中可以看到维基电量与CO2浓度有线性关系,这样我们就可以使用简单比例从电压中获取浓缩
电子图理
因为这是准备使用模块, 本教程所需要的电子技术非常简单 。图1显示,我们只需要用5V为设备提供电源并连接数据插针ESP32可读模拟电压
图1电子图理
注意传感器插针上没有任何标签, 所以我们需要执行连接 并计及随带线的颜色照常颜色图案,黑线匹配GND和红色对VCC蓝线对接数据信号
依赖您的ESP32板,它也许能提供传感器从电针上需要的电源或它能向传感器提供足够电流 最佳方法就是使用外部电源本片.
ESP32模拟读数
前几节分析过 传感器输出模拟电压ESP32需要阅读自我们使用Arduino核心后,最容易读取模拟电压的方法就是使用模拟阅读函数并实现ESP32中可以看到来.
写作时模拟阅读函数返回前后不一致值ESP32中可见本片问题正文讨论本片RAYBET游戏网论坛线程最有可能由非线性ADC值(同数转换器)引起
你可以检查IDF文档更多资料和可使用标定方法
因为这些程序复杂度超出此文章范畴, 我们将假设0V至3.3V范围模拟读数的线性自然,这将引入不精确排出测量法, 但教程的主要焦点是如何与传感器交互作用, 而不是解决这些非线性问题
自ESP3212位ADCs集成[2],这意味着我们可以获取0至4095数字值(2)12i模拟电压测量注意用比特宽度介于9至12比特模拟SetWidth函数定义来,但对于此教程,我们将使用12比特的默认值工作
代码转换
本代码不需要包含任何库开始声明插码ESP32将传感器连接成全局变量,使未来更容易改变
int模拟Pin=35
继续设置函数, 我们唯一需要做的就是打开串行连接 输出测量
无效搭建 {serio.begin(115200)}
Arduino主回路上,我们将处理测量工作,定期执行。
第一件事需要做的是从连接传感器的模拟针获取读取做它,我们简单调用模拟阅读函数输入前针数
intadval=模拟Read
如前所述,这将对应0至4095值(ADC12比特),我们需要转换成电压假设ADC线性行为,我们可以用简单比例实现这一点,如下文所示。
注意获取伏特电量 正因如此,我们才存储在浮点上(计小数部分)。
浮电=adcval*
计算电压后 处理多例案例如前所述,如果我们得到0V电压,表示传感器出问题
电压大于0V但小于0.4V表示传感器仍在预热处理中阶段内仍无法测量
{串行.printlnservice.println{//度量处理码}
万一电压等于或大于0.4V
第一,我们需要减到测量电压预热阈值,因为当传感器输出0.4V时,它相当于0ppm的CO2富集度因此,我们需要从测量中消除偏差
float voltageDiference=voltage-0.4;
电压测量和CO2富集关系线性,我们只需应用另一个比例
float concentration=(voltageDiference*5000.0)/1.6;
之后我们将打印获取的CO2浓度和测量电压注意我们打印电压只是为了插图目的和因为我们使用电压打印函数无附加参数,表示浮点数将打印,小数位数只有两位[3]
Serial.print("voltage:")!Serial.print(voltage)!Serial.println("V")!Serial.print(concentration)!Serial.println("ppm");
最终源码见下方内含小二秒间隔量测 避免持续检测传感器
int模拟Pin=35无效搭建 {serio.begin(115200)无效循环 { intadval=模拟Read(analogPin)浮电=adcval*{串行.printlnservice.println{浮电Diference=voltage-04.float concentration=(voltageDiference*5000.0)/1.6!Serial.print("voltage:")!Serial.print(voltage)!Serial.println("V")!Serial.print(concentration)!Serial.println("quot;ppm")!延迟(2000年)}
测试代码
测试代码简单编译并上传ESP32设备执行所有电子布线
如果不能事先为CO2传感器提供电源并等待预热时间,那你应开始获取代码上我们定义的预热消息,图2插图
图2
预热相位
热前阶段后,你应开始测量,图3显示显示测量器取入闭室if you check来接近室内空间期望区间尾
图3
计量封闭室
上图4上,我们可以检查一些测量方法 接近大开窗口可以看出,测量的CO2浓度大为下降
图4
测量靠近开窗
如前所述,因为我们假设线性行为ESP32ADC和由于非线性没有在API中校正,测量值不甚精确并可以改进教程说明我们如何与传感器交互作用和它行为方式,但如果需要精确读取CO2集中度,则使用代码时不能不纠正ADC测量法