Pages: 1 [2]   Go Down
Author Topic: Wie weet wat leuks om te maken?  (Read 4293 times)
0 Members and 1 Guest are viewing this topic.
Netherlands
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wat ik bijna altijd doe is op papier de gewenste werking simuleren


Dat doe ik ook altijd even op papier je algoritme uittekenen werkt een stuk makkelijker.
Logged

Watch my stealth-bot @ let's make robots

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ Rob: Thanks voor de tip, ga ik in het vervolg doen.
Echter zeg je wanneer ik de LED aan zet checken of de knop was ingedrukt, maar dat doe ik nu toch ook?

Code:
void pressButton(int button, int led)
{
   if(digitalRead(button) == HIGH)
   {
      digitalWrite(led, HIGH);
   }
   else
   {
      digitalWrite(led, LOW);   
   }
}

Probleem is dat hij steeds in de ELSE terecht komt als de button niet is ingedrukt. En dat komt in conflict met de andere functie die de LED just random aan wil zetten.
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 43
Posts: 1502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nee dat doe je niet.
Je controleert of de knop is ingedrukt, en zet dan de LED aan.
Dat is iets anders als wanneer je de LED aanzet, je controleert of de knop ook was ingedrukt.

Dan je probleem.
Je controleert nu of de knop is ingedrukt, en in dat geval ga je wat doen, maar dat lukt niet.
Anders moet ie wat anders doen, en hij gaat dat andere dan ook doen, zo heb je geconstateerd.
Draai het dan eens om (is net zo moeilijk).
Controleer of de knop NIET is ingedrukt en zet dan de LED uit, en anders zet je de LED aan.
Kijken of dan de LED altijd aan blijft.

Overigens, hoe heb je je buttons aangesloten ?
Ik adviseer je de button een verbinding naar GND te laten maken, en de pullup aan de ingang aan te zetten.
Dan krijg je geen ongedefinieerde ingangen (die dus alle denkbare waarden kunnen geven).
Alleen word het dan wel:

Code:
if digitalRead(button) == LOW
 {
  digitalWrite(led, HIGH);
  }
else
  {
      digitalWrite(led, LOW);   
   }
}
   

In principe kun je zelfs de gewenste waarde achter de if weglaten maar ik weet niet of de IDE dat accepteert.
Dan zou je moeten krijgen:

Code:
if digitalRead(button)
 {
  digitalWrite(led, LOW);
  }
else
  {
      digitalWrite(led, HIGH);   
   }
}

De voorwaarde is dan die van je button.
Zo'n if voorwaarde heeft maar 2 mogelijkheden, waar (= 1 of HIGH) of niet waar (= 0 of LOW).
De heren met meer ervaring mogen aangeven of dit op deze manier kan en of dat ook wel netjes genoeg is.
Logged

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

Offline Offline
Jr. Member
**
Karma: 1
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zoiets misschien.

Code:

clock();
 
   if (seconds >= Time){
    toggleState = false; clock_reset();}
 

  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
 
  if ((millis() - lastDebounceTime) > debounceDelay) {
    buttonState = reading;
  }
  lastButtonState = reading;
   
   if (buttonState == LOW)
       if (toggleReading == 0)
        {toggleReading = 1;
        if (toggleState == 0) {toggleState = 1; clock_reset();}
        else {toggleState = 0;}
    }}
   
  if (buttonState == HIGH)
    {if (toggleReading == 1)  {toggleReading = 0;}
   }
   
 // set the LED using the state of the button:
  digitalWrite(ledPin, toggleState);
 

 
 
 

Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Deze was weggevallen, na clock(), sorrie
Code:
int reading =! digitalRead(buttonPin);
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@MAS3:
"Je controleert of de knop is ingedrukt, en zet dan de LED aan.
Dat is iets anders als wanneer je de LED aanzet, je controleert of de knop ook was ingedrukt."

Kan je mij in een if / else voorbeeldje laten zien wat daar het verschil in is? Want voor mij komt het alsnog op hetzelfde neer.

Ik heb overigens de button met een pulldown 10k ohm naar de GND en de andere naar een digitalPin.
Ik ga nog even met de code aan de gang om te kijken hoe ik het oplos.
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 43
Posts: 1502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Het komt bijna op hetzelfde neer, dat klopt.
Maar je moet goed op de volgorde letten als je fouten gaat opzoeken.
Het verschil hier is dat jij kijkt of de knop IS ingedrukt, en dan meteen iets doet.

