net met arduino bezig en loop klem op iets simpels

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

Re: net met arduino bezig en loop klem op iets simpels

Berichtdoor Karel » 02 Feb 2013, 21:31

Misschien is het handig ergens een tutorial voor de taal 'C' op te zoeken. Ik heb geen idee, ik programmeer al 30 jaar in die taal. Er zal in de diverse arduino fora vast wel iets te vinden zijn.

Aan de basis van de taal staan een paar eenvoudige constructies (tussen haakjes een voorbeeld):

1 een statement
2 een vergelijking of conditie met als uitkomst de waarde true of false
3 een lus: voer een statement uit zolang een conditie waar is.

een statement kan weer bestaan uit:

1.1 een assignment of toekenning ( buttonState = HIGH; )
1.2 een functieaanroep ( processButton(); )
1.3 een keuze ( if ( vergelijking ) then statement else statement )
1.4 meerdere statements tussen {} ( { previousButtonstate = buttonState ; buttonState=HIGH ; } )

Dit is erg gesimplificeerd. Toch is het bovenstaande lijstje compleet voor jouw voorbeeld, en in de basis zijn dit de elementen waaruit een programmeertaal bestaat.

Ik zal de verschillende taalelementen proberen te verhelderen door door jouw codevoorbeeld te lopen.
Code: Alles selecteren
 
   void loop () {

Hier wordt een functie gedefinieerd. Een functie is niets anders dan een statement dat ook vanaf andere plekken in de code kan worden aangeroepen.

Code: Alles selecteren
      // read the pushbutton input pin:
      buttonState1 = digitalRead(buttonPin1);

Dit is een assignment (toekenning). buttonState1 krijgt de waarde uit de functieaanroep digitalRead(buttonPin1).

Code: Alles selecteren
      if (buttonState1 != lastButtonState1)
      if (buttonState1 == HIGH)
      buttonPushCounter1++;

Dit is een (keuze) statement, dat weer uit een ander keuzestatement bestaat.
Als de buttonState1 ongelijk is aan lastButtonState1 wordt een nieuw keuzestatement uitgevoerd.
Als buttonState1 gelijk is aan HIGH wordt een assignment uitgevoerd.
Die assignment is een korte schrijfwijze voor buttonPushCounter1 = buttonPushCounter1 + 1.

Ik zou de code zo geschreven hebben:
Code: Alles selecteren
      if (buttonState1 != lastButtonState1)
         if (buttonState1 == HIGH)
            buttonPushCounter1++;

Door inspringen maak je beter duidelijk wat de afhankelijkheid van de statements is t.o.v. de conditionele keuze.

Vaak zie je na een keuzestatement ook een else-tak. De code in die tak wordt uitgevoerd als de conditie false oplevert. In jouw code komt in beide keuzestatements geen else-tak voor.

Code: Alles selecteren
      lastButtonState1 = buttonState1;

Opnieuw een assignment. Dit statement wordt altijd uitgevoerd als de functie waarin het statement staat (loop() ) wordt aangeroepen. Immers, het staat niet in een if- of else-tak van een keuzestatement.

Code: Alles selecteren
 
      if (buttonPushCounter1 % 2 == 0) {
      digitalWrite(ledPin1, HIGH);
      delay(1000);               // wait for a second
      digitalWrite(ledPin2, HIGH);
     }

Hier zien we een keuzestatement met de vergelijking of buttonPushCounter1 modulus 2 gelijk is aan 0. Dat is een andere wijze van schrijven om te bepalen of buttonPushCounter1 een veelvoud is van 2.
Na een keuzestatement zien we ook vaak een {, gevolgd door meerdere statements en afgesloten door een }. Zoals in het begin aangegeven mogen meerdere statements worden omsloten door { }, en gelden dan als één statement. Dat zien we hier. Er zijn 3 statements samengevoegd tot één statement dat wordt uitgevoerd als de conditie true is. Eerst wordt de ene pin HIGH gezet (een statement dat een functieaanroep bevat), er wordt 1 seconde gewacht (idem) en dan wordt de andere pin HIGH gezet. Deze drie statements zijn omgeven door { } en gelden dus als één statement.

Code: Alles selecteren
else {
       digitalWrite(ledPin2, LOW);
       delay(1000);               // wait for a second
       digitalWrite(ledPin1, LOW);
     }

In de else-tak zijn ook drie statements gegroepeerd, en deze zetten resp. eerst de andere pin LOW, wacht een seconde en zet dan de ene pin LOW.

Code: Alles selecteren
}

