Kom niet uit do-while-loop

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

Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 27 Sep 2021, 18:19

Ik heb een schetsje geschreven dat bedoeld is om enkele planten langer te belichten. Een relais voor de belichting wordt geactiveerd bij schemering door Inputpin 5 Hoog te maken. Outputpin 6 wordt dan ook Hoog en activeert het relais. Na 5 uur wordt Outputpin 6 Laag gemaakt en het relais uit. Maar nu moet de schakeling wachten tot daglicht, want dan wordt Inputpin 5 weer Laag (door een externe schakeling).
Het wachten probeerde ik met een do-while-loop, (wachten tot Inputpin 5 Laag), maar ondanks dat Inputpin 5 Laag wordt, weer Hoog en daarna weer Laag, gebeurt er niets meer. Waarschijnlijk komt de schakeling niet uit de do-while-loop.
Graag een advies.

/* Dit schetsje is bedoeld om enkele planten extra belichting te geven, beginnend
bij de schemering, Inputpin 5 Hoog en outputpin 6 Hoog relais wordt geactiveerd.
Na 5 uur wordt het relais voor de belichting uitgeschakeld, Ouputpin 6 Laag,
terwijl het nog donker is. Wachten tot het weer licht wordt, want dan maakt de
externe lichtgevoelige schakeling Inputpin 5 (pinin) Laag.
In de eerste donkere tijd moet het relais aan en na 5 uur, in de tweede
donkere tijd uit, ondanks dat het dan ook donker is, moet het relais toch uit blijven.
Wachten door middel van een "do while-loop"? totdat Inputpin 5 weer laag wordt
bij daglicht. Als het daaarna weer donker wordt, Inputpin 5 (pinin) Hoog, relais aan
en begint de cyclus opnieuw.
*/

int pinin = 5; // Krijgt 5 volt van schemerschakeling bij invallende duisternis
int pinuit = 6; // stuurt een vermogenstransistor met relais. Hoog is Aan

