Ledien välkyttely

Meillä on seuraavanlainen ongelma: yritämme saada ledit syttymään satunnaisessa järjestyksessä millis -toiminnon avulla (koska tässä ei voinut käyttää delay -toimintoa). Olemme testanneet, että satunnaisfunktio toimii koodissamme delayn avulla. Koodin lopussa olevan digitalWriten sulkeissa on aiemmin alustettu randomi. Miksei siis satunnainen ledi välky, vaan kaikki syttyvät yhtä aikaa (tai hyvin nopeasti peräkkäin)?


int Ledpun = 7;
int Ledvalk = 8;
int Ledkelt = 9;
int Ledvihr = 10; // nimetään ledit pinneihin


// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
pinMode(Ledpun, OUTPUT);
pinMode(Ledvalk, OUTPUT);
pinMode(Ledkelt, OUTPUT);
pinMode(Ledvihr, OUTPUT);
  
}

void loop()
{
  
  randomSeed(analogRead(5)); // pinnistä 5 satunnaiskohinaa
  
  
long randomi = random(7, 11); // arvotaan numero välillä 7-10 
digitalWrite(randomi, HIGH); //

  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;  

    // 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(randomi, ledState);

}
}



Viivettä väliin niin jo taas toimii. Looppihan pyörii ympäri koko ajan jos sitä ei tavalla tai toisella hidasta. Pyörimisnopeudenkin pystyy laskemaan (tai mittaamaan tai sivistyneesti arvaamaan) mikäli se kiinnostaa, mutta tässä nyt riittää se, että se pyörii huomattavasti teidän silmiänne nopeammin.

Nyt koodissa joka silmukan pyörähdyksellä alustetaan satunnaisluku, sytytetään satunnaislukua vastaava ledi ja luetaan aikaleima. Jos aikaa on kulunut riittävästi (mitä ei luonnollisestikaan ole kulunut johtuen silmukan nopeasta tahdista) sytytetään tai sammutetaan randomia vastaava ledi.

Miettikää rakennetta toiselta kannata. Aika otetaan talteen joka pyörähdyksellä, mutta ledi sytytetään tai sammutetaan vasta kun aikaa on kulunut riittävästi. Ja jos ledin tilaa räplätään, otetaan aikaleima previousMillis-muuttujaan talteen.

Edit: Katsoinkohan jotain ihan höpöjä? Viisaammat korjatkoon aivopieruni :slight_smile:

Ajat joka kierroksella randomipinnin ylös ylös.

Pelasta maailma. Sisennä koodisi oikein. Arduinosta saa ulkoisen editorin käyttöön ja hyviä editoreja on muitakin kuin emacs.

En kokeillut, kääntänyt tai muutakaan. Lisäsin sulkeita ja ja ja. Mielestäni voisi toimia.

Entäs kun previous millis pyörähtää ympäri :slight_smile: Kuinkas tuo sitten potkaisee itsensä solmuun. Alkuperäisessä se oli vielä etumerkikäs, joten mielenkiintoisia tilanteita olisi voinut tulla vastaan.

int Ledpun = 7;
int Ledvalk = 8;
int Ledkelt = 9;
int Ledvihr = 10; // nimetään ledit pinneihin


// Variables will change:
int ledState = LOW;             // ledState used to set the LED
unsigned long previousMillis = 0;        // will store last time LED was updated
//long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(Ledpun, OUTPUT);
  pinMode(Ledvalk, OUTPUT);
  pinMode(Ledkelt, OUTPUT);
  pinMode(Ledvihr, OUTPUT);
  randomSeed(analogRead(5)); // pinnistä 5 satunnaiskohinaa 
}

void loop()
{
   
  long randomi = random(7, 11); // arvotaan numero välillä 7-10
  // digitalWrite(randomi, HIGH); // Ny vois toimii

  unsigned long currentMillis = millis();
  
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis; 
    
    // 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(randomi, ledState);
    
  }
}

Ite tekisin kaiketi jotain tämän näköistä:

int pinnit[] = {7, 8, 9, 10};

void loop(){

  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval){
    int vilaus = random(0,15);
    for(int i = 0; i< 4; ++i){
      if(vilaus & (1 << i)){
        digitalWrite(pinnit[i], HIGH);
      }else{
        digitalWrite(pinnit[i], LOW);
      }
    }
  }
}