Doy la bienvenida a todos los que estén interesados en la calidad del aire interior y quieran controlarla y administrarla.
Yo mismo me interesé recientemente en este tema y decidí sentir el sensor de CO2 MH-Z19
B con mis propias manos. Me inspiraron muchos artículos, por ejemplo, el
lado oscuro del MH-Z19 .

Sin embargo, en ninguna parte (incluso en las instrucciones) no encontré cómo trabajar con el pin Vo ...
Llamé la atención sobre esto: en el artículo
Descripción general del sensor infrarrojo de CO2 MH-Z19 , se menciona este punto:
- Vo - voltaje de salida 3.3V, no más de 10mA
Algunas tiendas en línea, como el "
Sensor de dióxido de carbono CO2 MH-Z19B "
, brindan información similar:
- Vo - voltaje de salida 3.3V, no más de 10mA
(como copia al carbón)
Pero las instrucciones (
aquí ) indican un poco más:
- Salida analógica Vo (0.4 ~ 2 V) o (0 ~ 2.5V)
Y si cava más, las instrucciones (
aquí ) indican aún más en detalle:
- Vo (Pin2) - Salida analógica (0.4 ~ 2 V) (se puede personalizar el rango 0 ~ 3V)
Rápidamente busqué en Google y ... ¡no encontré nada sobre esta salida! Extraño, pensó Stirlitz, conectó rápidamente esta salida a la entrada analógica del ESP8266 (para Arduino, esto también es relevante) y comenzó a investigar.
Conclusiones:
- El voltaje en la salida analógica varía de 0.4xx a 2.002v.
- La salida analógica repite el voltaje de la señal digital de ppm.
- Cuando los comandos UART cambian el rango de ppm 2k, 5k, 10k, el rango de conversión de Vo cambia en consecuencia.
- El valor máximo de Vo = 2.001v no cambia dependiendo del rango, ya que el rango de conversión, debe establecer el valor máximo en ppm (2/5 / 10k).
- El valor mínimo de Vo varía según el rango (?), Y el rango en sí comienza a 400 ppm.
- Si selecciona el valor real del controlador ADC, puede obtener una coincidencia decente entre el voltaje y el nivel de ppm. En el rango de hasta 2k, el error entre la señal digital UART y la conversión analógica de Vo no excede varias unidades de ppm.
- Primero puede configurar el sensor usando el convertidor USB-TTL o usando Arduino + (deshabilite la autocalibración y cambie 400 ... 2000ppm al rango de "inicio") y luego trabaje con él como una señal analógica.
Cómo me convertí:
[...] const word cADC00v = 3;
Números "mágicos" recogidos experimentalmente. Sucedió tanto más rápido como con mayor precisión. Al intentar calcular con mucha precisión, matemáticamente, en realidad resultó un gran error.
¿Por qué funciona para mí (0.4 ... 2.0v y no 0 ... 2.5v)? No lo sé. El sensor fue comprado hace un par de días, producción 26 de septiembre de 2019. El rango de hasta 5k ppm está grabado en el estuche.
¿Por qué lo necesito? (la respuesta a "así que habría hecho mal ...")
Bueno ... hay personas a las que les gusta tener un soldador en sus manos, pero no son amigos de los controladores. Para ellos, la salida analógica es al menos encender / apagar el ventilador y, al máximo, un control suave de la velocidad de escape / admisión / recuperación.
Específicamente, para mí: en la habitación de al lado, un sistema de ventilación ha estado funcionando durante 2 años, que hice en un controlador industrial libremente programable. Porque el controlador es industrial, entonces el sistema de programación es específico, no estoy seguro de que pueda escribir su propio protocolo de intercambio UART en él. Sí, hay un puerto serie RS484 que funciona bien en ModBus, pero este puerto está ocupado por el sistema de despacho.
Pero hay una entrada analógica libre que se puede configurar en 0-10V. Y así, teniendo solo alrededor de $ 30, puede actualizar el sistema de ventilación para ahorrar energía de manera inteligente (ventile solo cuando sea necesario y exactamente lo que necesite).
PS: código SoftSerial.readBytes (mhzBuffer, 9); en mi ESP8266 se negó a trabajar. Mató unas cinco horas de su vida.
Lo discutieron
aquí , pero lo leí más tarde. Escribí mi función en el estilo de
if (SoftSerial.available() { x=SoftSerial.read(); }
.