一板网电子技术论坛

风筝
发表于: 2018-10-12 11:07:33 | 显示全部楼层

我最近购买了一个Neo Pixel LED灯条,它的工作方式给我留下了深刻的印象。微型LED具有内置驱动器IC,可帮助我们单独控制每个LED,并可产生多种颜色。作为一个沉迷于色彩的花哨的人,我真的很喜欢看到这些微小的LED变色,所以我决定自己制作一些东西,让它在夜晚为我的卧室着色。


我不仅希望这些LED改变颜色,而且还应该有逻辑推理。就在那时,我看到了利兹大学色彩科学与技术教授斯蒂芬韦斯特兰先生的文章。他声称,当人类处于在彩色灯光下时,它们会根据颜色在生理和心理上做出反应。这个概念并不新鲜,并且已经以色光疗法(Chromotherapy)的名义广泛实施,并且用于此的装置被称为心情灯。


所以我最终决定深入研究色光疗法,并制作一个可以根据一天中的时间改变颜色的心情灯,也可以通过手机控制。除此之外,我还添加了一个LDR光敏电阻,可以在白天自动关闭它,也可以选择设置唤醒警报,它会用亮橙色(阳光)唤醒,另一个闹钟让LED处于睡眠状态。温和的紫色(夜空)颜色让你入睡。听起来很有意思吧?让我们来开始制作吧。


色光疗法 - 心情灯

有许多所谓的DIY心情灯,但只是随意改变颜色而没有任何目的。经过一番搜索后,我发现心情灯应该具有最小的流明亮度,并且还应该以不同的强度逐渐改变颜色。每种颜色对精神和身体都有不同的影响。我列出了下表中对每种颜色的影响。

颜色
生理影响
身体影响
红色
提供更多能量,促进性欲
肾,骨干,嗅觉
黄色
改善消化,消除抑郁症
胃,肝,肠
蓝色
降低血压,冷静下来
偏头痛,喉咙,耳朵和嘴巴
绿色
刺激生长并增强肌肉
骨骼,组织,免疫系统
紫色
睡眠诱导剂
情绪和心理平衡
减少性欲
神经系统,眼睛
橙色
激发创造力
呼吸
粉色
净化血液
血液,动脉,静脉

因此,根据这些数据,我设计了心情灯,依据当天的时间来改变颜色。当然我添加了一些个人风格,所以随意编辑相应的程序。


所需的材料

●    Neo Pixel LED灯

●    Arduino开发板

●    DS3231 RTC模块

●    HC-05蓝牙模块

●    LDR

●    100K电阻

●    12V电源


电路原理图

使用蓝牙控制Arduino心情灯的完整电路图如下。

Circuit-Diagram-for-Smart-Phone-Controlled-Arduino-Mood-Light-with-Alarm.png


如您所见,我们使用了模块,因此连接非常简单。为了更新当前时间,我们使用了DS3231实时时钟(RTC)模块。该模块使用I2C通信,可以直接用Arduino的5V引脚供电。 SDA和SCL引脚分别连接到I2C引脚A4和A5。


接下来我们使用了HC-05蓝牙模块。通过此蓝牙连接,我们可以在LED上设置所需的颜色,还可以设置LED的睡眠时间和唤醒时间。蓝牙模块也由5V引脚供电,Tx和Rx引脚分别通过引脚11和10连接到Arduino。


当房间非常明亮时。改变LED的亮度是没有意义的,因此我们使用LDR来检测房间的亮度,如果它非常明亮,LED会自动关闭,只有在房间很暗时才会重新开启。我们已经形成了一个分压网络,其中一个电阻为LDR本身,另一个为100K电阻,并将其连接到Arduino的引脚A0,这样LDR的电阻会根据光线的变化而变化,Arduino读取的电压也会变化。在此处了解有关将LDR与Arduino连接的更多信息。


