Acorde confortavelmente - faça um alarme luminoso faça você mesmo

Chegou o outono ... O
inverno está inexoravelmente à frente - está escuro pela manhã e escuro à noite.
Acordar um despertador na escuridão total é equivalente a mergulhar no gelo. Estresse pela manhã - garantido um dia aborrecido.

A solução é, o alarme de luz é chamado, mas o preço dessa coisa é de 5000 rublos. No entanto, é uma coisa que pica. Além disso, o algoritmo de operação é codificado, mas é óbvio que, de acordo com os resultados da ativação, você deseja corrigir algo ou expandir a funcionalidade.
Mas e se, com base nos meios improvisados, construir algo nesse espírito? Bom quebra-cabeça para DIY!



Os seguintes materiais foram utilizados para a solução:

- um protótipo da placa de depuração de um kit para aprender a programação do Arduino (incluído no futuro kit NR05), projetado para o Arduino Nano ;
- relógio em tempo real MP1095 ;
- LEDs são diferentes;
- tweeter piezo com gerador embutido;
- uma coisa translúcida branca, uma vez impressa ao depurar uma impressora 3D (você pode adaptar outra coisa translúcida como um difusor, e quem tiver uma impressora 3D pode imprimir algo próprio);
- o desejo de combinar tudo isso e programar um algoritmo de trabalho adequado.

Eu queria empilhar a coisa branca em algum pedestal para montar o LED lá e conectá-lo com um cabo à placa. Sem pensar duas vezes, desenhamos no SketchUp e imprimimos um suporte laranja em uma impressora 3D. Com um forte desejo, você pode imprimir o estojo da placa protótipo, mas o protótipo é incrivelmente bonito!
Além disso, ele pode ser usado para o desenvolvimento de outros projetos, e o despertador, de acordo com os resultados da operação do protótipo, pode ser organizado em um design mais compacto, baseado na mesma placa Arduino Nano.

Primeiro travou um LED. Foi colado à base com um adesivo inovador curado por radiação UV. Chamado Bondic. Coisa útil na casa, devo dizer! Segura firme.









Eles colaram o conector com a mesma cola.





Nós assistimos como brilhar. Não gostei. No escuro, é claro, é visível, mas não o suficiente para ativar o cérebro através de receptores ópticos. Alguns LEDs brancos brilhantes marcaram os truques. Combinados em paralelo em um galho, eles dão uma luz bastante desperta com brilho máximo.



Eles consomem no máximo cerca de 100 mA, você não pode se conectar diretamente à porta Arduino, mas há um amplificador de corrente de transistor na placa de depuração que fornece 200 mA.



Também existem cinco botões no quadro para todos os tipos de experimentos. Nós os usamos para controlar os modos e definir o alarme.

Em geral, a placa de depuração é interessante pela presença de conectores-pinos marcados para conectar vários sensores e atuadores, fornecendo boa funcionalidade e uma interface amigável - você pode conectar sensores de temperatura, sensores de pressão, servos, relés, dispositivos com interface I2C sem hesitação (assinado). etc. Para a conexão, apenas fios com soquetes são necessários.



Ajustaremos o brilho com um PWM do nono pino do Arduino, que é separado da placa pelo amplificador. Conectamos o tweeter ao conector SOUND, no DAT plus, no GND menos. Relógio em tempo real - para o conector I2C_5V, pois eles precisam de 5V para a fonte de alimentação. A placa já possui um indicador LCD de duas linhas, muito contrastante, com belos caracteres brancos sobre fundo azul.

Na verdade, todo o hardware está instalado, agora depende do software.

O algoritmo foi concebido da seguinte forma:

- quando a hora atual coincide com a hora em que o alarme é definido, o brilho da lâmpada deve aumentar lentamente até o máximo;
- ao mesmo tempo, os sinais sonoros devem ser emitidos várias vezes em ordem crescente, impedindo que o objeto wakeUp se empurre para a lâmpada e adormeça na luz;
- você deve dar a oportunidade de desligar no final o som irritante, além de ligar manualmente a luz total ou desligá-la, já tendo plena consciência.
- Deverá ser possível definir a hora no relógio e no despertador.
O esboço resultante é mostrado no final do material e fornecido com comentários detalhados. É fácil modificar de acordo com seus desejos e preferências.

Tenha um bom despertar para todos!



Esboço do programa do despertador
//
#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 Atenção! De 23 de setembro a 23 de outubro de 2015, realizamos um concurso de fotos

"Impressão em 3D para resolver problemas do dia a dia"!

O vencedor receberá um designer de impressora 3D MC5 com uma caixa de acrílico como presente .

Aqueles que desejam podem simplesmente aparecer e votar em seu trabalho favorito.

Condições do concurso de fotografia .

Source: https://habr.com/ru/post/pt384925/


All Articles