HULP gevraagd bij een arduino fiasco - Newbie

algemene C code
Berichten: 6
Geregistreerd: 04 Sep 2013, 00:27

HULP gevraagd bij een arduino fiasco - Newbie

Berichtdoor Clair765 » 04 Sep 2013, 00:30

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: Alles selecteren

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!

Advertisement

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

Re: HULP gevraagd bij een arduino fiasco - Newbie

Berichtdoor nicoverduin » 04 Sep 2013, 08:16

a) while(true) {} kan je er gelijk uit slopen. Dat doet loop al
b) je definieert digitale pin 0 als input en leest analoge pin (A0 = digitaal 14). waar heb je de button (digitaal) nu eigenlijk op aangesloten?
c) als hij op aansluiting 0 zit zou je dus een digitalRead moeten doen op die pin. En hoe is die button aangesloten? Met een pullup (intern of extern)?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 6
Geregistreerd: 04 Sep 2013, 00:27

Re: HULP gevraagd bij een arduino fiasco - Newbie

Berichtdoor Clair765 » 04 Sep 2013, 09:09

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.

De pressurepad staat inderdaad op A0 aangesloten en met een pullup intern.


Bij het stuk:

Code: Alles selecteren
  if (buttonPushCounter == 2)
   { 
  Serial.println("2 keer");
  }


Mis ik de code die de ledjes laten knipperen, hij laat nu alleen "2 keer" oneindig zien.

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

Re: HULP gevraagd bij een arduino fiasco - Newbie

Berichtdoor nicoverduin » 04 Sep 2013, 16:58

Clair765 schreef: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.

De pressurepad staat inderdaad op A0 aangesloten en met een pullup intern.


Bij het stuk:

Code: Alles selecteren
  if (buttonPushCounter == 2)
   { 
  Serial.println("2 keer");
  }


Mis ik de code die de ledjes laten knipperen, hij laat nu alleen "2 keer" oneindig zien.


Die pullup heb je in feite alleen nodig als je een sensor hebt die daar om vraagt. Dus een zogenaamde open collector. Anders zou je het kunnen verstoren vwb. de meting.
Heb je wel gemeten of die pressure pad het doet? Of neem je het aan?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: HULP gevraagd bij een arduino fiasco - Newbie

Berichtdoor nicoverduin » 04 Sep 2013, 18:10

Nou ik heb een poging gewaagd om de code beter te begrijpen:
Code: Alles selecteren
//
// pin definities
//
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;

unsigned int analogeWaarde;      // een keer lezen ipv meerdere malen

void setup() {
   //
   // opzetten pinnen
   //
   pinMode(buttonPin, INPUT);      // deze pin gaat uit van digitaal. Daarnaast is geen pullup aangegeven
   pinMode(led1, OUTPUT);
   pinMode(led2, OUTPUT);
   pinMode(led3, OUTPUT);
   //
   // open serial
   //
   Serial.begin(9600);
}

void loop() {
   //
   // lees de druk sensor
   //
   analogeWaarde = analogRead(buttonPin);
   if (analogeWaarde > 40) {
      //
      // als de waarde groter is dan 40 wordt dit gezien als een vallende munt
      //
      curr = true;
      //
      // en print de waarde op de serial
      //
      Serial.println(analogeWaarde);
      
   } else {
      //
      // alle andere metingen geven een fout aan
      //
      curr = false;
   }
   //
   // vergelijk de huidige meting met de vorige meting
   //
   if (prev == true && curr == false) {
      //
      // als ik net muntje een gemeten had en nu niet dan alle leds uit
      //
      digitalWrite(led1, LOW);
      digitalWrite(led2, LOW);
      digitalWrite(led3, LOW);
      //
      //
      ledState    = true;
      count       = 0;
      //
      // lijkt mij wat tegenstrijdig als alle led waarden LOW zijn gemaakt dat
      // de status aan is???
      //
      Serial.println("on");
      //
      // verhoog de teller van aantal gevallen munten
      //
      buttonPushCounter++;
      //
      // en stuur het totaal naar de serial
      //
      Serial.println("on");
      Serial.print("number of coins:  ");
      Serial.println(buttonPushCounter);
   }
   //
   // Hier lijkt het mij mis te gaan daar je er vanuit gaat dat als LEDS LOW zijn ze aan zijn
   // Maar...
   // Meet tijd is hard gezet op (10 * 1000) / 1 = 10000
   // Count zal altijd wel passen
   //
   if (ledState == true && count < ((time * 1000) / delaytime))
   {
      //
      // count met een verhogen
      //
      count++;
   }
   //
   // test het aantal ontvangen muntjes
   //
   if (buttonPushCounter == 2) {
      //
      // als er 2 muntjes zijn ontvangen dan dit doorgeven naar serial
      //
      Serial.println("2 keer");
   } else {
      //
      // Zo niet dan Alle LEDS uit/aan zetten
      //
      ledState = false;
      digitalWrite(led1, HIGH);
      digitalWrite(led2, HIGH);
      digitalWrite(led3, HIGH);
   }
   //
   // bewaar de huidige waarde voor de volgende keer
   //
   prev = curr;
   //
   // en wacht 10 seconden
   //
   delay(delaytime);

}

a) Je huidige code doet 1x per 10 seconden een meting. Als het muntje net niet valt op het moment dat je meet, dan mis je die meting. Die kans is erg groot.
b) Die while(true) heb ik eruit gesloopt omdat die onzinnig is
c) Je doet 2 verschillende analoge metingen in jouw code. Eerst doe je een meting om te kijken of deze > 40 is. Daarna ga je een nieuwe meting doen naar de Serial. Grote kans dat dat 2 verschillende waarden zijn. Ik heb het veranderd zodanig dat je een meting doet en over dezelfde meting blijft praten.
d) Als je een meting mist, dan zijn curr en prev vrij gauw allebei false waardoor de ledstate false en bijbehorende leds altijd uit/aan (ligt er een beetje aan hoe je ze geschakeld hebt) blijven.
e) Als je nu wilt voorkomen dat je hetzelfde muntje zit te tellen, moet je een while loop creëren die wacht tot de meting weer naar 0 gaat en dus niet relevant is.

Samenvattend denk ik dat:
a) je een programma wilt dat het aantal munten telt die op de druk sensor vallen
b) als er een valt dat er 3 LEDS gaan branden
c) of is dit een spelletje die je speelt door op het juiste moment een muntje te laten vallen?

Verder wat tips:
Het kan geen kwaad om commentaar toe te voegen. Ook al is het programma voor jezelf. Een slechte gewoonte is moeilijker af te leren dan een goede nieuwe aan te leren. En nu zie je het al. Je vraagt een ander om mee te kijken die dan eerst moet puzzelen wat bedoelde de programmeur eigenljk. Je mag best een volledig scherm gebruiken :). Je kunt beter trachten goed te documenteren. Het kost feitelijk geen extra tijd als je het gelijk doet en maakt het voor een ander meer uitnodigend om mee te kijken.

En zoals ik zo vaak al zeg (en ik doe dit vak al een paar weken): Een werkend programma hoeft nog geen goed programma te zijn)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 6
Geregistreerd: 04 Sep 2013, 00:27

Re: HULP gevraagd bij een arduino fiasco - Newbie

Berichtdoor Clair765 » 04 Sep 2013, 19:31

Ten eerste sorry voor de rommelige code, aangezien ik nog niet veel wist was ik wat aan het rommelen met de code.
Maar ik zal me best doen om er voortaan comments bij te zetten. En bedankt voor het kijken naar de code!

Ik wil inderdaad een programma dat het aantal munten telt die op de druk sensor vallen.
Na 10 munten moeten de 3 leds gaan knipperen, om aan te geven dat je bij de 10 bent.
Hierdoor moeten de leds 2 minuten blijven knipperen en daarna weer uitgaan en resetten naar 0 munten door middel van een knopje.

Misschien is er wel een totaal andere code voor en heb ik het te moeilijk gemaakt. (Is er iemand die misschien een beter idee heeft?)

Ik heb de LOW en HIGH om gedraaid omdat de leds anders aan stonden terwijl er niks gebeurde en uit gingen als de sensor geraakt werd.



Maar ik zou graag willen dat als er bijvoorbeeld 2 muntjes ontvangen zijn de ledjes 1 minuut gaan knipperen. (i.p.v. doorgeven aan naar serial)

Code: Alles selecteren

if (buttonPushCounter == 2) {
      //
      // als er 2 muntjes zijn ontvangen dan dit doorgeven naar serial
      //
      Serial.println("2 keer");


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

Re: HULP gevraagd bij een arduino fiasco - Newbie

Berichtdoor nicoverduin » 04 Sep 2013, 20:10

Probeer dit 's
Code: Alles selecteren
//
// pin definities
//
#define LED1       10
#define LED2       11
#define LED3       12
#define DRUKSENSOR    A0
//
// overige definities
//

#define FLASH_DUUR      500L      // halve seconde uit/ halve seconde aan
#define KNIPPER_DUUR 120000L      // 120000 milliseconden = 2 minuten
#define AAN          HIGH      // andere definitie voor HIGH
#define UIT          LOW         // andere definitie voor LOW
//
// overige variabelen
//
unsigned int    aantalMunten;      // aantal getelde munten
unsigned long    ledTimeCtr;         // teller om de 2 minuten af te lopen
unsigned long    ledFlashCtr;      // teller om de aan/uit tijd te bepalen
unsigned int    analogeWaarde;      // gelezen analoge waarde

void setup() {
   //
   // opzetten pinnen
   //
   pinMode(LED1, OUTPUT);
   pinMode(LED2, OUTPUT);
   pinMode(LED3, OUTPUT);
   //
   // zet alle leds uit
   //
   digitalWrite(LED1, UIT);
   digitalWrite(LED2, UIT);
   digitalWrite(LED3, UIT);
   //
   // reset overige variabelen naar bekende waardes
   //
   aantalMunten = 0;

}

void loop() {
   //
   // lees de druk sensor
   //
   analogeWaarde    = analogRead(DRUKSENSOR);   // lees de druksensor
   if (analogeWaarde > 40) {
      //
      // er is een munt gevallen dus nu wachten tot de druksensor weer onder de 40 komt
      //
      while(analogRead(DRUKSENSOR) > 40);
      aantalMunten++;                     // verhoog de teller
   }
   //
   // controleer of we nu het aantal van 10 munten hebben bereikt
   //
   if (aantalMunten == 10) {
      //
      // ja dus nu gaan we 2 minuten knipperen
      //
      // opzetten 2 minuten teller. ik heb er bewust voor gekozen om geen delay te gebruiken
      // hoewel dit in dit geval wel had gekund omdat er toch niets anders gebeurt
      //
      ledTimeCtr    = millis() + KNIPPER_DUUR;   // moment van stoppen is NU (= millis()) + 2 minuten
      //
      // opzetten eerste interval voor knipper effect
      //
      ledFlashCtr   = millis() + FLASH_DUUR;   // moment van omgooien levels LEDS is NU + 500 milliseconden
      //
      // voor onderstaande loop uit zolang NU (=millis() onder de 120 seconden zit
      //
      while(millis() <= ledTimeCtr) {
         //
         // controleer of we de leds moeten omgooien
         //
         if (millis() >= ledFlashCtr) {
            //
            // het knipper interval is inmiddels verstreken dus de levels op de LEDS omdraaien
            //
            digitalWrite(LED1, !digitalRead(LED1));
            digitalWrite(LED2, !digitalRead(LED2));
            digitalWrite(LED3, !digitalRead(LED3));
            //
            // en zet de teller gereed voor de volgende 500 msec (=FLASH_DUUR)
            //
            ledFlashCtr = millis() + KNIPPER_DUUR;
         }
      }
      //
      // zet de LEDS in een bekende stand = UIT
      //
      digitalWrite(LED1, UIT);
      digitalWrite(LED2, UIT);
      digitalWrite(LED3, UIT);
      //
      // en reset de munten teller
      //
      aantalMunten = 0;
   }
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 6
Geregistreerd: 04 Sep 2013, 00:27

Re: HULP gevraagd bij een arduino fiasco - Newbie

Berichtdoor Clair765 » 04 Sep 2013, 20:25

De leds blijven nu constant aan staan. Doe ik wat fout?

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

Re: HULP gevraagd bij een arduino fiasco - Newbie

Berichtdoor nicoverduin » 04 Sep 2013, 21:05

ff AAN en UIT boven in omdraaien. Heb jij de leds zo geschakeld dat de kathode aan de output pin hangt en via de Anode en een weerstand naar 5V?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: HULP gevraagd bij een arduino fiasco - Newbie

Berichtdoor nicoverduin » 04 Sep 2013, 21:39

toch nog een foutje :)
Code: Alles selecteren
//
// pin definities
//
#define LED1       10
#define LED2       11
#define LED3       12
#define DRUKSENSOR    A0
//
// overige definities
//

#define FLASH_DUUR      500L      // halve seconde uit/ halve seconde aan
#define KNIPPER_DUUR 120000L      // 120000 milliseconden = 2 minuten
#define AAN          HIGH      // andere definitie voor HIGH
#define UIT          LOW         // andere definitie voor LOW
//
// overige variabelen
//
unsigned int    aantalMunten;      // aantal getelde munten
unsigned long    ledTimeCtr;         // teller om de 2 minuten af te lopen
unsigned long    ledFlashCtr;      // teller om de aan/uit tijd te bepalen
unsigned int    analogeWaarde;      // gelezen analoge waarde

void setup() {
   //
   // opzetten pinnen
   //
   pinMode(LED1, OUTPUT);
   pinMode(LED2, OUTPUT);
   pinMode(LED3, OUTPUT);
   //
   // zet alle leds uit
   //
   digitalWrite(LED1, UIT);
   digitalWrite(LED2, UIT);
   digitalWrite(LED3, UIT);
   //
   // reset overige variabelen naar bekende waardes
   //
   aantalMunten = 0;
}

void loop() {
   //
   // lees de druk sensor
   //
   analogeWaarde    = analogRead(DRUKSENSOR);   // lees de druksensor
   if (analogeWaarde > 40) {
      //
      // er is een munt gevallen dus nu wachten tot de druksensor weer onder de 40 komt
      //
      while(analogRead(DRUKSENSOR) > 40);
      aantalMunten++;                     // verhoog de teller
   }
   //
   // controleer of we nu het aantal van 10 munten hebben bereikt
   //
   if (aantalMunten == 10) {
      //
      // ja dus nu gaan we 2 minuten knipperen
      //
      // opzetten 2 minuten teller. ik heb er bewust voor gekozen om geen delay te gebruiken
      // hoewel dit in dit geval wel had gekund omdat er toch niets anders gebeurt
      //
      ledTimeCtr    = millis() + KNIPPER_DUUR;   // moment van stoppen is NU (= millis()) + 2 minuten
      //
      // opzetten eerste interval voor knipper effect
      //
      ledFlashCtr   = millis() + FLASH_DUUR;   // moment van omgooien levels LEDS is NU + 500 milliseconden
      //
      // voor onderstaande loop uit zolang NU (=millis() onder de 120 seconden zit
      //
      while(millis() < ledTimeCtr) {
         //
         // controleer of we de leds moeten omgooien
         //
         if (millis() > ledFlashCtr) {
            //
            // het knipper interval is inmiddels verstreken dus de levels op de LEDS omdraaien
            //
            digitalWrite(LED1, !digitalRead(LED1));
            digitalWrite(LED2, !digitalRead(LED2));
            digitalWrite(LED3, !digitalRead(LED3));
            //
            // en zet de teller gereed voor de volgende 500 msec (=FLASH_DUUR)
            //
            ledFlashCtr = millis() + FLASH_DUUR;
         }
      }
      //
      // zet de LEDS in een bekende stand = UIT
      //
      digitalWrite(LED1, UIT);
      digitalWrite(LED2, UIT);
      digitalWrite(LED3, UIT);
      //
      // en reset de munten teller
      //
      aantalMunten = 0;
   }
}

Deze is getest zonder de sensor te testen. Die heb ik niet.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten