所以秋天来了...冬天势不可挡,即将来临-早晨是黑暗,晚上是黑暗。在完全黑暗的环境中唤醒闹钟等同于在冰下潜水。早上压力大-保证平淡的一天。解决的办法是,光报警器被称为,但是这个东西的价格是从5000卢布起。但是,它会刺破。此外,运算算法是硬编码的,很明显,根据唤醒的结果,您将需要纠正某些问题或扩展功能。但是,如果在即兴创作的基础上以这种精神来构建某种东西呢? DIY好拼图!
该解决方案使用了以下材料:-用于Arduino Nano的用于学习Arduino编程的套件的调试板的原型(包括在将来的NR05套件中);-实时时钟MP1095;-LED不同;-内置发生器的压电高音扬声器;-白色半透明的东西,在调试3D打印机时将其打印出来(您可以将其他半透明的东西用作扩散器,并且拥有3D打印机的任何人都可以打印自己的东西);-希望将所有这些结合起来并编写合适的工作算法的愿望。我想将白色物体堆放在某个基座上,以便将LED安装在该基座上,并用电缆将其连接到板上。无需三思而后行,我们绘制SketchUp并在3D打印机上打印橙色支架。带着强烈的愿望,您可以为原型板打印外壳,但是原型非常漂亮!此外,它还可以用于其他项目的开发,并且根据原型的操作结果,可以在同一Arduino Nano板上基于更紧凑的设计来安排闹钟。首先卡住一个LED。它使用通过紫外线辐射固化的创新粘合剂粘合到底座上。称为邦迪克。我必须说在家庭有用的东西!紧紧抓住。


