net met arduino bezig en loop klem op iets simpels

Arduino specifieke Software
Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

net met arduino bezig en loop klem op iets simpels

Berichtdoor dirk ambu » 01 Feb 2013, 18:40

beste

wie kan mij helpen
ik wil met behulp van een arduino uno 4 led lampjes laten branden die geschakeld worden door 2 knopjes
het zou als volgens moeten werken
druk op knop 1 led 1 gaat branden na 1 seconden gaat ook led 2 aan als ik weer op knop 1 druk gaat eerst led 2 uit en na 1 seconde gaat ook led 1 weer uit
druk ik op knop 2 dan gaat led 3 branden en na 1 seconden gaat led 4 ook aan druk ik weer op knop 2 dan gaat led 4 uit en 1 seconde later ook led 3 uit

nu lukt het mij met wat knip en plak werk om 1 knop werkend te krijgen maar het lukt mij niet om de 2de knop toe te voegen dan krijg ik fout meldingen
en als ik die niet krijg dan werkt het gewoon kan iemand mij vertellen wat ik verkeerd doe

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() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin1, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3,OUTPUT);
}


void loop() {
  // read the pushbutton input pin:
  buttonState1 = digitalRead(buttonPin1);
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState1 != lastButtonState1) {
    // if the state has changed, increment the counter
    if (buttonState1 == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:
      buttonPushCounter1++;
  }
  // save the current state as the last state,
  //for next time through the loop
  lastButtonState1 = buttonState1;

 
  // 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:
  if (buttonPushCounter1 % 2 == 0) {
    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);

     // read the pushbutton input pin:
  //buttonState = digitalRead(buttonPin1);


  if (buttonState != lastButtonState) {
 
    if (buttonState == HIGH) {
 
      buttonPushCounter++;
  }
  lastButtonState = buttonState;

  if (buttonPushCounter % 2 == 0) {
    digitalWrite(ledPin2, HIGH);
    delay(1000);               // wait for a second
    digitalWrite(ledPin3, HIGH);
  } else {
   digitalWrite(ledPin3, LOW);
   delay(1000);               // wait for a second
   digitalWrite(ledPin2, LOW);
  }
  }
}
  }
}


ik hoor graag wat ik fout doe dan kan ik snel weer verder wat als het lukt is het wel erg leuk om mee bezig te zijn zeg
zelf denk ik dat het in de void loop mis gaat
groet dirk ambu

Advertisement

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

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

Berichtdoor dirk ambu » 01 Feb 2013, 22:42

niemand een oplossing ?

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

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

Berichtdoor pjh » 02 Feb 2013, 11:35

jawel
Kom heus wel.
Het belangrijkste dat ik na een eerste 'scan' mis, is een zogenaamde debounce van de button. Misschien moet je dat eerst even opzoeken. Is ook op dit forum genoemd.
Nu geen tijd, maar ik wil daarna alsnog wel even naar je sketch kijken. Groet. Paul

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

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

Berichtdoor astrofrostbyte » 02 Feb 2013, 13:56

Dirk check je haakjes groupen eens { } . die lijken niet goed te grouperen.
Een wat betere editor zoals notepad++ geeft dat wat beter aan wat de blokken zijn.
grtz
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

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, 16:19

bedankt voor de info tot nu toe
wat ik niet begrijp en ook niet kan vinden op het net
is hoe ik er voor moet zorgen dat de arduino aan een nieuwe opdracht begint
wat ik heb geschreven werkt maar voor de helft de eerst knop werkt
alleen krijg ik de 2de knop niet werkend als ik de input veranderd van de eerst na de 2 de knop dan werkt de 2 de maar de eerst knop niet meer
de harware werkt en klopt maar de software krijg ik niet goed en dat klopt ook als ik het lees
want ik zeg

if (buttonPushCounter1 % 2 == 0) {
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);

maar wat moet ik doen als het verder moet kijken dan else


iemand een idee

en sorry als ik erg onduidelijk ben maar dat komt omdat ik niet snap waar het mis gaat dat maakt het erg moeilijk om het uit te leggen


groet dirk

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

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

Berichtdoor astrofrostbyte » 02 Feb 2013, 16:45

Ik denk gewoon dat je haakje verkeerd staan, het zal iets overzichtiger worden als je het wat opsplitst.
Het is een goed begin om de twee button afhandel blokken gewoon in een subroutine te gooien.
Wordt het een stuk leesbaarder en beheersbaarder:

bv :

Code: Alles selecteren
void ProcessButton1(void)
{
  buttonState1 = digitalRead(buttonPin1);
  if (buttonState1 != lastButtonState1)
  { if (buttonState1 == HIGH)
    { buttonPushCounter1++;
    }
    lastButtonState1 = buttonState1;
 
    if (buttonPushCounter1 % 2 == 0)
    { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin1, HIGH);
    }
    else
    { digitalWrite(ledPin1, LOW); delay(1000); digitalWrite(ledPin, LOW);
    }
  }
}
//-------------------------------------------------------------------
void ProcessButton2(void)
{
  buttonState = digitalRead(buttonPin);
  if (buttonState != lastButtonState)
  { if (buttonState == HIGH)
    { buttonPushCounter++;
    }
    lastButtonState = buttonState;

    if (buttonPushCounter % 2 == 0)
    { digitalWrite(ledPin2, HIGH); delay(1000); digitalWrite(ledPin3, HIGH);
    }
    else
    { digitalWrite(ledPin3, LOW);delay(1000); digitalWrite(ledPin2, LOW);
    }
  }
}
//-------------------------------------------------------------------
void loop()
{
  ProcessButton1();
  ProcessButton2();
}//loop



ps buttons moeten inderdaad wel wat ontdenderd worden.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

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, 16:48

Zoals opgemerkt moet je je accolades checken.

Er staat er nu een heel bosje onderaan je code. Het lijkt erop dat er alleen wat wordt uitgevoerd als de eerste knop is ingedrukt.
Een handige methode is om na iedere '{' de kantlijn 2 of 3 posities te laten inspringen, en pas met de '}' terug te springen.

Nu heb je soms na 2 x een '{' wel 4 posities ingesprongen, maar spring je na één '}' weer helemaal terug. Dat maakt het verwarrend om je code te lezen, en daardoor ontstaan heel gemakkelijk fouten.
Voorbeeldje met alleen commentaar:

Code: Alles selecteren
loop() {
  if (....) {
    // iets doen na de if
  } else {
    // iets doen bij de else
    if ( ..  ) {
      //iets doen op het tweede if-niveau
    } // sluithaak van de tweede if
  } // sluithaak van de else van de eerste if
} // sluithaak van loop()


Door bij de sluithaak te vermelden welk statement je afsluit blijft je code leesbaar, ook als je er naar 6 maanden opnieuw naar kijkt.

Verder is het misschien beter om te beginnen met een eenvoudiger probleempje. Probeer eerst eens de actie met alleen de eerste button en eerste led te programmeren. Breidt dan een werkend stuk code stap voor stap uit.

Onthoud: het is een stuk gemakkelijker om een werkend stuk code ingewikkeld te maken, dan een ingewikkeld stuk code werkend.

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

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, 18:27

bedankt voor de informatie
ik heb de code wat duidelijker gemaakt en opgeruimd in de hoop dat het beter te lezen is
maar ook nu zie ik niet wat ik fout doe
als ik boven in de code de inputs veranderd dan werken ook de ander knop maar twee knoppen werkt niet :?

hier de aangepaste code
Code: Alles selecteren
//dubbelen schakeling met vertraging zowel opkomend als afgaand


const int  buttonPin1 = 2;     // drukschakelaar 1 schakeld led 1 en 2
const int  buttonPin2 = 4;     // drukschakelaar 2 schakeld led 3 en 4
const int ledPin1 = 7;         // led 1 rood
const int ledPin2 = 8;         // led 2 geel
const int ledPin3 = 12;        // led 3 rood
const int ledPin4 = 13;        // led 4 geel

// drukschakelaar 1
 int buttonPushCounter1 = 0;   // counter for the number of button presses
 int buttonState1 = 0;         // current state of the button
 int lastButtonState1 = 0;     // previous state of the button
 
// drukschakelaar 2
 int buttonPushCounter2 = 0;   // counter for the number of button presses
 int buttonState2 = 0;         // current state of the button
 int lastButtonState2 = 0;     // previous state of the button

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

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


void ProcessButton1(void) {
  // read the pushbutton input pin:
  buttonState1 = digitalRead(buttonPin1);
  if (buttonState1 != lastButtonState1)
  if (buttonState1 == HIGH)
   buttonPushCounter1++;
  lastButtonState1 = buttonState1;
 
 
  if (buttonPushCounter1 % 2 == 0) {
    digitalWrite(ledPin1, HIGH);
    delay(1000);               // wait for a second
    digitalWrite(ledPin2, HIGH);
  } else {
   digitalWrite(ledPin2, LOW);
   delay(1000);               // wait for a second
   digitalWrite(ledPin1, LOW);
  }
}


//-------------------------------------------------------------------------------------------------
void ProcessButton2(void) {
  // read the pushbutton input pin:
  buttonState2 = digitalRead(buttonPin2);
  if (buttonState2 != lastButtonState2) {
  if (buttonState2 == HIGH) {
   buttonPushCounter2++;
  lastButtonState2 = buttonState2;
  }
 
  if (buttonPushCounter2 % 2 == 0) {
    digitalWrite(ledPin3, HIGH);
    delay(1000);               // wait for a second
    digitalWrite(ledPin4, HIGH);
  } else {
   digitalWrite(ledPin4, LOW);
   delay(1000);               // wait for a second
   digitalWrite(ledPin3, LOW);
  }
  }
}
//-------------------------------------------------------------------
void loop()
{
  ProcessButton1();
  ProcessButton2();
}//loop


dat met die hekjes dat begrijp ik niet helemaal kan iemand mij vertellen wat je wel en niet ertussen moet zetten
volgens mij sluit ik nu teveel af


groet dirk

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, 19:12

Je moet duidelijker inspringen aan de kantlijn. Neem dit stukje code:

Code: Alles selecteren
void ProcessButton2(void) {
  // read the pushbutton input pin:
  buttonState2 = digitalRead(buttonPin2);

  if (buttonState2 != lastButtonState2) {
     if (buttonState2 == HIGH) {
        buttonPushCounter2++;
        lastButtonState2 = buttonState2;
     } // if (buttonState2 == HIGH)
 
     if (buttonPushCounter2 % 2 == 0) {
        digitalWrite(ledPin3, HIGH);
        delay(1000);               // wait for a second
        digitalWrite(ledPin4, HIGH);
     } else {
        digitalWrite(ledPin4, LOW);
        delay(1000);               // wait for a second
        digitalWrite(ledPin3, LOW);
     }  // else
  } //   if (buttonState2 != lastButtonState2)
} //ProcessButton2



Bedoel jij accolades ( { } ) waar je spreekt van hekjes( # # )?

Klopt het dat je in deze functie alleen code uitvoert als na de digitalRead(buttonPin2) geldt dat buttonState2 != lastButtonState2 ?

Als buttonState2 == LOW wordt lastButtonState2 nooit meer op LOW gezet. Er gebeurt alleen iets als buttonState2 = HIGH.

Je zou eens een stukje papier kunnen pakken, daarop in een aantal kolommen de variabelen schrijven, en dan regel voor regel zelf door je code lopen. Zodra een variabele wijzigt schrijf je die waarde in de kolom en zak je een regel op het papier. Als je in een statement een variabele moet lezen kijk je naar z'n laatste waarde. Zo kan je stap voor stap begrijpen wat je code doet, en waarom het fout gaat.

Verder heb je nog geen code toegevoegd om bouncing van de schakelaar op te vangen, zoals astrofrost suggereerde. Gebruik even de zoekfunctie om voorbeeldcode voor debouncing te vinden. Debouncing is noodzakelijk om een drukknop goed te kunnen gebruiken.

Tenslotte, nogmaals, probeer eerst eens iets met 1 schakelaar en 1 led werkend te krijgen en breidt dat dan uit.
If you think education is expensive, try ignorance! (Derek Bok)

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, 19:45

beste karel

met hekjes bedoel ik inderdaad de accolades ik wist de naam niet weer iets geleerd :D
ik begrijp de code gewoon niet
jou vraag (Klopt het dat je in deze functie alleen code uitvoert als na de digitalRead(buttonPin2) geldt dat buttonState2 != lastButtonState2 ?) kan ik dus ook niet goed beantwoorden
maar bedoel je dat ik nu in de code heb staan dat hij alleen digitalRead(buttonPin2) leest als buttonState2 != lastButtonState2 dus als dit anders is gaat hij niet verder ?
ik heb de code even kleiner gemaakt met alleen in button en 2 ledjes maar nog zonder de bouncing code want daar moet ik me vervolgens even goed in verdiepen
en dit werkt hoe kan ik nu het beste te werk gaan om het verder uit te breiden ?

Code: Alles selecteren
      void setup() {
      // initialize the button pin as a input:
      pinMode(buttonPin1, INPUT);
      // initialize the LED as an output:
      pinMode(ledPin1, OUTPUT);
      pinMode(ledPin2, OUTPUT);
    }


      void loop () {
      // read the pushbutton input pin:
      buttonState1 = digitalRead(buttonPin1);
      if (buttonState1 != lastButtonState1)
      if (buttonState1 == HIGH)
      buttonPushCounter1++;
      lastButtonState1 = buttonState1;
           
           
      if (buttonPushCounter1 % 2 == 0) {
      digitalWrite(ledPin1, HIGH);
      delay(1000);               // wait for a second
      digitalWrite(ledPin2, HIGH);
     } else {
       digitalWrite(ledPin2, LOW);
       delay(1000);               // wait for a second
       digitalWrite(ledPin1, LOW);
     }
    }



groet dirk

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ueqeyazoli en 21 gasten