Lektion 4: Rinnande LED ljus

Här är en litet kul experiment där vi skall använda oss utav åtta lysdioder (1 gul, 5 gröna och 2 röda). Koppla upp lysdioderna som bilden nedan (i den färgkombinationen då vi skall använda denna koppling i nästa lektion). Vi hoppar över schema här då lysdioderna skall kopplas in med samma princip som tidigare. Vi kommer använda 8st I/O från pin 2 till och med pin 9. Anslut kopplingstråd från I/O på utvecklingskortet ut till högra halvan av kopplingsdäcket (lämna lite rum längst ned (rader 27-30), anslut dem sedan i var tredje rad uppåt. Anslut sedan en LED till varje utgång, börja med 1st gul längst ner med anoden (långa benet) vid kopplingståden och katoden i raden nedanför, sedan 5st gröna och slutligen 2st röda. Sedan anslut 8st 330ohms motstånd från katoden (korta benet) på lysdioderna till GND (0V).

När detta är gjort så ladda hem koden för detta experiment här, koden kan även ses nedan.

/*
  8 LEDs Test

  Turns on one LED at a time rotating through all 8 LEDs up and down

  Created FEB-23, 2012 by Lars Wictorsson
  LAWICEL AB, http://www.lawicel-shop.se

  This example code is in the public domain.
*/
// LED Pin Variables in an Array, First LED is attached to I/O 2 etc.
int LED_Pins[] = {2, 3, 4, 5, 6, 7, 8, 9};
// Temporary variable to use in e.g. for next loops etc.
int tmp;
// Variable to hold which LED was turned on last time
int Old_LED = 0;
void setup() {
// Make sure all I/O for external LEDs are outputs. 
  for (tmp = 0; tmp < 8; tmp++) {
    pinMode(LED_Pins[tmp], OUTPUT);
  }
}
void loop() {
// Rotate one LED at a time upwards
  for (tmp = 1; tmp < 8; tmp++) {
    digitalWrite(LED_Pins[Old_LED], LOW);  // Turn off previous LED
    digitalWrite(LED_Pins[tmp], HIGH);     // Turn on actual LED
    Old_LED = tmp;                         // Save current LED into old LED variable
    delay(100);                            // Delay 100ms
  }
// Rotate one LED at a time downwards
  for (tmp = 6; tmp >= 0; tmp--) {
    digitalWrite(LED_Pins[Old_LED], LOW);  // Turn off previous LED
    digitalWrite(LED_Pins[tmp], HIGH);     // Turn on actual LED
    Old_LED = tmp;                         // Save current LED into old LED variable
    delay(100);                            // Delay 100ms
  }
}

Här är en hel del nya saker i detta programmet. Har man många saker som beter sig på samma sätt som i detta fallet alla våra 8 lysdioder (de är alla anslutna till olika utgångar), så kan man lägga upp dem i en s.k. array. En array är en följd av samma variabeltyp. Vi har 8 lysdioder och vill på ett så enkelt sätt hantera dessa i programmet. Så istället för att tilldela 8 olika variabler, en för varje LED (=8 rader kod med olika variabelnamn), så skapar man en array som nedan. Variabelnamnet är samma, men för att nå första lysdiodens utgång skriver man LED_Pins[0] (vilket innehåller värdet 2) och för att nå sista LED_Pins[7] (vilket innehåller värdet 9).

// LED Pin Variables in an Array, First LED is attached to I/O 2 etc.
int LED_Pins[] = {2, 3, 4, 5, 6, 7, 8, 9};

I setup() skall vi sätta alla I/O (från 2 till 9) till utgångar, det gör vi med endast 3 rader kod istället för 8 som annars hade varit fallet om vi skulle sätta dem var för sig. Här har vi en ny funktion (for satsen). Den har 3 delar, den första används för att tilldela ett värde, i detta fall tilldelar vi variabeln tmp till 0. Andra delen är en test (likt en if sats) och vi skall upprepa allt inom krullparentesen {} som tillhör for satsen så länge detta uttryck är sant, dvs så länge tmp är mindre än 8. Sista delen ändrar vi värdet som skall testas, i detta fallet ökar vi variablen tmp med ett (tmp++ betyder samma sak som tmp = tmp + 1). Så for satsen kommer att snurra 8 varv och sätta varje I/O från 2 till 9 till en utgång.

void setup() {
// Make sure all I/O for external LEDs are outputs. 
  for (tmp = 0; tmp < 8; tmp++) {
    pinMode(LED_Pins[tmp], OUTPUT);
  }
}

I loop() finns två for satser, den första snurrar från 1-7, dvs. skippar första utgången och anledningen till detta är att vi inte skall få de yttersta lysdioderna att lysa dubbelt så länge som som de andra 6 i mitten. I början på programmet tilldelade vi en variabel som heter Old_LED till 0, det är den första lysdioden (gul), så det första som händer i for satsen är att vi släcker denna lysdiod (första gången är den ju redan släckt, men nästa runda kommer den vara tänd och måste släckas). Sedan tänder vi nästa lysdiod, sparar tmp värdet i Old_LED för att komma ihåg nästa runda vilken lysdiod som varit tänd, så den släcks innan nästa tänds osv. Slutligen väntar vi i 100mS.

// Rotate one LED at a time upwards
  for (tmp = 1; tmp < 8; tmp++) {
    digitalWrite(LED_Pins[Old_LED], LOW);  // Turn off previous LED
    digitalWrite(LED_Pins[tmp], HIGH);     // Turn on actual LED
    Old_LED = tmp;                         // Save current LED into old LED variable
    delay(100);                            // Delay 100ms
  }

Nästa for sats gör i princip samma sak som första, fast på andra hållet. Vi börjar med den 7 lysdioden och går ner 1 (notera att array:en börjar på 0, därav går den från 6 till 0). Vi snurrar i for satsen tills tmp variabeln inte är större eller lika med 0 (tmp– är samma sak som tmp = tmp – 1, dvs räkna ner värdet med 1).

// Rotate one LED at a time downwards
  for (tmp = 6; tmp >= 0; tmp--) {
    digitalWrite(LED_Pins[Old_LED], LOW);  // Turn off previous LED
    digitalWrite(LED_Pins[tmp], HIGH);     // Turn on actual LED
    Old_LED = tmp;                         // Save current LED into old LED variable
    delay(100);                            // Delay 100ms
  }

Kompilera och ladda upp koden till utvecklingskortet och vi kommer att ha ett rinnande ljus där varje lysdiod är tänd 100mS, först rinner det upp och sen ner. Vi kommer att ha samma koppling för nästa lektion och med den läsa av en analog ingång med potentiometern.

Föregående Sida    –    Nästa Sida