Der Flammensensor KY-026 besteht aus einer Photodiode, die vor allem auf den Infrarot-Bereich von 760 bis 1100nm anspricht und etwas zusätzlicher Logik.
Durch ein Potentiometer kann die Empfindlichkeit des Sensors eingestellt werden, da dieser sonst auch auf kurze Impulse von TV-Fernbedienungen oder andere IR-Lichtquellen reagiert.
Für das Projekt benötigen wir
- Arduino Uno R3 – https://amzn.to/2VH1fHE
- KY-026 Flame Sensor – https://amzn.to/2Ii3uht
- passiver Piezo Buzzer – https://amzn.to/3gg5N18
- ein paar Jumperkabel
Im Video zeige ich den Aufbau des Projektes, den Test der einzelnen Komponenten und das Endergebnis. Die verwendeten Arduino Sketches findet ihr hier im Anschluss.
Der Aufbau:
Funktionstest des Buzzers:
/********************************
* makerblog.at - Tutorial
* Fire Started Xmas Jukebox
*
* Buzzer Test
*
* Passiver Buzzer (die ohne weissen Aufkleber!)
* Arduino GND -> - (GND)
* Arduino 5V -> + (5V, meist mittleres Pin)
* Arduino D11 -> S (Signal)
*
* Funktionstest des Buzzers.
* Spielt wiederholt einen Ton ab.
*
*********************************/
#define BUZZER_PIN 11
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
tone(BUZZER_PIN, 262, 250);
delay(400);
tone(BUZZER_PIN, 294, 250);
delay(400);
tone(BUZZER_PIN, 330, 250);
delay(400);
tone(BUZZER_PIN, 349, 250);
delay(400);
tone(BUZZER_PIN, 392, 250);
delay(400);
tone(BUZZER_PIN, 440, 250);
delay(400);
tone(BUZZER_PIN, 494, 250);
delay(400);
tone(BUZZER_PIN, 523, 400);
delay(1000);
}
Code-Sprache: C++ (cpp)
Funktionstest und Kalibrierung des Flammensensors:
/********************************
* makerblog.at - Tutorial
* Elegoo 37 Sensor Kit v2.0 - https://amzn.to/2JpJPgd
*
* FLAME SENSOR TEST (z.B. aus Elegoo 37 Sensor Kit)
* Arduino A0 -> AO (Analog Output)
* Arduino 5V -> +
* Arduino GND -> -
* Arduino D7 -> DO (Digital Output)
*
* Funktionstest des Flammensensors zur
* Kalibrierung mit dem Potentiometer.
*
* Ziel:
* - LED1 am Sensor leuchtet immer
* - LED2 am Sensor leuchtet erst, wenn Kerzenflamme nahe kommt (dann geht DO auf HIGH)
*
*********************************/
#define SENSOR_PIN_A A0
#define SENSOR_PIN_D 7
void setup() {
Serial.begin(9600);
pinMode(SENSOR_PIN_D, INPUT);
// Erste Messungen vom Sensor ignorieren, liefert manchmal Müll beim Start
for (int x=0; x<10; x++) {
int v = analogRead(SENSOR_PIN_A);
delay(20);
}
}
void loop() {
// -----------------------------------------------------------
// Ausgabe am besten über den [Serial Plotter] im Menu [Tools]
// -----------------------------------------------------------
// Fixe Obergrenze des Diagramms auf 1024 (autom. Skalierung verhindern)
Serial.print(1024);
Serial.print(",");
// Digitalwert * 100 für bessere Sichtbarkeit, aus 1 wird 100
Serial.print(digitalRead(SENSOR_PIN_D)*100);
Serial.print(",");
// Analogwert zwischen 0 und 1024
Serial.println(analogRead(SENSOR_PIN_A));
delay(20);
}
Code-Sprache: C++ (cpp)
Und der finale Sketch:
#include <NonBlockingRtttl.h>
#define BUZZER_PIN 11
#define SENSOR_PIN 7
/*
const char* song1 = "Rudolph the Red Nosed Raindeer:d=8,o=5,b=250:g,4a,g,4e,4c6,4a,2g.,g,a,g,a,4g,4c6,2b.,4p,f,4g,f,4d,4b,4a,2g.,g,a,g,a,4g,4a,2e.,4p,g,4a,a,4e,4c6,4a,2g.,g,a,g,a,4g,4c6,2b.,4p,f,4g,f,4d,4b,4a,2g.,g,a,g,a,4g,4d6,2c.6,4p,4a,4a,4c6,4a,4g,4e,2g,4d,4e,4g,4a,4b,4b,2b,4c6,4c6,4b,4a,4g,4f,2d,g,4a,g,4e,4c6,4a,2g.,g,a,g,a,4g,4c6,2b.,4p,f,4g,f,4d,4b,4a,2g.,4g,4a,4g,4a,2g,2d6,1c.6.";
const char* song2 = "Jingle Bells:d=4,o=5,b=170:b,b,b,p,b,b,b,p,b,d6,g.,8a,2b.,8p,c6,c6,c6.,8c6,c6,b,b,8b,8b,b,a,a,b,2a,2d6";
const char* song3 = "We Wish you a Merry Christmas:d=8,o=5,b=140:4d,4g,g,a,g,f#,4e,4c,4e,4a,a,b,a,g,4f#,4d,4f#,4b,b,c6,b,a,4g,4e,4d,4e,4a,4f#,2g";
*/
// Kurzversionen zum Testen
const char* song1 = "Rudolph:d=8,o=5,b=150:g,4a,g,4e,4c6,4a,2g.,g,a,g,a,4g,4c6,2b.";
const char* song2 = "Jingle:d=4,o=5,b=170:b,b,b,p,b,b,b,p,b,d6,g.,8a,2b.";
const char* song3 = "We Wish:d=8,o=5,b=140:4d,4g,g,a,g,f#,4e,4c,4e,4a,a,b,a,g,4f#,4d";
long randomIndex = 0; // zufälligen Song auswählen
byte playIt = 0; // 0 = gestoppt, 1=spielend
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
pinMode(SENSOR_PIN, INPUT);
randomSeed(analogRead(0)); // Zufallsgenerator seeden
// Anfangs spielt kein Song, auf 1 setzen, falls beim Einschalten
// gleich losgepielt werden soll
playIt = 0;
}
void loop() {
if (playIt) {
if (!rtttl::isPlaying()) {
if (randomIndex == 0) {
rtttl::begin(BUZZER_PIN, song1);
} else if (randomIndex == 1) {
rtttl::begin(BUZZER_PIN, song2);
} else if (randomIndex == 2) {
rtttl::begin(BUZZER_PIN, song3);
}
}
else {
rtttl::play();
}
if (rtttl::done()) {
playIt = 0;
}
} else {
if (digitalRead(SENSOR_PIN)) {
randomIndex = random(3);
playIt = 1;
}
delay(100);
}
}
Code-Sprache: C++ (cpp)
Viele weitere Melodien im RTTTL Format gibt es hier:
http://mines.lumpylumpy.com/Electronics/Computers/Software/Cpp/MFC/RingTones.RTTTL