RGB灯带控制(恒流控制)-Arduino中文社区 - Powered by Discuz! Archiver

pmsjzj 发表于 2022-4-7 16:28

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]
查看完整版本: RGB灯带控制(恒流控制)