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í:
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:
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.
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.
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:

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í.