Wachen Sie bequem auf - machen Sie einen Do-it-yourself-Lichtalarm

Der Herbst ist also gekommen ... Der
Winter steht unaufhaltsam vor der Tür - es ist morgens dunkel und abends dunkel.
Das Aufwachen mit einem Wecker in völliger Dunkelheit entspricht dem Tauchen unter dem Eis. Stress am Morgen - garantiert ein langweiliger Tag.

Die Lösung ist, der Lichtalarm wird gerufen, aber der Preis für dieses Ding liegt bei 5000 Rubel. Es sticht jedoch. Darüber hinaus ist der Operationsalgorithmus fest codiert, aber es ist ziemlich offensichtlich, dass Sie gemäß den Ergebnissen des Aufwachens etwas korrigieren oder die Funktionalität erweitern möchten.
Was aber, wenn auf improvisierter Basis etwas in diesem Sinne aufgebaut werden soll? Gutes Puzzle für DIY!



Die folgenden Materialien wurden für die Lösung verwendet:

- ein Prototyp des Debugging-Boards eines Kits zum Erlernen der Arduino-Programmierung (im zukünftigen NR05-Kit enthalten), das für den Arduino Nano entwickelt wurde ;
- Echtzeituhr MP1095 ;
- LEDs sind unterschiedlich;
- Piezo-Hochtöner mit eingebautem Generator;
- eine weiße durchscheinende Sache, die beim Debuggen eines 3D-Druckers einmal gedruckt wurde (Sie können etwas anderes Durchscheinendes als Diffusor anpassen, und wer einen 3D-Drucker hat, kann etwas Eigenes drucken);
- der Wunsch, all dies zu kombinieren und einen geeigneten Arbeitsalgorithmus zu programmieren.

Ich wollte das weiße Ding auf einen Sockel stapeln, um die LED dort zu montieren und mit einem Kabel an die Platine anzuschließen. Ohne nachzudenken, zeichnen wir in SketchUp und drucken einen orangefarbenen Ständer auf einem 3D-Drucker. Mit einem starken Wunsch können Sie das Gehäuse für die Prototypentafel drucken, aber der Prototyp ist unglaublich schön!
Darüber hinaus kann es für die Entwicklung anderer Projekte verwendet werden, und der Wecker kann gemäß den Ergebnissen des Betriebs des Prototyps in einem kompakteren Design angeordnet werden, das auf derselben Arduino Nano-Platine basiert.

Zuerst eine LED stecken. Es wurde mit einem innovativen Klebstoff, der durch UV-Strahlung gehärtet wurde, auf die Basis geklebt. Bondic genannt. Nützliche Sache im Haushalt, muss ich sagen! Hält fest.









Sie klebten den Stecker mit dem gleichen Kleber.





Wir sahen zu, wie man glüht. Mochte es nicht. Im Dunkeln ist es natürlich sichtbar, aber nicht genug, um das Gehirn durch optische Rezeptoren zu aktivieren. Ein paar hellweiße LEDs fielen durch die Gimmicks. In einem solchen Zweig parallel kombiniert, erzeugen sie ein Licht, das bei maximaler Helligkeit ganz erwacht.



Sie verbrauchen maximal ca. 100 mA. Sie können keine direkte Verbindung zum Arduino-Port herstellen. Auf der Debug-Karte befindet sich jedoch ein Stromverstärker mit einem Transistor, der 200 mA liefert.



Es gibt auch fünf Tasten auf der Platine für alle Arten von Experimenten. Wir verwenden sie, um die Modi zu steuern und den Alarm einzustellen.

Im Allgemeinen ist die Debug-Platine durch das Vorhandensein markierter Verbindungsstifte zum Anschließen verschiedener Sensoren und Aktoren interessant, die eine gute Funktionalität und eine benutzerfreundliche Schnittstelle bieten. Sie können Temperatursensoren, Drucksensoren, Servos, Relais und Geräte ohne zu zögern mit I2C-Schnittstelle verbinden (signiert). usw. Für den Anschluss werden nur Kabel mit Buchsen benötigt.



Wir werden die Helligkeit mit einer PWM vom neunten Pin von Arduino einstellen, der auf der Platine zum Verstärker geschieden ist. Wir verbinden den Hochtöner mit dem SOUND-Anschluss, auf DAT plus, auf GND minus. Echtzeituhr - an den I2C_5V-Anschluss, da dieser 5V für die Stromversorgung benötigt. Die Tafel hat bereits eine zweizeilige LCD-Anzeige, die sehr kontrastreich ist und schöne weiße Zeichen auf blauem Hintergrund aufweist.

Eigentlich ist die gesamte Hardware vorhanden, jetzt liegt es an der Software.

Der Algorithmus wurde wie folgt konzipiert:

- Wenn die aktuelle Zeit mit der Zeit übereinstimmt, für die der Alarm eingestellt ist, sollte die Helligkeit der Lampe langsam vollständig ansteigen.
- Gleichzeitig sollten mehrere Tonsignale in aufsteigender Reihenfolge gesendet werden, um zu verhindern, dass das WakeUp-Objekt in die Glühbirne schiebt und im Licht einschlafen kann.
- Sie müssen die Möglichkeit geben, am Ende den störenden Ton auszuschalten sowie das volle Licht manuell einzuschalten oder es auszuschalten, wenn Sie bereits bei vollem Bewusstsein sind.
- Es sollte möglich sein, die Uhrzeit auf der Uhr und dem Wecker einzustellen.
Die resultierende Skizze wird am Ende des Materials angezeigt und mit detaillierten Kommentaren versehen. Es ist einfach, an Ihre Wünsche und Vorlieben anzupassen.

Habt ein schönes Erwachen für alle!



Skizze des Programms des Weckers
//
#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 Beachtung! Vom 23. September bis 23. Oktober 2015 veranstalten wir einen Fotowettbewerb

„3D-Druck zur Lösung alltäglicher Probleme“!

Der Gewinner erhält einen 3D-Drucker-Designer MC5 mit einem Acrylgehäuse als Geschenk .

Wer möchte, kann einfach vorbeischauen und für seine Lieblingsarbeit stimmen.

Bedingungen für Fotowettbewerbe .

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


All Articles