tijdvertraging op schemerschakelaar

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor Sanderoni » 03 Aug 2015, 15:08

Als opzetje had ik dit nog gevonden. (knippen & plakken, origineel komt ook van Nico ;-)) Werkt goed, maar misschien kan het eenvoudiger.

Wat is uint16_t precies voor variabele?

Code: Alles selecteren
  uint16_t maxAvondTijd = 2000;
  uint16_t minAvondTijd = 1700;
  uint16_t maxOchtendTijd = 0745;
  uint16_t minOchtendTijd = 0400;
 
  // bereken huidige tijd als gewoon getal.
 
  uint16_t huidigeTijd = hour * 100 + minute;


  if (huidigeTijd >= minAvondTijd && huidigeTijd <= maxAvondTijd && sensorValue < 700 || huidigeTijd >= minOchtendTijd && huidigeTijd <= maxOchtendTijd)
  {
    tijdsinterval = 1;
  }
  else
  {
    tijdsinterval = 0;
  }


Advertisement

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor nicoverduin » 03 Aug 2015, 15:31

uint16_t = 16 bits variabele op alle platformen. Ook 32 bits. Een int is ook 16 bits maar dan wel op de 8 bit platformen (atmega328p bijv) terwijl deze 32 bits is op bijvoorbeeld een STM32.
Zo heb je o.a.:
uint8_t = 8 bits unsigned
int8_t = 8 bits signed
uint16_t = 16 bits unsigned
int16_t = 16 bits signed
uint32_t = unsigned 32 bits
int32_t = 16 bits signed
en soms ook nog:
uint64_t en int64_t

Door dit type variabelen te gebruiken kun je efficienter gebruik maken van het RAM geheugen en altijd zeker zijn dat je weet hoe groot een variabele is.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 27
Geregistreerd: 06 Sep 2017, 23:51

Re: tijdvertraging op schemerschakelaar

Berichtdoor robmulder » 03 Jun 2019, 23:12

heel erg dank voor deze code heb ik ook mogen gebruiken, inderdaad zeer leerzaam, maar hier komt hij ik heb een raar probleem de werking is precies anders om dat wil zeggen dat als hij de waarde heeft voor schemer ( bij mij op 65 ) gaat hij uit .
de verlichting gaat dus branden als hij boven de 65 is en weer uit als hij is ingesteld op de boven waarde (105).
wat zie ik over het hooft of wat doe ik niet goed.

gr Rob

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor shooter » 04 Jun 2019, 23:00

gebruik eens wat meer haakjes om bijv &&!!||etc. want wat is de volgorde nu?
paul deelen
shooter@home.nl

Berichten: 27
Geregistreerd: 06 Sep 2017, 23:51

Re: tijdvertraging op schemerschakelaar

Berichtdoor robmulder » 25 Aug 2019, 23:08

een vraag in deze ik wil op de uitgang een led dimmen
heb een code gevonden welke middels cosinus wave werkt (dimt heel mooi)
maar wil die nu aan de code toepassen.

dat wil zeggen dat ik de uitgang wil dimmen (een vaste waarde eventueel )

wie kan mij verder helpen ?


nclude <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);
}

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor Koepel » 25 Aug 2019, 23:36

Dat kan beter :geek:

Kun je voortaan de sketch tussen code-tags zetten ?
Kun je voortaan de hele sketch laten zien, deze compileert niet.

Over deze zin struikel ik twee keer:
robmulder schreef:heb een code gevonden welke middels cosinus wave werkt (dimt heel mooi)

Waar heb je die code gevonden ? In een oude jas ? Op straat ? Of tijdens het schoonmaken van je koikarper vijver ? ;)
En ik zie toch echt een sinus en geen cosinus: https://github.com/Koepel/Fun_with_millis/blob/master/millis_soft_pulsating_led.ino :lol:

Welk Arduino board heb je ?
Je led zit op pin 13, dat is pech hebben als je een Arduino Uno hebt. Op die pin zit geen PWM: https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/.

Wil je dat de led langzaam aan en uit gaat ? Of dat het een bepaalde waarde heeft ? Wat heeft dit te maken met de pulserende led voorbeeld met de (co)sinus ?

Berichten: 27
Geregistreerd: 06 Sep 2017, 23:51

Re: tijdvertraging op schemerschakelaar

Berichtdoor robmulder » 26 Aug 2019, 23:21

hoi Koepel.
in het beginsel heb ik de code van Nico verduin gebruikt.
deze werkt prima licht gaat aan als het donker is en weer uit als het licht is ook zit er door deze code een hysteresis in dat het inschakelen beter maakt .
nu wil ik de uitgang dimmen en wil geen gebruik maken van de delay functie.
ik heb wat gezocht maar loop een beetje vast .
in de code wordt een uitgang geschakeld (relais )
echter wil ik van de code digitalWrite(Light, HIGH); een dim fuctie maken .
ik zat te denken aan analogWrite met een vaste waarde er in bijvoorbeeld: 150
maak gebruik van een Mega2560
helaas krijg ik het niet voor elkaar de code bij te voegen , krijg fout meldingen.

hopende dat je iets meer op weg kunt of wilt helpen

int value ;
int ledpin = 10; // light connected to digital pin 10

long time=0;

int periode = 2000;
int displace = 500;

void setup()
{
// nothing for setup
}

void loop()
{
time = millis();
value = 128+127*cos(2*PI/periode*time);

analogWrite(ledpin, value); // sets the value (range from 0 to 255

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor Koepel » 27 Aug 2019, 00:11

Mijn bericht was te cryptisch, sorry :oops:

Met "Dat kan beter" probeerde ik je aan te sporen om iets duidelijker en zorgvuldiger te zijn.
Je laat de sketch zien, maar dat kan beter tussen code-tags. Je schrijft dat je code hebt gevonden, maar je geeft er geen link naar toe. Dus daarom vroeg ik me af waar je die code met cosinus hebt gevonden. En tot slot begreep ik je vraag niet.

Heb je de "millis_soft_pulsating_led.ino" sketch nog geprobeerd ? Dat is met een berekening voor de logaritmische manier waarop het menselijk oog de helderheid ervaart. Ergens op dit forum staat ook nog een manier van Nico met een tabel.

Je hebt inderdaad een PWM signaal nodig met een analogWrite().
De Arduino Mega heeft PWM mogelijkheid op pin 13 en ook op pin 10.

Bij het schrijven van een bericht op dit forum kun je de "Code" knop gebruiken voor de code-tags. Daarbinnen zet je jouw sketch.
Kun je er een beetje op letten om de hele sketch te laten zien. Je wilt natuurlijk niet dat ik ga zeuren over een ontbrekende '}' op het eind.

Welke foutmelding krijg je ? Bij mij compileert het gewoon als ik de ontbrekende '}' op het eind toevoeg.

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

Re: tijdvertraging op schemerschakelaar

Berichtdoor shooter » 28 Aug 2019, 10:12

de value berekening moet wel via een float want het werkt allemaal via gebroken getallen. nu krijg je dus allemaal 0 en 1 en zo.
dus je berekening klopt gewoon niet.
en wat is PI bij jou?
gebruik Serial.print voor een paar tussenresultaten, dan kun je zien wat de processor allemaal berekent (ja ik weet het , maar jij denk ik niet.
paul deelen
shooter@home.nl

Berichten: 27
Geregistreerd: 06 Sep 2017, 23:51

Re: tijdvertraging op schemerschakelaar

Berichtdoor robmulder » 28 Aug 2019, 22:44

hoi koepel .


bedank voor je reactie , tevens is het geen zeuren van jou kant .
ik heb de code nu bijgewerkt en de timer er uit gehaald .
wellicht denk ik te complex , maar wil de uitgang dimbaar maken temeer het licht dat nu brand veel te vel is
ook heb ik een potmeter geplaatst op de plek van de spanningsdeler , hier door is de schakel waarde goed in te stellen.







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() {


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

VorigeVolgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 19 gasten