Luchtmeter

Het idee

Huizen worden steeds beter geïsoleerd, en alle kieren worden dichtgestopt. Goed voor het milieu en de energie-rekening, maar niet per se goed voor de luchtkwaliteit in het huis. We hebben een ouder huis, dus geen centrale ventilatie met warmtewisselaar. Te weinig ventilatie, te veel (of te weinig) vocht in de lucht, al met al hebben we geen idee hoe goed de lucht in huis is. En daar wil ik nu juist wel een idee van hebben.

Probleem is dat je het langzaam veranderen van de CO2-waarde eigenlijk als mens niet goed merkt. Wat zijn eigenlijk goede CO2-waarden?

  • Echt schone lucht: 350 .. 400 PPM (Parts per Million)
  • Schone lucht in de stad: 700 PPM
  • Stadslucht in woningen: 1400 PPM
  • Maximum waarde in schoollokalen: 4000 PPM
  • Begin problemen met gezondheid: 5000 PPM
  • Korte tijd verdraagbaar: 20.000 PPM
  • Ademhalingsproblemen: 25.000 .. 30.000 PPM
  • Uitgeademde lucht: 40.000 ... 50.000 PPM

Dus, gezocht een meter om de luchtkwaliteit in de gaten te houden... CO2-gehalte, vochtigheid, temperatuur. En misschien ook wel een mogelijkheid om de afzuiger automatisch aan te zetten als de kwaliteit te slecht wordt, én een koppeling naar mijn huis-netwerk (ook voor het bijhouden van de metingen, zoals ik ook doe voor energiegebruik). Niet standaard te krijgen, dus maar eens zelf aan de slag.

Schema
1. Het (simpele) schema

De sensoren

OK, wat wil ik meten: in ieder geval CO2 (koolstof-dioxide), VOC (Volatile Organic Compounds, koolwaterstoffen), luchtvochtigheid.

Temperatuur doe ik al, maar mag er ook bij. En een lichtmeting lijkt me ook wel leuk, geeft bijvoorbeeld 's avonds inzicht of er iemand thuis is. CO2 en temperatuur geeft je gelijk de ingrediënten voor een soort brandmelder.

CCS811 CO2 sensor

Als CO2-sensor en VOC-sensor is de CCS811 van AMS een goed bekend staande sensor, al moet je wel weten hoe er mee om te gaan. Een goede beschrijving is te vinden op de github site van Maarten. Hier kan je ook de software library vinden (voor de Nano, maar ook bijvoorbeeld voor de ESP8266), en de spullen om de sensor naar firmware versie 2.0 te updaten!

CCS811 moduleHet is echter wel een sensor met gebruiksaanwijzing. De sensor meet de CO2 vrij indirect via de VOC waardes, en is dus gevoelig voor andere stoffen zoals alcohol (plezierig testen, met een glas wijn in de hand). Bovendien is elke sensor anders, en moet zichzelf een tijdje inregelen voordat de waardes betrouwbaar zijn. Hierbij moet frisse lucht als referentie gebruikt worden; sluit de CCS811 dus niet gelijk alleen maar op in 'slechte' lucht. En kijk niet vreemd op als de eerste dagen de waarden wat merkwaardig lijken. Meer info in de datasheet, zie de CCS811 technische documentatiepagina van AMS.

CCS811

Metal oxide (MOX) digital gas sensor to detect a wide range of Volatile Organic Compounds (VOCs) for indoor air quality monitoring. Provides eCO2 level (400 ... 32768ppm) or eTVOC indication (0 ... 32768ppb). Accuracy: ???

BME280

Digitale sensor voor relatieve luchtvochtigheid (RH), temperatuur (°C) en luchtdruk (hPa).

  • Vochtigheid: 0...100 % RH, ±3% absolute accuracy
  • Temperatuur: -40...+85 °C, ±0.5 °C absolute accuracy
  • Luchtdruk: 300...1100 hPa, ±1.0 hPa absolute accuracy

De sensor is ook wat gevoelig voor temperatuur en luchtvochtigheid, maar kan hiervoor corrigeren als'ie daar de waarden van weet. En daarom ook de BME280 sensor, waar ik die waarden meet en naar de CCS811 'verscheep'.

Ik gebruik een kant-en-klare module, de losse chip is voor een leek niet te hanteren. Let op, de sensor heeft 3.3 Volt nodig, en is niet geschikt voor 5 Volt. Voor de I2C en voeding is er dus een level-converter van 5 Volt naar 3.3 Volt nodig, zie verderop bij I2C.

BME280

BME280 moduleHad in een kitje de DHT11 gekregen, maar dat is als vochtigheidssensor niet veel soeps. De DHT22 schijnt al wat beter te zijn, maar toch.

Volgens de recensies is er een betere optie: Bosch Sensortec maakt een mooie humidity-sensor, de BME280. Heeft ook gelijk een temperatuursensor en luchtdrukmeter, en laag stroomgebruik.

Ook hier gebruik ik weer een kant-en-klare module. Deze kan overigens wel 5 Volt aan (ook 3.3 Volt), dus hangt direct aan de Arduino Nano.

Andere sensoren

Lichtsensor: gewoon een LDR (lichtgevoelige weerstand) naar aarde, met een 6.8 kOhm weerstand naar de plus, en aangesloten op een analoge ingang van de Nano. Hoeft niet erg precies te zijn, een licht-donker indicatie is genoeg. Wel nog een 10 µF condensator over de sensor naar aarde, om 50/100 Hz van kunstlicht wat uit te filteren.

Prototype luchtmeter
2. Functioneel prototype op breadboard

De hardware

Gebaseerd op hetzelfde concept als meer kleine besturingen die ik maak: de Arduino Nano als kern.

Eerst een prototype gemaakt met losse draden op een breadboard (figuur 2), en de eerste software versie gemaakt om te testen. Daarna met stukjes flatcable direct aan de Nano gesoldeerd (gaat toch niet om hoge frequenties), zodat het geheel makkelijk in een behuizing kan worden gevouwen. Dit geheel is te zien in figuur 3, al mist de piëzo-buzzer hier bijvoorbeeld nog.

Display, LEDs en knoppen

Het LCD is een LCM-X01602Dxx module met 2 regels van 16 tekens, gebaseerd op de standaard Hitachi HD44780 controller. Besturing gaat met 6 lijnen (4-bit mode, plus enable en read/write), en natuurlijk voeding en aarde. Het LCD is makkelijk aan te sturen met de standaard LiquidCrystal Arduino library.

De drie knoppen hangen direct op de Arduino inputs, waarbij ik de in de Nano ingebouwde pull-up weerstanden activeer. De 'ontdendering' gebeurt in software, waarbij ook verschil wordt gemaakt tussen een normale en een lange indruktijd. Bij langere draden zou ik wel een condensator van 0.1 µF tussen de schakelaar en ground hangen, om het oppikken van stoorsignalen te voorkomen.

De status wordt ook snel weergegeven door een 2-kleuren LED (rood/groen; oranje als alletwee aan); geeft snel de luchtkwaliteit weer als goed, matig, slecht. Daarnaast heb ik ook zo'n piëzo-keramisch schijfje als luidsprekertje gebruikt, zodat het systeem piepjes kan geven als de waarde slecht wordt. En ik heb een uitgang voor een Solid-State Relais (SSR), waarmee ik een afzuiger aan kan zetten.

I2C

Prototype
3. Gesoldeerd (90%), maar nog niet in een behuizing

De 'luxere' sensoren (de CCS811 en BME280) hangen aan de 4-draads I²C-bus (clock, data, voeding, aarde). Ook heb ik hier een EEPROM 32Kx8 geheugenchip AT24C256 voor logging van gegevens in stand-alone mode (als'ie niet aan mijn huis-netwerk hangt); de Nano legt elke 5 minuten de meetwaarden vast in het bovenste chipje op foto 3. Dit is de basis voor de grafiek (4) verderop.

Level-converter voor CCS811, is 3.3 Volt. Problemen met printje van Banggood, ontwerpfout in hun converter (printspoor). Nog uitwerken.

Netwerk-interface

De interface naar mijn Raspberry Pi home control system. De Raspberry kan via deze verbinding alle sensorwaardes uitlezen en opslaan, en eventueel iets mee doen. Ook kan hij bijvoorbeeld de grenzen instellen wanneer de LED naar oranje of rood gaat. Verder kan de Raspberry boodschappen van een regel op het schermpje laten verschijnen. De luchtmeter wordt gelijk via deze interface gevoed, heeft dus geen eigen 5-Volt voeding nodig.

Tekst nog verder uitwerken...

De software


Modulaire opbouw. Netwerk low-level op basis van interrupts als in mijn ander Home-control systemen; Arduino main loop waarin alle taken gescheduled worden. Verder uit te werken.

Human Machine Interface

LCD met keuze van weergegeven waardes, keys en ontstoring, LED. Opslag/restore van instellingen met long-press. Nog uitwerken.

Gebruikte libraries

LCD: LiquidCrystal, CCS811 van Maarten, BME280I2C, Wire voor de I2C, EEPROM voor settings-opslag. Nog uitwerken.

Interrupts op de Nano

De Arduino gebruikt standaard zelf de seriële poort voor debug/print mogelijkheden, en dit loopt op basis van interrupts. Ook een aantal andere functies gebruiken interrupts. Wat nu als je ze zelf ook wilt gebruiken? Ik wil de seriële poort gebruiken voor mijn home control netwerk; en de afhandeling in mijn eigen interrupt-routines uitvoeren. Dat zou kunnen botsen met het gebruik van Arduino van deze poort...

Het blijkt dat als je maar niet de seriële module gebruikt, deze ook niet meegelinkt wordt en dus niet botst met je eigen interrupt-routines. Dus geen Serial.xxx functies gebruiken (ook niet in libraries; ik moest de css811.cpp file hierop aanpassen, al is deze er al wel op voorbereid). De interrupt-routines kan je vervolgens gewoon in C(++) schrijven, al moet je ze wel voorzien van een aanwijzing voor de compiler (ISR keyword vervangt de normale functie-declaratie void interruptnaam(void)). Hier een eenvoudige versie van een transmit interrupt routine (transmitPtr en transmitCount worden in het hoofdprogramma in een transmit-functie gezet):

ISR(USART_UDRE_vect) {        // Transmit interrupt
  if (transmitCount) {        // Still data in buffer?
    --transmitCount;
    UDR0 = *transmitPtr; transmitPtr++;
    if (transmitCount==0) {   // Last char: disable IRQ
      USART_TRANSMIT_DISABLE();
      transmitPtr = nullptr;  // Signal we are ready
    }
  }
}

Luchtmeting
4. Luchtmeting over 4 dagen

Soortgelijk voor de binnenkomende tekens op de poort. Nog uitwerken.

Uitleg metingen/plaatje

Zie figuur 4. Klippen van VOC-waardes is mijn 'fout' (sla maar 8 bits op, foutje in de schaalfactor in de software). De meting loopt over 4 dagen: de lichtmeting (onderste lijn) laat het dag-nacht ritme zien aan de hand van de lichtmeting; overdag begonnen en geëindigd. Midden februari, de dagen waren nog kort... De eerste hoge piek komt door alcohol (door de spiritus bij het streep-vrij ramen wassen). Nog verder uitwerken.

Te doen

  • Een mooie (3D-printed?) behuizing maken...
  • En netjes aan de muur schroeven.