Go Down

Topic: HULP gevraagd bij een arduino project - Newbie (Read 5735 times) previous topic - next topic

Clair765

Hallo allemaal,

Ik ben nieuw met het programmeren en coderen in arduino.
En nu zit ik met een vraagje. (Misschien wel een domme vraag)

Ik vraag me af hoe ik een aantal ledjes kan laten knipperen na 2 keer op een button te klikken.

if (buttonPushCounter == 2)
   { 
  Serial.println("2 keer");
  }


Dit is tot nu toe de code, en ik loop steeds vast tegen het feit dat ik een "void loop" (om de ledjes te laten knipperen) in een if statement zet. Hij laat na 2 keer wel de serial print ("2 keer") zien op het scherm.


Sorry voor de rommelige code, ben nog een beginner.

Code: [Select]


const int buttonPin = 0;
const int led1 = 10;
const int led2 = 11;
const int led3 = 12;

int buttonPushCounter = 0;   
int buttonState = 0;         
int lastButtonState = 0;


boolean prev = false;
boolean curr = false;

boolean ledState = false;

int time = 10;
int delaytime = 1;
int count = 0;


void setup()
{
  pinMode(buttonPin, INPUT);
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  while(true)
  {
    if(analogRead(buttonPin)>40)
    {
      curr = true;
      Serial.println(analogRead(buttonPin));
    }
    else
    {
      curr = false;
    }
   
   
    if(prev == true && curr == false)
    {     
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
     
      ledState = true;
      count = 0;
      Serial.println("on");
       
       buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of coins:  ");
      Serial.println(buttonPushCounter);
    }
 
  if(ledState == true && count < ((time*1000)/delaytime))

    {
      count++;
    }
   

if (buttonPushCounter == 2)
   { 
  Serial.println("2 keer");
  }

   
  else
    {
      ledState = false;
      digitalWrite(led1,HIGH);
      digitalWrite(led2,HIGH);
      digitalWrite(led3,HIGH);
    }
   
    prev = curr;
    delay(delaytime);
 
  }
 
}




Wat doe ik fout?!

Alvast bedankt!

MAS3

Hoi Clair765, en weilkom.

De while true () met de bijbehorende { en } kun je alvast weglaten.
Een while true  is een controle of de waarheid wel de waarheid is, en dat is dus altijd waar...
Dat betekent dat je daar een oneindige lus maakt, maar dat is juist al het karakter van void loop ().

Verder kijk je of "buttonPushCounter" op 2 komt om dan te printen dat ie 2 is geworden, maar doe je er verder niets mee.
Je wil tussen de accolades { } ook gaan regelen dat de ledjes gaan knipperen, maar op dit moment doe je dat niet.
En houd het voor eeuwig op na 2 keer drukken ?
Of wil je na de volgende keer dat er 2 keer gedrukt is weer de ledjes laten knipperen ?
In dat laatste geval moet je dus ook tussen dezelfde accolades de waarde "buttonPushCounter" weer terug op nul zetten.

Succes !
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Clair765

Hoi MAS3 bedankt voor het reageren,

De button is in werkelijkheid een pressurepad, die een val van een muntje omzet als een schakelaar van de ledjes.
Maar omdat de val van een muntje erg snel gaat en weinig weegt, staat er volgens mij bij de while(true) dat de druk groter dan 40 moet zijn. Dus ik weet niet zeker of ik die dan weg moet halen.

Het blijft nu inderdaad oneindig op "2 keer" staan, maar ik wil juist dat de ledjes gaan knipperen.
Maar ik liep vast bij een (domme) fout. Deze hieronder.

Code: [Select]

if (buttonPushCounter == 2)
   { 
     void loop() {
  digitalWrite(led, HIGH);   
  delay(1000);               
  digitalWrite(led, LOW);   
  delay(1000); 
 
  Serial.println("2 keer");
  }



Met welke code krijg ik hem wel aan het knipperen?

Alvast bedankt!

MAS3

#3
Sep 04, 2013, 11:54 pm Last Edit: Sep 06, 2013, 12:02 am by MAS3 Reason: 1
Ik heb niet gezegd dat je alles tussen de accolades weg kunt halen, alleen dat je de voorwaarde en de daarbij behorende accolades net zo goed kunt weglaten omdat het dubbel op is.
De voorwaarde voor het uitvoeren van de instructies tussen die accolades is dat dat uitgevoerd moet worden zolang de waarheid de waarheid is.
En dat is dus voor eeuwig.
Het is helemaal niet nodig die voorwaarde te stellen, omdat void loop () dat van zichzelf al doet.

Dan je knipper routine die je zelf net aanhaalt en erbij verteld dat dat niet werkt.
Wat je daar doet, is ledje(s) aanzetten, dan een hele seconde helemaal niets, dan dat ledje weer uitzetten en weer een hele seconde niets, om vervolgens verder te gaan met de rest van de code.
Je bent er zo te zien vanuit gegaan dat je door het void loop () te noemen er een eeuwige knipper routine van hebt gemaakt maar dat is heel onwaarschijnlijk.
Dat stukje is niet terug te vinden in de eerste door je geplaatste code.

Vergeet niet dat je Arduino ontzettend snel is.
Een hele seconde niets doen door middel van delay, is die Arduino ongeveer 8 miljoen maal laten "denken": "Ik doe ff helemaal niets, is er al een seconde voorbij ?".
Het is veel efficiƫnter als je je Arduino van alles laat doen in de tussentijd, en dan ook kijkt of er al een seconde voorbij is.
Dat doe je met de beoogde les uit het "blink without delay" voorbeeld, waar ik naar verwijs in mijn signoff (onder al mijn postings in het klein).
Het leuke van dat voorbeeld: Het laat een ledje knipperen.

Je moet dus niet proberen een loop te creƫren terwijl je al in een loop zit (je kunt dat wel doen maar het is niet slim).
Wat je beter kunt proberen is om wat meer variabelen aan te maken en goed bij te houden.
Dan kun je zien hoe lang je ledje al brandt, en of het tijd word om m uit te zetten, en andersom natuurlijk.
Ondertussen doorloopt je programma gewoon zijn routine (voert dus de inhoud van void loop () uit) en kan dus nog steeds van alles doen.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Go Up