Zomer-wintertijd instellen

Arduino specifieke Software
Berichten: 4
Geregistreerd: 08 Nov 2019, 14:48

Zomer-wintertijd instellen

Berichtdoor seabert69 » 11 Nov 2019, 16:09

Hallo,

Ik heb een hooifeerder gemaakt met UNO, 4 servo's en RTC DS 3231
Deze laat op bepaalde tijden servo's werken die luikje met hooi open doen.

Ik ben redelijk nieuw, dus heb alles gedaan door bestaande codes samen te voegen en door logisch nadenken deze aan te passen...

Nu heb ik enkele problemen / vragen: (2 simpele voor jullie denk ik, en 1 ingewikkelde... eerst de gemakkelijke:)

1: op lijn 293 - 295 staat er een lege ELSE, maar als ik die weg doe denkt arduino dat knop ingedrukt is...? (krijg melding 'button ingedrukt' ) hoe komt dit?

2: Er is ook een deel code die nog niet werkt, en dit is om mijn rtc te auto syncen bij het uploaden, deze staat dus als comment.

Belangrijkste:
3: Nu zou ik tijd automatisch willen aanpassen naar winter - zomertijd.
En dit is blijkbaar iets te ingewikkeld voor mij.

ik heb el enkele onderwerpen gevonden, maar lukt me niet...

bvb: https://www.arduinoforum.nl/viewtopic.p ... 2&start=10


in mijn code (zie hieronder)

werkt het deels als ik deeltje ""&& rtc.getDateStr() == 11,6,2019"" uit lijn 174 weg laat.
dan past tijd mooi aan, maar zonder datum doet hij dit elke dag, en als je tijd terug laat draaien , doet hij dit elk uur omdat het een uur later weer het tijdstip is van de IF voorwaarde.

Wie kan me helpen?

Denk dat het iets is met manier waarop ik datum beschrijf?
Ik heb op ander forum antwoorden gekregen, maar te ingewikkeld, en krijg geen antwoord dat duidelijk genoeg is...

Hoop dat hier me iemand kan helpen die het in 'mensentaal' kan uitleggen' :-) of voordoen?

Want telkens ik iets aanpas is er weer een problem met hoe ik bvb tijd noem, of characters of zo, en dit snap ik niet...

DANK U !!!


#include <DS3231.h>
#include <Servo.h>
#include <Wire.h>

// next part doesn't work (autosync)
/*#include "RTClib.h"
// #include <Time.h>
// time.h werkt niet


PART OF CODE TO AUTO SYNC RTC?

uint32_t syncProvider()
{
return RTC.now().unixtime();
}
*/

const int buttonPin = 1;
int buttonState = 0;

Servo m1;
Servo m2;
Servo m3;
Servo m4;

DS3231 rtc(SDA,SCL);
Time t;



//tijd motor1, 1ste
const int uur1 = 9;
const int min1 = 00;
const int sec1 = 10;

//tijd motor1, 1ste B
const int uur1b = 9;
const int min1b = 01;
const int sec1b = 10;

// tijd motor2, 1ste
const int uur2 = 11;
const int min2 = 30;
const int sec2 = 10;

// tijd motor2, 1ste B
const int uur2b = 11;
const int min2b = 31;
const int sec2b = 10;

//tijd motor3, 1ste
const int uur3 = 14;
const int min3 = 00;
const int sec3 = 10;

//tijd motor3, 1ste B
const int uur3b = 14;
const int min3b = 01;
const int sec3b = 10;

//tijd motor4, 1ste
const int uur4 = 16;
const int min4 = 30;
const int sec4 = 10;

//tijd motor4, 1ste B
const int uur4b = 16;
const int min4b = 30;
const int sec4b = 10;

//tijd motor1, 2de
const int uur5 = 22;
const int min5 = 00;
const int sec5 = 10;

//tijd motor1, 2de B
const int uur5b = 22;
const int min5b = 00;
const int sec5b = 30;

