项目:智能灯带远程控制(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_blue 13
- #define led_red 25
- #define led_green 26
- #define led_blue 27
- /* ********************wifi设置****************************/
- // char auth[] = "";
- // char ssid[] = "qq2260376628";
- // char pswd[] = "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 int lednum;
- 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( "get button1_ 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;
- }
- }
复制代码
cs.pdf
(77.02 KB, 下载次数: 9)
|