完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、设计目标
三个电路板通过铜柱共地并固定,通过一根黑色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 #include 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; } } 不足之处还望各位大佬不吝赐教! |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
2461 浏览 0 评论
3341 浏览 9 评论
3022 浏览 16 评论
3514 浏览 1 评论
9118 浏览 16 评论
1243浏览 3评论
636浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
627浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2373浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1936浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-24 13:19 , Processed in 1.109138 second(s), Total 80, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号