Nr. 32 – Der MQ-3 Alkoholsensor

Material : MQ-3 / Kabel / Arduino (Materialbeschaffung www.funduinoshop.com)

Der MQ-03 Sensor ist ein Modul, welches die Konzentration des Alkoholgehalts (Ethanolgehalts) in der Luft erfasst. Der Sensor gibt die erfassten Alkoholwerte als analogen Wert aus. Diese können im Anschluss im seriellen Monitor ausgegeben oder anderweitig verarbeitet werden.

Doch bevor wir uns diesem Teil der Anleitung widmen, blicken wir zuerst auf den Sensor selbst.

Er verfügt über vier Pins :

VCC    – Pin für die Stromversorgung, anzuschließen an den 5V Pin des Arduinos
GND   – Ground-Pin, anzuschließen an den GND Pin des Arduinos
A0       – Pin für den analogen Output, anzuschließen an den Pin A0 des Arduinos
D0       – Pin für den digitalen Output, anzuschließen an den Pin D0 des Arduinos

Zudem können wir den Schwellenwert, welcher über den Pin D0 als „1“ bzw. „0“ ausgegeben wird, mechanisch einstellen. Die Kalibrierung des Schwellenwertes erfolgt durch Drehen des Potentiometers, welches auf der Rückseite des Sensormoduls zu finden ist.

Nachdem wir unseren MQ-03 Sensor wie oben beschrieben an den Arduino Mikrocontroller angeschlossen haben, beginnen wir mit der Programmierung.
Im Prinzip möchten wir lediglich die erfassten Daten des MQ-03 auslesen. Dies erfolgt durch eine simple Abfrage.

 

Der Sketch :

int Analog = 0; 
int Schwellenwert;
int Wert;


void setup() {

Serial.begin(115200); // Baudrate wird auf 115200 festgelegt. Nur so werden die Werte korrekt ausgegeben.
pinMode(Analog, INPUT); // Der Analogpin (Pin 0, im Header festgelegt) dient nun als Input.

}

void loop()
{
Wert = analogRead(Analog); // Der analoge Sensorwert wird ausgelesen.

Schwellenwert = digitalRead(Analog); // Der digitale Sensorwert wird ausgelesen...

Serial.print("Alkoholwert: ");
Serial.println(Wert); // ... und anschließend ausgegeben.
Serial.print("Schwellenwert: ");
Serial.print(Schwellenwert); // An dieser Welle wird ausgegeben ob der Schwellenwert überschritten wurde (HIGH = 1).
Serial.print(" ");
delay(100);

}

 

Wenn wir uns nun die Werte im seriellen Monitor ansehen, werden wir feststellen, dass diese allein relativ nutzlos sind. Zu diesem Zeitpunkt liegt noch kein Referenzwert vor, der aussagt, wie gut oder schlecht die Luftqualität nun tatsächlich ist. Daher müssen wir dem Sensor Frischluft zuführen und ihm somit die Möglichkeit geben, sich zu kalibrieren. Nachdem wir den Sensor nun an der frischen Luft ruhen lassen haben, können wir den erfassten Wert als Ausgangspunkt für die Bewertung der Luftqualität nutzen.

In unserem Fall lag dieser Wert bei ungefähr 100. Dieser Wert kann jedoch variieren!

Diesen erfassten Referenzwert nutzen wir nun, indem wir uns eine kleineKontrollstation basteln.
Sobald der Sensorwert über 100 liegt, soll eine rote LED für zwei Sekunden aufleuchten. Liegt der Sensorwert unter 100, leuchtet eine grüne LED  zwei Sekunden lang auf.

Wir erweitern also unseren Aufbau um zwei LEDs und passen den Sketch entsprechend an.

int Null = 0; 
int Schwellenwert;
int Wert;
int LEDgruen = 13;
int LEDrot = 12;

void setup() 
{
Serial.begin(115200);       // Baudrate wird auf 115200 festgelegt. Nur so werden die Werte korrekt ausgegeben.
pinMode(Null, INPUT);       // Der Analogpin (Pin 0, im Header festgelegt) dient nun als Input.
pinMode(LEDgruen, OUTPUT);  // Die LEDs dienen als Output
pinMode(LEDrot, OUTPUT);
}

void loop()
{
Wert = analogRead(Null);            // Der analoge Sensorwert wird ausgelesen. 
Schwellenwert = digitalRead(Null);  // Der digitale Sensorwert wird ausgelesen...

Serial.print("Alkoholwert: ");
Serial.println(Wert); // ... und anschließend ausgegeben.
Serial.print("Schwellenwert: ");
Serial.print(Schwellenwert); // An dieser Welle wird ausgegeben ob der Schwellenwert überschritten wurde (HIGH = 1).
Serial.print(" ");

if (Wert < 100) // Sollte der Sensorwert kleiner/gleich 50 sein...

{
  digitalWrite(LEDrot, HIGH);
  delay(500);
  digitalWrite(LEDrot, LOW);
}

if (Wert > 100) // Sollte der Sensorwert größer/gleich 50 sein...

{
  digitalWrite(LEDgruen, HIGH);
  delay(500);
  digitalWrite(LEDgruen, LOW);
}

delay(100);

}