Programma doet niet wat ik wil.

Arduino specifieke Software
Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Programma doet niet wat ik wil.

Berichtdoor pjh » 27 Jan 2013, 18:12

MISSCHIEN IS DIE DELAY(100) IN DE LOOP TOCH VAN BELANG. dAT IS HET BELANGRIJKSTE VERSCHIL.
EN SORRY VOOR CAPS-LOCK. GEEN ZIN IN OPNIEUW TYPEN.

Advertisement

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: Programma doet niet wat ik wil.

Berichtdoor Karel » 27 Jan 2013, 21:52

patrickwit schreef:ja dat programma die ik stuurde net was een test en zitten dus ook wat overbodige codes is denk:

maar waar ik op wil doelen is waarom hij niet doet wat ik wil.



Omdat je misschien niet goed codeert wat je wilt.

Probeer eens om die int analogvalue1 en analogvalue2 buiten je loop (bij de andere outputNN declaraties) te declareren.
Je kan wel een testje schrijven met

Code: Alles selecteren
analogvalue1 = analogRead(0);
Serial.println(analogRead(0));


Maar dan is dat wat je print een hernieuwde analogRead, en niet de waarde van je variabele.
Vervolgens ga je wel een if-statement met die variabele uitvoeren.
Je stopt zo extra verwarring in je code. Je wilt toch weten met welke waarde de if wordt uitgevoerd? Laat die waarde dan ook ondubbelzinnig zien.

Code: Alles selecteren
analogvalue1 = analogRead(0);
Serial.println(analogvalue1);


Groet, Karel
Laatst gewijzigd door Karel op 01 Feb 2013, 12:32, in totaal 1 keer gewijzigd.
If you think education is expensive, try ignorance! (Derek Bok)

Berichten: 21
Geregistreerd: 23 Jan 2013, 10:59

Re: Programma doet niet wat ik wil.

Berichtdoor patrickwit » 01 Feb 2013, 11:51

het is me dan gelukt om het werkende te krijgen.
Code: Alles selecteren
 analogvalue1 = analogRead(input1);
buttonState = digitalRead(buttonPin);
 
if  (analogvalue1 >= 0 &&  analogvalue1 <= 150 && buttonState == LOW) {
 Snelheid50();
}
else if(analogvalue1 >= 150 && analogvalue1 <= 300 && buttonState == LOW) {
 Snelheid70();
}
else if(analogvalue1 >= 300 && analogvalue1 <= 450 && buttonState == LOW) {
 Snelheid90();
}
else if(analogvalue1 >= 450 && analogvalue1 <= 600 && buttonState == LOW) {
 Snelheid100();
}
else if(analogvalue1 >= 750 && analogvalue1 <= 900 && buttonState == LOW) {
 Snelheid120();
}
else if(analogvalue1 >= 900 && analogvalue1 <= 1100 && buttonState == LOW) {
 Eindeverbod();
}
if (buttonState == HIGH) {
 Kruis();
}
 delay(1);
}


eerst had ik namelijk gewoon
Code: Alles selecteren
else if (analogvalue > 1000){
Snelheid50();
}


dit was de fout waarschijnlijk, had geen gebied geselecteerd en dat hij daarom de weg kwijt raakt

http://www.youtube.com/watch?v=6Jqco9sTttY

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: Programma doet niet wat ik wil.

Berichtdoor Karel » 01 Feb 2013, 12:29

patrickwit schreef:het is me dan gelukt om het werkende te krijgen.

Code: Alles selecteren
 analogvalue1 = analogRead(input1);
buttonState = digitalRead(buttonPin);
 
if  (analogvalue1 >= 0 &&  analogvalue1 <= 150 && buttonState == LOW) {
 Snelheid50();
}
else if(analogvalue1 >= 150 && analogvalue1 <= 300 && buttonState == LOW) {
 Snelheid70();
}
else if(analogvalue1 >= 300 && analogvalue1 <= 450 && buttonState == LOW) {
 Snelheid90();
}
else if(analogvalue1 >= 450 && analogvalue1 <= 600 && buttonState == LOW) {
 Snelheid100();
}
else if(analogvalue1 >= 750 && analogvalue1 <= 900 && buttonState == LOW) {
 Snelheid120();
}
else if(analogvalue1 >= 900 && analogvalue1 <= 1100 && buttonState == LOW) {
 Eindeverbod();
}
if (buttonState == HIGH) {
 Kruis();
}
 delay(1);
}



Je youtube filmpje is niet te zien, is prive.

Je if..else if.. statement kan 'goedkoper' (= met minder instructies). Je doet namelijk een aantal overbodige tests:

Code: Alles selecteren
if  (analogvalue1 >= 0 &&  analogvalue1 <= 150 && buttonState == LOW) {
 Snelheid50();
}
else if(analogvalue1 >= 150 && analogvalue1 <= 300 && buttonState == LOW) {
 Snelheid70();
}


In de eerste if heb je al gekeken of analogvalue1 kleiner of gelijk aan 150 is.
In de else if tak hoef je dan niet meer te controleren of analogvalue1 >= 150 is.
Ten eerste kan analogvalue1 tegelijk <= 150 EN >= 150 zijn, als analogvalue1 precies 150 is. Dat kan verwarrende resultaten opleveren als je de code niet in else if maar in verschillende if's had uitgeschreven. Maar, omdat de if-tak al FALSE was, kan de hele test op analogvalue1 >= 150 vervallen in de else-if-tak. Dat geldt analoog voor de andere else-if statements.
Verder test je iedere keer op buttonState, maar dat kan in één keer door

Code: Alles selecteren
if (buttonState == HIGH) {
 Kruis();
}


naar boven te halen. Ik houd er van code te optimaliseren waar dat kan. Vaak (maar niet altijd) is wordt de source-code er ook leesbaarder van. Deze code doet hetzelfde als die van jou:


Code: Alles selecteren
 analogvalue1 = analogRead(input1);
buttonState = digitalRead(buttonPin);
 
if (buttonState == HIGH) {
 Kruis();
} else if (analogvalue1 >= 0 &&  analogvalue1 <= 150) { // buttonState is niet HIGH, dus LOW, check niet nodig
 Snelheid50();
}
else if(analogvalue1 <= 300) {  // buttonstate nog steeds LOW, analogvalue1 > 150
 Snelheid70();
}
else if(analogvalue1 <= 450) {  // buttonstate nog steeds LOW, analogvalue1 > 300
 Snelheid90();
}
else if(analogvalue1 <= 600) { // buttonstate nog steeds LOW, analogvalue1 > 450
 Snelheid100();
}
else if(analogvalue1 <= 900) { // buttonstate nog steeds LOW, analogvalue1 > 600
 Snelheid120();
}
else if(analogvalue1 <= 1100) { // buttonstate nog steeds LOW, analogvalue1 > 900
 Eindeverbod();
}

delay(1);

}


Wat doe je als analogvalue1 > 1100? Niets? Je weet nooit zeker of apparatuur niet defect raakt en een bijzondere waarde genereert. Voor de zekerheid een foutmelding inbouwen is dan niet verkeerd.

Ik houd er niet van (let op, mijn persoonlijke voorkeur) als er situaties kunnen ontstaan waarin het programma helemaal niet reageert. Onbedoelde, maar onvoorziene situaties wil ik altijd graag opgevangen zien, al is het maar het wegschrijven van een foutcode/melding naar je seriele console, of het wegschrijven van foutlogging op een aangehangen SD-kaartje o.i.d.

In mijn code zit nog een fout die kan optreden bij een onverwachte waarde van analogvalue1. Die heb ik er even in laten zitten, ik ben benieuwd of je die kan vinden.

Bottomline, ik ben blij voor je dat het werkt. Het bovenstaande is alleen maar perfectionering, een manier waarop ik het gedaan zou hebben.

Groet, Karel
If you think education is expensive, try ignorance! (Derek Bok)

Berichten: 21
Geregistreerd: 23 Jan 2013, 10:59

Re: Programma doet niet wat ik wil.

Berichtdoor patrickwit » 01 Feb 2013, 15:04

ik waardeer je reactie, en ik zal hem ook aandachtig bestuderen.
ik blijf de arduino keer op keer interessant vinden, dit omdat ik graag de programmeer taal wil begrijpen.
En ook omdat ik op het project wat ik nu heb ga proberen af te studeren op MBO elektrotechniek niveau 4.

bij deze is dus dit project zo goed als voldoende afgesloten, nu papier werk (administratie) en ik zie de voldoende al komen.
wil jullie bedanken voor de kennis die me steeds is bijgeleerd.

volgende project word waarschijnlijk op afstand beheren via ethernet, ga eerst kijken of dit haalbaar is, de tijd dat ik ervoor kan hebben zal ongeveer 2/3 maanden zijn.

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: RussellAlets en 24 gasten