Master voor een slave stationsklok.

algemene C code
Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Master voor een slave stationsklok.

Berichtdoor nicoverduin » 06 Okt 2015, 14:33

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.
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).
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

Berichten: 163
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: Master voor een slave stationsklok.

Berichtdoor FPCUser » 06 Okt 2015, 16:09

Nico,

Dat zullen ze wellicht hebben verteld, maar dan ben ik dat vergeten.
'Men' zegt dat ik een selectief geheugen heb. :D

Ach, elk nadeel heeft ...

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Master voor een slave stationsklok.

Berichtdoor shooter » 07 Okt 2015, 13:33

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.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 66
Geregistreerd: 02 Okt 2015, 22:31

Re: Master voor een slave stationsklok.

Berichtdoor bossie » 12 Nov 2015, 23:42

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
/*
* 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

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Master voor een slave stationsklok.

Berichtdoor nicoverduin » 13 Nov 2015, 08:42

Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 66
Geregistreerd: 02 Okt 2015, 22:31

Re: Master voor een slave stationsklok.

Berichtdoor bossie » 13 Nov 2015, 10:30

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.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Master voor een slave stationsklok.

Berichtdoor nicoverduin » 13 Nov 2015, 14:12

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
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 66
Geregistreerd: 02 Okt 2015, 22:31

Re: Master voor een slave stationsklok.

Berichtdoor bossie » 13 Nov 2015, 16:21

Nico ik ken de afkorting DTS niet wat bedoel je hier?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Master voor een slave stationsklok.

Berichtdoor nicoverduin » 13 Nov 2015, 16:31

Moet zijn DST Daylight Saving Time. Excuus :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 66
Geregistreerd: 02 Okt 2015, 22:31

Re: Master voor een slave stationsklok.

Berichtdoor bossie » 13 Nov 2015, 16:42

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. ;)

VorigeVolgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 15 gasten