ESP8266三路PWM控制三色灯,滑条控制灯的亮度
本帖最后由 whitemaker 于 2020-8-24 22:20 编辑新手首帖,有问题的话请指教:
//三色LED控制
//小功率三色灯珠共阳极接3.3v, 阴极经限流电阻接IO口;IO口状态为低时,灯亮。
#define BLINKER_WIFI
#define BLINKER_APCONFIG//支持APconfig配网
#include <Blinker.h>
//重定义引脚
#define PIN_RLED 4
#define PIN_GLED 5
#define PIN_BLED 12
#define LED_OB 13 //系统运行指示灯
char auth[] = "b29cfc9a3571";//设备密钥
//char ssid[] = "whitemaker"; //联网信息(AP配网不需要)
//char pswd[] = "12345678";
// 新建组件对象
BlinkerButton ButtonR("btn-r"); //红灯开关按键
BlinkerButton ButtonG("btn-g"); //绿灯开关按键
BlinkerButton ButtonB("btn-b"); //蓝灯开关按键
BlinkerButton ButtonP("btn-p"); //总开关按键,一键开关三色灯
BlinkerSlider SliderR("sld-r"); //红灯亮度滑条
BlinkerSlider SliderG("sld-g"); //绿灯亮度滑条
BlinkerSlider SliderB("sld-b"); //蓝灯亮度滑条
// 按下按键即会执行该函数
void buttonR_callback(const String & state)//红灯开关按键回调函数
{
BLINKER_LOG("get button state:",state);//在APP端调试窗口输出按键按下后的状态
if(state=="on") //开关按键按下后,键值为“on”
{
digitalWrite(PIN_RLED,LOW);//开灯
ButtonR.color("red"); //按键图标颜色为红色
ButtonR.print("on"); //状态反馈至按键,键值保存为“on”
}
else if(state=="off") //开关按键按下后,键值为“off”
{
digitalWrite(PIN_RLED,HIGH); //关灯
ButtonR.icon("fas fa-lightbulb"); //转换按键图标;"off"时图标为灯泡,"on"时图标为灯泡+发光示意线
ButtonR.color("gray"); //按键图标颜色变灰
ButtonR.print("off"); //状态反馈至按键,键值保存为“off”
}
Blinker.vibrate(); //振动,默认值为200ms
}
void buttonG_callback(const String & state)
{
BLINKER_LOG("get button state:",state);
if(state=="on")
{
digitalWrite(PIN_GLED,LOW);
ButtonG.color("green");
ButtonG.print("on");
}
else if(state=="off")
{
digitalWrite(PIN_GLED,HIGH);
ButtonG.icon("fas fa-lightbulb");
ButtonG.color("gray");
ButtonG.print("off");
}
Blinker.vibrate();
}
void buttonB_callback(const String & state)
{
BLINKER_LOG("get button state:",state);
if(state=="on")
{
digitalWrite(PIN_BLED,LOW);
ButtonB.color("blue");
ButtonB.print("on");
}
else if(state=="off")
{
digitalWrite(PIN_BLED,HIGH);
ButtonB.icon("fas fa-lightbulb");
ButtonB.color("gray");
ButtonB.print("off");
}
Blinker.vibrate();
}
void buttonP_callback(const String & state)
{
buttonR_callback(state);
buttonG_callback(state);
buttonB_callback(state);
BLINKER_LOG("get button state:",state);
if(state=="on")
{
ButtonP.color("green");
ButtonP.print("on");
}
else if(state=="off")
{
ButtonP.color("red");
ButtonP.print("off");
}
Blinker.vibrate();//振动
}
void sliderR_callback(int32_t value) //滑条回调函数,滑条值范围0~1000
{
if(value<20) //如果滑条值小于20(0~20关灯,方便操作),执行状态为“off”的按键开关回调函数
{
buttonR_callback("off"); //关灯,转换图标,图标变灰,反馈为“off”
}
else //滑条值≥20,
{
buttonR_callback("on"); //执行状态为“on”的按键开关回调函数
//PWM输出,LED低电平有效,PWM占空比:(1000-value)/1024;
//analogWriteRange()--修改范围,默认值为1023;
//ananlogWriteFreq()--修改频率,默认值为1K;
analogWrite(PIN_RLED, (1000-value));
BLINKER_LOG("get slider value: ", (1000-value));//在APP端调试窗口输出led亮度值
}
}
void sliderG_callback(int32_t value)
{
if(value<20)
{
buttonG_callback("off");
}
else
{
buttonG_callback("on");
analogWrite(PIN_GLED, (1000-value));
BLINKER_LOG("get slider value: ", (1000-value));
}
}
void sliderB_callback(int32_t value)
{
if(value<20)
{
buttonB_callback("off");
}
else
{
buttonB_callback("on");
analogWrite(PIN_BLED, (1000-value));
BLINKER_LOG("get slider value: ", (1000-value));
}
}
// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);//在APP端调试窗口输出触发的组件内容
Blinker.vibrate(); //振动
uint32_t BlinkerTime = millis();//获取系统运行时间
Blinker.print("millis", BlinkerTime); //输出系统运行时间
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();//打开全部调试信息
// 初始化有LED的IO
pinMode(PIN_RLED, OUTPUT);//配置IO口为输出状态
pinMode(PIN_GLED, OUTPUT);
pinMode(PIN_BLED, OUTPUT);
pinMode(LED_OB, OUTPUT);
digitalWrite(PIN_RLED, HIGH); //拉高IO口,关灯
digitalWrite(PIN_GLED, HIGH);
digitalWrite(PIN_BLED, HIGH);
digitalWrite(LED_OB, LOW); //系统运行指示灯开
// 初始化blinker
// Blinker.begin(auth, ssid, pswd);
Blinker.begin(auth); //AP配网函数
Blinker.attachData(dataRead); //注册回调函数
ButtonR.attach(buttonR_callback);
ButtonG.attach(buttonG_callback);
ButtonB.attach(buttonB_callback);
ButtonP.attach(buttonP_callback);
SliderR.attach(sliderR_callback);
SliderG.attach(sliderG_callback);
SliderB.attach(sliderB_callback);
}
void loop() {
Blinker.run(); //系统运行
}
能否把电路图贴上,小白请教! 本帖最后由 whitemaker 于 2020-8-26 14:54 编辑
yumi2356 发表于 2020-8-25 17:12
能否把电路图贴上,小白请教!
图中SW1,SW2可用跳线帽代替,主要下载时候用的。有专门的下载器就不用管了。
whitemaker 发表于 2020-8-26 14:44
图中SW1,SW2可用跳线帽代替,主要下载时候用的。有专门的下载器就不用管了。
...
辛苦楼主!谢谢! 大佬请问怎么把滑条改成低电平到高电平啊
1052196225 发表于 2020-10-28 21:22
大佬请问怎么把滑条改成低电平到高电平啊
代码中的value对应滑条值,若led是高电平点亮,将代码中的 (100-value)改成value。analogWrite(PIN_RLED, value);//默认一个PWM周期计数1024次,其中value次输出高电平,(1024-value)次输出低电平。 本帖最后由 17585229862 于 2022-9-3 12:36 编辑
你好,我现在有一个双色温led灯条,根据你的代码,我改了一点点,我想问一下这样我能不能直接实现双色温的控制
代码如下:
#define BLINKER_WIFI
//#define BLINKER_APCONFIG//支持APconfig配网
#include <Blinker.h>
//重定义引脚
#define PIN_ALED 4
#define PIN_BLED 5
#define LED_OB 13 //系统运行指示灯
char auth[] = "3c973e460734";//设备密钥
char ssid[] = "WangTao"; //联网信息(AP配网不需要)
char pswd[] = "wangtao.";
// 新建组件对象
BlinkerButton ButtonA("btn-a"); //亮度开关按键
BlinkerButton ButtonB("btn-b"); //色温灯开关按键
BlinkerSlider SliderA("ran-a"); //亮度亮度滑条
BlinkerSlider SliderB("ran-b"); //色温亮度滑条
// 按下按键即会执行该函数
void buttonA_callback(const String & state)//亮度开关按键回调函数
{
BLINKER_LOG("get button state:",state);//在APP端调试窗口输出按键按下后的状态
if(state=="on") //开关按键按下后,键值为“on”
{
digitalWrite(PIN_ALED,LOW);//开灯
ButtonA.color("red"); //按键图标颜色为红色
ButtonA.print("on"); //状态反馈至按键,键值保存为“on”
}
else if(state=="off") //开关按键按下后,键值为“off”
{
digitalWrite(PIN_ALED,HIGH); //关灯
ButtonA.icon("fas fa-lightbulb"); //转换按键图标;"off"时图标为灯泡,"on"时图标为灯泡+发光示意线
ButtonA.color("gray"); //按键图标颜色变灰
ButtonA.print("off"); //状态反馈至按键,键值保存为“off”
}
Blinker.vibrate(); //振动,默认值为200ms
}
void buttonB_callback(const String & state)//色温开关按键回调函数
{
BLINKER_LOG("get button state:",state);//在APP端调试窗口输出按键按下后的状态
if(state=="on") //开关按键按下后,键值为“on”
{
digitalWrite(PIN_BLED,LOW);//开灯
ButtonB.color("red"); //按键图标颜色为红色
ButtonB.print("on"); //状态反馈至按键,键值保存为“on”
}
else if(state=="off") //开关按键按下后,键值为“off”
{
digitalWrite(PIN_BLED,HIGH); //关灯
ButtonB.icon("fas fa-lightbulb"); //转换按键图标;"off"时图标为灯泡,"on"时图标为灯泡+发光示意线
ButtonB.color("gray"); //按键图标颜色变灰
ButtonB.print("off"); //状态反馈至按键,键值保存为“off”
}
Blinker.vibrate(); //振动,默认值为200ms
}
//滑条回调函数
void sliderA_callback(int32_t value) //滑条回调函数,滑条值范围0~1000
{
if(value<20) //如果滑条值小于20(0~20关灯,方便操作),执行状态为“off”的按键开关回调函数
{
buttonA_callback("off"); //关灯,转换图标,图标变灰,反馈为“off”
}
else //滑条值≥20,
{
buttonA_callback("on"); //执行状态为“on”的按键开关回调函数
//PWM输出,LED低电平有效,PWM占空比:(1000-value)/1024;
//analogWriteRange()--修改范围,默认值为1023;
//ananlogWriteFreq()--修改频率,默认值为1K;
analogWrite(PIN_ALED, (1000-value));
BLINKER_LOG("get slider value: ", (1000-value));//在APP端调试窗口输出led亮度值
}
}
//滑条回调函数
void sliderB_callback(int32_t value) //滑条回调函数,滑条值范围0~1000
{
if(value<20) //如果滑条值小于20(0~20关灯,方便操作),执行状态为“off”的按键开关回调函数
{
buttonB_callback("off"); //关灯,转换图标,图标变灰,反馈为“off”
}
else //滑条值≥20,
{
buttonB_callback("on"); //执行状态为“on”的按键开关回调函数
//PWM输出,LED低电平有效,PWM占空比:(1000-value)/1024;
//analogWriteRange()--修改范围,默认值为1023;
//ananlogWriteFreq()--修改频率,默认值为1K;
analogWrite(PIN_BLED, (1000-value));
BLINKER_LOG("get slider value: ", (1000-value));//在APP端调试窗口输出led亮度值
}
}
// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);//在APP端调试窗口输出触发的组件内容
Blinker.vibrate(); //振动
uint32_t BlinkerTime = millis();//获取系统运行时间
Blinker.print("millis", BlinkerTime); //输出系统运行时间
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();//打开全部调试信息
// 初始化有LED的IO
pinMode(PIN_ALED, OUTPUT);//配置IO口为输出状态
pinMode(PIN_BLED, OUTPUT);
pinMode(LED_OB, OUTPUT);
digitalWrite(PIN_ALED, HIGH); //拉高IO口,关灯
digitalWrite(PIN_BLED, HIGH);
digitalWrite(LED_OB, LOW); //系统运行指示灯开
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
// Blinker.begin(auth); //AP配网函数
Blinker.attachData(dataRead); //注册回调函数
ButtonA.attach(buttonA_callback);
ButtonB.attach(buttonB_callback);
SliderA.attach(sliderA_callback);
SliderB.attach(sliderB_callback);
}
void loop() {
Blinker.run(); //系统运行
}
电路图:
1,直接用8266驱动灯只适合做实验,因为功率太小。2,看你电路中3色灯都用1K电阻,实际是3色灯的点亮电流是不一样的。3,直接上WS2812玩法多代码还简单。
页:
[1]