RGB灯带控制(恒流控制)
项目:智能灯带远程控制(12V RGB 版恒流控制)方案规划:初期看了很多案例基本上都是基于PWM+MOS 功能调光 ,后来想想能不能用恒流ic控制 (ic集中 温度 过压 限流。。。。。)逼格高一点。方案选择:刚开始真纠结选择esp8266 还是32因初期功能比较单一所以选择了8266。在规划过程中有想后期增加人体感应接口+光感+温度传感器,拓展外置天线等。后期还是选择esp32;恒流电ic选择:灯带是共vcc(12v) rbg 为gnd 故选择ic需要可以共阳多联市面找了一圈还真不便宜,而且不多。反正走了不少弯路建议有需要可搜索舞台灯rgb 驱动ic。
废话不多说
目前软件已经开关灯+rgb调光+设置+断电存储+温度+光感
#define BLINKER_WIFI
#define BLINKER_ALIGENIE_SENSOR
#include <Blinker.h> /* 引用点亮函数 */
#include <EEPROM.h> /* 引用存储库函数 */
#include "OneButton.h"/* 引用按键库函数 */
#include <Ticker.h> /* 引用延迟库函数 */
#include <OneWire.h>
#include <DallasTemperature.h>
/************************* RGB引脚 **************************/
//#define led_red 14
//#define led_green 12
//#define led_blue13
#define led_red 25
#define led_green 26
#define led_blue27
/* ********************wifi设置****************************/
// charauth[]= "";
// charssid[]= "qq2260376628";
// charpswd[]= "qq2260376628";
// 定义DS18B20数据口连接ESP32的33号IO上
#define ONE_WIRE_BUS 33
// 定义Dadc号IO上
#define adcio 35
int address = 3500; /* eeprom 地址 */
unsigned char ztmode, setmode1, setmode2,dingshinum2,setmode3; /* 运行状态 */
unsigned char r_value1, g_value1, b_value1;
byte r_value2, g_value2, b_value2, rgb_value2;
unsigned int ycnum, ycnum1;//定时返回
unsigned intlednum;
unsigned char ggval, ggnum, wendui; /* 光感 num */
Ticker dstime; /* 定时关闭 */
Ticker ontime; /* 开灯延迟 */
Ticker offtime; /* 关灯延迟 */
Ticker ggtime; /* 光感循环函数 */
Ticker ggnumtime; /* 光感循环函数 */
Ticker numtime; /* 倒计时定时函数*/
/* 新建组件对象 */
BlinkerButton Button1( "btn-abc" ); /* 开关 */
BlinkerButton Buttongg( "btn-gg" ); /* 光感模式 */
BlinkerButton Buttontg( "btn-s11" ); /* 体感模式 */
BlinkerButton Buttonsz( "btn-2z8" ); /* 设置 */
BlinkerButton Buttonbc( "btn-i4n" ); /* 保存 */
BlinkerRGB RGB1( "col-y9z" ); /* RGB */
BlinkerNumber guanggan( "num-gg" ); /* 光感 */
BlinkerSlider Slider( "ran-ilz" ); /* 进度条 */
BlinkerButton Buttonzt( "btn-t1q" ); /* 状态 */
BlinkerNumber dingshi1( "num-m0x" ); /* 光感 */
/******************按键调用&&&&&&&&&&&&&&&&&&&&&*/
OneButton button4( 4, true );
// 初始连接在单总线上的单总线设备
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
/* *******************按键事件定时关闭****************************************/
void flip()
{
ggtime.detach();/* 感光循环定时器关闭 */
ontime.detach();/* 开灯延迟定时器关闭 */
offtime.attach_ms( 30, offledtime );/*关闭灯光*/
Button1.print( "off" );/* 反馈开关 关 */
numtime.detach();/* 上传延迟定时器关闭 */
dingshinum2=0;
setmode1 = 4;/*关闭灯光loop 标识符*/
}
/* *************************上传倒计时时间****************************************/
void dingshidelay1()
{
if(dingshinum2==ycnum)
{
numtime.detach();/* 上传延迟定时器关闭 */
dingshinum2=0;
}
//
//BLINKER_LOG( "ycnum: ", ycnum );
//BLINKER_LOG( "dingshi: ", ycnum- dingshinum2 );
dingshinum2++;
}
/********************************** 按键事件回调函数********************************************/
/* 单击 */
void attachClick()
{
Serial.println( "人体感应开" );
if ( setmode2 == 3 )
{
ontime.attach_ms( 30, onledtime );/* 灯光 开 */
Button1.print( "on" );/* 反馈开关 开 */
dstime.once( ycnum*60, flip );/*倒计时分钟*/
// dingshinum2=ycnum;
dingshinum2=0;
numtime.attach( 60, dingshidelay1 );/*上传定时函数运算倒计时*/
setmode1 = 1;
}
}
void button_event_init()
{
button4.reset(); /* 清除一下按钮状态机的状态 */
button4.setDebounceTicks( 80 ); /* 设置消抖时长为80毫秒,默认值为:50毫秒 */
button4.attachClick( attachClick ); /* 初始化单击回调函数 */
}
/*按钮检测状态子程序 */
void button_attach_loop()
{
button4.tick();/*不断检测按钮按下状态 */
}
/************************************定时时间回调***************************************/
void slider_callback( int32_t value )
{
BLINKER_LOG( "Buttongg_callback state: ", value );
ycnum1 = value;
}
/*****************体感模式***************************************/
void Buttontg_callback( const String & state )
{
BLINKER_LOG( "Buttongg_callback state: ", state );
EEPROM.begin( 4096 );
EEPROM.write( 3506, 3 ); /* 给EEPROM 第0位,写入byte_1的值 */
EEPROM.commit();
EEPROM.end();
if ( state == "on" )
{
/* 反馈开关状态 */
Button1.print( "off" );/* 反馈开关 关 */
Buttongg.print( "off" );/* 反馈光感模式 关 */
Buttontg.print( "on" );/* 反馈体感模式 开 */
Buttonsz.print( "off" );/* 反馈设置 关 */
setmode2 = 3;
/* onled(0); */
} else if ( state == "off" )
{
/* 反馈开关状态 */
Button1.print( "off" );/* 反馈开关 关 */
Buttongg.print( "off" );/* 反馈光感模式 关 */
Buttontg.print( "off" );/* 反馈体感模式 关 */
Buttonsz.print( "off" );/* 反馈设置 关 */
dstime.detach(); /* 定时关闭 */
ontime.detach(); /* 开灯延迟 */
offtime.detach(); /* 关灯延迟 */
ggtime.detach(); /* 光感循环函数 */
numtime.detach(); /* 倒计时定时函数*/
/*
*offled(0);
* detach();
*/setmode2= 0;
setmode1 = 0;
}
}
/* **********************************************************开灯开灯回调函数*/
void onledtime()
{
ledcWrite( 0, map( lednum, 0, rgb_value2, 0, r_value2 ) ); /* 红色 */
ledcWrite( 1, map( lednum, 0, rgb_value2, 0, g_value2 ) ); /* 绿色 */
ledcWrite( 2, map( lednum, 0, rgb_value2, 0, b_value2 ) );
/*
*
* BLINKER_LOG( "lednum: ", lednum );
*/
if ( lednum >= 257 )
{
lednum = 255;
}
/* BLINKER_LOG( "onenum: ", lednum ); */
lednum++;
}
/*****************开灯关闭***************************************/
void offledtime()
{
ledcWrite( 0, map( lednum, 0, rgb_value2, 0, r_value2 ) ); /* 红色 */
ledcWrite( 1, map( lednum, 0, rgb_value2, 0, g_value2 ) ); /* 绿色 */
ledcWrite( 2, map( lednum, 0, rgb_value2, 0, b_value2 ) );
/* BLINKER_LOG( "offnum: ", lednum ); */
lednum--;
}
/*****************开关模式***************************************/
/* 按下按键即会执行该函数 */
void button1_callback( const String & state )
{
BLINKER_LOG( "getbutton1_ state: ", state );
/*****************开灯打开***************************************/
dstime.detach(); /* 定时关闭 */
ontime.detach(); /* 开灯延迟 */
offtime.detach(); /* 关灯延迟 */
ggtime.detach(); /* 光感循环函数 */
numtime.detach(); /* 倒计时定时函数*/
if ( state == "on" )
{
/* 反馈开关状态 */
Button1.print( "on" );/* 反馈开关 开 */
Buttongg.print( "off" );/* 反馈光感模式 关 */
Buttontg.print( "off" );/* 反馈体感模式 关 */
Buttonsz.print( "off" );/* 反馈设置 关 */
/* lednum = 0; */
ontime.attach_ms( 30, onledtime );/* 灯光 开 */
setmode1 = 1;
} else if ( state == "off" )
{
/*****************开灯关闭***************************************/
/* 反馈开关状态 */
Button1.print( "off" );/* 反馈开关 关 */
Buttongg.print( "off" );/* 反馈光感模式 关 */
Buttontg.print( "off" );/* 反馈体感模式 关 */
Buttonsz.print( "off" );/* 反馈设置 关 */
offtime.attach_ms( 30, offledtime );
setmode1 = 4;
}
}
/* ******************************感光数据返回回调函数定时1s 一次*********************/
void ggnum1time()
{
ggnum = analogRead( adcio ); /*感光数据获取0-1023*/
sensors.requestTemperatures(); // 发送命令获取温度
wendui=sensors.getTempCByIndex(0);
}
/* ******************************感光数据上传数据*****************************/
void heartbeat()
{
unsigned char val;
val = map( ggnum, 0, 1023, 0, 100 );
//BLINKER_LOG( "光感B", val );
guanggan.print( val );/*上传感光数据*/
dingshi1.print( ycnum- dingshinum2);/*定时时间上传*/
}
/* ******************************感光数据上传数据*****************************/
void dataStorage() {
unsigned char val;
val = map( ggnum, 0, 1023, 0, 100 );
//BLINKER_LOG( "光感B", val );
Blinker.dataStorage("gnum", val);
Blinker.dataStorage("weidu", wendui);
}
/************************************光感打开回调*/
void ggledtimeon()
{
/* BLINKER_LOG("光感 a ", ggnum); */
if ( ggnum <= 40 && ggval == 0 )
{
/*BLINKER_LOG("光感1", ggnum); */
offtime.detach();
ontime.attach_ms( 30, onledtime );/* 灯光 开 */
ggval = 1;
setmode1= 1;
}
if ( ggnum >= 160 && ggval == 1 )
{
/* BLINKER_LOG("光感2 ", ggnum); */
ontime.detach();/* 开灯延迟定时器关闭 */
offtime.attach_ms( 30, offledtime );
ggval = 0;
setmode1 = 4;
}
/**/
}
/*****************光感模式***************************************/
void Buttongg_callback( const String & state )
{
BLINKER_LOG( "Buttongg_callback state: ", state );
ledcWrite( 0, 0 ); /* 首先,先把所有的灯都关闭 */
ledcWrite( 1, 0 ); /* 可以随意设置开启关闭哪些灯,搭配出不同组合有不同颜色 */
ledcWrite( 2, 0 );
Buttonzt.print( "off" );
if ( state == "on" )
{
/* 反馈开关状态 */
Button1.print( "off" );/* 反馈开关 关 */
Buttongg.print( "on" );
Buttontg.print( "off" );/* 反馈体感模式 关 */
Buttonsz.print( "off" );/* 反馈设置 关 */
/* setmode1 = 2; */
offtime.detach();
ontime.detach();/* 开灯延迟定时器关闭 */
lednum = 0;
ggtime.attach_ms( 500, ggledtimeon );
} else if ( state == "off" )
{
/* 反馈开关状态 */
Button1.print( "off" );/* 反馈开关 关 */
Buttongg.print( "off" );/* 反馈光感模式 关 */
Buttontg.print( "off" );/* 反馈体感模式 关 */
Buttonsz.print( "off" );/* 反馈设置 关 */
ontime.detach();/* 开灯延迟定时器关闭 */
lednum = 0;
ggtime.detach();/* 感光循环定时器关闭 */
setmode1 = 0;
}
}
/*****************设置***************************************/
void Buttonsz_callback( const String & state )
{
BLINKER_LOG( "Buttongg_callback state: ", state );
if ( state == "on" )
{
/* 反馈开关状态 */
Buttonzt.print( "on" );
Buttonsz.print( "on" );
Button1.print( "off" );/* 反馈开关 关 */
Buttongg.print( "off" );/* 反馈光感模式 关 */
Buttontg.print( "off" );/* 反馈体感模式 关 */
ztmode = 1; /* 设置 */
} else if ( state == "off" )
{
/* 反馈开关状态 */
Buttonsz.print( "off" );/* 反馈设置 关 */
Button1.print( "off" );/* 反馈开关 关 */
Buttongg.print( "off" );/* 反馈光感模式 关 */
Buttontg.print( "off" );/* 反馈体感模式 关 */
ztmode = 0;
}
}
/*****************颜色调节***************************************/
void rgb1_callback( unsigned char r_value, unsigned char g_value,
unsigned char b_value, unsigned char bright_value )
{
bright_value = 255 - bright_value;
if ( bright_value > r_value )
{
r_value1 = 0;
}else{ r_value1 = r_value - bright_value; }
if ( bright_value > g_value )
{
g_value1 = 0;
}else{ g_value1 = g_value - bright_value; }
if ( bright_value > b_value )
{
b_value1 = 0;
}else{ b_value1 = b_value - bright_value; }
if ( ztmode == 1 )
{
ledcWrite( 0, r_value1 ); /* 首先,先把所有的灯都关闭 */
ledcWrite( 1, g_value1 ); /* 可以随意设置开启关闭哪些灯,搭配出不同组合有不同颜色 */
ledcWrite( 2, b_value1 );
}
}
/*****************保存***************************************/
void Buttonbc_callback( const String & state )
{
BLINKER_LOG( "Buttongg_callback state: ", state );
if ( state == "tap" )
{
/* 反馈开关状态 */
if ( ztmode == 1 )
{
EEPROM.begin( 4096 );
EEPROM.write( 3500, r_value1 ); /* 给EEPROM 第0位,写入byte_1的值 */
EEPROM.commit();
EEPROM.write( 3501, g_value1 ); /* 给EEPROM 第0位,写入byte_1的值 */
EEPROM.commit();
EEPROM.write( 3502, b_value1 );
EEPROM.commit();
EEPROM.write( 3503, ycnum1 );
EEPROM.commit();
r_value2= r_value1;
g_value2= g_value1;
b_value2= b_value1;
/*****************熄灭灯光***************************************/
ledcWrite( 0, 0 ); /* 首先,先把所有的灯都关闭 */
ledcWrite( 1, 0 ); /* 可以随意设置开启关闭哪些灯,搭配出不同组合有不同颜色 */
ledcWrite( 2, 0 );
if ( g_value2 <= r_value2 )
{
rgb_value2 = r_value2;
}else{ rgb_value2 = g_value2; }
if ( rgb_value2 <= b_value2 )
{
rgb_value2 = b_value2;
}
dingshi1.print( ycnum1);
/*
*BLINKER_LOG( "R value: ", r_value1 );
*BLINKER_LOG( "G value: ", g_value1 );
*BLINKER_LOG( "B value: ", b_value1 );
*r_value2= EEPROM.read( 3500 );
*g_value2= EEPROM.read( 3501 );
*b_value2= EEPROM.read( 3502 );
*BLINKER_LOG( "R value: ", r_value2 );
*
*BLINKER_LOG( "G value: ", g_value2 );
*
*BLINKER_LOG( "B value: ", b_value2 );*/
EEPROM.end();
Button1.print( "off" );/* 反馈开关 关 */
Buttonsz.print( "off" );/* 反馈设置 关 */
Buttonzt.print( "off" );
Buttongg.print( "off" );/* 反馈光感模式 关 */
if(setmode3==3)
{
Buttontg.print( "on" );/* 反馈体感模式 开 */
setmode2 = 3;
}
ztmode = 0;
}
}
}
void setup()
{
Serial.begin( 115200 ); /* 初始化串口 */
button_event_init(); /*按钮事件初始化 */
BLINKER_DEBUG.stream( Serial );
Blinker.begin( auth, ssid, pswd );
Blinker.attachDataStorage(dataStorage);
EEPROM.begin( 4096 );
r_value2= EEPROM.read( 3500 );
g_value2= EEPROM.read( 3501 );
b_value2= EEPROM.read( 3502 );
ycnum = EEPROM.read( 3503 );
setmode3= EEPROM.read( 3506 );/* 1为开关开,2为光感 3为体感,4为开关开 */
dingshi1.print( ycnum);/*定时时间上传*/
if ( g_value2 <= r_value2 )
{
rgb_value2 = r_value2;
}else{ rgb_value2 = g_value2; }
if ( rgb_value2 <= b_value2 )
{
rgb_value2 = b_value2;
}
Button1.print( "off" );/* 反馈开关 关 */
Buttongg.print( "off" );/* 反馈光感模式 关 */
Buttontg.print( "off" );/* 反馈体感模式 关 */
Buttonsz.print( "off" );/* 反馈设置 关 */
//pwm//
pinMode(25,OUTPUT);
pinMode(26,OUTPUT);
pinMode(27,OUTPUT);
ledcSetup(0,50000,8); //LEDC的PWM通道参数,可选0~15;10Hz到40MHz , 但较高的频率精确度低; 占空比分辨率(可选1~16), 比如bit_num=8 则范围 0~2的8次方 , 也就是0~255
ledcSetup(1,50000,8);
ledcSetup(2,50000,8);
ledcAttachPin(25,0);
ledcAttachPin(26,1);
ledcAttachPin(27,2);
if(setmode3==3)
{
Buttontg.print( "on" );/* 反馈体感模式 开 */
setmode2 = 3;
}
/*
* BLINKER_DEBUG.debugAll();
* EEPROM.begin(4096); //开启EEPROM,开辟1024个位空间
*/
/* 初始化有LED的IO */
/*
* 初始化blinker
*
* 初始化绑定按键
*/
Button1.attach( button1_callback ); /* 开关 */
Buttongg.attach( Buttongg_callback ); /* 光感模式 */
Buttontg.attach( Buttontg_callback ); /* 体感模式 */
Buttonsz.attach( Buttonsz_callback ); /* 设置模式 */
Buttonbc.attach( Buttonbc_callback ); /* 保存模式 */
Slider.attach( slider_callback ); /* 设置时间 */
ggnumtime.attach( 1, ggnum1time ); /* 感光 */
/* 初始化rgb */
RGB1.attach( rgb1_callback );
/* 注册一个心跳包 */
Blinker.attachHeartbeat( heartbeat );
ledcWrite( 0, 0 ); /* 红色 */
ledcWrite( 1, 0 ); /* 绿色 */
ledcWrite( 2, 0 );
// 初始库
sensors.begin();
}
void loop()
{
Blinker.run();
button_attach_loop();
/* 1为开关开,2为光感 3为体感,4为开关开 */
switch ( setmode1 )
{
case 1:
if ( rgb_value2 <= lednum )
{
ontime.detach();/* 开灯延迟定时器关闭 */
offtime.detach();
setmode1 = 0;
Buttonzt.print( "on" );
}
break;
case 4:/*BLINKER_LOG( "ednum: ", lednum );*/
if ( 0 >= lednum )
{
ontime.detach();/* 开灯延迟定时器关闭 */
offtime.detach();
ledcWrite( 0, 0 ); /* 红色 */
ledcWrite( 1, 0 ); /* 绿色 */
ledcWrite( 2, 0 );
setmode1 = 0; lednum = 0;
Buttonzt.print( "off" );
}
break;
case 3:
break;
default: break;
}
}
页:
[1]