Código de Pesquisa

Tutorial ESP32 54/55 - Defina a Cor da Fita de LED WS2812 via Wifi | Kit de Aprendizado IoT ESP32 da SunFounder

Tutorial ESP32 54/55 - Defina a Cor da Fita de LED WS2812 via Wifi | Kit de Aprendizado IoT ESP32 da SunFounder

Neste tutorial, aprenderemos como controlar a cor de uma fita de LED RGB WS2812 usando um microcontrolador ESP32 via Wi-Fi. Ao utilizar um seletor de cores, você pode escolher diferentes cores do seu dispositivo móvel ou desktop e enviar essas informações para a fita de LED. Este projeto demonstra as capacidades do ESP32, permitindo uma interação fluida com a iluminação LED através de uma interface web.

ESP32-54-tela-móvel-principal

O microcontrolador ESP32 é equipado com Wi-Fi e Bluetooth, tornando-o uma escolha versátil para aplicações IoT. Neste projeto, vamos nos concentrar na funcionalidade do Wi-Fi para controlar a fita de LED. Os usuários poderão escolher cores dinamicamente, criando uma experiência visualmente envolvente. Para mais clareza sobre este projeto, não deixe de conferir o vídeo (no vídeo em 00:00).

Hardware Explicado

Os componentes principais deste projeto incluem o microcontrolador ESP32 e a fita de LED WS2812. O ESP32 é um microcontrolador poderoso com capacidades de Wi-Fi integradas, permitindo comunicação e controle sem fio.

A fita LED WS2812 consiste em LEDs RGB endereçáveis individualmente, permitindo que você defina a cor de cada LED de forma independente. Cada LED incorpora um circuito de controle e um LED RGB dentro de um único pacote, o que simplifica a fiação e o controle de múltiplos LEDs.

Detalhes da Ficha Técnica

Fabricante Worldsemi
Número da peça WS2812B
Tensão de lógica/entrada e saída 3,5-5,3 V
Tensão de alimentação 5 V
Corrente de saída (por canal) 20 mA
Corrente de pico (por canal) 60 mA
Orientação sobre a frequência PWM 400 Hz
Lugares de limiar lógico de entrada 0,3 × VDD (baixo), 0,7 × VDD (alto)
Queda de tensão / RDS(on)/ saturação 0,5 V
Limites térmicos -40 a +80 °C
Pacote 5050 SMD
Notas / variantes Disponível em vários comprimentos e configurações.

  • Garanta uma alimentação elétrica adequada para evitar danos aos LEDs.
  • Use um terra comum entre o ESP32 e a fita de LED.
  • Mantenha as linhas de dados curtas para evitar a degradação do sinal.
  • Considere adicionar um capacitor (1000 µF) entre a fonte de alimentação para estabilidade.
  • Use um resistor (470 Ω) na linha de dados para integridade do sinal.

Instruções de Fiação

ESP32-12-WS2812-wiring

Para conectar o ESP32 à fita de LED WS2812, conecte os componentes da seguinte forma: Primeiro, conecte o pino de 5V da fita de LED à saída de 5V do ESP32. Em seguida, conecte o pino de terra (GND) da fita de LED a um pino GND no ESP32. Por fim, conecte o pino de dados da fita de LED (geralmente rotulado como DI ou Data In) ao pino GPIO 13 no ESP32. Certifique-se de que todas as conexões estejam seguras para garantir o funcionamento adequado.

No vídeo, métodos alternativos de fiação são brevemente mencionados, mas a configuração descrita aqui é a configuração recomendada para desempenho ideal (no vídeo às 03:00).

Exemplos de Código e Passo a Passo

O código começa incluindo as bibliotecas necessárias para controlar a fita de LED WS2812 e configurar o servidor web. O pino do LED é definido comoLED_PINe o número de LEDs na fita é definido comNUM_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); 

