ESP8266三路PWM控制三色灯,滑条控制灯的亮度-Arduino中文社区 - Powered by Discuz! Archiver

whitemaker 发表于 2020-8-24 22:09

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();    //系统运行
}

yumi2356 发表于 2020-8-25 17:12

能否把电路图贴上,小白请教!

whitemaker 发表于 2020-8-26 14:44

本帖最后由 whitemaker 于 2020-8-26 14:54 编辑

yumi2356 发表于 2020-8-25 17:12
能否把电路图贴上,小白请教!

图中SW1,SW2可用跳线帽代替,主要下载时候用的。有专门的下载器就不用管了。

yumi2356 发表于 2020-8-26 21:46

whitemaker 发表于 2020-8-26 14:44
图中SW1,SW2可用跳线帽代替,主要下载时候用的。有专门的下载器就不用管了。
...

辛苦楼主!谢谢!

1052196225 发表于 2020-10-28 21:22

大佬请问怎么把滑条改成低电平到高电平啊

whitemaker 发表于 2021-1-11 08:46

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:25

本帖最后由 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();    //系统运行
}
电路图:

一位热心市民 发表于 2022-9-14 17:27

1,直接用8266驱动灯只适合做实验,因为功率太小。2,看你电路中3色灯都用1K电阻,实际是3色灯的点亮电流是不一样的。3,直接上WS2812玩法多代码还简单。
页: [1]
查看完整版本: ESP8266三路PWM控制三色灯,滑条控制灯的亮度