Blinker项目实例:Nodemcu驱动ws2812(附项目代码)
!!!页面很难插入图片,完整请看附件!!!!!!页面很难插入图片,完整请看附件!!!!!!页面很难插入图片,完整请看附件!!!
##一、 实验目的和要求#(1)设计并开发一个网络应用软件系统 二、 实验内容和原理 实验内容: 本实验的目的是设计并开发一个物联网彩灯系统,用于智能化的居家氛围布置、照明。系统的操控方式为手机APP控制,通过MQTT远程实现。完成的功能有自由控制颜色、亮度,既可以所有的LED灯一起进行操作,也可以对单独LED等进行操作;一键彩灯,按下按钮,即可按照设定好的氛围光亮起彩灯,营造独特的氛围。本实验对氛围光只设定一个模式作为例子,具体应用时完全可以添加更多的模式。另外,彩灯不仅使用与氛围布置,还兼容学习场合,一键可以调整至护眼模式。 开发语言:C语言(Arduino平台) #三、 架构设计: 1、 硬件部分。硬件包括一块Nodemcu开发板、一个WS2812灯带、一台智能手机。 (1) Nodemcu开发板。NodeMCU,是一个开源的物联网平台,使用esp8266作为核心 它使用Lua脚本语言编程,同时也可以使用Arduino进行编程。硬件配置主要有16个GPIO引脚,可实现1个模拟I/O和11个数字I/O。通讯接口有一个USB口、一个串口和一个Wifi通讯模块。本实验主要用到GPIO引脚来驱动WS2812,使用Wifi模块连接网络与服务器、手机进行通讯。
(2) WS2812。WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和12V高压可编程定电流控制部分,有效保证了像素点光的颜色高度一致。数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。LED具有低电压驱动,环保节能,亮度高,散射角度大,一致性好,超低功率,超长寿命等优点。将控制电路集成于LED上面,电路变得更加简单,体积小,安装更加简便。 2、 软件部分。blinker是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、服务器端支持,使用公有云服务进行数据传输存储。可用于智能家居、数据监测等领域,可以帮助用户更好更快地搭建物联网项目。Blinker由服务器端、app端、设备端组成,可以部署到几乎所有物联网平台,使用WiFi、MQTT等方式接入,服务器端可以部署到阿里云、腾讯云、OneNET、百度云、AWS、google cloud等平台,通过界面布局器,DIY用户可自己拖拽布局设备控制界面,自由打造专属的物联网设备。![在这里插入图片描述](https://img-blog.csdnimg.cn/20200110140233598.png)3、 系统连接。(1)Nodemcu和WS2812的连接方式如下:
以上红色箭头分别是D7、GND和VCC,其中Nodemcu的Vcc和ws2812的Vcc相连,Nodemcu的GND和ws2812的GND相连,Nodemcu的D7和ws2812的S(信号线)相连。
需要注意的是,ws2812所有的灯全亮电流超过500mA,无法通过电脑进行供电,需要外接电源。因此ws2812其实有两根VCC和两根GND。这两根线是短路的,具体连接的时候一根GND连接Nodemcu的GND,另一根GND连接5V直流电源的GND。但是VCC不能两根都连,一根VCC连接5V直流电源,另外一根VCC悬空。另外,信号线和Nodemcu的D7相连即可。(1)Nodemcu和手机APP的通信。本实验没有直接搭建服务器,而是采用了blinker解决方案的服务器。Nodemcu需要处于一个有wifi的局域网环境下,通过wifi接入Internet。通讯使用MQTT方式,即便用户离开了现场也能够进行操控。Nodemcu将秘钥发送到blinker服务器并建立连接,手机APP通过开关按键发送秘钥到服务器同样建立连接。服务器识别到Nodemcu和客户端同时发来了秘钥后,开始在两者之间传递命令协议。每个命令的发出都需要两步,一是客户端向Nodemcu发送指令,二是Nodemcu返回一个确认信息,客户端接收到之后确认操作完成。 三、主要仪器设备1、一块Nodemcu开发板2、一个WS2812灯条3、Blinker手机app 四、设计要点 (1)下载正确的库文件。本实验对ws2812的操作与对单个LED不同,点亮单个基色LED编写好PWM程序就可以调节亮度,不同亮度的三基色LED叠在一起就能呈现不同的颜色。但是ws2812是成线性排列的,所有的LED公用同一个根信号线,因此不能对LED进行单独操作。此处需要用到ws2812的库函数对其进行操作。 在github中搜索blinker library找到资源并下载,将下载好的blinker库解压到 我的电脑>文档>Arduino>libraries 文件夹中
(2)获得IoT设备秘钥。秘钥相当于一个设备的ID,服务器要找到特定的IoT设备,必须依赖该秘钥。打开blinker app,点击右上角的‘+’号,选择Arduino,获得秘钥并复制。 (3)代码中的IoT秘钥、wifi名称、wifi秘钥必须正确输入,否则设备无法与服务器连接。
(4)组件名称要和代码对应。如LEDNum对应Number_1,LED_R对应Number_2.
四、 实验结果与分析1、搭建好的硬件如下: 2、APP界面及组件如下: 3、工作时间显示:工作时间能够实时更新 2、自由控制(整体)模式:按下自由模式,按钮高亮,点击任一颜色,灯颜色改变,手机上显示对应RGB值。图中可以看出选中绿色RGB是 3、七彩模式:按下七彩模式,按钮高亮,ws2812直接显示一个绚烂的彩色灯条。 4、逐个调节模式。按下逐个调节模式按钮,按钮高亮。这时可以按顺序依次调节每一个灯珠的RGB值,当从第一个到最后一个都调整过以后,又重新回到第一个,循环进行。实验中为了显示每个灯珠都可以自由调节,特意相邻的灯珠选择了反差明显的颜色。 5、护眼照明模式。按下护眼照明模式按钮,按钮高亮。一键调整至护眼模式,此时是柔和的黄光。 以上结果达到预期要求。另外需要说明的是,本实验对灯光效果只设定一个模式作为例子,具体应用时完全可以添加更多的模式。 五、实验注意1、本实验主要的代码内容是硬件设备Nodemcu上的,编写硬件代码比较麻烦的是参数的选取(关系到硬件是否能正产工作)。实验时一开始时将ws2812的144个灯珠全部点亮,带来了严重的问题,电脑突然掉电。重启后Windows系统提示USB口电流过大,无法继续使用。幸好内部电路没有破坏性损坏,冷却下来之后仍然能继续工作,否则我的电脑就会损失一个USB口。2、明确电脑无法直接给ws2812供电之后,又找了一个220V转5V的电源适配器来给ws2812供电(先接在面包板上再借ws2812)。这样一来144个LED灯珠都能正常工作。然而偶然触摸面包板温度非常高,迅速拔掉电源后发现面包板已经严重融化。可见144个灯珠同时亮起电流过大。3、最终才确定只点亮20个LED灯珠,防止再次出现意外。 六、附实验代码(C语言) ```c六、附实验代码(C语言)#define BLINKER_WIFI#include <Blinker.h>#include<math.h> char auth[] = "692310ffgrt";//IoT秘钥char ssid[] = "ONEPLUS";//wifi名称char pswd[] = "55555555"; //wifi秘钥bool tab = { false };bool modestate = { false }; //工作模式选项卡bool AutoBit= false; //判断手动模式是否有效bool SingleAdjust= false;//判断逐个调节是否有效int LEDserial=0;//int Offset=20;//灯珠整体移动若干单位#include <Adafruit_NeoPixel.h>#ifdef __AVR__#include <avr/power.h>#endif #if defined (__AVR_ATtiny85__)if (F_CPU == 16000000) clock_prescale_set(clock_div_1);#endif#define PIN 13#define NUMPIXELS 20#define RGB_1 "RGBKey"#define Tab_1 "tab-mode"#define Number_1 "LEDNum"#define Number_2 "LED_R"#define Number_3 "LED_G"#define Number_4 "LED_B"BlinkerRGB WS2812(RGB_1);BlinkerTab Tab1(Tab_1);//定义数据结构Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);BlinkerNumber Number1 (Number_1);BlinkerNumber Number2 (Number_2);BlinkerNumber Number3 (Number_3);BlinkerNumber Number4 (Number_4); //*************************************************************//选项卡触发函数void tab1_callback(uint8_t tab_set){ //BLINKER_LOG("get tab set: ", tab_set); digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); switch (tab_set) { case BLINKER_CMD_TAB_0 : tab = true; //BLINKER_LOG("tab 0 set"); AutoBit=!AutoBit;//手动位取反 break; case BLINKER_CMD_TAB_1 : tab = true; //BLINKER_LOG("tab 1 set"); Mode1();//开启Mode1,灯光模式1 break; case BLINKER_CMD_TAB_2 : tab = true; //BLINKER_LOG("tab 2 set"); SingleAdjust=!SingleAdjust;//开启Mode2,灯光模式2 break; case BLINKER_CMD_TAB_3 : tab = true; //BLINKER_LOG("tab 3 set"); Mode3();//开启Mode3,流水灯模式 break; case BLINKER_CMD_TAB_4 : tab = true; //BLINKER_LOG("tab 4 set"); break; default: break; }} void tab1_feedback(){ for(uint8_t num = 0; num < 5; num++) { if (tab) { Tab1.tab(num); tab = false; } } Tab1.print();}//*******************************************************************//自由模式整体调节/逐个调节服务函数 void ws2812_callback(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value){ digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); if (AutoBit==true){ digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); Mode0(r_value,g_value,b_value,bright_value); return NULL; } else if(SingleAdjust==true){ digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); Mode2(r_value,g_value,b_value,bright_value); }} //********************************************************************//自由控制(整体调节)Mode0void Mode0(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value){ pixels.setBrightness(bright_value); for(int i = 0; i < NUMPIXELS; i++){ pixels.setPixelColor(i, r_value, g_value, b_value); } pixels.show(); Number2.print(r_value); Number3.print(g_value); Number4.print(b_value);}//********************************************************************//七色模式Mode1void Mode1(){ int r=0; int g=0; int b=0; int i=0; int full=NUMPIXELS; digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); for(int i=0;i<NUMPIXELS;i++){ if(i<full/3){ r=255; g=ceil(255*3*i/full); b=0; }else if(i<full/2){ r=ceil(750-i*(250*6/full)); g=255; b=0; }else if(i<full*2/3){ r=0; g=255; b=ceil(i*(250*6/full)-750); }else if(i<full*5/6){ r=0; g=ceil(1250-i*(250*6/full)); b=255; }else{ r=ceil(150*i*(6/full)-750); g=0; b=255; } pixels.setPixelColor(i, pixels.Color(r,g,b)); } pixels.show(); }//********************************************************************//逐个调节Mode2void Mode2(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value){ pixels.setBrightness(bright_value); pixels.setPixelColor(LEDserial, r_value, g_value, b_value); pixels.show(); LEDserial=LEDserial+1; LEDserial= LEDserial % NUMPIXELS; Number2.print(r_value); Number3.print(g_value); Number4.print(b_value); }//*******************************************************************//护眼照明模式 黄光Mode3void Mode3(){ int bright_value=200; int r_value=255; int g_value=215; int b_value=0; pixels.setBrightness(bright_value); for(int i = 0; i < NUMPIXELS; i++){ pixels.setPixelColor(i, r_value, g_value, b_value); } pixels.show(); Number2.print(r_value); Number3.print(g_value); Number4.print(b_value);}//*******************************************************************//显示数值void dataRead(const String & data){ uint32_t BlinkerTime = millis(); Number1.print(BlinkerTime/1000);}//*********************************************************************void setup(){ Serial.begin(115200); BLINKER_DEBUG.stream(Serial); Blinker.attachData(dataRead); pinMode(LED_BUILTIN, OUTPUT);//引脚设置为输出模式 digitalWrite(LED_BUILTIN, LOW); Blinker.begin(auth, ssid, pswd); pixels.begin();//开启pixel对ws2812输出 WS2812.attach(ws2812_callback); Tab1.attach(tab1_callback, tab1_feedback); } void loop(){ Blinker.run();}``` 涟水河 发表于 2020-6-1 00:28
搞定了,
这个可以编译通过的,还是楼主的,只是重新排了下
能帮我看下,问题出在哪吗?
提示Arduino:1.8.13 (Windows 7), 开发板:"NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200"
E:\单片机\氛围灯\1.25\1.25\1.251\1.251.ino: In function 'void tab1_callback(uint8_t)':
1.251:45:13: error: 'Mode1' was not declared in this scope
1.251:53:13: error: 'Mode3' was not declared in this scope
E:\单片机\氛围灯\1.25\1.25\1.251\1.251.ino: In function 'void button1_callback(const String&)':
1.251:138:50: error: 'SET_RGB' was not declared in this scope
1.251:139:27: error: 'SET_RGB' was not declared in this scope
E:\单片机\氛围灯\1.25\1.25\1.251\1.251.ino: In function 'void Mode0(uint32_t, int)':
1.251:143:18: error: 'strip' was not declared in this scope
1.251:149:37: error: a function-definition is not allowed here before '{' token
1.251:355:1: error: expected '}' at end of input
exit status 1
'Mode1' was not declared in this scope
在文件 -> 首选项开启
“编译过程中显示详细输出”选项
这份报告会包含更多信息。
#include <Adafruit_NeoPixel.h>
#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT
#include <Blinker.h>
#include <Adafruit_NeoPixel.h>
char auth[] = "64e4f6335177";
char ssid[] = "LYH";
char pswd[] = "lyh788799";
bool tab = { false };
bool modestate = { false }; //工作模式选项卡
bool AutoBit = false; //判断手动模式是否有效
bool SingleAdjust = false; //判断逐个调节是否有效
int LEDserial = 15; //
int Offset = 60; //灯珠整体移动若干单位
#define PIN 15//DIN PIN (GPIO15, D8)
#define NUMPIXELS 60// Number of you led
#define RGB_1 "RGBKey"
#define Tab_1 "tab-mode"
#define Number_1 "LEDNum"
#define Number_2 "LED_R"
#define Number_3 "LED_G"
#define Number_4 "LED_B"
BlinkerRGB WS2812(RGB_1);
BlinkerButton Button1("key");
BlinkerTab Tab1(Tab_1);//定义数据结构
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
BlinkerNumber Number1 (Number_1);
BlinkerNumber Number2 (Number_2);
BlinkerNumber Number3 (Number_3);
BlinkerNumber Number4 (Number_4); //*************************************************************//选项卡触发函数
void tab1_callback(uint8_t tab_set) { //BLINKER_LOG("get tab set: ", tab_set);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
switch (tab_set) {
case BLINKER_CMD_TAB_0 :
tab = true; //BLINKER_LOG("tab 0 set");
AutoBit = !AutoBit; //手动位取反
break;
case BLINKER_CMD_TAB_1 :
tab = true; //BLINKER_LOG("tab 1 set");
Mode1();//开启Mode1,
break;
case BLINKER_CMD_TAB_2 :
tab = true; //BLINKER_LOG("tab 2 set");
SingleAdjust = !SingleAdjust; //开启Mode2,
break;
case BLINKER_CMD_TAB_3 :
tab = true; //BLINKER_LOG("tab 3 set");
Mode3();//开启Mode3,
break;
case BLINKER_CMD_TAB_4 :
tab = true; //BLINKER_LOG("tab 4 set");
break;
default:
break;
}
}
void tab1_feedback() {
for (uint8_t num = 0; num < 5; num++) {
if (tab) {
Tab1.tab(num);
tab = false;
}
}
Tab1.print();
}
/***************配网函数**************/
bool WIFI_Status = true;
void smartConfig()//配网函数
{
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig...");
WiFi.beginSmartConfig();//等待手机端发出的用户名与密码
while (1)
{
Serial.print(".");
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
if (WiFi.smartConfigDone())//退出等待
{
Serial.println("SmartConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
break;
}
}
}
void WIFI_Set()//
{
//Serial.println("\r\n正在连接");
int count = 0;
while(WiFi.status()!=WL_CONNECTED)
{
if(WIFI_Status)
{
Serial.print(".");
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
count++;
if(count>=5)//5s
{
WIFI_Status = false;
Serial.println("WiFi连接失败,请用手机进行配网");
}
}
else
{
smartConfig();//微信智能配网
}
}
/* Serial.println("连接成功");
Serial.print("IP:");
Serial.println(WiFi.localIP());*/
}
int counter = 0;
int LED_R=0,LED_G=0,LED_B=0,LED_Bright=255;// RGB和亮度
bool LED_Flag = false;
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
Blinker.print(state);
//digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
LED_Flag = !LED_Flag;
if(LED_Flag) SET_RGB(255,255,255,LED_Bright);
else SET_RGB(0,0,0,0);
}
void Mode0(uint32_t color, int wait){
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, color); //Set pixel's color (in RAM)
strip.show(); //Update strip to match
delay(wait); //Pause for a moment
}
void Mode1(uint32_t color, int wait){
for(int a=0; a<10; a++) {// Repeat 10 times...
for(int b=0; b<3; b++) { //'b' counts from 0 to 2...
strip.clear(); // Set all pixels in RAM to 0 (off)
// 'c' counts up from 'b' to end of strip in steps of 3...
for(int c=b; c<strip.numPixels(); c += 3) {
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
}
strip.show(); // Update strip with new contents
delay(wait);// Pause for a moment
}
}
}
void Mode2(int wait){
// Hue of first pixel runs 5 complete loops through the color wheel.
// Color wheel has a range of 65536 but it's OK if we roll over, so
// just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
// means we'll make 5*65536/256 = 1280 passes through this outer loop:
for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
// Offset pixel hue by an amount to make one full revolution of the
// color wheel (range of 65536) along the length of the strip
// (strip.numPixels() steps):
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
// optionally add saturation and value (brightness) (each 0 to 255).
// Here we're using just the single-argument hue variant. The result
// is passed through strip.gamma32() to provide 'truer' colors
// before assigning to each pixel:
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
}
strip.show(); // Update strip with new contents
delay(wait);// Pause for a moment
}
}
void Mode3(int wait){
int firstPixelHue = 0; // First pixel starts at red (hue 0)
for(int a=0; a<30; a++) {// Repeat 30 times...
for(int b=0; b<3; b++) { //'b' counts from 0 to 2...
strip.clear(); // Set all pixels in RAM to 0 (off)
// 'c' counts up from 'b' to end of strip in increments of 3...
for(int c=b; c<strip.numPixels(); c += 3) {
// hue of pixel 'c' is offset by an amount to make one full
// revolution of the color wheel (range 65536) along the length
// of the strip (strip.numPixels() steps):
int hue = firstPixelHue + c * 65536L / strip.numPixels();
uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
}
strip.show(); // Update strip with new contents
delay(wait); // Pause for a moment
firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
}
}
}
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter=counter;
Number1.print(counter);
}
void SET_RGB(int R,int G,int B,int bright)
{
for (uint16_t i = 0; i < NUMPIXELS; i++) //把灯条变色
{
pixels.setPixelColor(i,R,G,B);
}
pixels.setBrightness(bright);//亮度
pixels.show(); //送出显示
}
//APP RGB颜色设置回调
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);
LED_Bright = bright_value;
SET_RGB(r_value,g_value,b_value,LED_Bright);
}
//小爱电源类回调
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
//digitalWrite(LED_BUILTIN, LOW);
SET_RGB(255,255,255,255);
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_OFF) {
//digitalWrite(LED_BUILTIN, HIGH);
SET_RGB(255,255,255,0);
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
}
}
//小爱设置颜色回调
void miotColor(int32_t color)
{
BLINKER_LOG("need set color: ", color);
int colorR,colorG,colorB;
colorR = color >> 16 & 0xFF;
colorG = color >>8 & 0xFF;
colorB = color & 0xFF;
BLINKER_LOG("colorR: ", colorR, ", colorG: ", colorG, ", colorB: ", colorB);
SET_RGB(colorR,colorG,colorB,LED_Bright);
//pixelShow();
BlinkerMIOT.color(color);//反馈小爱控制状态
BlinkerMIOT.print();
}
//小爱调亮度回调
void miotBright(const String & bright)
{
BLINKER_LOG("need set brightness: ", bright);
int colorW = bright.toInt();
BLINKER_LOG("now set brightness: ", colorW);
LED_Bright = colorW;
SET_RGB(LED_R,LED_G,LED_B,LED_Bright);
Serial.printf("亮度调节中...%d",colorW);
BlinkerMIOT.brightness(colorW);//反馈小爱控制状态
BlinkerMIOT.print();
}
void setup() {
// 初始化串口
Serial.begin(115200);
pixels.begin();//WS2812初始化
pixels.show();
pinMode(LED_BUILTIN, OUTPUT);
#if defined(BLINKER_PRINT)
BLINKER_DEBUG.stream(BLINKER_PRINT);
#endif
Serial.begin(115200); BLINKER_DEBUG.stream(Serial); Blinker.attachData(dataRead); pinMode(LED_BUILTIN, OUTPUT);//引脚设置为输出模式
digitalWrite(LED_BUILTIN, LOW); Blinker.begin(auth, ssid, pswd); pixels.begin();//开启pixel对ws2812输出
WS2812.attach(ws2812_callback);
Tab1.attach(tab1_callback,
tab1_feedback);
}
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
// Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
// END of Trinket-specific code.
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
WIFI_Set();
// 初始化blinker
Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str());
Blinker.attachData(dataRead);//如果没有被绑定的组件被触发就执行这个回调
Button1.attach(button1_callback);//Button1这个组件被触发就执行这个回调
RGB1.attach(rgb1_callback);//注册调节颜色的回调函数
BlinkerMIOT.attachPowerState(miotPowerState);
BlinkerMIOT.attachColor(miotColor);//小爱调节颜色
BlinkerMIOT.attachBrightness(miotBright);//小爱调节RGB亮度
}
void loop()
{
// Fill along the length of the strip in various colors...
colorWipe(strip.Color(255, 0, 0), 50); // Red
colorWipe(strip.Color(0, 255, 0), 50); // Green
colorWipe(strip.Color(0, 0, 255), 50); // Blue
// Do a theater marquee effect in various colors...
theaterChase(strip.Color(127, 127, 127), 50); // White, half brightness
theaterChase(strip.Color(127, 0, 0), 50); // Red, half brightness
theaterChase(strip.Color(0, 0, 127), 50); // Blue, half brightness
rainbow(10); // Flowing rainbow cycle along the whole strip
theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
}
Blinker.run();
}
再来个小爱同学就完美了 你好,我编译时显示
Adafruit_NeoPixel.h: No such file or directory
,请问是哪里没对?
上面那个库文件的问题解决了,可是还是有好多错误,貌似上面的程序的格式有错,请问可以给我源程序吗? 本帖最后由 edayer 于 2020-3-17 11:46 编辑
代码没隔行段落差评
求 TCS3200d乱入
https://www.arduino.cn/thread-94764-1-1.html
大神能加一个小爱同学的教程吗 稍微修改后的版本,http://t.cn/A6Z3K2gc 努力学习中!谢谢分享! 不错,好玩!!! 本帖最后由 涟水河 于 2020-5-31 21:19 编辑
编译搞定了,还在试