Despiértate cómodamente: haz una alarma de luz de bricolaje

Así que ha llegado el otoño ... El
invierno se avecina inexorablemente: está oscuro por la mañana y oscuro por la noche.
Despertar con un despertador en completa oscuridad es equivalente a zambullirse bajo el hielo. Estrés en la mañana: garantiza un día aburrido.

La solución es, se llama la alarma de luz, pero el precio de esta cosa es de 5000 rublos. Pincha, sin embargo. Además, el algoritmo de operación está codificado, pero es bastante obvio que, de acuerdo con los resultados del despertar, querrá corregir algo o ampliar la funcionalidad.
Pero, ¿qué pasa si sobre la base de improvisar significa construir algo con este espíritu? Buen rompecabezas para bricolaje!



Se utilizaron los siguientes materiales para la solución:

- un prototipo de la placa de depuración de un kit para aprender la programación de Arduino (incluido en el futuro kit NR05), diseñado para el Arduino Nano ;
- reloj en tiempo real MP1095 ;
- Los LED son diferentes;
- tweeter piezoeléctrico con generador incorporado;
- una cosa blanca translúcida, una vez impresa al depurar una impresora 3D (puede adaptar otra cosa translúcida como difusor, y quien tenga una impresora 3D puede imprimir algo propio);
- el deseo de combinar todo esto y programar un algoritmo de trabajo adecuado.

Quería apilar la cosa blanca en un pedestal para montar el LED allí y conectarlo con un cable a la placa. Sin pensarlo dos veces, dibujamos en SketchUp e imprimimos un soporte naranja en una impresora 3D. Con un fuerte deseo, puede imprimir el estuche para la placa prototipo, ¡pero el prototipo es increíblemente hermoso!
Además, se puede utilizar para el desarrollo de otros proyectos, y la alarma del reloj, de acuerdo con los resultados del funcionamiento del prototipo, se puede organizar en un diseño más compacto basado en la misma placa Arduino Nano.

Primero pegó un LED. Se pegó a la base con un adhesivo innovador curado por radiación UV. Llamado Bondic. Lo útil en el hogar, debo decir! Se agarra fuerte.









Pegaron el conector con el mismo pegamento.





Vimos cómo brillar. No le gustó. En la oscuridad, por supuesto, es visible, pero no lo suficiente como para activar el cerebro a través de receptores ópticos. Unos pocos LED blancos brillantes marcaron a través de los trucos. Combinados en paralelo en una ramita de este tipo, dan una luz que despierta al máximo brillo.



Consumen un máximo de aproximadamente 100 mA, no se puede conectar directamente al puerto Arduino, pero hay un amplificador de corriente de transistor en la placa de depuración que proporciona 200 mA.



También hay cinco botones en el tablero para todo tipo de experimentos, los usamos para controlar los modos y configurar la alarma.

En general, la placa de depuración es interesante por la presencia de pines de conectores marcados para conectar varios sensores y actuadores, proporcionando una buena funcionalidad y una interfaz amigable: puede conectar sensores de temperatura, sensores de presión, servos, relés, dispositivos con interfaz I2C sin dudar (firmado). etc. Para la conexión, solo se necesitan cables con enchufes.



Ajustaremos el brillo con un PWM del noveno pin de Arduino, que está divorciado en el tablero al amplificador. Conectamos el tweeter al conector SOUND, en DAT plus, en GND minus. Reloj en tiempo real: al conector I2C_5V, ya que necesitan 5V para la fuente de alimentación. La placa ya tiene un indicador LCD de dos líneas, muy contrastante, con bonitos caracteres blancos sobre un fondo azul.

En realidad, todo el hardware está en su lugar, ahora depende del software.

El algoritmo se concibió de la siguiente manera:

cuando la hora actual coincide con la hora en que se establece la alarma, el brillo de la lámpara debe aumentar lentamente al máximo;
- al mismo tiempo, se deben emitir señales de sonido varias veces en orden creciente, evitando que el objeto de activación se empuje hacia la bombilla y se quede dormido a la luz;
- debe dar la oportunidad de apagar al final el sonido molesto, así como encender la luz completa manualmente o apagarla, ya que está totalmente consciente.
- Debería ser posible configurar la hora en el reloj y la alarma.
El boceto resultante se muestra al final del material y se proporciona con comentarios detallados. Es fácil de modificar según sus deseos y preferencias.

Que tengan un buen despertar para todos



Bosquejo del programa del 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);
}
}
.

PD ¡Atención! ¡Del 23 de septiembre al 23 de octubre de 2015, realizamos un concurso de fotografía

“Impresión en 3D para resolver problemas cotidianos”!

El ganador recibirá un diseñador de impresoras 3D MC5 con una caja de acrílico como regalo .

Aquellos que lo deseen pueden simplemente pasar y votar por su trabajo favorito.

Condiciones del concurso de fotografía .

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


All Articles