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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5622|回复: 7

[分享] ESP8266三路PWM控制三色灯,滑条控制灯的亮度

[复制链接]
发表于 2020-8-24 22:09 | 显示全部楼层 |阅读模式
本帖最后由 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();    //系统运行
}

1

1

2

2
发表于 2020-8-25 17:12 | 显示全部楼层
能否把电路图贴上,小白请教!
 楼主| 发表于 2020-8-26 14:44 | 显示全部楼层
本帖最后由 whitemaker 于 2020-8-26 14:54 编辑
yumi2356 发表于 2020-8-25 17:12
能否把电路图贴上,小白请教!


图中SW1,SW2可用跳线帽代替,主要下载时候用的。有专门的下载器就不用管了。
电路图.png
发表于 2020-8-26 21:46 | 显示全部楼层
whitemaker 发表于 2020-8-26 14:44
图中SW1,SW2可用跳线帽代替,主要下载时候用的。有专门的下载器就不用管了。
...

辛苦楼主!谢谢!
发表于 2020-10-28 21:22 | 显示全部楼层
大佬请问怎么把滑条改成低电平到高电平啊
 楼主| 发表于 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)次输出低电平。
发表于 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-09-03 12.22.42.png
发表于 2022-9-14 17:27 | 显示全部楼层
1,直接用8266驱动灯只适合做实验,因为功率太小。2,看你电路中3色灯都用1K电阻,实际是3色灯的点亮电流是不一样的。3,直接上WS2812玩法多代码还简单。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 05:36 , Processed in 0.085648 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表