Search Code

Samouczek ESP32 54/55 - Ustaw kolor paska LED WS2812 przez Wi-Fi | Zestaw edukacyjny IoT ESP32 od SunFounder

Samouczek ESP32 54/55 - Ustaw kolor paska LED WS2812 przez Wi-Fi | Zestaw edukacyjny IoT ESP32 od SunFounder

W tym samouczku nauczymy się, jak sterować kolorem paska LED WS2812 RGB za pomocą mikrokontrolera ESP32 przez Wi-Fi. Korzystając z próbnika kolorów, możesz wybierać różne kolory ze swojego urządzenia mobilnego lub komputera i wysyłać te informacje do paska LED. Ten projekt pokazuje możliwości ESP32, umożliwiając płynną interakcję z oświetleniem LED poprzez interfejs internetowy.

ESP32-54-movile-screen-main

Mikrokontroler ESP32 jest wyposażony zarówno w Wi-Fi, jak i Bluetooth, co czyni go wszechstronnym wyborem do zastosowań IoT. W tym projekcie skupimy się na funkcjonalności Wi-Fi do sterowania paskiem LED. Użytkownicy będą mogli dynamicznie wybierać kolory, tworząc wizualnie angażujące doświadczenie. Aby uzyskać dodatkowe wyjaśnienia dotyczące tego projektu, koniecznie obejrzyj wideo (na wideo o 00:00).

Objaśnienie Sprzętu

Główne komponenty tego projektu to mikrokontroler ESP32 oraz pasek LED WS2812. ESP32 to wydajny mikrokontroler z wbudowaną obsługą Wi-Fi, umożliwiający bezprzewodową komunikację i sterowanie.

Pasek LED WS2812 składa się z indywidualnie adresowalnych diod LED RGB, co pozwala na ustawienie koloru każdej diody niezależnie. Każda dioda zawiera układ sterujący oraz diodę RGB w jednej obudowie, co upraszcza okablowanie i sterowanie wieloma diodami LED.

Szczegóły z Karty Katalogowej

Producent Worldsemi
Numer części WS2812B
Napięcie logiki/IO 3,5–5,3 V
Napięcie zasilania 5 V
Prąd wyjściowy (na kanał) 20 mA
Prąd szczytowy (na kanał) 60 mA
Zalecana częstotliwość PWM 400 Hz
Progi logiczne wejścia 0,3 × VDD (niski), 0,7 × VDD (wysoki)
Spadek napięcia / RDS(on) / nasycenie 0,5 V
Limity termiczne –40 do +80 °C
Obudowa 5050 SMD
Uwagi / warianty Dostępny w różnych długościach i konfiguracjach.

 

  • Zapewnij odpowiednie zasilanie, aby uniknąć uszkodzenia diod LED.
  • Użyj wspólnej masy między ESP32 a paskiem LED.
  • Trzymaj linie danych krótko, aby zapobiec degradacji sygnału.
  • Rozważ dodanie kondensatora (1000 µF) na zasilaniu dla stabilności.
  • Użyj rezystora (470 Ω) na linii danych dla integralności sygnału.

Instrukcje Okablowania

ESP32-12-WS2812-wiring

Aby podłączyć ESP32 do paska LED WS2812, połącz komponenty w następujący sposób: Najpierw podłącz pin 5V paska LED do wyjścia 5V ESP32. Następnie podłącz pin masy (GND) paska LED do pinu GND na ESP32. Na koniec podłącz pin danych paska LED (zwykle oznaczony jako DI lub Data In) do pinu GPIO 13 na ESP32. Upewnij się, że wszystkie połączenia są pewne, aby zapewnić prawidłowe działanie.

Na wideo krótko wspomniano o alternatywnych metodach okablowania, ale opisana tutaj konfiguracja jest zalecanym rozwiązaniem dla optymalnej wydajności (na wideo o 03:00).

Przykłady Kodu i Omówienie

Kod zaczyna się od dołączenia niezbędnych bibliotek do sterowania paskiem LED WS2812 i skonfigurowania serwera internetowego. Pin LED jest zdefiniowany jako LED_PIN, a liczba diod w pasku jest ustawiona za pomocą NUM_LEDS.

#define LED_PIN 13 // Pasek LED NeoPixel
#define NUM_LEDS 8 // Liczba diod LED
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800); 

Ten fragment inicjalizuje bibliotekę NeoPixel i konfiguruje pasek LED na określonym pinie. Obiekt Adafruit_NeoPixel, strip, będzie używany do sterowania kolorami diod LED.

Następnie kod inicjalizuje Wi-Fi i konfiguruje serwer internetowy do obsługi przychodzących żądań. Zdefiniowane są SSID i hasło sieci, umożliwiające ESP32 połączenie z Wi-Fi.

const char *ssid = "twoje_SSID";
const char *password = "twoje_HASLO";
WebServer server(80);

W tym fragmencie zastąp twoje_SSID i twoje_HASLO swoimi rzeczywistymi danymi logowania do Wi-Fi. To połączenie umożliwia ESP32 komunikację z urządzeniami w tej samej sieci, pozwalając na zdalne sterowanie paskiem LED.

Główną funkcją do zmiany koloru diod LED jest setColor(), która iteruje przez każdą diodę i ustawia jej kolor na podstawie wybranych wartości RGB.

void setColor() {
  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, valueR, valueG, valueB); // Ustaw kolor i-tej diody LED
    strip.show(); // Zaktualizuj pasek LED o nowe kolory
    delay(10); // Odczekaj 10 milisekund
  }
}

Ta funkcja zapewnia, że każda dioda w pasku jest aktualizowana wybranym kolorem. Opóźnienie pozwala diodom LED płynnie zmieniać kolor. Podczas interakcji z interfejsem internetowym funkcja ta będzie wywoływana, aby odzwierciedlić Twoje wybory kolorów.

Demonstracja / Czego Się Spodziewać

ESP32-54-movile-screen-1
ESP32-54-movile-screen-t-2

Po zakończeniu konfiguracji powinieneś mieć możliwość uzyskania dostępu do interfejsu webowego za pomocą adresu IP ESP32. Zobaczysz selektor kolorów, który pozwala wybrać dowolny kolor, a następnie zostanie on wysłany do paska LED. Jeśli ESP32 straci połączenie Wi-Fi, pasek zamiga kolorem ostrzegawczym, sygnalizując problem (na filmie w 14:30).

Do typowych pułapek należą nieprawidłowe podłączenia, które mogą spowodować, że diody LED się nie zaświecą, lub użycie nieprawidłowych kombinacji SSID/hasła, które uniemożliwiają ESP32 połączenie z siecią. Zawsze dokładnie sprawdzaj swoje połączenia i dane uwierzytelniające.

Znaczniki czasowe filmu

  • 00:00 Start
  • 2:01 Wprowadzenie do projektu
  • 3:09 Dokumentacja
  • 3:47 Wyjaśnienie koloru RGB
  • 7:47 Podłączenie
  • 8:40 Wyjaśnienie kodu Arduino dla WS2812 z WIFI
  • 19:35 Wybór płyty ESP32 i portu COM w Arduino IDE
  • 21:17 Demo sterowania paskiem LED przez wifi

Obrazy

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
Język: C++
/*
 * Control RGB LED over wifi using ESP32
 * 
 full video instrucions https://youtu.be/J_UFHk_T9aE
📚⬇️ Download and resource page https://robojax.com/RJT687
 * Written by Ahmad Shamshiri on Dec 18, 2023
 * 
 * Watch video instruciton for this video: 
 * 
 * I have combined DHT library of Adafruit with ESP8266 WebServer both links 
 * Adafruit DHT library on GitHub: https://github.com/adafruit/DHT-sensor-library
 * and 
 * ESP8266 on GitHub : https://github.com/esp8266/Arduino
 * 
   Copyright (c) 2015, Majenko Technologies
   All rights reserved.

   Redistribution and use in source and binary forms, with or without modification,
   are permitted provided that the following conditions are met:

 * * Redistributions of source code must retain the above copyright notice, this
     list of conditions and the following disclaimer.

 * * Redistributions in binary form must reproduce the above copyright notice, this
     list of conditions and the following disclaimer in the documentation and/or
     other materials provided with the distribution.

 * * Neither the name of Majenko Technologies nor the names of its
     contributors may be used to endorse or promote products derived from
     this software without specific prior written permission.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <Adafruit_NeoPixel.h> // Include the Adafruit NeoPixel library

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


//initial color of LED strip
int valueR = 178;//from 0 to 255 for Red
int valueG = 27;//from 0 to 255 for Green
int valueB = 84;//from 0 to 255 for Blue

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", message);

  if(server.argName(0) == "favcolor")
  {
    String newColor = String(server.arg(0));//get the GET ardument 0 and convert it to string
    theColor = newColor.substring(1);//remove the # sybmot from the begining of color like #B2a48d
    theColorR = newColor.substring(1, 3);//extract B2 from  #B2a48d for example
    theColorG = newColor.substring(3, 5);//extract a4 from  #B2a48d for example
    theColorB = newColor.substring(5, 7);//extract 8d from  #B2a48d for example
    
    valueR = StrToHex(theColorR.c_str());//convert String to HEX for R
    valueG = StrToHex(theColorG.c_str());//convert String to HEX for G
    valueB = StrToHex(theColorB.c_str());//convert String to HEX for B    
    if(showSerialData)
    {
      Serial.print("valueR: ");
      Serial.println(valueR);
      Serial.print("valueG: ");
      Serial.println(valueG);
      Serial.print("valueB: ");
      Serial.println(valueB );  
    }
   
  }

  showColorPicker();//make sure the color picker is shown
  //server.send(200, "text/plain", message);

}


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

void noConnection()
{
   for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, 255, 45, 0); // Set the color of the i-th LED to red
    strip.show(); // Update the LED strip with the new colors
    delay(50); // Wait for 100 milliseconds
  }

  delay(200);
   for (int i = NUM_LEDS-1; i >=0; i--) {
    strip.setPixelColor(i, 0, 255, 180); // Set the color of the i-th LED to red
    strip.show(); // Update the LED strip with the new colors
    delay(50); // Wait for 100 milliseconds
  }    
}

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);
  // We start by connecting to a WiFi network
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  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(); // Initialize the NeoPixel strip
  strip.show(); // Set initial color to black

  setup_wifi();

  server.on("/", showColorPicker);//show the main page with color picker
  //server.on("/color", setColor);//changes teh color on WS2812 RGB LED


  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);// change this to larger value (1000 or more) if you don't need very often reading
  // Robojax.com code for ESP32 and DHT11 DHT22  
}

Zasoby i odniesienia

Brak zasobów.

Pliki📁

Brak dostępnych plików.