我们知道ws2812是三线制的,三根线包括:电源正负极以及信号线,购买成本上比较便宜,实用性强,仅靠一根信号线就可以控制多个灯。但是ws2812系类部分不包含断点续传功能,就是中间的灯坏了,信号不会往下传输。如果响应断点续传功能,可以考虑下ws2813b这种灯条,如下图:
在库管理工具搜pixel,选择Adafruit NeoPixel,选择最新版进行安装。
接线,灯条不是很长的话,电源直接接esp8266上的5V、GND,如果灯条比较长,建议外接电源,esp8266的GND和灯条GND连接共地,信号线使用D0,使用一根线就可以了,具有断点续传功能。
一、简单亮灯
#include <Adafruit_NeoPixel.h>
#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,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,0));//黄色
led.show();
delay(50);
}
delay(3000);
for (int j = 0; j < 13; j++) {
led.setPixelColor(j, led.Color(255,97,0));//橙色
led.show();
delay(50);
}
delay(3000);
}
效果:
ws2813b演示视频
二、http控制亮灯
我们使用的是apifox发送http消息,esp8266做http接收端,控制灯开关等及颜色。
#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>
#include <ArduinoJson.h>
//路由器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<JsonObject>();
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<int>();
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<int>();
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<int>();
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<int>();
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 = "";
}
}
apifox保护json信息内容如下:
{"action":"open",
"color":"red",
"num":[1,2,3]
}
解释:action是灯的状态:包括open close 两种
color是灯的颜色,设计的三种包括 red green blue
num:是指哪个灯,可以是单个,也可以是几个
简单说,就是你想让哪个灯什么颜色,什么状态
演示
http消息控制ws2813亮灯