Wie weet wat leuks om te maken?

Hoi,

Ben een tijdje geleden met Arduino begonnen (basis met ledjes e.d.). Weet iemand nu iets simpels en leuks om te maken?

Groeten,
Bram

met een paar LEDS en evenzoveel buttons kun je het spel SIMON SAYS maken.

laat de leds in een random steeeds moeilijker patroon knipperen en de gebruiker moet dan de knoppen in dezelfde volgorde indrukken.

goed nadenken voordat je begint te koderen !!

Ahja dat is inderdaad wel iets leuks om te maken!
Thanks.

Nu een vraag waar ik ook al een tijdje mee zit. Als je bv spullen nodig hebt naast de arduino componenten waar koop je die dan?
Zie bv: http://www.miniclip.com/games/simon-says/en/

Van dat soort knoppen + ronde schijf waar zou je zoiets kunnen kopen?

EDIT:
Ik heb deze gevonden: http://www.pieterfloris.nl/shop/product.php?id_product=751
Wel wat prijzig maar zijn wel de gene die ik zoek.

Ik heb een lijstje gemaakt met benodigdheden:

  • 4x dome push button (rood, groen, blauw, geel)
  • arduino uno
  • jumpwires
  • speaker
  • weerstandjes
  • connectors / kroonsteen

Ik weet waar ik alles kan krijgen behalve de connectors. Ik wil een connector met 2x female zodat ik aan de ene kan de LED erin kan steken en aan de andere kant het jumpwire. Ik kan ze bij conrad niet vinden, iemand een idee?

Misschien ook nog een speakertje of buzzer zodat je ook geluid kunt maken (naar het voorbeeld) ?

Had ik al in het lijstje staan! Thanks

voor spullen moet je bij eenrecycle winkel gaan shoppen, die hebben vaak oud speelgoed, kistjes, oude electronica (met knoppen) etc
Daarmee is voor weinig geld iets leuks te maken. OK soms moet je poetsen of dingen doorzagen of beknutselen (whatever that may be).

gr. Rob

Goede tip dankjewel.

Weet iemand toevallig hoe die female-femaile connectors heten? Headers / connectors / kroonsteentjes?
Het is dus om 2 dingen aan elkaar te verbindingen (zonder te solderen) gewoon dezelfde functie als een kroonsteen maar dan met een klik systeem ipv schroef.

Ik heb ze nog steeds niet kunnen vinden, iemand?

zoiets?
jumper wires?

Nog een vraagje (omdat het met dit projectje te maken heeft):

De delay functie. Als ik bv een functie aan maken welke een LED laat knipperen:

void randLed()
{
   iRandomNum = random(8, 11);
   
   digitalWrite(iRandomNum, HIGH);
   delay(500); 
}

En ik heb in de void loop nog andere code (functie) staan die checkt of een button wordt ingedrukt, dan werkt die delay ook op die functie.
Hoe zorg ik ervoor dat de delay werkt enkel in de functie (of een stuk code) waar ik hem voor wil gebruiken?

Hele code:

int ledRed = 8;
int ledGreen = 9;
int ledBlue = 10;
int buttonRed = 5;
int buttonGreen = 6;
int buttonBlue = 7;
int aRandom[] = {};
int iRandomNum = 0;

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)
{
   if(digitalRead(button) == HIGH) 
   {
      digitalWrite(led, HIGH); 
   }
   else
   {
      digitalWrite(led, LOW);   
   }
}

void randLed()
{
   iRandomNum = random(8, 11);
   
   digitalWrite(iRandomNum, HIGH);
   delay(500); 
}

void loop()
{
   pressButton(buttonRed, ledRed);
   pressButton(buttonGreen, ledGreen);
   pressButton(buttonBlue, ledBlue);
   
   randLed();
}

Je moet helemaal geen delay gebruiken, lees de tutorial "blink without delay" - http://arduino.cc/en/Tutorial/BlinkWithoutDelay -

voor iedere functie die je wilt schedulen maak je een dergelijke constructie.

Dankjewel! Inmiddels heb ik de tutorial gedaan.
Echter blinkt de led geen 1 seconden lang maar 1 milli sec ofzo (net genoeg om waar te nemen). Weet iemand waarom dit is? Er staat toch duidelijk 1000 in de code:

unsigned long iTimer = 0;
unsigned long iTimerCurrent = 0;
int ledState = LOW;

void randLed()
{
   iRandomNum = random(8, 11);
   iTimerCurrent = millis(); 
   
   if(iTimerCurrent-iTimer > 1000)
   {
     iTimer = iTimerCurrent;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(iRandomNum, ledState);
   }
}

void loop()
{
   pressButton(buttonRed, ledRed);
   pressButton(buttonGreen, ledGreen);
   pressButton(buttonBlue, ledBlue);
   
   randLed();
}

change this line iRandomNum = random(8, 11); to iRandomNum = 8;

You use one state for 3 different leds, that should be three states I guess.

Hoi Rob,

Ik ben erachter gekomen wanneer ik de functies:
pressButton(buttonRed, ledRed);
pressButton(buttonGreen, ledGreen);
pressButton(buttonBlue, ledBlue);

Uit de code verwijder hij wel de ledjes laat branden. En inderdaad je opmerking klopt over 3 leds ipv 1.

Ik snap nu ook waarom hij maar 1 milli sec brandt. Hij voert de pressButton functie uit en ziet dat de knop niet is ingedrukt en zet de LED dus op LOW.
Hoe kan ik dit omzeilen?

je moet pressbutton niet de led veranderen, maar een variabele zetten en onthouden dat je de knop ingedrukt hebt.
Later als je de led veranderd kijk je of de knop ingedrukt was.

voldoende?
Wat ik bijna altijd doe is op papier de gewenste werking simuleren, zelf ben ik dan de processor en vraag me af welke stappen ik moet doen en wanneer.

robtillaart:
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.

@ 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?

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.

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:

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:

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.

Zoiets misschien.

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);

Deze was weggevallen, na clock(), sorrie

int reading =! digitalRead(buttonPin);