Alors l'automne est arrivé ... L'hiver est inexorablement imminent - il fait sombre le matin et sombre le soir.Se réveiller sur un réveil dans l'obscurité totale équivaut à plonger sous la glace. Stress le matin - garanti une journée terne.La solution est, l'alarme lumineuse est appelée, mais le prix de cette chose est de 5000 roubles. Il pique cependant. De plus, l'algorithme de fonctionnement est codé en dur, mais il est bien évident que, selon les résultats du réveil, vous voudrez corriger quelque chose ou étendre la fonctionnalité.Mais que se passe-t-il si sur la base d'improvisation signifie construire quelque chose dans cet esprit? Bon puzzle pour le bricolage!
Les matériaux suivants ont été utilisés pour la solution:- un prototype de la carte de débogage d'un kit d'apprentissage de la programmation Arduino (inclus dans le futur kit NR05), conçu pour l' Arduino Nano ;- horloge temps réel MP1095 ;- Les LED sont différentes;- tweeter piézo avec générateur intégré;- une chose translucide blanche, une fois imprimée lors du débogage d'une imprimante 3D (vous pouvez adapter quelque chose d'autre translucide en tant que diffuseur, et quiconque a une imprimante 3D peut imprimer quelque chose qui lui est propre);- l'envie de combiner tout cela et de programmer un algorithme de travail adapté.Je voulais empiler la chose blanche sur un piédestal afin d'y monter la LED et de la connecter avec un câble à la carte. Sans y réfléchir à deux fois, nous dessinons dans SketchUp et imprimons un support orange sur une imprimante 3D. Avec un fort désir, vous pouvez imprimer le boîtier de la carte prototype, mais le prototype est incroyablement beau!De plus, il peut être utilisé pour le développement d'autres projets, et le réveil, selon les résultats du fonctionnement du prototype, peut être disposé dans une conception plus compacte basée sur la même carte Arduino Nano.D'abord coincé une LED. Il a été collé à la base avec un adhésif innovant durci par rayonnement UV. Appelé Bondic. Chose utile dans le ménage, je dois dire! Tient fermement.


Ils ont collé le connecteur avec la même colle.
Nous avons regardé comment briller. N'a pas aimé. Dans l'obscurité, bien sûr, il est visible, mais pas suffisant pour activer le cerveau via des récepteurs optiques. Quelques LED blanches brillantes ont marqué à travers les gadgets. Combinés en parallèle dans une telle brindille, ils donnent une lumière tout à fait éveillée à une luminosité maximale.
Ils consomment au maximum environ 100 mA, vous ne pouvez pas vous connecter directement au port Arduino, mais il y a un amplificateur de courant sur la carte de débogage avec un transistor qui fournit 200 mA.
Il y a également cinq boutons sur la carte pour toutes sortes d'expériences, nous les utilisons pour contrôler les modes et régler l'alarme.En général, la carte de débogage est intéressante par la présence de connecteurs-broches marqués pour connecter divers capteurs et actionneurs, offrant une bonne fonctionnalité et une interface conviviale - vous pouvez connecter des capteurs de température, des capteurs de pression, des servos, des relais, des appareils avec interface I2C sans hésitation (signé). etc. Pour la connexion, seuls les fils avec prises sont nécessaires.
Nous ajusterons la luminosité avec un PWM de la neuvième broche d'Arduino, qui est divorcée sur la carte à l'amplificateur. Nous connectons le tweeter au connecteur SOUND, sur DAT plus, sur GND moins. Horloge en temps réel - vers le connecteur I2C_5V, car ils ont besoin de 5V pour l'alimentation. La carte a déjà un indicateur LCD à deux lignes, très contrasté, avec de jolis caractères blancs sur fond bleu.En fait, tout le matériel est en place, maintenant c'est au logiciel.L'algorithme a été conçu comme suit:- lorsque l'heure actuelle coïncide avec l'heure pour laquelle l'alarme est réglée, la luminosité de la lampe devrait lentement augmenter complètement;- en même temps, les signaux sonores doivent être émis plusieurs fois dans un ordre croissant, empêchant l'objet de réveil de pénétrer dans l'ampoule et de s'endormir dans la lumière;- vous devez donner la possibilité d'éteindre le son gênant à la fin, ainsi que d'allumer manuellement la pleine lumière, ou de l'éteindre, en étant déjà pleinement conscient.- Il devrait être possible de régler l'heure sur l'horloge et le réveil.L'esquisse qui en résulte est présentée à la fin du document et accompagnée de commentaires détaillés. Il est facile de s'adapter à vos envies et préférences.Bon réveil pour tout le monde!
Croquis du programme du réveil//
#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 Attention! Du 23 septembre au 23 octobre 2015, nous organisons un concours photo«Impression 3D pour résoudre les problèmes de tous les jours»!Le gagnant recevra en cadeau une imprimante-designer 3D MC5 avec un étui en acrylique.Ceux qui le souhaitent peuvent simplement passer et voter pour leur travail préféré.Conditions du concours photo .