Arduino 打造一个小夜灯

玩了很久的 arduino 老婆一直抱怨没有做过什么实用的东西,这次就做个方便晚上下床的小夜灯。
从技术角度讲非常简单:一个红外遮挡开关(本来是打算用圆柱形的那种,结果买来不好用【参考1】),当收到被阻挡的信号之后,自动从暗到亮,间隔特定时间之后再从亮到暗的灭掉。灯珠选择的是 WS2811。这种是全色灯,理论上有 2^24种颜色(其实肉眼根本分别不出这么多种类,另外,你再看到什么灯吹嘘自己一千六百万种颜色,就知道是和“奥氏体304不锈钢”一样,听上去牛逼的名字而已)。Arduino搭配专门的库函数,控制这个灯还是很方便的。顺便介绍一下原理:这些灯都是WS2811芯片串联起来的,每个灯珠里面都封装着一颗LED和芯片。对外的线有2组,每组都是三根线:VCC/GND/DATA。VCC是5V,所以用起来比较方便的,直接Arduino供电就可以(前提是不要超过Arduino提供电流的上限200ma,如果你不确定最大电流最好像我一样单独供电)。信号方面,每个灯颜色是8位的R ,8位的G,8位的B,串行给出。当第一个WS2811收到信号之后,他会取下自己的RGB颜色,把剩下的信号继续传下去。这样,一根信号线即可给出全部灯珠的颜色信号。

image002

下面就动手开始做了。买来的灯是连接好的一整条,我把它拆成2个一组了。中间使用“SM2.54 接插件 2.54MM 公母壳+公母簧片 对插SM-3P”进行连接。使用这样的插接线的好处是:容易扩充和调整。缺点是:需要手工压头,感觉上我做的连接可靠性不是很高。后来每个插脚除了压合,我还用电烙铁简单焊接了一下。

image003
图片来自佐田旗舰店【参考2】

电路上比较简单,我选择 Arduino Pro Micro,编程方便,体积适中。下面是连接的示意图,特别注意WS2811灯条是有方向的。一边是输入,一边是输出。

image005

代码如下,其中的颜色可以根据具体情况进行调整,这里只是简单演示:

#include "FastLED.h"

//红外传感器(开关用)
#define  IRNear A2
//灯带用的数据Pin
#define DATA_PIN 10

//灯带上灯的数量
#define NUM_LEDS 6

//灯带颜色
CRGB leds[NUM_LEDS];


void setup() {
  //初始化灯带
  FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);

  //初始化接近开关
  pinMode(IRNear, INPUT_PULLUP);
}

void loop() {

  Serial.println("Led start working");

  //灯带关闭状态
  for (int i = 0; i < NUM_LEDS; i++ )
  {
    leds[i] = CRGB::Black;
    FastLED.show();
  }
  //等待稳定
  delay(1000);
  
  if (0==digitalRead(IRNear)) {
     delay(200);
     if (0==digitalRead(IRNear)) {
        for (int i = 0; i < NUM_LEDS; i++ )
           {
             leds[i] = CRGB(255,83,0);
           }
        for (int j=0; j<255; j++)
           {
            FastLED.show(j);
            delay(100);
           }   
        delay(15000);    
        for (int i = 0; i < NUM_LEDS; i++ )
           {
             leds[i] = CRGB::Red;
           }        
        for (int j=255; j>10; j--)
           {
            FastLED.show(j);
            delay(100);
           } 
        for (int i = 0; i < NUM_LEDS; i++ )
           {
             leds[i] = CRGB::Black;
             FastLED.show();
           }    
        
     }//if (0==digitalRead(IRNear)) {
  }//if (0==digitalRead(IRNear)) {
}

 

组装好的灯测试是下面这样
image007

采用磁铁固定,用粘性低的胶带包裹然后固定在线上。
image009

最上面是遮挡开关,最下面是多出来的一根线。如果等不够,随时可以再添加上一些。
为了美观和可靠,后面又用纸盒把遮挡开关包裹了一下,同样在这个开关后面也有个用于固定的磁铁。

image011

床是铁的,直接粘在外面实验一下。

image013

最后安装之后就是这个样子,其实最好是让每个灯垂直照射地面,不过晚上实验表明这个作为照明已经足够了。

image015

当一只脚落在地面上,遮挡开关会触发,然后灯会缓慢亮起,到达最亮之后维持15秒,切换为红色,随后再逐渐暗下。
老婆实验之后,提出了一个问题:如果我把一直腿垂在床边,那他岂不是要一直工作?这不好吧?
我的回复是谢霆锋的 《1999谢谢你的爱》。

参考:
1. 再次提醒,买回来的东西一定要及时测试,否则卖家不认账
2. 作者已经哭死,从他们家买了三样东西,历时一周才拿到手上(熊猫慢递)。反复盘点发现他们居然少发了电线。联系卖家一直没动静。然后选择了天猫的退款。结果点的是“退货退款”……两天后,客服告诉我,要选“只退款”。等我取消上一次的请求之后惊奇的发现竟然没有办法再次申请。联系淘宝客服,对方听完我的陈述之后,告诉我去找天猫,俺们不是一家。我又拨打了天猫的热线,客服小伙听过讲述之后,很快发给我一个无法打开的链接(鬼知道为什么搞错了);没办法,又打了一次,给了一个可以打开的链接,目前正在处理中ing.最后结果是退款了,但是前后差不多用了2周。可以说,如果以后有机会在淘宝店买东西也不要在天猫店买东西,服务差别很大。

Arduino 打造一个小夜灯》上有 2 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注