一、介绍
该台灯有两种模式,分别为自动模式和手动模式。
- 自动模式:在自动模式下,可以实现人走灯灭进入待机状态,人来继续进入上一次功能运行。
- 手动模式:
在手动模式下,感应模块无效,手动开关台灯。
- 可以切换手动/自动模式
- 在自动模式下,人走延时关灯,人来开灯并且为上次使用效果,按键灯常亮;
- 在自动模式下,人走延时关灯后进入待机状态,按键灯呼吸;
- 在自动模式下,切换至夜灯后可智能调节亮度;
该台灯有12种功能分别是:
(1)台灯冷暖光调节
功能选择至台灯冷暖光调节下,默认为正白50%+暖白50%点亮。此时短按旋钮后旋转旋钮进行冷暖光调节。
(2)台灯亮度调节
当台灯调节至合适色温后,短按旋钮后顺时针旋转旋钮一下再次短按旋钮进入台灯亮度调节(保持先前设定的色温)。
(3)聚光灯
在台灯末端设计聚光灯,在台灯使用过程中如遇细小物品可使用聚光灯。同样的,切换至聚光灯后,短按旋钮可调节聚光灯亮度。
(4)聚光灯+台灯
此时聚光灯和台灯同时被点亮,短按旋钮进入亮度调节。
(5)台灯+氛围灯(彩虹流动)
此时台灯和氛围灯同时被点亮,氛围灯以彩虹流动动态变化效果运行,短按旋钮进入台灯亮度调节。
(6)单独氛围灯(彩虹流动)
此时台灯被熄灭,仅留氛围灯以彩虹流动动态变化效果运行。
(7)单独氛围灯炫彩颗粒
此时改变氛围灯效果为炫彩颗粒动态闪烁运行。
(8)动态氛围定格
此时为上一功能下动态氛围效果的定格,定格后以定格到的效果静态运行。如该功能前一个功能为单独氛围灯炫彩闪烁,后一个功能为音乐氛围灯,当从音乐氛围灯切换至该功能下则定格音乐氛围灯在切换时的样式,当从单独氛围灯炫彩闪烁切换至该功能下则定格炫彩闪烁氛围在切换时的样式。
(9)音乐氛围灯
此时为音乐氛围灯,多彩的氛围灯会随环境中音乐节奏变化。
(10)单色氛围+台灯亮度调节
此时单色静态氛围灯和台灯同时被点亮,短按旋钮后进入台灯亮度调节。
(11)单色氛围调色+台灯
此时单色静态氛围灯和台灯同时被点亮,短按旋钮后进入单色氛围灯颜色调节。
(12)夜灯模式
夜灯模式下短按按键进入调节,此时旋转旋钮可调节氛围颜色,人来缓慢亮起,一段时间后缓慢变暗。即进入夜灯模式后,当台灯检测到人睡下后,白光将缓慢变暗至适合睡眠,当人在夜里起身时,白光将缓慢变亮至适合行动(在自动模式下生效,手动模式下则一直高亮)
您可以按照本文提供的源码进行搭建一个同样的多功能智能台灯,或者本文及源码可以给您启发,帮助您进行其他好玩或创意的产品设计与开发。
二、组件
台灯中用到的组件有:
-
Arduion主板
-
面包板
-
杜邦线
-
旋转编码器
-
声音传感器
-
人体红外传感器
-
蓝色LED灯珠
-
白色高亮LED灯珠
-
正白LED灯珠
-
暖白LED灯珠
-
sw2812灯带两条 一条11灯珠,用做状态灯;一条12灯珠,用做氛围灯
-
电源开关
三、接线表
组件 | 引脚 | 对应开发板引脚 |
---|---|---|
旋转编码器 | + | 5V |
GND | GND | |
SW | 2 | |
CLK | A2 | |
DT | A1 | |
声音传感器 | GND | GND |
VCC | 5V | |
A0 | A0 | |
人体红外感应 | GND | GND |
VCC | 5V | |
D0 | 8 | |
将D0和GND短接后为手动模式 | ||
SW2812灯带(11灯珠) | GND | GND |
VCC | 5V | |
DIN | 4 | |
SW2812灯带(12灯珠) | GND | GND |
VCC | 5V | |
DIN | 7 | |
蓝色灯珠 | +极(长脚) | 3 |
-极 | GND | |
白色高亮LED灯珠(聚光灯) | +极 | 10 |
-极 | GND | |
正白LED灯珠 | +极 | 5 |
-极 | (串联200欧姆电阻到)5V | |
暖白LED灯珠 | +极 | 6 |
-极 | (串联200欧姆电阻到)5V | |
有源蜂鸣器 | VCC | 12 |
GND | GND | |
有源蜂鸣器 | 输入 | 串联在电源线上 |
输出 |
四、源码
/*暧科丝创科技
0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0
* X-多功能智能台灯
* **************************************************************************
* X-多功能智能台灯是客户在短视频平台看到多个桌面场景后在暧科丝创科技定制的一款多动能智能台灯。
* 您可以在 暧科丝创科技 旗下运营的 X创科技(小程序)平台中查看成品样式。
* 微信搜索 X创科技 (公众号或小程序),进入小程序后可在“私人定制”联系3D打印外壳,或者定制其他产品。
* 备注:在“私人定制”端口您可以定制其他您想定制的或者您发现生活中可以改进的地方或项目,定制产品将有可
能产生收入,具体可在“私人定制”中了解详情。
* 您可以成为我们的用户,则说明您是相关技术的专业人员或者是兴趣爱好者,您同样可以在我们的 X创科技 小程序内
进入“云合伙人”入驻成为我们 暧科丝创科技 的云合伙人,参与项目的开发,然后拿到相应份额的项目收入,具体您
可以进入云合伙人了解详情。
* 在您开发过程中遇到问题可在 X创科技 小程序中联系我们。
************************************************************************
*功能设计
*可以切换手动/自动模式
*在自动模式下,人走延时关灯,人来开灯并且为上次使用效果,按键灯常亮;
*在自动模式下,人走延时关灯后进入待机状态,按键灯呼吸;
*短按按键状态灯在进度条样式和功能状态样式间进行切换,旋转按键可切换模式或调节;
*状态灯变为进度条样式,显示此时亮度;在调节模式下,旋转按钮可以调节亮度、色温或者亮度
*夜灯模式下可调节亮度,人来缓慢亮起,一段时间后缓慢变回(在自动模式下生效,手动模式下则一直高亮)
*多种模式:台灯冷暖光调节模式、台灯亮度调节模式、聚光灯模式、聚光灯+台灯模式、台灯+氛围灯(彩虹流动)模式、
单独氛围灯(彩虹流动)模式、单独氛围灯炫彩颗粒模式、动态氛围定格模式、音乐氛围灯模式、单色氛围+台灯亮度调
节模式、单色氛围调色+台灯模式、夜灯模式
************************************************************************/
#include <SCoop.h>
#include <FastLED.h>
#define ZWledPin 5 //定义正白LED灯光控制引脚
#define NWledPin 6 //定义暖白LED灯光控制引脚
#define keyledPin 3 //定义按键灯引脚
#define SledPin 10 //定义聚光射灯控制引脚
#define keyPin 2 //定义按键引脚
#define dtPin A1 //定义编码器DT引脚
#define clkPin A2 //定义编码器CLK引脚
#define bodysenserPin 8 //定义人体传感器引脚
#define buzzerPin 12 //定义蜂鸣器引脚
#define NUM_LEDS 12 //设置sw2812氛围灯灯珠数
#define LED_PIN 7 //定义sw2812氛围灯控制引脚
#define NUM_STATELEDS 11 //设置sw2812状态等灯珠数
#define STATELED_PIN 4 //定义sw2812状态灯控制引脚
int mic_senserPin = A0; //定义声音传感器控制引脚
int sound_value; //建立声音传感器变量
int sound_a; //建立声音传感变量寄存变量1
int sound_b; //建立声音传感变量寄存变量2
int sound; //建立声音传感执行变量
int k = 0; //定义按键变量
int x = 128; //建立寄存变量1
int night_light = 0; //定义夜灯触发变量
uint8_t gHue = 0; //建立氛围灯计时变量
bool bodyVal = 0; //建立人体感应变量
int m = 0 ; //定义模式变量寄存变量
int zw = 0; //建立正白光控制变量
int nw = 0; //建立暖白光控制变量
int cwkeep; //建立色温寄存变量
int bkeep; //建立亮度寄存变量
int model = 11; //建立模式变量
int level = 11; //建立程度变量
int castwo; //建立状态灯对应事件变量1
int casthree; //建立状态灯对应事件变量2
int casfour; //建立状态灯对应事件变量3
int casfive; //建立状态灯对应事件变量4
int casten; //建立状态灯对应事件变量5
int castwelve; //建立状态灯对应事件变量6
CRGB leds[NUM_LEDS]; //建立sw2812氛围灯对象
CRGB stateleds[NUM_STATELEDS]; //建立sw2812状态灯对象
#define BRIGHTNESS 96
#define FRAMES_PER_SECOND 120
defineTask(TaskOne); // 创建子线程1=> 按键、编码器、人体感应等底层控制逻辑线程
defineTask(TaskTwo); // 创建子线程2=> 功能运行线程
defineTask(TaskThree); // 创建子线程3=> 按键灯工作、状态灯运行线程
/*-------------------------------------------------------*/
void TaskOne::setup(){ // 线程1设定=>编码器、红外感应、模式切换等底层逻辑线程
pinMode(keyledPin,OUTPUT); //定义按键灯控制引脚模式
pinMode(bodysenserPin,INPUT_PULLUP); //定义人体感应传感器控制引脚模式
pinMode(buzzerPin,OUTPUT); //定义蜂鸣器控制引脚模式
pinMode(keyPin,INPUT); //定义按键控制引脚模式
pinMode(dtPin,INPUT); //定义编码器dt引脚模式
pinMode(clkPin,INPUT); //定义编码器clk引脚模式
FastLED.addLeds<WS2812B, STATELED_PIN, RGB>(stateleds, NUM_STATELEDS); //建立状态灯
Serial.begin(9600);
}
void TaskOne::loop(){ //线程1循环
/********************************************/
/*编码器运行部分*/
static int oldA = HIGH;
static int oldB = HIGH;
int result = 0;
int newA = digitalRead(dtPin);
int newB = digitalRead(clkPin);
if (newA != oldA || newB != oldB)
{
if (oldA == HIGH && newA == LOW)
{
result = 0-(oldB * 2 - 1);
fill_solid(stateleds, 11, CHSV (0, 0, 0));
FastLED.show(stateleds);
}
}
oldA = newA;
oldB = newB;
x = x + result*3; //设置长范围变量1
x = constrain(x, 1, 255); //设定变量取值范围
/**********************************************/
/*按键工作*/
int Value = digitalRead(keyPin); //读取按键值
if(Value == 0) //如果按键按下
{
digitalWrite(buzzerPin,HIGH); //打开蜂鸣器
delay(50);
digitalWrite(buzzerPin,LOW); //蜂鸣器工作50ms后关闭
k = k+1;
fill_solid(stateleds, 11, CHSV (0, 0, 0)); //刷新一次状态灯
FastLED.show(stateleds);
delay(150);
}
/*********************************************/
/*人体红外感应传感器运行逻辑*/
bodyVal = digitalRead(bodysenserPin); //读取人体红外感应传感器
if(model == 12){ //判断此时系统工作模式, 当系统在夜灯模式下
if(bodyVal == 1){ //如果人体红外传感关断
model = 12; //继续保持在夜灯模式下运行
}
}
else{ //当系统在其他模式下运行时
if(bodyVal == 1){ //如果人体红外传感关断
model = 0; //此时系统进入待机状态
}
else{ //否则
model = m; //系统回到人体红外感应传感关断前的模式
}
}
/*********************************************/
/*按键事件*/
if (k%2 == 0) //按键事件1-->进入模式选择
{
model = model + result; //模式变量赋值
model = constrain(model, 0, 12); //设置模式变量变化区间
m = m + result; //模式寄存变量赋值
m = constrain(m, 0, 12);
switch(model)
{
case 0: //按键logo灯呼吸,待机模式
fill_solid(stateleds, 11, CHSV (0, 0, 0));
FastLED.show();
break;
///
case 1: //冷暖光调节模式
stateleds[0] = (200,0,160);
FastLED.show();
break;
///
case 2: //亮度调节模式
stateleds[1] = (200,0,160);
FastLED.show();
break;
///
case 3: //切换至聚光射灯模式
stateleds[2] = (200,0,160);
FastLED.show();
break;
///
case 4: //切换至聚光灯+白光模式
stateleds[3] = (200,0,160);
FastLED.show();
break;
///
case 5: //切换至白光灯+氛围灯(流动)模式
stateleds[4] = (200,0,160);
FastLED.show();
break;
///
case 6: //切换至氛围灯(流动)模式
stateleds[5] = (200,0,160);
FastLED.show();
break;
///
case 7: //切换至氛围灯(闪烁)模式
stateleds[6] = (200,0,160);
FastLED.show();
break;
///
case 8: //切换至氛围灯(闪烁)定格模式
stateleds[7] = (200,0,160);
FastLED.show();
break;
///
case 9: //切换至音乐节奏氛围灯模式
stateleds[8] = (200,0,160);
FastLED.show();
break;
///
case 10: //切换至白光+氛围灯(单色)调光模式
stateleds[9] = (200,0,160);
FastLED.show();
break;
///
case 11: //切换至白光+氛围灯(单色)调色模式
stateleds[10] = (200,0,160);
FastLED.show();
break;
///
case 12: //夜灯模式 ***暗光运行,感应-渐亮
/* 夜灯模式下熄灭状态灯 */
break;
}
}
/*********************************************************************************************************************************/
if (k%2 != 0) //按键事件2-->进入程度调节
{
level = level + result; //程度值赋值
level = constrain(level, 1, 22); //设置程度值变化区间
}
}
/*----------------------------------------------------------------------------------------------------*/
void TaskTwo::setup(){ //线程2设定=>功能运行线程
pinMode(SledPin,OUTPUT); //定义射灯引脚模式
pinMode(ZWledPin,OUTPUT); //定义正白灯光控制引脚模式
pinMode(NWledPin,OUTPUT); //定义暖白灯光控制引脚模式
pinMode(mic_senserPin,INPUT); //定义声音传感器引脚模式
FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); //初始化氛围灯带
FastLED.setBrightness(BRIGHTNESS);
Serial.begin(9600);
}
void TaskTwo::loop(){ //线程2循环
int cw; //建立色温变量
int b; //建立亮度变量
switch(model)
{
case 0: //熄灭除状态灯以外的所有灯
analogWrite(SledPin,0);
analogWrite(ZWledPin,0);
analogWrite(NWledPin,0);
fill_solid(leds, 12, CHSV (0, 0, 0));
FastLED.show();
break;
case 1: //冷暖光调节
cw = level*11 + 0;
cwkeep = level*11 + 0;
analogWrite(ZWledPin,cw);
analogWrite(NWledPin,255-cw);
break;
///
case 2: //亮度调节
zw = cwkeep * level/22;
nw = (255-cwkeep) * level/22;
analogWrite(ZWledPin,zw);
analogWrite(NWledPin,nw);
analogWrite(SledPin,0);
break;
///
case 3: //切换至聚光射灯
fill_solid(leds, 12, CHSV (140, 255, 0));
analogWrite(ZWledPin,0);
analogWrite(NWledPin,0);
cw = level*11;
analogWrite(SledPin,cw);
break;
///
case 4: //组合样式1. =>聚光射灯&白光灯
cw = level*11;
fill_solid(leds, 12, CHSV (140, 255, 0));
analogWrite(SledPin,cw);
analogWrite(ZWledPin,cw);
analogWrite(NWledPin,cw);
break;
///
case 5: //组合样式2.=>彩虹氛围灯&白光灯
b = level*11;
analogWrite(SledPin,0);
analogWrite(ZWledPin,b);
analogWrite(NWledPin,b);
fill_rainbow( leds, NUM_LEDS, gHue, 7);
FastLED.show();
EVERY_N_MILLISECONDS( 15 ) { gHue++; }
break;
///
case 6: //切换至氛围灯模式1 ->彩虹
analogWrite(ZWledPin,0);
analogWrite(NWledPin,0);
fill_rainbow( leds, NUM_LEDS, gHue, 7);
FastLED.show();
EVERY_N_MILLISECONDS( 15 ) { gHue++; }
break;
///
case 7: //切换至氛围灯模式2 ->炫彩闪烁
fadeToBlackBy( leds, NUM_LEDS, 10);
int pos = random16(NUM_LEDS);
leds[pos] += CHSV( gHue + random8(64), 200, 255);
FastLED.show();
EVERY_N_MILLISECONDS( 15 ) { gHue++; }
break;
///
case 8: //切换至氛围灯模式3 ->炫彩闪烁定格
fadeToBlackBy( leds, NUM_LEDS, 20);
pos = beatsin16( 13, 0, NUM_LEDS-1 );
leds[pos] += CHSV( gHue, 255, 192);
FastLED.show();
EVERY_N_MILLISECONDS( 15 ) { gHue++; }
break;
}
///
if(model == 9){ //切换至音乐氛围灯
analogWrite(ZWledPin,0); //熄灭正白灯光
analogWrite(NWledPin,0); //熄灭暖白灯光
sound_value = analogRead(mic_senserPin); //声音值第一次采样并处理
sound_a = abs(sound_value*5);
delay(20);
sound_value = analogRead(mic_senserPin); //声音值第二次采样并处理
sound_b = abs(sound_value*5);
sound = max(sound_a,sound_b) - min(sound_a,sound_b); //处理声音值
fill_rainbow( leds, NUM_LEDS, sound*3, 10); //用灯带表达声音值
FastLED.show();
delay(30);
}
///
if(model == 10){ //组合样式2>白光亮度调节+氛围灯单色静态
b = level*11 + 0;
bkeep = level*11 + 0;
analogWrite(ZWledPin,b);
analogWrite(NWledPin,b);
fill_solid(leds, 12, CHSV (140, 255, 200));
FastLED.show();
}
///
int h; //建立颜色值变量
if(model == 11){ //组合样式3>白光+氛围灯单色静态调色
h = 0 + x;
analogWrite(ZWledPin,bkeep);
analogWrite(NWledPin,bkeep);
fill_solid(leds, 12, CHSV (h, 255, 200));
FastLED.show();
}
///
if(model == 12){ //夜灯模式 ***暗光运行,感应-渐亮
h = 0 + x; //氛围灯颜色调节
fill_solid(leds, 12, CHSV (h, 200, 66));
FastLED.show();
if(bodyVal == 1){ //人体感应未触发
if(night_light > 0){ //判断此时白光亮度值
night_light = night_light - 1; //白光逐渐变暗
int y = night_light;
analogWrite(ZWledPin,5+y);
analogWrite(NWledPin,5+y);
delay(25);
}
else{ //判断此时白光亮度值
analogWrite(ZWledPin,5); //保持暗光运行
analogWrite(NWledPin,5);
}
}
else{ //人体感应触发
if(night_light <= 190){ //判断此时白光亮度值
night_light = night_light + 1; //白光逐渐变亮
int y = night_light;
analogWrite(ZWledPin,5+y);
analogWrite(NWledPin,5+y);
delay(25);
}
else{ //判断此时白光亮度值
analogWrite(ZWledPin,200);
analogWrite(NWledPin,200);
}
}
}
}
/*----------------------------------------------------------------------------------------------------*/
void TaskThree::setup(){ //线程3设定 =>按键logo灯设定
pinMode(keyledPin,OUTPUT); //定义按键灯控制引脚模式
FastLED.addLeds<WS2812B, STATELED_PIN, RGB>(stateleds, NUM_STATELEDS); //建立状态灯
//FastLED.setBrightness(BRIGHTNESS);
Serial.begin(9600);
}
void TaskThree::loop(){ //线程3循环 -->按键logo灯控制
if (k%2 != 0) //进入调节状态
{
switch(model)
{
case 0: //按键logo灯呼吸状态
fill_solid(stateleds, 11, CHSV (0, 0, 0));
FastLED.show();
break;
///
case 1: //冷暖光调节
fill_solid(stateleds, 11, CHSV (127, 200, 100));
FastLED.show();
delay(20);
break;
///
case 2: //亮度调节
castwo = level/2 ;
fill_solid(stateleds, castwo, CHSV (150, 200, 200));
FastLED.show(stateleds);
delay(20);
break;
///
case 3: //聚光射灯亮度调节
casthree = level/2 ;
fill_solid(stateleds, casthree, CHSV (150, 200, 200));
FastLED.show(stateleds);
delay(20);
break;
///
case 4: //聚光射灯+白光 整体亮度调节
casfour = level/2 ;
fill_solid(stateleds, casfour, CHSV (150, 200, 200));
FastLED.show(stateleds);
delay(20);
break;
///
case 5: //氛围灯(流动)+白光模式下 白光亮度调节
casfive = level/2 ;
fill_solid(stateleds, casfive, CHSV (150, 200, 200));
FastLED.show(stateleds);
delay(20);
break;
///
case 6: //氛围灯(流动) 无调节
fill_solid(stateleds, 11, CHSV (127, 200, 33));
FastLED.show(stateleds);
break;
///
case 7: //氛围灯(炫彩闪烁) 无调节
fill_solid(stateleds, 10, CHSV (127, 200, 33));
FastLED.show(stateleds);
break;
///
case 8: //氛围灯(炫彩闪烁)定格 无调节
fill_solid(stateleds, 11, CHSV (127, 200, 33));
FastLED.show(stateleds);
break;
///
case 9: //音乐氛围灯 无调节
/* 音乐氛围灯模式下状态灯无调节 */
break;
///
case 10: //单色氛围灯+白光模式下 白光亮度调节
casten = level/2 ;
fill_solid(stateleds, casten, CHSV (150, 200, 200));
FastLED.show(stateleds);
break;
///
case 11: //单色氛围灯+白光模式下 氛围灯颜色调节
fill_solid(stateleds, 11, CHSV (127, 200, 33));
FastLED.show(stateleds);
break;
///
case 12: //夜灯模式 ***暗光运行,感应-渐亮
/* 状态灯熄灭 */
break;
}
}
if(model == 0){ //当模式值为0时
int a=0; //建立临时变量
for(a=0;a<=150;a++){
analogWrite(keyledPin,a); //按键logo灯呼吸渐亮
delay(15);
}
for(a=150;a>=0;a--){
analogWrite(keyledPin,a); //按键logo灯呼吸渐暗
delay(15);
}
}
else{
analogWrite(keyledPin,255); //当模式值非0时,按键灯常亮
}
}
/*----------------------------------------------------------------------------------------------------*/
void setup(){
mySCoop.start();
}
void loop(){
yield();
}
五、现象
手工电子制作-智能台灯