tijd vergelijken probleempje

Arduino specifieke Software
Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 05 Mei 2017, 12:00

Hallo Nico en Koepel,

Onwijs bedankt, moet de mooie voorbeelden even heel goed gaan bekijken nu met hoe dat bedacht is en werkt.

Die serieel output is alleen zodat ik op afstand ook kan zien wat er gebeurt, ik zit niet bij de Arduino zelf, zie geen ledje maar het Arduino board zien ik ook niet, alleen als vrouwlief thuis even gaat computeren zien ik helemaal niks meer:).


Even paar broodjes halen en 2x grote bekers koffie...

Advertisement

Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 05 Mei 2017, 19:01

Even een update...

Helaas is de Mega defect geraakt.. kreeg vanmiddag "Er zijn board updates beschikbaar" en netjes de update geïnstalleerd, maar de Mega geeft plots Communicatie error en Com poort not found :o
Toeval of niet...? geen idee.

maar heb er nog 9 dacht ik... Nope... zijn dus Uno'ssss naja, dat werkt ook wel even.
En de boel werkte weer, toch handig vrouwtje thuis hebben :D

Verder heb ik de code bekeken, waar ik mijn nekje over breek is de Unix time en converteren naar leesbare tijd en dan nog in een variabele zetten en dan uren en minuten eruit halen zonder datum erbij, hierna alsnog extra dag erbij optellen als het niet dezelfde dag etc..
Dat gaat bij mij nooit goed komen in de code, want de ene uitzondering na de andere uitzondering kreeg ik met toekennen van Now() en Time_t, want wil in mijn stop/start tijd geen datum hebben waar alles afhankelijk van zal worden.

De If statement die werkt nu, moet dan wel eerst bepalen of de stoptijd de volgende dag is en dan vervolgens opnieuw vergelijken met de stop tijd wel of niet later is dan de huidige tijd.

Zover ik hem nu heb gaat het goed, kan nu starttijd: 21:15 en stoptijd 3:15 geven en krijg nu bij check dat de Output hoog moet zijn tussen de start- stoptijd en daar buitenom een Output laag.
Nu mag de Arduino uitvallen bij een stroomstoring en bij het weer aanzetten zal de Pomp starten of gewoon uitblijven naar gelang de tijdsblok (start en stop tijd) is om de Pomp aan of juist uit te hebben.


De rest is in tussen ook af, dus kan stukje erbij plakken en hopelijk proef draaien morgen en hopelijk mijn broertje blij maken.
(De rest is een 7-segment display, 3 druktoetsen en SD kaartje voor logging van uitval met hoe vaak de Pomp aangegaan is en later nog wat seriele AT gsm codes erin stoppen, maar dat is latere zorg)

Koepel super bedankt en Nico ook natuurlijk.
Geeft me wel stof tot nadenken met die tijden en hoe jullie dat doen.

grts. Peter

edit
ja en de DS1302.. :D maar heb de nieuwe besteld uit China en 1 bij (oude Dick Best EOO) gaan de raad wel opvolgen natuurlijk..

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

Re: tijd vergelijken probleempje

Berichtdoor nicoverduin » 05 Mei 2017, 19:43

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

Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 05 Mei 2017, 21:21

nicoverduin schreef:Schiet mij maar lek......


Oh, nogmaals, ik krijg dat stukje met Unix time niet onder de knie en de if statement ligt dichterbij de oplossing blijkbaar.
De conversie is mij te ingewikkeld, krijg dat stuk niet aan de gang zoals het moet, daarom niet minder blij met de hulp.

Heb beide codes geprobeerd maar kan de invoer op Stop tijd niet opeens met andere datum geven omdat ik alleen tijd doorgeef(binnen krijg).
Ook geen idee tot hoeveel dagen ik moet gaan kijken waar de start en stop tijd zich bevindt als er enkele weken voorbij zijn.

Maar, nogmaals bedankt.
Heeft me toch verder gebracht als waar ik was...

Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 05 Mei 2017, 21:39

Dit werkt nu (Sketch is alleen ter test en om te zien wat er gebeurt, dus niet de definitieve sketch).

uiteraard is het kijken naar de seriele output alleen ter info (debug).



Code: Alles selecteren
#include <TimeLib.h>
#include <TimeAlarms.h>

AlarmId id;

// variable
int Night = 0;                    // using for Night stop time

// Set Start and Stop time
// variable start time
int StartHH = 15;              // Hour
int StartMM = 59;             // Minutes
int StartSS = 00;             // Seconds
// variable stop time
int StopHH = 20;               // Hour
int StopMM = 15;              // minutes
int StopSS = 0;                // Seconds

int isStartTime()
{
  time_t t = now();                                                   // Read in what our current datestamp is

  int nowHH = hour(t); int nowMM = minute(t); int nowSS = second(t);                          // put into local variables for easier read the time

  if (Night == 0) {
    if ((
          (nowHH > StartHH)                                                                                      // check hours first
          || ((nowHH == StartHH) && (nowMM > StartMM))                                            // check minutes if in same hour
          || ((nowHH == StartHH) && (nowMM == StartMM) && (nowSS >= StartSS))        // check seconds if in same hour & minute
        )
        &&                                                                                                           // both conditions must be valid
        (
          (nowHH < StopHH)                                                                                    // check hours first
          || ((nowHH == StopHH) && (nowMM < StopMM)))                                          // check minutes if in same hour
          || ((nowHH == StopHH) && (nowMM == StopMM) && (nowSS <= StopSS))        // check seconds if in same hour & minute
       )
      return 1;
    else  return 0;
  } else {
    // needed for next day check
    // .....
    if ((
          (nowHH < StartHH)                                                                                // check hours first
          || ((nowHH == StartHH) && (nowMM > StartMM))                                      // check minutes if in same hour
          || ((nowHH == StartHH) && (nowMM == StartMM) && (nowSS >= StartSS))  // check seconds if in same hour & minute
        )
        &&                                                                                                    // both conditions must be valid
        (
          (nowHH < StopHH)                                                                              // check hours first
          || ((nowHH == StopHH) && (nowMM < StopMM)))                                    // check minutes if in same hour
          || ((nowHH == StopHH) && (nowMM == StopMM) && (nowSS <= StopSS))  // check seconds if in same hour & minute
       )
      return 1;
    else  return 0;
  }
}

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for Arduino Serial Monitor

  // Change time on Arduino so you can test litle seconds before or after start stop time
  // format HH  MM  SS  M  D  Y
  setTime(20, 14, 45, 5, 5, 17); // set time to fryday 20:14:45 Mei 5 2017

  // create 2 second timer
  id = Alarm.timerRepeat(2, Repeats2);      // timer for every 2 seconds
}

void loop() {
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}

// functions to be called when an alarm triggers:
// So i used this for check only to look when what is happening on Serial
void Repeats2() {
 
 Ch_Night();                              // Check for Stop time before or after start time
 
 Serial.println("2 second timer");    // only for test

  if (isStartTime()) {
    Serial.println("Start Pomp >>>>>>>>>>");             // ... when the Starttime is now or passed or before Stop time
  // do some stuf here for Output
  // Start time
  } else {
    Serial.println("<<<<<<<<<<< Stop Pomp");              // ... when the Stoptime is now or passed or before start time
  // do some stuf here for Output
  // Stop time
  }
}

// Check if Start time before or after Stop time
// Needed when you must check for nextday stoptime
void Ch_Night() {
  if (StartHH > StopHH ) {                                             // Check
    Night = 1;                                                            // Stop time is before Start time!
    Serial.println("Stop time is at Night");                              // Yes it is later !
  } else {
    Night = 0;                                                            // Stop time is later
    Serial.println("Stop time is at Day");                                // No it isn't
  }
}



void digitalClockDisplay() {
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println();
}