他们用相同的胶水粘着连接器。
我们看着如何发光。不喜欢。当然,在黑暗中它是可见的,但不足以通过光学感受器激活大脑。几个bright头上划破了几个明亮的白色LED。在这样的树枝中并行组合,它们可以在最大亮度下完全唤醒。
它们消耗的最大电流约为100 mA,您无法直接连接至Arduino端口,但是调试板上有一个晶体管电流放大器,可提供200 mA的电流。
板上还有五个用于各种实验的按钮,我们使用它们来控制模式并设置警报。通常,调试板很有趣,因为有标记的连接器引脚用于连接各种传感器和执行器,提供良好的功能和友好的界面-您可以毫不犹豫地连接温度传感器,压力传感器,伺服器,继电器,具有I2C接口的设备(带符号)。等等对于连接,仅需要带插座的电线。
我们将使用从Arduino的第九个引脚断开的PWM调节亮度,该引脚在板上与放大器分开。我们将高音扬声器连接到DAT plus上,GND上减去的SOUND连接器。实时时钟-连接至I2C_5V连接器,因为它们需要5V的电源。评估板上已经有两行LCD指示器,对比鲜明,蓝色背景上带有漂亮的白色字符。实际上,所有硬件都已安装到位,现在由软件决定。该算法的构想如下:-当当前时间与设置警报的时间一致时,灯的亮度应缓慢增加到最大;-同时,声音信号应按升序发射几次,以防止唤醒对象进入灯泡并入睡;-您必须有机会最后关闭烦人的声音,以及手动打开或关闭全光,已经完全清醒了。-应该可以在时钟和闹钟上设置时间。生成的草图显示在材料的末尾,并提供了详细的注释。可以很容易地修改您的需求和偏好。祝大家有个美好的觉醒!
闹钟程序示意图//
#include <LiquidCrystalRus.h>
#include <LiquidCrystalExt.h>
#include <LineDriver.h>
// I2C
#include <Wire.h>
// RTC
#include «RTClib.h»
// 2
//
#include <MsTimer2.h>
//-----------------------------------------------------------------------
#define NUM_KEYS 5
// ( )
int adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};
//-----------------------------------------------------------------------
int led13 = 13; // Arduino Nano
int alarmPin = 3; //
int led = 9; //
int brightness = 0; //
int riseAmount = 1; // 0-255
int timeAmount = 500; // ,
int beepCount = 0; //
int numberOfBeeps = 0;
unsigned long time_old;
unsigned long time_curr;
int alarm = 0; //
int Step; //
unsigned long tSetOld;
unsigned long tTickOld;
// lcd, RS,EN,DB4,DB5,DB6,DB7
LiquidCrystalRus lcd(A1, A2, A3, 2, 4, 7);
// RTC
RTC_DS1307 RTC;
int Year; // RTC
int Month;
int Day;
int Hour;
int Minute;
int Second;
int alarmHour = 0;
int alarmMinute = 0;
int setAlarm = 0; // ./.
int SetMode = 0; // / ./.
int AlarmOn; // ./.
void setup() {
pinMode(led13, OUTPUT);
pinMode(3, OUTPUT);
lcd.begin(16, 2);
Wire.begin(); // 1Wire ( RTC)
RTC.begin(); // RTC
RTC.writenvram(2, 0); // 00 ( 2 RTC)
tTickOld = millis(); //
// 5,
// 0
if (get_key() == 5) {
RTC.adjust(DateTime(__DATE__, __TIME__));
for (int i = 0; i < 5; i++) RTC.writenvram(i, 0);
}
}
void loop() {
AlarmOn = RTC.readnvram(3); // 3- RAM RTC: (1) (0)
if (get_key() == 2) { // 2
SetMode++; //
delay(500);
tSetOld = millis();
}
while (SetMode) { //
if (get_key() == 2) {
SetMode++;
delay(200);
tSetOld = millis();
}
if (SetMode > 4) { //
SetMode = 0;
lcd.noBlink();
lcd.noCursor();
}
switch (SetMode) { //
case 1:
lcd.setCursor(12, 1); lcd.blink();
break;
case 2:
lcd.setCursor(9, 1); lcd.blink();
break;
case 3:
lcd.setCursor(12, 0); lcd.blink();
break;
case 4:
lcd.setCursor(9, 0); lcd.blink();
break;
}
if (get_key() == 1 or get_key() == 3) { // 1 3
tSetOld = millis(); //
if (get_key() == 3) Step = 1; // 3 —
if (get_key() == 1) Step = -1; // 1 —
switch (SetMode) {
case 1:
SetMinuteAlarm(Step); //
break;
case 2:
SetHrAlarm(Step); //
break;
case 3:
SetMinute(Step); //
break;
case 4:
SetHr(Step); //
break;
}
}
if ((millis() — tTickOld) > 1000) {
displayTime(); //
tTickOld = millis();
}
if ((millis() — tSetOld) > 10000) {
SetMode = 0; // 10 .
lcd.noBlink();
}
} // end SetMode
if (get_key() == 4) { // /
int alarm_ram = RTC.readnvram(3);
RTC.writenvram(3, !alarm_ram);
delay(50);
AlarmOn = alarm_ram;
delay(500);
}
if (get_key() == 5) { //
alarm = 0;
digitalWrite(led13, LOW);
lightDown();
}
if (get_key() == 5 && brightness >= 0) { //
lightUp();
}
if (get_key() == 1 && !SetMode) { //
//alarm = 0;
MsTimer2::stop();
digitalWrite(alarmPin, LOW);
}
if ((millis() — tTickOld) > 1000) {
displayTime(); //
tTickOld = millis();
}
if (alarm == 1) //
{
digitalWrite(led13, HIGH);
time_curr = millis();
if ((time_curr — time_old) > timeAmount) {
if (brightness < 255) {
brightness = brightness + riseAmount;
time_old = time_curr;
if (brightness > 255) brightness = 255;
analogWrite(led, brightness); //
switch (brightness) { //
case 60:
numberOfBeeps = 4;
alarmRun();
break;
case 120:
numberOfBeeps = 4;
alarmRun();
break;
case 180:
numberOfBeeps = 8;
alarmRun();
break;
case 220:
numberOfBeeps = 14;
alarmRun();
break;
}
if (brightness >= 255) {
numberOfBeeps = 32000; // (32000 )
alarmRun();
}
}
else digitalWrite(led13, LOW);
}
}
} // end loop
//----------------------------------------------
int get_key() //
{
int input = analogRead(A6);
int k;
for (k = 0; k < NUM_KEYS; k++)
if (input < adcKeyVal[k])
return k + 1;
return 0;
}
void SetMinuteAlarm(int Step) { //
alarmMinute = RTC.readnvram(1);
alarmMinute += Step;
if (alarmMinute > 59) alarmMinute = 0;
if (alarmMinute < 0) alarmMinute = 59;
RTC.writenvram(1, alarmMinute);
delay(300);
}
void SetHrAlarm(int Step) { //
alarmHour = RTC.readnvram(0);
alarmHour += Step;
if (alarmHour > 23) alarmHour = 0;
if (alarmHour < 0) alarmHour = 23;
RTC.writenvram(0, alarmHour);
delay(300);
}
void SetMinute(int Step) { //
DateTime now = RTC.now();
Year = now.year();
Month = now.month();
Day = now.day();
Hour = now.hour();
Minute = now.minute();
Second = now.second();
Minute += Step;
if (Minute > 59) Minute = 0;
if (Minute < 0) Minute = 59;
RTC.adjust(DateTime(Year, Month, Day, Hour, Minute, Second));
delay(300);
}
void SetHr(int Step) { //
DateTime now = RTC.now();
Year = now.year();
Month = now.month();
Day = now.day();
Hour = now.hour();
Minute = now.minute();
Second = now.second();
Hour += Step;
if (Hour > 23) Hour = 0;
if (Hour < 0) Hour = 23;
RTC.adjust(DateTime(Year, Month, Day, Hour, Minute, Second));
delay(300);
}
void displayTime() { //
DateTime now = RTC.now();
Year = now.year() — 2000;
Month = now.month();
Day = now.day();
Hour = now.hour();
Minute = now.minute();
Second = now.second();
lcd.setCursor(0, 0);
lcd.print(«: „);
if (Hour < 10) lcd.print(' ');
lcd.print(Hour);
lcd.print(':');
if (Minute < 10) lcd.print('0');
lcd.print(Minute);
lcd.print(':');
if (Second < 10) lcd.print('0');
lcd.print(Second);
int h = RTC.readnvram(0);
int m = RTC.readnvram(1);
int s = RTC.readnvram(2);
if (AlarmOn) {
lcd.setCursor(0, 1);
lcd.print(“: „);
if (h < 10) lcd.print(' ');
lcd.print(h);
lcd.print(':');
if (m < 10) lcd.print('0');
lcd.print(m);
lcd.print(':');
if (s < 10) lcd.print('0');
lcd.print(s);
}
else {
lcd.setCursor(0, 1);
lcd.print(“: --:--:--»);
}
if (Hour == h && Minute == m && Second == s && AlarmOn) { // !
alarm = 1;
numberOfBeeps = 2;
alarmRun();
}
}
void lightDown() { //
while (brightness > 0) {
time_curr = millis();
if ((time_curr — time_old) > 10) {
if (brightness > 0) {
brightness = brightness — 1;
time_old = time_curr;
if (brightness < 1) brightness = 0;
analogWrite(led, brightness);
}
}
}
}
void lightUp() { //
while (brightness < 255) {
time_curr = millis();
if ((time_curr — time_old) > 10) {
if (brightness < 255) {
brightness++;
time_old = time_curr;
if (brightness > 255) brightness = 255;
analogWrite(led, brightness);
}
}
}
}
void alarmRun() { // 1 ( )
digitalWrite(alarmPin, HIGH);
beepCount = 0;
MsTimer2::set(500, beep); // 500ms period
MsTimer2::start();
}
void beep() { // 500 2
if (beepCount < numberOfBeeps) {
static boolean output = HIGH;
digitalWrite(alarmPin, output);
output = !output;
beepCount++;
}
else {
MsTimer2::stop();
digitalWrite(alarmPin, LOW);
}
}
。ps 注意!2015年9月23日至10月23日,我们举办摄影比赛“解决日常问题的3D打印”!优胜者将获得一个3D打印机设计师MC5,其中有一个亚克力盒作为礼物。那些希望的人可以随便逛逛,为自己喜欢的作品投票。摄影大赛条件。