|
本帖最后由 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 -----|\
2 vcc 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);
}
}
(完)
|
|