Kom niet uit do-while-loop

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

Re: Kom niet uit do-while-loop

Berichtdoor zuid » 04 Okt 2021, 13:09

Nog even terug komen op "Gelezenwaarde == false;"
Zoals het in je code staat heeft het geen nut, er worden twee waarden vergeleken en daar wordt vervolgens niets mee gedaan.
== heeft alleen zin in een if of een while oid. Zie ook de reactie van Frits1956

Stel het programma blijft zoal je wil netjes in de while lus. HOE komt hij er dan uiteindelijk UIT.

In de while wordt "Gelezenwaarde " vergeleken met true ---> HOE wordt dit true, while lus wordt NIET verlaten zolang niet true!

In de while lus Tweedetijd vergeleken met false ---> ook hier HOE veranderd de waarde zonder de while te verlaten.

Als je { } weglaat weet de compiler niet waar een while (of een if) begint of eindigt.

Ik denk dat je dus nog eens kritisch naar je code moet kijken.
mvg Nico

Advertisement

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

Re: Kom niet uit do-while-loop

Berichtdoor shooter » 04 Okt 2021, 17:09

je hebt bijna overal gelijk behale bij een if daar wordt alles wat in de eerstvolgende regel gezien als if zie referentie
paul deelen
shooter@home.nl

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

Re: Kom niet uit do-while-loop

Berichtdoor zuid » 04 Okt 2021, 20:08

@Paul Je hebt uiteraard gelijk, was iets te slordig geformuleerd :)

@Dorus1404
Nog even wat aanvulling. Zoals hiervoor aangegeven is == een vergelijking en worden er geen gegevens gewijzigd.

De waarde van het veld Lampaan blijft daardoor dus altijd 0.
Maar er gaat nog iets niet goed, stel Lampaan wordt daadwerkelijk via veld d geladen met(bijvoorbeeld) 5000.

Vervolgens komt de instructie: "if (millis() >= Lampaan)"
Dus een vergelijking met de waarde van millis().
Deze waarde staat op een aantal milli seconden vanaf de start van het programma.
Eenmalig zal die waarde de grens 5000 passeren (na 5 seconden).
De rest van de de tijd is veld Lampaan dus altijd groter 5000.

Er is dus nog werk te doen.
Zodra je weer een betere versie hebt zullen we weer proberen je verder e helpen.

mvg Nico

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

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 05 Okt 2021, 09:29

Ik heb de syntax-adviezen doorgevoerd. Het maakte voor de werking geen verschil, want het feit blijft dat bij start met licht de lamp niet aan gaat (o.k.!) tot de LDR afgedekt wordt. Dan gaat de lamp aan gedurende de ingestelde tijd en dan weer uit en blijft uit (Ook o.k.). Tot zover alles goed. De do-while-loop gaat nu eindeloos door totdat een vergelijkingswaarde verandert. Eigenlijk moet die stoppen bij weer licht (pinin, LOW), maar dat gebeurt niet. Ik heb pin 5 gemeten met de dc-voltmeter om te verifiëren dat die pin 5 ook echt LOW is. Helaas heeft dat geen invloed op de do-while-loop, ondanks het feit dat in de "do-opdracht" die pinin-waarde ook veranderd moet zijn en daardoor eveneens Gelezenwaarde.

do
if (pinin, LOW)
digitalWrite(Gelezenwaarde, LOW); // Bij licht (pinin, LOW) zou Gelezenwaarde de waarde 0 moeten krijgen (maar het gebeurt niet!
// Waarom niet? Pinin wordt wel degelijk LOW. Meet ik met dc-voltmeter, maar de // loop gaat door.
while (Gelezenwaarde == true && Tweedetijd != false); // Loop moet doorgaan tot pinin LOW wordt.


Waarden van de do-while-loop handmatig wijzigen levert slechts een knipperlicht op of werkt helemaal niet meer.
Ik heb ook die {} op verschillende plaatsen geprobeerd. Kreeg alleen maar errors.
De crux is volgens mij daarom niets anders dan: Hoe bereik ik dat de Gelezenwaarde mee verandert met de pinin in de "do-opdracht"...

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

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 05 Okt 2021, 11:52

Ik weet niet beter of in de do-while-loop je maar één "do-opdracht" kunt geven, anders zou ik nog een extra digitalRead(Gelezenwaarde); kunnen toevoegen.

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

Re: Kom niet uit do-while-loop

Berichtdoor Frits1956 » 05 Okt 2021, 17:06

Dorus, dit is jouw code maar die is niet goed. Ik zal proberen uit te leggen waarom en hoe je het anders moet schrijven.

if (pinin, LOW) Je wil kennelijk weten of de computer registreert dat pinin low is maar je geeft geen commando om de pinin te lezen.
de juiste manier daarvoor is:
if (digitalRead(pinin)==LOW)
hiermee geef je de processor de opdracht om pinin (pin 5) te meten en die te vergelijken met de constante LOW.



digitalWrite(Gelezenwaarde, LOW);

je wil pinuit de waarde LOW geven maar je geeft de variabele de waarde LOW
de juist manier hiervoor is:
digitalWrite(pinuit, LOW);
met dit commando geef je de processor de opdracht om pinuit (pin 6) laag te trekken.

of je wil de variabele Gelezenwaarde de waarde false geven dan is de code:
Gelezenwaarde = false;
Gelezenwaarde = LOW klopt niet want een eindje verderop vraag je de processor de variabele Gelezenwaarde te vergelijken met de boolean true of false.

// Waarom niet? Pinin wordt wel degelijk LOW. Meet ik met dc-voltmeter, maar de // loop gaat door.
hiermee heb je gelijk het antwoord op jouw vraag.

while (Gelezenwaarde == true && Tweedetijd != false);
// Loop moet doorgaan tot pinin LOW wordt. deze tekst klopt ook eigenlijk niet want wat je bedoelt is de loop moet doorgaan tot de variabele Gelezenwaarde verandert van waarde. hier lees je namelijk Gelezenwaarde en die vergelijk je met true of false
Appels met peren vergelijken levert nog steeds geen bloemkool op

=====================================================
Volgens mij denk je als mens en niet als machine. jij weet wat je bedoelt met pin laag en gelezen waarde laag maar de processor doet echt alleen wat jij hem opdraagt. dus lees de pin en voor de bijbehorende opdracht uit. die opdracht kan bijvoorbeeld zijn:
- ken die waarde toe aan een variabele of
- verander de spanning op een andere pin.
Gelezenwaarde is een variabele. pinin is een constante. pinuit is ook een constante, LOW is eveneens een constante.
pin 5 is een fysieke pin evenals pin 6. pinuit kan je niet veranderen. het is alleen een naam voor de fysieke pin 6 die je wel kan veranderen. mocht de tekst onder de streep je verwarren, vergeet die dan en probeer alleen de regels erboven te begrijpen

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

Re: Kom niet uit do-while-loop

Berichtdoor zuid » 05 Okt 2021, 19:06

Na de do en voor de while kan een programma blok (dus meerdere regels code) worden geplaatst.
zie: https://www.arduino.cc/reference/en/language/structure/control-structure/dowhile/

Rest zie antwoord van Frits1956
mvg Nico

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

Re: Kom niet uit do-while-loop

Berichtdoor Dorus1404 » 05 Okt 2021, 19:16

Probleem blijft hoe Gelezenwaarde verandert als pin 5 LOW wordt. Als ik in de "do-opdracht" digitalRead(pinin); zet verandert er ook niks en als ik digitalWrite(?) schrijf dan is dat continu zo en niet omdat pin 5 verandert. Kun jij die do-while-loop zo schrijven dat ie én eindeloos doorloopt na lamp aan en weer uit en stopt als pin 5 LOW wordt?

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

Re: Kom niet uit do-while-loop

Berichtdoor zuid » 05 Okt 2021, 20:09

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



Moet zijn .....
Gelezenwaarde = false;

mvg Nico

In dit antwoord van 4 oktober zit ook de oplossing voor je probleem.

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

Re: Kom niet uit do-while-loop

Berichtdoor Frits1956 » 05 Okt 2021, 21:09

Dit is wat Nico schrijft.....

do
if (digitalRead(pinin) == LOW)
{Gelezenwaarde = false ;
// eventueel nog een statement ;
// eventueel nog een tweede statement ;
}
while (Gelezenwaarde == true && Tweedetijd != false); // Loop moet doorgaan tot pinin LOW wordt.

VorigeVolgende

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten