人类自然被编程为随着日出而醒;可悲的是,现代生活是由任意的时钟决定的,常常迫使我们在没有自然光的情况下醒来。今天,我们将制作一个日出闹钟,它将缓慢而缓慢地唤醒您,而无需诉诸令人讨厌的噪音产生器。
如果制作日出闹钟对您来说有点过多,查看这些iPhone和Android应用程序,确保您没有离开那个棒极了的梦想,而是醒来时感到神清气爽–它们确实有效。
项目大纲
该项目的主要部分将是在床周围放置5米长的LED灯条。我们将使用外部12伏电源为这些电源供电,并使用某些MOSFET N晶体管对其进行开关。这部分的设置将与我之前构建的动态照明系统相同。
计时将是一个问题–由于这是一个原型,因此我将设置Arduino从任何时候开始倒计时重启。从理论上讲,我们每天应该只损失一两秒钟,但理想情况下,我们将包括一个“实时时钟"芯片以更可靠地进行此操作。日出警报将在唤醒时间前30分钟开始,并逐渐提高输出水平,直到达到100%亮度为止-这应该足以唤醒我们,尽管一个好方法是继续使用常规闹钟,直到您的身体恢复正常为止。
我还将在该项目中集成一个小夜灯,该小灯可以检测运动并在床下激活离散的低水平照明灯(3分钟超时),与LED照明灯分开那会导致我和我妻子都醒来。床下照明系统将是商用市电,因此我将在插座内插入一个继电器以将其打开和关闭。如果您在任何情况下都不愿意使用110-240v AC主电源(通常是一个好规则),请按照Raspberry Pi Arduino家庭自动化项目中的说明,用开关插座连接433 MHz无线发射器。
零件清单和原理图
这是完整的原理图。
接线继电器
注意:如果您也想将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分钟超时功能。
标签: