11
Καλησπέρα. πιθανόν να έπρεπε να ποστάρω στην κατηγορία παρουσίαση κατασκευών, αλλά είναι ημιτελές (χωρίς κουτί) και πολύ ταπεινό για να πάει στις κατασκευές.
Ασχολούμαι ερασιτεχνικά με ηλεκτρονικά και γνωρίζω πολύ λίγα πράγματα... Εδώ και αρκετά χρόνια άκουγα για μικροεπεξεργαστές και πραγματικά άλλαζα κουβέντα. Μου φαίνονταν όλα ακαταλαβίστικα και πολύπλοκα.
Τελικά το τόλμησα και πήγε καλούτσικα... Σαν πρώτο project διάλεξα να φτιάξω ένα ρολόι για εκμάθηση. Δεν έβαλα αυτό το θέμα για να γίνει κριτική στον κώδικα (αν και είναι ευπρόσδεκτη πάντα) ούτε για να παρουσιάσω έναν άψογο κώδικά για ρολόι ούτε για να δείτε το χειμαδιό συνδέσεων. Ο λόγος που το γράφω είναι για να ενθαρρύνω όποιον δεν έχει ασχοληθεί και θέλει... Σίγουρα υπάρχουν πιο "κομψοί" τρόποι να γράψεις τον κώδικα αλλά τελικά το αποτέλεσμα πέτυχε....
Η αρχική σκέψη ήταν να φτιάξω ένα ρολόι με LCD. Μετά όμως "ανακάλυψα" ότι όταν κόβεις τροφοδοσία, χάνει την ώρα....άρα έβαλα και ένα Real Time Clock modulακι. Ναι αλλά και το RTC πρέπει κάπως να ρυθμίζεται....μπήκαν και κουμπιά και menu στο παιχνίδι.... Να βάλω και 1 ξυπνητήρι; Να και το μεγαφωνάκι από παλιό ericcson κινητό... και άμα κοπεί η τροφοδοσία, το ξυπνητήρι να χάνει ρύθμιση;;;;; να και η eeprom του arduino...
Στην αρχή πελαγώνεις.... μετά αρχίζεις το google και σιγά σιγά προχωράς.
Σαν hardware :
1. funduino uno
2. LCD 16x2 με I2C
3. RTC DS1307 με I2C
4. 4x κουμπάκια
5. 4 x αvτιστασούλες 10K (pull up συνδεσμολογία των παραπάνω)
6. μεγαφωνάκι κινητού
Παρακάτω ο κώδικας:
Κώδικας:#include <EEPROM.h> //for alarm storage #include <pitches.h> // for alarm buzzer #include <DS1307RTC.h> //RTC #include <Time.h> //time #include <Wire.h> //for I2C #include <LiquidCrystal_I2C.h> //i2c LCD #define I2C_ADDR 0x27 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 const int menubutton = 2; const int upbutton = 3; const int downbutton = 4; const int okbutton = 5; int minutes = 0; int hours = 0; int secs = 0; int days = 0; int months = 0; int years = 0; int weekdays = 0; int menuposition = 0; int alhour= 0; int alminutes = 0; int alset = 0; int led = 13; LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address int menubuttonstate = 0; int upbuttonstate = 0; int downbuttonstate = 0; int okbuttonstate = 0; int melody[] = { NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4}; //note durations: 4 = quarter note, 8 = eighth note, etc.: int noteDurations[] = { 4, 8, 8, 4,4,4,4,4 }; byte bell[8] = //icon for alarm { 0b00000, 0b00100, 0b01010, 0b01010, 0b01010, 0b10001, 0b11111, 0b00100 }; void setup() { pinMode(menubutton, INPUT); pinMode(upbutton, INPUT); pinMode(downbutton, INPUT); pinMode(okbutton, INPUT); pinMode(led, OUTPUT); setSyncProvider(RTC.get); //get RTC time lcd.begin(16,2); // initialize the lcd lcd.clear(); lcd.createChar(1,bell); //create bell symbol alhour = EEPROM.read(1); //read alarm setting hours alminutes = EEPROM.read(2); //read alarm setting minutes alset = EEPROM.read(3); //read alarm setting status digitalWrite(led, LOW); // make sure pcb led is not on } void loop() { lcd.backlight(); // turns backlight on menubuttonstate = digitalRead(menubutton); if (menubuttonstate == HIGH) {menu();} lcd.setCursor(4,0); printDigits(hour()); lcd.print(":"); printDigits(minute()); lcd.print(":"); printDigits(second()); lcd.print(" "); lcd.setCursor(1,1); weekdays= weekday(); if (weekdays == 1) {lcd.print ("SUN");} if (weekdays == 2) {lcd.print ("MON");} if (weekdays == 3) {lcd.print ("TUE");} if (weekdays == 4) {lcd.print ("WED");} if (weekdays == 5) {lcd.print ("THU");} if (weekdays == 6) {lcd.print ("FRI");} if (weekdays == 7) {lcd.print ("SAT");} lcd.print(" "); printDigits(day()); lcd.print("/"); printDigits(month()); lcd.print("/"); lcd.print(year()); lcd.setCursor(0,0); //lcd.print (alset); if (alset == 1) { lcd.write(1);} else {lcd.print(" ");} //alarm part hours = hour(); minutes = minute(); secs = second(); if (hours == alhour && minutes == alminutes && secs>0 && secs<15 && alset == 1) { for (int thisNote = 0; thisNote < 8; thisNote++) { // to calculate the note duration, take one second // divided by the note type. //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc. int noteDuration = 1000/noteDurations[thisNote]; tone(8, melody[thisNote],noteDuration); // to distinguish the notes, set a minimum time between them. // the note's duration + 30% seems to work well: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); //stop the tone playing: noTone(8); } //for end } //if end } // loop end void printDigits(int digits){ // utility function for digital clock display: prints preceding colon and leading 0 if(digits < 10) lcd.print('0'); lcd.print(digits); } //printdigits end void menu(){ delay (100); menubuttonstate = digitalRead(menubutton); while (menubuttonstate == LOW) { menubuttonstate = digitalRead(menubutton); upbuttonstate = digitalRead(upbutton); downbuttonstate = digitalRead(downbutton); okbuttonstate = digitalRead(okbutton); if (upbuttonstate == HIGH) {menuposition = menuposition + 1;} if (downbuttonstate == HIGH){menuposition = menuposition - 1;} if (menuposition <0) {menuposition = 7;} if (menuposition > 7) {menuposition = 0;} delay (100); prt(); okbuttonstate = digitalRead(okbutton); if (okbuttonstate == HIGH) {chng ();} } lcd.clear(); } //menu() end void prt(){ lcd.setCursor(0,0); lcd.clear(); if (menuposition == 0) {lcd.print("Hours");} if (menuposition == 1) {lcd.print("Minutes");} if (menuposition == 2) {lcd.print("Year");} if (menuposition == 3) {lcd.print("Month");} if (menuposition == 4) {lcd.print("Day");} if (menuposition == 5) {lcd.print("Alarm Hour");} if (menuposition == 6) {lcd.print("Alarm Minutes");} if (menuposition == 7) {lcd.print("Alarm Status");} } //prt end void chng(){ if (menuposition == 0) { delay(100); lcd.clear(); okbuttonstate = digitalRead(okbutton); hours=hour(); while (okbuttonstate == LOW) { menubuttonstate = digitalRead(menubutton); upbuttonstate = digitalRead(upbutton); downbuttonstate = digitalRead(downbutton); okbuttonstate = digitalRead(okbutton); lcd.clear(); lcd.setCursor(4,0); lcd.print (" "); lcd.setCursor(4,0); lcd.print(hours); if (upbuttonstate == HIGH) { hours = hour()+ 1;} if (downbuttonstate == HIGH) { hours = hour()- 1;} if (hours >23) {hours = 0;} if (hours < 0) {hours = 23;} delay (100); setTime(hours,minute(),second(),day(),month(),year()); //set arduino time RTC.set(now()); //set RTC time } //while end } // if end if (menuposition == 1) { delay(100); lcd.clear(); okbuttonstate = digitalRead(okbutton); minutes=minute(); while (okbuttonstate== LOW) { menubuttonstate = digitalRead(menubutton); upbuttonstate = digitalRead(upbutton); downbuttonstate = digitalRead(downbutton); okbuttonstate = digitalRead(okbutton); lcd.clear(); lcd.setCursor(4,0); lcd.print(minutes); if (upbuttonstate == HIGH) { minutes = minute()+ 1;} if (downbuttonstate == HIGH) { minutes = minute()- 1;} if (minutes >59) {minutes = 0;} if (minutes < 0) {minutes = 23;} delay (200); setTime(hour(),minutes,second(),day(),month(),year()); //set arduino time RTC.set(now()); //set RTC time } //while end } // if end if (menuposition == 2) { delay(100); lcd.clear(); okbuttonstate = digitalRead(okbutton); years=year(); while (okbuttonstate== LOW) { menubuttonstate = digitalRead(menubutton); upbuttonstate = digitalRead(upbutton); downbuttonstate = digitalRead(downbutton); okbuttonstate = digitalRead(okbutton); years=year(); lcd.clear(); lcd.setCursor(4,0); lcd.print(years); if (upbuttonstate == HIGH) { years = year()+ 1;} if (downbuttonstate == HIGH) { years = year()- 1;} if (years >2020) {years = 2014;} if (years < 2014) {years = 2020;} delay (200); setTime(hour(),minute(),second(),day(),month(),years); //set arduino time RTC.set(now()); //set RTC time } //while end } // if end if (menuposition == 3) { delay(100); lcd.clear(); okbuttonstate = digitalRead(okbutton); months=month(); while (okbuttonstate== LOW) { menubuttonstate = digitalRead(menubutton); upbuttonstate = digitalRead(upbutton); downbuttonstate = digitalRead(downbutton); okbuttonstate = digitalRead(okbutton); lcd.clear(); lcd.setCursor(4,0); lcd.print(months); if (upbuttonstate == HIGH) { months = month()+ 1;} if (downbuttonstate == HIGH) { months = month()- 1;} if (months >12) {months = 1;} if (months < 1) {months = 12;} delay (200); setTime(hour(),minute(),second(),day(),months,year()); //set arduino time RTC.set(now()); //set RTC time } //while end } // if end if (menuposition == 4) { delay(100); lcd.clear(); okbuttonstate = digitalRead(okbutton); days=day(); while (okbuttonstate== LOW) { menubuttonstate = digitalRead(menubutton); upbuttonstate = digitalRead(upbutton); downbuttonstate = digitalRead(downbutton); okbuttonstate = digitalRead(okbutton); lcd.clear(); lcd.setCursor(4,0); lcd.print(days); if (upbuttonstate == HIGH) { days = day()+ 1;} if (downbuttonstate == HIGH) { days = day()- 1;} if (days >31) {days = 1;} if (days < 1) {days = 31;} delay (200); setTime(hour(),minute(),second(),days,month(),year()); //set arduino time RTC.set(now()); //set RTC time } //while end } // if end if (menuposition == 5) { delay(100); lcd.clear(); okbuttonstate = digitalRead(okbutton); while (okbuttonstate== LOW) { menubuttonstate = digitalRead(menubutton); upbuttonstate = digitalRead(upbutton); downbuttonstate = digitalRead(downbutton); okbuttonstate = digitalRead(okbutton); lcd.clear(); lcd.setCursor(4,0); lcd.print(alhour); if (upbuttonstate == HIGH) { alhour = alhour + 1;} if (downbuttonstate == HIGH) { alhour = alhour- 1;} if (alhour >23) {alhour = 0;} if (alhour < 0) {alhour = 23;} delay (200); EEPROM.write(1, alhour); //save to eeprom for power falure } //while end } // if end if (menuposition == 6) { delay(100); lcd.clear(); okbuttonstate = digitalRead(okbutton); while (okbuttonstate== LOW) { menubuttonstate = digitalRead(menubutton); upbuttonstate = digitalRead(upbutton); downbuttonstate = digitalRead(downbutton); okbuttonstate = digitalRead(okbutton); lcd.clear(); lcd.setCursor(4,0); lcd.print(alminutes); if (upbuttonstate == HIGH) { alminutes = alminutes + 1;} if (downbuttonstate == HIGH) { alminutes = alminutes- 1;} if (alminutes >59) {alminutes = 0;} if (alminutes < 0) {alminutes = 59;} delay (200); EEPROM.write(2, alminutes); //save to eeprom for power falure } //while end } // if end if (menuposition == 7) { delay(100); lcd.clear(); okbuttonstate = digitalRead(okbutton); while (okbuttonstate== LOW) { menubuttonstate = digitalRead(menubutton); upbuttonstate = digitalRead(upbutton); downbuttonstate = digitalRead(downbutton); okbuttonstate = digitalRead(okbutton); lcd.clear(); lcd.setCursor(4,0); if (alset ==1) { lcd.print("ON");} if (alset ==0) {lcd.print("OFF");} if (upbuttonstate == HIGH) { alset = alset + 1;} if (downbuttonstate == HIGH) { alset = alset - 1;} if (alset >1) {alset = 0;} if (alset < 0) {alset = 1;} delay (200); EEPROM.write(3, alset); //save to eeprom for power falure } //while end } // if end } //chng end