物联网系列⑤——基于ESP8266与点灯科技平台的氛围灯设计(接入小爱同学)


一、设计目标

  1. 使用点灯科技平台接入物联网,可通过手机点灯APP控制氛围灯的开关,该氛围灯拥有一个系统默认颜色,若用户想显示其他颜色可通过手机点灯APP进行设置
  2. 接入小爱同学,通过语音控制氛围灯的开关
  3. 通过外接TTL串口下载模块给ESP8266程序烧写,通过跳线帽手动拉低GPIO0电平,手动RST
  4. 供电使用LM1117 5V转3V设计,可选择使用Mico USB和DC 5.5*2.5mm接口进行5V供电
  5. 引脚使用通用设计,方便外设扩展
  6. LED指示灯指示系统运行状态

二、电路设计

顶视图
底视图

电路板
      三个电路板通过铜柱共地并固定,通过一根黑色5V电源线进行板间供电,组成塔式结构。不同层数的电路板执行不同的功能,第一层为点灯科技+小爱对加湿器开关控制。第二层为点灯科技+小爱控制WS2812B灯带。第三层为ESP8266作为网络服务器

三、思路介绍

      WS2812b为3线控制,分别为VCC,Din(控制引脚),GND。数据传输机制为Din数据输入到第一颗RGB光源后,该光源会将数据传输到第二颗,第二颗再将数据传输到第三颗,以此类推来完成数据传输。在arduino IDE中使用Adafruit_NeoPixel库实现对WS2812b的控制。氛围灯系统默认颜色存储于代码中的变量,在使用默认颜色时调用即可。若想让氛围灯显示其他颜色则可以通过点灯APP下发颜色命令来实现,并将该颜色数值存储于临时变量,这意味着只要电路板不断电,灯带就可以自由地在系统默认颜色和我们手动设置的颜色之间进行切换。

四、ESP8266代码

#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET

#include <Blinker.h>
#include <Adafruit_NeoPixel.h>

char auth[] = "**********";//设备号
char ssid[] = "**********";//无线账号
char pswd[] = "**********";//无线密码

int LED_OPEN=0;//氛围灯标志位
int Control_OPEN=0;//氛围灯颜色控制标志位

int count=0;//LED翻转计数器
int send_data=0;//发送命令标志位
uint8_t colorR1 ;//用于颜色存储
uint8_t colorG1 ;
uint8_t colorB1 ;
uint8_t colorR2 ;//用于颜色存储2
uint8_t colorG2 ;
uint8_t colorB2 ;
uint8_t colorR_Set= map(  0, 0, 255, 0, 255);//颜色默认值
uint8_t colorG_Set= map(255, 0, 255, 0, 255);//颜色默认值
uint8_t colorB_Set= map(242, 0, 255, 0, 255);;//颜色默认值

#define LED1 16
#define LED2 14
#define PIN D1
#define NUMPIXELS      57
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#define RGB_1 "RGBKey"

// 新建组件对象
BlinkerButton Button1("LED_Button");
BlinkerButton Button2("Control_Button");
BlinkerRGB RGB1(RGB_1);

//APP端颜色设置回调函数
void rgb1_callback(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value)
{
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    BLINKER_LOG("R value: ", r_value);
    BLINKER_LOG("G value: ", g_value);
    BLINKER_LOG("B value: ", b_value);
    BLINKER_LOG("Rrightness value: ", bright_value);

    uint8_t colorR = map(r_value, 0, 255, 0, bright_value);
    uint8_t colorG = map(g_value, 0, 255, 0, bright_value);
    uint8_t colorB = map(b_value, 0, 255, 0, bright_value);
    
    colorR2=colorR1 ;//存储
    colorG2=colorG1 ;
    colorB2=colorB1 ;
    
    colorR1=colorR ;//存储
    colorG1=colorG ;
    colorB1=colorB ;
    Button2.print("on");
    Control_OPEN=1;//氛围灯颜色调节
    send_data=1;//运行标志位为1
}

// 按下按键1即会执行该函数
void button1_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
    digitalWrite(LED1, !digitalRead(LED1));

    if(digitalRead(LED1)==0)
    {
      Button1.print("off");
      LED_OPEN=0;//关闭
     }
     else
     {
       Button1.print("on");
       LED_OPEN=1;//开启
      }
      send_data=1;//运行标志位为1
}
// 按下按键2即会执行该函数
void button2_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
    digitalWrite(LED2, !digitalRead(LED2));

    if(digitalRead(LED2)==0)
    {
      Button2.print("off");
      Control_OPEN=0;//关闭
     }
     else
     {
       Button2.print("on");
       Control_OPEN=1;//开启
      }
      send_data=1;//运行标志位为1
}
// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

}
//小爱同学处理函数
void miotPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        digitalWrite(LED2, HIGH);
        LED_OPEN=1;
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
        send_data=1;//运行标志位为1
    }
    else if (state == BLINKER_CMD_OFF) {
        digitalWrite(LED2, LOW);
        LED_OPEN=0;
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
        send_data=1;//运行标志位为1
    }
}

void setup() {
    // 初始化串口
    Serial.begin(115200);

    #if defined(BLINKER_PRINT)
        BLINKER_DEBUG.stream(BLINKER_PRINT);
    #endif

    // 初始化有LED的IO
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);
    pinMode(LED1, OUTPUT);
    digitalWrite(LED1, LOW);
    pinMode(LED2, OUTPUT);
    digitalWrite(LED2, LOW);
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd);
    pixels.begin();
    Blinker.attachData(dataRead);
    Button1.attach(button1_callback);//按键1
    Button2.attach(button2_callback);//按键2
    RGB1.attach(rgb1_callback);
    //小爱回调函数
    BlinkerMIOT.attachPowerState(miotPowerState);
}

void loop() {
    Blinker.run();
    count++;//led计数器
    if(send_data==1)//运行标志位为1
    {
        if(LED_OPEN==1 )//开启
        {
          if(Control_OPEN==1)//控制开启
          {
           // int r1=colorR2,g1=colorG2,b1=colorB2;
            
             for(int n = 0; n < NUMPIXELS; n++){
               pixels.setPixelColor(n, pixels.Color(colorR1,colorG1,colorB1));
               pixels.show();
              } 
          }
          else
          {
            int r=0,g=0,b=0;
            
              for(int i = 0; i < NUMPIXELS; i++){
                 pixels.setPixelColor(i, pixels.Color(colorR_Set,colorG_Set,colorB_Set));
                 pixels.show();
                }
          }   
        }
        else if (LED_OPEN==0)//关闭
        {
             uint8_t colorR = map(0, 0, 255, 0, 0);
             uint8_t colorG = map(0, 0, 255, 0, 0);
             uint8_t colorB = map(0, 0, 255, 0, 0);

             for(int i = 0; i < NUMPIXELS; i++){
                pixels.setPixelColor(i, pixels.Color(colorR,colorG,colorB));
                pixels.show();
                }
        }
         send_data=0;//运行标志位清0  
        
    }
    else
    {
      send_data=0;//运行标志位为0  
    }
    if(count==100)
    {
       digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
       count=0;
    }
}

点灯APP

      不足之处还望各位大佬不吝赐教!

更多推荐