In diesem Beitrag möchte ich dir zeigen, wie du den Gas Sensor MQ-9 am ESP32 mit MicroPython programmieren und auslesen kannst.
Diesen Sensor habe ich bereits für den Arduino im gleichnamigen Beitrag Arduino Lektion #112: Sensor MQ-9 für Kohlenmonoxid und entflammbare Gase vorgestellt. In diesem Beitrag jedoch gehe ich darauf ein wie dieser mit der Sprache MicroPython am ESP32 programmiert und betrieben wird.
Bezug
Diesen Sensor habe ich über ebay.de für knapp 4,5 € inkl. Versandkosten* erstanden.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Technische Daten des Gas Sensors MQ-9
- Betriebsspannung 5V
- Heizwiderstand 31 Ω ± 3 Ω
- Stromaufnahme des Heizelements ≤ 180mA
- Heizspannung 5V ± 0,1V / 1,5V ± 0,1V
- Heizenergieleistung max. 350 mW
- Genauigkeit ≥ 3 %
- Antwortzeit ≤ 1sek.
- Ansprechzeit nach dem Einschalten ≤ 30sek.
Aufbau & Schaltung
Die Platine des Gas Sensors MQ-9 verfügt über 4 Pins welche wie folgt mit dem ESP32 verbunden werden.
Sensor MQ-9 | ESP32 |
---|---|
VCC | 5V von externem Power Shield |
GND | G |
DO | GPIO 16 |
AO | GPIO 0 |
Pinout des ESP32
Der ESP32 verfügt nicht an jedem GPIO Pin über die Möglichkeit einen analogen Sensor zu lesen. In der nachfolgenden Grafik sind die GPIO Pins für das lesen von analogen Sensoren mit der Beschriftung “A2:n” bzw “A1:n” versehen.
Stromversorung
Das ESP32 Board verfügt nur über einen 3V Pin somit müssen wir in diesem Fall eine externe Stromversorgung wählen. Da ich den ESP32 auf einem 400 Pin Breadboard gesteckt habe kann ich ein passendes Power Shield für ein Breadboard verwenden.
Programmieren des MQ-9 Gas Sensors mit MicroPython
Damit wir die Daten unverfälscht lesen können müssen wir zunächst den Sensor in der aktuellen Umgebung kalibrieren.
from machine import Pin, ADC #Bibliothek zum auslesen von analogen Werten from time import sleep #importieren der Funktion sleep aus dem Modul time #der GPIO Pin 34 als analogen Eingang verwenden mq9 = ADC(Pin(34)) #globale Variable R0 = 0 print("calibration") sensorValue = 0 #Schleife von 1 bis 100 for value in range(1,100): sensorValue = sensorValue + mq9.read() #berechnen des Durchschnittwertes sensorValue = sensorValue / 100.00 sensor_volt = (sensorValue / 1024) * 5.0 RS_air = (5.0 - sensor_volt) / sensor_volt R0 = RS_air/9.9 #der Wert 9.9 wurde aus dem Datenblatt zum Gas Sensor MQ-9 entnommen #Beginn der Endlosschleife while(1): #lesen des aktuellen analogen Wertes sensorValue = mq9.read() sensor_volt = (sensorValue / 1024) * 5.0 RS_gas = (5.0 - sensor_volt) / sensor_volt ratio = RS_gas / R0 #Ausgabe der Messwerte print("sensorVolt: "+ str(sensor_volt)) print("RS_ration: " + str(RS_gas)) print("Rs/R0: "+ str(ratio)) #eine Pause von 1,5 Sekunden sleep(1.5)
Es ist wichtig das die externe Stromversorgung VOR dem ausführen des Programmes aktiviert wird denn sonst gibt es die Fehlermeldung “Division by Zero”.
In dem oben gezeigten Programm werden die Daten in die Konsole mit dem Befehl “print” geschrieben.
schreiben der Daten in eine CSV Datei
In diesem Abschnitt möchte ich dir nun zeigen wie du diese Daten in eine CSV Datei schreiben kannst. Die Datei können wir dann später mit zbsp. Microsoft Excel öffnen und in Diagramme visualisieren.
Für die Programmierung des ESP32s nutze ich die Entwicklungsumgebung upyCraft diese ist kostenfrei erhältlich und hat einen sehr guten Funktionsumfang jedoch muss man ein paar Abstriche machen einer davon ist dass diese Anwendung nur *.py, *.txt und *.json Dateien öffnen kann. Somit müssen wir unsere CSV Datei als *.txt Datei abspeichern.
from machine import Pin, ADC from time import sleep mq9 = ADC(Pin(34)) R0 = 0 print("calibration") sensorValue = 0 for value in range(1,100): sensorValue = sensorValue + mq9.read() sensorValue = sensorValue / 100.00 sensor_volt = (sensorValue / 1024) * 5.0 RS_air = (5.0 - sensor_volt) / sensor_volt R0 = RS_air/9.9 #Datei mq9_data.txt anlegen und öffnen zum schreiben #bereits vorhandene Daten werden überschrieben #Wenn neue Daten angehängt werden sollen, dann muss #der Parameter 'w' durch 'a' (append) ausgetauscht werden. index = 0 with open('mq9_data.txt','w') as file: file.write(';sensor_volt;RS_gas;ratio\n') while(1): index = index + 1 sensorValue = mq9.read() sensor_volt = (sensorValue / 1024) * 5.0 RS_gas = (5.0 - sensor_volt) / sensor_volt ratio = RS_gas / R0 #schreiben der Daten in die Datei file.write(str(index)+';'+str(sensor_volt).replace('.',',')+';'+str(RS_gas).replace('.',',')+';'+str(ratio).replace('.',',')+'\n') #einen Punkt auf der Konsole ausgeben print('.', end='') #eine kleine Pause von 1,5 Sekunden sleep(1.5)
Video
Sollte das Video etwas verschwommen sein, so stelle die Qualität auf “1080P”.
Hi,
schöne Anleitung! ich habe da mal eine Frage: Welche Einheit haben die gemessenen Werte? mV oder V?
LG
Fanmion
Hi,
die Frage nach der Einheit ist gut, da bin ich auch nicht abschließend fündig geworden.
Das ist eher ein berechneter Index. Da sich jedoch dieser Wert mit der Zeit ändert.
(Der Sensor heizt sich auf und dadurch ändert sich der Messwert.)
Gruß, Stefan
Hi, super Anleitung, die hilft mir bei meinem PicoPi Projekt.
Aber eine Frage hätte ich:
Der MQ-9 kann auch mit 3.3 Volt betrieben werden.
Kann ich dann einfach die 5.0 gegen 3.3 im Code tauschen?
Also:
sensor_volt = (sensorValue / 1024) * 3.3
RS_air = (3.3 – sensor_volt) / sensor_volt
sensor_volt = (sensorValue / 1024) * 3.3
RS_gas = (3.3 – sensor_volt) / sensor_volt
Hi Thomas,
nicht nur kann, sondern in deinem Fall musst du das auch.
Jedoch musst du mal nachmessen, ob dann noch die analogen Werte passen, denn diese sind ja abhängig von der Spannung. D.h. 5V sind 1023 und 0V sind 0.
Gruß,
Stefan