kurz zu mir, habe mich vor 6 Jahren mal ein wenig mit Arduino beschäftigt, bis auf ein paar Blinklichter nicht viel erreicht, da zu wenig zeit, Kinder etc.
Nun sind meine Kinder etwas älter und haben ein kleines Halloween Projekt.
Angestrebt ist ein Effekt der durch einen Pir Sensor ausgelöst wir. Der Pir Sensor soll ein Mp3 Board ansteuern und ein Geräusch auslösen, zudem 3 Led lichter in unterschiedlicher Frequenz zum leuchten bringen um einen blitz zu Simulieren, in etwa so: 1Led 0,2an/0,2aus/0,2an/0,2aus/0,2an/0,2aus - beim zweiten an der 1Led die 2Led etwa 0,5an/0,5aus/0,5an/0,5aus - beim ersten aus der 2Led die 3Led ungefähr 0,3an/0,3aus/0,3an/0,3aus. Bisschen blöd erklärt, sorry.
Ich bekomme den Pir Sensor soweit das er eine Abfolge der Led's ablaufen lässt.
mit dem "Nachtwächter" habe ich auch schon herumprobiert, nun aber das entscheidende Problem.
Wie bekomme ich den Pir Sensor dazu den Mp3 Sound abzufeuern und Gleichzeitg den Nachtwächter loszuschicken der nach erfolgtem Ablauf der Sequen wider ruht bis der Pir Sensor Erneut auslöst?
Ab diesem punkt bin ich leider hoffnungslos überfordert.
Wenn jemand einen Tipp oder eine Hilfestellung hat bin ich dafür überaus dankbar.
Wenn der PIR auslöst setzt du dir eine Variable running = true und gleichzeitig einen Timer, wann er gestartet wurde. Wenn running == true ignoriest du weitere PIR Trigger. Nach Ablauf des Timers wird running = false.
Ooooha, komplexer als ich dachte, aber funktionieren tut es, super Sache, danke .
Ich habe gemerkt das ich echt recht wenig weiß, kann nur vereinzelte befehle und deren Funktion interpretieren . da ist wohl noch massives pauken angesagt
könnte man am ende der blink Sequenz noch eine sperre für den Pir einfügen damit er, sagen wir mal, erst nach 30sekunden wieder auslösbar ist? also nicht direkt nach der Sequenz wieder scharfgestellt ist?
Der schein trügt, hab mir aus vorhanden Tutorials die Zeilen geklaut die ich dachte verwenden zu können. Hat zum teil auch Funktioniert aber wenn ich mir den sketch von my_xy_projekt so ansehe weiß ich, das ich nichts weiß
Wenn jetzt noch der Mini MP3 DFPlayer eingefügt wird der beim auslösen des Pir den Sound abfeuert habe ich bis Halloween zeit (und wahrscheinlich noch lange zeit mehr) mich intensiv mit den befehlen auseinander zu setzen um sie zu verstehen und deren Zusammenhang zu erkennen
// Forensketch Halloween Projekt der Kids, Pir, Mp3 und Nachtwächter?)
// https://forum.arduino.cc/t/halloween-projekt-der-kids-pir-mp3-und-nachtwachter/1178798
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial playerSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
constexpr byte pirPin {5};
constexpr uint32_t pirSperrTime {5000};
constexpr byte ledPin[] {2, 3, 4};
constexpr uint32_t ledSwitchIntervall[sizeof(ledPin)] {200, 500, 300};
uint32_t ledSwitchTime[sizeof(ledPin)] = {0, 0, 0};
byte zaehler[sizeof(ledPin)] = {0};
bool pirSperre;
void setup()
{
Serial.begin(115200);
playerSerial.begin(9600);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
delay(300);
#endif
Serial.println(F("\r\nStart...\r\n"));
pinMode(pirPin, INPUT);
for (byte b = 0; b < sizeof(ledPin); b++)
{
pinMode(ledPin[b], OUTPUT);
digitalWrite(ledPin[b], LOW);
}
}
void loop()
{
if (digitalRead(pirPin) && !pirSperre) // Der PIR wird nur einmal ausgelöst (retriggersperre)
{
blinkStart(0);
dfPlayerStart();
}
for (byte b = 0; b < sizeof(ledPin); b++)
{
if (zaehler[b]) // Wenn Zaehler aktiv
{
blinken(b); // dann switchen
}
}
if (zaehler[0] == 3) // Wenn
{
blinkStart(1); // dann nächsten blinker Starten
}
else if (zaehler[0] >= 6) // Ende?
{
blinkStop(0);
}
if (zaehler[1] == 2)
{
blinkStart(2);
}
else if (zaehler[1] >= 4)
{
blinkStop(1);
}
if (zaehler[2] >= 4)
{
blinkStop(2);
}
// gib den PIR wieder frei, wenn kein Zaehler aktiv
pirSperre = false;
for (byte b = 0; b < sizeof(ledPin); b++)
{
if (zaehler[b] != 0 || // Solange ein Zaehler aktiv ODER
millis() - ledSwitchTime[2] < pirSperrTime) // nach dem letzeabgelaufen
{
pirSperre = true; //
}
}
}
void dfPlayerStart()
{
// Hier den DFplayer spielen lassen
// Der gibt auch einen Status zurück, der angibt, wenn er nicht (mehr) spielt
// Den kann man ebenfalls in die retriggersperre setzen
myDFPlayer.volume(10); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
}
void blinkStart(const byte ledNum) // die Zuordnung ergibt sich aus ledPin[]
{
zaehler[ledNum] = 1; // setzt den Merker fürs einschalten
digitalWrite(ledPin[ledNum], HIGH); //
ledSwitchTime[ledNum] = millis(); // merkt sich die Einschaltzeit
}
void blinkStop(const byte ledNum) // blinkSart
{
zaehler[ledNum] = 0; // Merker löschen
digitalWrite(ledPin[ledNum], LOW); // gesichert aus machen
}
void blinken(const byte ledNum)
{
if (millis() - ledSwitchTime[ledNum] >= ledSwitchIntervall[ledNum]) // Wenn Zeit abgelaufen
{
ledSwitchTime[ledNum] += ledSwitchIntervall[ledNum]; // Schaltzeitpunkt merken
digitalWrite(ledPin[ledNum], !digitalRead(ledPin[ledNum])); // toogelt den PIN
zaehler[ledNum]++; //
}
}
Ja, bis auf "// Der gibt auch einen Status zurück, der angibt, wenn er nicht (mehr) spielt".
Wie müsste es aussehen wenn die Pir Sperre, also die gesetzten 5sekunden erst ablaufen nachdem der Sound den Status "läuft nicht mehr" setzt?
also mp3 spielt "pir sperre ist ja währendessen aktiv", Mp3 endet - setzt Status Mp3 ende, dann Pir Sperre noch weitere 5sekunden aktiv nachdem Mp3 ende.
Nur so nebenbei, du rettest mir gerade massiv den Ar...
Nicht unbedingt funktionierend, aber eine Art Idee
// Forensketch Halloween Projekt der Kids, Pir, Mp3 und Nachtwächter?)
// https://forum.arduino.cc/t/halloween-projekt-der-kids-pir-mp3-und-nachtwachter/1178798
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial playerSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
constexpr uint32_t playerSperrTime {5000};
uint32_t playerStopTime;
bool dfState = false;
constexpr byte pirPin {5};
constexpr uint32_t pirSperrTime {5000};
constexpr byte ledPin[] {2, 3, 4};
constexpr uint32_t ledSwitchIntervall[sizeof(ledPin)] {200, 500, 300};
uint32_t ledSwitchTime[sizeof(ledPin)] = {0, 0, 0};
byte zaehler[sizeof(ledPin)] = {0};
bool pirSperre;
void setup()
{
Serial.begin(115200);
playerSerial.begin(9600);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
delay(300);
#endif
Serial.println(F("\r\nStart...\r\n"));
pinMode(pirPin, INPUT);
for (byte b = 0; b < sizeof(ledPin); b++)
{
pinMode(ledPin[b], OUTPUT);
digitalWrite(ledPin[b], LOW);
}
}
void loop()
{
if (digitalRead(pirPin) && !pirSperre) // Der PIR wird nur einmal ausgelöst (retriggersperre)
{
blinkStart(0);
dfPlayerStart();
dfState = true;
}
for (byte b = 0; b < sizeof(ledPin); b++)
{
if (zaehler[b]) // Wenn Zaehler aktiv
{
blinken(b); // dann switchen
}
}
if (zaehler[0] == 3) // Wenn
{
blinkStart(1); // dann nächsten blinker Starten
}
else if (zaehler[0] >= 6) // Ende?
{
blinkStop(0);
}
if (zaehler[1] == 2)
{
blinkStart(2);
}
else if (zaehler[1] >= 4)
{
blinkStop(1);
}
if (zaehler[2] >= 4)
{
blinkStop(2);
}
// gib den PIR wieder frei, wenn kein Zaehler aktiv
pirSperre = false;
for (byte b = 0; b < sizeof(ledPin); b++)
{
if (zaehler[b] != 0 || // Solange ein Zaehler aktiv ODER
millis() - ledSwitchTime[2] < pirSperrTime || // nach dem letzeabgelaufen
millis() - playerStopTime < playerSperrTime) // player noch aktiv
{
pirSperre = true; //
}
}
dfPlayerAktive();
}
void dfPlayerStart()
{
// Hier den DFplayer spielen lassen
// Der gibt auch einen Status zurück, der angibt, wenn er nicht (mehr) spielt
// Den kann man ebenfalls in die retriggersperre setzen
myDFPlayer.volume(10); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
}
void dfPlayerAktive()
{
if (dfState)
{
if (myDFPlayer.available())
{
if (myDFPlayer.readType() == DFPlayerPlayFinished)
{
playerStopTime = millis();
dfState = false;
}
}
}
}
void blinkStart(const byte ledNum) // die Zuordnung ergibt sich aus ledPin[]
{
zaehler[ledNum] = 1; // setzt den Merker fürs einschalten
digitalWrite(ledPin[ledNum], HIGH); //
ledSwitchTime[ledNum] = millis(); // merkt sich die Einschaltzeit
}
void blinkStop(const byte ledNum) // blinkSart
{
zaehler[ledNum] = 0; // Merker löschen
digitalWrite(ledPin[ledNum], LOW); // gesichert aus machen
}
void blinken(const byte ledNum)
{
if (millis() - ledSwitchTime[ledNum] >= ledSwitchIntervall[ledNum]) // Wenn Zeit abgelaufen
{
ledSwitchTime[ledNum] += ledSwitchIntervall[ledNum]; // Schaltzeitpunkt merken
digitalWrite(ledPin[ledNum], !digitalRead(ledPin[ledNum])); // toogelt den PIN
zaehler[ledNum]++; //
}
}
Ja das müsst er sein, kann ich aber leider noch nicht 100 pro sagen da mir, na rate mal, genau der Mp3 Player noch nicht vorliegt. Bei AZ bestellt, kommt die tage, aber dem Bild und der Beschreibung nach müsste das der selbe sein.
Ich hab mich mal zwischendurch an das Ding gesetzt udn auf busyPin umgeschrieben.
Gleichzeitig aufgeräumt.
Du kannst das ganz einfach testen ohne Player.
Dazu müsste es reichen die auskommentierten Zeilen einfach einkommentieren.
Na denne.
// Forensketch Halloween Projekt der Kids, Pir, Mp3 und Nachtwächter?)
// https://forum.arduino.cc/t/halloween-projekt-der-kids-pir-mp3-und-nachtwachter/1178798
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial playerSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
constexpr byte busyPin {6}; // Wenn der Player läuft, ist der PIN High
constexpr uint32_t playerSperrTime {5000};
uint32_t playerLastTime;
constexpr byte pirPin {5};
constexpr uint32_t pirSperrTime {5000};
constexpr byte ledPin[] {2, 3, 4};
constexpr uint32_t ledSwitchIntervall[sizeof(ledPin)] {200, 500, 300};
uint32_t ledSwitchTime[sizeof(ledPin)] = {0, 0, 0};
byte zaehler[sizeof(ledPin)] = {0};
enum class Status {warten, blitz, sperre};
Status zustand = Status::warten;
void setup()
{
Serial.begin(115200);
playerSerial.begin(9600);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
delay(300);
#endif
Serial.println(F("\r\nStart...\r\n"));
pinMode(pirPin, INPUT);
for (byte b = 0; b < sizeof(ledPin); b++)
{
pinMode(ledPin[b], OUTPUT);
digitalWrite(ledPin[b], LOW);
}
myDFPlayer.volume(10); //Set volume value. From 0 to 30
pinMode(busyPin, INPUT);
digitalWrite(busyPin, LOW);
}
//
void loop()
{
zustandsAutomat();
blitzlicht();
}
//
void zustandsAutomat()
{
switch (zustand)
{
case Status::warten:
if (digitalRead(pirPin)) // Der PIR wird nur einmal ausgelöst (retriggersperre)
{
blinkStart(0);
dfPlayerStart();
zustand = Status::blitz;
// digitalWrite(busyPin, HIGH); // Zustandstest! -sonst auskomemntieren!
}
break;
case Status::blitz:
if (zaehler[2] >= 4)
{
blinkStop(2);
zustand = Status::sperre;
// digitalWrite(busyPin, LOW); // Zustandstest -sonst auskommentieren!
}
// checkt, ob Player läuft
if (digitalRead(!busyPin)) // PIN ist schon LOW
{ playerLastTime = millis(); } // Zeit merken
break;
case Status::sperre:
if (digitalRead(busyPin)) // PIN ist noch HIGH
{ playerLastTime = millis(); } // Zeit merken
// gib den PIR wieder frei, wenn Zeiten abgelaufen
if (millis() - ledSwitchTime[2] > pirSperrTime && // nach dem letzen abgelaufen
millis() - playerLastTime > playerSperrTime) // player nicht aktiv
{
zustand = Status::warten; //
}
break;
}
}
//
void blitzlicht()
{
for (byte b = 0; b < sizeof(ledPin); b++)
{
if (zaehler[b]) // Wenn Zaehler aktiv
{
blinken(b); // dann switchen
}
}
if (zaehler[0] == 3) // Wenn
{
blinkStart(1); // dann nächsten blinker Starten
}
else if (zaehler[0] >= 6) // Ende?
{
blinkStop(0);
}
if (zaehler[1] == 2)
{
blinkStart(2);
}
else if (zaehler[1] >= 4)
{
blinkStop(1);
}
}
//
void dfPlayerStart()
{
// Hier den DFplayer spielen lassen
// Der gibt auch einen Status zurück, der angibt, wenn er nicht (mehr) spielt
// Den kann man ebenfalls in die retriggersperre setzen
myDFPlayer.play(1); //Play the first mp3
}
//
void blinkStart(const byte ledNum) // die Zuordnung ergibt sich aus ledPin[]
{
zaehler[ledNum] = 1; // setzt den Merker fürs einschalten
digitalWrite(ledPin[ledNum], HIGH); //
ledSwitchTime[ledNum] = millis(); // merkt sich die Einschaltzeit
digitalWrite(busyPin, HIGH);
}
//
void blinkStop(const byte ledNum) // blinkStop für ledPin[]
{
zaehler[ledNum] = 0; // Merker löschen
digitalWrite(ledPin[ledNum], LOW); // gesichert aus machen
}
//
void blinken(const byte ledNum)
{
if (millis() - ledSwitchTime[ledNum] >= ledSwitchIntervall[ledNum]) // Wenn Zeit abgelaufen
{
ledSwitchTime[ledNum] += ledSwitchIntervall[ledNum]; // Schaltzeitpunkt merken
digitalWrite(ledPin[ledNum], !digitalRead(ledPin[ledNum])); // toogelt den PIN
zaehler[ledNum]++; //
}
}
Tach, wenn ich das 1 zu 1 Übernehm sagt er das die bibliothek fur den player fehlt, ist ja klar, wenn ich "#include "DFRobotDFPlayerMini.h"" kommentier sagt er "DFRobotDFPlayerMini myDFPlayer; does not name a type", und so weiter. Ich glaub zum Test brauch ich dann doch den Player.
Und da kommt gleich die nächste frage
woher wissen die Led's wie oft sie blinken müssen? wie Ändere ich die Anzahl des Blinkens? kann die Anzahl variabel verändert werden? Die gleiche frage betrifft die Ausschaltzeit, denke aber sie ist an die Einschaltzeit gekoppelt da diese ja identisch sind.
Mir ist auch aufgefallen das die Led an pin 4 das zweite mal blinken nicht gleich lang ausführt wie das erste leuchten, als bim zweiten blink ist dies minimal kürzer, woran kann das liegen? Ich finde es vom gesamt Bild sogar recht gut, möchte aber gern verstehen weshalb das so ist.
Ich oute mich gerade als den Größten noop in Sachen Programmierung, dabei war ich so stolz auf mein einfaches blinken
iKanns nur immerwieder sagen, vielen dank für deine hilfe und die damit verbundene arbeit, zeit und aufwand
Du kannst ind der IDE unter sketch bibliothejsverwalter nach der lib suchen oder dir von dem link das als ZIP runterladen und dann im bibloverwalter via .zip- Bibliothek hinzufügen einlesen.
Dann kompiliert es.
Die anzahl für das blinken ergibt sich aus dem Vergleich in der Funktion blinken.
Die könnte man als konstante nach oben holen, damit die einfacher anzupassen sind
Das mit den ein- und ausschaltzeuten gabe ich grad in einem anderen Projekt "flexibel" gezeigt. Schau mal in den zeitscgaluhr ghread.
Ich bin mitm Handy unterwegs .
Sag was du haben wkst und ich Bau dir das morgen....
Aaaaalso, der Sketch mit dem Dfplayer funktioniert nicht, es tut sich gar nichts außer das die tx Led eine zeit lang leuchtet und dann erlischt. Habe einen Test Sketch laufen lassen und der Player spielt die mp3 ab. Der reine Blinksketch ohne den Player funktioniert auch, aber leider weder der ohne den busy pin, noch der mit. Arduino bootet, die tx Led leuchtet eine weile und mehr passiert leider nicht.
Das ist der Sketch den ich zum testen verwendet habe ob die mp3 überhaupt abgespielt wird. Komischerweise muss ich allerdings rx an pin 11 legen und tx an pin 10, entgegen der zuweisung
/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
<https://www.dfrobot.com/product-1121.html>
***************************************************
This example shows the basic function of library for DFPlayer.
Created 2016-12-07
By [Angelo qiao](Angelo.qiao@dfrobot.com)
GNU Lesser General Public License.
See <http://www.gnu.org/licenses/> for details.
All above must be included in any redistribution
****************************************************/
/***********Notice and Trouble shooting***************
1.Connection and Diagram can be found here
<https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
2.This code is tested on Arduino Uno, Leonardo, Mega boards.
****************************************************/
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
void setup()
{
mySoftwareSerial.begin(9600);
Serial.begin(115200);
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while(true){
delay(0); // Code to compatible with ESP8266 watch dog.
}
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(10); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
}
void loop()
{
static unsigned long timer = millis();
if (millis() - timer > 3000) {
timer = millis();
myDFPlayer.next(); //Play next mp3 every 3 second.
}
if (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
}
}
void printDetail(uint8_t type, int value){
switch (type) {
case TimeOut:
Serial.println(F("Time Out!"));
break;
case WrongStack:
Serial.println(F("Stack Wrong!"));
break;
case DFPlayerCardInserted:
Serial.println(F("Card Inserted!"));
break;
case DFPlayerCardRemoved:
Serial.println(F("Card Removed!"));
break;
case DFPlayerCardOnline:
Serial.println(F("Card Online!"));
break;
case DFPlayerUSBInserted:
Serial.println("USB Inserted!");
break;
case DFPlayerUSBRemoved:
Serial.println("USB Removed!");
break;
case DFPlayerPlayFinished:
Serial.print(F("Number:"));
Serial.print(value);
Serial.println(F(" Play Finished!"));
break;
case DFPlayerError:
Serial.print(F("DFPlayerError:"));
switch (value) {
case Busy:
Serial.println(F("Card not found"));
break;
case Sleeping:
Serial.println(F("Sleeping"));
break;
case SerialWrongStack:
Serial.println(F("Get Wrong Stack"));
break;
case CheckSumNotMatch:
Serial.println(F("Check Sum Not Match"));
break;
case FileIndexOut:
Serial.println(F("File Index Out of Bound"));
break;
case FileMismatch:
Serial.println(F("Cannot Find File"));
break;
case Advertise:
Serial.println(F("In Advertise"));
break;
default:
break;
}
break;
default:
break;
}
}