En hier wordt de definitie van de functie loop() afgesloten.

Maakt dit het zo wat duidelijker?

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

Advertisement

Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: net met arduino bezig en loop klem op iets simpels

Berichtdoor dirk ambu » 02 Feb 2013, 23:24

beste karel

bedankt voor de uitgebreide informatie ik ga hier mee aan de slag om te kijken of ik eruit kom
als het me gelukt is dan post ik het hier en mocht ik er toch niet uit komen dan ook :)


groet dirk

Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: net met arduino bezig en loop klem op iets simpels

Berichtdoor dirk ambu » 04 Feb 2013, 11:01

wie o wie kan mij verder helpen
ik heb ongeveer alles al gelezen maar ik kom er niet uit
als ik 1 knop werkend heb met 2 led,s dan lukt het mij niet
om 2 knoppen werkend te krijgen
bij alles wat ik doe lijkt het erop dat hij de input van knop 2 overslaat

wie o wie wil me hier bij helpen want ook met de informatie van karel kom ik er niet uit


ik hoor het graag want om voor deze toepassing nu 2 maal een arduino uno te gebruiken lijkt mij ook wat overdreven :)


groet dirk

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: net met arduino bezig en loop klem op iets simpels

Berichtdoor Rudi » 04 Feb 2013, 16:50

Zo gauw gauw je code doorlopend denk ik dat het probleem zit in de regel waarin je denkt de status van de tweede knop te scannen

Code: Alles selecteren
//buttonState = digitalRead(buttonPin1);

Moet volgens mij als volgt zijn:

Code: Alles selecteren
buttonState = digitalRead(buttonPin);

Met andere woorden, de regel wordt niet uitgevoerd omdat er // voor staat, alles hierna wordt slechts als commentaar beschouwd.
Daarbij scant hij de knop die voordien al werd gescand (buttonPin1) en niet de andere (buttonPin).

Ik bevestig hiermee wat mijn voorgangers al opmerkten: overzichtelijk en gestructureerd je sketch opstellen maakt een groot verschil qua duidelijkheid en maakt het jezelf makkelijker om te debuggen.
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: net met arduino bezig en loop klem op iets simpels

Berichtdoor dirk ambu » 04 Feb 2013, 18:44

beste
ik heb zonet de code geprobeerd duidelijker en netter te maken in de hoop dat ik ergens een fout zou vinden helaas beschik ik niet over genoeg kennis om de fout boven water te krijgen
eigenlijk is het probleem alleen maar groter geworden
waar het volgens mij fout gaat is als de arduino de state van de button moet opslaan ik heb het idee dat dit wordt over schreven als ik dit voor button 2 weer doet zou dit kunnen ?
bij deze de code hoe het er nu uit ziet mocht het beter kunnen zou iemand dat voor mij willen doen zodat ik daar van kan leren
Code: Alles selecteren
/* programma voor het schakellen van 4 ledjes door middel van 2 knoppjes
bij het in drukken van knop 1 gaat ledje 1 direct branden na 1 seconden gaat ledje 2 branden
als je nu nog een keer op knop 1 drukt gaat eerst ledje 2 uit en vervolgens met een vertraging ledje 1 ook uit
dit geldt in zijn geheel ook voor knop 2 */


const int  buttonPin1 = 2;    // pin 2 is de input pin van button 1
const int  buttonPin2 = 4;    // pin 4 is de input pin van button 2
const int ledPin1 = 7;       // pin 7 is de output pin van led nummer 1
const int ledPin2 = 8;       // pin 8 is de output pin van led nummer 2
const int ledPin3 = 12;       // pin 12 is de output pin van led nummer 3
const int ledPin4= 13;       // pin 13 is de output pin van led nummer 4

int buttonPushCounter = 0;   // dit is de teller hoe vaak er is gedruk op button 1
int buttonPushCounter1 = 0;   // dit is de teller hoe vaak er is gedruk op button 2
int buttonState1 = 0;         // in welke staat is de button 1 nu
int buttonState2 = 0;         // in welke staat is de button 2 nu
int lastButtonState1 = 0;     // in welke staat was de button 1 om te weten waar hij naar toe moet
int lastButtonState2 = 0;     // in welke staat was de button 2 om te weten waar hij naar toe moet