Dit is niet wat Rob bedoelde.
Wat Rob bedoelde is dat je nu nergens de status van de knop bijhoudt.
Dan zou je dus een extra variabele hebben waarin de stand van de knop word bijgehouden.
Aan de hand daarvan kun je op een later tijdstip zien of je ook iets moet veranderen aan de LED.
Bijkomend voordeel is dan ook dat je eventueel met dezelfde waarde ook nog iets anders kunt doen zonder dat je daarvoor de knop opnieuw inleest en wellicht een ander resultaat krijgt.

Rob heeft het dus over wat de knop WAS toen je er naar keek.

Zoals je ziet doet rikky een duit in het zakje om contactdender af te vangen, ook bekend als debouncing.
Ook hiervoor moet je bijhouden wat de stand van de knop was (lastButtonState) en (reading).
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah ik snap hem. Ik heb het zowaar werkend gekregen:

- De functie randLed stoort niet meer met de andere functie en hij knippert dus random een ledje met de gewenste tijd
- De functie pressButton werkt MAAR er zit een bug in:
  > Als ik button van de rode led in druk gaat ineens de groene led aan
  > Als ik de button van de groene led in druk gaat de blauwe aan
  > Als ik de blauwe in druk gaat de rode aan

M.a.w. ze zijn allemaal een pin opgeschoven (ze staan op RGB volgorde en dus via de buttons op GBR), terwijl ik toch echt niets in het circuit veranderd heb.

Code (zie de wijziging waarbij ik de buttonstate onthoud):

Code:
int ledRed = 8;
int ledGreen = 9;
int ledBlue = 10;
int buttonRed = 5;
int buttonGreen = 6;
int buttonBlue = 7;
int aRandom[] = {};
int iRandomNum = 0;
unsigned long iTimer = 0;
unsigned long iTimerCurrent = 0;
int ledState = LOW;
int numUsed = 0;
int buttonState = LOW;
int randLedState = LOW;

void setup()
{
   pinMode(ledRed, OUTPUT);
   pinMode(ledGreen, OUTPUT);
   pinMode(ledBlue, OUTPUT);
   pinMode(buttonRed, INPUT);
   pinMode(buttonGreen, INPUT);
   pinMode(buttonBlue, INPUT);
}

void pressButton(int button, int led, int randLedState)
{
   if(buttonState == HIGH)
   {
      digitalWrite(led, HIGH);
   }
   else if(randLedState == LOW)
   {
      digitalWrite(led, LOW);  
   }
  
   buttonState = digitalRead(button);
}

boolean randLed()
{
   if(numUsed == 0)
   {
     iRandomNum = random(8, 11);
   }
   iTimerCurrent = millis();
  
   if(iTimerCurrent-iTimer > 500)
   {
       iTimer = iTimerCurrent;
  
      // if the LED is off turn it on and vice-versa:
      if (ledState == LOW)
        ledState = HIGH;
      else
        ledState = LOW;
      
      numUsed ++;
  
      // set the LED with the ledState of the variable:
      digitalWrite(iRandomNum, ledState);
   }
  
   if(numUsed >= 2)
   {
      numUsed = 0;
   }
  
   return ledState;
  
}

void loop()
{  
   randLedState = randLed();
  
    
    
     pressButton(buttonRed, ledRed, randLedState);
     pressButton(buttonGreen, ledGreen, randLedState);
     pressButton(buttonBlue, ledBlue, randLedState);
}
« Last Edit: January 23, 2013, 05:16:57 pm by thabram » Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 43
Posts: 1502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote from: thabram
Ik heb overigens de button met een pulldown 10k ohm naar de GND en de andere naar een digitalPin.

Dit is mij niet geheel duidelijk.
Heb je het hier over 2 buttons, of over de 2 pins van 1 button ?

Je moet voorkomen dat het onbekend is of die button nou wel of niet is ingedrukt, en in beide gevallen een min of meer geforceerde waarde genereren.

Vwb de verschoven LEDs, dat is vreemd.
Heb je ook al iemand anders naar je bedrading laten kijken ?
Vaak zit je zelf zo vast in je werkwijze dat je voor de hand liggende fouten niet opmerkt, terwijl een ander die vrijwel direct ziet.
Logged

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

Netherlands
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Toen ik het topic zag dacht ik echt "moet een vrij simpel iets zijn om te maken"

Maar wordt toch nog heel projectje  smiley Blijf um zeker volgen!
Logged

