Prog Shield LED Strip

Fra HTX Arduino
Spring til navigation Spring til søgning
SW2812 LED Strip

WS2812 LED Strip er en række med RGB LED'er, der kan styres af en enkelt digital pin. Antallet af LED'er er begrænset af hvor meget strøm der kan leveres af Arduinoen.

Den viste strip har 18 LED'er og den den anvendte til eksemplet. Den er koblet op med en modstand (330-680 ohm), der fungerer som beskyttelse af både Arduino og LED-Strip ved fejltilslutning.

Software

Softwaren er baseret på et bibliotek lavet af Daniel Garcia[1], og kan downloades som en ZIP-fil fra Denne ZIP-fil. Biblioteket downloades og installeres som beskrevet under Arduinos biblioteker.

Anvendelsen af softwaren

Som alle andre biblioteker skal der sættes de grundlæggende ting op for at kontakte biblioteket og definere fugtsensoren, med ben og type osv.

// Bibliotek, der kan styre forskellige typer LED-strips, her iblandt WS2812
#include <FastLED.h>

#define LED_STRIP1   2  // LED strip på pin 2
#define NUM_LEDS    18  // Antal LED på strip

CRGB leds1[NUM_LEDS];   // Array med farveangivelse til hver LED

Til programmet anvendes enkelte variabler til styring af tid og farver:

int delayval = 100; // timing delay in milliseconds

int i;         // Tæller-variabel til at indeksere med
byte R = 0;    // Mængde af Rød
byte G = 255;  // Mængde af Grøn
byte B = 0;    // Mængde af Blå

Inde i setup() skrives en velkomst og der skal sættes gang i objektet ved hjælp af begin-metoden som vist her:

void setup() {
  Serial.begin(9600);
  delay(200);
  Serial.println("Demo af LED-Strip WS2812");
  // Opsætning af type, benforbindelse og data
  FastLED.addLeds<WS2812, LED_STRIP1, GRB>(leds1, NUM_LEDS);
}

I loop() genneløbes en forløkke med alle LED'er, hvor farven sættes og vises, og efter et delay slukkes det igen:

void loop() {
  for (i = 0; i < NUM_LEDS; i++){  // Løb alle LED igennem
    leds1[i] = CRGB(R, G, B);      // Sæt farven på den aktuelle LED
    FastLED.show(0);              // Vis alle dioder - parameter 50 er intensitet for alle (0-255)
    delay(200);                    // Vent 200 ms
    leds1[i] = CRGB(0, 0, 0);      // Sluk den aktuelle LED igen
  }
}

Koden laver et løbelys hen ad LED-Strippen, der gentages i det uendelige.

Anvendelse af millis() i softwaren

Koden i det viste eksempel anvender delay(), hvilket gør at koden er blokeret det meste af tiden. Hvis man vil uden om dette, så er løsningen at anvende millis(), der måler tiden på en anden måde, ved at bruge indbygget tidsmåling i Arduinoen.

Koden laver en lidt anden funktion, men ser ud på følgende måde:

// Bibliotek, der kan styre forskellige typer LED-strips, her iblandt WS2812
#include <FastLED.h>

#define LED_STRIP1 2  // LED strip på pin 3
#define NUM_LEDS 18   // Antal LED på strip

CRGB leds1[NUM_LEDS];  // Array med farveangivelse til hver LED

int i = 0;     // Tæller-variabel til at indeksere med
byte R = 255;    // Mængde af Rød (0 - 255)
byte G = 255;  // Mængde af Grøn (0 - 255)
byte B = 255;    // Mængde af Blå (0 - 255)
unsigned long time = 0;
const int interval = 200;
unsigned long startTime = 0;
unsigned long endTime = 0;

void setup() {  // Opsætning af type, benforbindelse og data
  Serial.begin(9600);
  FastLED.addLeds<WS2812, LED_STRIP1, GRB>(leds1, NUM_LEDS);
  delay(200);
}

void loop() {
  if ((millis() - time) > interval) {  // Er det tid til næste handling
    time = time + interval;            // Sæt tiden frem til næste handling
    i++;                               // Tæl frem til næste LED
    if (i >= NUM_LEDS) {               // Begræns tæller til antallet af LED
      for (i = 0; i < NUM_LEDS; i++) {
        leds1[i] = CRGB(0, 0, 0);  // Sluk den sidste LED igen
      }
      i = 0;
    }
    leds1[i] = CRGB(R, G, B);  // Sæt farven på den aktuelle LED
    startTime = micros();
    FastLED.show(50);            // Vis alle dioder
    endTime = micros();
    if (i == 12) {
      Serial.println(endTime - startTime);
    }
  }
}

Der er lavet et eksempel på kode med millis, hvor man med en knap kan stoppe og starte løbelyset på et hvilket som helst tidspunkt. Begge koder ligger i Denne ZIP-fil, og for at kunne anvende eksemplet med millis, så skal man have installeret ezButton biblioteket[2]. Dette kan hentes fra denne github side

#include <ezButton.h>

ezButton button(8);

Software baseret på et andet bibliotek

Softwaren er baseret på et bibliotek lavet af AdaFruit[3], og kan downloades som en ZIP-fil fra Denne side, eller denne ZIP-fil. Biblioteket downloades og installeres som beskrevet under Arduinos biblioteker.

Anvendelsen af softwaren

Som alle andre biblioteker skal der sættes de grundlæggende ting op for at kontakte biblioteket og definere fugtsensoren, med ben og type osv.

#include <Adafruit_NeoPixel.h>

#define PIN 2	 // input pin Neopixel is attached to

#define NUMPIXELS      18 // number of neopixels in strip

Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

Til programmet anvendes enkelte variabler til styring af tid og farver:

int delayval = 100; // timing delay in milliseconds

byte R = 0;    // Mængde af Rød (0 - 255)
byte G = 255;  // Mængde af Grøn (0 - 255)
byte B = 0;    // Mængde af Blå (0 - 255)

Inde i setup() skrives en velkomst og der skal sættes gang i objektet ved hjælp af begin-metoden som vist her:

void setup() {
  Serial.begin(9600);
  delay(200);
  Serial.println("Demo af LED-Strip WS2812");
  // Initialize the NeoPixel library.
  pixels1.begin();
}

I loop() genneløbes en forløkke med alle LED'er, hvor farven sættes og vises, og efter et delay slukkes det igen:

void loop() {
  for (int i=0; i < NUMPIXELS; i++) {
    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels1.setPixelColor(i, pixels1.Color(R, G, B));

    // This sends the updated pixel color to the hardware.
    pixels1.show();

    // Delay for a period of time (in milliseconds).
    delay(delayval);

    // Turn off the LED
    pixels1.setPixelColor(i, pixels1.Color(0, 0, 0));
  }
}

Koden laver et løbelys hen ad LED-Strippen, der gentages i det uendelige.

Anvendelse af millis() i softwaren

Koden i det viste eksempel anvender delay(), hvilket gør at koden er blokeret det meste af tiden. Hvis man vil uden om dette, så er løsningen at anvende millis(), der måler tiden på en anden måde, ved at bruge indbygget tidsmåling i Arduinoen.

Der er lavet et eksempel på kode med millis, hvor man med en knap kan stoppe og starte løbelyset på et hvilket som helst tidspunkt. Begge koder ligger i Denne ZIP-fil, og for at kunne anvende eksemplet med millis, så skal man have installeret ezButton biblioteket[4]. Dette kan hentes fra denne github side

#include <ezButton.h>

ezButton button(8);

Hardware

LED-Strip'en skal tilkobles programmerings-shieldet, så den får stel (GND) +5V forsyning og et signal, hvor der i den viste opstilling sættes en beskyttelsesmodstand i serie med signalet. LED-Strip'en kan i princippet forlænges efter ønske, og man vil stadig kunne tilgå hver enkelt LED. Det ligger i protokollen for den måde der kommunikeres med WS2812.

I det viste eksempel er der 18 LED'en koblet til, og hvis man tænder alle 18 med fuld kraft på Hvidt lys (alle farver skruet op), så kan man se at USB-porten har problemer med at forsyne Arduinoen - Power-LED'en bliver svagere, men den kan klare det uden at den resetter. Vil man arbejde med flere LED-Strips med mere lys i, så skal man overveje at tilføre ekstra forsyning. ADVARSEL - Hvis man sætter for høj en spænding på 5V forsyningen af Arduinoen, så kan det skade både Arduinoen OG en tilsluttet PC.

Layout

LED-Strippens placering på programmerings-shieldet kan ses her:
Layout-LED-Strip.png
Placering af LED-Strip på Programmerings-Shieldet - HUSK at vende den rigtigt

LED-Strippen placeres på pin 2, og vil på denne placering blokere for RF-Receiveren.

Alternativ placering

Hvis man ønsker at koble flere LED-Strips på Arduinoen, så kræver det en anden placering på programmerings-shieldet som det kan ses her:
Layout-LED-Strip-Alt.png
Alternative placeringer af LED-Strips på Programmerings-Shieldet - HUSK at vende dem rigtigt - Output pin nummer angivet

Man skal igen være opmærksom på hvor meget strøm man bruger - man kan evt. skrue ned for lysstyrken i hver enkelt LED.

Mulige ben med disse placeringer er pin 3, 8 og A5.

Disse placeringer blokerer så for Andre moduler, fordi benene genbruges.

Referencer

Programmerings-Shield
Programmerings-Shield Analogt Keyboard - Display - LED'er - Trykknapper - Analog - LM35 - Fugt Sensor - Servo Motor - RF-Transmitter - RF-Receiver - LED-Matrix - RFID-læser - IR-Modtager - GPS1 - GPS2 - Step Motor - Matrix Tastatur - Ultralyd Afstandsmåler - XY Joystick - LED Strip
I2C Enheder I2C Display - Barometer BMP085 - Barometer BMP180 - Accelerometer MMA7660 - Gyroskop MPU6050 - Kompas HMC5883 - Real Time Clock DS1307 - Real Time Clock DS3231 - I2C
Grundlæggende Oversigt - Monteringsvejledning - Testprogram - Programmering Shield Gammel version