//-------------------------------------------------------------------------------------------------------------------------------
void setup() {

  pinMode(buttonPin1, INPUT); // maak van pin 2 een input pin
  pinMode(buttonPin2, INPUT); // maak van pin 4 een input pin

  pinMode(ledPin1,OUTPUT); // maak van pin 7 een led output pin
  pinMode(ledPin2,OUTPUT); // maak van pin 8 een led output pin
  pinMode(ledPin3,OUTPUT); // maak van pin 12 een led output pin
  pinMode(ledPin4,OUTPUT); // maak van pin 13 een led output pin
}
//------------------------------------------------------------------------------------------------------------------------------

void ProcessButton1(void) {
 
//-----------------------------------lees button1 in en voor opdracht 1 uit ----------------------------------------------------

        buttonState1 = digitalRead(buttonPin1); // leest de button pin van button 1 in
    if (buttonState1 != lastButtonState1) {     // vergelijk de staat wat de button1 nu is en wat hij daar voor was
    if (buttonState1 == HIGH) {                 //als button1 HIGH is dan gaat hij van uit naar aan
        buttonPushCounter++;}
        lastButtonState1 = buttonState1;        // hier slaat hij de staat op waar de button zich in bevind om dit te kunnen verglijk als hij weer door het programma loopt
     if (buttonPushCounter % 2 == 0) {   
     }
      digitalWrite(ledPin1, HIGH);      // led 1 gaat aan
      delay(1000);                      // er wordt 1 seconde gewacht
      digitalWrite(ledPin2, HIGH);      // led 2 gaat aan
           } else {                     // als de voorwaarden niet klopt dan gaat onderstaanden programma lopen   
      digitalWrite(ledPin2, LOW);       // led 2 gaat uit 
      delay(1000);                      // er wordt 1 seconden gewacht
      digitalWrite(ledPin1, LOW);       // led 1 gaat uit
           }
}
//-----------------------------------lees button2 in en voor opdracht 2 uit ----------------------------------------------------
void ProcessButton2(void) {
 
        buttonState2 = digitalRead(buttonPin2); // leest de button pin van button 2 in
    if (buttonState2 != lastButtonState2) {     // vergelijk de staat wat de button1 nu is en wat hij daar voor was
    if (buttonState2 == HIGH) {                 //als button2 HIGH is dan gaat hij van uit naar aan
        buttonPushCounter1 ++;}
        lastButtonState2 = buttonState2;        // hier slaat hij de staat op waar de button zich in bevind om dit te kunnen verglijk als hij weer door het programma loopt
    if (buttonPushCounter1 % 2 == 0) {
    }   
    digitalWrite(ledPin3, HIGH);      // led 3 gaat aan
    delay(1000);                      // er wordt 1 seconde gewacht
    digitalWrite(ledPin4, HIGH);      // led 4 gaat aan
         } else {                     // als de voorwaarden niet klopt dan gaat onderstaanden programma lopen   
    digitalWrite(ledPin4, LOW);       // led 4 gaat uit 
    delay(1000);                      // er wordt 1 seconden gewacht
    digitalWrite(ledPin3, LOW);       // led 3 gaat uit
  }
}

//----------------------------------leest welke opdrachten er moeten worden uitgevoerd -----------------------------------------
void loop()
{
  ProcessButton1();
  ProcessButton2();
}//loop



zou iemand ook willen controleren of het klopt wat ik erbij heb geschreven want als dat niet klopt dan zit ik onbewust op een verkeerd spoor
wat ik nu heb is ook best knap :D als ik op button 1 druk gebeurt er niets als ik op 2 druk gaan er 2 ledjes branden als ik op 1 en 2 druk gaat soms alles aan maar soms ook niet
er zit een soort logica in alleen heb ik hem nog niet door ik begrijp hier wel uit dat de opdrachten niet los staan van elkaar het programma loopt dus door elkaar heen
wat het vreemde is is dat niets blijft branden na 1 seconden gaat alles weer uit


groet dirk

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: net met arduino bezig en loop klem op iets simpels

Berichtdoor Rudi » 04 Feb 2013, 20:19

Dirk, ik had enkel je eerst getoonde code bekeken, niet de gewijzigde.
Heb toch nog die eerste code wat nader bekeken, de commentaar "opzij geschoven", en de accolades op de correcte plaats gezet.
Je code kwam nooit aan het uitvoeren van de toestand van de tweede knop toe. Nu wel :D

Opmerking: doordat je met delays werkt reageren de knoppen niet altijd onmiddellijk.


Code: Alles selecteren
// this constant won't change:
const int  buttonPin = 2;      // the pin that the pushbutton is attached to
const int  buttonPin1 = 4;     // the pin that the pushbutton is attached to
const int ledPin1 = 12;        // the pin that the LED is attached to
const int ledPin = 13;         // the pin that the LED is attached to
const int ledPin2 = 7;         // the pin that the LED is attached to
const int ledPin3= 8;          // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter1 = 0;    // counter for the number of button presses
int buttonPushCounter = 0;     // counter for the number of button presses
int buttonState1 = 0;          // current state of the button
int buttonState = 0;           // current state of the button
int lastButtonState1 = 0;      // previous state of the button
int lastButtonState = 0;       // previous state of the button


void setup() {
                               
  pinMode(buttonPin, INPUT);                          // initialize the button pin as a input
  pinMode(buttonPin1, INPUT);                       
  pinMode(ledPin, OUTPUT);                            // initialize the LED as an output
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3,OUTPUT);
}

void loop() {

  buttonState1 = digitalRead(buttonPin1);              // read the pushbutton input pin1 
  if (buttonState1 != lastButtonState1)                // compare the buttonState to its previous state
    {                                                  // if the state has changed, increment the counter
      if (buttonState1 == HIGH)                        // if the current state is HIGH then the button
          {                                            // went from off to on.
          buttonPushCounter1++;                           
          }
      lastButtonState1 = buttonState1;                 // save the current state as the last state for next time through the loop
      if (buttonPushCounter1 % 2 == 0)                 // turns on the LED every four button pushes by checking the modulo of the button push counter.
                                                       // the modulo function gives you the remainder of the division of two numbers;
            {
              digitalWrite(ledPin, HIGH);
              delay(1000);                             // wait for a second
              digitalWrite(ledPin1, HIGH);
            }
       else
            {
             digitalWrite(ledPin1, LOW);
             delay(1000);                              // wait for a second
             digitalWrite(ledPin, LOW);
            }
    }
  buttonState = digitalRead(buttonPin);                  // read the pushbutton input pin
  if (buttonState != lastButtonState)                  // compare the buttonState to its previous state
    {                                                  // if the state has changed, increment the counter
      if (buttonState == HIGH)                         // if the current state is HIGH then the button
          {                                            // went from off to on.
          buttonPushCounter++;                           
          }
 
      lastButtonState = buttonState;                   // save the current state as the last state for next time through the loop
      if (buttonPushCounter % 2 == 0)                  // turns on the LED every four button pushes by checking the modulo of the button push counter.
                                                       // the modulo function gives you the remainder of the division of two numbers;
            {
              digitalWrite(ledPin2, HIGH);
              delay(1000);                             // wait for a second
              digitalWrite(ledPin3, HIGH);
            }
       else
            {
             digitalWrite(ledPin2, LOW);
             delay(1000);                              // wait for a second
             digitalWrite(ledPin3, LOW);
            }
     }
}
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: net met arduino bezig en loop klem op iets simpels

Berichtdoor dirk ambu » 04 Feb 2013, 20:38

beste rudi
mijn dank is groot
nu werkt het is er nog een manier om het sneller te krijgen zoals jij al opmerkte zijn de knoppen niet echt snel nu

dan ga ik nu maar eens goed kijken wat jij heb veranderd zodat ik gelijk weet wat er mis ging want daar kan ik van leren
bedankt

groet dirk

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: net met arduino bezig en loop klem op iets simpels

Berichtdoor Rudi » 04 Feb 2013, 20:39

En hier je laatste code, werkend. Ook hier waren de accolades het probleem. Zoek en je zal vinden :)

Code: Alles selecteren
/* programma voor het schakellen van 4 ledjes door middel van 2 knoppjes
bij het in drukken van knop 1 gaat ledje 1 direct branden na 1 seconden gaat ledje 2 branden
als je nu nog een keer op knop 1 drukt gaat eerst ledje 2 uit en vervolgens met een vertraging ledje 1 ook uit
dit geldt in zijn geheel ook voor knop 2 */


const int  buttonPin1 = 2;    // pin 2 is de input pin van button 1
const int  buttonPin2 = 4;    // pin 4 is de input pin van button 2
const int ledPin1 = 7;       // pin 7 is de output pin van led nummer 1
const int ledPin2 = 8;       // pin 8 is de output pin van led nummer 2
const int ledPin3 = 12;       // pin 12 is de output pin van led nummer 3
const int ledPin4= 13;       // pin 13 is de output pin van led nummer 4

int buttonPushCounter = 0;   // dit is de teller hoe vaak er is gedruk op button 1
int buttonPushCounter1 = 0;   // dit is de teller hoe vaak er is gedruk op button 2
int buttonState1 = 0;         // in welke staat is de button 1 nu
int buttonState2 = 0;         // in welke staat is de button 2 nu
int lastButtonState1 = 0;     // in welke staat was de button 1 om te weten waar hij naar toe moet
int lastButtonState2 = 0;     // in welke staat was de button 2 om te weten waar hij naar toe moet

//-------------------------------------------------------------------------------------------------------------------------------
void setup() {

  pinMode(buttonPin1, INPUT); // maak van pin 2 een input pin
  pinMode(buttonPin2, INPUT); // maak van pin 4 een input pin

  pinMode(ledPin1,OUTPUT); // maak van pin 7 een led output pin
  pinMode(ledPin2,OUTPUT); // maak van pin 8 een led output pin
  pinMode(ledPin3,OUTPUT); // maak van pin 12 een led output pin
  pinMode(ledPin4,OUTPUT); // maak van pin 13 een led output pin
}

//----------------------------------leest welke opdrachten er moeten worden uitgevoerd -----------------------------------------
void loop()
{
  ProcessButton1();
  ProcessButton2();
}

//------------------------------------------------------------------------------------------------------------------------------

void ProcessButton1() {
 
//-----------------------------------lees button1 in en voor opdracht 1 uit ----------------------------------------------------

    buttonState1 = digitalRead(buttonPin1); // leest de button pin van button 1 in
    if (buttonState1 != lastButtonState1) {     // vergelijk de staat wat de button1 nu is en wat hij daar voor was
        if (buttonState1 == HIGH) {                 //als button1 HIGH is dan gaat hij van uit naar aan
            buttonPushCounter++;}
            lastButtonState1 = buttonState1;        // hier slaat hij de staat op waar de button zich in bevind om dit te kunnen verglijk als hij weer door het programma loopt
        if (buttonPushCounter % 2 == 0) {   
     
            digitalWrite(ledPin1, HIGH);      // led 1 gaat aan
            delay(1000);                      // er wordt 1 seconde gewacht
            digitalWrite(ledPin2, HIGH);      // led 2 gaat aan
           } else {                           // als de voorwaarden niet klopt dan gaat onderstaanden programma lopen   
            digitalWrite(ledPin2, LOW);       // led 2 gaat uit 
            delay(1000);                      // er wordt 1 seconden gewacht
            digitalWrite(ledPin1, LOW);       // led 1 gaat uit
          }
    }
}
//-----------------------------------lees button2 in en voor opdracht 2 uit ----------------------------------------------------
void ProcessButton2() {
 
    buttonState2 = digitalRead(buttonPin2); // leest de button pin van button 2 in
    if (buttonState2 != lastButtonState2) {     // vergelijk de staat wat de button1 nu is en wat hij daar voor was
      if (buttonState2 == HIGH) {                 //als button2 HIGH is dan gaat hij van uit naar aan
          buttonPushCounter1 ++;}
          lastButtonState2 = buttonState2;        // hier slaat hij de staat op waar de button zich in bevind om dit te kunnen verglijk als hij weer door het programma loopt
      if (buttonPushCounter1 % 2 == 0) {
     
          digitalWrite(ledPin3, HIGH);      // led 3 gaat aan
          delay(1000);                      // er wordt 1 seconde gewacht
          digitalWrite(ledPin4, HIGH);      // led 4 gaat aan
         } else {                     // als de voorwaarden niet klopt dan gaat onderstaanden programma lopen   
    digitalWrite(ledPin4, LOW);       // led 4 gaat uit 
    delay(1000);                      // er wordt 1 seconden gewacht
    digitalWrite(ledPin3, LOW);       // led 3 gaat uit
  }
 }
}

Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: net met arduino bezig en loop klem op iets simpels

Berichtdoor Rudi » 04 Feb 2013, 20:50

dirk ambu schreef:... is er nog een manier om het sneller te krijgen zoals jij al opmerkte zijn de knoppen niet echt snel nu


Ben zelf nog maar een maandje bezig met Arduino en C++.
Je zou kunnen werken met de millis() functie.
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: net met arduino bezig en loop klem op iets simpels

Berichtdoor dirk ambu » 04 Feb 2013, 22:44

hoi rudi

ik heb gevonden wat ik fout had gedaan en ik begrijp nu beter hoe ik het leesbaar kan houden bedankt
millis werkt dat sneller dan delay ?

groet dirk

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ihajinizul, ilivekucap en 39 gasten