最后,neo pixel灯连接到Arduino的引脚6,这是一个PWM引脚,并由Arduino的5V引脚(vcc)供电。我已经在我的项目中使用了Arduino Pro-mini,因为它更小,并且在将它包装在机箱内时会很方便。您可以使用您选择的任何开发板。整个设备由12V适配器供电,该适配器连接到Arduino的RAW引脚。 Arduino上的板载稳压器将12V转换为5V,然后用于通过vcc引脚为所有模块供电。

Smart-Phone-Controlled-Arduino-Mood-Light-with-Alarm.jpg


Neo Pixel LED及其工作原理

该项目的主要组件是neo Pixel LED。 Neo Pixel LED的想法最初来自Adafruit,他们在RBG LED内部使用LED驱动器IC WS2812。该驱动器IC可以从Arduino等控制器接收控制信号,并根据控制信号控制RBG颜色的强度,从而帮助我们实现所需的颜色。


您可以将这些LED串联连接,其中很酷的功能是每个LED都可以单独寻址,这意味着可以通过相应调整控制信号使每个LED发出不同颜色的光。所以请记住,与普通LED不同,您可以仅使用电源为Neo Pixel 供电,它有三个引脚,即Vcc、地和数据。 Vcc和接地引脚用于为Led供电,其范围为3.3V至5V,数据引脚用于发送控制信号,该信号决定哪个Led应以哪种颜色发光。


由于Adafruit自己提供的库,使用Neo Pixel LED非常简单。今天市场上有许多不同类型的Neo Pixel LED可供不同供应商使用,他们使用不同的驱动IC。但是所有这些都可以通过这个Adafruit库来控制。

跳转到指定楼层
dg38569274
发表于: 2018-10-15 11:46:29 | 显示全部楼层

楼主可以发下代码看看吗??谢谢
回复

使用道具 举报

风筝
发表于: 2018-10-15 20:59:13 | 显示全部楼层

编程Arduino心情灯

在本篇文章的末尾处给出了该基于Arduino的Neo-pixel心情灯的完整程序,可以在添加所需库后使用。在本节中,我将从代码中摘出几个重要的片段并进行介绍,它们可以帮助您根据需要修改项目。 该程序代码大约有300行,所以如果你在理解程序过程种,遇到任何问题,都可以在论坛上发布帖子。


和往常一样,我们首先在程序中添加所需的库,本文需要下面的几个库。

  1. #include <SoftwareSerial.h> //Bluetooth module works with software serial
  2. #include <Adafruit_NeoPixel.h> //Library for Neo Pixel (Download from Link in article)
  3. #include <DS3231.h> //Library for RTC module (Download from Link in article)
  4. #include <EEPROM.h> //Library for EEPROM (Pre-Loaded into Arduino)
复制代码

蓝牙模块通过串行通信工作;我不喜欢使用硬件串行引脚(0和1),因为我将使用串行监视器来调试程序,因此我们将软件串行库包含在程序中。默认情况下,此库将出现在IDE中。

接下来我们使用Adafruit公司的Adafruit Neo Pixel库,我们在上一节中讨论过这个库。您可以使用此链接下载Adafruit Neo Pixel库,该链接将从GitHub下载ZIP文件。然后,使用sketch -> Include Library -> Add .ZIP library选项将该ZIP文件添加到Arduino IDE中。

同样,您也可以下载RTC模块的DS3231库,并以相同的方式添加。最后,我们将EEPROM库预先加载到Arduino库中。我们只需添加库来存储唤醒警报和睡眠警报时间,以便在电源故障后Arduino重新启动时它会记住何时进入睡眠状态以及何时唤醒。


Neo Pixel LED可以产生多种颜色,但我们不是对心情灯的所有颜色都感兴趣,除了其中8种颜色,分别是红色、橙色、黄色、绿色、青色、蓝色、紫色和粉红色。要得到每种颜色,我们必须传递它的相应值。因此,我们使用宏定义每种颜色的值,如下所示。

  1. #define Red 1
  2. #define Orange 20
  3. #define Yellow 30
  4. #define Green 70
  5. #define Cyan 100
  6. #define Blue 130
  7. #define Purple 200
  8. #define Pink 240
复制代码

接下来,我们必须声明neo Pixel连接了哪些引脚以及Neo Pixel灯条上有多少个LED。 在本文下,Neo pixel灯连接到引脚6,如上面的电路图所示,灯条上总共有5个LED,代码如下:

  1. Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, 6, NEO_GRB + NEO_KHZ800); //5 LEDs on PIN-6
复制代码

在接下来的程序中,我们声明了很多全局变量,您可能感兴趣的是一些数组声明。 有两个数组,即morning_rainbowevening_rainbow,每个数组由4种颜色组成。 基于上面讨论的色光疗法表,我选择了红色、橙色、绿色和粉红色作为早晨的颜色,黄色、青色、蓝色和紫色作为晚上的颜色,你可以根据需要改变。

  1. //array declarations
  2. char current_rainbow[8] = {}; //the main array
  3. char morning_rainbow[4] = {Red, Orange, Green, Pink}; //colours to show during day time
  4. char evening_rainbow[4] = {Yellow, Cyan, Blue, Purple}; //colours to show during night time
  5. char all_rainbow[8] = {Red, Orange, Yellow, Green, Cyan, Blue, Purple, Pink}; //colours that can be controlled thorugh Bluetooth
复制代码

void setup()函数中,我们初始化蓝牙模块,以9600波特率初始化串行监视器。 蓝牙用于与手机通信,串行监视器用于调试。 只需启动串行监视器,您就可以监视程序中的所有重要变量。 除此之外,如果用户先前已将它们设置并将它们存储在相应的变量中,我们还会读取EEPROM值。

  1. void setup(){//Execute once during the launch of program
  2.     Initialize_RTC();
  3.     Bluetooth.begin(9600);
  4.     Serial.begin (9600); //for debugging
  5.     strip.begin();
  6.     strip.show(); // Initialize all pixels to 'off'
  7.     Bluetooth.println("Mood Lamp Alarm -CircuitDigest");
  8.     Serial.println("Mood Lamp Alarm -CircuitDigest");

  9. //If anything was stored previously in EEPROM copy it to the alarm variables
  10.     sleep_alarm_hour = EEPROM.read(0);
  11.     sleep_alarm_minute = EEPROM.read(1);
  12.     wake_alarm_hour =  EEPROM.read(2);
  13.     wake_alarm_minute = EEPROM.read(3);
  14. }
复制代码

在main循环内部,我们首先读取LDR的值开,如果房间非常明亮,程序将所有LED变暗,从而关闭它,然后等待房间再次变亮。 当房间明亮时,还会检查Interactive_BT函数,以便用户仍然可以强制从手机打开灯。 在这里,我选择800作为阈值,但是如果你想在明亮的日光下工作,你可以简单地增加800的值。范围是0-1024。

  1. while (lightvalue>800) //IF the room is very brigt (you can increase this values to make it glow even duringf day)
  2.   {
  3.        for (int i=0; i<=5; i++) //turn of all LED
  4.         {
  5.           strip.setBrightness(0); //by setting brightness to zero
  6.           strip.show();
  7.         }
  8.    lightvalue = analogRead(A0); //kepp checking if the room is getting darker
  9.     Serial.print("Too bright to glow: ");
  10.     Serial.println(lightvalue); //for debugging
  11.    Interactive_BT();  //Also check if the user is trying to access through bluetooth
  12.    delay(100);
  13.   }
复制代码

用户可以在interactive_BT函数中设置闹钟,或从手机控制灯。这个函数里面的代码注释部分介绍的很详细,因此我不再逐行解释。该程序的特点是它可以使用Android应用程序商店或Iphone商店中的任何蓝牙应用程序,并仍然可以与它进行交互。


接下来我们读取当前时间并更新时间对象“t”。我们使用t.hour和t.min得到小时和分钟值,并分别将它存储在变量current_time_hourcurrent_time_minute中。

  1.   t = rtc.getTime(); //get the current time
  2.   current_time_hour = t.hour; //get hour value
  3.   current_time_minute = t.min; //get minute value
复制代码

在程序中,我每5秒更改一次Neo pixel的颜色,因此接下来的代码段将每5秒执行一次。在该代码段中,我们增加count的值并调用名为glow_rainbow的函数。此函数根据存储在current_rainbow数组中的颜色点亮LED。所以在调用该函数之前,我们必须根据一天中的时间使用morning_rainbow或evening_rainbow中的一组颜色加载当前颜色值,如下所示。

  1. if (sleeping == false) //If we are not sleeping
  2.       glow_rainbow(colour_count); //dsplay the colours
  3.     if (sleeping == true) //if we are sleeping
  4.       night_lamp(); //display the night lamp effect

  5.    if (t.hour>=17) //During evening time
  6.   {
  7.     for (int i=0; i<=3; i++)
  8.      { current_rainbow[i] = evening_rainbow[i]; delay(100);} //copy evening raninbow into current_rainbow
  9.   }
  10.   else //During Morning
  11.   {
  12.     for (int i=0; i<=3; i++)
  13.      { current_rainbow[i] = morning_rainbow[i]; delay(100);} //copy  mornign rainboe into current rainbow
  14.   }
复制代码

在glow_rainbow函数内部,我们使用了两个for循环,一个用于调暗LED,另一个用于根据所需颜色增加LED的亮度。 从数组current_rainboe [count]中选择所需的颜色,其中count决定数组的当前颜色。 在灯条中总共有5个LED,所以我使用变量i最大到5,根据你想减少多少亮度,j的值可以在0-255之间变化。

  1. void glow_rainbow(int count)
  2. {
  3.     for (int j=150; j>=10; j--) //decrease the brightness to create dim effect
  4.     {
  5.       for (int i=0; i<=5; i++) //do it for all 5 leds
  6.         {
  7.           strip.setBrightness(j);
  8.           strip.show();
  9.         }
  10.          1         delay(2);
  11.     }

  12.   for (int j=0; j<=255; j++) //increase the brightness
  13. {
  14.       for (int i=0; i<=5; i++) //do it for all 5 leds
  15.         {
  16.           strip.setPixelColor(i,Wheel(current_rainbow[count]));//select the colour based on count value
  17.           strip.setBrightness(j);
  18.           strip.show();
  19.         }
  20.                   delay(10);
  21. }
  22. }
复制代码

wheel函数直接取自Adafruit示例程序。 它接收0到255之间的值,并根据该值生成颜色。 这个值是我们最初在程序中使用#define宏定义的值。 函数如下所示。

  1. // Input a value 0 to 255 to get a color value.
  2. // The colours are a transition r - g - b - back to r.
  3. uint32_t Wheel(byte WheelPos) {
  4.   WheelPos = 255 - WheelPos;
  5.   if(WheelPos < 85) {
  6.     return strip.Color( (255 - WheelPos * 3), 0, (WheelPos * 3) );
  7.   }
  8.   if(WheelPos < 170) {
  9.     WheelPos -= 85;
  10.     return strip.Color(0, (WheelPos * 3) , (255 - WheelPos * 3) );
  11.   }
  12.   WheelPos -= 170;
  13.   return strip.Color((WheelPos * 3), (255 - WheelPos) * 3, 0);
  14. }
复制代码

strip.Color(x,y,z) 函数很重要,它决定LED的颜色。 变量x、y和z各自取0-255的值,并根据该值确定LED应发射的红色、绿色和蓝色光的量。 因此x、y和z直接控制LED像素的红色、绿色和蓝色光强度。

回复

使用道具 举报

风筝
发表于: 2018-10-15 21:30:16 | 显示全部楼层

通过智能手机控制和设置报警

按照电路图进行连接并上传下面给出的代码后,即可测试电路。我还建议打开串行监视器来检查硬件如何响应程序。完成后,您可以在手机上打开蓝牙应用程序。


