Search Code

ESP32 Упатство 54/55 - Поставете боја на WS2812 LED лента преку WiFi | SunFounder's ESP32 IoT комплет за учење

ESP32 Упатство 54/55 - Поставете боја на WS2812 LED лента преку WiFi | SunFounder's ESP32 IoT комплет за учење

Во ова упатство, ќе научиме како да ја контролираме бојата на WS2812 RGB LED лента користејќи ESP32 микроконтролер преку Wi-Fi. Со користење на избирач на бои, можете да изберете различни бои од вашиот мобилен уред или десктоп и да ја испратите таа информација до LED лентата. Овој проект ги прикажува можностите на ESP32, овозможувајќи беспрекорна интеракција со LED осветлување преку веб интерфејс.

ESP32-54-movile-screen-main

ESP32 микроконтролерот е опремен и со Wi-Fi и Bluetooth, што го прави разновиден избор за IoT апликации. Во овој проект, ќе се фокусираме на Wi-Fi функционалноста за контрола на LED лентата. Корисниците ќе можат динамички да избираат бои, создавајќи визуелно привлечно искуство. За дополнителна јасност за овој проект, задолжително погледнете го видеото (во видеото на 00:00).

Објаснување на хардверот

Примарните компоненти за овој проект вклучуваат ESP32 микроконтролер и WS2812 LED лента. ESP32 е моќен микроконтролер со вградени Wi-Fi можности, што овозможува безжична комуникација и контрола.

WS2812 LED лентата се состои од поединечно адресирани RGB LED диоди, што ви овозможува да ја поставите бојата на секоја LED диода независно. Секоја LED диода вклучува контролно коло и RGB LED во едно пакување, што ја поедноставува жичната врска и контролата на повеќе LED диоди.

Детали од податочната табела

Производител Worldsemi
Број на дел WS2812B
Логички/IO напон 3.5–5.3 V
Напон на напојување 5 V
Излезна струја (по канал) 20 mA
Врвна струја (по канал) 60 mA
Насоки за PWM фреквенција 400 Hz
Влезни логички прагови 0.3 × VDD (ниско), 0.7 × VDD (високо)
Пад на напон / RDS(on) / заситување 0.5 V
Термички граници –40 до +80 °C
Пакување 5050 SMD
Белешки / варијанти Достапно во различни должини и конфигурации.

 

  • Обезбедете соодветно напојување за да избегнете оштетување на LED диодите.
  • Користете заедничка земја помеѓу ESP32 и LED лентата.
  • Чувајте ги линиите за податоци кратки за да спречите деградација на сигналот.
  • Размислете за додавање кондензатор (1000 µF) преку напојувањето за стабилност.
  • Користете отпорник (470 Ω) на линијата за податоци за интегритет на сигналот.

Инструкции за жична врска

ESP32-12-WS2812-wiring

За да го поврзете ESP32 со WS2812 LED лентата, поврзете ги компонентите на следниов начин: Прво, поврзете го 5V пинот на LED лентата со 5V излезот на ESP32. Потоа, поврзете го пинот за земја (GND) на LED лентата со GND пин на ESP32. Конечно, поврзете го пинот за податоци на LED лентата (обично означен како DI или Data In) со GPIO пин 13 на ESP32. Осигурете се дека сите врски се безбедни за да обезбедите правилна функционалност.

Во видеото, накратко се споменати алтернативни методи на жична врска, но поставувањето опишано овде е препорачаната конфигурација за оптимални перформанси (во видеото на 03:00).

Примери на код и објаснување

Кодот започнува со вклучување на потребните библиотеки за контрола на WS2812 LED лентата и поставување на веб серверот. Пинот за LED е дефиниран како LED_PIN и бројот на LED диоди во лентата е поставен со NUM_LEDS.

#define LED_PIN 13 // NeoPixel LED лента
#define NUM_LEDS 8 // Број на LED диоди
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800); 

Овој фрагмент ја иницијализира NeoPixel библиотеката и ја поставува LED лентата на одредениот пин. Adafruit_NeoPixel објектот, strip, е она што ќе го користите за контрола на боите на LED диодите.

Следно, кодот ја иницијализира Wi-Fi мрежата и поставува веб сервер за обработка на дојдовни барања. SSID и лозинката за мрежата се дефинирани, овозможувајќи му на ESP32 да се поврзе на Wi-Fi.

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

Во овој извадок, заменете ги your_SSID и your_PASSWORD со вашите вистински Wi-Fi акредитиви. Оваа врска му овозможува на ESP32 да комуницира со уреди на истата мрежа, овозможувајќи далечинска контрола на LED лентата.

Главната функција за промена на бојата на LED диодите е setColor(), која поминува низ секоја LED диода и ја поставува нејзината боја врз основа на избраните RGB вредности.

void setColor() {
  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, valueR, valueG, valueB); // Поставете ја бојата на i-тата LED диода
    strip.show(); // Ажурирајте ја LED лентата со новите бои
    delay(10); // Почекајте 10 милисекунди
  }
}

Оваа функција осигурува дека секоја LED диода во лентата е ажурирана со избраната боја. Доцнењето им овозможува на LED диодите непречено да ја менуваат бојата. Додека комуницирате со веб интерфејсот, оваа функција ќе се повикува за да ги одрази вашите избори на бои.

Демонстрација / Што да очекувате

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

Когато поставувањето е завршено, треба да можете да пристапите до веб-интерфејсот преку IP-адресата на ESP32. Ќе видите избирач на бои што ви овозможува да изберете која било боја, која потоа ќе биде испратена до LED-лентата. Ако ESP32 ја изгуби Wi-Fi врската, лентата ќе трепка со предупредувачка боја, што укажува на проблемот (во видеото на 14:30).

Вообичаени грешки вклучуваат неправилно поврзување, што може да доведе до тоа LED-светлата да не светнат, или користење неточни SSID/лозинка комбинации што го спречуваат ESP32 да се поврзе на мрежата. Секогаш проверувајте ги вашите врски и акредитиви.

Временски ознаки на видеото

  • 00:00 Почеток
  • 2:01 Вовед во проектот
  • 3:09 Документација
  • 3:47 Објаснување на RGB бојата
  • 7:47 Поврзување
  • 8:40 Објаснување на Arduino кодот за WS2812 со WIFI
  • 19:35 Избор на ESP32 плоча и COM порт во Arduino IDE
  • 21:17 Демонстрација на контролирање на LED лента преку wifi

Images

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
Language: 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  
}

Resources & references

No resources yet.

Files📁

No files available.