Sensores de CO2

257 views
Skip to first unread message

Rafael Luque Leiva

unread,
Feb 15, 2021, 8:21:47 AM2/15/21
to FPGAwars: explorando el lado libre
Hola a todos.

Estoy siguiendo, junto con mis hijos, el tutorial de electrónica digital con FPGAs libre de Obijuan. He de deciros que nos está encantando y los niños son capaces de seguir bastante bien todas las explicaciones. En definitiva, el tutorial es buenísimo. Muchas gracias por crearlo y compartirlo.

Ahora estaba pensando en nuevos retos y quería hacer algún tipo de "proyecto final de curso" que nos sirviera para aplicar lo aprendido y para "crear" algo más ambicioso, aunque realizable.

Dados los tiempos pandémicos en que nos encontramos, había pensado en un sencillo monitorizador de CO2, para saber cuándo una estancia tiene el aire enrarecido y hay que proceder a su ventilación. Habíamos pensado en algo sencillo, con unos LEDs tipo semáforo y unos displays LCD de 7 segmentos para mostrar la lectura de las partes por millón.

Quería preguntaros si conocéis proyectos parecidos en los que podamos fijarnos y, especialmente, sobre si habéis trabajado con sensores de CO2 y tenéis alguna recomendación. Por el objetivo didáctico que tenemos, había pensado adquirir uno muy barato, aunque haya que sacrificar algo de precisión.

Gracias y un saludo.

Democrito

unread,
Feb 15, 2021, 5:23:22 PM2/15/21
to FPGAwars: explorando el lado libre
Hola Rafael,

Hace muchos años probé un sensor de gas, y hace tanto tiempo que no recuerdo de qué tipo era. Lo hice con Arduino, para probar y nada más, no lo usé para ningún proyecto funcional, y lo que recuerdo es que la lectura era analógica. He estado echando un vistazo a este tipo de sensores ahora y he visto que los hay baratos (por menos de 4 euros) tanto del tipo analógico como digitales.

Una de las cosas muy buenas que tiene el mundo de Arduino es que hay muchísima información sobre proyectos concretos y muy bien explicado en el que además de darte una biblioteca con las funciones automatizadas, te explica lo esencial de cómo funciona el periférico que quieras poner en marcha.

Cuando quiero usar un periférico (sensores por ejemplo) y conectarlo a una FPGA primero lo monto en Arduino (y me informo y todo eso), le saco las señales a través de PulseView y luego hago un diseño en FPGA para que pueda tener un funcionamiento igual (dar esas mismas señales).

Analógico:

Si el sensor de CO2 tiene salida analógica puedes usar un conversor analógico digital. En la colección Jedi existe uno. Sólo has de tener en cuenta que las entradas analógicas de la Alhambra (si es la placa que estás usando) soportan hasta 3,3V. Si el sensor da como rango 0..5v habrá que poner un divisor de tensión donde puedes usar una resistencia variable y ajustarla para esta función, en modo de división de tensión.

divisisor de tensión con potenciómetro.PNG
Una vez ajustado, ya puede entrar por la "Entrada analógica" la tensión del sensor con rango 0..5v y por la salida tendrás el equivalente a 0..3.3v. Está claro que sólo si este fuese el caso. El valor de la resistencia variable que usaría rondaría los 5K.


Información sobre sensores de gases analógicos (Arduino) : https://www.luisllamas.es/arduino-detector-gas-mq/

Digital:

Como ejemplo para Arduino de sensor digital (si pongo enlaces para Arduino es por la estupenda información que dan) tienes como opción este que funciona por I2C: https://www.luisllamas.es/medir-calidad-del-aire-y-co2-con-ccs811-y-arduino/

El problema está en que todavía no existe una forma universal de manejar el I2C sin importar la curvatura de aprendizaje. Cada periférico (sensores en nuestro caso) necesita una serie de configuraciones y formas de acceder a la información, el símil es como cuando metemos una biblioteca ya hecha en Arduino. Aquí te hago una propuesta: Si te decides por usar uno digital, me dices cuál, me lo compro, lo pruebo y te hago un módulo para Icestudio. Esto me serviría de excusa para sacar módulos interesantes I2C para Icestudio.

Si quieres ver un poco sobre manejo de I2C te dejo este enlace, sólo es para hacerte una idea (primero pruebo con el ADC y luego pruebo con un magnetómetro) : https://groups.google.com/g/fpga-wars-explorando-el-lado-libre/c/ZyD4azqhqFI

Saludos.


Democrito

unread,
Feb 15, 2021, 5:32:51 PM2/15/21
to FPGAwars: explorando el lado libre
Acabo de leer un comentario de Obijuan en otro hilo en el que dice que se puede usar hasta 5V... Si es así olvida lo del divisor de tensión. Yo ponía el potenciómetro entre 0 y 3.3 de la propia Alhambra y me salía el rango 0..255. Sea como sea, genial que se pueda usar todo el rango.

Juan Manuel Yañez

unread,
Feb 16, 2021, 3:57:56 AM2/16/21
to FPGAwars: explorando el lado libre
Hola Rafael

Coincido contigo en que el tutorial de Electrónica Digital de Obijuan no tiene precio. Mi niña de momento sólo tiene año y medio, pero me encantaría hacer lo mismo que tú el día de mañana y disfrutar aprendiendo con ella.

Un saludo

Rafael Luque Leiva

unread,
Feb 16, 2021, 4:02:55 AM2/16/21
to FPGAwars: explorando el lado libre
Muchas gracias por una respuesta tan elaborada.

Muy buena idea lo de comenzar con la solución basada en Arduino antes de probar con FPGA. 

De hecho, lo que venimos haciendo, en parte porque me parece interesante didácticamente y en parte porque los RRMM les trajeron una Raspberry Pi 400 (https://www.raspberrypi.org/products/raspberry-pi-400/) que tiene los pines GPIO en la parte de  detrás del teclado, es probar con ejemplos de "informática física" programando con Scratch 3 en la Raspberry Pi 400 y conectando a través de GPIO con pequeños circuitos en placas de inserción. Después, estamos tratando de hacer el equivalente sin programación, en este caso con la FPGA. Quiero que vean la relación entre los dos niveles de abstracción.

Vistos los precios de los sensores, creo que voy a comprar tanto versiones analógicas como digitales y así aprendemos a manejar ambos. 

Si te pones con el módulo de Icestudio para el CCS811 sería estupendo.

Gracias de nuevo por la ayuda.

Rafael Luque Leiva

unread,
Feb 16, 2021, 4:18:23 AM2/16/21
to FPGAwars: explorando el lado libre
En mi caso tienen 6 y 8 años. Tengo una niña de 4 años que todavía la veo pequeña para esto, aunque trato de que también ponga leds y resistencias en su mini place de inserción porque le resulta divertido.

Los míos todavía se pierden en algunos momentos, pero para mi lo más importante es que se lo pasen bien y que disfruten de esa sensación de crear algo que funciona con sus propias manos y utilizando el conocimiento disponible gracias a la comunidad. Que le pierdan el miedo a la tecnología y vean que podemos ponerla a nuestro servicio (y no al revés).

Seguro que en muy poco tiempo podéis disfrutar juntos cacharreando.

Devta Singh Khalsa

unread,
Feb 16, 2021, 4:20:41 AM2/16/21
to fpga-wars-explora...@googlegroups.com
Demócrito, muchísimas gracias por dedicar tu tiempo a una respuesta tan detallada y con tanto cariño.
Así da gusto.
Muchas gracias.

Voy a ver si puedo probar uno de esos sensores de CO2

Un saludo

Devta Singh Khalsa
http://devta.wordpress.com/ 
http://circulodesanacion.com
http://medicosdelcielo.org

Cantarranas,2
19413 Villaviciosa de Tajuña
Guadalajara / Spain


--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/d0551bc2-9a9a-4ca3-89b0-8dbf6a68f27cn%40googlegroups.com.

Ximo Catala

unread,
Feb 16, 2021, 4:28:13 AM2/16/21
to fpga-wars-explora...@googlegroups.com

Hola,

Por si te sirve de inspiración, desde IoTopenTech (TTN Madrid) han hecho algo similar (usando microcontrolador)

https://github.com/IoTopenTech/TTNMAD_CO2_FREE

Un saludo

El 15/2/21 a las 13:26, Rafael Luque Leiva escribió:
--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.

Democrito

unread,
Feb 16, 2021, 3:45:26 PM2/16/21
to FPGAwars: explorando el lado libre
Acabo de comprar dos cacharrillos en aliexpress a este vendedor: https://es.aliexpress.com/item/32903358923.html

Ahora a ver lo que tarda en llegar...

Democrito

unread,
Apr 17, 2021, 5:36:14 PM4/17/21
to FPGAwars: explorando el lado libre
Hola Rafael,

Han pasado dos meses y medio desde que me impliqué en este proyecto con la parte digital (utilizando el sensor CCS811). Espero que con la parte analógica no hayas tenido problemas. Te adjunto dos circuitos, el módulo y un ejemplo a través del serial, ambos han de ir acompañado del fichero con extensión .list que también adjunto.

La tardanza para crear este módulo I2C es debido a que "me encontré la horma de mi zapato". Es un circuito que toma decisiones y eso me obligó a crear un pequeño microcontrolador especial para I2C. En realidad esta parte es algo que ya quería hacer como proyecto y gracias a este módulo ha sido mi primera vez. Sobre este tema lo dejo como "Post Data" porque es demasiado técnico.

Funcionamiento:

Fíjate que yo uso las patillas D12 y D13 de la Alhambra para el I2C. Tú ponlas donde más cómodo te sea. La alimentación que he usado es de 3.3V. La patilla "WAK" hay que llevarla a masa, esto es importante. Tomas el ejemplo que adjunto en este post, lo subes y a través del terminal serie ves los datos. Al comienzo no saldrá nada durante 40 segundos, así que paciencia con ello porque da la sensación de que no funciona, pero sí funciona, sólo que requiere ese tiempo. Comenzará a salir datos a intervalos entre 5 y 8 segundos. Transcurrido unos 10 minutos verás algo así:

datos_de_salida.PNG

La primera columna son los ppm de CO2 y la segunda columna son los ppm de compuestos aromáticos (TVOC).
El rango de ppm de CO2 va de 400 hasta 8192, por encima o por debajo de estos valores el sensor los recorta. Lo mismo para los compuestos aromáticos (TVOC) que tienen un rango de 0 a 1187 ppm.

Si tomamos el Serial Plotter del IDE de Arduino. Podremos ver este tipo de gráfica:

ccs811_plotter.PNG

La gráfica azul es el CO2 y la roja representa los valores de TVOC. El la línea temporal marcada como 100, 200, 300... viene a representar los minutos, donde 100 son 10 minutos por ejemplo, o al menos así es como lo he interpretado.

ccs811_plotter_2.PNG

En esta segunda gráfica (es continuación de la anterior) he señalado dos crestas y una zona. La número 1 es un soplido suave que le di al sensor desde la distancia de un brazo; la número 2 es un segundo soplido a la misma distancia e intensidad. Y la zona número 3, es cuando abrí la ventana para que entrase aire de la calle y se aprecia las turbulencias. Hay que tener en cuenta que durante las pruebas estaba usando una estufa de butano y produce CO2 (todavía hace frío por aquí).

La parte I2C funciona con tan solo 10KHz cuando en realidad debería ir a 100KHz, y es debido a que el módulo que controla el I2C (dentro del ICE) no tiene en cuenta todas las premisas del protocolo I2C y entre ellas está el que el esclavo puede mantener a nivel bajo la línea SCL si ve que no le da tiempo a recibir o escribir datos. Esta es una manera de avisar al maestro I2C de que "pare el carro" unos instantes. No es normal que suceda esto, de hecho he usado otros I2C en el que esto nunca me ha sucedido, pero este módulo cumple a rajatabla el protocolo I2C y por lo que se ve lo necesita hacer. La solución a este problema (en el futuro arreglaré esta parte) fue bajar al máximo la velocidad de I2C (velocidad mínima según el Datasheet del CCS811). Me encontré en un foro en inglés, que a otra persona que usaba este módulo desde una Raspberry PI (no recuerdo si con librería o yendo a pelo) le pasaba lo mismo y usaba esta mínima frecuencia.

Cualquier cosa aquí me tienes.

Saludos.

Post Data:

Para quien sienta curiosidad sobre el "microcontrolador" especial para I2C decirles que ocupa algo menos de 300 luts y permite una frecuencia máxima alrededor de 120MHz, me refiero sólo a esa parte.

mController_I2C.PNG

El ICE va acompañado de un archivo de extensión .list (dentro está comentado) que es donde tiene las instrucciones a ejecutar. Dejo un esquema general de cómo es el comportamiento para el CCS811:

esquema sensor css811.PNG
El pequeño micro (pensado para enviar paquetes de datos) al que he llamado "Atto" se compone de las siguientes instrucciones (instrucciones máquina):

- (FF) Enviar un grupo de datos para escribir en el I2C (de cualquier "anchura), en este caso para facilitarme la vida son 256 bytes máximo. [Siempre va precedido de "CC" con la cantidad de datos a leer.]
- (EE) Permite guardar un dato externo en una zona de la memoria, la que tu quieras (son 256 posiciones de memoria). Esto es útil por ejemplo en el ADC de las Alhambras decir qué canal quieres.
- (AA) Salto de línea directo, en plan "goto" del BASIC.
- (BB) Salto condicional; lo hace comparando (bne ---> saltar si no es igual) un registro interno cargado previamente en la memoria con otro registro externo en el circuito, éste último es cargado por el I2C.
- (DA) Permite sacar un byte de salida con propósito general.
- (CC) Existe un registro que se puede cargar con cualquier valor y tiene dos funciones: salto condicional (bne) y decir cuántos bytes hay que leer.
- (DD) Delay en ms, pero cada unidad son 10ms.

En el interior del fichero "ccs811.list" está todo comentado.

Este pequeño micro fue diseñado sólo para resolver situaciones en las que hay que tomar decisiones según las condiciones que vaya surgiendo y que con electrónica tradicional se volvía muy complejo. Para la gran mayoría de I2C que hay en el mercado no es necesario implementar algo así.

Democrito

unread,
Apr 17, 2021, 5:40:23 PM4/17/21
to FPGAwars: explorando el lado libre
Se me olvidó adjuntar los ices...
CCS811.zip

Democrito

unread,
Apr 17, 2021, 6:01:20 PM4/17/21
to FPGAwars: explorando el lado libre
Para evitar las turbulencias he probado con cierto éxito poner un trozo de papel de cocina (o fieltro) sobre el sensor (bien pegado al sensor) para aumentar la estabilidad de los datos. El papel de cocina o un fieltro permite el intercambio de gases.

Se me olvidó comentar que según el datasheet el CCS811 necesita 20 minutos para calentar una cosa que tiene como referencia y que a partir de ese momento los datos son fiables. Por otra parte si lo cambias de lugar, el datasheet dice que hay esperar 78 horas para dar datos fiables. A mí esto me parece una exageración de tiempo. Hay que tener en cuenta que es muy económico e intuyo que para no gastar en materiales raros y caros han creado un software interno inteligente en que realiza cálculos y compara con el tiempo. Así que el precio es ese, el tiempo invertido para dar datos fiables.

Carlos García

unread,
Apr 18, 2021, 2:25:14 AM4/18/21
to FPGA-WARS: explorando el lado libre
Está chulísimo, enhorabuena! Muchas gracias por compartirlo :D

On Sun, Apr 18, 2021 at 12:01 AM Democrito <spo...@gmail.com> wrote:
Para evitar las turbulencias he probado con cierto éxito poner un trozo de papel de cocina (o fieltro) sobre el sensor (bien pegado al sensor) para aumentar la estabilidad de los datos. El papel de cocina o un fieltro permite el intercambio de gases.

Se me olvidó comentar que según el datasheet el CCS811 necesita 20 minutos para calentar una cosa que tiene como referencia y que a partir de ese momento los datos son fiables. Por otra parte si lo cambias de lugar, el datasheet dice que hay esperar 78 horas para dar datos fiables. A mí esto me parece una exageración de tiempo. Hay que tener en cuenta que es muy económico e intuyo que para no gastar en materiales raros y caros han creado un software interno inteligente en que realiza cálculos y compara con el tiempo. Así que el precio es ese, el tiempo invertido para dar datos fiables.

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.

Rafael Luque Leiva

unread,
Apr 18, 2021, 7:00:42 AM4/18/21
to fpga-wars-explora...@googlegroups.com
Gracias por compartir este trabajo y por las explicaciones tan detalladas.

Nosotros completamos una versión inicial no FPGA con el ESP8266 para
controlar sensor de CO2, sensores de temperatura, humedad y presión,
un pequeño OLED y unos LEDs. Me viene muy bien esta aportación, así
retomo el tema de FPGAs de cara al verano ;-)

Muchas gracias.


El dom, 18 abr 2021 a las 8:25, Carlos García
(<carlosga...@gmail.com>) escribió:
> Has recibido este mensaje porque estás suscrito a un tema del grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
> Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/fpga-wars-explorando-el-lado-libre/zpN-ueBAqHE/unsubscribe.
> Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
> Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/CAJCftXV5-T_sSxd4H_%3D0K48aKvDQ9JWDCan1OR0uAJ-87d8i1A%40mail.gmail.com.



--
Rafael Luque

OSOCO - http://osoco.es
La empresa de los programadores profesionales

Avda. de Quitapesares, 17. Planta 1 Izquierda.
Edificio Ferbocar - Polígono Villapark
Villaviciosa de Odón, E28670 Madrid

Democrito

unread,
Apr 19, 2021, 6:21:44 PM4/19/21
to FPGAwars: explorando el lado libre
Carlos García: Me alegra verte por aquí de nuevo!

Rafael: Me gustaría saber qué sensor barométrico has utilizado, y si aparte has usado otros (de humedad y temperatura) también me gustaría saber cuáles son. Gracias!

Democrito

unread,
Apr 19, 2021, 6:32:42 PM4/19/21
to FPGAwars: explorando el lado libre
Una aclaración sobre el post de arriba. Pongo dos gráficos que se pueden conseguir desde el IDE de Arduino  con el Serial Plotter, pero los datos los daba la FPGA (no un Arduino). De la misma manera que podemos usar el "Monitor Serie" que tiene el IDE para enviar y recibir datos; aunque yo ahora prácticamente uso el que viene en Icestudio y para ver o escribir "datos en crudo" me voy al ScriptCommunicator.

Democrito

unread,
Apr 24, 2021, 3:05:10 AM4/24/21
to FPGAwars: explorando el lado libre
He conseguido añadir la función de que si el esclavo I2C "pisa" la señal SCL (mantener en estado bajo), el maestro I2C se espera en el envío de datos. Ha sido sólo añadir una puerta AND y una NOT que compara el estado de la salida SCL con la que corresponde en ese momento y si son diferentes mantiene reseteado el reloj del I2C , pero sin cambiarlo de estado, sólo "congelando" dicho estado. Los que conozcáis el protocolo I2C podréis identificar y verificarlo en el siguiente gráfico esos momentos. En la zona derecha se produce de forma muy exagerada:

slave_i2c_tread_clk.png
Ahora ya funciona a 100KHz y también se puede poner a 400KHz (máxima velocidad según el Datasheet). Por otra parte la espera de 40 segundos para que comience a salir los datos ahora se ha reducido a 10 segundos, 5 de ellos los pongo yo para que permita iniciarse el periférico.

Otra cosa que le he añadido ha sido que en los bytes de escritura los ACK sean transparentes y reales (antes los forzaba), es por eso que en alguna ocasiones al terminal el ciclo de ACK se produce un corto respingo, que es lo que realmente hay en la línea SDA.

Me he dado cuenta hoy que el módulo que subí a GitHub y lo que adjunté internamente tenía otro nombre de pruebas anteriores que hice con el ADC, ahora todo eso está corregido, con su nombre e imagen correspondiente, aunque esto no afecta al funcionamiento.

He re-subido a GitHub todas las correcciones y modificaciones: https://github.com/Democrito/repositorios/tree/master/Sensors/I2C/CCS811

Saludos. 

Democrito

unread,
Apr 27, 2021, 3:42:01 AM4/27/21
to FPGAwars: explorando el lado libre
Sólo para que quede constancia:

He vuelto a re-subir este diseño a GitHub para evitar tener que usar un archivo externo (.list) como memoria, ahora ya lo lleva integrado dentro del circuito.

Mientras se diseña, tener un archivo externo es muy cómodo para editar y no me acordé de que dicho archivo se puede meter directamente dentro del circuito.

Saludos.
Reply all
Reply to author
Forward
0 new messages