void printDigits(int digits) {
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

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

Re: tijd vergelijken probleempje

Berichtdoor nicoverduin » 05 Mei 2017, 22:09

zomaar..... uit nieuwsgierigheid........ waarom vraag je eigenlijk hier om hulp? Je hebt zo ongeveer elk advies in de wind geslagen die je gegeven is? Maar suc6 ermee.......
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 05 Mei 2017, 23:49

nicoverduin schreef:zomaar..... uit nieuwsgierigheid........ waarom vraag je eigenlijk hier om hulp? Je hebt zo ongeveer elk advies in de wind geslagen die je gegeven is? Maar suc6 ermee.......


Heb elke stukje code van jullie geprobeerd en ermee aan de gang gegaan en riep veel vragen bij me op en snap nog steeds niet hoe jij dat dan ziet als een geven is van alleen tijd en daarna met en datum en tijd te gaan spelen.
Mijn kennis is matig op AVR Arduino, stukje met eeprom lezen/schijven vindt ik super handig van Koepel, stukje met Unix vindt ik heel handig maar kom er niet uit na middag spelen, en gisteren ook lang doorgegaan met de adviezen van jullie.

Dus in de wind geslagen heb ik het zeker niet en ook zeker niet zo bedoeld als dat zo blijkt.
(ik heb lijstje op m'n werk liggen met 13 vragen van hoe ik het moet doen met jou code, dat dorst ik even niet te plaatsen omdat het puur om variabele ging waar de Arduino IDE om klaagde door mijn aanpassingen en dat ik ze niet op de juiste plek had staan)

Ben nog steeds blij dat jullie me een kant op duwen om ook zelf wat te doen, heb nu intussen wel meer geleerd en dat er meer mogelijkheden zijn om ergens te komen.
Bracht me ook op ideeen.. wilde al eerder stoppen en een lipo als soort ups eraan te hangen.

Dus toch mijn dank.
ondanks je teleur gesteld ben hoe ik dan met jullie hulp het toch kan oplossen!

Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 06 Mei 2017, 00:05

nicoverduin schreef:En met een eenvoudige test sketch
cpp code
/**
* programma : testtijdinterval
* Auteur : Nico Verduin
* Datum : 5-5-2017
* Doel : bepalen of een tijdstip in een interval valt
*/

#include "Arduino.h"
struct interval {
uint16_t start; // start van interval
uint16_t eind; // einde interval
};
//
// interval Array
//
interval intervalArray[] = {
{ 800, 1200}, // van 08:00 tot 12:00
{2300, 400} // van 23:00 tot 04:00
};

const int LED = 13;

char printBuffer[100]; // buffertje voor de serial

/**
* Initialiseren programma
*/
void setup()
{
Serial.begin(115200);
Serial.println("Test programma tijd intervallen");
pinMode (LED, OUTPUT);
digitalWrite(LED, LOW);
//
// loop door de tijden per uur te beginnen bij 00:30
//
for (uint16_t i = 30; i < 3000; i+= 100) {
for (uint8_t j = 0; j < sizeof(intervalArray) / sizeof(interval); j++) {
//
// correctie bij dag wisseling
//
uint16_t nu;
if (i > 2400) {
nu = i - 2400;
} else {
nu = i;
}
//
// kijk of de tijd in een van de intervallen valt
//
if (KijkOfInInterval(intervalArray[j].start, intervalArray[j].eind, nu)) {
//
// yep dus LED aan
//
digitalWrite(LED, HIGH);
//
// toon het resultaat
//
sprintf(printBuffer, "Interval %02d:%02d-%02d:%02d Tijd : %02d:%02d Pomp = Aan\n",
intervalArray[j].start / 100,
intervalArray[j].start % 100,
intervalArray[j].eind / 100,
intervalArray[j].eind %100,
nu / 100,
nu % 100
);
Serial.print(printBuffer);
} else {
digitalWrite(LED, LOW);
}
delay(500);
}

}
}
/**
* runs endlessly
*/
void loop()
{
//Add your repeated code here
}

/**
* KijkOfInInterval
* @param startTijd uren*100 + minuten
* @param eindTijd uren*100 + minuten
* @param nuTijd uren*100 + minuten
* @return true or False
* Valideert of nuTijd in het interval startTijd en eindTijd valt.
*/
bool KijkOfInInterval(uint16_t startTijd, uint16_t eindTijd, uint16_t nuTijd){
uint16_t start = startTijd;
uint16_t eind = eindTijd;
uint16_t nu = nuTijd;
//
// kijk of het een 24 uurs overlap is
//
if (eind < start ){
//
// ja dus
//
eind = eind + 2400; // verhoog het eind tijdstip met 2400 (volgende dag)
//
// kijk tevens of de huidige tijd ook in de nieuwe dag valt
//
if (nu < eindTijd) {
//
// ook dus eveneens verhogen met een dag
//
nu = nu + 2400;
}
}
//
// de feitelijke vergelijking
//
if (nu >= start && nu <= eind){
return true;
} else {
return false;
}
}


en hiermee ben ik nog steeds aan het spelen omdat er 2 tijdblokken in staan wat ik straks misschien mooi kan gebruiken als ik die unit16 ga begrijpen o.a.(denk aan 16bit maar zal softwarematig zijn)...
en zat ermee dat ik de tijd in 2x 2 bytes binnen krijg en dat even niet bij elkaar krijg zodat ik een geheel decimaal getal kreeg.

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

Re: tijd vergelijken probleempje

Berichtdoor Koepel » 06 Mei 2017, 00:15

"uint16_t" is een unsigned integer van 16 bit. Dat zijn twee bytes.

Dus "int64_t" is een signed integer van 64 bit.
En "uint8_t" is een unsigned integer van 8 bit. Dat is één enkele byte.

Dit is intussen een normaal onderdeel van de 'c' taal geworden. Op ieder Arduino board maar ook op iedere computer en op iedere processor zijn ze dan hetzelfde (dezelfde hoeveelheid bytes).

Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 06 Mei 2017, 01:01

Koepel schreef:"uint16_t" is een unsigned integer van 16 bit. Dat zijn twee bytes.

Dus "int64_t" is een signed integer van 64 bit.
En "uint8_t" is een unsigned integer van 8 bit. Dat is één enkele byte.

Dit is intussen een normaal onderdeel van de 'c' taal geworden. Op ieder Arduino board maar ook op iedere computer en op iedere processor zijn ze dan hetzelfde (dezelfde hoeveelheid bytes).


Dank, wist niet dat die zo gebruikt werd in de IDE van Arduino omdat het maar een 8 bitter is, maar zat er al aan te denken en gevonden, wel weer handig voor verschillende cpu's idd.

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 32 gasten