Erkennung von Flammen und Feuer mit dem Multi Function Shield und einem IR-Flame-Sensor-Modul
Das Multi Function Shield, das ich ja bereits vorgestellt habe, bietet mit der Möglichkeit zur einfachen Anzeige von Daten auf seinem 4-fach-7-Segment-Display und den freien Anschlusspins eine gute Grundlage, Sensoren ausprobieren.Diesmal soll mit dem MFS und einem Flammensensor-Modul ein Feueralarm realsiert werden.
Sensor YG1006

Herzstück des Flammenerkennungsmoduls ist das Bauteil YG1006, das aussieht wie eine 5mm-LED mit schwarzem Kopf. Es handelt sich aber um einen Phototransistor, der sich in einem schwarzen Epoxy-Gehäuse befindet und so nur Infrarotstrahlung empfängt. Das lange Beinchen ist der Emmitter, das kurze der Kollektor.
Die technischen Daten sind:
- Collector-Emitter Spannung: 30 V
- Emitter-Collector Spannung: 5 V
- Stromverbrauch: 20 mA / 75 mW

Wie ein Blick in das Datenblatt erkennen lässt: je höher die gemessene Temperatur ist, desto geringer wird der Strom, den der YG1006 liefert. Bis Zimmertemperatur (25°) sind dies etwa 75 mW, also 15 mA bei 5V. Dann fällt er linear bis zu einer Temperatur von 85°C, bei dem er schließlich so gut wie kein Strom (0 mA) liefert.
Es gilt aber zu bedenken, das künstlich erzeugte Infrarotstrahlung, z. B. durch eine IR-Fernbedienung, die in den Sensor trifft, auch zu einem Ausschlag führt.
Flammensensor-Modul

Der YG1006 wird meist fertig auf ein Modul gelötet angeboten. Dann hat es meist die Bezeichnung KY-026 oder es kommt namenlos auf einem HW-484-Board (das auch noch für andere Sensor-Module benutzt wird) daher.
Hier ist außer dem eigentlich Flammensensor noch ein LM393-IC, ein Potentiometer, 2 LEDs und ein paar Widerstände verbaut.
Mit dem LM393 können Stromstärken verglichen werden, und zwar schon ab 25 nA. Zusammen mit dem Potentiometer ist er für die Einstellung der Wertes am analogen Ausgang AO zuständig. Am Poti kann die Empfindlichkeit der Flammendetektion eingestellt werden. Dadurch wird der Analog-Wert verändert.
Die untere LED leuchtet, sobald die Stromversorgung anliegt und signalisiert Bereitschaft. Ab einem Analogwert von 500 (von 1023) schaltet der Digitalausgang auf HIGH und die obere LED leuchtet.

Das Modul verfügt über 4 Header-Pins, die wie folgt angeschlossen werden:
Modul Kabel Multi Function Shield
AO (Analog Output) braun ~5 im 3x4-Pin-Header-Feld
G (GND) schwarz GND im 3x4-Pin-Header-Feld
+ (+5V) rot +5V im 3x4-Pin-Header-Feld
DO (Digital Output) orange A5 im 3x4-Pin-Header-Feld

Programm
Das Testprogramm gibt auf der 4-fach-7-Segment-Anzeige den analogen Wert aus. Hier bedeutet eine hohe Zahl: keine Flamme erkannt und eine niedrige: Flamme erkannt.Wenn der digitale Ausgang des Sensors auf HIGH geht, dann wird ein Alarm ausgelöst, der durch blinken aller 4 LEDs auf dem MFS und einen wiederkehrenden Piepton signalisiert wird. Der akustische Alarm (Piepton) lässt sich durch Drücken des 2. Tasters ausschalten und durch den 1. Taster wieder einschalten.
Wem der feste Wert von 500 Analog-Einheiten, der durch das Modul vorgegeben ist, zu hoch erscheint, kann gerne auch den Analogwert auswerten, um den Alarm zu schalten. Die nötige Anpassung dazu am Programm ist einfach.

Source-Code
////////////////////////////////////////////////////////
// (C) 2018 by Oliver Kuhlemann //
// Bei Verwendung freue ich mich über Namensnennung, //
// Quellenangabe und Verlinkung //
// Quelle: http://cool-web.de/arduino/ //
////////////////////////////////////////////////////////
#include <TimerOne.h> // für Timings und Interrupts
#include <MultiFuncShield.h> // API für das Multi Function Shield
#define PinAnalog A5 // wo ist AO (Analog Out) des Sensors angeschlossen?
#define PinDigital 5 // wo ist DO (Digital Out) des Sensors angeschlossen?
byte AlarmOn = 1; // Variable für akustischer Alarm an / aus
void setup() {
Timer1.initialize();
MFS.initialize(&Timer1); // initialize multi-function shield library
pinMode (PinAnalog, INPUT);
pinMode (PinDigital, INPUT);
MFS.write ("");
MFS.blinkLeds(LED_ALL, ON);
}
void loop() {
byte btn = MFS.getButton();
if (btn == BUTTON_1_PRESSED) {
MFS.beep(1);
AlarmOn=1;
} else if (btn == BUTTON_2_PRESSED) {
MFS.beep(1);
AlarmOn=0;
}
int wert = analogRead(PinAnalog);
MFS.write(wert);
wert = digitalRead(PinDigital);
if (wert == HIGH) {
MFS.writeLeds(LED_ALL, ON);
if (AlarmOn) MFS.beep(15,15,1);
} else {
MFS.writeLeds(LED_ALL, OFF);
}
delay(200);
}