Watch my stealth-bot @ let's make robots

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ik heb 3 buttons elk met een 10k ohm naar de GND + aangesloten op een digitalPin en de andere kant van de button naar de +.
Ik heb ook 3 LEDs elk naar de GND en de plus met tussenkomst van een 180ohm naar een digitalPin.

Verder heb ik geen wijzigingen gemaakt met de bedrading. Het is ook een simpel circuit. Kan het door code komen dat ze opschuiven?

EDIT: Ik heb het gevonden, zat in de code:

Code:
void pressButton(int button, int led, int randLedState)
{
   //Op deze plek werkt het zoals het hoort
   buttonState = digitalRead(button);
   
   if(buttonState == HIGH)
   {
      digitalWrite(led, HIGH);
   }
   else if(randLedState == LOW)
   {
      digitalWrite(led, LOW);   
   }

    //buttonState = digitalRead(button); <-- op deze plek veroorzaakt hij het probleem
}

Maar ik heb geen idee waarom, iemand?

Quote from: thabram
Ik heb overigens de button met een pulldown 10k ohm naar de GND en de andere naar een digitalPin.

Dit is mij niet geheel duidelijk.
Heb je het hier over 2 buttons, of over de 2 pins van 1 button ?

Je moet voorkomen dat het onbekend is of die button nou wel of niet is ingedrukt, en in beide gevallen een min of meer geforceerde waarde genereren.

Vwb de verschoven LEDs, dat is vreemd.
Heb je ook al iemand anders naar je bedrading laten kijken ?
Vaak zit je zelf zo vast in je werkwijze dat je voor de hand liggende fouten niet opmerkt, terwijl een ander die vrijwel direct ziet.
« Last Edit: January 24, 2013, 08:23:51 am by thabram » Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 43
Posts: 1502
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

OK, nu snap ik  de bedrading.

Quote from: thabram
Ik heb het gevonden, zat in de code:

Code:

    //buttonState = digitalRead(button); <-- op deze plek veroorzaakt hij het probleem
}

Maar ik heb geen idee waarom, iemand?

Heb je het ook opgelost dan, omdat je zegt zat in de code ?

Enige dat mij opvalt is dat ik de variabele (button) maar op 2 plaatsen terug zie, als je 'm initieert, en als je m gebruikt om te lezen.
Vergis ik me daar in ?
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Het is inderdaad opgelost. De button read moest boven de IF / ELSE statement komen. Ik definieer de buttonstate helemaal bovenaan het script (op LOW).
Maar ik snap even niet waarom hij de leds doorschuift als de button read onder de IF / ELSE staat.

Ik ben inmiddels begonnen met de code voor het simon-says spelletje. Aller eerste wat ik maak is een functie die adhv parameters 1 of meerdere leds laat knipperen voor een bepaalde tijd.
Die heb ik namelijk meerdere keren nodig.

Wat ik in gedacht heb is het volgende:

Startgame functie:
Deze start het spel op. Eerst laat hij een paar ledjes knipperen etc.

PlayGame functie:
Het spel gaat beginnen, er wordt een random ledje aangezet, daarna is de gebruiker aan de beurt.

Fail functie:
Heb je het fout? Dan gaan de ledjes knipperen en begint het spel overnieuw.

Proceed functie:
Antwoord is goed. Laat ledjes knipperen (op een andere manier dan fail) en ga verder met spelen.

CheckInput functie:
Deze controleert de user input tegen de gegenereerde input en roept fail of proceed aan.

Dat is hoe ik het voor nu wil bouwen. Iemand tips?

Wat ik later wil toevoegen is:
- LCD om bv score te laten zien.
- Speaker om geluidjes te spelen
- Programmeren voor meerdere spelers

Uiteindelijk wil ik alles echt in elkaar knutselen via een printplaat + PCB etc. (wat ik nog nooit gedaan heb en dus 0 ervaring mee heb).
Maar ik wil het gewoon onder de knie krijgen dus lijkt me een goede oefening.
Logged

Global Moderator
Netherlands
Offline Offline
Shannon Member
*****
Karma: 211
Posts: 13477
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Simon is een goed project, je top down analyse zit in de juiste richting. Hieronder hoe ik het zou opdelen in de vorm van pseudo-code.
Zonder de variabelen (OK eentje) en uitgewerkte functies.

Code:
setup()
{
  initializeGame();
}

void loop()
{
  simonsTurn();
  playersTurn();

  if (compareSimonPlayer() == true)
  {
     happyLeds();
     highScore();
     level++;
  }
  else
  {
    sadLeds();
    level--;
  }
}

Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Pages: 1 [2]   Go Up
Jump to: