Liebes Forum,
im August baute ich meinem Kind eine Phoniebox, weil mir die Kommerzielle Version einfach viel viel zu teuer in Anschaffung und neuen Figuren war.
Das Internet ist voll mit Ideen und Umsetzungen dazu, trotzdem habe ich ein wenig meine eigene Note dazu gedichtet.
Der Scetch funktioniert eigentlich super, nur in der Stromversorgung habe ich wohl irgendetwas verhauen.
Ziel war die Versorgung über eine eingebaute Powerbank und die automatische Abschaltung.
Deshalb wollte ich keinen einfachen menchanischen Schalter.
Im Anhang habe ich gemalt, was ich irgendwie zusammengelötet habe.
Die Plus- Leitungen gehen direkt an den DFPlayer, einen ServoMotor (er soll mal Augen bewegen) und einem Relaismodul mit 2 Wechslern.
Vor dem Arduino Nano musste ich eine Diode schalten, da sonst Störgeräusche aus dem DF Player kommen. Die kommen immer wenn beide Geräte an einer Stromquelle sind. Mit einer Diode am Arduino funktioniert es aber auch.
Die GND Seite ist die Steuerung.
Wenn ich S1 drücke, fließt der GND durch die Diode auf den IN1 des Relais, der ist auf GND gejumpert und lässt R1 anziehen, dann hält er sich selbst und versorgt die anderen Geräte mit GND.
Die Schalter S2 und S3 sind um Lauter und Leiser zu schalten und gehen auf D2 und D3 am Arduino.
Nach S1 geht es auch zum Arduino D7, getrennt durch eine Diode um den Schalter für Play/ Pause nutzen zu können.
Nicht aufgezeichnet habe ich die Verbindung Arduino D8 zum IN2 des Relais, der hebt die Selbsthaltung von Relais 1 wieder auf. Die habe ich mit einem Kondensator zu Plus unterstützt, da die Selbsthaltung sonst zu kurz unterbrochen war und sich noch hielt.
Die restliche Verdrahtung ergibt sich aus dem Sketch oder ist nicht wichtig.
#include <SPI.h>
#include <MFRC522.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <Servo.h>
Servo myservo;
int pos = 0;
#define RST_PIN 9
#define SS_PIN 10
SoftwareSerial mySoftwareSerial(6, 4); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
MFRC522 mfrc522(SS_PIN, RST_PIN); // Instanz des MFRC522 erzeugen
bool helfer = LOW;
bool starter = LOW;
bool musikLaeuft = LOW;
bool aus = LOW;
long standby = 1;
long ruhezeit = 60000;
byte daten [][11] = {
/*
* [*] [0] = zugehörige Liednummer
* [*] [1-11] = UID
*/
{2, 0x04, 0xE0, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Michelin
{1, 0x04, 0xDC, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Eule
{3, 0x04, 0xD8, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Spongebob
{4, 0x04, 0xE8, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Hai
{5, 0x04, 0xED, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Leo Lausemaus
{6, 0x04, 0xF2, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Benjamin
{0} // Zum Beenden der While
};
void setup() {
pinMode(13,OUTPUT); //kontroll LED
pinMode(8,OUTPUT); //Selbstmord
pinMode(7,INPUT); //Aus-Taste gedruekt?
digitalWrite(7,HIGH);
pinMode(2,INPUT); //Lauter-Taste gedruekt?
digitalWrite(2,HIGH);
pinMode(3,INPUT); //Leiser-Taste gedruekt?
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(13,LOW);
myservo.attach(5);
myservo.write(112);
standby = ruhezeit;
Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init();
mySoftwareSerial.begin(9600); //Kommunikation mit DFPlayer
Serial.println();
Serial.println(F("PhonieBox startet"));
Serial.println(F("Initializing DFPlayer ... "));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Die Verbindung nochmals prüfen"));
Serial.println(F("2.Bitte SD- Karte einlegen"));
while(true){
delay(0);
}
}
Serial.println(F("DFPlayer Mini ist bereit."));
myDFPlayer.volume(15); //Lautstärke einstellen
delay(2000);
}
void loop() {
if (digitalRead(7) == HIGH) (starter = HIGH); //damit man nicht beim Einschalten gleich das Ausschalten auslöst
if (millis() % 1000 <= 10 ) { //etwa jede Sekunde mal schauen ob die Musik läuft
if (myDFPlayer.readState()== 513) {
musikLaeuft = HIGH;
}
else {
musikLaeuft = LOW;
}
}
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
Serial.print("Gelesene UID:");
for (byte i = 0; i < mfrc522.uid.size; i++) {
// Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
Serial.println();
// UID Vergleichen
int h = 0;
do {
helfer = true;
for (int j=1; j<10; j++) {
if (mfrc522.uid.uidByte[j-1] != daten [h] [j]) {
helfer = false;
break;
}
}
if (helfer) {
Serial.print(h);
Serial.print(" erkannt");
Serial.println();
for (byte i = 0; i < mfrc522.uid.size; i++) {
// Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
if (daten [h][0] == 0 ) break;
myDFPlayer.play(daten [h] [0]);
Serial.println();
Serial.print ("Spielt Lied Nummer ");
Serial.print (daten [h] [0]);
Serial.println() ;
break ; //Schleife verlassen wenn er etwas gefunden hat
}
h = h +1;
} while ( daten [h][0] != 0);
// Hörer aufgelegt
byte visa [] = { 0x04, 0x0B, 0x29, 0xDA, 0xAB, 0x5C, 0x81};
// UID Vergleichen
helfer = true;
for (int j=1; j<7; j++) {
if (mfrc522.uid.uidByte[j] != visa [j]) {
helfer = false;
}
}
if (helfer) {
Serial.print("Hörer erkannt");
Serial.println();
aus = HIGH;
}
// Versetzt die gelesene Karte in einen Ruhemodus
mfrc522.PICC_HaltA();
delay(1000);
}
if (digitalRead(3) == LOW) { //Taster für Lauter
Serial.print("Lauter");
myDFPlayer.volumeUp();
delay(200); // bei gedrücktem Taster alle 0,2 Sekunden lauter
}
if (digitalRead(2) == LOW) { // Taster für Leiser
Serial.print("Leiser");
myDFPlayer.volumeDown();
delay(200);
}
if (musikLaeuft == HIGH) (standby = millis()+ruhezeit); // Wenn die Musik läuft, kann "Ruhezeit" ausgeschalten werden.
//Serial.print("Standby: ");
//Serial.println(standby);
//Serial.print("Millis: ");
//Serial.println(millis());
if (millis() >= standby) (aus = HIGH); // Lief die Musik "Ruhezeit" nicht, wird der Strom genommen
if (digitalRead(7) == LOW && (starter == HIGH)) { //Play/Pause
if (myDFPlayer.readState()==513){
myDFPlayer.pause();
}
else{
myDFPlayer.start();
}
helfer = true;
for (int i = 0; i <= 300; i++) { // wird der 3 sekunden nicht losgelassen
if (digitalRead(7)== HIGH) {
helfer = false;
break; // Abbrechen wenn innerhalb 3 Sekunden losgelassen wurde
}
delay(10);
}
if (helfer) {aus = HIGH;} //Selbstmord
}
if (aus){
myDFPlayer.pause();
myservo.write(134);
delay(200);
digitalWrite(8, LOW);
delay(10000);
standby = millis()+ruhezeit;
aus = LOW;
}
}
}
Wie gesagt, der Sketch funktioniert, auch die Stromsache funktioniert. Aber die Sache ist instabil. Etwa im Sekundentakt flakert die D13 LED, auch der Servo zuckt im selben Takt obwohl er noch nicht wirklich was zu tun hat.
Und manchmal startet der Arduino einfach neu, meist wenn die Musik recht laut ist, aber auch mal wenn sie leiser ist. Dies merke ich nicht an der Musik, die läuft weiter. Aber eine stehende Figur wird neu erkannt und das Lied beginnt von Vorne.
Die selben "Ausfallerscheinungen" treten auch auf, wenn ich S2 oder S3 drücke, die Musik wird lauter/leiser, aber ich habe das Gefühl dem Arduino damit kurzzuschliesen.
Seit August läuft die Box mit diesen Meisen, ich würde sie gerne dann noch perfektionieren. Seht ihr einen groben Fehler in meiner Bastelei?
Liebe Grüße
Stefan