我使用的是Play商店中的蓝牙终端应用程序,您可以使用任何蓝牙应用程序来帮助您通过蓝牙连接读取和写入数据。在启动应用程序之前,请确保已使用密码“1234”将蓝牙模块与手机配对。启动应用程序后,连接到名为“HC-05”的蓝牙设备。


要开始通信,只需从手机发送一个随机变量,本文我发送'g'。这将在程序中启动交互式蓝牙通信模式,您将看到以下屏幕界面。

Bluetooth-communication-mode-on-Android-Application.png


这里只需按照屏幕上的说明设置闹钟或通过简单发送数字控制所需颜色的灯。例如,以下是设置了早晨闹钟。

Control-the-Lamp-by-sending-the-number.png

同样,您也可以设置晚间闹钟,也可以通过发送所需颜色的数字来控制灯,如下所示。

Set-alarm-or-for-controlling-the-lamp.png


3D打印Arduino心情灯的外壳

正如我所说,我想让其在办公室或客厅里工作,所以它需要一个漂亮的外壳来容纳所有的电子设备。当它们发光时直看灯光也会伤害我们的眼睛。所以我决定使用Tevo塔兰图拉打印机3D打印外壳,因此接下来设计外壳。


完整的设计文件可从thingiverse下载。如果您有3D打印机,您也可以打印自己的外壳,或者只是使用木材或丙烯酸树脂来制作。我的打印设置如下图所示。

3D-Printing-the-Enclosure-for-Arduino-Mood-Light.png

打印后,您可以将LDR推入小孔中,LED灯条可以滑入顶壳。组装后,我的硬件看起来如下所示。

Arduino-Mood-Light-Hardware.jpg


剩下要做的就是使用12V适配器为设备供电,然后使用上面讨论的蓝牙选项设置闹钟,将其放在您的房间。希望你喜欢这个项目,并喜欢这个制作。如果您在制作过程中遇到任何问题,可以在下面进行回复。


代码

本文使用的完整代码如下所示: main.rar (3.46 KB, 下载次数: 23)

回复

使用道具 举报

azi1974
发表于: 2019-6-4 02:01:50 | 显示全部楼层

这个很有创意,仔细学习中
回复

使用道具 举报

arduinoaihao
发表于: 2020-7-19 17:02:47 | 显示全部楼层

楼主,请问DS3231的库怎么下载啊,我在自己的管理库下载了,但是编译了还是不行
[O`8$O5Y3N0))S_WIYTW8L4.png
回复

使用道具 举报

牛小顿
发表于: 2020-8-30 21:42:18 | 显示全部楼层

为什么时钟这个老是出问题呀 用githup里面的库也不行
回复

使用道具 举报

牛小顿
发表于: 2020-9-11 16:41:53 | 显示全部楼层

本帖最后由 牛小顿 于 2020-9-11 16:48 编辑
arduinoaihao 发表于 2020-7-19 17:02
楼主,请问DS3231的库怎么下载啊,我在自己的管理库下载了,但是编译了还是不行 ...

时钟那块要改下的 如下
#include <SoftwareSerial.h> //Bluetooth module works with software serial
#include <Adafruit_NeoPixel.h> //Library for Neo Pixel (Download from Link in article)
#include <RTClib.h> //Library for RTC module (Download from Link in article)
#include <SPI.h> //Library for SPI communication (Pre-Loaded into Arduino)
#include <EEPROM.h> //Library for EEPROM (Pre-Loaded into Arduino)

  //Define the value of colours
#define Red 1
#define Orange 20
#define Yellow 30
#define Green 70
#define Cyan 100
#define Blue 130
#define Purple 200
#define Pink 240

Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, 6, NEO_GRB + NEO_KHZ800); //5 LEDs on PIN-6

RTC_DS3231  rtc;
DateTime t; //element t

然后后面的获取小时和分钟的也都调整下
get_hour();
get_minute();

看看库里面示例的程序,仿照改下就行了~

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 529 | 回复: 1017



手机版|

GMT+8, 2020-10-20 22:07 , Processed in 0.078127 second(s), 32 queries . Powered by Discuz! X3.4

YiBoard一板网 © 2015-2020 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表