tijdvertraging op schemerschakelaar

algemene C code
Berichten: 11
Geregistreerd: 30 Jul 2015, 16:33

tijdvertraging op schemerschakelaar

Berichtdoor Sanderoni » 31 Jul 2015, 14:54

Goedenmiddag,

Ik ben bezig met het installeren van o.a. de tuinverlichting op de Arduino.

Dit lukt nu aardig, ik ben zover dat de verlichting aangaat op de geschikte tijden en wanneer de schemer invalt.

Ik wil nu alleen nog als de schemer invalt (sensorValue <700 van de LDR) een tijdvertraging inbouwen van 2 minuten om onnodig knipperen tegen te gaan. Zeg maar als een soort hysteresis, maar dan met tijd.

Ik heb een DS3231 aangesloten dus het leek mij het beste om de seconden van deze print te gebruiken.

Ik kom nu alleen niet verder met de code. (zie onder)

Kan iemand mij op weg helpen om de timer te activeren op het moment dat de sensorValue <700 is, en dat na 2 minuten uitgang 3 (light) hoog wordt?

Ik loop nu vast, weet niet hoe ik de Geheugentijd kan "bevriezen" op het moment dat dit nodig is.

Mvg,

Sander



Code: Alles selecteren
#include <Time.h>
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68

byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal
{
  return( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers
{
  return( (val/16*10) + (val%16) );
}
int sensorPin = A0;   // select the input pin for ldr
int sensorValue = 0;  // variable to store the value coming from the sensor
const int Light = 3;
int Poort = LOW;
unsigned long Geheugentijd = 0; //
const long Timer = 5; // tijdvertraging in seconden

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  pinMode(Light, OUTPUT);
 

  sensorValue = analogRead(sensorPin); // read the value from the sensor
  Serial.println(sensorValue); //prints the values coming from the sensor on the screen
 

  unsigned long Huidigetijd = now();
    Serial.print("Huidigetijd =");
    Serial.println(Huidigetijd);
 
  if (sensorValue < 700)
  {
    Geheugentijd = Huidigetijd;
    Serial.print("Geheugentijd =");
    Serial.println(Geheugentijd);
  }
 
  if (Huidigetijd - Geheugentijd >= Timer)
  {
     digitalWrite(Light, HIGH);
  }
     
  else
  {
    digitalWrite(Light, LOW);
  }
 

}

Advertisement

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor nicoverduin » 31 Jul 2015, 15:38

Je moet de geheugentijd op 0 zetten als hij niet gebruikt wordt. Dan kun je bij de test < 700 kijken of hij al een waarde > 0 heeft. Zo nee, dan zet je hem op huidige tijd. Zo ja hoef je hem al niet meer te zetten omdat hij al loopt. Nu zal de huidige tijd elke keer in de geheugentijd worden gezet omdat de waarde < 700 is.
Omgekeerd geldt natuurlijk hetzelfde dat wanneer hij > 700, dat dan de huidige tijd weer op 0 wordt gezet en zolang hij niet onder de 700 komt, gaat het licht ook niet meer aan. Eventueel kun je om knipperen te voorkomen een eigen test maken voor licht aan zodra de sensor een waarde > 750 geeft bijvoorbeeld. Dan wordt je timer op 0 gezet. En daar je ruim boven de 700 zit heb je ook bij de ochtend geen knipper centrale meer.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor shooter » 01 Aug 2015, 09:07

ipv een tijd kun je beter een hysterese en een tijd inbouwen, ofwel de lamp gaat pas uit als de waarde > 800.
paul deelen
shooter@home.nl

Berichten: 11
Geregistreerd: 30 Jul 2015, 16:33

Re: tijdvertraging op schemerschakelaar

Berichtdoor Sanderoni » 01 Aug 2015, 17:03

Allereerst hartelijk dank voor de snelle reactie! En het meedenken :)

Ik heb wat nagedacht en het uitgewerkt, maar krijg het op deze manier nog niet werkend.
Kom er niet helemaal uit of ik de juiste if en else volgorde heb gehanteerd, en of de notatie verkeerd is?

Heb nu de voorwaardes voor het donker worden, en 's ochtends het licht worden in 2 aparte blokken verwerkt.
De uitkomst daarvan "schemer" 0 of 1 kan ik dan weer verder verwerken.

Dat is in ieder geval de achterliggende gedachte.

