CO2-Sensor gegen Corona: Version mit Arduino UNO und Sensirion SCD30

Mit ein paar preiswerten Arduino-Komponenten und einem leider nicht ganz billigen, aber schnellen und genauen CO2-Sensor von Sensirion kann man in ein paar Stunden ein CO2-Messgerät mit LED-Anzeige basteln.

Das fertige CO2-Messgerät

Was braucht man alles dafür?

  1. einen Arduino UNO
  2. ein Multi-Function-Shield (das gibt’s ab ca. 1,50 € bei Aliexpress oder für ein paar Cent mehr bei Ebay o.ä.)
  3. eine kleine Lochrasterkarte
  4. einen CO2-Sensor SCD30 von Sensirion, z.B. bei digikey
  5. ein Level-Converter-Board, weil der SCD30 nur mit I²C-Signalen bis max. 3.0V betrieben werden darf (das gibt’s für ca. 1.- € für 10 Stück in China oder für ein paar Cents mehr bei Ebay o.ä.)
  6. Stift- und Buchsenleisten. Wenn man nichts daheim rumliegen hat und sowieso was bestellen muss, dann kauft man am besten „Arduino stacking headers“ bei Adafruit, digikey, eckstein-shop o.ä.
    Man kann aber auch ganz ordinäre Stift- und Buchsenleisten nehmen, so wie ich es getan habe; man muss nur etwas mehr löten
  7. eine Siliziumdiode und einen Widerstand, ca. 1k, um das High-Potential des Level-Converters von 3.3V auf unterhalb 3.0V zu senken
  8. Ein bisschen Draht, isoliert und blank, und eine Lötstation
  9. und später für die Stromversorgung des Messgeräts ein USB-Netzteil oder ein Netzteil, das an den Hohlstecker des UNO anschließbar ist
UNO, zugeschnittene Lochrasterkarte und MFS (Multi-Function-Shield)

Zuerst schneidet man die Lochrasterkarte zu. Den rechten oberen Stecker am Arduino UNO muss man dabei aussparen, weil sich die Arduino-UNO-Entwickler – aus welchem Grund auch immer – dazu entschlossen haben, diesen Stecker nicht im 100-MIL-Raster zu platzieren…

Lochrasterkarte mit angehefteten Stiftleisten

Im nächsten Schritt werden die Stift- und Buchsenleisten auf die richtige Anzahl von Pins abgelängt.

Dann steckt man die Buchsenleisten auf die Unterseite des MFS auf und darauf die Lochrasterkarte. An der Unterseite der Lochrasterkarte werden dann die Stiftleisten angeheftet, aber jeweils nur an 2 Stellen mit wenig Lötzinn, so dass man sie noch in der Lage korrigieren kann!

Löten des rechten oberen Steckverbinders

Als nächstes steckt man alles zusammen. Die Buchsen- und Stiftleiste für den rechten oberen Steckverbinder nicht vergessen!

Jetzt nochmal alles zurechtbiegen und dann gemütlich alle Verbindungen löten. Wenn man alles richtig gemacht hat, dann sollten die Steckverbinder komplett frei von mechanischen Spannungen sein.

Wenn alles passt, dann sollte die rechte Seite ungefähr so aussehen und sich leicht wieder abstecken lassen
So sollte die linke Seite aussehen

Jetzt trennt man wieder alles voneinander und lötet den SCD30 und den Level-Converter auf die Lochrasterplatine:

Lochrasterkarte mit SCD30 und Level-Converter

Anschließend kommen die Siliziumdiode und der Widerstand drauf. Die Anode der Siliziumdiode wird mit dem 3,3V-Ausgang des UNO verbunden und die Kathode mit dem 3V-Anschluss des Level-Converters. Der 1k-Widerstand kommt zwischen Kathode und GND rein.

Lochrasterkarte mit Diode und Vorwiderstand

Wenn man die beiden Bauteile durchgesteckt hat, dann verdrahtet man die Unterseite so wie es auf dem nächsten Bild zu sehen ist. Der SCD30 wird übrigens mit 5V betrieben:

Unterseite der Lochrasterkarte mit Verdrahtung

Die beiden Anschlüsse für I²C (SCL, SDA) liegen auf dem losen Stecker und deswegen habe ich dafür jeweils ein kurzes Stück flexible, isolierte Litze verwendet, um keinen Drahtbruch zu riskieren.

Jetzt kann man alles zusammenstecken und über ein USB-Kabel mit dem PC verbinden.

Wer noch nie was mit Arduino und Co. gemacht hat, der installiert am besten die klassische Entwicklungsumgebung, die man hier herunterladen kann.

Man muss sich ein bisschen einlesen, aber das geht normalerweise recht schnell.

Um das Multi-Function-Shield und den SCD30 in der Software bequem ansprechen zu können, lädt man am besten passende Bibliotheken herunter, die es für beide Einheiten glücklicherweise gibt und die man über die Links in den Kommentaren in folgendem Beispielprogramm findet.

Das folgende Programm kann man einfach kopieren und in die Arduino-Umgebung einfügen und übersetzen.

Das Beispielprogramm zeigt, wie man den Sensor ausliest und die CO2-Konzentration anzeigt.

Wenn die CO2-Konzentration über dem Wert CO2ALARMVALUE liegt, der laut Umweltbundesamt auf 1000 ppm eingestellt werden sollte, dann beginnt das MFS zu piepen.

Spätestens jetzt sollte man lüften! Wen das Piepen stört, der kann auf eine Taste drücken, dann hört es auf, aber nur so lange, bis der CO2-Wert wieder unterhalb des Grenzwerts liegt. Bei der nächsten Überschreitung piept es wieder.

// CO2-Messgeraet mit SCD30 und Arduino UNO, DM1CR, 1.11.20 
#include <MultiFuncShield.h> // https://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/
#include <Wire.h>
#include "SparkFun_SCD30_Arduino_Library.h" // https://github.com/sparkfun/SparkFun_SCD30_Arduino_Library
SCD30 co2Sensor;
const int CO2ALARMVALUE = 1000;
int co2 = 0;
int last_co2 = 0;
int mute = 0;

void setup()
{
  Timer1.initialize();
  MFS.initialize(&Timer1);
  MFS.write("CO2");
  MFS.beep(5, 5, 3, 3, 50);
  delay(2000);  
  Serial.begin(115200);
  Serial.println("Sensirion SCD30 CO2-Sensor");
  Wire.begin();
  while (co2Sensor.begin() == false)
  {
    Serial.println("SCD30 nicht gefunden.");
    delay(1000);
  }
}

void loop()
{
  byte btn;
  if (co2Sensor.dataAvailable()) {
    Serial.print("CO2(ppm):");
    Serial.print(co2 = co2Sensor.getCO2());
    MFS.write(co2);
    Serial.print(" Temperatur(C):");
    Serial.print(co2Sensor.getTemperature(), 1);
    Serial.print(" Luftfeuchtigkeit(%):");
    Serial.print(co2Sensor.getHumidity(), 1);
    Serial.println();
  }
  else
    Serial.println("Waiting for new data");
  if (co2 < CO2ALARMVALUE) {
    mute = 1;
  }
  if (last_co2 < CO2ALARMVALUE && co2 >= CO2ALARMVALUE) {
    mute = 0;
  }
  btn = MFS.getButton();
  if (btn == BUTTON_1_PRESSED || btn == BUTTON_2_PRESSED || btn == BUTTON_3_PRESSED) {
    mute = 1;
  }
  if (mute == 0) {
    MFS.beep(20, 0, 1);
  }
  delay(500);
  last_co2 = co2;
}

Anmerkung vom 18.11.2020:

Man kann den SCD30 auch an 3.3V betreiben. Leider steht im Datenblatt die Angabe so, als ob 3.3V die absolut unterste Grenze wäre. Dann müsste man prüfen, ob wirklich 3.3V anliegen und nicht ein Millivolt weniger, um die richtige Funktion zu garantieren. Momentan betreibe ich einen SCD30 an einem ESP32 mit einer Versorgungsspannung von 3.3V, genauer gesagt 3.28V. Geht trotzdem.

Die 4k7-Pullup-Widerstände für den I²C-Bus betreibe ich dabei an der ESP32-Versorgungsspannung von 3.28V. Geht auch, obwohl im SCD30-Datenblatt steht, dass im I²C-Betrieb 3.0V nicht überschritten werden sollen.

