Master voor een slave stationsklok.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Master voor een slave stationsklok.
Wij kregen altijd te horen of het getal een lid was van R (verzameling reële getallen) of N (verzameling Natuurlijke getallen) of Z(verzameling van Gehele getallen). In dit geval hdden ze ook moeten vermelden dat dit verhaal opgaat bij de verzameling van Gehele getallen).FPCUser schreef:We hebben op school geleerd dat een getal even is als het gedeeld kan worden door 2.
Ze vergaten daarbij te vertellen dat de rest dan 0 is.
Advertisement
Re: Master voor een slave stationsklok.
Nico,
Dat zullen ze wellicht hebben verteld, maar dan ben ik dat vergeten.
'Men' zegt dat ik een selectief geheugen heb.
Ach, elk nadeel heeft ...
Dat zullen ze wellicht hebben verteld, maar dan ben ik dat vergeten.
'Men' zegt dat ik een selectief geheugen heb.
Ach, elk nadeel heeft ...
Re: Master voor een slave stationsklok.
en weer verder,
hoe gaat het nu met bossie?
lukt het een beetje, hoe ziet je elektrisch schema eruit want 24 volt op een arduino is ook niet goed.
hoe gaat het nu met bossie?
lukt het een beetje, hoe ziet je elektrisch schema eruit want 24 volt op een arduino is ook niet goed.
paul deelen
shooter@home.nl
shooter@home.nl
Re: Master voor een slave stationsklok.
Nou ik ben met alle hier opgedane ideeën aan het werk gegaan.
En uiteindelijk hier op uitgekomen, zie code.
Uiteindelijk is de Arduino + RTC een simpele pulsgenerator die per minuut de klok één stap(minuut) vooruitzet.
De arduino is ook met een 2 regelige display uitgerust zodat op de kast waar de rtc - arduino - relais bordje en voeding in zitten te zien is dat de klokl loopt en evt ook foutboodschappen getoond kunnen worden.
De poort 7 stuurt op de even minuten een relais aan dat een spanning van +24volt naar de klokmotor stuurt
De poort 6 doet het zelfde maar dan stuurt het relais dat daar op is aangesloten een spanning van -24 volt naar de klok motor.
Dat was het uiteindelijke doel.
Maar ik zit nog met een probleempje dat ik niet goed weet op te lossen.
Bij de overgang van winter naar zomertijd moet de klok in één keer 60 stappen voorwaarts maken en bij de overgang van zomer naar wintertijd moeten er één uur lang géén pulsen naar de klok gestuurd worden.
Is er iemand die me daar bij zou kunnen helpen.
Ik zou al blij zijn als ik op:
één van de arduino ingangen een drukknop 'zomertijd' kan aansluiten, die er voor zorgt dat er 60 stappen achter elkaar worden gestuurd naar de klok.
En op een andere ingang een drukknop 'wintertijd' die er voor zorgt dat de eerstvolgende 60 pulsen niet worden verzonden.
cpp code
@edit: code ff beter geformatteerd
En uiteindelijk hier op uitgekomen, zie code.
Uiteindelijk is de Arduino + RTC een simpele pulsgenerator die per minuut de klok één stap(minuut) vooruitzet.
De arduino is ook met een 2 regelige display uitgerust zodat op de kast waar de rtc - arduino - relais bordje en voeding in zitten te zien is dat de klokl loopt en evt ook foutboodschappen getoond kunnen worden.
De poort 7 stuurt op de even minuten een relais aan dat een spanning van +24volt naar de klokmotor stuurt
De poort 6 doet het zelfde maar dan stuurt het relais dat daar op is aangesloten een spanning van -24 volt naar de klok motor.
Dat was het uiteindelijke doel.
Maar ik zit nog met een probleempje dat ik niet goed weet op te lossen.
Bij de overgang van winter naar zomertijd moet de klok in één keer 60 stappen voorwaarts maken en bij de overgang van zomer naar wintertijd moeten er één uur lang géén pulsen naar de klok gestuurd worden.
Is er iemand die me daar bij zou kunnen helpen.
Ik zou al blij zijn als ik op:
één van de arduino ingangen een drukknop 'zomertijd' kan aansluiten, die er voor zorgt dat er 60 stappen achter elkaar worden gestuurd naar de klok.
En op een andere ingang een drukknop 'wintertijd' die er voor zorgt dat de eerstvolgende 60 pulsen niet worden verzonden.
cpp code
/*
* TimeRTC.pde
************************************************************************************
* NZH-KLOK *
* Naar een idee van Piet Bos *
* Geschreven door Piet Bos v 1.0 14/10/2015 *
* Aangepast op de specifieke vereisten van de Stations Klok van het NZH museum *
* Aanpassingen: *
* Piet Bos v 1.1 *
* De derde status van POS - NEG - POS vverwijderd 22/10/2015 *
* De startup meldingen in het display aangepast 23/10/2015 *
* De sturing en gebruik van de digitale uitgangen 3 en 4 -> 6 en 7 25/10/2015 *
* De wissel van even en oneven minuten 25/10/2015 *
* *
* *
************************************************************************************
* uses an RTC (real time clock) to drive an old station clock
*
* every minute, there is a pulse POS or NEG on 2 relays (D7 pos , D6 neg)
* Even minutes the pulse is on Port 7
* Odd minutes the pulse is on Port 6
*
* RTC connects to
* +5V (or 3,3V depending ont ype)
* GND
* SCL (I2C clock pin ) ----> to Analog 4
* SDA (I2C data pin ) ----> to Analog 5
*
* other boards than Arduino Uno
* Board I2C / TWI pins
-------------------------------------------------
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)
Due 20 (SDA), 21 (SCL), (SDA1, SCL1 )
* LCD display functionality added:
* The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include <LiquidCrystal.h>
const char *monthName[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
"Aug", "Sep", "Oct", "Nov", "Dec" };
tmElements_t tm;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int seconden = 0;
int lastseconde = 0;
int beatsec = 0;
int pospuls = 7; // use digital out 7 as positive current relay driver
int negpuls = 6; // use digital out 6 as negative current relay driver
int cycleLED = 13; // use this LED to indicate cycle activity
int pulseLED = 10; // use this LED to indicate pulse being sent
int pulsDuur = 1000; // minimal pulse length 1 seconde
int waitDuur = 500; // minimal pause length 0.5 seconde
boolean TisTime = false;
void setup() {
Serial.begin(9600);
pinMode(cycleLED, OUTPUT);
pinMode(pulseLED, OUTPUT);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("NZH Museum klok");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Init v1.1/04-11");
delay(500);
pinMode(pospuls, OUTPUT);
pinMode(negpuls, OUTPUT);
digitalWrite(negpuls, LOW); // negative puls - Relay off
digitalWrite(pospuls, LOW); // positive puls - Relay off
/*
bool parse=false;
bool config=false;
// deze routine uitzetten bij 'normaal' gebruik.
// get the date and time the compiler was run
if (getDate(__DATE__) && getTime(__TIME__))
{ parse = true;
if (RTC.write(tm)) {config = true;} }
Serial.print("System configured Time=");
Serial.print(__TIME__);
Serial.print(", Date=");
Serial.println(__DATE__);
Serial.println("Set deafult system time to download time");
setTime(tm.Hour,tm.Minute,tm.Second,tm.Day,tm.Month,tm.Year);
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus()!= timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
*/
// deze routine uitzetten bij 'normaal' gebruik.
}
void loop() {
// get the data from the RTC
setSyncProvider(RTC.get); // the function to get the time from the RTC
// run heartbeat and check clock status
heartbeat();
seconden = second(); //remember second value
if (lastseconde == 59 && seconden == 0) {
TisTime = true;
lastseconde = 0;
} else {
lastseconde = seconden;
TisTime = false;
}
// if it is time to advance : send pulse
if (TisTime) {
stuurPuls();
}
//delay(200); // wait 200 ms for next loop
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
void showClock() {
Serial.print(day());
Serial.print("/");
Serial.print(month());
Serial.print("/");
Serial.print(year());
Serial.print(" -- ");
Serial.print(hour());
Serial.print(":");
Serial.print(minute());
Serial.print(":");
Serial.println(second());
// lcd update
lcd.clear();
if (day() < 10) { // dag kleiner dan 10
lcd.setCursor(0, 0);
lcd.print("0");
lcd.setCursor(1, 0);
lcd.print(day());
} else { // dag groter of gelijk aan 10
lcd.setCursor(0, 0);
lcd.print(day());
}
lcd.setCursor(3, 0);
lcd.print(monthName[month() - 1]);
lcd.setCursor(7, 0);
lcd.print(year());
lcd.setCursor(0, 1);
lcd.print("0");
lcd.setCursor(2, 1);
lcd.print(":0");
lcd.setCursor(5, 1);
lcd.print(":0");
if (hour() < 10) {
lcd.setCursor(1, 1);
lcd.print(hour());
} else {
lcd.setCursor(0, 1);
lcd.print(hour());
}
if (minute() < 10) {
lcd.setCursor(4, 1);
lcd.print(minute());
} else {
lcd.setCursor(3, 1);
lcd.print(minute());
}
if (second() < 10) {
lcd.setCursor(7, 1);
lcd.print(second());
} else {
lcd.setCursor(6, 1);
lcd.print(second());
}
lcd.setCursor(8, 1);
lcd.print(" ");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void stuurPuls() { // generate pulses
lcd.clear(); //12345678901234567
lcd.setCursor(0, 0);
lcd.print("Impuls --> Klok ");
delay(500);
lcd.clear();
Serial.print("Pulse started \n");
digitalWrite(pulseLED, HIGH); // led on
digitalWrite(cycleLED, HIGH); // led on
//
// Digital outputs.
//
// bij de even minuten moet Port Dig 7 en bij de oneven minuten moet Port Dig 6
// van status veranderen.
if (minute() % 2 == 0) // Neem de modulus van minute() is de uitkomst 0 dan even getal anders is het oneven.
{
Serial.print("Uitkomst deling ");
Serial.print(minute() % 2);
Serial.print(" - Minuten zijn een even.\n");
// Positive output settings. Port Dig 7 LE02 - zwarte draad
// lcd.setCursor(0,1);lcd.print(" + Port 7 ");
lcd.clear();
digitalWrite(pospuls, HIGH); // positieve puls aan Relay on
Serial.print("port-7 HIGH\n"); //
delay(pulsDuur); // Relay aan voor 1000ms
digitalWrite(pospuls, LOW); // positive puls uit Relay off
Serial.print("port-7 LOW\n"); //
digitalWrite(cycleLED, LOW); // led off
lcd.clear();
} else {
Serial.print("Uitkomst deling ");
Serial.print(minute() % 2);
Serial.print(" - Minuten zijn een oneven.\n");
// Negative output settings Port Dig 6 LE01 - bruine draad.
// lcd.setCursor(0,1);lcd.print(" - Port 6 ");
//
lcd.clear();
digitalWrite(negpuls, HIGH); // negatieve puls Relay on
Serial.print("port-6 HIGH\n"); //
delay(pulsDuur); // wait
digitalWrite(negpuls, LOW); // drop puls - Relay off
Serial.print("port-6 LOW\n"); //
digitalWrite(cycleLED, LOW); // led off
lcd.clear();
}
digitalWrite(pulseLED, LOW); //
digitalWrite(cycleLED, HIGH); // led on
Serial.println("Pulse ended");
digitalWrite(negpuls, LOW); // negative puls - Relay off
digitalWrite(pospuls, LOW); // positive puls - Relay off
lcd.clear();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void heartbeat() {
digitalWrite(cycleLED, HIGH);
delay(10);
digitalWrite(cycleLED, LOW);
if (beatsec != second()) // display time in serial port every second
{
if (timeStatus() == timeSet) {
Serial.print("RTC TIME : ");
// lcd.setCursor(12,0);lcd.print("RTC");
} else {
Serial.print("RTC ERROR, use internal ---> ");
// lcd.setCursor(12,0);lcd.print("INT");
}
showClock();
}
beatsec = second();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
bool getTime(const char *str) {
int Hour, Min, Sec;
if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3)
return false;
tm.Hour = Hour;
tm.Minute = Min;
tm.Second = Sec;
return true;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
bool getDate(const char *str) {
char Month[12];
int Day, Year;
uint8_t monthIndex;
if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3)
return false;
for (monthIndex = 0; monthIndex < 12; monthIndex++) {
if (strcmp(Month, monthName[monthIndex]) == 0)
break;
}
if (monthIndex >= 12)
return false;
tm.Day = Day;
tm.Month = monthIndex + 1;
tm.Year = CalendarYrToTm(Year);
return true;
}
@edit: code ff beter geformatteerd
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Master voor een slave stationsklok.
Dit een mogelijkheid? : https://github.com/JChristensen/Timezone
Re: Master voor een slave stationsklok.
Ja dat is een mooie oplossing Nico, dan loopt de Arduino Keurig mee met de omschakeling.
Maar die 'domme' klok blijft gewoon op de zelfde tijd staan.
De uitvoer van de Arduino wordt alleen gezien door iemand die de meterkast opent en de klok zelf hangt in het museum in een hal.
En zoals gezegd die krijgt iedere minuut een puls, ongeacht de tijd en de stand van de wijzers.
Dus bedankt voor de tip, maar het 'probleem' zoals geschetst is er nog.
grt Piet.
Maar die 'domme' klok blijft gewoon op de zelfde tijd staan.
De uitvoer van de Arduino wordt alleen gezien door iemand die de meterkast opent en de klok zelf hangt in het museum in een hal.
En zoals gezegd die krijgt iedere minuut een puls, ongeacht de tijd en de stand van de wijzers.
Dus bedankt voor de tip, maar het 'probleem' zoals geschetst is er nog.
grt Piet.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Master voor een slave stationsklok.
Piet,
Je zou kunnen overwegen dat op het moment dat de DTS laatste een uur afwijkt tov van de DTS tijd vorige, dan is dat het moment dat de wisseling plaats vindt. Dan kun je de puls correctie uitvoeren
Tegelijkertijd heb je ook nog te maken met een reset c.q. power-down oid dan moet je ook nog iets doen. Het moment is volgens mij dacht ik iets van 02:00 (winter naar zomertijd) en 03:00 (bij zomer naar wintertijd).
Dat moment is te detecteren. Dus iets in die richting
Je zou kunnen overwegen dat op het moment dat de DTS laatste een uur afwijkt tov van de DTS tijd vorige, dan is dat het moment dat de wisseling plaats vindt. Dan kun je de puls correctie uitvoeren
Tegelijkertijd heb je ook nog te maken met een reset c.q. power-down oid dan moet je ook nog iets doen. Het moment is volgens mij dacht ik iets van 02:00 (winter naar zomertijd) en 03:00 (bij zomer naar wintertijd).
Dat moment is te detecteren. Dus iets in die richting
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Master voor een slave stationsklok.
Moet zijn DST Daylight Saving Time. Excuus
Re: Master voor een slave stationsklok.
nicoverduin schreef:Moet zijn DST Daylight Saving Time. Excuus
Dat excuus is nergens voor nodig hoor.
Ik vermoedde al zoiets maar ik denk ik vraag het toch maar ff.
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 15 gasten