void setup() {
pinMode(5, INPUT);
pinMode(6, OUTPUT);
d = 5000; // Dit is tijdelijk een lage waarde om snel te zien of het werkt.
}
void loop()
{
int Tweedetijd = 0;
{ byte Gelezenwaarde = digitalRead(pinin);

if (Gelezenwaarde == LOW) // Bij daglicht
digitalWrite(pinuit, LOW); // Relais wordt niet geactiveerd
else
digitalWrite(pinuit, HIGH); // Relais gaat aan. Extra plantlicht aan
}
{
if (pinin, HIGH) // Bij de eerste keer donker, voor extra plantlicht
delay(d);
}
{ digitalWrite(pinuit, LOW); // Nadat extra plantlicht een tijd aan is geweest, relais uit
Tweedetijd = 1;
delay(d); // Deze regel is tijdelijk om te zien wat er gebeurt
}
{ do
digitalRead(pinin);
while (pinin, HIGH and 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
// De volgende dag, bij schemer, wordt pinin weer HIGH.
Tweedetijd = 0;
}
}

Advertisement

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

Re: Kom niet uit do-while-loop

Berichtdoor Frits1956 » 27 Sep 2021, 19:31

Je leest pinin niet. if (pinin, HIGH) // Bij de eerste keer donker, voor extra plantlicht
ik verwacht dat het zou moeten zijn:
if (Gelezenwaarde == HIGH)

Verder is het daarop volgende delay(d); het enige statement dat wordt uitgevoerd als Gelezenwaarde hoog is terwijl ik denk dat je eigenlijk ook het volgende uitgevoerd wil hebben
{ digitalWrite(pinuit, LOW); // Nadat extra plantlicht een tijd aan is geweest, relais uit
Tweedetijd = 1;
delay(d); // Deze regel is tijdelijk om te zien wat er gebeurt
}
Als je dat wil moet je het als volgt schrijven
if (Gelezenwaarde == HIGH)
{ delay(d);
digitalWrite(pinuit, LOW); // Nadat extra plantlicht een tijd aan is geweest, relais uit
Tweedetijd = 1;
delay(d); // Deze regel is tijdelijk om te zien wat er gebeurt
}

Verderop lees je pinin wel maar ken je de waarde nergens aan toe.
digitalRead(pinin);

Dat zou iets moeten zijn als:
Gelezenwaarde = digitalRead(pinin);
enz.....

Mijn advies:
Na het schrijven van code altijd even [CTRL] +[T] gebruiken waardoor de code uitgelijnd wordt zodat je eerder ziet wat bij elkaar hoort.

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

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 28 Sep 2021, 08:36

Bedankt Frits.
Proberend jouw tips te verwerken en de schets simpeler te maken kwam ik tot deze. Nog steeds blijft de do-while-loop voorkomen dat het werkt zoals het zou moeten werken.
Als ik de eerste keer, met afgedekte LDR (donkere tijd), de spanning er op zet gaat het test-ledje aan en na de "delay(d)" weer uit. Als ik daarna de LDR "ontbloot" en vervolgens weer afdek gebeurt er niets meer. In de do-while-loop gevangen? En als ik de do-while-loop even uitschakel achter // dan werkt het wel, met dien verstande dat bij donker de led afwisselend aan en uit gaat en bij licht de led uit blijft. Ik meende dat als je in "do" een input leest en die op een bepaald moment verandert, de while-loop genegeerd wordt en naar het begin van het programma wordt gesprongen. Helaas na het licht worden en daarna weer donker, gebeurt er niets meer.

int pinin = 5; // Krijgt 5 volt van schemerschakeling bij invallende duisternis
int pinuit = 6; // stuurt een vermogenstransistor met relais. Hoog is Aan
int d = 7000; // Dit is tijdelijk een lage waarde om snel te zien of het werkt.
void setup() {
pinMode(5, INPUT);
pinMode(6, OUTPUT);
}
void loop()
{
{
byte Gelezenwaarde = digitalRead(pinin);
byte Eerstetijd = LOW;

if (Gelezenwaarde == LOW) // Bij daglicht
digitalWrite(pinuit, LOW); // Relais wordt niet geactiveerd
else
digitalWrite(pinuit, HIGH); // Relais gaat aan. Extra plantlicht aan
}

{ byte Eerstetijd = LOW;
byte Gelezenwaarde = digitalRead(pinin);
if (Gelezenwaarde == HIGH) // Bij de eerste keer donker, voor extra plantlicht
delay(d);
digitalWrite(pinuit, LOW); // Nadat extra plantlicht een tijd aan is geweest, relais uit
digitalWrite(Eerstetijd, HIGH);
delay(d); // Deze regel is tijdelijk om te zien wat er gebeurt
do {
digitalRead(Gelezenwaarde);
} while (Gelezenwaarde, HIGH and Eerstetijd, HIGH); // Loop gaat door tot Gelezenwaarde LOW wordt.

}
}

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

Re: Kom niet uit do-while-loop

Berichtdoor Frits1956 » 28 Sep 2021, 17:43

Ik heb het niet getest maar volgens mij moet dit
do {
digitalRead(Gelezenwaarde);
} while (Gelezenwaarde, HIGH and Eerstetijd, HIGH); // Loop gaat door tot Gelezenwaarde LOW wordt.

als volgt geschreven worden:
do {
Gelezenwaarde =digitalRead(pinin);
} while (Gelezenwaarde == HIGH and Eerstetijd == HIGH); // Loop gaat door tot Gelezenwaarde LOW wordt.


Wat ik zie is dat je de waarde van een variabele uit leest terwijl je volgens mij wil lezen wat je sensor voor waarde heeft. Zoals je het nu doet wijzigt de variabele niet. "digitalRead(Gelezenwaarde);"
Meest gebruikelijke is dat je de sensor leest "digitalRead(pinin)" , en die waarde in een variabele stopt "Gelezenwaarde =" waarmee je weer van alles kan gaan doen.

Korter schrijven zal wel kunnen denk ik (ook niet getest)
do {
digitalRead(pinin);
} while (digitalRead(pinin)== HIGH and Eerstetijd == HIGH); // Loop gaat door tot Gelezenwaarde LOW wordt.

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

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 29 Sep 2021, 17:49

Jouw laatste do-while-loop overgenomen. Resultaat was dat de led aan en uit bleef gaan. De loop werd kennelijk genegeerd, ondanks (pinin,HIGH). Ook na eerst licht en daarna weer donker bleef de led aan en uit gaan. De bedoeling is dat na de eerste (pinuit,LOW) de do-while-loop pas verbreekt als (pinin,LOW) is, maar kennelijk wordt de loop genegeerd.

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

Re: Kom niet uit do-while-loop

Berichtdoor Frits1956 » 29 Sep 2021, 18:11

Dorus, ik heb sterk de indruk dat je het verschil tussen de statements input en output en tussen hardwarepinnen en variabelen niet begrijpt.
Je schrijft in de code digitalWrite(Eerstetijd, HIGH);
Wat hier staat is: zet op pinnummer Eerstetijd 5Volt.

Wat jij volgens mij meent te schrijven is:
Geef de variabele Eerstetijd de waarde 1

Als eerste heb je Eerstetijd geen pinnummer gegeven dus de arduino heeft geen enkel idee op welke pin er 5V gezet moet worden. Waarschijnlijk kiest de compiler dan pin 0 (en die bestaat niet)

Wil je een variabele Eerstetijd gebruiken dan moet je daarvoor eerst een plekje in het geheugen reserveren. De compiler wil dan ook graag weten hoeveel ruimte die moet reserveren en dat doe je door een type mee te geven. bijvoorbeeld byte of int.

Een variabele kan geen spanning hebben en een pin kan geen geheugenwaarde onthouden.

Berichten: 68
Geregistreerd: 04 Sep 2021, 08:31

Re: Kom niet uit do-while-loop

Berichtdoor RobGood » 29 Sep 2021, 22:06

Hi Dorus, leuke puzzel....
Ik ben meer van de timers en minder van de while loops.....
Onderstaand zou volgens moeten doen wat je wilt......
Rob

//Pin5 weerstand 100K naar GND en naar de schemerschakelaar(high active 5V)
//Pin6 Naar relaismodule>schakelen lamp

//declaraties
#define brandTijd 300 //300minuten=5uur

unsigned long tijd;
bool lampaan = false;
int minuutTeller = 0;

void setup() {
//Pin5 is bij power-up input pin, weerstandje van 100K nodig tussen pin5 en GND.
DDRD |= (1 << 6); //pin6 als output.
}

void loop() {
if (millis() - tijd > 60000) { //timer 1 minuut
tijd = millis();
if (lampaan) { //lamp brand
minuutTeller++; //minuut verhogen
if (minuutTeller > brandTijd) { //5 uur verstreken
lampaan = false;
PORTD &= ~(1 << 6); //zet pin6 laag, lamp uit
}
} else { //lamp brand niet
if (PIND & (1 << 5)) { //test schemersensor
lampaan = true;
PORTD |= (1 << 6); //zet pin6 hoog>lamp aan
minuutTeller = 0; //reset teller
}
}
}
}

Berichten: 68
Geregistreerd: 04 Sep 2021, 08:31

Re: Kom niet uit do-while-loop

Berichtdoor RobGood » 29 Sep 2021, 22:27

Ho sorrie.... ik vergeet wat... vorige versie gaat midden in de nacht minuutje uit en dan weer 5 uur aan.....

Zo klopt het wel (hoop ik....)

//Pin5 weerstand 100K naar GND en naar de schemerschakelaar(high active 5V)
//Pin6 Naar relaismodule>schakelen lamp op Nc (normal closed)

//declaraties
#define brandTijd 300 //300minuten=5uur

unsigned long tijd;
bool lampaan = false;
bool SensorAan = false;
int minuutTeller = 0;

void setup() {
//Pin5 is bij power-up input pin, weerstandje van 100K nodig tussen pin5 en GND.
DDRD |= (1 << 6); //pin6 als output.
}

void loop() {
if (millis() - tijd > 60000) { //timer 1 minuut
tijd = millis();

if (lampaan) { //lamp brand
minuutTeller++; //minuut verhogen

if (minuutTeller > brandTijd) { //5 uur verstreken
lampaan = false;
PORTD &= ~(1 << 6); //zet pin6 laag, lamp uit
}

} else { //lamp brand niet

if (PIND & (1 << 5)) { //schemersensor actief nacht
if (~SensorAan) { //Sensor deze nacht nog niet gezet
lampaan = true;
PORTD |= (1 << 6); //zet pin6 hoog>lamp aan
minuutTeller = 0; //reset teller
SensorAan = true;
}
} else { //schemersensor niet actief dag
SensorAan = false;
}

}
}
}

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

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 01 Okt 2021, 15:06

Bedankt Rob, ik ben aan het testen.

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

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 02 Okt 2021, 05:33

Begrijp ik het goed dat, in deze schets, na de eerste 5 uur brandtijd pin 6 eerst laag en daarna weer hoog wordt zodat, zoals ik nu inmiddels ook heb geconstateerd, de lamp opnieuw aan gaat en de rest van de nacht aan blijft.
De bedoeling is dat de lamp de rest van de nacht uit blijft. Dat pin 5 vanaf het ochtendlicht pin 6 laag houdt tot de volgende avond pin 5 weer hoog wordt.

Volgende

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten