Wählscheibentelefon steuert DFPlayer Mini
Für einen Exit-Room soll ein Hilfetelefon mit 10 Tipps bereit gestellt werden.
Ein klassisches Wählscheibentelefon mit Impulswahl ist mit einem Arduino und einem DFPlayer-Mini verbunden.
Die Auswertung der Impulse wurde besonders an die "alten" Kontakte historischer Telefone angepasst.
Alle 2ms wird der Telefonpin ausgelesen und der Wert in einer Variablen wPegel aufsummiert, simuliert das Laden, bzw. Entladen eines Kondensators mit konstantem Strom. Maximalwert ist 10. Eine Software Schmitt-Triggerfunktion mit den Schaltschwellen 4 und 6 erzeugt daraus einen Wert wSignal. Die typischen Kontaktschwierigkeiten alter Kontakte sind eleminiert. Steigende Flanken von wSignal werden als Impulse in wImpulse gezählt und nach 1,1 Sekunden seit dem ersten Impuls ausgewertet, das entsprechende Datei 0001.mp3 bis 0010.mp3 (10 bei der 0) von der SD-Karte im Root-Verzeichnis ausgegeben. Wird während der Ausgabe erneut gewählt, erfolgt sofort die Ausgabe der neuen Datei.
Schaltplan
DFPlayerMini_Fast laden
/* ExitRoomTelefon V1.0 (c) Oliver Mezger 16.05.2020 */
#include <SoftwareSerial.h>
#include <DFPlayerMini_Fast.h>
#define Telefonpin 12 // zum Telefon
#define Testoutput 13 // zur Kontrolle
#define W_Pegel_Max 10
#define W_Pegel_Tlow 4 // Threshold low Schaltschwelle
#define W_Pegel_Thigh 6 // Threshold high
unsigned char wPegel = W_Pegel_Max; // zeitlicher Pegel
bool wSignal = 1; // Zustand nach Threshold
SoftwareSerial mySerial(10, 11); // RX, TX
DFPlayerMini_Fast myMP3;
unsigned long myMillis;
void setup() {
Serial.begin(115200);
mySerial.begin(9600);
myMP3.begin(mySerial);
Serial.println("Setting volume to 20");
myMP3.volume(20); // 0..30
delay(20);
pinMode(Telefonpin,INPUT);
pinMode(Testoutput,OUTPUT);
myMillis=millis();
}
typedef enum {ruhe,impuls,play} wZustandtyp;
wZustandtyp wZustand = ruhe;
void loop() {
static bool wImpuls = 0; // steigende Flanke
static unsigned char wImpulse = 0; // Impulszaehler
static unsigned long wMillis;
// Einlesen des Telefonpins und entstören des Signals
if(myMillis+2<=millis()){ // wenn 2ms vergangen sind
myMillis=millis();
if(digitalRead(Telefonpin)){ // wenn 1
if(wPegel<W_Pegel_Max) wPegel++;
}
else if (wPegel>0) wPegel--;
if(wSignal){ // Schmitt-Trigger
if(wPegel<= W_Pegel_Tlow){ // unter Threshold unterschritten
wSignal=0;
digitalWrite(Testoutput,LOW); // Testausgabe
}
}
else if (wPegel >= W_Pegel_Thigh){ // oberer Threshold ueberschritten
wSignal=1;
digitalWrite(Testoutput,HIGH); // Testausgabe
wImpuls=1; // ein Waehlimpuls
}
}
// Zustands-Automat
switch(wZustand){ // Wahlzustaende
case ruhe: // warten auf Impuls
if(wImpuls){
wZustand=impuls;
wImpulse = 0;
wMillis=1100+millis(); // nach 1,1 sec ist Nummer durch
}
break;
case impuls: // Impulse zaehlen
if(wImpuls){
wImpuls=0;
wImpulse++;
}
if(millis()>wMillis) wZustand=play; // Zeit ist um
break;
case play: // Stueck spielen
Serial.println(wImpulse); // Testausgabe
myMP3.play(wImpulse); // spiele Stueck 1..10
wZustand = ruhe;
}
}
Ausblick
- Telefon an A/D-Wandler anschließen um den Zustand "Abgehoben" zu erkennen
- Wählton ausgeben
- Mehrstellige Nummern ermöglichen
Wählscheibentelefon Links
Nummernschalter wikipedia.org/wiki/Nummernschalter
Impulswahl (IWV) nach Mehrfrequenzwahl (MFV) konvertieren
DFPlayer Mini Links
DFRobot wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299
PowerBroker2 / DFPlayerMini_Fast
DFPlayer Mini Ansteuerung mit dem Arduino (Gute Beschreibung der Verzeichnisstruktur)