MezData-Logo

Exit-Room Telefon mit Arduino Uno und DFPlayer Mini

Wählscheibentelefon steuert DFPlayer Mini

Aufbau

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

Schaltung

DFPlayerMini_Fast laden

Libary

Quellcode [ExitRoom/ExitRoom.ino]
/* 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

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)