Este trecho inicializa a biblioteca NeoPixel e configura a fita de LED no pino especificado.Adafruit_NeoPixelobjeto,strip, é o que você usará para controlar as cores do LED.

Em seguida, o código inicializa o Wi-Fi e configura um servidor web para gerenciar solicitações recebidas. O SSID e a senha da rede são definidos, permitindo que o ESP32 se conecte ao Wi-Fi.

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

Neste excerto, substituayour_SSIDeyour_PASSWORDcom suas credenciais de Wi-Fi atuais. Essa conexão permite que o ESP32 se comunique com dispositivos na mesma rede, possibilitando o controle remoto da fita de LED.

A função principal para mudar a cor do LED ésetColor(), que itera por cada LED e define sua cor com base nos valores RGB selecionados.

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

Esta função garante que cada LED na fita seja atualizado com a cor selecionada. O atraso permite que os LEDs mudem de cor suavemente. À medida que você interage com a interface web, esta função será chamada para refletir suas escolhas de cor.

Demonstração / O que Esperar

ESP32-54-tela-móvel-1
ESP32-54-tela-móvel-t-2

Quando a configuração estiver concluída, você deverá conseguir acessar a interface da web pelo endereço IP do ESP32. Você verá um seletor de cores que permite escolher qualquer cor, que será então enviada para a fita de LED. Se o ESP32 perder a conexão Wi-Fi, a fita irá piscar uma cor de alerta, indicando o problema (no vídeo às 14:30).

Os erros comuns incluem ligações incorretas, que podem fazer com que os LEDs não acendam, ou o uso de combinações incorretas de SSID/senha que impedem o ESP32 de se conectar à rede. Sempre verifique suas conexões e credenciais.

Marcação de tempo do vídeo

  • 00:00 Iniciar
  • 2:01 Introdução ao projeto
  • 3:09 Docs
  • 3:47 Explicação da cor RGB
  • 7:47 Fiação
  • Código Arduino para WS2812 com WIFI explicado às 8:40
  • 19:35 Selecionando a placa ESP32 e a porta COM no Arduino IDE
  • 21:17 Demonstração de controle de fita de LED via wifi

Imagens

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
Idioma: C++
/*
 * Controle o LED RGB via wifi usando ESP32
 * 
 * instruções em vídeo completas https://youtu.be/J_UFHk_T9aE
 * 📚⬇️ Página de download e recursos https://robojax.com/RJT687
 * Escrito por Ahmad Shamshiri em 18 de dezembro de 2023
 * 
 * Assista à instrução em vídeo para este vídeo:
 * 
 * Combinei a biblioteca DHT da Adafruit com o WebServer ESP8266, ambos os links
 * Biblioteca DHT da Adafruit no GitHub: https://github.com/adafruit/DHT-sensor-library
 * e
 * ESP8266 no GitHub: https://github.com/esp8266/Arduino
 * 
 * Copyright (c) 2015, Majenko Technologies
 * Todos os direitos reservados.
 * 
 * A redistribuição e o uso em formas de fonte e binárias, com ou sem modificação,
 * são permitidos desde que as seguintes condições sejam atendidas:
 * 
 * As redistribuições do código-fonte devem manter o aviso de copyright acima, esta
 * lista de condições e a seguinte isenção de responsabilidade.
 * 
 * As redistribuições em forma binária devem reproduzir o aviso de copyright acima, esta
 * lista de condições e a seguinte isenção de responsabilidade na documentação e/ou
 * outros materiais fornecidos com a distribuição.
 * 
 * Nem o nome da Majenko Technologies nem os nomes de seus
 * colaboradores podem ser usados para endossar ou promover produtos derivados deste
 * software sem permissão prévia por escrito.
 * 
 * ESTE SOFTWARE É FORNECIDO PELOS DETENTORES DE DIREITOS AUTORAIS E COLABORADORES "NO ESTADO EM QUE SE ENCONTRA" E
 * QUALQUER GARANTIA EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS
 * IMPLÍCITAS DE COMERCIABILIDADE E ADEQUAÇÃO A UM PROPÓSITO ESPECÍFICO SÃO
 * RENUNCIADAS. EM NENHUMA CIRCUNSTÂNCIA O DETENTOR DOS DIREITOS AUTORAIS OU COLABORADORES SERÃO RESPONSÁVEIS POR
 * QUAISQUER DANOS DIRETOS, INDIRETOS, INCIDENTAL, ESPECIAL, EXEMPLAR OU CONSEQUENCIAL
 * (INCLUINDO, MAS NÃO SE LIMITANDO À AQUISIÇÃO DE BENS OU SERVIÇOS SUBSTITUTIVOS;
 * PERDA DE USO, DADOS OU LUCROS; OU INTERRUPÇÃO DE NEGÓCIOS) AINDA QUE CAUSADOS E EM
 * QUALQUER TEORIA DE RESPONSABILIDADE, SEJA EM CONTRATO, RESPONSABILIDADE OBJETIVA OU DELITO
 * (INCLUINDO NEGLIGÊNCIA OU OUTERS) QUE SURJAM DE QUALQUER FORMA DO USO DESTE
 * SOFTWARE, MESMO SE AVISADO SOBRE A POSSIBILIDADE DE TAL DANO.
 */
