Go Down

Topic: Leds Random (Read 643 times) previous topic - next topic

Sembot

Hieronder een prog om 2 leds random aan en uit te voeren random zowel in tijd als in de 2 leds

Ik heb wel nog een vraagje , is het mogelijk om de 2 leds die ik gebruik gelijktijdig te laten branden ook als random

Zo zou je kunnen kiezen tussen 1led aan , of  2de led aan of allebei aan in random

Kunt U mij helpen aub


Code: [Select]

int ranNum;
int ranDel;

void setup() {
 
  Serial.begin(9600);
  Serial.println("Starting new Random Number Sequence");
 
    randomSeed(analogRead(0));          // Seed RNG from analog port.

 pinMode(2, OUTPUT);                    // Setup 2 output ports for LED's
 pinMode(3, OUTPUT);
                                   
}
void loop() {
   
    ranNum=random(2,4);                 // Generate random number between 2 and 3
    ranDel=random(25,300);              // Generate random delay time 25,300
   
    digitalWrite(ranNum, HIGH);         // Turn on the LED
    delay(ranDel);
   
    digitalWrite(ranNum, LOW);          // Turn off the LED 
    delay(ranDel);

  Serial.print("The Random Number is = ");
  Serial.println(ranNum : ranDel) ;
  //Serial.print("The Random Delay is  = ");
  //Serial.println(ranDel);
 
}




robtillaart

#1
Jan 22, 2018, 11:13 am Last Edit: Jan 22, 2018, 11:14 am by robtillaart
Hoi gebruik CTRL-T om je programma uit te lijnen (auto format)

OK , de basis is er, echter het gebruik van delay houd alles tegen = BLOCKING
Door slim met millis() te werken en te vergelijken wanneer je een actie voor het laatst deed krijg je code die niet BLOCKING is.

Probeer dit programma eens, voor jou de opdracht om van de variabelen arrays te maken en van de repeterende  stukken code functies.

De code is niet getest dus er kunnen typos instaan.
Code: (not tested) [Select]
// PROGRAM:
//  AUTHOR:
//    DATE:
//

int ranNum;
int ranDel;

uint32_t lastTime0 = 0;
uint32_t lastTime1 = 0;
uint32_t lastTime2 = 0;

uint32_t lastPrint = 0;

uint32_t duration0 = 0;
uint32_t duration1 = 0;
uint32_t duration2 = 0;

void setup()
{
  Serial.begin(9600);
  Serial.println(__FILE__);
  Serial.println("Starting new Random Number Sequence");
 
  randomSeed(analogRead(0));          // Seed RNG from analog port.

  pinMode(2, OUTPUT);                 // Setup 2 output ports for LED's
  pinMode(3, OUTPUT);
  pinMode(13, OUTPUT);                 // build in LED

  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(13, LOW);
}


void loop()
{
  uint32_t now = millis();
 
  // time to change led 0?
  if (now - lastTime0 >= duration0)
  {
    digitalWrite(2, !digitalRead(2));  // invert;
    duration0 = random(25,300);
    lastTime0 = now;
  }

  // time to change led 1?
  if (now - lastTime1 >= duration1)
  {
    digitalWrite(3, !digitalRead(3));
    duration1 = random(25,300);
    lastTime1 = now;
  }

  // time to change led 2?
  if (now - lastTime0 >= duration0)
  {
    digitalWrite(13, !digitalRead(13));
    duration2 = random(25,300);
    lastTime2 = now;
  }

  if (now - lastPrint >= 500)
  {
    lastPrint = now;
    Serial.print(duration0);
    Serial.print('\t');
    Serial.print(duration1);
    Serial.print('\t');
    Serial.print(duration2);
    Serial.println();
  }
}
Rob Tillaart

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

Sembot

hai,

Bedankt voor het snel antwoorden
Het programma werkt , na een kleine in greepje gedaan te hebben

 // time to change led 2?
  if (now - lastTime2 >= duration2)
  {
    digitalWrite(13, !digitalRead(13));
    duration2 = random(25,300);
    lastTime2 = now;

Maar bij dit programma heb je 3 leds nodig de bedoeling is om met 2 leds  3 verschillende opdrachten te geven  led1 aan of led2 aan of led1 en led2 aan

Tussen () zo een goede programmeur ben ik niet , meer een gebruiker van arduino , heb het programma met plakken en knippen bijeen gezocht

 mvg
Erwin

MAS3

Hoi Erwin.

Je vraag heeft het antwoord al in zich.
Schrijf je wensen eens op, slaap er een nachtje over en lees je wensenlijstje dan nog eens door zou ik zeggen.

Je hebt nu 2 toestanden en je wil 3 toestanden, dat is de kern van je vraag.

Zo moeilijk kan dat toch niet op te lossen zijn ?

Zoals je ziet ben ik er niet zo van om een vraag uit te werken in een stuk code (hoewel ik dat in het verleden wel zeer uitgebreid heb gedaan).
Liever zie ik dat iemand zelf de oplossing bedenkt, eventueel met wat hulp en/of andere inzichten.
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

robtillaart

#4
Jan 23, 2018, 08:51 am Last Edit: Jan 23, 2018, 08:51 am by robtillaart
Met het voorbeeld programma kun je zien hoe non blocking werkt.

Jouw vraag gaat net effe anders, als het tijd is om de toestand te veranderen moet je niet een maar twee bslissingen maken'.

In plain text is de kern van je code

if time to change
    aantal leds = keuze uit 4 mogelijkheden  (00 01 10 11 )
    nieuwe duur = tussen 25 en 300
    laatste change = nu

    if leds = 00 ==> alles uit
    if leds = 01 ==> links aan
    if leds = 10 ==> rechts aan
    anders ==> beide aan

 
 
Rob Tillaart

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

Go Up