Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!
  • Fermate
    Fermate

    ESP32 Adresserbare LED (9)

    Her er kode for å styre addresserbare LEDS

     

    Sitat
    #include "FastLED.h"
    #define NUM_LEDS 264
    CRGB leds[NUM_LEDS];
    #define PIN 4
     
    void setup()
    {
      FastLED.addLeds<WS2812, PIN, RGB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
    }
     
    void loop() {
       for(int i = 0; i < NUM_LEDS ; i++) {
        setAll(0,0,0);
        setPixel(i, 25, 0, 66);
        FastLED.show();
        delay(20);
      }
    }
     
    void setPixel(int Pixel, byte red, byte green, byte blue) {
       leds[Pixel].r = red;
       leds[Pixel].g = green;
       leds[Pixel].b = blue;
    }
     
    void setAll(byte red, byte green, byte blue) {
      for(int i = 0; i < NUM_LEDS; i++ ) {
        setPixel(i, red, green, blue);
      }
     showStrip();
    }

     

    Bibliotekene er:

    image.png

     

    Litt om LED

    Å slå på en LED er vanligvis noe av det aller første en gjør når en starter med å leke med ESP32.

    ESP32 har til og med en onboard LED på pinne 2 som en kan bruke til testing uten eksterne komponenter.

     

    En LED har ingen (stor) indre motstand som en lyspære og må ha en ekstern motstand for å begrense strømmen slik at den ikke brenner opp.

     

    Max støm på LEDen finner du i spesifiksjonen på den, der finner du også spenningsfallet over selve LEDen (Forward Voltage). Om den site ikke er oppgitt kan du slå den opp (typisk) i en tabell. Her er en kalkulator for motstand:
    https://www.digikey.com/en/resources/conversion-calculators/conversion-calculator-led-series-resistor

     

    Husk at ESP32 pinnen selv ikke tåler mer enn typisk 20mA. (Noen sier 40mA)

     

    Det lange beinet skal til +:

     

    image.png

     

    Skal du ha 3 LEDs (Feks Rød, gul og Grønn) må du bruke 3 pinner på ESP32en og en egen motstand for hver LED.

     

    RGB Led

    Men det finnes LED som har alle 3 fargene bygget inn i samme LED, -en RGB LED.
    Her er alle mins koblet sammen og ført ut på den lengste pinnen:

     

    image.png

     

    OBS De finnes både i "common Anode" og "Common Catode", husk å sjekke hva du kjøper.

    Her må du fremdeles ha en motstand for hver farge og bruke 3 pinner.

     

    RGB LED Strips

    De første LED stripene som kom var koblet slik at alle LEDene hadde sin egen motstand og fargene var ført ut på hver sin tilkobling:

     

    image.png

     

    Disse oppfører seg altså litt som en RBG LED men drar veldig mye strøm på grunn av alle LEDene. Du kan altså ikke koble disse direkte til pinner på ESP32en men må sette en driver-boks i mellom eller en havlvleder som feks en MOS-Fet. (Det kommer en egen guid senere om MOS-Fet)

     

    For å få hvitt lys skal en slå på både Rød, grønn og Blå samtidig. Dette blir ikke helt hvitt så derfor ble det laget striper med en egen hvit LED i tillegg: RGBW. Til interiør belysning var det ønskelig med en varmere hvit og derfor kom RGBWW som har enda en ekstra LED som er warm-white.

     

    Adresserbare LED

    MEN fordi LEDstrips ble så poppulære bygget man etterhvert inn en egen liten IC på hver eneste LED på stripen slik at disse kunne styres med et signal fra ESP32en. Dette gjorde også at en kunne styre hver enkelt LED på stripen helt separat og ikke alle de RØD samtidig slik som på RGB stripene. Senere ble disse ICene integrert i selve LEDen.

     

    Disse LED stippene har altså bare 3 tilkoblinger: + - og data og hver IC sender dataene videre til nestemann.
    De trenger ingen motstander eller MOS-Fet og har egen strøm strømforskyning som kan være 24V for å kunne ha lange striper uten spenningsfall.

    Adresseringen er "relativ" slik at førstemann på stripa er nr 0 og nestemann er nr 1 osv. Dette skjer ved at ICen "teller opp" adressen med 1 og sender videre. Du kan altså klippe og skjøte hvor du vil og adressene er fremdeles fortløpende fra den første som får data og videre bortover. OBS Det betyr osgå at stripene har en rettning som du må følge når du kobler. Blir det brudd i datastrømmen slukker hele resten av rekka. De har derfor begynt å produsere striper med en esktra backup datakanal (merket BO - BI)

     

    image.png

     

     

     

    Enkelt Adresserbare LED

     

    Det finnes også enkelt LED som er adresserbare. Jeg er veldig glad i slike for å la ESP32en kommunisere statuser med omverdenen. Her trenger jeg bare en pinne på ESP32en og en motstand (330 ohm) mellom ESP32en og LEDen og så kan jeg koble meg videre med så mange ekstra LED jeg bare trenger uten å bruke flere pinner eller motstander 🙂 

    WS2811_5mm.jpg

    image.png

     

     

    Kode

    Koden for å jobbe med Adresserbare LED er super enkel. Alt skjer i biblioteket FastLED:

     

    #include "FastLED.h"
    #define NUM_LEDS 264 \\ Antall LED på stripa
    CRGB leds[NUM_LEDS]; \\ Et "array" led LEDene
    #define PIN 4 \\ Pinnen der datakabelen på stripen er tilkoblet
     
    void setup()
    {
      FastLED.addLeds<WS2812, PIN, RGB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
    }
     
    WS2812 er typen IC på LED stripen.
     
    Så er det bare å skru på en og en LED slik:
     leds[Pixel].r = red;
     leds[Pixel].g = green;
     leds[Pixel].b = blue;
     
    der Pixel er adressen til LEDen, og første LED er 0.
    og red, green, blue er verdier fra 0 til 255 for styrken på lyset.
     
    Eller slik om du foretrekker det:
    leds[Pixel] = CRGB(Red, Green, Blue);
    eller slik
    leds[Pixel] = CHSV(Hue, Saturation, Value);
     
    Når du har satt alle veridene på alle LEDene du ønsker, sender du det til stripe med denne kommandoen:
    FastLED.show();

     

    Du lager ganske fort en par forenklings rutiner som feks disse:

     

    void setPixel(int Pixel, byte red, byte green, byte blue) {
       leds[Pixel].r = red;
       leds[Pixel].g = green;
       leds[Pixel].b = blue;
    }
     
    void setAll(byte red, byte green, byte blue) {
      for(int i = 0; i < NUM_LEDS; i++ ) {
        setPixel(i, red, green, blue);
      }
     showStrip();
    }
     
    Jeg har ikke noe MQTT kode her for det klarer dere selv, men jeg har en liten kodesnutt som kjøres dersom barnebarna roper "Alexa show me rainbow" som dere kan få:
     
    Sitat
      MQTTclient.subscribe("takLEDClient/rainbow", [](const String & payload) {
      Serial.print("rainbow: ");
        Serial.println(payload);
        rainbowLoop(payload.toInt());
        show_last_colors(); // reset
      });
     
    void rainbow(){
      static uint8_t hue;
      for(int i = 0; i < NUM_LEDS; i++){
        leds[i] = CHSV((i * 256 / NUM_LEDS) + hue, 255, 255);
      }
      FastLED.show();
      hue++;
    }
    void rainbowLoop(int nSec){
      long millisIn = millis();
      long loopTime = nSec * 1000; //  seconds
      while(millis() < millisIn + loopTime){
        rainbow();
        delay(5);
      }
    }      

     

     
     

    Brukertilbakemelding

    Anbefalte kommentarer

    Det er ingen kommentarer å vise.



    Bli med i samtalen

    Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

    Gjest
    Skriv en kommentar...

    ×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

      Du kan kun bruke opp til 75 smilefjes.

    ×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

    ×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

    ×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.




×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.