本帖最后由 海神 于 2022-5-17 15:51 编辑
简介
Blinker APP中自带颜色插件,当添加颜色插件后,可以通过调整调色盘来控制实际应用中灯条对应的不同颜色。 本章节中我们使用Blinker APP配合可编程RGB灯条,实现通过颜色组件调色盘来控制RGB灯条不同的颜色。 普通的RGB灯直接是高低电平来点亮或者熄灭。而这种可编程RGB灯与普通的RGB灯有所区别,可编程RGB灯里面是有专门的驱动芯片的。我们想要实现每一颗灯珠指定点亮不同的颜色,需要程序按照灯的时序才能驱动,这样增加了程序的复杂性。但好在我们可以找到可编程RGB灯的程序库文件,我们安装好库文件后,就可以调用功能函数,就能实现点亮其灯珠,而不需要写底层的驱动程序。
硬件
软件
blinker app
代码
- #define BLINKER_WIFI
- #include <Blinker.h>
- char auth[] = "Your Device Secret Key";
- char ssid[] = "Your WiFi network SSID or name";
- char pswd[] = "Your WiFi network WPA password or WEP key";
- // Download Adafruit_NeoPixel library here:
- // https://github.com/adafruit/Adafruit_NeoPixel
- #include <Adafruit_NeoPixel.h>
- #ifdef __AVR__
- #include <avr/power.h>
- #endif
- #define PIN D8
- #define NUMPIXELS 6
- Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
- #define RGB_1 "RGBKey"
- BlinkerRGB WS2812(RGB_1);
- 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));
- BLINKER_LOG("R value: ", r_value);
- BLINKER_LOG("G value: ", g_value);
- BLINKER_LOG("B value: ", b_value);
- BLINKER_LOG("Rrightness value: ", bright_value);
- pixels.setBrightness(bright_value);
- for(int i = 0; i < NUMPIXELS; i++){
- pixels.setPixelColor(i, r_value, g_value, b_value);
- }
- pixels.show();
- }
- void setup()
- {
- Serial.begin(115200);
- BLINKER_DEBUG.stream(Serial);
- pinMode(LED_BUILTIN, OUTPUT);
- digitalWrite(LED_BUILTIN, LOW);
- Blinker.begin(auth, ssid, pswd);
- pixels.begin();
- WS2812.attach(ws2812_callback);
- }
- void loop()
- {
- Blinker.run();
- }
复制代码
在程序里我们用到了驱动ws2812灯带的库文件,所以在上传程序之前,我们需要安装相应的库文件 下载后解压文件夹放在arduinoIDE安装目录下的libraries下,如图
确认无误后,将程序上传至主板。
定制blinker软件界面
找到Blinker下方添加“颜色”控件,并点击添加,点击右上方的锁,解锁修改控件参数 修改数据键名,键名需要与程序里定义的一致。这里我们将其取名为“RGBKey”,显示文本为“颜色拾取” 编辑好后,点击右上角的勾确认编辑结束。
硬件连接
1、扩展板堆叠在wifiduino主板上 2、在程序中我们定义的是6颗RGBled,但模块上只有3课RGBled,可以将两个灯条模块进行级联。1号模块的out接口(通过3P数据线)连接在2号模块的in接口中。然后将1号模块的in接口连接在传感器扩展板上的D8接口(程序中定义)中。 观察现象
操作blinker app,通过拾取调色盘中的颜色,控制RGB灯的显示情况。
以上实验我们可以调整灯带显示自己想要的不同颜色灯光,让调色盘更加生动适用,我们可以在此基础上给灯添加一些常用的模式,例如看书时我们需要一种适合于看书时的灯光,如睡觉时可能需要的一种较弱的呼吸灯光效果。 那么我们将blinker中再额外添加两个按键控件,这两个按键用来确认两种不同的光效,一种是阅读模式,一种是呼吸模式。 然后再加上一个按键用来做关闭灯光使用。
- #define BLINKER_WIFI
- #include <Blinker.h>
- #include <Adafruit_NeoPixel.h>
- Adafruit_NeoPixel rgb_display_D8 = Adafruit_NeoPixel(6,D8,NEO_RGB + NEO_KHZ800);
- char auth[] = "48c0xxxxdd";
- char ssid[] = "mxxxxxun";
- char pswd[] = "cdxxxxx51";
- BlinkerRGB RGB1("RGBKey");
- void RGB1_callback(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value) {
- rgb_display_D8.setPixelColor((1)-1, ((r_value & 0xffffff) << 16) | ((g_value & 0xffffff) << 8) | b_value);
- rgb_display_D8.setPixelColor((2)-1, ((r_value & 0xffffff) << 16) | ((g_value & 0xffffff) << 8) | b_value);
- rgb_display_D8.setPixelColor((3)-1, ((r_value & 0xffffff) << 16) | ((g_value & 0xffffff) << 8) | b_value);
- rgb_display_D8.setBrightness(bright_value);
- }
- uint32_t Wheel(byte WheelPos){
- if(WheelPos < 85){
- return rgb_display_D8.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
- }
- else if(WheelPos < 170){
- WheelPos -= 85;
- return rgb_display_D8.Color(255 - WheelPos * 3, 0, WheelPos * 3);
- }
- else{
- WheelPos -= 170;return rgb_display_D8.Color(0, WheelPos * 3, 255 - WheelPos * 3);
- }
- }
- void rainbow(uint8_t wait){
- uint16_t i, j;
- for(j=0; j<256; j++){
- for(i=0; i<rgb_display_D8.numPixels(); i++){
- rgb_display_D8.setPixelColor(i, Wheel((i+j) & 255));
- }
- rgb_display_D8.show();
- delay(wait);
- }
- }
- BlinkerButton Button1("btn-abf");
- void Button1_callback(const String & state) {
- if (state == "on") {
- rainbow(20);
- for(int i = 0; i < rgb_display_D8.numPixels(); i++){
- rgb_display_D8.setPixelColor(i, Wheel(((i * 256 / rgb_display_D8.numPixels()) + 20) & 255));
- }
- rgb_display_D8.show();
- rgb_display_D8.setBrightness(100);
- }
- }
- BlinkerButton Button2("btn-abd");
- void Button2_callback(const String & state) {
- if (state == "on") {
- rgb_display_D8.setPixelColor((1)-1, 0xffcc00);
- rgb_display_D8.setPixelColor((2)-1, 0xffcc33);
- rgb_display_D8.setPixelColor((3)-1, 0xffcc33);
- rgb_display_D8.setBrightness(100);
- }
- }
- BlinkerButton Button3("btn-abe");
- void Button3_callback(const String & state) {
- if (state == "on") {
- rgb_display_D8.setBrightness(0);
- }
- }
- void setup(){
- Blinker.begin(auth,ssid,pswd);
- rgb_display_D8.begin();
- RGB1.attach(RGB1_callback);
- Button1.attach(Button1_callback);
- Button2.attach(Button2_callback);
- Button3.attach(Button3_callback);
- }
- void loop(){
- rgb_display_D8.show();
- Blinker.run();
- }
复制代码
所以完整界面
操作并观察现象
|