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 „Gefällt mir“

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 „Gefällt mir“

Der Link zu dem Uhrwerk ist nicht mehr verfügbar.
Hier ein Link zum gleichen Uhrwerk
e-bay Herrenquartzuhr mit Wecker

Hier noch ein weiterer Link zum Gleichen Uhrwerk
e-bay Herrenuhr mit Wecker

Ich bin noch nicht so weit mit meinem ersten Tonuino, werde mir das ein oder andere in deinem Code aber sicher ansehen :+1:t2:
Also danke schonmal fürs teilen.

Das beste Feature ist das merken der letzten Karte. Außerdem ist das Zurücksetzen im Hörbuchmodus echt sinnvoll. Und Wecker ist auch cool, wobei mein Kind noch sehr lange keinen Wecker brauchen wird, daher spare ich mir das in der ersten Version.

Wecker finde ich auch toll und benötige ich auch bald. Nur habe ich noch kein Uhrwerk gefunden, welches nicht tickt und Weckfunktion mit Ausgang hat.

Wie hast du @Thomas-Lehnert das denn gelöst?

Ich hätte ne Idee habs aber noch nicht durchdacht…

Er hat es so gelöst:

Aber zum Einen gibts die Uhr nicht mehr und zum Anderen hätte ich gerne ein großes Uhrwerk.

Und mir schwebt eine einfachere Umsetzung vor :sweat_smile:. Das was @Thomas-Lehnert da gemacht hat ist schon gehobene Klasse.

Was für eine denn?

Was meinst du damit? Willst du eine Zeigeruhr?

Ich möchte in etwas sowas basteln

@Manuel okay ich verstehe dein Problem. Wenn mir irgendwann was ei fällt melde ich mich bei dir.

Hallo. Diese Uhr gibt es noch von einem anderen Anbieter.
e-bay-Herren-Armbanduhr mit wecker

Es ist die gleiche wie ich verwendet habe.

Korrigiere, Es ist leider nicht die gleiche. Diese hat keine Korrektur der Zeigerstellung über Taste, sondern mit Rändelkrone. Sorry.

e-bay Herrenarmbanduhr -Zeigerstellung über Taste einstellbar

Anderer Link für die gleiche Uhr

e-bay Herrenuhr mit Wecker

Diese Ist aber die Gleiche. Gibt es in verschiedenen Farben.

Okay ich hab mir die Lösung mal genauer angesehen. Das ist natürlich elegant gemacht mit der Zeigerkorrektur…

Es ginge natürlich auch irgendein einfacher anderer Wecker. Man muss sich dann nur überlegen, wie man den Mechanismus zum Einstellen erreichbar macht. Dann wird eben nur das Wecksignal abgegriffen und der Wecker bleibt ansonsten autark.
So würde ich es mir vielleicht durchdenken, wenn ich es nicht so komplex machen will.

Man könnte den Wecker extern über ein Kabel anschließen und man müsste aufstehen um den Tonuino auszuschalten :grimacing:

Die sind ja sehr hübsch, aber der Preis ist nicht ohne.

Ja, der Preis ist schon sehr hoch und dann muss man auch noch auf der Rückseite das entsprechende Tier einstellen. Das hat nichts mit dem aufgelegten Tier zu tun…
Daher will ich es gleich richtig machen :joy:
Nur fehlt mir aktuell noch das schleichende Uhrwerk mit Weckfunktion, welche ich auch noch abgreifen kann…

@Thorsten_L Das mit dem Wecker hab ich auch schon überlegt und einen im Warenkorb. Nur weiß ich halt nicht, ob ich das Wecksignal irgendwie abgreifen und den Ton deaktivieren kann. Das Thema Zeiger stellen ist aktuell zweitrangig, aber muss auch irgendwie gelöst werden. Hatte mir auch schon überlegt, ein einfaches Uhrwerk zu nehmen, welches einfach die Uhrzeit anzeigt. Der Arduino bekommt dann eine Echtzeituhr und die Weckzeit wird dann gleich mit auf der Figur gespeichert. Wobei ich noch nicht weiß, wie ich es die Weckzeiteinstellung kindgerecht umsetzen könnte…

Edit: Sorry @Thomas-Lehnert, irgendwie gehört das Thema eher in deinen Wecker Thread rein…
Edit2: Danke an das Heinzelmännchen (@stephan) :wink:

Wenn auf dem Tier eine Weckzeit gespeichert ist, könnte es beim Auflegen fragen ob die Zeit geändert werden soll (Ja/Nein). Bei Ja fragt der TonUINO „Wann möchtest du geweckt werden?“ Dann wählt man Stunde und danach Minute mit den Tasten, so wie man einen Ordner wählt, wenn man eine neue Karte anlernt.

Idee ist gut.
Nur die Frage wann ich zum Programmieren komme :joy:.

Hier muss man aber bedenken, dass der Tonuino ja nicht die ganze Zeit eingeschaltet ist. Die Echtzeituhr würde ja nur ausgelesen, wenn der Arduino auch aktiv ist. Das war auch einer der Gründe, warum ich ein externes Weckeruhrwerk verwendet habe, dass den Tonuino zu gegebener Zeit aufweckt und den Weckersound abspielt. Ein Weckeruhrwerk mit einem mechanischen Kontakt könnte zum Beispiel auch sehr gut verwendet werden.

Verlinkst du mir den, den du ausgesucht hast?

Naja man kann ja die Kabel zum Weckerlautsprecher trennen.
Und dann das Signal auf der Platine finden und damit den Pololu schalten. Mit Glück reicht es direkt, ansonsten über einen Transistor die 5V an den Pololu bringen.
Dann ist das Moped schonmal an. Außerdem kann man es z.b. über einen Analogeingang abfragen um einen Shortcut zu spielen.

So könnte man sogar die Snooze Taste am Wecker nutzen und damit den Pololu wieder ausschalten. Dann würde es beim nächsten Wecken wieder angehen…

Bisher nur Theorie. Ich warte noch auf ein paar Teile und hab im Moment nur begrenzt zeit. Will das aber gerne ausprobieren. Stelle mir vor einen Wecker mit Kabel und z.b. 2,5mm Klinke, die ich direkt in den Tonuino stecken kann.