Bangun dengan nyaman - bikin alarm do-it-yourself

Jadi musim gugur telah tiba ...
Musim dingin tak terhindarkan lagi menjulang di depan - gelap di pagi hari dan gelap di malam hari.
Bangun pada jam alarm dalam kegelapan total sama dengan menyelam di bawah es. Stres di pagi hari - dijamin hari yang membosankan.

Solusinya adalah, alarm cahaya disebut, tetapi harga benda ini adalah dari 5.000 rubel. Itu menusuk, namun. Selain itu, algoritme operasi ini berkode keras, tetapi cukup jelas bahwa, berdasarkan hasil bangun tidur, Anda akan ingin memperbaiki sesuatu atau memperluas fungsionalitasnya.
Tetapi bagaimana jika atas dasar improvisasi berarti membangun sesuatu dalam semangat ini? Teka-teki yang bagus untuk DIY!



Bahan-bahan berikut digunakan untuk solusi:

- prototipe papan debugging kit untuk belajar pemrograman Arduino (termasuk dalam kit NR05 masa depan), yang dirancang untuk Arduino Nano ;
- Jam waktu nyata MP1095 ;
- LED berbeda;
- piezo tweeter dengan generator built-in;
- benda putih tembus cahaya, setelah dicetak saat debugging printer 3D (Anda dapat mengadaptasi sesuatu yang lain transparan sebagai diffuser, dan siapa pun yang memiliki printer 3D dapat mencetak sesuatu dari mereka sendiri);
- keinginan untuk menggabungkan semua ini dan memprogram algoritma kerja yang sesuai.

Saya ingin menumpuk benda putih di atas alas untuk memasang LED di sana dan menghubungkannya dengan kabel ke papan. Tanpa berpikir dua kali, kami menggambar SketchUp dan mencetak dudukan oranye pada printer 3D. Dengan keinginan yang kuat, Anda dapat mencetak kasing untuk papan prototipe, tetapi prototipenya luar biasa indah!
Selain itu, dapat digunakan untuk pengembangan proyek lain, dan jam alarm, sesuai dengan hasil pengoperasian prototipe, dapat diatur dalam desain yang lebih kompak berdasarkan papan Arduino Nano yang sama.

Pertama terjebak satu LED. Itu dilem ke dasar dengan perekat inovatif disembuhkan oleh radiasi UV. Disebut Bondic. Hal yang berguna dalam rumah tangga, harus saya katakan! Pegang erat-erat.









Mereka menempelkan konektor dengan lem yang sama.





Kami menyaksikan bagaimana caranya bercahaya. Tidak suka. Dalam kegelapan, tentu saja, itu terlihat, tetapi tidak cukup untuk mengaktifkan otak melalui reseptor optik. Beberapa LED putih cerah mencetak melalui gimmick. Dikombinasikan secara paralel dalam ranting seperti itu, mereka memberikan cahaya yang cukup pada kecerahan maksimum.



Mereka mengkonsumsi maksimum sekitar 100 mA, Anda tidak dapat terhubung langsung ke port Arduino, tetapi ada penguat arus transistor pada papan debug yang menyediakan 200 mA.



Ada juga lima tombol di papan tulis untuk semua jenis percobaan, kami menggunakannya untuk mengontrol mode dan mengatur alarm.

Secara umum, papan debug menarik dengan kehadiran pin konektor yang ditandai untuk menghubungkan berbagai sensor dan aktuator, menyediakan fungsionalitas yang baik dan antarmuka yang ramah - Anda dapat menghubungkan sensor suhu, sensor tekanan, servos, relay, perangkat dengan antarmuka I2C tanpa ragu-ragu (bertanda tangan). dll. Untuk koneksi, hanya dibutuhkan kabel dengan soket.



Kami akan menyesuaikan kecerahan dengan PWM dari pin kesembilan Arduino, yang diceraikan di papan ke amplifier. Kami menghubungkan tweeter ke konektor SUARA, pada DAT plus, pada GND minus. Jam waktu nyata - ke konektor I2C_5V, karena mereka membutuhkan 5V untuk catu daya. Papan sudah memiliki indikator LCD dua baris, sangat kontras, dengan karakter putih yang bagus dengan latar belakang biru.

Sebenarnya, semua perangkat keras sudah terpasang, sekarang terserah perangkat lunaknya.

Algoritma itu disusun sebagai berikut:

- ketika waktu saat ini bertepatan dengan waktu di mana alarm diatur, kecerahan lampu harus perlahan-lahan meningkat menjadi penuh;
- pada saat yang sama, sinyal suara harus dipancarkan beberapa kali dalam urutan yang meningkat, mencegah objek wakeUp untuk mendorong bola lampu dan tertidur dalam cahaya;
- Anda harus memberikan kesempatan untuk mematikan suara yang mengganggu pada akhirnya, serta menyalakan cahaya penuh secara manual, atau mematikannya, sudah sepenuhnya sadar.
- Harus dimungkinkan untuk mengatur waktu pada jam dan jam alarm.
Sketsa yang dihasilkan ditampilkan di akhir materi dan dilengkapi dengan komentar rinci. Mudah untuk memodifikasi keinginan dan preferensi Anda.

Selamat membangun untuk semua orang!



Sketsa program jam alarm
//
#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 Perhatian! Dari 23 September hingga 23 Oktober 2015 kami mengadakan kontes foto

“3 D printing untuk menyelesaikan masalah sehari-hari”!

Pemenang akan menerima MC5 perancang printer 3D dengan kasing akrilik sebagai hadiah .

Mereka yang berharap bisa mampir dan memilih karya favorit mereka.

Kondisi kontes foto .

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


All Articles