Raspberry Pi Gas Sensor (MQ-X) konfigurieren und auslesen

11. April 2017
5026 Views
26 Comments

– There is also an English Version of this tutorial available –

Um die Bestandteile der Luft zu erfassen sind Sensoren nötig. Diese sind z.B. in Rauchmeldern verbaut. Allerdings sind Anleitungen zur Nutzung dieser Gas-Sensoren am Raspberry Pi selten, weshalb es in diesem Tutorial um die generelle Nutzung solcher MQ Module am Raspberry Pi geht. Damit können z.B. Rauchmelder oder Luftqualitätstester gebaut werden.

Wie man jegliche MQ Sensoren konfiguriert und ausließt wird am Beispiel des Raspberry Pi Gas Sensor MQ2 in diesem Tutorial gezeigt. Alle anderen Sensoren (MQ3, MQ-135, usw.) können mit ein paar zusätzlichen Schritten ebenso angepasst werden.

 

Zubehör

Jegliche MQ-X Sensoren geben analoge Signale zurück, welche wir nicht ohne weiteres am Raspberry Pi auslesen könnten. Eine Möglichkeit wäre einen Arduino zu verwenden, allerdings können wir auch einen Analog-Digital Wandler benutzen, welcher über den I2C Bus ausgelesen werden kann. Ein recht ausführliches Tutorial zur Verwendung des ADCs findest du hier. Daneben benötigen wir auch noch einen Pegelwandler

Diese Bauteile sind unabhängig vom gewählten Gas Sensor. Weiterhin gibt es noch viele verschiedene Sensoren für den Raspberry Pi, welche bereits für wenige Euro erhältlich sind und jeweils für unterschiedliche Gase geeignet sind:

  • MQ-2: Methan, Butan, LPG (Autogas), Rauch
  • MQ-3: Alkohol, Ethanol, Rauch
  • MQ-4: Methan, CNG Gas (komprimiertes Erdgas)
  • MQ-5: Erdgas, LPG (Autogas)
  • MQ-6: LPG (Autogas), Butan
  • MQ-7: Kohlenmonoxid
  • MQ-8: Wasserstoffgas
  • MQ-9: Kohlenmonoxid, entflammbare Gase
  • MQ131: Ozon Gas
  • MQ135: Luft Qualität (Benzol, Alkohol, Rauch)
  • MQ136: Schwefelwasserstoffgas
  • MQ137: Ammoniak
  • MQ138: Benzol, Steinkohlenteeröl (Toluol), Aceton, Propan, Formaldehyd, Wasserstoffgas
  • MQ214: Methan, Erdgas
  • MQ216: Erdgas, Kohlegas
  • MQ303A: Alkohol, Ethanol, Rauch
  • MQ306A: LPG (Autogas), Butan
  • MQ307A: Kohlenmonoxid
  • MQ309A: Kohlenmonoxid, entflammbare Gase
  • MG811: Kohlendioxid (CO2)
  • AQ-104: Luftqualität
  • AQ-2: entflammbare Gase, Rauch
  • AQ-3: Alkohol, Benzin
  • AQ-7: Kohlenmonoxid

Ich empfehle einen Sensor mit aufgelöteten PCB zu nehmen, weil dadurch keine weitere Verkabelung und Einsetzen von Widerständen und Kondensatoren nötig ist.

Details zu den einzelnen Raspberry Pi Gas Sensoren findest du auch in den dazugehörigen Datenblättern. Dazu einfach den Namen des Sensors inkl. „datasheet“ googlen. Darin ist auch erwähnt mit welcher Spannung der Sensor arbeitet.

Falls jemand einen Alkoholtester o.ä. bauen will, sollte sich allerdings auch dessen bewusst sein, dass diese Module alle nicht absolut genau sind und dementsprechend mit einer professionellen Messung nicht mithalten können.

 

Anschluss zwischen MQ-2 und Raspberry Pi

In diesem Beispiel wird von einer 5V SPannung ausgegangen. Dies ist für die GPIOs zu viel, weshalb wir einen Logik Level Konverter (TTL) nutzen, der die Spannung herunterbricht. Falls du einen anderen Sensor als den MQ-2 verwendest und dieser eine andere Spannung hat, muss der Aufbau natürlich angepasst werden.

Nachdem der MCP3008 richtig angeschlossen ist, nutzen wir den Port 0 und verbinden ihn an RX0 des TTLs. Auf der gegenüberliegenden Seite befindet sich RX1, welches an den Analog Pin (A0) des MQ2 Sensors kommt. Außerdem wird an den TTL 3.3V vom Raspberry Pi (LV) und 5V (HV) angeschlossen. Ebenso kommen 5V an den VCC Pin des Gas Sensors und GND vom Raspberry Pi kommt an GND auf der LV und HV Seite des TTLs, sowie an GND vom MQ2.

Schematisch sieht das ganze dann folgendermaßen aus:

Raspberry Pi Gas Sensor MQ2 Steckplatine

Ich nutze hierbei die 5V des Raspberry Pi’s. Allerdings ist eine externe Stromversorgung zu empfehlen, falls noch andere Sensoren und Module bzw. Eingabegeräte (Tastatur, Maus, Touchscreen) verwendet werden. Dazu wird der Sensor einfach von der externen Quelle mit Strom beliefert (HV Seite des TTL) und der Masse Anschluss (Minus/GND) mit GND des Raspberry Pi’s verbunden.

 

 

Konfiguration des Raspberry Pi Gas Sensor – Vorbereitung

Die Angaben der Konzentration eines Gases werden in PPM (parts per million) angegeben. Eine Schwierigkeit des MQ-2 ist nun, dass ein einziger analoger Wert ausgegeben wird, mit welchem der Gasgehalt in der Luft für die verschiedenen unterstützten Gase berechnet werden muss. Allerdings muss dafür der Sensor zum einen konfiguriert werden. Da diese Anleitung auch für einen anderen Raspberry Pi Gas Sensor übertragbar sein soll, ist hier die Vorgehensweise:

Zu Beginn schauen wir ins Datenblatt des jeweiligen Moduls, worin sich u.a. ein Diagramm befindet.

Raspberry Pi Gas Sensor MQ-2 Datasheet

Die angegebenen Werte befinden sich in logarithmischer Skalierung.

Die Skalierung der Werte ist allerdings nicht linear sondern logarithmisch zur Basis 10 (log). Das bedeutet, dass der erste Strich auf der X-Achse 200 entspricht, danach 300 usw. Der erste Strich nach 1000 ist 2000, usw. Der Abstand dazwischen ist linear. Die Idee, welche hinter diesem Skript zur Kalibrierung und Auslesung steckt, ist eine Gerade zu erstellen und so den Anteil des Gases (in ppm) zu berechnen. Dazu brauchen wir zwei Punkte, um die Steigung zu berechnen.

Veranschaulichen wir das am Beispiel von LPG. Wir nehmen also den Punkt P1(x=200, y= ~1.62) und P2(x=10000, y= ~0.26). Um die „echten“ Werte zu berechnen, wenden wir den Zehner-Logarithmus an. Mit Hilfe der Zwei-Punkte Form können wir die Steigung berechnen, die in unserem Fall -0.47 ist (Link zur Rechnung). Mit der Steigung und dem gezogenen Logarithmus aus dem linken Punkt (x=2.3, y=0.21) können wir die Gerade nun bestimmen.

Für die restlichen Gase ist die Berechnung äquivalent und kann genauso durchgeführt werden. Wer weiteren Lesestoff dazu haben will, kann diesen u.a. hier bekommen (Englisch).

 

Kalibrierung des Raspberry Pi Gas Sensor – Code

Genug der Theorie – wir wollen den Sensor nun anfangen zu verwenden. Dazu kann der von mir angepasste Code verwendet werden, welcher sich in einem GitHub Repository befindet. Mit dabei ist auch eine Klasse zum Auslesen des MCP3008. Zunächst klonen wir das Verzeichnis:

git clone https://github.com/tutRPi/Raspberry-Pi-Gas-Sensor-MQ

Anschließend wechseln wir in das Verzeichnis und führen die vorhandene Python Test-Datei aus.

cd Raspberry-Pi-Gas-Sensor-MQ
sudo python example.py

Bei der Initialisierung wird die Kalibrierung automatisch gestartet. Es ist wichtig, dass sich der Sensor in guter / frischer Luft befindet, da Rauch / andere Gase die Kalibrierung verfälschen würden. Der Vorgang dauert ein paar Sekunden, jedoch kann danach bereits der Gasgehalt gemessen werden (siehe Video). Einige Sensoren werden recht heiß, was aber kein Grund zur Sorge sein sollte.

 

Manche Nutzer berichteten, dass die Werte erst nach einiger Zeit genau werden. Ich kann dies leider nicht verifizieren, da ich kein professionelles Messgerät habe. Sollte jemand das bestätigen oder überprüfen können, da er ein solches Gerät zuhause hat, würde ich mich über eine Rückmeldung als Kommentar freuen 🙂

26 Kommentare

  1. Hallo. Welchen MQ kann ich verwenden um pupse zu messen? Brauch ich da mehrere die ich über gpio ansteuere? Würde gerne wissen wie oft meine Freundin pupst, da sie es nicht zugibt ^^

    Antworten
    • Haha 😀
      Kurze Google Recherche ergab: Fürze bestehen hauptsächlich aus Methan, Hydrogen, Nitrogen, Sauerstoff und Carbon Dioxid. Wahrscheinlich bräuchtest du mehrere Sensoren, um alle Gase festzustellen. Die genaue Zusammensetzung kenne ich aber nicht 😀

      Antworten
  2. Hallo Felix,
    ich mal wieder.
    Hast du Lust, uns Losern zu erklären, wie man die Daten der Sensoren auf ein Nokia 5110 Display oder HD44780 bekommt?
    Wobei ein Nokia-Display erstens cooler und zweitens günstiger ist.
    Gruß Ingo

    Antworten
  3. Ich habe auch das Problem dass er nach der Meldung „calibrating …“ abricht mit „Abort by User“. Und nein, ich drücke nicht Strg+C. Kann mir jemand weiterhelfen?

    Antworten
  4. Hi Felix,
    ich habe das Ganze mit einem MQ3 zusammengebaut (Fehllieferng)
    und bekomme die Fehlermeldung:

    Traceback (most recent call last):
    File „example.py“, line 1, in
    from mq import *
    File „/root/Raspberry-Pi-Gas-Sensor-MQ/mq.py“, line 6, in
    from MCP3008 import MCP3008
    File „/root/Raspberry-Pi-Gas-Sensor-MQ/MCP3008.py“, line 1, in
    from spidev import SpiDev
    ImportError: No module named spidev

    Liegt das an dem andern MQ-Sensor oder habe ich einen Fehler gemacht?

    Gruß Ingo

    Antworten
  5. Hello, thank you for the tutorial. I have and MG811 (CO2 sensor), would the code that you have above, work for that specific sensor? Or would I need to come up with some other formula?

    Antworten
    • The Code above is just for the MQ-2. For other Sensors you have to implement the formula, depending on what is written in the datasheet of that specific sensor.

      Antworten
  6. Hallo,

    verstehe ich das richtig, dass alle hier vorgestellten Sensoren, ausser auf einem RasPi, auch auf einem ESP8266 oder ESP32 genau so verwendet werden können?

    Grüße
    Peter

    Antworten
    • Ja, die aller meisten Sensoren können auch von einem ESPxx oder Arduino verwendet werden. Falls es genügend Leute interessiert, werde ich zu den ESP’s auch Tutorials erstellen.

      Antworten
      • Also mein Interesse für Tutorials zu ESP8266 und ESP32 wäre vorhanden.

  7. I want use mq2 sensor output in node red using tcp node.can I use this? import output
    import socket

    TCP_IP = ‚127.0.0.1‘
    TCP_PORT = 1888

    class Print(output.Output):
    requiredData = []
    optionalData = []
    def __init__(self,data):
    pass
    def outputData(self,dataPoints):
    for i in dataPoints:
    try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(i[„name“] + „:“ + str(round(i[„value“],1)))
    s.close()
    except:
    pass
    return True

    Antworten
  8. Hallo,
    ich habe das Projekt mit einem MQ3 zusammengebaut und das Skript zur Kalibrierung entsprechend verändert so wie es in der Anleitung steht. Und zwar ist dann das Problem, dass das analoge Signal immer anders also zufällig ist und manchmal sogar 0 und ich weiß da einfach nicht mehr weiter 🙁 Hätte da jemand eine Idee?

    Antworten
  9. Hi 🙂
    Bei mir wird leider die Kalibrierung abgebrochen, weil die Spannung vom AD-Wandler auf 0 abfällt. In der Funktion „MQResistanceCalculation“ wird dann mit 0 dividiert, was natürlich einen Fehler zurückgibt. Hat jemand eine Idee an was das liegen kann?

    Vielen Dank schon mal für Eure Hilfe!

    Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!