//tijd motor2, 2de
const int uur6 = 0;
const int min6 = 30;
const int sec6 = 10;

//tijd motor2, 2de B
const int uur6b= 0;
const int min6b = 31;
const int sec6b = 10;

//tijd motor3, 2de
const int uur7 = 03;
const int min7 = 01;
const int sec7 = 10;

//tijd motor3, 2de B
const int uur7b = 03;
const int min7b = 02;
const int sec7b = 10;

//tijd motor4, 2de
const int uur8 = 05;
const int min8 = 30;
const int sec8 = 10;

//tijd motor4, 2de B
const int uur8b = 05;
const int min8b = 31;
const int sec8b = 10;



void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();


/*
//TO SET TIME AND DATE MANUAL UNCOMMENT
rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAY
rtc.setTime(14, 54, 0); // Set the time to 12:00:00 (24hr format)
rtc.setDate(11, 11, 2019); // Set the date to January 1st, 2014
*/



// next part doesn't work (autosync)
/*
AUTO SET TIME UNCOMMENT
setSyncProvider(syncProvider); // 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");
}
*/



m1.attach(2);
m2.attach(3);
m3.attach(4);
m4.attach(5);

m1.writeMicroseconds(1150);
m2.writeMicroseconds(1150);
m3.writeMicroseconds(1150);
m4.writeMicroseconds(1150);

pinMode(buttonPin, INPUT);


}

void loop() {



t = rtc.getTime();
Serial.print(t.hour);
Serial.print(" hour(s), ");
Serial.print(t.min);
Serial.print(" minute(s)");
Serial.print(t.sec);
Serial.print(" second(s)");
Serial.print(" - ");
Serial.print(rtc.getDateStr());
Serial.println(" ");
delay (1000);


//change hour at specific time and date
/*
//when it's 11,6,2019 02, 00, 00
// time should change to 03h

if(t.hour == 2&& t.min == 00&& t.sec == 00 && rtc.getDateStr() == 11,6,2019 ){
rtc.setTime( 3, 0, 0 ); // Set the time to 12:00:00 (24hr format)
}


*/

if(t.hour == uur1 && t.min == min1 && t.sec == sec1){
Serial.println(" m1 open ");
m1.writeMicroseconds(650);
delay(1500);
Serial.println("m1 toe");
delay(1000);
m1.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur1b && t.min == min1b && t.sec == sec1b){
Serial.println(" m1 open ");
m1.writeMicroseconds(650);
delay(1500);
Serial.println("m1 toe");
delay(1000);
m1.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur2 && t.min == min2 && t.sec == sec2){
Serial.println(" m2 open ");
m2.writeMicroseconds(650);
delay(1500);
Serial.println("m2 toe");
delay(1000);
m2.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur2b && t.min == min2b && t.sec == sec2b){
Serial.println(" m2 open ");
m2.writeMicroseconds(650);
delay(1500);
Serial.println("m2 toe");
delay(1000);
m2.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur3 && t.min == min3 && t.sec == sec3){
Serial.println(" m3 open ");
m3.writeMicroseconds(650);
delay(1500);
Serial.println("m3 toe");
delay(1000);
m3.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur3b && t.min == min3b && t.sec == sec3b){
Serial.println(" m3 open ");
m3.writeMicroseconds(650);
delay(1500);
Serial.println("m3 toe");
delay(1000);
m3.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur4 && t.min == min4 && t.sec == sec4){
Serial.println(" m4 open ");
m4.writeMicroseconds(650);
delay(1500);
Serial.println("m4 toe");
delay(1000);
m4.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur4b && t.min == min4b && t.sec == sec4b){
Serial.println(" m4 open ");
m4.writeMicroseconds(650);
delay(1500);
Serial.println("m4 toe");
delay(1000);
m4.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur5 && t.min == min5 && t.sec == sec5){
Serial.println(" m1 open ");
m1.writeMicroseconds(650);
delay(1500);
Serial.println("m1 toe");
delay(1000);
m1.writeMicroseconds(1150);
delay(1500);

}
else {
Serial.print(" ");

}
if(t.hour == uur5b && t.min == min5b && t.sec == sec5b){
Serial.println(" m1 open ");
m1.writeMicroseconds(650);
delay(1500);
Serial.println("m1 toe");
delay(1000);
m1.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur6 && t.min == min6 && t.sec == sec6){
Serial.println(" m2 open ");
m2.writeMicroseconds(650);
delay(1500);
Serial.println("m2 toe");
delay(1000);
m2.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur6b && t.min == min6b && t.sec == sec6b){
Serial.println(" m2 open ");
m2.writeMicroseconds(650);
delay(1500);
Serial.println("m2 toe");
delay(1000);
m2.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur7 && t.min == min7 && t.sec == sec7){
Serial.println(" m3 open ");
m3.writeMicroseconds(650);
delay(1500);
Serial.println("m3 toe");
delay(1000);
m3.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur7b && t.min == min7b && t.sec == sec7b){
Serial.println(" m3 open ");
m3.writeMicroseconds(650);
delay(1500);
Serial.println("m3 toe");
delay(1000);
m3.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur8 && t.min == min8 && t.sec == sec8){
Serial.println(" m4 open ");
m4.writeMicroseconds(650);
delay(1500);
Serial.println("m4 toe");
delay(1000);
m4.writeMicroseconds(1150);
delay(1500);

}
if(t.hour == uur8b && t.min == min8b && t.sec == sec8b){
Serial.println(" m4 open ");
m4.writeMicroseconds(650);
delay(1500);
Serial.println("m4 toe");
delay(1000);
m4.writeMicroseconds(1150);
delay(1500);





}

buttonState = digitalRead(buttonPin);
if( buttonState == HIGH){
Serial.print("button ingedrukt");

m1.writeMicroseconds(650);
delay(1500);
m1.writeMicroseconds(1150);
delay(1500);

m2.writeMicroseconds(650);
delay(1500);
m2.writeMicroseconds(1150);
delay(1500);

m3.writeMicroseconds(650);
delay(1500);
m3.writeMicroseconds(1150);
delay(1500);

m4.writeMicroseconds(650);
delay(1500);
m4.writeMicroseconds(1150);
delay(1500);

}

}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Zomer-wintertijd instellen

Berichtdoor Koepel » 11 Nov 2019, 17:51

Automatisch winter- en zomertijd ? Toe maar, je wilt meteen het allerbeste ;)

Kun je altijd duidelijk zijn ? Je kunt gerust noemen dat je het ook op arduino.cc hebt gevraagd (https://forum.arduino.cc/index.php?topic=522239.msg4364181#msg4364181).

Sommige voorbeelden en libraries schakelen om 24:00 's nacht om, maar ik wilde precies op de seconde omschakelen.
Sommige voorbeelden en libraries gaan de echte tijd wijzigen, maar dan raak ik helemaal in de war.

Daarom schreef ik deze functie: http://arduinoforum.nl/viewtopic.php?f=9&t=3476#p25098.
Ik gebruik de TimeLib en die loopt altijd op wintertijd. Ik ga dus nooit de tijd een uur verzetten.
https://github.com/PaulStoffregen/Time.

Alleen als ik de tijd op een display laat zien, dan roep ik die functie aan. Dat gebeurt iedere seconde. Bij de zomertijd tel ik tijdelijk een uur bij de tijd op. Maar ik verhoog niet het aantal uren, ik verhoog tijdelijk het aantal seconden sinds 1970 met een uur. De echte tijd van de TimeLib laat ik ongemoeid.

Mijn idee is dus om de hele sketch op wintertijd te laten lopen. Dat er 's zomers een andere tijd op het display staat, dat is een bijkomstigheid.

Nu heb ik ook nog een soort van alarm op mijn klok. Ik weet niet of dat goed gaat als de tijd omschakelt. Dat was voor mij nog te ingewikkeld :o

Je sketch heb ik nog niet zo goed bekeken. Gebruik je voortaan code-tags als je een sketch wilt laten zien ?

Berichten: 4
Geregistreerd: 08 Nov 2019, 14:48

Re: Zomer-wintertijd instellen

Berichtdoor seabert69 » 11 Nov 2019, 21:34

Hallo,

Leek me eigenlijk een basis gegeven , niet het allerbeste... dacht dat iedereen dit wel had/wou tot ik begon te zoeken...

Heb het op nog plaatsen gevraagd, niet enkel op arduino forum, maar nog geen oplossing (die ik begrijp) gekregen.

Op deze post staat inderdaad wel goeie info... eens uitpluizen...
Heb je ergens de volledige code van wat je hier zet?: http://arduinoforum.nl/viewtopic.php?f=9&t=3476#p25098
want ik veronderstel dat het niet voldoende zal zijn dit in mijn code te zetten? :-)

En kan nergens een volledige code zien waarin deze functie staat en werkt. (Dus kan ik ook niet bestuderen hoe het zou lukken)

En om het tot een goed einde te brengen zou ik moeten weten hoe het juist werkt tussen de tijd, en de tijd die je laat zien...
Je zegt dat je tijd niet aanpast, maar het aantal seconden verhogen (sinds 1970 )...
is toch ook tijd aanpassen? (ook al doe je het in de seconden ipv bij de uren?)


Wat bedoel je met code-tags om sketch te laten zien?


Al bedankt voor de uitleg, die me wel wijzer maakt, maar nog niet genoeg om tot de oplossing te komen...

thx

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Zomer-wintertijd instellen

Berichtdoor Koepel » 11 Nov 2019, 22:14

Op dit forum, boven het veld om de tekst in te voeren is een "Code" knop voor code tags.
Code: Alles selecteren
Dit is tussen [ code ] en [ /code ] tags (zonder de spaties).

Er is ook een "Select a Syntax" en dan "C++".
cpp code
Dit is met de andere code tags.


Ik gebruik de TimeLib zoals ik al zei. Je zult het zelf moeten uitzoeken hoe je het gebruikt met de Adafruit RTClib.
Sommigen gaan zowel de Adafruit RTClib als de TimeLib in het sketch gebruiken om de voordelen beiden te hebben. Dat kun je beter niet doen.

De 'time' library (zoals die op computers wordt gebruikt) van de GCC compiler is er ook nog. Ik denk dat het <avr/time.h> is, en volgens mij was die vroeger uitgeschakeld voor de Arduino. Ook deze 'time' van de compiler kan de europese zomertijd berekenen. Misschien wel automatisch, als je dat opgeeft. Wat die library nodig heeft is iedere seconde een aanroep van 'system_tick()'.

De TimeLib kan gemakkelijker werken met het aantal seconden sinds 1970 dan de Adafruit RTClib.
Het aantal seconden sinds 1970 heet ook wel 'epoch' en is vaak een 'time_t' variabele. Bij de TimeLib kun je het opvragen met now().

Ik heb eerst een kleine hulpfunctie gemaakt:
Code: Alles selecteren
// Small function that uses the current time of the TimeLib
boolean isDstEurope()
{
  return( isDstEurope( day(), month(), weekday(), hour()));
}


Dan gebruik ik een tijdelijke tijd 't':
Code: Alles selecteren
    time_t t = now();
    if( isDstEurope())    // is it summer time ?
      t += 3600UL;        // add one hour


Daarna gebruik ik de tijd en datum van die 't':
Code: Alles selecteren
    int h = hour( t);
    int m = minute( t);
    int y = year(t);
    // enzovoorts.

En die variabelen gebruik ik om de tijd en datum te laten zien.

Berichten: 4
Geregistreerd: 08 Nov 2019, 14:48

