Cerca codice

Tutorial ESP32 54/55 - Imposta il colore della striscia LED WS2812 tramite Wifi | Kit di apprendimento IoT ESP32 di SunFounder

Tutorial ESP32 54/55 - Imposta il colore della striscia LED WS2812 tramite Wifi | Kit di apprendimento IoT ESP32 di SunFounder

In questo tutorial, impareremo come controllare il colore di una striscia LED RGB WS2812 utilizzando un microcontrollore ESP32 tramite Wi-Fi. Utilizzando un selettore di colori, puoi scegliere colori diversi dal tuo dispositivo mobile o desktop e inviare queste informazioni alla striscia LED. Questo progetto mostra le capacità dell'ESP32, consentendo un'interazione senza soluzione di continuità con l'illuminazione LED attraverso un'interfaccia web.

ESP32-54-schermo-mobile-principale

Il microcontrollore ESP32 è dotato di Wi-Fi e Bluetooth, rendendolo una scelta versatile per applicazioni IoT. In questo progetto, ci concentreremo sulla funzionalità Wi-Fi per controllare la striscia LED. Gli utenti potranno scegliere i colori in modo dinamico, creando un'esperienza visivamente coinvolgente. Per ulteriori chiarimenti su questo progetto, assicurati di guardare il video (nel video a :00).

Hardware spiegato

I componenti principali per questo progetto includono il microcontrollore ESP32 e il nastro LED WS2812. L'ESP32 è un potente microcontrollore con capacità Wi-Fi integrate, che consente la comunicazione e il controllo wireless.

La striscia LED WS2812 è composta da LED RGB indirizzabili singolarmente, che ti permettono di impostare il colore di ciascun LED in modo indipendente. Ogni LED incorpora un circuito di controllo e un LED RGB all'interno di un unico pacchetto, il che semplifica il cablaggio e il controllo di più LED.

Dettagli del datasheet

Produttore Worldsemi
Numero di parte WS2812B
Tensione logica/di ingresso e uscita 3,5-5,3 V
Tensione di alimentazione 5 V
Corrente di uscita (per canale) 20 mA
Corrente di picco (per canale) 60 mA
Indicazioni sulla frequenza PWM 400 Hz
Soglie logiche di ingresso 0,3 × VDD (basso), 0,7 × VDD (alto)
Caduta di tensione / RDS(on)/ saturazione 0,5 V
Limiti termici -40 a +80 °C
Pacchetto 5050 SMD
Note / varianti Disponibile in diverse lunghezze e configurazioni.

  • Assicurati di fornire il giusto apporto di energia per evitare di danneggiare i LED.
  • Usa un comune terreno tra l'ESP32 e la striscia LED.
  • Mantieni le righe di dati brevi per evitare degradazione del segnale.
  • Considera di aggiungere un condensatore (1000 µF) across l'alimentazione per stabilità.
  • Utilizzare una resistenza (470 Ω) sulla linea dei dati per l'integrità del segnale.

Istruzioni di cablaggio

ESP32-12-WS2812-wiring

Per collegare l'ESP32 alla striscia LED WS2812, collegare i componenti come segue: Prima, collegare il pin 5V della striscia LED all'uscita 5V dell'ESP32. Successivamente, collegare il pin di terra (GND) della striscia LED a un pin GND sull'ESP32. Infine, collegare il pin dati della striscia LED (di solito etichettato come DI o Data In) al pin GPIO 13 sull'ESP32. Assicurarsi che tutte le connessioni siano sicure per garantire il corretto funzionamento.

Nel video, vengono brevemente menzionati metodi di cablaggio alternativi, ma la configurazione descritta qui è la configurazione raccomandata per prestazioni ottimali (nel video alle 03:00).

Esempi di codice e guida passo passo

Il codice inizia includendo le librerie necessarie per controllare la striscia LED WS2812 e impostare il server web. Il pin LED è definito comeLED_PINe il numero di LED nella striscia è impostato conNUM_LEDS.

#define LED_PIN 13 // NeoPixel LED strip
#define NUM_LEDS 8 // Number of LEDs
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800); 

Questo frammento inizializza la libreria NeoPixel e configura la striscia LED sul pin specificato.Adafruit_NeoPixeloggetto,strip, è ciò che utilizzerai per controllare i colori dei LED.

Successivamente, il codice inizializza il Wi-Fi e configura un server web per gestire le richieste in arrivo. L'SSID e la password per la rete sono definiti, consentendo all'ESP32 di connettersi al Wi-Fi.

const char *ssid = "your_SSID";
const char *password = "your_PASSWORD";
WebServer server(80);

In questo estratto, sostituisciyour_SSIDeyour_PASSWORDcon le tue attuali credenziali Wi-Fi. Questa connessione consente all'ESP32 di comunicare con i dispositivi sulla stessa rete, permettendo il controllo remoto della striscia LED.

La funzione principale per cambiare il colore del LED èsetColor(), che scorre ogni LED e imposta il suo colore in base ai valori RGB selezionati.

void setColor() {
  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, valueR, valueG, valueB); // Set the color of the i-th LED
    strip.show(); // Update the LED strip with the new colors
    delay(10); // Wait for 10 milliseconds
  }
}

Questa funzione garantisce che ogni LED nella striscia venga aggiornato con il colore selezionato. Il ritardo consente ai LED di cambiare colore in modo fluido. Mentre interagisci con l'interfaccia web, questa funzione verrà chiamata per riflettere le tue scelte di colore.

Dimostrazione / Cosa Aspettarsi

ESP32-54-schermo-mobile-1
ESP32-54-schermo-mobile-t-2

Quando la configurazione è completata, dovresti essere in grado di accedere all'interfaccia web tramite l'indirizzo IP dell'ESP32. Vedrai un selettore di colori che ti permette di scegliere qualsiasi colore, che verrà quindi inviato alla striscia LED. Se l'ESP32 perde la connessione Wi-Fi, la striscia lampeggerà in un colore di avviso, indicando il problema (nel video alle 14:30).

I comuni errori includono cablaggi errati, che possono portare a non accendere i LED, o all'uso di combinazioni SSID/password errate che impediscono all'ESP32 di connettersi alla rete. Controlla sempre due volte le tue connessioni e le tue credenziali.

Timestamp video

  • 00:00 Inizio
  • 2:01 Introduzione al progetto
  • 3:09 Documenti
  • 3:47 Spiegazione del colore RGB
  • 7:47 Cablaggio
  • Codice Arduino per WS2812 con WIFI spiegato 8:40
  • 19:35 Selezionare la scheda ESP32 e la porta COM nell'IDE di Arduino
  • 21:17 Controllo della striscia LED tramite wifi demo

Immagini

ESP32-12-WS2812-wiring
ESP32-12-WS2812-wiring
ESP32-54-movile-screen-1
ESP32-54-movile-screen-1
ESP32-54-movile-screen-t-2
ESP32-54-movile-screen-t-2
ESP32-54-movile-screen-main
ESP32-54-movile-screen-main
855-ESP32 Tutorial 54/55- Arduino code Set WS2812 LED Strip Color over Wifi
Lingua: C++
/*
 * Controlla RGB LED tramite wifi utilizzando ESP32
 * 
 * istruzioni video complete https://youtu.be/J_UFHk_T9aE
 * 📚⬇️ Scarica e pagina risorse https://robojax.com/RJT687
 * Scritto da Ahmad Shamshiri il 18 dicembre 2023
 * 
 * Guarda le istruzioni video per questo video:
 * 
 * Ho combinato la libreria DHT di Adafruit con il WebServer ESP8266, entrambi i link
 * Libreria DHT di Adafruit su GitHub: https://github.com/adafruit/DHT-sensor-library
 * e
 * ESP8266 su GitHub: https://github.com/esp8266/Arduino
 * 
 * Copyright (c) 2015, Majenko Technologies
 * Tutti i diritti riservati.
 * 
 * La redistribuzione e l'uso in forme di origine e binarie, con o senza modifiche,
 * sono consentiti a condizione che siano soddisfatte le seguenti condizioni:
 * 
 * Le redistribuzioni del codice sorgente devono mantenere il copyright sopra indicato, questa
 * lista di condizioni e il seguente avviso di non responsabilità.
 * 
 * Le redistribuzioni in forma binaria devono riprodurre il copyright sopra indicato, questa
 * lista di condizioni e il seguente avviso di non responsabilità nella documentazione e/o
 * altri materiali forniti con la distribuzione.
 * 
 * Né il nome di Majenko Technologies né i nomi dei suoi
 * contributori possono essere utilizzati per avallare o promuovere prodotti derivati da
 * questo software senza specifica autorizzazione scritta preventiva.
 * 
 * QUESTO SOFTWARE È FORNITO DAGLI DETENTORI DEL COPYRIGHT E DEI CONTRIBUTORI "COSÌ COM'È" E
 * QUALSIASI GARANZIA ESPRESSA O IMPLICITA, INCLUSI, MA NON LIMITATI A, LE GARANZIE IMPLICITE
 * DI COMMERCIABILITÀ E IDONEITÀ PER UN PARTICOLARE SCOPO SONO
 * DECLINATE. IN NESSUN CASO IL DETENTORE DEL COPYRIGHT O I CONTRIBUTORI SARANNO RESPONSABILI PER
 * DANNI DIRETTI, INDIRETTI, INCIDENTALI, SPECIALI, ESEMPLARI O CONSEQUENZIALI
 * (INCLUSI, MA NON LIMITATI A, L'ACQUISTO DI BENI O SERVIZI SOSTITUTIVI;
 * PERDITA D'USO, DATI O PROFITTI; O INTERRUZIONE DELL'ATTIVITÀ) IN QUALSIASI MODO CAUSATI E SU
 * QUALSIASI TEORIA DI RESPONSABILITÀ, SIA IN CONTRATTO, RESPONSABILITÀ DIRETTA O IN TORTO
 * (INCLUSO NEGLIGENZA O ALTRO) DERIVANTI IN QUALSIASI MODO DALL'USO DI QUESTO
 * SOFTWARE, ANCHE SE AVVISATI DELLA POSSIBILITÀ DI TALE DANNI.
 */
#include <Adafruit_NeoPixel.h> // Includi la libreria Adafruit NeoPixel

#define LED_PIN 13 // Striscia LED NeoPixel
#define NUM_LEDS 8 // Numero di LED
 // Crea un'istanza della classe Adafruit_NeoPixel
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);


 // colore iniziale della striscia LED
int valueR = 178; // da 0 a 255 per il Rosso
int valueG = 27; // da 0 a 255 per il Verde
int valueB = 84; // da 0 a 255 per il Blu

bool showSerialData = false;
String theColorR, theColorG, theColorB;
String theColor ="ff0000";

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>

const char *ssid = "dars";
const char *password = "hhhhhhhhhhh";

WebServer server(80);

void showColorPicker() {
  String page = "<!DOCTYPE html>\n";
  page +="<html>\n";
  page +="<body>\n";
  page +="<div style=\"zoom: 300%;\">\n";
  page +="<h2>Robojax RGB Color picker</h2>\n";
  page +="<p id=\"result\"></p>\n";
  page +="<form action=\"/color\">\n";
  page +="  <label for=\"favcolor\">Select your favorite color:</label>\n";
  page +="  <input type=\"color\" id=\"favcolor\" name=\"favcolor\" value=\"#";
  page += theColor;
  page +="\"><br><br>\n";
  page +="   <input type=\"submit\" value=\"Set Color\" />\n";
  page +="</form> \n</div>\n";
  page +="</body>\n";
  page +="</html>\n";

  server.send(200,  "text/html", page);


}

 // from https://stackoverflow.com/questions/44683071/convert-string-as-hex-to-hexadecimal
uint64_t StrToHex(const char* str)
{
  return (uint64_t) strtoull(str, 0, 16);
}

void getColor(){

 // server.send(200, "text/plain", messaggio);

  if(server.argName(0) == "favcolor")
  {
    String newColor = String(server.arg(0)); // ottieni l'argomento GET 0 e convertilo in una stringa
    theColor = newColor.substring(1); // rimuovi il simbolo # all'inizio del colore come #B2a48d
    theColorR = newColor.substring(1, 3); // estrai B2 da #B2a48d per esempio
    theColorG = newColor.substring(3, 5); // estrai a4 da #B2a48d per esempio
    theColorB = newColor.substring(5, 7); // estrae 8d da #B2a48d per esempio

    valueR = StrToHex(theColorR.c_str()); // convertire la String in HEX per R
    valueG = StrToHex(theColorG.c_str()); // convertire String in HEX per G
    valueB = StrToHex(theColorB.c_str()); // convertire Stringa in HEX per B
    if(showSerialData)
    {
      Serial.print("valueR: ");
      Serial.println(valueR);
      Serial.print("valueG: ");
      Serial.println(valueG);
      Serial.print("valueB: ");
      Serial.println(valueB );
    }

  }

  showColorPicker(); // assicurati che il selettore di colore sia visualizzato
 // server.send(200, "text/plain", messaggio);

}


void setColor()
{
  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, valueR, valueG, valueB); // Imposta il colore del LED i-esimo a rosso.
    strip.show(); // Aggiorna la striscia LED con i nuovi colori
    delay(10); // Aspetta 100 millisecondi
  }
}

void noConnection()
{
   for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, 255, 45, 0); // Imposta il colore del LED i-esimo a rosso.
    strip.show(); // Aggiorna la striscia LED con i nuovi colori
    delay(50); // Aspetta 100 millisecondi
  }

  delay(200);
   for (int i = NUM_LEDS-1; i >=0; i--) {
    strip.setPixelColor(i, 0, 255, 180); // Imposta il colore del LED i-esimo a rosso.
    strip.show(); // Aggiorna la striscia LED con i nuovi colori
    delay(50); // Aspetta 100 millisecondi
  }
}

void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";

  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }

  server.send(404, "text/plain", message);

}

void setup_wifi() {
  delay(10);
 // Iniziamo collegandoci a una rete WiFi.
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

 // Aspetta la connessione
  while (WiFi.status() != WL_CONNECTED) {
    noConnection();
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("Open: http: // ");
  Serial.print(WiFi.localIP());
  Serial.println(" to read temperature");

  if (MDNS.begin("robojaxRGB")) {
    Serial.println("MDNS responder started");
  }

}

void setup(void) {

  Serial.begin(115200);

  strip.begin(); // Inizializza la striscia NeoPixel
  strip.show(); // Imposta il colore iniziale su nero

  setup_wifi();

  server.on("/", showColorPicker); // mostra la pagina principale con il selettore di colori
 // server.on("/color", setColor);//cambia il colore del LED RGB WS2812


  server.on("/color", HTTP_GET, getColor);



  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
 // Robojax.com
    while (WiFi.status() != WL_CONNECTED) {
      setup_wifi();
    }

  server.handleClient();
 // showColorPicker();
  setColor();
  delay(300); // modifica questo in un valore più grande (1000 o più) se non hai bisogno di leggere molto spesso
 // Codice Robojax.com per ESP32 e DHT11 DHT22
}


Risorse e riferimenti

Nessuna risorsa ancora.

File📁

Nessun file disponibile.