esp8266控制ws2813b灯条
时间:2023-09-28 14:37:02
我们知道ws2812是三线系统。三条线包括:正负电源和信号线。购买成本相对便宜,实用性强。只有一条信号线才能控制多个灯。ws2812系列不包括断点续传功能,即中间的灯坏了,信号不会向下传输。如果响应断点续传功能,可以考虑以下几点ws2813b如下图所示:
在库管理工具搜pixel,选择Adafruit NeoPixel,安装时选择最新版本。
接线,如果灯条不长,电源直接esp8266上的5V、GND,若灯条较长,建议外接电源,esp8266的GND和灯条GND连接共地,使用信号线D0、使用一条线,具有断点续传功能。
一、灯光简单
#include #define PIN 0 ///信号输出引脚GPIO0 #define NUMPIXELS 12 //灯个数 Adafruit_NeoPixel led(NUMPIXELS, PIN, NEO_GRB NEO_KHZ800); void setup() { led.begin(); led.setBrightness(255); //设置亮度 (0~255) } void loop() { for (int j = 0; j < 13; j ) { led.setPixelColor(j, led.Color(100, 90, 255)); led.show(); delay(50); } delay(3000); for (int j = 0; j < 13; j ) { led.setPixelColor(j, led.Color(255,0,);//红色 led.show(); delay(50); } delay(3000); for (int j = 0; j < 13; j ) { led.setPixelColor(j, led.Color(0, 255,0));//绿色 led.show(); delay(50); } delay(3000); for (int j = 0; j < 13; j ) { led.setPixelColor(j, led.Color(0, 0, 255) led.show(); delay(50); } delay(3000); for (int j = 0; j < 13; j ) { led.setPixelColor(j, led.Color(255,255,);//黄色 led.show(); delay(50); } delay(3000); for (int j = 0; j < 13; j ) { led.setPixelColor(j, led.Color(255,97,);//橙色 led.show(); delay(50); } delay(3000); }
效果:
ws2813b演示视频
二、http控制亮灯
我们用的是apifox发送http消息,esp8266做http接收端、控制灯开关等及颜色。
#include #include #include //路由器WIFI和密码 const char* ssid = "***";//wifi为自己设置 const char* password = "***"; String message = ""; ///静态地址,网关,子网掩码 IPAddress local_IP(192, 168, 31, 112); IPAddress gateway(192, 168, 31, 1); IPAddress subnet(255, 255, 255, 0); //创建server WiFiServer server(80);//口号,随意修改,范围0-65535 #define PIN 0 //GPIO0接口 #define NUMPIXELS 12 ///彩灯数量 Adafruit_NeoPixel led(NUMPIXELS, PIN, NEO_GRB NEO_KHZ800); void setup() { //波特率 Serial.begin(115200); WiFi.config(local_IP, gateway, subnet);//设置静态IP WiFi.mode(WIFI_STA); WiFi.begin(ssid, password);//路由器WiFi名称和密码 //连接WIFI while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(WiFi.localIP()); server.begin(); led.begin(); led.setBrightness(255); //设置亮度 (0~255) } void loop() { if (WiFi.status() != WL_CONNECTED) { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } } DynamicJsonDocument doc(1024); WiFiClient incomingClient = server.available(); if (incomingClient) { // 客户端请求信息通过串口监视器输出 if (incomingClient.find("\r\n\r\n")) { while (incomingClient.available()) { message = message char(incomingClient.read()); } Serial.println(message); deserializeJson(doc, message); JsonObject obj = doc.as(); String action = obj["action"]; String num = obj["num"]; String color = obj["color"]; // 数据信息通过串口监控器输出分析 Serial.println(action); if (action == "open") { if (color == "red") { for (int i = 0; i < obj["num"].size(); i ) { int j = obj["num"][i].as(); led.setPixelColor(j, led.Color(255, 0, 0)); led.show(); delay(50); } } if (color == "blue") { for (int i = 0; i < obj["num"].size(); i ) { int j = obj["num"][i].as(); led.setPixelColor(j, led.Color(0, 0, 255)); led.show(); delay(50); } } if (color == "green") { for (int i = 0; i < obj["num"].size(); i ) { int j = obj["num"][i].as(); led.setPixelColor(j, led.Color(0, 255, 0)); led.show(); delay(50); } } } if (action == "close") { for (int i = 0; i < obj["num"].size(); i ) { int j = obj["num"][i].as(); led.setPixelColor(j, led.Color(0, 0, 0)); led.show(); delay(50); } } } String httpResponse = "HTTP/1.0 200 OK\r\n" "Connection: close\r\n" "Content-Type: application/json;\r\n" "\r\n" "{\"code\":1}"; incomingClient.print(httpResponse); message = ""; } }
aifox保护json信息内容如下:
{"action":"open",
"color":"red",
"num":[1,2,3]
}
解释:action是灯的状态:包括open close 两种
color是灯的颜色,设计的三种包括 red green blue
num:是指哪个灯,可以是单个,也可以是几个
简单说,就是你想让哪个灯什么颜色,什么状态
演示
http消息控制ws2813亮灯