https://ocw.cs.pub.ro/courses/pm/prj2021/avaduva/ceasalarma
Am ales sa fac un ceas cu alarma bazat pe arduino, folosind si un buzzer(pt alarma -sunet), un display care afiseaza ora, si o baterie (optional). Alarma se poate seta prin intermediul unor butoane, iar pe lcd va fi afisata data si ora aleasa pentru alarma.
Atasat la placuta arduino avem un display pe care ni se va afisa ora/data preluate prin intermediul rtc-ului, iar alarma(in cate ore va porni) se va seta prin intermediul celor 4 butoane atasate breadboard-ului.
Nume componenta | Cantitate | Valori |
---|---|---|
Arduino UNO | 1 | |
DS 1307 RTC Module | 1 | |
Buton | 4 | |
3.16×2 LCD Display | 1 | |
Buzzer pasiv | 1 | 5V |
Rezistente | 4 | 1K |
Fire mama-tata | 10 | |
Fire tata-tata | 10 |
Majoritate componentelor au fost achizitionate de pe site-ul : https://cleste.ro/ Componentele care nu au fost disponibile sau de care nu mi-am dat seama ca am nevoie in momentul plasarii comenzii au fost achizitionate dintr-un magazin fizicde electronice: ELWEST Magazin - sector2
**Update: N-am mai foosit baterie, cum am decis initial si am conectat prin usb placuta la pc-ul meu
Am folosit un Breadboard, pentru ca nu aveam pe placuta suficienti pini pentru toate componentele. Prin intermediul modulului RTC- real time clock preiau ora si data exacta, folosindu-ma de libraria DS1302 LCD-ul ales de mine are modulul I2C integrat, l-as fi putut folosi si pe cel fara modul integrat, dar doar pe acesta l-am mai gasit disponibil. Interfata I2C are 4 pini, i am conectat direct la arduiono. By default LCD-ul afiseaza ora si data exacta pe care le ia prin intermediul modulului RTC. In momentul in care doresc sa setez alarma, apas pe primul buton si imi va intra in modul de setare al alarmei, afisandu-mi pe display : hour= ? , min=? pe care le pot seta de pe al 2-lea si al 3-lea buton.Prin intermediul celui de-al 4-lea buton ies din modul de setare al alarmei si voi avea alarma setata. Daca de exemplu am setat alarma in 3h 5m, cand se va scurge timpul, buzzer ul se va activa printr-un feedback sonor.
//am inclus biblioteca 12C si cea pt rtc(DS1302.h) #include <Wire.h> #include <LiquidCrystal_I2C.h> // Set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x3F, 16, 2); #include <DS1302.h> int Hour; int Min; //am setat pinii - in functie de cum i am pus eu pe placuta int pset = 8; // pushbutton for setting alarm int phour = 9; // pushbutton for hour int pmin = 10; // pushbutton for minutes int pexit = 11; // pushbutton for exit of set alarm int buzzer = 6; int h; int m; //Am definit starea butoanelor int buttonforset = 0; // pushbutton state for setting alarm int buttonforhour = 0; // pushbutton state for hour int buttonformin = 0;// pushbutton state for minutes int buttonforexit = 0; // pushbutton state for exit of set alarm int activate=0; Time t; // Init the DS1302 //pinii de pe placuta DS1302 rtc(2, 3, 4); void setup() { pinMode(pset, INPUT); pinMode(phour, INPUT); pinMode(pmin, INPUT); pinMode(pexit, INPUT); // Set the clock to run-mode, and disable the write protection rtc.halt(false); rtc.writeProtect(false); // Setup LCD to 16x2 characters lcd.begin(); // le putem decomenta daca vrem sa folosim valorile deja existente in DS1302 //rtc.setDOW(SATURDAY); // Set Day-of-Week to FRIDAY //rtc.setTime(10, 0, 0); // Set the time to 12:00:00 (24hr format) //rtc.setDate(11, 11, 2017); // Set the date to August 6th, 2010 } void loop() { if (activate == 0) { // Display time on the right conrner upper line lcd.setCursor(0, 0); lcd.print("Time: "); lcd.setCursor(6, 0); lcd.print(rtc.getTimeStr()); // Display abbreviated Day-of-Week in the lower left corner //lcd.setCursor(0, 1); //lcd.print(rtc.getDOWStr(FORMAT_SHORT)); // Display date in the lower right corner lcd.setCursor(0, 1); lcd.print("Date: "); lcd.setCursor(6, 1); lcd.print(rtc.getDateStr()); t = rtc.getTime(); Hour = t.hour; Min = t.min; buttonforset = digitalRead(pset); } // setting button pressed if (buttonforset == HIGH) { activate =1; lcd.clear(); } while(activate== 1){ lcd.setCursor(0,0); lcd.print("Set Alarm"); lcd.setCursor(0,1); lcd.print("Hour= "); lcd.setCursor(9,1); lcd.print("Min= "); buttonforhour = digitalRead(phour); // set hour for alarm if (buttonforhour == HIGH){ h++; lcd.setCursor(5,1); lcd.print(h); if (h>23){ h=0; lcd.clear(); } delay(100); } buttonformin = digitalRead(pmin); // set minutes for alarm if (buttonformin == HIGH){ m++; lcd.setCursor(13,1); lcd.print(m); if (m>59){ m=0; lcd.clear();} delay(100); } lcd.setCursor(5,1); lcd.print(h); lcd.setCursor(13,1); lcd.print(m); buttonforexit = digitalRead(pexit); // exit from set alarm mode if (buttonforexit == HIGH){ activate = 0; lcd.clear(); } } if (Hour== h && Min== m) { tone(6,400,300);} delay (500); }
A fostun proiect interesant, singurele probleme pe care le-am intampinat au fost cu arduino- programul instalat, avand diferite probleme cu fisierele si cu setarile, dar ciecuitul si codul nu mi-au dat batai de cap.