@shooter: Heb wat Nico voordroeg, "de lamp gaat uit bij >750" verwerkt in het "ochtend blok" dit werkt dan natuurlijk al als een hysterese. De tijd is dan om het verder licht te laten worden ('s ochtends).

Code: Alles selecteren
#include <Time.h>
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68

byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal
{
  return( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers
{
  return( (val/16*10) + (val%16) );
}
int sensorPin = A0;   // select the input pin for ldr
int sensorValue = 0;  // variable to store the value coming from the sensor
const int Light = 13;
int schemer = 0;
const long Vertraging = 5; // tijdvertraging in seconden (testen)
unsigned long timer1 = 0;
unsigned long timer2 = 0;

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  pinMode(Light, OUTPUT);
 
 
}

void loop()
{
  displayTime(); // display the real-time clock data on the Serial Monitor,
  delay(1000); // every second
 
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231
 
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

  sensorValue = analogRead(sensorPin); // read the value from the sensor
  Serial.println(sensorValue); //prints the values coming from the sensor on the screen

  Serial.print("schemer=");
  Serial.println(schemer);
  Serial.print("timer1=");
  Serial.println(timer1);
 
  if (sensorValue < 700 && schemer == 0) // Bij schemer zakt waarde onder de 700, zo niet timer1 nog uit.
  {
    if (timer1 != 0) // Kijkt of timer1 waarde > 0 heeft, zo niet timer "aan"
      { 
      if (now() - timer1 > Vertraging) // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "1"
      {
        schemer = 1;
      }
      else{                       
      timer1 = now();            // timer aanzetten (timer1 wordt huidige tijd)
      }
      }else{
        timer1 = 0;                // SensorValue is nog hoog, timer nog niet aan
    }
     
  }
 
  if (sensorValue > 750 && schemer == 1)  // Bij dageraad stijgt waarde boven de 750, zo niet timer2 nog uit.
  {
    if (timer2 != 0)                     // Kijkt of timer2 waarde > 0 heeft, zo niet timer "aan"
    {
      if (now() - timer2 > Vertraging)   // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "0"
      {
        schemer = 0;
      }
    }else{
      timer2 = now();             // timer aanzetten (timer2 wordt huidige tijd)
    }
    }else{
      timer2 = 0;                 // SensorValue is nog laag, timer nog niet aan
    }
     
 
   
  if (schemer == 1)
  {
     digitalWrite(Light, HIGH);
  }
     
  else
  {
    digitalWrite(Light, LOW);
  }
 

}

Berichten: 77
Geregistreerd: 06 Okt 2012, 10:57

Re: tijdvertraging op schemerschakelaar

Berichtdoor Beamer » 01 Aug 2015, 22:03

Als je er een klok bij zet kun je de schakeltijden inperken. Ik doe dat met een automaat voor KaKu. Met zomer en wintertijd :)

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor nicoverduin » 01 Aug 2015, 22:49

Probeer dit eens:
cpp code
#include <Time.h>
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68

byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal
{
return ((val / 10 * 16) + (val % 10));
}
byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers
{
return ((val / 16 * 10) + (val % 16));
}
int sensorPin = A0; // select the input pin for ldr
int sensorValue = 0; // variable to store the value coming from the sensor
const int Light = 13;
int schemer = 0;
const unsigned long Vertraging = 5000; // tijdvertraging in milliseconden (testen)
unsigned long timer1 = 0;
unsigned long timer2 = 0;

void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(Light, OUTPUT);

}

void loop() {
// displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231

// readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

sensorValue = analogRead(sensorPin); // read the value from the sensor
Serial.println(sensorValue); //prints the values coming from the sensor on the screen

Serial.print("schemer=");
Serial.println(schemer);
Serial.print("timer1=");
Serial.println(timer1);

if (sensorValue < 700 && schemer == 0) { // Bij schemer zakt waarde onder de 700, zo niet timer1 nog uit.
if (timer1 != 0) { // Kijkt of timer1 waarde > 0 heeft, zo niet timer "aan"
if ((millis() - timer1) > Vertraging) { // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "1"
schemer = 1; // het is schemer
timer1 = 0; // timer werk is klaar
}
} else {
timer1 = millis(); // timer aanzetten (timer1 wordt huidige tijd)
}
}

if (sensorValue > 750 && schemer == 1) { // Bij dageraad stijgt waarde boven de 750, zo niet timer2 nog uit.
if (timer2 != 0) { // Kijkt of timer2 waarde > 0 heeft, zo niet timer "aan"
if ((millis() - timer2) > Vertraging) { // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "0"
schemer = 0; // schemer is voorbij
timer2 = 0; // en de timer is ook klaar
}
} else {
timer2 = millis(); // timer aanzetten (timer2 wordt huidige tijd)
}
}

if (schemer == 1) {
digitalWrite(Light, HIGH);
}

else {
digitalWrite(Light, LOW);
}

}


Ik heb ff die datumtijd calls als commentaar gezet
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 11
Geregistreerd: 30 Jul 2015, 16:33

Re: tijdvertraging op schemerschakelaar

Berichtdoor Sanderoni » 02 Aug 2015, 14:01

Ha die Nico,

De code werkt! :) Hartstikke bedankt voor je hulp!

Zie ook dat die laatste timer=0 in de laatste "else" op de verkeerde plek stond. Erg leerzaam voor toekomstige projecten.

Is er nog een speciale reden dat je de millis() functie ipv de now() functie gebruikt hebt? Voor de werking maakt het natuurlijk niet uit, maar daar ben ik nog nieuwsgierig naar.

Ben in ieder geval blij dat het nu loopt zoals ik in gedachten had :D

Gr. Sander

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor nicoverduin » 02 Aug 2015, 14:46

millis() is de ingebouwde timer. Is al in de prijs inbegrepen :)
now() is onderdeel van die RTC klok. Heb je die niet nodig, waarvoor zou je hem dan gebruiken. Voor de nauwkeurigheid hoef je het niet te doen. Het maakt in jouw geval niets uit of het nu 4.999 seconden of 5.001 seconden duurt voordat de schemer stand ingaat, cq uitgezet wordt.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 11
Geregistreerd: 30 Jul 2015, 16:33

Re: tijdvertraging op schemerschakelaar

Berichtdoor Sanderoni » 02 Aug 2015, 15:14

:D Dat klopt.

Heb de DS3231 erop aangesloten om nog een tijdsinterval te maken waarop het licht 's nachts uit gaat voor een periode, vandaar.

Voor n korte timer is ie inderdaad niet nodig.

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor nicoverduin » 02 Aug 2015, 18:44

Nou de gewone klok kun je nu gerust inbouwen.
Meest eenvoudige:
cpp code
Als tijd groter dan 24:00 en kleiner dan 05:00 dan licht altijd uit.

Als je dit als eerste doet en de rest van je code als else gaat het vanzelf goed.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten