blinker控制四脚RGB雾灯-Arduino中文社区 - Powered by Discuz! Archiver

topdog 发表于 2018-7-29 00:13

blinker控制四脚RGB雾灯

本帖最后由 topdog 于 2018-7-30 22:37 编辑

前期我们研究了WIFIduino arduino ide的安装,小米5s安装blinker APP,以及两者如何关联调试。(地址: https://www.arduino.cn/thread-80411-1-1.html) 本节还是使用小米5s手机安装的 blinker APP,通过WiFiduino控制四脚RGB雾灯。材料的准备:一个四脚共阳极RGB雾灯,四根杜邦线。

一,手机blinker APP的布局修改
设想中的blinker APP是第一排程序名称,第二排显示程序运行时间,计量单位标签,同时震动提醒,第三排一个拨动开关,一个按键,第四排RGB调色板,第五排信息显示框。


在默认的手机界面上,点击右上角的笔,界面上的各个元件就可以修改了。我们把原来冗长的说明修改成实验标题。按右下角的√保存。不需要的元件,如D2-L的开关点左下角垃圾桶删除。


查看运行时间震动反馈的按钮开关保留,两个相关的文本显示标签也保留,我们来看下它的键值。


添加一个RGB的滑动条,键值修改成RGBKEY,这个值要和板子上程序的设定值定义一致。


添加一个拨动开关,键值ToggleKey,这个值要和板子上程序的设定值定义一致。


本界面最下面六个按钮分别是文本、按键Button、拨动开关toggle、滑动条Slider、RGB调色板rgb、摇杆joystick。我们已经按照设想把相应的元件拖曳到了合适的位置,按右上角的锁把界面固定住。



二,WiFiduino 硬件连接和程序编写
共阳极的rgb七彩雾灯,pin1接WiFiduino 3.3v,pin2 红色极接 D4,pin3 绿色极接D5,pin4 蓝色极接 D8。如果要呈现红色,D4低电平,D5、D8高电平。 pinMode(PIN_RED, OUTPUT); 管脚输出的情况下数字和模拟的方法都是可行的。RGB都给高电平则不亮。digitalWrite()使用高低电平控制三个管脚会呈现七种色彩变化,(3!=3x2+1=7)能够出现七种色彩,故称之为七彩灯。共阴极的RGB pin1接GND高低电平控制效果则反之。 analogWrite()随着PWM电压的变化会呈现不同的色彩,绚烂缤纷。理论上WiFiduino每个引脚都可以analogWrite(),但是在写程序时需要注意D0 RX0,D1 TX0,D2 TX1,D3 是唯一analogRead()的管脚,这些特殊用法都必须回避,否则会影响控制的稳定。请注意程序中uint32_t colorR = map(Blinker.rgb(RGB1,R) , 0, 255, 0, 1024); 用途是把RGB调色板的R取值从一个范围(0~255)转换到另一个范围(0~1024)。已知一个色彩由RGB三个值来确定,如红色(R=0,G=255,B=255)转化好的数值成了(R=0,G=1024,B=1024),APP设定的色彩和led灯呈现的色彩就不匹配了?由此我们发现了问题,并且找到了产生问题的原因。本例解决这个不同步的bug的途径用了程序连接的方法,就是调整一下决定LED色彩的RGB色谱的对应位置。板子上的R管脚对应APP中的G,板子上的G管脚对应APP中的B,板子上的B管脚对应APP中的的R,牵住了不同步问题的牛鼻子APP RGB调色板的BUG就迎刃而解了。

RGB颜色值对应表         http://www.sioe.cn/yingyong/yanse-rgb-16/

WiFiduino烧写的程序如下:

/*
1红    D4      -----|\
2vcc   3.3   -------| \
3绿    D5   ------| /
4蓝    D8   ------|/
*/

#define BLINKER_PRINT Serial
#define BLINKER_WIFI

#include <Blinker.h>

char ssid[] = "WiFi名称";
char pswd[] = "WiFi密码";

#define RGB1 "RGBKEY"
#define TOGGLE_1 "ToggleKey"

#define PIN_RED D4
#define PIN_GREEN D5
#define PIN_BLUE D8

void setup()
{
    Serial.begin(115200);

   pinMode(LED_BUILTIN, OUTPUT);
   digitalWrite(LED_BUILTIN, LOW);

   pinMode(PIN_BLUE, OUTPUT);   
   pinMode(PIN_GREEN, OUTPUT);   
   pinMode(PIN_RED, OUTPUT);

   digitalWrite(PIN_BLUE,HIGH);
   digitalWrite(PIN_GREEN,HIGH);
   digitalWrite(PIN_RED,HIGH);

    Blinker.begin(ssid, pswd);

    Blinker.wInit(RGB1, W_RGB);
    Blinker.wInit(TOGGLE_1, W_TOGGLE);
}

void loop()
{            
    Blinker.run();      

    if (Blinker.available()) {      

      BLINKER_LOG2("Blinker.readString(): ", Blinker.readString());

      Blinker.vibrate();

      uint32_t BlinkerTime = millis();
      Blinker.print(BlinkerTime);
      Blinker.print("millis", BlinkerTime);
   }         

       uint32_t colorR = map(Blinker.rgb(RGB1,R) , 0, 255, 0, 1024);
       uint32_t colorG = map(Blinker.rgb(RGB1,G), 0, 255, 0, 1024);
       uint32_t colorB = map(Blinker.rgb(RGB1,B), 0, 255, 0, 1024);      

      Blinker.delay(100);                  

       if ( Blinker.connected() && Blinker.toggle(TOGGLE_1)){                              

       analogWrite(PIN_RED, colorG);      
       analogWrite(PIN_GREEN, colorB);
       analogWrite(PIN_BLUE, colorR);

       Blinker.delay(500);
    }
   else {
       digitalWrite(PIN_BLUE,HIGH);
       digitalWrite(PIN_GREEN,HIGH);
       digitalWrite(PIN_RED,HIGH);                  
   }                                       
}
(完)


















三水 发表于 2018-7-29 11:15

esp8266的analogwrite输入值的区间可调的

还有个简单的方法
在初始化io的时候输入以下代码即可直接使用0-255的值了
#if defined(ESP8266)
    analogWriteRange(255);
#endif

topdog 发表于 2018-7-29 16:16

三水 发表于 2018-7-29 11:15
esp8266的analogwrite输入值的区间可调的

还有个简单的方法


谢谢指导一起学习,一起进步。

Allen大白 发表于 2019-7-29 22:41

你好,我复制上面的代码编译的时候错误: Blinker.begin(ssid, pswd);

topdog 发表于 2019-7-29 23:17

Allen大白 发表于 2019-7-29 22:41
你好,我复制上面的代码编译的时候错误: Blinker.begin(ssid, pswd);

现在库文件修改了,这个不能用了。

Allen大白 发表于 2019-7-29 23:38

topdog 发表于 2019-7-29 23:17
现在库文件修改了,这个不能用了。

哦哦,好的,谢谢
页: [1]
查看完整版本: blinker控制四脚RGB雾灯