Mit anderen Worten: Man kann den SCD30 am Arduino-UNO wahrscheinlich problemlos auch am 3.3V-Anschlusspin betreiben und braucht dann weder einen Pegelwandler noch eine Diode+Widerstand um den High-Pegel des I²C-Bus auf 3.0V zu begrenzen. Wer sichergehen und die 3.0V als Obergrenze für den High-Pegel einhalten möchte (immerhin kostet der Sensor ja fast 50,-€), der kann ja die Diode+Widerstand einbauen und die Pullup-Widerstände an diesen Knoten anschließen.

Aber es muss jede(r) selber entscheiden, wie stark er/sie das Datenblatt strapazieren will um Bauteile zu sparen!

Weitere Bemerkungen:

Wer das Multi-Function-Shield nicht über ebay oder direkt in China bestellen will, der bekommt es zu einem etwas höheren, aber meiner Meinung nach immer noch erstaunlich niedrigen Preis hier:

https://www.conrad.de/de/p/himalaya-multi-function-shield-protoshield-fuer-arduino-802287421.html

oder hier:

https://eckstein-shop.de/HIMALAYA-Multi-Function-Shield-ProtoShield-fuer-Arduino

Ergänzung vom 20.12.2020:

Die folgende Zeichnung zeigt den Schaltplan der Lochrasterkarte. Als Diode kann irgendeine Siliziumdiode verwendet werden, zum Beispiel 1N4148, 1N914, 1N4001 usw. Eine Schottkydiode würde ich eher nicht verwenden, weil die u.U. einen zu kleinen Spannungsabfall verursacht und dann wäre die Spannung am Anschluss LV größer als 3V

Der Widerstand R ist unkritisch. Irgendein Wert zwischen ein paar hundert Ohm (niedrigere Werte erhöhen nur sinnloserweise den Stromverbrauch) und ein paar Kiloohm (wesentlich größere Werte garantieren keinen ausreichend hohen Spannungsabfall an der Diode) sollte funktionieren.

Ich verwendete R = 1 kOhm und D = 1N4148.

Am Anschluss LV sollte man eine Spannung zwischen 2,6 V und 2,7 V messen. Damit liegt der High-Pegel des I²C-Signals zwischen 1,75V und 3,0V, also genau wie es das Datenblatt des SCD30 vorschreibt.

Schaltplan der Lochrasterkarte

Wenn man den CO2-Sensor SCD30 an einem Arduino UNO betreibt, dessen IO-Pins 5V ausgeben können, dann würde ich immer einen Level-Shifter verwenden, um den SCD30 vor zu hohen Eingangsspannungen zu schützen.

Im Prinzip wäre das zwar unnötig, solange die SCL- und SDA-Pins des UNO im Open-Drain-Modus arbeiten, aber wenn durch einen SW-Fehler die SCL- und SDA-Pins auf Push-Pull-Betrieb umschalten und 5V ausgeben, dann könnte dadurch der teure SCD30 beschädigt werden.

Wenn man die oben genannte Variante mit einem 3,3V-Microcontroller bauen möchte, dann schaut der Schaltplan so aus:

SCD30 an 3,3V-Microcontroller

Durch die Diode wird der High-Pegel an den Anschlüssen SCL und SDA auf ca. 2,6…2,7 V begrenzt.

Man sollte aber trotzdem darauf achten, die SCL- und SDA-Pins des Microcontrollers gleich nach dem Reset am Beginn des Programms in den Open-Drain-Modus zu versetzen (und diesen Modus auch im späteren Verlauf des Programms nicht mehr zu ändern).

Ergänzung vom 22.12.20:

Von cfkugler gibt es eine sehr viel schönere Firmware als meine zum Runterladen von seinem Repository:
https://github.com/cfkugler/toptica-co2sensor.git
Sehr zu empfehlen!
Wer etwas genauer liest, der findet dort auch einen Link zum Bestellen einer kostenlosen Leerplatine…;-)

4 Replies to “CO2-Sensor gegen Corona: Version mit Arduino UNO und Sensirion SCD30”

  1. Toller Blog! Würde das auch gerne können. Wäre an einem Schaltplan für die 3.0V Variante interessiert, um den SCD30 nicht zu überlasten. Könntest Du mir einen zuschicken?

Schreibe einen Kommentar zu Alex Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert