Kom niet uit do-while-loop

IDE gerelateerde berichten
Berichten: 68
Geregistreerd: 04 Sep 2021, 08:31

Re: Kom niet uit do-while-loop

Berichtdoor RobGood » 02 Okt 2021, 09:48

Dorus,
Je moet wel de TWEEDE sketch nemen, in de eerste ben ik vergeten dat na de vijf uur branden het nog steeds nacht is.....
Even de logica van het geheel om te zien of ik het goed heb begrepen:
Alles boven void loop() is wel duidelijk denk ik...

in Loop() eerste regel is een timer van 1 minuut, dus eigenlijk wordt het hele programma maar 1x per minuut gedraaid.

Getest wordt of de lamp brand...
Als de lamp brand wordt de minuut teller verhoogd, dit gaat zo door totdat de 5 uur voorbij zijn dan wordt de lamp uitgezet.

Als de lamp niet brand, dan wordt de sensor getest...

Is het donker, dan is de sensor HOOG...
Dan wordt getest of de sensor (deze nacht) al een keertje is gezet, met de flag Sensoraan.
Is dat niet zo, dan wordt sensoraan hoog gezet, de minutenteller gaat naar nul en de lamp wordt aangezet.

Is de sensor al een keertje gezet, dus de lamp is al klaar met branden deze nacht.... dan gebeurt er efkens niks....want de flag sensoraan staat al hoog.


Is het DAG.... dus de sensor is laag, dan wordt de flag sensoraan laag gezet....
Vervolgens wordt iedere minuut getest of het al weer donker is.

kritisch hier is de leestijd.... want stel bij zonsopgang schijnt even de zon op de sensor....ah...dag, sensoraan flag naar laag, en dan schuift ff een wolk voor de zon...donker sensor gaat weer aan...en lamp gaat weer 5 uur branden....
in dat geval naar een 5minuten of 10 minuten cyclus gaan...


Zou moeten werken.....

Succes Rob

Advertisement

Berichten: 180
Geregistreerd: 26 Aug 2015, 11:57

Re: Kom niet uit do-while-loop

Berichtdoor Frits1956 » 02 Okt 2021, 10:27

Ik begrijp dat Rob een totaal andere benadering heeft maar dat is volgens mij niet de vraag.
Ik heb jouw code wat aangepast zodat je ervan kan leren
Er loopt echter nergens een teller die bijhoudt of de 5 uren al voorbij zijn.

Code: Alles selecteren
int pinin = 5; // Krijgt 5 volt van schemerschakeling bij invallende duisternis
int pinuit = 6; // stuurt een vermogenstransistor met relais. Hoog is Aan
byte Gelezenwaarde;
bool Tweedetijd = LOW;
int  d = 5000; // Dit is tijdelijk een lage waarde om snel te zien of het werkt.

void setup()
{ Serial.begin(9600);
  pinMode(5, INPUT);
  pinMode(6, OUTPUT);
}
void loop()
{ Gelezenwaarde = digitalRead(pinin);
  if (Gelezenwaarde == LOW) // Bij daglicht
  { digitalWrite(pinuit, LOW); // Relais wordt niet geactiveerd
    Serial.println(" Gelezenwaarde laag pinuit ook laag want er is daglicht");
    delay(d);
  }
  else
  { digitalWrite(pinuit, HIGH); // Relais gaat aan. Extra plantlicht aan
    Tweedetijd = HIGH; // hier zeg je dat de eerste keer het licht aan is gegaan.
    Serial.println(" Gelezenwaarde hoog, pinuit ook hoog want er is extra licht nodig");
    delay(d);
  }
  do
    {Gelezenwaarde = digitalRead(pinin); // hier lees je opnieuw de sensor
// hier moet de teller komen.
     }
  while (Gelezenwaarde ==  HIGH && Tweedetijd != LOW); // Loop gaat door tot pinin LOW wordt.
  digitalRead(pinin); // Als het 's ochtens weer licht wordt gaat pinin LOW en stopt de while-loop
  Tweedetijd = LOW;  // De volgende dag, bij schemer, wordt pinin weer HIGH.
}

Berichten: 47
Geregistreerd: 29 Sep 2019, 18:42
Woonplaats: Vlijmen

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 03 Okt 2021, 04:02

O.k. ga het proberen aan te passen

Berichten: 47
Geregistreerd: 29 Sep 2019, 18:42
Woonplaats: Vlijmen

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 04 Okt 2021, 06:32

Rob en Frits nogmaals dank. Ik ben er bijna, maar er is nog een laatste obstakel waar ik niet uit kom.

Ik ben nu tot dit schetsje gekomen. Als je de gecombineerde schakeling inschakelt bij licht dan loopt de void loop() continue door en het lamplicht wordt niet ingeschakeld. Tot zover goed. Bij afdekken van de LDR gaat de lamp aan en blijft de gekozen tijd aan, gaat uit en blijft uit. Dat is ook goed. Maar als de LDR weer belicht wordt (ochtend) en later weer wordt afgedekt (avond) dan blijkt dat de do-While-loop niet gestopt is.
Ik dacht dat in een do-while-loop de "do-opdracht" ook continu gelezen wordt om de condities van de While-loop te testen. Dat blijkt dus niet zo te zijn in mijn schets.
Wat is de oplossing? Hoe kan ik de While-loop beïnvloeden, zodat die stopt als het weer licht wordt?
Hier de schets. De tijd is kort gehouden omdat dit een test-schets is.

int pinin = 5; // Krijgt 5 volt van schemerschakeling bij invallende duisternis
int pinuit = 6; // stuurt een vermogenstransistor met relais. Hoog is Aan
byte Gelezenwaarde;
bool Tweedetijd = false;
int Lampaan = 0;
int d = 5000; // Dit is tijdelijk een lage waarde om snel te zien of het werkt.

void setup()
{ Serial.begin(9600);
pinMode(5, INPUT);
pinMode(6, OUTPUT);
}
void loop()
{ Gelezenwaarde = digitalRead(pinin);
if (Gelezenwaarde == LOW) // Bij daglicht
{ digitalWrite(pinuit, LOW); // Relais wordt niet geactiveerd
Serial.println(" Gelezenwaarde laag pinuit ook laag want er is daglicht");
delay(d);
}
else
{ digitalWrite(pinuit, HIGH); // Relais gaat aan. Extra plantlicht aan
Serial.println(" Gelezenwaarde hoog, pinuit ook hoog");
Lampaan == 0;
delay(d);
Lampaan == d;
Tweedetijd = true; // hier zeg je dat het licht aan is geweest.
}
{
if (millis() >= Lampaan) // Als de lamp lang genoeg aan is geweest
digitalWrite(pinuit, LOW); // Na de gewenste tijd relais uit

if (Tweedetijd = true)
digitalRead(pinin); // Als het 's ochtens weer licht wordt gaat pinin LOW en stopt de while-loop

Serial.println(Gelezenwaarde);
delay(2000);
Serial.println('\r');
Serial.println(Tweedetijd);
}
do
if (pinin, LOW)
Gelezenwaarde == false;
while (Gelezenwaarde == true && Tweedetijd != false); // Loop gaat door tot pinin LOW wordt.

digitalWrite(Tweedetijd, false);
Serial.println(" Laatste loop geskipt");
// Tweedetijd = false; // De volgende dag, bij schemer, wordt pinin weer HIGH.
}

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

Re: Kom niet uit do-while-loop

Berichtdoor zuid » 04 Okt 2021, 08:18

Ik mis { en } rond het stukje tussen do en while.

Zie : https://www.arduino.cc/reference/en/lan ... e/dowhile/

mvg Nico

Berichten: 47
Geregistreerd: 29 Sep 2019, 18:42
Woonplaats: Vlijmen

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 04 Okt 2021, 09:17

Uitgeprobeerd... Met of zonder die { en } maakt geen verschil. De loop blijft eindeloos.

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

Re: Kom niet uit do-while-loop

Berichtdoor zuid » 04 Okt 2021, 09:31

do{
if (pinin, LOW)
Gelezenwaarde == false;
}while (Gelezenwaarde == true && Tweedetijd != false); // Loop gaat door tot pinin LOW wordt.



Moet zijn .....
Gelezenwaarde = false;

mvg Nico

Berichten: 180
Geregistreerd: 26 Aug 2015, 11:57

Re: Kom niet uit do-while-loop

Berichtdoor Frits1956 » 04 Okt 2021, 10:11

Dorus, a=b betekent krijgt a krijgt de waarde van b.
a == b betekent vergelijk waarde a met waarde b. a blijft a en b blijft b. beide veranderen niet.
Als ik oppervlakkig naar jouw sketch kijk zitten er veel vergelijkingen en waarde toekenningen in, waarbij ik mijn vraagtekens heb.
Voorbeelden die ik zo snel zag:
Lampaan == 0;
delay(d);
Lampaan == d;

Berichten: 47
Geregistreerd: 29 Sep 2019, 18:42
Woonplaats: Vlijmen

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 04 Okt 2021, 11:36

@ Nico Als ik jouw advies volg (geprobeerd) krijg ik een knipperlicht, want dan blijft het licht niet uit na de eerste keer aan.
Zoals ik eerder zei: Bij schemer moet het lamplicht 5 uur aan, dan uit en uit blijven tot de ochtend (pinin,LOW), maar moet uit de do-while-loop komen door (pinin,LOW). Of iets anders??? Dat krijg ik tot nu toe niet voor elkaar.

Berichten: 47
Geregistreerd: 29 Sep 2019, 18:42
Woonplaats: Vlijmen

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 04 Okt 2021, 12:02

Kijk, het gaat bijna goed:
Als je de gecombineerde schakeling inschakelt bij licht dan loopt de void loop() continue door en het lamplicht wordt niet ingeschakeld. Tot zover goed. Bij afdekken van de LDR gaat de lamp aan en blijft de gekozen tijd aan, gaat uit en blijft uit. Dat is ook goed. Maar als de LDR weer belicht wordt (ochtend) en later weer wordt afgedekt (avond) dan blijkt dat de do-While-loop niet gestopt is. Het enige is daarom dat bij het licht worden (pinin,LOW) de do-while-loop-condities ook veranderen en de void() loop terug springt naar het begin.

VorigeVolgende

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten