Arduino夜灯和日出警报项目

人类自然被编程为随着日出而醒;可悲的是,现代生活是由任意的时钟决定的,常常迫使我们在没有自然光的情况下醒来。今天,我们将制作一个日出闹钟,它将缓慢而缓慢地唤醒您,而无需诉诸令人讨厌的噪音产生器。

如果制作日出闹钟对您来说有点过多,查看这些iPhone和Android应用程序,确保您没有离开那个棒极了的梦想,而是醒来时感到神清气爽–它们确实有效。

项目大纲

该项目的主要部分将是在床周围放置5米长的LED灯条。我们将使用外部12伏电源为这些电源供电,并使用某些MOSFET N晶体管对其进行开关。这部分的设置将与我之前构建的动态照明系统相同。

计时将是一个问题–由于这是一个原型,因此我将设置Arduino从任何时候开始倒计时重启。从理论上讲,我们每天应该只损失一两秒钟,但理想情况下,我们将包括一个“实时时钟"芯片以更可靠地进行此操作。日出警报将在唤醒时间前30分钟开始,并逐渐提高输出水平,直到达到100%亮度为止-这应该足以唤醒我们,尽管一个好方法是继续使用常规闹钟,直到您的身体恢复正常为止。

我还将在该项目中集成一个小夜灯,该小灯可以检测运动并在床下激活离散的低水平照明灯(3分钟超时),与LED照明灯分开那会导致我和我妻子都醒来。床下照明系统将是商用市电,因此我将在插座内插入一个继电器以将其打开和关闭。如果您在任何情况下都不愿意使用110-240v AC主电源(通常是一个好规则),请按照Raspberry Pi Arduino家庭自动化项目中的说明,用开关插座连接433 MHz无线发射器。

零件清单和原理图

  • Arduino
  • 一组RGB LED灯条
  • 12伏电源
  • 继电器和电源插座,或无线控制插座和合适的发射器
  • 您选择的夜灯(带插头的常规市电是很好)
  • PIR运动传感器(HC-SR501)或SC-04声纳(效果不佳)
  • 光传感器
  • 项目代码-但可以请继续阅读以确保您了解如何自定义所有内容。
  • 这是完整的原理图。

    接线继电器

    注意:如果您也想将RGB灯也用作夜灯,请跳过此部分–这是专门用于打开单独的市电灯的。

    要切换主电源,继电器需要达到额定电压– 110V 240V AC ,具体取决于您的居住地-以及超过您要切换的总安培数。我从此传感器套件中使用的一个传感器(免责声明:这是我的商店)为 250VAC / 10A ,所以我们应该很安全。继电器通常在中央有一个 com 端口,该端口应连接到插入插头的火线。然后将插座带电端子连接到 NO (常开)。它插在插座上时,我不必告诉你不要这样做,否则你会死的。如果您担心弄乱电源,请改用无线开关插座。

    接地线和中性线应直接伸向插座,并且不会接触继电器。您在美国可能没有接地线。 了解本地电线的颜色代码是您的责任 –如果您无法通过其他方式在家中为常规插座接线或为插头重新接线,请勿尝试将继电器嵌入其中

    要进行测试,请将中继信号引脚连接到12,然后运行一个经过修改以在引脚12上工作的简单闪烁程序,而不是默认情况下的13。您的插座应每隔几秒钟打开和关闭一次。我之所以不使用引脚13,是因为在上传过程中,板上的LED连续快速点亮以指示串行活动,这也将导致继电器激活。

    正确计时

    计时和时钟功能很难访问网络连接或专用的实时时钟(它们包括自己的电池,即使主Arduino没有电,也能保持时钟运行)。为了降低成本,我将作弊。我将为Arduino开始倒计时进行硬编码;因此,时间将与该开始时间有关。每隔24小时,时钟将重置一次。下面的时钟功能代码可确保全局变量 currentMillis currentMinutes 每天正确。 Arduino每45天损失的时间不应超过几秒钟;但是,这种硬编码的计时方式非常有限,因为断电或意外重置会破坏所有内容,因此这肯定是可以改进的地方。如果定时确实不同步,只需在设置的开始时间重置Arduino。

    代码应该易于理解。

    void clock(){   if(millis() >= previousMillis+86400000){      // a full day has elapsed, reset the clock;      previousMillis +=86400000;   }   currentMillis = millis() - previousMillis; // this keeps our currentMillis the same each day   currentMinutes = (currentMillis/1000)/60;}

    夜灯功能

    我将主循环划分为不同的功能,因此更易于阅读和删除或调整。 nightLight()函数仅在Arduino重置后的几个小时(我假设您可能会在就寝时间或附近,黑暗时)之间运行,直到日出警报响起为止。由于开始。最初,我曾尝试使用与光有关的电阻器,但它们对蓝光(碰巧是我在夜灯中使用的颜色)不太敏感,并且很难正确校准。无论如何,使用时钟更有意义。我们将使用全局 currentMinutes 变量,该变量每天都会重置。

    如果您以前从未使用过PIR传感器,尽管它已经进行了接线,但可能有点古怪。起来并不困难-您会在背面清楚地看到 VCC GND OUT 。您也有两个可变电阻器。标记为RX的一个确定距离(最大约7m),标记为RX的另一个确定延迟。在最低设置下,延迟时间为5秒(完全逆时针旋转),这意味着任何瞬时运动都会触发传感器至少5秒钟的“开启"状态。但是,它也确定了活动状态之间的延迟-因此,如果经过5秒钟并且未检测到运动,即使在这段时间内有运动,传感器也会发送低电平信号至少5秒钟。如果您在30秒左右设置了很高的延迟,则传感器似乎坏了。

    如果您独自一人睡觉,并且不介意为两个照明灯使用相同的RGB灯条日出警报和夜灯,您应该能够足够容易地调整代码。

    void nightlight(){  // Only work between the hours of reset -> sunrise.   if(currentMinutes < minutesUntilSunrise){    if(digitalRead(trigger) == 1){      nightLightTimeOff = millis()+nightLightTimeOut; // activate, or extend the time until turning off the light      Serial.println("Activating nightlight");    }  }   //Turn light on if needed  if(millis() < nightLightTimeOff){    digitalWrite(nightLight,HIGH);  }  else{    digitalWrite(nightLight,LOW);  }}

    日出警报

    为简单起见,我将RGB颜色值255,255,0用于深黄色日出-这样,两个颜色通道上的增量将相同。如果您发现它起床为时过早,请考虑从深红色开始,然后逐渐趋向黄色或白色。我使用的只是线性的上升-您可能需要研究使用更自然的曲线获得亮度值。

    该函数很简单-可以计算出每秒应增加多少光这样在30分钟后便达到了全亮度;然后乘以当前日出的秒数。如果它已经处于全亮度状态,它将再保持10分钟以确保您处于正常状态(如果您还没有处于正常状态,则可能应该有备用警报)。

    void sunrisealarm(){   //each second during the 30 minite period should increase the colour value by:  float increment = (float) 255/(30*60);  //red 255 , green 255 gives us full brightness yellow    if(currentMinutes >= minutesUntilSunrise){     //sunrise begins!      float currentVal = (float)((currentMillis/1000) - (minutesUntilSunrise*60)) * increment;     Serial.print("Current value for sunrise:");     Serial.println(currentVal);     //during ramp up, write the current value of minutes X brightness increment     if(currentVal < 255){       analogWrite(RED,currentVal);       analogWrite(GREEN,currentVal);     }     else if(currentMinutes - minutesUntilSunrise < 40){       // once we're at full brightness, keep the lights on for 10 minutes longer       analogWrite(RED,255);       analogWrite(GREEN,255);     }     else{        //after that, we're nuking them back to off state        analogWrite(RED,0);        analogWrite(GREEN,0);      }  }}

    陷阱和将来的升级

    我在过去的几周内一直在使用它,它确实有助于在适当的时候让您感觉更加清爽。小夜灯也很好。不过,它并不完美,因此在构建过程中需要做一些事情和一些经验教训。

    在制作此项目时,我遇到了很多处理大量数字的问题,因此如果您打算修改代码请记住这一点。在C语言中,键入变量非常重要 –数字并不总是数字。例如,应该使用 unsigned long 变量来存储超大数字,就像我们在谈论毫秒时要处理的那样,但即使是小至60,000的数字也不能存储为正整数( unsigned int最多可以接受68,000)。关键是,使用大数字时请仔细阅读变量类型,如果发现奇怪的错误,可能是因为其中一个变量没有足够的位!

    我也发现了亮度电压泄漏非常低的问题–即使发出 digitalWrite(RED,0)信号,也导致发出的光量最小–我认为带状光缆不是硬件问题,因为他们与官方管制员配合良好。如果有人可以解决这个问题,如下图所示,我将不胜感激。我尝试过下拉电阻,并限制Arduino引脚的输出电压。我可能需要添加一个简单的电源开关电路,以便仅在实际需要时才向LED灯条供电。

    为了将来的工作,我希望添加一个IR接收器并复制原始控制器的某些功能–至少具有一般更改颜色的功能。使用灯光,就目前这个项目将灯带变成专用的夜灯。我什至可以添加自动30分钟超时功能。

    标签: