While loop (Iterative)

algemene C code
Berichten: 167
Geregistreerd: 19 Apr 2014, 15:03

While loop (Iterative)

Berichtdoor Hanneman » 01 Nov 2014, 23:26

Van de 3 basis controle structuren had ik de meeste moeite met de Iteratieve controle structuur.
Om inzicht te krijgen in de werking ervan ben ik gaan experimenteren.
Het resultaat is hieronder te zien.
De klok wordt voorzien door de Tiny RTC.
Zitten er onnodige dingen in dit programma of kan het makkelijker?

cpp code
#include <Wire.h>                                   
#include <RTClib.h>

//
// RTC klok
//
RTC_DS1307 rtc;

//
// PIN Definities
//
#define LED 13

//
// Variabelen
//
int uur;
int minuten;

void setup() {
pinMode(LED, OUTPUT);

Serial.begin(9600);

Wire.begin();
}

void loop() {

DateTime now;
now = rtc.now();

uur = now.hour(); // Nodig om de while loop in te kunnen gaan
minuten = now.minute(); // Nodig om de while loop in te kunnen gaan

// De tijd wordt niet weergegeven in de seriele monitor wanneer de while loop in werking is.
// Dit omdat onderstaande code niet ook in de while loop staat
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
Serial.println("");
delay(5000);

while (uur == 20 && minuten == 30) { // zolang het acht uur en dertig minuten is, doe:

DateTime now;
now = rtc.now();

uur = now.hour(); // nodig om de led weer uit te kunnen zetten
minuten = now.minute(); // nodig om de led weer uit te kunnen zetten

digitalWrite(LED, HIGH); // zet de led aan

if (uur == 20 & minuten == 31) { // als het acht uur en eenendertig minuten is, doe:
digitalWrite(LED, LOW); // zet de led weer uit
}
}
}

Advertisement

Gebruikers-avatar
Berichten: 40
Geregistreerd: 13 Mei 2014, 02:53
Woonplaats: Amsterdam

Re: While loop (Iterative)

Berichtdoor Resu » 02 Nov 2014, 13:20

Ik programmeer zelf nog niet zo lang dus ik vind dit een leuke uitdaging. Ik heb wel een paar (positief bedoelde) opmerkingen:

- Je maakt een denkfoutje met een paar commando's. Ik heb er uitleg bij gezet.

- Over de flow van je programma: Je vraagt de tijd op, die geef je door aan je pc. Daarna wacht je 5 seconden en indien je conditie waar is blijf je 'hangen' in je while lus. Daarom moet je daar ook weer opnieuw de tijd opvragen.

- Ik snap niet zo goed waarom je 'while' gebruikt, zolang je conditie waar is kom je niet meer uit je while lus en zoals je zelf al opmerkt: Dan werkt de rest van je programma niet meer. Er zijn meerdere manieren om dit op te lossen maar ik zou zelf 'if' gebruiken in dit geval.

- Over je gebruik van comments: Ik heb ergens gelezen dat je ze op een goede en een verkeerde manier kan gebruiken. Het kwam er op neer dat je ze niet moet gebruiken om commando's uit te leggen maar waarom je iets doet. Bijvoorbeeld: digitalWrite(LED, HIGH); // zet de led aan. Deze comment vertelt eigenlijk niks wat er al niet staat.

- De delay(5000) is 'lelijk'. Daarmee staat je Arduino gewoon 5 seconden stil en doet (bijna) niets meer. Daar zijn standaard oplossingen voor. In je Arduino editor onder voorbeelden - digitaal staat een sketch BlinkWithoutDelay waar het uitgelegd wordt. Misschien een volgende stap? Ik heb het bewust niet aangepast ;)

cpp code
#include <Wire.h>     
#include <RTClib.h>
#define LED 13
RTC_DS1307 rtc; // initialisatie RTC klok
int uur;
int minuten;
int seconde;


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


void loop() {
DateTime now;
now = rtc.now();
uur = now.hour(); // hier vraag je de uren op van je klok chip en zet je ze in de variabele 'uur'
minuten = now.minute(); // hier vraag je de minuten op
seconde = now.second(); // deze dan ook maar dan hoef je ze niet opnieuw op te vragen met Serial.print
if (uur == 20 && minuten == 30) {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
Serial.print(uur);
Serial.print(":");
Serial.print(minuten);
Serial.print(":");
Serial.println(seconde);
Serial.println("");
delay(5000);
}
We do what we must because we can.

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

Re: While loop (Iterative)

Berichtdoor nicoverduin » 02 Nov 2014, 13:44

@Resu:
Wat je niet wist is dat Hannes bezig is om de Jackson Structured Programming methodiek hier toe te passen waardoor het een beetje overkill lijkt. Wat je in 'real-time' niet hebt is een fase einde_programma waardoor het programma daadwerkelijk afsluit. Dus dat maakt de interpretatie wat lastiger. De discussie over commentaar loopt al sinds ik werk. En een ieder bepaalt dat voor zichzelf. Ik geloof zelf niet in een goede of verkeerde methode. Maar als iemand je 15 jaar later verteld dat de systemen die jij hebt ontwikkeld (eind jaren 70) nog steeds draaien omdat ze zo goed te onderhouden zijn dan heb ik kennelijk toch wel iets goeds gedaan. De rest is feitelijk routine, consequent blijven en gedisciplineerd blijven.
Het is altijd gemakkelijk om bij kleine programma's stapjes over te slaan omdat het toch niet nodig is. Echter door consequent te blijven (dus ook bij de kleine programma's) krijg je routine en wordt het een gewoonte om op een dezelfde stijl te ontwikkelen. Daar heeft je opvolger ook wat aan omdat die degenen is die het mag beheren in de toekomst.
Een methodiek (ongeacht welke) werkt altijd mits je deze consequent toepast. Je leert daarmee een gewoonte aan die een ander ook gaat begrijpen. Dat het evolueert door de tijd....? absoluut. En in de rol van Hannes is het ook de bedoeling dat anderen ook aan zijn programma's gaan sleutelen..... Dan is het handig als hij een consequente stijl aanhoudt.

Tenslotte hoeft een delay() niet verkeerd te zijn...... Als er geen enkele reden is om het anders te doen... waarom zou je. Het zou zo maar eens een bewuste keuze kunnen zijn. En als je daarvoor kiest kan dat gewoon aangegeven worden. Het feit dat een processor niets doet hoeft niet erg te zijn........

@hannes:
Ik onthoud mij nog verder ff van commentaar. Ik wacht de rest nog ff af. Maar je bent wel op de goede richting bezig.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: While loop (Iterative)

Berichtdoor shooter » 02 Nov 2014, 16:13

de while conditie en de IF zijn nooit allebei waar dus probleem

en dit is zeker geen iteratie voorlopig, daar is meer voor nodig, maar hanneman zoekt het liever zelf uit (prima want daar leer je van)
paul deelen
shooter@home.nl

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

Re: While loop (Iterative)

Berichtdoor nicoverduin » 02 Nov 2014, 16:20

shooter schreef:de while conditie en de IF zijn nooit allebei waar dus probleem

en dit is zeker geen iteratie voorlopig, daar is meer voor nodig, maar hanneman zoekt het liever zelf uit (prima want daar leer je van)

Los van de oplossingsrichting, zal zijn programma op zich goed werken......
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 167
Geregistreerd: 19 Apr 2014, 15:03

Re: While loop (Iterative)

Berichtdoor Hanneman » 03 Nov 2014, 01:06

Nico, Resu, Shooter, bedankt voor de reacties!

- Je maakt een denkfoutje met een paar commando's. Ik heb er uitleg bij gezet.

Dat wat je als commentaar toegevoegd hebt is mij bekend. Het commentaar dat ik erin had gezet was anders bedoeld.
Het was bedoeld om duidelijk te maken dat wat je tussen ( ) zet achter while, dat dat voor de while opgegeven moet worden en dat je diezelfde statements ook weer in de while moet zetten om ze ook in de while loop te laten werken.

- Ik snap niet zo goed waarom je 'while' gebruikt

Omdat ik while als controle structuur nog niet eerder gebruikt heb, aangezien ik de werking ervan niet goed kan vatten. Dat is ook de reden waarom ik ermee ben gaan experimenteren en mijn experimentele code gepost heb, zodat jullie erop kunnen reageren en ik daar weer van kan leren.

@Nico, ik heb de while loop opgezocht in het boekje C door Dennis Ritchie, maar helaas is de info te summier voor mij om het te kunnen vatten.

- Over je gebruik van comments: Ik heb ergens gelezen dat je ze op een goede en een verkeerde manier kan gebruiken. Het kwam er op neer dat je ze niet moet gebruiken om commando's uit te leggen maar waarom je iets doet. Bijvoorbeeld: digitalWrite(LED, HIGH); // zet de led aan. Deze comment vertelt eigenlijk niks wat er al niet staat.

Daar zie ik de logica wel van in. Ik had het geschreven uitgaand van wat als iemand de code leest die helemaal nieuw is met Arduino, maar dat is eigenlijk niet nodig.

- De delay(5000) is 'lelijk'.

Is het ook, maar ik ben het ook eens met Nico, dat je niet alles hoeft te doen om delay te vermijden en dat het ook gewoon snel en functioneel kan zijn. Het gaat in dit programma niet om een optimaal programma te schrijven, maar om de werking van while te doorgronden.

en dit is zeker geen iteratie voorlopig, daar is meer voor nodig,

Educate me, plz, thanks in advance!

Het programma werkt inderdaad, maar wat mij verbaasd is dat ik om uit de werking van de while loop te komen een if statement nodig had. Mijn verwachting was eigenlijk dat als ik een while loop maak en opgeef dat ie moet loopen zolang het bijv 10:30u is dat hij dan vanzelf uit de loop zou komen op het moment dat het 10:31 wordt, maar dat werkt niet zo.

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

Re: While loop (Iterative)

Berichtdoor nicoverduin » 03 Nov 2014, 09:03

Dat laatste snap ik niet? hoe heb je vastgesteld dat je niet uit de loop komt?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 167
Geregistreerd: 19 Apr 2014, 15:03

Re: While loop (Iterative)

Berichtdoor Hanneman » 03 Nov 2014, 12:32

Ah jah, Thanks Nico.

Nu zie ik het. Ik dacht dat omdat de led niet uit ging, de while loop niet beeindigd werd, maar dat was omdat er nergens een statement staat die de led weer uit zet.

Aan het weer doorlopen van de tijd kon ik zien dat de while loop wel degelijk verlaten werd als die minuut verstreken was.

So hehe, nu snap ik de werking van de while loop, thanks guys!

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 31 gasten