TonUINO als Wecker

Ich habe nun schon einige TonUINOS für die diversen Enkel und Freunde gebaut und habe nun eine Erweiterung des Funktionsumfangs vor. Ich möchte den ToUINO so erweitern, dass er als Wecker dienen kann. Meine Idee ist, in das Gehäuse eine Quartzuhr mit Weckfunktion zu integrieren. Dazu habe ich ich mir in China schon 3 Armbanduhren bestellt, deren Uhrwerke ich dafür verwenden möchte. Dabei handelt es sich um Modelle, wo auch die Zeigerstellung nicht über einen Rändelknopf, sondern über elektrische Kontakte eingestellt werden kann. Das hat den Vorteil, dass man die entsprechenden Microtaster an beliebiger Stelle im Gehäuse verbauen kann. Der Weckausgang des Uhrwerkes ( Anschluss zum PiezoBuzzer) soll eine Logik ansteuern, die dann den Tonuino einschaltet. Die gewünschte Weckmelodie wird dann im Tonuino als Welcomesound oder als shortcut definiert. Wenn die Uhren eingetroffen sind und es funktioniert, werde ich weiter berichten. Kann sich nur noch um ein paar Wochen handeln, da ich gerade die Info bekam, dass meine Lieferung verloren gegangen ist und der Versender eine Neulieferung veranlasst hat.
Falls schon jemand Erfahrungen in dieser Richtung hat, immer her mit den Tipps.

Hi das ist gar keine schlechte idee!
Aber warum nutzt du nicht einfach eine Echtzeit Uhr?

Die Idee hatte ich auch schon, aber ich möchte aus Designgründen lieber ein Zeigeruhrwerk verwenden.
Ein weiterer Grund, dass ich dieses Modul nicht verwenden möchte ist, dass ich schon so viele Erweiterungen im Tonuino habe, dass einfach nicht mehr genug Speicherplatz zur Verfügung steht. (Bibliothek für das RTC Modul, Anzeigemodul u.s.w.)

01.03.2020
So nun habe ich schon eine funktionierende Lösung.
Anbei zunächst die Schaltung und der Code. Fotos vom fertigen Aufbau folgen, da die Schaltung zunächst nur auf dem Steckbrett aufgebaut.
Hier erst mal die Schaltung. Nicht wundern, ich hatte nur noch Analogpin 6 zur Verfügung. Deshalb wird dieser hier verwendet.!

Edit 02.03.2020— Im Schaltplan hat sich leider ein Fehler eingeschlichen. Widerstand R5 muss 1.2 MOhm haben, nicht 270 k. Sonst stimmt das Timing nicht.

Weckerzusatz TonUINO|690x487

Folgendes Uhrwerk habe ich verwendet. Es hat den Vorteil, dass alle Funktionen einschließlich der Zeigerstellung über Tasten gesteuert werden.
Armbanduhr Quartz Analog

Das Gehäuse ist aus Plastik, so dass ich es in eine runde Form feilen konnte, die sich gut ins Gehäuse integrieren lässt. Die Kontakte der Schalter , des Buzzers und der Batterie wurden mit feiner Litze herausgeführt. Der Buzzerkristall wird nicht mehr benötigt und fällt weg.

So und hier der Code.
Im Adminmenü wird bei der Konfigurierung der shortcuts ein Menüpunkt hinzugefügt. Wecker konfigurieren. Dazu muss im Ordner mp3 eine zusätzliche mp3 Datei erzeugt werden. 0945_alarmclock.mp3 .
Hier wird ein zusätzlicher shortcut festgelegt, der bei Aktivierung des Weckers abgespielt wird.

Bei den definitionen am Anfang folgendes einfügen.

    //  ------------------------------------------------------------------------------------------------
    #define Wecker                // Über ein externes Weckeruhrwerk wird eine Weckfunktion aktiviert
                                  // TonUINO wird eingeschaltet und ein vordefinierter shortcut als Wecker abgespielt
    // ------------------------------------------------------------------------------------------------

Dann bei den Definitionen der Pins folgendes einfügen.

        #ifdef Wecker 
          #define WeckerPin A6              // Eingangspin zum Abspielen Wecker-shortcut
        #endif  

Dann dies ändern in struct adminsettings

// admin settings stored in eeprom
struct adminSettings {
  uint32_t cookie;
  byte version;
  uint8_t maxVolume;
  uint8_t minVolume;
  uint8_t initVolume;
  uint8_t eq;
  bool locked;
  long standbyTimer;
  bool invertVolumeButtons;
  folderSettings shortCuts[5];          // Hier ändern von 4 nach 5

Dann in my settings die letzte Zeile des hier gezeigten Auszuges ergänzen.

 mySettings.shortCuts[0].folder = 0;      // kein Shortcut Pausetaste
  mySettings.shortCuts[1].folder = 0;      // kein Shortcut Vor-taste
  mySettings.shortCuts[2].folder = 0;      // kein Shortcut Rück-taste
  mySettings.shortCuts[3].folder = 0;      // kein Shortcut Welcomesound
  mySettings.shortCuts[4].folder = 0;      // kein Shortcut Weckersound

In Adminmenü folgendes ändern
Achtung, ich habe bei mir die Reihenfolge der Optionen im Adminmenü geändert.
wenn

else if (subMenu == 10) // Shortcut configurieren

nicht bei (subMenu == 10) steht, dann die Änderungen bei der original Option shortcut configuriern ausführen…

 // ********* Eine Taste mit einem Shortcut belegen **************
  else if (subMenu == 10)                     // Shortcut configurieren        (940-944) // 940-945)
    {                                                                                    // 945 Wecksound konfigurieren
      //uint8_t shortcut = voiceMenu(4, 940, 940);
      uint8_t shortcut = voiceMenu(5, 940, 940);                                // Voicemenü inklusive Wecksound
  setupFolder(&mySettings.shortCuts[shortcut - 1]);
  mp3.playMp3FolderTrack(400);              //OK. Ich habe die Karte konfiguriert.
}

Im Setup folgendes ändern bzw ergänzen

// *********** Start Shortcut "at Startup" - e.g. Welcome Sound ************
  #ifndef Wecker 
  playShortCut(3);
  #endif 
  
  // ************* Shortcut des Weckers abspielen ****************************
  #ifdef Wecker 
  uint16_t ReadWecker;                  // Variable für den ausgelesenen Wert des WeckerPin
  ReadWecker = analogRead(WeckerPin);   // Weil Analogpin 6 und 7 nicht als Digitalpins verwendet werden können
                                        // muss ein Umweg über analogRead() gegangen werden.
   if (ReadWecker >= 512)               // wenn Analogwert WeckerPin > 2,5V
   {
   delay(2000);
   playShortCut(4);                     // Wecker abspielen
  }
  else
   playShortCut(3);                     // Welcomesound spielen
  #endif  
  
}
// ****************** Ende Setup *********************************************

Falls Analogpin A6 offen ist, weil weckermodul noch nicht angeschlossen muss dieser über einen 100 k Ohm widerstand an Ground gelegt werden, oder die Funktion über die definition auskommentieren. Ansonsten wirkt A6 als floating Pin und es wird beim Start zufällig entweder Welcomsound oder Wecksound abgespielt.

Die Schaltung ist in Verbindung mir dem Code getestet und läuft soweit. D.h. der Tonuino schaltet sich über den Wecker ein und spielt den konfigurierten shortcut ab.

1 Like

Ich habe das Projekt nochmal überarbeitet und die Schaltung verbessert sowie noch ein paar Änderungen im Code vorgenommen. Prinzipiell gilt aber das gleiche wie im vorigen Beitrag.

Und hier noch mal die komplette Codeänderung bezogen auf die Standart Dev version.

Am Anfang bei den Definitionen für die Zusatzfunktionen folgendes einfügen

// ------------------------------------------------------------------------------------------------
#define Wecker                // Über ein externes Weckeruhrwerk wird eine Weckfunktion aktiviert
                              // TonUINO wird eingeschaltet und ein vordefinierter shortcut als Wecker abgespielt
// ------------------------------------------------------------------------------------------------

Dann bei den Definitionen der Pins den Weckerpin einfügen

#ifdef Wecker 
  #define WeckerPin A6              // Eingangspin zum Abspielen Wecker-shortcut
#endif  

Dann vor den Deklarationen des DF-Players folgendes einfügen

#ifdef Wecker 
bool ActWecker = false;                           // Wecker aktiv?
#endif

bool SETUP = true;                                // setup() ist aktiv

Dann in der struct adminsettings die foldersettings der shortcuts ändern

// admin settings stored in eeprom
struct adminSettings {
  uint32_t cookie;
  byte version;
  uint8_t maxVolume;
  uint8_t minVolume;
  uint8_t initVolume;
  uint8_t eq;
  bool locked;
  long standbyTimer;
  bool invertVolumeButtons;
  folderSettings shortCuts[5];   // von 4 nach 5 ändern
  
  uint8_t adminMenuLocked;
  uint8_t adminMenuPin[4];
};

Dann in my settigs die Zeile für den Weckershortcut ergänzen

void resetSettings() {                                            // my Settings auf defaultwerte zurücksetzen
  Serial.println(F("=== resetSettings()"));
  mySettings.cookie = cardCookie;
  mySettings.version = 2;
  mySettings.maxVolume = 25;               // max.Lautstärke
  mySettings.minVolume = 5;                // min.Lautstärke
  mySettings.initVolume = 15;              // Start-Lautstärke
  mySettings.eq = 1;                       // Equalizer Normal
  mySettings.locked = false;               // (nicht mehr benutzt)
  mySettings.standbyTimer = 5;             // Standbytimer auf 5 min
  mySettings.invertVolumeButtons = false;  // Funktion der Vol-Tasten umkehren AUS
  mySettings.shortCuts[0].folder = 0;      // kein Shortcut Pausetaste
  mySettings.shortCuts[1].folder = 0;      // kein Shortcut Vor-taste
  mySettings.shortCuts[2].folder = 0;      // kein Shortcut Rück-taste
  mySettings.shortCuts[3].folder = 0;      // kein Shortcut Welcomesound
  mySettings.shortCuts[4].folder = 0;      // kein Shortcut Weckersound
  mySettings.adminMenuLocked = 0;          // 0 = Adminmenü nicht geschützt, 
                                           // 1 = Schutz durch Adminkarte,  
                                           // 2 = Schutz durch PIN, Reihenfolge von 4 Tastendrücken
  mySettings.adminMenuPin[0] = 1;          // PIN 0 --> erste gedrückte Taste
  mySettings.adminMenuPin[1] = 1;          // PIN 1 --> zweite gedrückte Taste
  mySettings.adminMenuPin[2] = 1;          // PIN 2 --> dritte gedrückte Taste
  mySettings.adminMenuPin[3] = 1;          // PIN 3 --> Vierte gedrückte Taste

  writeSettingsToFlash();
}
// ***********************************************

Dann im Adminmenü Folgendes ändern

 // ********* Eine Taste mit einem Shortcut belegen **************
  else if (subMenu == 7)                     // Shortcut configurieren        (940-944) // 940-945)
    {                                                                                    // 945 Wecksound konfigurieren
      //uint8_t shortcut = voiceMenu(4, 940, 940);
      uint8_t shortcut = voiceMenu(5, 940, 940);                                // Voicemenü inklusive Wecksound
      setupFolder(&mySettings.shortCuts[shortcut - 1]);
      mp3.playMp3FolderTrack(400);              //OK. Ich habe die Karte konfiguriert.
    }

Dann vor der void setup()

Die Funktion Wecker einfügen

// *************************** Wecker *************************************************
#ifdef Wecker 
  void wecker()
  {
  uint16_t ReadWecker;                    // Variable für den ausgelesenen Wert des WeckerPin
  
  if (ActWecker == false)                 // Wenn Wecker noch nicht aktiviert wurde
  {
         
     
  ReadWecker = analogRead(WeckerPin);   // Weil Analogpin 6 und 7 nicht als Digitalpins verwendet werden können
                                        // muss ein Umweg über analogRead() gegangen werden.
                              
   if (ReadWecker >= 512)               // wenn Analogwert WeckerPin > 2,5V
   {
   ActWecker = true;
   playShortCut(4);                     // Wecker abspielen
   
  }
  else
    {
    if(SETUP == true)
    playShortCut(3);                     // Welcomesound spielen
    }
  }
  }
#endif  
//*****************************************************************************************

Dann in der void setup() folgende ergänzunen vornehmen

// *****************************************************************************************
//                           SETUP
// *****************************************************************************************
void setup() 
{
  SETUP = true;
  
  Serial.begin(115200);                   // serielle Schnittstelle initialisieren
 
  // Dieser Hinweis darf nicht entfernt werden
  Serial.println(F("\n _____         _____ _____ _____ _____"));
  Serial.println(F("|_   _|___ ___|  |  |     |   | |     |"));
  Serial.println(F("  | | | . |   |  |  |-   -| | | |  |  |"));
  Serial.println(F("  |_| |___|_|_|_____|_____|_|___|_____|\n"));
  Serial.println(F("TonUINO Version 2.1"));
  Serial.println(F("created by Thorsten Voß and licensed under GNU/GPL."));
  Serial.println(F("Information and contribution at https://tonuino.de.\n"));
  Serial.println(F("*****************************************************"));

Dann ebenfalls im Setup

 // *********** Start Shortcut "at Startup" - e.g. Welcome Sound ************************
  #ifndef Wecker 
    playShortCut(3);
  #endif 
  
  // *************  Wecker ** Hardwareerweiterung erforderlich ****************************
  #ifdef Wecker
  
    wecker(); 
 
  #endif  

  SETUP = false;
}
// ****************** Ende Setup *********************************************

Dann im loop nach der do geschweifte Klammer auf { folgendes einfügen

  // ********************************* Wecker **** Hardwareerweiterung erforderlich *************
  #ifdef Wecker
    if (ActWecker ==false)
    wecker(); 
  #endif

Bei der vorhergehenden Version funktionierte der Wecker nur bei ausgeschaltetem Tonuino. In der neuen Version kann der Wecker auch bei laufender Wiedergabe des Tonuino aktiv werden, z.B dass man einen Termin beim Hörbuch hören nicht verpasst. Die Weckeraktivierung ist bei laufendem Tonuino absichtlich nur einmal möglich. Eine erneuter Weckvorgang ist erst möglich, wenn der Tonuino zwischenzeitlich ausgeschaltet war.

Edit 08.03.2020
In der Rubrik Gehäuse habe ich nun die Fotos des vollendeten TonUINO als Wecker eingestellt.
hier der Link
TonUINO als Wecker - Fotos
Die Ideen reißen nicht ab. Zusätzlich habe ich noch eine Ergänzung in den Code eingearbeitet, die bewirkt dass auch bei eingestecktem Kopfhörer der Weckershortcut über die Lautsprecher abgespielt wird. Funktioniert aber nur, wenn die Lautsprecher über die Software ein oder Ausgeschaltet werden. Ist im Code untenstehender Link enthalten.
Anbei noch ein onedrivelink der alle Dateien enthält. Schaltpläne, Code und angepasste Dateien für den advert und mp3 Ordner der SD-Karte.
Wer Interesse hat darf zugreifen.
TonUINO in max Ausstattung mit Wecker

1 Like