Re: Zomer-wintertijd instellen

Berichtdoor seabert69 » 12 Nov 2019, 09:04

Ok, snap de logica. Nu zien of het lukt in mijn code te zetten...

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Zomer-wintertijd instellen

Berichtdoor zuid » 12 Nov 2019, 17:46

Misschien inmiddels overbodig maar hieronder mijn oplossing.
Eerst de routine om de zomertijd offset te bepalen.
Code: Alles selecteren
unsigned long zomertijd(unsigned long nu) {
  // bepaal zomertijd van "nu",  "nu" is de via (bijvoorbeeld)  NTP verkregen tijd inclusief tijdzone correctie
  int dst = false;
  // zomertijd tussen maart en oktober
  dst = !(month(nu) < 3 || month(nu) > 10);
  // in maart echter niet voor de laatste zondag
  if (month(nu) == 3 && day(nu) <  24 + weekday(nu) )  dst = false;
  // op die laatste zondag niet voor 2 uur
  if (month(nu) == 3 && day(nu) >= 24 + weekday(nu) && weekday(nu) == 1 && hour(nu) < 2 )dst = false;

  // in oktober niet na de laatste zondag
  if (month(nu) == 10 && day(nu) >= 24 + weekday(nu) )  dst = false;
  // in oktober op laatste zondag niet voor 3 uur (inclusief zomertijd correctie)
  if (month(nu) == 10 && day(nu) >= 24 + weekday(nu) && weekday(nu) == 1 && hour(nu) < 2) dst = true;


  if (dst) return 3600;
  else return 0;

}


Deze routine geeft als resultaat 0 bij wintertijd en 3600 bij zomertijd.

Ook met deze oplossing moet de TimeLib tijd op wintertijd blijven maar wel inclusief tijdzone correctie.

Als je een datum tijd nodig hebt in het programma kan dat bijvoorbeeld als volgt:
Code: Alles selecteren
time_t  nu = now() + zomertijd(now());


Alle datum tijd functies van TimeLib kunnen vervolgens gebruit worden, zoals:
Code: Alles selecteren
year(nu)   of day(nu) of hour(nu)   enz.

Dit is overigens net zo als bij de oplossing van Koepel.

m.v.g. Nico

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Zomer-wintertijd instellen

Berichtdoor Koepel » 12 Nov 2019, 19:42

@zuid, ik denk dat het allebei hetzelfde is.

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Zomer-wintertijd instellen

Berichtdoor zuid » 12 Nov 2019, 20:32

@Koepel Klopt helemaal, achteraf was het een beetje overbodige reactie van mij.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Zomer-wintertijd instellen

Berichtdoor Koepel » 12 Nov 2019, 23:30

zuid schreef:@Koepel Klopt helemaal, achteraf was het een beetje overbodige reactie van mij.

Oh, nee, dat bedoelde ik niet. Het is heel goed dat je jouw code liet zien.
Het is een wiskundig probleem, en het kan op verschillende manieren aangepakt worden. Nu heeft seabert69 iets te kiezen ;)

Berichten: 4
Geregistreerd: 08 Nov 2019, 14:48

Re: Zomer-wintertijd instellen

Berichtdoor seabert69 » 16 Nov 2019, 13:45

inderdaad, hoe meer antwoorden ik krijg, hoe meer kans dat ik er steeds 10% van begrijp en dan kom ik ooit wel eens aan de 100% :-)

nu eerst even nieuw probleempje oplossen... krijg ineens om de x tijd (en steeds andere interval ) dat knop ingedrukt is... zonder dat ik er iets aan doe... en dus gaan mijn vakjes allemaal open... pony even heel gelukkig, maar zo heeft ze veel eten ineens ipv heel de dag door iets... dus dat heeft even prioriteit... zal iets dom zijn, maar kan't ni direct vinden... (wie weet kom ik hierover terug hier :-) )

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ubokeaju en 23 gasten