esp8266控制ws2813b灯条

我们知道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亮灯

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆啦哆小魔仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值