#include <Adafruit_NeoPixel.h> // Inclua a biblioteca Adafruit NeoPixel

#define LED_PIN 13 // Fita LED NeoPixel
#define NUM_LEDS 8 // Número de LEDs
 // Crie uma instância da classe Adafruit_NeoPixel
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);


 // cor da luz LED inicial
int valueR = 178; // de 0 a 255 para Vermelho
int valueG = 27; // de 0 a 255 para Verde
int valueB = 84; // de 0 a 255 para Azul

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

  if(server.argName(0) == "favcolor")
  {
    String newColor = String(server.arg(0)); // obtenha o argumento GET 0 e converta-o em string
    theColor = newColor.substring(1); // remova o símbolo # do início da cor como #B2a48d
    theColorR = newColor.substring(1, 3); // extraia B2 de #B2a48d, por exemplo
    theColorG = newColor.substring(3, 5); // extraia a4 de #B2a48d, por exemplo
    theColorB = newColor.substring(5, 7); // extraia 8d de #B2a48d, por exemplo

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

  }

  showColorPicker(); // certifique-se de que o seletor de cores esteja exibido
 // server.send(200, "text/plain", mensagem);

}


void setColor()
{
  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, valueR, valueG, valueB); // Defina a cor do LED de índice i como vermelho.
    strip.show(); // Atualize a fita de LED com as novas cores.
    delay(10); // Aguarde 100 milissegundos
  }
}

void noConnection()
{
   for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, 255, 45, 0); // Defina a cor do LED de índice i como vermelho.
    strip.show(); // Atualize a fita de LED com as novas cores.
    delay(50); // Aguarde 100 milissegundos
  }

  delay(200);
   for (int i = NUM_LEDS-1; i >=0; i--) {
    strip.setPixelColor(i, 0, 255, 180); // Defina a cor do LED de índice i como vermelho.
    strip.show(); // Atualize a fita de LED com as novas cores.
    delay(50); // Aguarde 100 milissegundos
  }
}

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);
 // Começamos conectando a uma rede WiFi.
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

 // Aguarde a conexão
  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(); // Inicialize a tira NeoPixel
  strip.show(); // Defina a cor inicial como preta

  setup_wifi();

  server.on("/", showColorPicker); // mostre a página principal com seletor de cores
 // server.on("/color", setColor);//muda a cor no 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); // mude isso para um valor maior (1000 ou mais) se você não precisar ler com frequência
 // Código Robojax.com para ESP32 e DHT11 DHT22
}


Recursos e referências

Ainda não há recursos.

Arquivos📁

Nenhum arquivo disponível.