Random getal

algemene C code
Berichten: 21
Geregistreerd: 27 Feb 2013, 15:17

Random getal

Berichtdoor Dedier » 27 Feb 2013, 16:25

Hallo allemaal,
Ik ben helemaal nieuw in de wereld van arduino en programeren. Maar het lijkt me leuk om een "spel" te maken.
Een kleine uitleg van het spel:
je hebt een paar ledjes. iedere deelnemer zit bij een eigen ledje en heeft een drukknop. De ledjes gaan random branden en zodra je op je drukknop druk als je lampje aan is blijft jou lampje branden. Gene die als laatste zijn lampje nog niet blijft branden is af.

maar ja nu het probleem, bij het programeren van de arduino (uno) loop ik al vast bij het random laten branden van de ledjes. Ik heb de ledjes aangesloten op poorten 8-13.

Alvast bedankt voor de hulp,

Dedier

Advertisement

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

Re: Random getal

Berichtdoor astrofrostbyte » 27 Feb 2013, 17:52

gebruik je de functie random() al ? http://arduino.cc/en/Reference/random
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Berichten: 21
Geregistreerd: 27 Feb 2013, 15:17

Re: Random getal

Berichtdoor Dedier » 27 Feb 2013, 18:07

Ja daar had ik al naar gekeken maar dat snap ik nog niet helemaal :$.

Mijn code tot nu toe is dit:

int drukKnop = 8;
int drukKnop2 = 9;
int drukKnop3 = 10;
int led = 1;
int led2 = 2;
int led3 = 3;

void setup()
{
pinMode(drukKnop, INPUT);
pinMode(drukKnop2, INPUT);
pinMode(drukKnop3, INPUT);
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
}

void loop()
{
// Start met random getalletjes (ledjes aan)
if( digitalRead(drukKnop) == HIGH && digitalRead(led) == HIGH)
{
//stop random
}
else
{
// ga door met random
}



Ik hoop dat dit duidelijk is, anders mijn excusses.

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

Re: Random getal

Berichtdoor astrofrostbyte » 27 Feb 2013, 18:22

Hier mee maak je drie random knipperende Led's:
byte r = random(255);
led1 = r & B00000001;
led2 = r & B00000010;
led3 = r & B00000100;

nadeel is dat er ook dat kans (random) bestaat dat een led vrij lang aanblijft.
Mischien wil je meer dat een led kort(vaste tijd) aangaat op random tijdintervallen ?.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Berichten: 21
Geregistreerd: 27 Feb 2013, 15:17

Re: Random getal

Berichtdoor Dedier » 27 Feb 2013, 19:57

Ik ga zo even een proef opstelling maken om te kijken hoe lang ze aan blijven. Maar wat moet je dan precies doen om die tijdsintervallen in te stellen?

Berichten: 21
Geregistreerd: 27 Feb 2013, 15:17

Re: Random getal

Berichtdoor Dedier » 27 Feb 2013, 20:21

Okey ik heb nu de opstelling gemaakt. Met de volgende code (ik hoop dat ik hem goed heb ingevoerd :$)

int drukKnop = 8;
int drukKnop2 = 9;
int drukKnop3 = 10;
int led = 1;
int led2 = 2;
int led3 = 3;


void setup ()
{
pinMode(drukKnop, INPUT);
pinMode(drukKnop2, INPUT);
pinMode(drukKnop3, INPUT);
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
}

void loop()
{
byte r = random(255);
led = r & B00000001;
led2 = r & B00000010;
led3 = r & B00000100;

if(digitalRead(drukKnop) == HIGH&& digitalRead(led) == HIGH)
{
//stop
}
else
{
//doorgaan
}
}



Maar ja nu blijft ledje1 de heletijd aan, ledje 2 heel lichtjes en ledjes 3 gaat nooit aan......
Dus of met het programmeren is wat fout gegaan of met het aansluiten.

Berichten: 27
Geregistreerd: 23 Feb 2013, 12:07

Re: Random getal

Berichtdoor walker » 28 Feb 2013, 00:43

De loop functie wordt nu heel vaak per seconde aangeroepen. Om dit want langzamer te maken kun je bijvoorbeeld een delay aan het eind van de loop functie zetten, bijv delay(100) dat is dan een wachttijd van 100 milli seconden.
De loop wordt dan zo 10 x per seconde aangeroepen. Je kunt dan de delay tijd aanpassen om te kijken wat het beste resultaat oplevert.

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

Re: Random getal

Berichtdoor astrofrostbyte » 28 Feb 2013, 15:23

Bij programeren kan je het beste wat je wil eerst gewoon eens in een gewone mensentaal sequentie beschrijven, en daarna vertalen naar C.
Het is heel verleidelijk om eerst te programeren en dan pas eens na te denken wat we nu precies willen.
Wat je ook zal merken is dat er vele (goede) methoden zijn om dit spelletje te programeren.

Voorbeeld van één mogelijk oplossing:
- Voor iedere speler een boolean (true/false) opgenomen om aan te geven of hij gewonnen heeft en nog meedoet
Code: Alles selecteren
int drukKnop1 = 8;
int drukKnop2 = 9;
int drukKnop3 = 10;
int led1 = 1;
int led2 = 2;
int led3 = 3;
boolean Player1 = true;
boolean Player2 = true;
boolean Player3 = true;

void setup ()
{ pinMode(drukKnop1, INPUT); pinMode(drukKnop2, INPUT); pinMode(drukKnop3, INPUT);
  pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT);
}

void loop()
{
  delay(100);
  if( Player1 )
  { if ( digitalRead(drukKnop1) == HIGH && digitalRead(led1) == HIGH)
    {  Player1 = false;          //stop player1
    }
    else
    {  digitalWrite(led1, random(255) & B00000001);
    }
  }

  if( Player2 ) 
  { if ( digitalRead(drukKnop2) == HIGH && digitalRead(led2) == HIGH)
    {  Player2 = false;           //stop player2
    }
    else
    {  digitalWrite(led2, random(255) & B00000010);
    }
  }

  if( Player3 )
  { if ( digitalRead(drukKnop3) == HIGH && digitalRead(led3) == HIGH)
    {  Player3 = false;           //stop player3
    }
    else
    {  digitalWrite(led3, random(255) & B00000100);
    }
  }

  if ( !Player1 && !Player2 && !Player3 )
  { // all players done, end of game
  }

}//loop
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

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

Re: Random getal

Berichtdoor pjh » 03 Mrt 2013, 16:20

Willekeurigheid is iets raars.
Ik gebruik nog wel eens de analoogRead() van een "floating" pin om een willekeurig getal te maken.
Dan rijg ik acht bits aan elkaar tot een byte (0-255)
Een bit word een één als de laatste bit van de analogRead(Ax) ook een 1 is. Anders een nul. (sketch verderop)

Nu heb ik gekeken hoe vaak de getallen 0 - 255 voorkomen. Deze heb ik in een Excel sheet gezet en plaatje gemaakt. Zoals je hieronder ziet omen bepaalde getallen toch vaer voor dan andere getallen. De lijn is niet recht.

Willekeurigheid is iets raars...
Afbeelding

Afbeelding

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

Re: Random getal

Berichtdoor pjh » 04 Mrt 2013, 00:56

:o :shock: :? ik zie een fout in mijn sketch: analogRead(t) moet analogRead(A0) zijn...

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 6 gasten