Go Down

Topic: DCF77 clock met TM1637 LED display (Read 782 times) previous topic - next topic

gvlaere

Jun 17, 2019, 07:12 pm Last Edit: Jun 17, 2019, 07:15 pm by gvlaere
Beste mensen,

Met mijn huidige project heb ik een probleem waar ik niet uit kom. Ik heb een DCF77 klok gemaakt met een TM1637 LED display. Zie foto en code.

Hiervoor heb ik het programma van Thijs Ellenbaas gebruikt en dit zelf aangepast zodat het met een TM1637 6 digits display zou moeten werken.

Het probleem is dat nadat de tijd één maal is geupdated (en het LED display keurig de tijd aan geeft) er geen DCF77 tijd updates meer volgen. Zonder display (als ik het display spanningsloos maak door de + en - uit het breabord te trekken) volgen er weer netjes tijd updates iedere minuut.

Ik dacht eerst dat het misschien een storing is doordat het display via de pinnen 6 en 7 signaal geeft aan de Arduino UNO. Daarom het ik deze pinnen de met de functie "pinMode (xxx, OUTPUT); echt een output gemaakt. Dat werkte ook niet. Ik heb de pin 2 voor de DCF77 antenne de functie "input" gegeven. Ook dat werkt niet.

Ook als de hele schakeling op een accu is aangesloten heb ik nog steeds het probleem. Dus ik denk dat het meer een software matig probleem is.

De klok werkt wel prima met een LCD display (en natuurlijk een aangepast programma), maar met een LED display krijg ik het niet werkend.

Het LED display werkt dus wel, maar er volgen dus geen tijd updates meer als het display aan is.

Ik ben een beginner en ik vermoed dat ik wat verkeerd doe in de software, maar ik kom er gewoon zelf niet meer uit.... ;-(

Kan iemand mij tips of hulp geven? Zie mijn code hieronder en in de bijlage.

Met vriendelijke groet, Guido van Laere



#include "Utils.h"
#include "DCF77.h"
#include "TimeLib.h"
using namespace Utils;
 
#define DCF_PIN 2          // Connection pin to DCF 77 device
#define DCF_INTERRUPT 0    // Interrupt number associated with pin
 
time_t prevDisplay = 0;          // when the digital clock was displayed
time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);

#include "TM1637_6D.h"
#define CLK 7              //pins definitions for TM1637 and can be changed to other ports
#define DIO 6
TM1637_6D tm1637_6D(CLK,DIO);
int hh, mm, ss;
 
void setup() {
  pinMode(CLK, OUTPUT);
  pinMode(DIO, OUTPUT);
  pinMode(DCF_PIN, INPUT);
  tm1637_6D.init();
  tm1637_6D.set(3);       //DARKEST = 0, BRIGHTEST = 7
 
  Serial.begin(9600);
  DCF.Start();
  setSyncInterval(30);
  setSyncProvider(getDCFTime);
  // It is also possible to directly use DCF.getTime, but this function gives a bit of feedback
  //setSyncProvider(DCF.getTime);
 
  Serial.println("Waiting for DCF77 time ... ");
  Serial.println("It will take at least 2 minutes until a first update can be processed.");
  while(timeStatus()== timeNotSet) {
     // wait until the time is set by the sync provider
     Serial.print(".");
     delay(3000);
  }
}
 
void loop()
{
  if( now() != prevDisplay) //update the display only if the time has changed
  {
    prevDisplay = now();
    digitalClockDisplay1();
    digitalClockDisplay2();
  }
}
 
void digitalClockDisplay1(){
  hh = hour(), DEC;
  mm = minute(), DEC;
  ss = second(), DEC;

  Serial.print(hh/10);
  Serial.print(hh%10);
  Serial.print(":");
  Serial.print(mm/10);
  Serial.print(mm%10);
  Serial.print(":");
  Serial.print(ss/10);
  Serial.println(ss%10);
}

void digitalClockDisplay2(){
  hh = hour(), DEC;
  mm = minute(), DEC;
  ss = second(), DEC;

  tm1637_6D.display(2,hh/10,false);
  tm1637_6D.display(1,hh%10,false);
  tm1637_6D.display(0,mm/10,false);
  tm1637_6D.display(5,mm%10,false);
  tm1637_6D.display(4,ss/10,false);
  tm1637_6D.display(3,ss%10,false);   
}

unsigned long getDCFTime()
{
  time_t DCFtime = DCF.getTime();
  // Indicator that a time check is done
  if (DCFtime!=0) {
    Serial.println("time has an update");
  }
  return DCFtime;
}

shooter

in je loop staat nergens getDCFtime.
dus die blijft gewoon oud
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

gvlaere

Dankjewel Shooter, voor je snelle reactie.

Maar onder in de loop staat toch (zie de derde regel van het deel wat ik er uit heb geknipt):


  ..........
  tm1637_6D.display(4,ss/10,false);
  tm1637_6D.display(3,ss%10,false);   
}

unsigned long getDCFTime()
{
  time_t DCFtime = DCF.getTime();
  // Indicator that a time check is done
  if (DCFtime!=0) {
    Serial.println("time has an update");
  }
  return DCFtime;
}

Ik zie wel telekens een update van tijd in de seriele monitor zonder display en niet met het display.

Groet, Guido

MAS3

Hoi gvlaere.

De tekst uit je eerste post heb ik even gekopieerd naar de IDE.
Als je dat niet als tekst, maar als code had neergezet, dan was dit wat gemakkelijker leesbaar, en ook gemakkelijker te kopieren geweest.
Dit doe je door die tekst tussen de tags  [code] en [/code] te zetten.

Je hebt in die code wel een functie gemaakt die heet getDCFTime, maar die functie roep je nooit aan in loop.

In mijn IDE is loop nogal kort, van regel 42 tot en met regel 50.
Je kunt dat zien aan de { die na loop staat en de } die daar bij hoort op regel 50 dus.
digitalClockDisplay1 en digitalClockDisplay2 roep je wel aan, maar getDCFTime dus niet en dat is wat shooter je dus ook al vertelde.

digitalClockDisplay1 , digitalClockDisplay2, en getDCFTime staan dus niet in loop, maar er buiten en zouden allemaal moeten worden aangeroepen.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

gvlaere

Beste Mas3,

Allereerst dank voor de tip over het plaatsten van de code. Dat zal ik in het vervolg doen.

Vanavond of morgen ga ik proberen om de loop aan te passen zodat getDCFTime in de loop staat. Hopelijk lost dat het probleem op.

Nogmaals mijn dank voor de opmerkingen van jouw en ook van Shooter.

Met vriendelijke groet, Guido

shooter

jadatstaat er maar dat is onder de loop en is een functie en die moet je wel aanroepen, zoals ook mase vertelt.

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

gvlaere

#6
Jun 19, 2019, 01:33 pm Last Edit: Jun 19, 2019, 03:03 pm by gvlaere
Beste mensen,

Ik ben weer een hele poos aan het "stoeien geweest met het klokje, maar het lukt mij maar niet om er uit te komen. Het synchroniseren van de tijd als de TM1637 is aangesloten lukt mijn niet.

Ik heb de "loop" aangepast en ook het programma. In de loop staat nu de tijdfunctie zoals is gesuggereerd. De functie getDCFTime kreeg ik niet werkend in de loop (ik ben een beginner met Arduino, dus dat moet aan mijn vaardigheid liggen ;-). Ik heb gebruik gemaakt van de functie DCF.getTime.

Als de klok wordt aangezet is er na ruim 2 minuten DCF77 signaal en wordt de tijd gesynchroniseerd. Dat is zichtbaar in de seriële monitor.

Als ik daarna spanning op de TM1637 display zet, dan zie ik de tijd juist weergeven, maar er volgen dan geen updates van het DCF77 signaal.

Als ik de spanning er weer af haal, dan werkt de tijdupdate weer wel....

Wat doe ik hier verkeerd?


Alvast mijn dank voor de hulp....
Guido


Code: [Select]

#include "Utils.h"
#include "DCF77.h"
#include "TimeLib.h"
using namespace Utils;

#include "TM1637_6D.h"
#define CLK 7              //pins definitions for TM1637 and can be changed to other ports
#define DIO 6
TM1637_6D tm1637_6D(CLK,DIO);

int hh, mm, ss;

time_t prevDisplay = 0;    // when the digital clock was displayed
 
#define DCF_PIN 2          // Connection pin to DCF 77 device
#define DCF_INTERRUPT 0    // Interrupt number associated with pin
 
time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);
 
void setup() {
  pinMode(CLK,OUTPUT);
  pinMode(DIO,OUTPUT);
 
  tm1637_6D.init();
  tm1637_6D.set(3);        //DARKEST = 0, BRIGHTEST = 7
 
  Serial.begin(9600);
 
  DCF.Start();
 
  Serial.println("Waiting for DCF77 time ... ");
  Serial.println("It will take at least 2 minutes until a first update can be processed.");
}
 
void loop() {
  time_t DCFtime = DCF.getTime(); // Check if new DCF77 time is available
  if (DCFtime!=0)
  {
    Serial.println("Time is updated");
    setTime(DCFtime);
  }
  if( now() != prevDisplay) //update the display only if the time has changed
  {
    prevDisplay = now();
 

  hh = hour(), DEC;
  mm = minute(), DEC;
  ss = second(), DEC;

  Serial.print(hh/10);
  Serial.print(hh%10);
  Serial.print(":");
  Serial.print(mm/10);
  Serial.print(mm%10);
  Serial.print(":");
  Serial.print(ss/10);
  Serial.println(ss%10);

  tm1637_6D.display(2,hh/10,false);
  tm1637_6D.display(1,hh%10,false);
  tm1637_6D.display(0,mm/10,false);
  tm1637_6D.display(5,mm%10,false);
  tm1637_6D.display(4,ss/10,false);
  tm1637_6D.display(3,ss%10,false);   
  }
}
 

ArdLab_Gent

Ik heb de sketch (gisteren) getest met een enkele jaren oude Conrad DCF77 ontvanger + Arduino UNO.
Ik wou dit vooral doen om te weten of mijn DCF77 ontvanger nog werkt.
De sketch werkt maar ik had nog geen display verbonden, zal dat vanavond proberen en melden.
Kan je zeggen welk display je gebruikt, er zijn veel types TM1637 in omloop.
ArdLab geeft Arduino workshops voor beginners.
ArdLab is lid van de STEM-Academie.
http://www.ardlab.gent - http://www.stem-academie.be/

gvlaere

Beste ArdLab,

Ik gebruik een TM1637 met een 6 voudige display zodat ik uren, minuten en seconden kan zien. In de bijlage heb ik de library "TM1637_6D" gezet. Deze library heb ik gebruikt.
Het display geeft ook netjes de tijd aan. Alleen ik krijg dus geen update van de tijd van de DCF77 meer.
Voor de DCF77 gebruik in de library van Thijs Elenbaas.

Alvast dank voor uw hulp,

Met vriendelijke groet,

Guido

Erik_Baas

Ik zit met twee vragen:
* Het LED display wordt gevoed vanuit de Arduino, maar kan diens spanningsregelaar wel voldoende stroom leveren? Probeer eens een aparte 5volt voeding?
* Kan het zijn dat pin 2 als input voor externe interrupt geschakeld wordt? Dat zou verklaren waarom getDCFTime() ogenschijnlijk nooit aangeroepen wordt: het is een ISR!

gvlaere

#10
Jun 20, 2019, 12:00 am Last Edit: Jun 20, 2019, 12:02 pm by gvlaere
Dag Erik,

Allereerst mijn dank voor je hulp!

* Het LED display wordt vanuit mijn computer gevoed. Ik heb eerder al eens een externe voeding geprobeerd, maar dat werkte toen ook niet. Ik zal het verbruik eens meten en nogmaals een externe voeding proberen. Ik laat weten of dat nu wel helpt.

* Op je 2e vraag kan ik geen goed antoord geven. Ik ben echt een beginner en begrijp de vraag niet goed (er is te weinig kennis bij mij). Het is wel zo dat als ik de display niet gebruik en alleen op de seriele monitor kijk, dat er dan dus wel iedere minuut een update van de tijd is (die is dan zichtbaar in de seriele monitor). Ik vind het dus vreemd dat die update niet meer werkt met het display aangesloten.

Met vriendelijke groet,
Guido

gvlaere

Ik heb de sketch (gisteren) getest met een enkele jaren oude Conrad DCF77 ontvanger + Arduino UNO.
Ik wou dit vooral doen om te weten of mijn DCF77 ontvanger nog werkt.
De sketch werkt maar ik had nog geen display verbonden, zal dat vanavond proberen en melden.
Kan je zeggen welk display je gebruikt, er zijn veel types TM1637 in omloop.
Nog wel een goede tip:
Ik bemerk dat mijn notebook in de buurt van de DCF77 ontvanger erg stoort als deze niet op de accu maar op netstroom werkt. Ik gebruik ook een DCF77 ontvanger van Conrad. Het signaal van de ontvanger valt helemaal volledig weg als de notebook op netstroom werkt! Ik gebruik hiervoor een programma wat het signaal meet. Als je wilt kan ik je dat sturen.

gvlaere

Beste mensen,

Voor de display heb ik nu weer eens geprobeerd om deze van een externe voeding te voorzien en tot mijn (gelukkige) verbazing werkt het nu wel! ;-)

Conclusie:
* De DCF.getTime functie moet dus in de "loop" staan.
* Een externe voeding bij een display wat veel stroom gebruikt is noodzakelijk.
* Wat ik ook bemerkte is de echt forse storing op het DCF77 signaal welke een notebook geeft als deze is aangesloten op het lichtnet. Met een notebook alleen op accuvoeding gaf dat bij mij geen problemen.

Iedereen nogmaals bedankt voor de hulp!

Met vriendelijke groet,

Guido

nicoverduin

Beste mensen,

Voor de display heb ik nu weer eens geprobeerd om deze van een externe voeding te voorzien en tot mijn (gelukkige) verbazing werkt het nu wel! ;-)

Conclusie:
* De DCF.getTime functie moet dus in de "loop" staan.
* Een externe voeding bij een display wat veel stroom gebruikt is noodzakelijk.
* Wat ik ook bemerkte is de echt forse storing op het DCF77 signaal welke een notebook geeft als deze is aangesloten op het lichtnet. Met een notebook alleen op accuvoeding gaf dat bij mij geen problemen.

Iedereen nogmaals bedankt voor de hulp!

Met vriendelijke groet,

Guido
Het zou nog kunnen dat de adapter van de laptop niet helemaal tof is.
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

gvlaere

Het zou nog kunnen dat de adapter van de laptop niet helemaal tof is.
Tja, het is een vrij nieuwe ASUS computer, maar ik zal daar zeker ook naar kijken!
Dank voor het advies.
Guido

Go Up