• Hallo Zusammen, Aufgrund der aktuellen Situation setzten wir die Möglichkeit aus, sich mit Gmail zu registrieren. Wir bitten um Verständnis Das RCMP Team

Anleitung Arduino mit DCF77-Modul und RTC Echtzeituhr DS3231

norju

Mitglied
Moin BAXL,

heute melde ich mich einmal mit einem Tipp für Anwender und Anwenderinnen, die sich auch mit dem Problem prellender Kontakte des Drehimpulsgebers (Rotary-Encoders oder auch Kodierter Drehschalter) KY-040 herumschlagen. Der Ausgangspunkt war, die fertige DCF77-Uhr noch schicker zu gestalten und sie um eine Weckfunktion zu erweitern. Dafür war zu entscheiden, wie die Weckzeiten eingestellt werden sollen. Die Stunden und Minuten der Weckzeit mittels Drucktaster steuern erschien mir recht mühsam. Also entschied ich mich für den Einsatz eines Drehimpulsgebers. Der ist offensichtlich mit mechanischen Kontakten ausgestattet und somit anfällig für Schmutzeffekte durch prellende Kontakte.

Eine Hardware-Lösung mittels RC-Glied oder die Software-Lösung durch Delay-Passagen schieden sofort aus. Mit der "Bounce2-Bibliothek" war kein brauchbares Ergebnis zu erzielen.

Die vielseitig einsetzbare millis()-Funktion brachte sehr erfolgversprechende Ergebnisse, indem sie für die beiden Kontakte zur Kodierung der Drehrichtungen eingesetzt wird. Den Standard-Sketch des KY-040 habe ich entsprechend erweitert.

Der Tasterausgang ist im folgenden Beispiel-Sketch abweichend (weil für meine Anwendung erforderlich) als Interrupt-Lösung angelegt:


Code:
#include <Encoder.h>//                                       Library für den RotaryEncoder
// Initialisierung benötigter Variablen
int Pin_clk_Letzter;//                                       letzter Status des clk-Pins
int Pin_clk_Aktuell;//                                       aktueller Status des clk-Pins
// Definition der Eingangs-Pins
int pin_clk = 8;//                                           Uhrzeigersinn
int pin_dt = 7;//                                            GegenUhrzeigersinn
int button_pin = 3;//                                        Interruptfähiger Pin
long encMillis;//                                            Mindest-Zeitablauf für Encoder-Kontakte entprellen
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time;

void setup()
{
   // Eingangs-Pins werden initialisiert...
   pinMode (pin_clk,INPUT);
   pinMode (pin_dt,INPUT);
   pinMode (button_pin,INPUT);
   // ...und deren Pull-Up Widerstände aktivieren
   digitalWrite(pin_clk, true);
   digitalWrite(pin_dt, true);

   // Drucktaste des Encoders initialisieren
   digitalWrite(button_pin, INPUT_PULLUP);

   // Drucktaste dem Interrupt-Pin Zuweisen  
   attachInterrupt(digitalPinToInterrupt(button_pin), interrupt_call, CHANGE);

 
   Pin_clk_Letzter = digitalRead(pin_clk);//                 Initialisierendes Auslesen des Pin_CLK
   encMillis = millis();//                                   Entprellzeit initianlisieren
}

void loop()
{
//   // Auslesen des aktuellen Statuses
   Pin_clk_Aktuell = digitalRead(pin_clk);
//    // Überprüfung auf Änderung
   if (Pin_clk_Aktuell != Pin_clk_Letzter)
//  Pin_CLK hat sich zuerst verändert, also rechtsdrehend
   {
        if (digitalRead(pin_dt) != Pin_clk_Aktuell)
        {
            if (millis() - encMillis >= 100)//               Schutzphase zum Entprellen prüfen
            {
//
//
//  Code-Block für die Auswertung und weitere Verarbeitung
//  der Rechtsdrehung (Uhrzeigersinn) des Drehimpulsgebers.
//  ....
//
              encMillis = millis();//                        Ende der Entprellzeit
            }
        }
        else
//  Andernfalls hat sich Pin_DT zuerst verändert, also linksdrehend
        {
            if (millis() - encMillis >= 100)//               Schutzphase zum Entprellen prüfen
            {
//
//
//  Code-Block für die Auswertung und weitere Verarbeitung
//  der Linksdrehung (GegenUhrzeigersinn) des Drehimpulsgebers.
//  ....
//
              encMillis = millis();//                        Ende der Entprellzeit
            }
        }
// Vorbereitung für den nächsten Druchlauf:
// Der Wert des aktuellen Durchlaufs ist beim nächsten Druchlauf der vorherige Wert
      Pin_clk_Letzter = Pin_clk_Aktuell;
   }
}

void interrupt_call()//                                      Interruptaufruf incl. entprellen der Encoder-Drucktaste
{
  interrupt_time = millis();
  if (interrupt_time - last_interrupt_time > 250)//          Interruptimpuls ignorieren, der früher als 250 ms erfolgt
  {
//
//  Befehlsfolge, die vom Interrupt ausgelöst werden soll
//  ....
//
  }
  last_interrupt_time = interrupt_time;
}
Vielleicht kann jemand diesen Ansatz für eigene Anforderungen verwenden.

Gruß norju
 

Axel_TR

Neuer Benutzer
Hallo,
ich bin neu hier im Forum und auch relativ neu, was den Arduino angeht.
In meinem kleinen Projekt benötige ich eine Uhr, die sich nach Stromausfall wieder selbständig stellt - da ist eine Uhr mit DCF77-Signal genau das Richtige.
Und so bin ich auf diesen Eintrag gekommen.,

Ich habe mir den Sketch aus Post #5 angesehen, kopiert und wollte starten.
Doch leider klappt das nicht, so wie es aussieht, gibt es ein Problem mit der Library "DCF77.h".
Hierzu wird eine Fehlermeldung in der Arduino-IDE ausgegeben.
--- --- --- ---
/.../Documents/Arduino/libraries/DCF77/DCF77.cpp: In static member function 'static void DCF77::finalizeBuffer()':
/.../Documents/Arduino/libraries/DCF77/DCF77.cpp:160:21: error: 'now' was not declared in this scope
filledTimestamp = now();
^~~
/.../Documents/Arduino/libraries/DCF77/DCF77.cpp:160:21: note: suggested alternative: 'pow'
filledTimestamp = now();
^~~
pow
/.../Documents/Arduino/libraries/DCF77/DCF77.cpp: In static member function 'static bool DCF77::receivedTimeUpdate()':
/.../Documents/Arduino/libraries/DCF77/DCF77.cpp:189:46: error: 'now' was not declared in this scope
time_t processedTime = latestupdatedTime + (now() - processingTimestamp);
^~~
/.../Documents/Arduino/libraries/DCF77/DCF77.cpp:189:46: note: suggested alternative: 'pow'
time_t processedTime = latestupdatedTime + (now() - processingTimestamp);

usw.
--- --- --- ---
Was tun? Ich bin ratlos.

Über einen Tipp, etwas Hilfe würde ich mich freuen.
Danke
 

Axel_TR

Neuer Benutzer
Hi Baxl,

ja, es sind alle installiert, auch die DCF77.h, siehe Bild.
Ich hab keinen Plan, was da fehlen sollte.
Der Fehler tritt beim Kompilieren auf

Gruß Axel
Arduino-Libraries.jpg
 
Zuletzt bearbeitet:

BAXL

Admin
Mitarbeiter
Hallo Axel, hast Du die DCF77 Lib so irgendwo aus dem Netz oder ist das die Lib von hier aus dem Forum Unter Ressourcen/Software?
 

Axel_TR

Neuer Benutzer
Moin Baxl,
ich habe alle Libraries über die Arduino IDE installiert.
Dachte das wäre I.O.
Sind die Libraries hier im Forum anders?
 

BAXL

Admin
Mitarbeiter
Moin Baxl,
ich habe alle Libraries über die Arduino IDE installiert.
Dachte das wäre I.O.
Sind die Libraries hier im Forum anders?
Leider ja. Manchmal reicht es auch, die Arduino IDE upzudaten damit nix mehr läuft.
Bei einem ähnlich gelagerten Fall hier im Forum, habe ich dem Kollegen meine meine Arduino-Version geschickt, die dazugehörigen Libs und dann lief das Programm.


Es ist also nie sicher, dass ein Programm mit einer neueren Lib oder IDE funktioniert.
Ich empfehle darum, alte Stände vorsichthalber (zumindest als Install-Files) zu sichern.
 

Axel_TR

Neuer Benutzer
Hi Baxl,
habe die DCF77.h aus Eurem Fundus eingebunden.
Beim Kompilieren erscheinen diese Fehlermeldungen ROT:
Ich komme hier nicht weiter, irgendwo klemmt.

================================
Sketch wird kompiliert ...
/Users/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10607 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR -I/Users/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino -I/Users/alex_anna/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/variants/eightanaloginputs -I/Users/Documents/Arduino/libraries/DCF77 -I/Users/Documents/Arduino/libraries/Time -I/Users/alex_anna/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/libraries/Wire/src -I/Users/Documents/Arduino/libraries/LiquidCrystal_I2C -I/Users/Documents/Arduino/libraries/RTClib/src -I/Users/alex_anna/Documents/Arduino/libraries/Adafruit_BusIO -I/Users/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/libraries/SPI/src /private/var/folders/bs/p_7sf61x6qd9x6mxpzd358xc0000gn/T/arduino/sketches/3C51F429113C0D91C6F0C5F9DF7FDAD3/sketch/DCF77__RC-Modell__Post-5.ino.cpp -o /private/var/folders/bs/p_7sf61x6qd9x6mxpzd358xc0000gn/T/arduino/sketches/3C51F429113C0D91C6F0C5F9DF7FDAD3/sketch/DCF77__RC-Modell__Post-5.ino.cpp.o
Bibliotheken werden kompiliert ...
/Users/Documents/Arduino/libraries/DCF77/DCF77.cpp: In static member function 'static void DCF77::finalizeBuffer()':
/Users/Documents/Arduino/libraries/DCF77/DCF77.cpp:160:21: error: 'now' was not declared in this scope
filledTimestamp = now();
^~~
/Users/Documents/Arduino/libraries/DCF77/DCF77.cpp:160:21: note: suggested alternative: 'pow'
filledTimestamp = now();
^~~
pow
/Users/Documents/Arduino/libraries/DCF77/DCF77.cpp: In static member function 'static bool DCF77::receivedTimeUpdate()':
/Users/Documents/Arduino/libraries/DCF77/DCF77.cpp:189:46: error: 'now' was not declared in this scope
time_t processedTime = latestupdatedTime + (now() - processingTimestamp);


>> und weitere Meldungen, habe einen Ausschnitt hineinkopiert
In den Fehlermeldungen erscheint immer die DCF77.h, alle anderen Libraries funktionieren.
 

BAXL

Admin
Mitarbeiter
Die DCF77.h habe ich nicht selbst erstellt sondern auch nur als Lib irgendwo herbekommen.
Möglich, dass die "alte" Lib nicht mit der neuen Arduino GUI zusammenarbeitet.
Was die Fehlermeldungen im Einzelnen bedeuten, da könnte ich aktuell nur spekulieren oder mir was aus den Fingern saugen.
Im Klartext, mir fehlt da schlicht das Wissen an welchen Rädern gedreht werden muß um das zu beheben. :)

Vielleicht kannst Du verschiedene DCF77 Libs durchprobieren, ob eine mit dem Compiler läuft.


Edit:
Ich gucke heute Abend mal nach, welchen Softwarestand meine Arduino GUI hat. Vielleicht kannst Du kurz schreiben welches Release Du installiert hast.
 

Axel_TR

Neuer Benutzer
Hallo Baxl,

bei mir ist die Version 2.2.1 installiert ( Datum: 2023-08-31T13:53:43.373Z / CLI Version: 0.34.0Copyright © 2024 Arduino SA [{5}])

Updates findet die IDE nicht, scheint soweit alles i.O. zu sein.
 

BAXL

Admin
Mitarbeiter
Hallo Baxl,

bei mir ist die Version 2.2.1 installiert ( Datum: 2023-08-31T13:53:43.373Z / CLI Version: 0.34.0Copyright © 2024 Arduino SA [{5}])

Updates findet die IDE nicht, scheint soweit alles i.O. zu sein.
Ich habe zwar noch nicht nachgeschaut, bei mir ist es aber garantiert eine ältere Version. Zur Not packe ich meine Version in eine zip und lege sie Dir auf irgendeinen Dateihoster.
 

Axel_TR

Neuer Benutzer
Hi Baxl,
ich komme mit der DCF77.h nicht weiter, das klemmt stetig bei mir.
Ich realisiere das erstmal mit einem RTC-Modul, in dem Fall mit einem DS3231.
Zu einem deutlich späteren Zeitpunkt versuche ich mich dann wieder das mit dem DCF77-Modul.
VG Alex
 
Top Bottom