使用Vo模拟输出连接MH-Z19B型CO2传感器

我欢迎所有对室内空气质量感兴趣并希望对其进行控制和管理的人。

我本人最近对此问题开始感兴趣,因此决定用自己的双手去感受CO2传感器MH-Z19B。 我受到许多文章的启发,例如MH-Z19的黑暗面



但是,在任何地方(甚至在说明中)我都没有找到如何使用Vo引脚的方法...

我提请注意:在红外CO2传感器MH-Z19概述一文中提到了这一点:

  • Vo-输出电压3.3V,不超过10mA

一些在线商店,例如“ 二氧化碳传感器CO2 MH-Z19B ”,也提供类似的信息:

  • Vo-输出电压3.3V,不超过10mA

(作为复本)

但是说明( 此处 )指出了更多:

  • Vo 模拟输出 (0.4〜2 V)或(0〜2.5V)

而且,如果您进行更多挖掘,那么说明( 此处 )将更加详细地指示:

  • Vo(Pin2)- 模拟输出 (0.4〜2 V)(0〜3V范围可定制)

我迅速搜寻了一下,发现没有任何关于这种出路的信息! Stirlitz认为奇怪,他很快将此输出连接到ESP8266的模拟输入(对于Arduino,这也很重要),并开始研究。

结论:

  1. 模拟输出上的电压在0.4xx至2.002v之间变化。
  2. 模拟输出重复数字ppm信号的电压。
  3. 当UART命令将ppm范围更改为2k,5k,10k时,Vo转换范围也会相应更改。
  4. Vo = 2,001v的最大值不会因范围而变化,因为转换范围需要以ppm(2/5 / 10k)为单位设置最大值。
  5. Vo的最小值根据范围(α)而变化,并且范围本身以400ppm开始。
  6. 如果选择ADC控制器的实际值,则可以在电压和ppm电平之间获得不错的匹配。 在高达2k的范围内,数字UART信号和模拟Vo转换之间的误差不超过几个ppm单位。
  7. 您可以先使用USB-TTL转换器或使用Arduino +配置传感器(禁用自动校准,然后将400 ... 2000ppm切换到“原始”范围),然后像模拟信号一样使用它。

我如何转换:

[...] const word cADC00v = 3; // ADC = 3 .  0.0v const word cADC04v2k = 235; // ADC = 235 .  400ppm @2k const word cADC04v5k = 174; // ADC = 174 .  400ppm @5k const word cADC04v1k = 153; // ADC = 153 .  400ppm @10k const word cADC20v = 646; // ADC = 646 6.  2.0v word ADC = analogRead(A0); //  10  ADC 0...1023 long Vin = map(ADC, cADC00v, cADC20v, 0, 2001); //  0..3,3v  ,   2,001v long ppm_2k_04_2 = map(ADC, cADC04v2k,cADC20v, 400, 2000); //  Vo  ppm   2k long ppm_5k_04_2 = map(ADC, cADC04v5k,cADC20v, 400, 5000); //  Vo  ppm   5k long ppm_10k_04_2 = map(ADC, cADC04v1k,cADC20v, 400,10000); //  Vo  ppm   10k [...] 

“魔术”数字是通过实验获得的。 它发生得更快,更准确。 当试图在数学上非常准确地计算时,实际上发现了一个很大的误差。

为什么它对我有用(0.4 ... 2.0v而不是0 ... 2.5v)我不知道。 传感器是在几天前购买的,于2019年9月26日生产。 外壳上的压印范围高达5k ppm。

我为什么需要它? (答案为“所以我做错了……”)

好吧...有些人喜欢手持烙铁,但与控制器不是朋友。 对于他们来说,模拟输出至少可以打开/关闭风扇,并且最大程度地-平稳控制排气/进气/换热器的速度。

具体来说,对我来说:在隔壁的房间里,通风系统已经工作了2年,这是我使用可自由编程的工业控制器制造的。 因为 控制器是工业控制器,那么编程系统是特定的,我不确定您是否可以在上面编写自己的UART交换协议。 是的,有一个RS484串行端口可以在ModBus上正常工作,但是此端口已由调度系统占用。

但是有一个免费的模拟输入,可以将其设置为0-10V。 因此,只有30美元左右,您就可以升级通风系统以实现智能节能(仅在必要时通风,并根据需要进行通风)。

PS:代码SoftSerial.readBytes(mhzBuffer,9); 在我的ESP8266上拒绝工作。 他杀死了大约五个小时。 他们这里讨论了这个问题 ,但我稍后再阅读。 我以if (SoftSerial.available() { x=SoftSerial.read(); }样式编写了函数。

Source: https://habr.com/ru/post/zh-CN483826/


All Articles