bogdan546 Postat Ianuarie 1, 2022 Partajează Postat Ianuarie 1, 2022 (editat) Am realizat acest proiect si l-am modificat un pic, dar as fi dorit sa pot fixa alarma fara sa fiu nevoit sa trec prin toate setarile( salvarea in memorie se face la final) Pentru a testa mai multe variante am simulat in proteus si am atasat mai jos simularea . As fi recunoscator daca ma poate ajuta cineva . /* Digital Clock with Alarm Function * More info: http://www.ardumotive.com/ * Dev: Michalis Vasilakis Data: 19/11/2016 Ver: 1.0 * * Display 16x2: Setup: Setup Alarm * +----------------+ +----------------+ +----------------+ * |HH:MM:SS|* HH:MM| | >HH :>MM | | Set Alarm | * |DD/MM/YY| ALARM| |>DD />MM />YYYY | | >HH :>MM | * +----------------+ +----------------+ +----------------+ */ //Libraries #include <Wire.h> #include "RTClib.h" #include <LiquidCrystal.h> #include <EEPROM.h> #include "ClosedCube_HDC1080.h" ClosedCube_HDC1080 hdc1080; //Connections and constants LiquidCrystal lcd(2, 3, 4, 5, 6, 7);//LiquidCrystal lcd(8,7,6,5,4,3); //LCD RTC_DS1307 rtc; //DS1307 i2c char daysOfTheWeek[7][12] = {"Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; const int btSet = A0; const int btAdj = A1; const int btAlarm = A2; const int buzzer = 8; //const int shakeSensor = A3; int temp = 0; long interval = 300; int melody[] = { 600, 800, 1000,1200 }; //Variables int DD,MM,YY,H,M,S,set_state, adjust_state, alarm_state,AH,AM, shake_state; int shakeTimes=0; int i =0; int btnCount = 0; String sDD; String sMM; String sYY; String sH; String sM; String sS; String aH="12"; String aM="00"; String alarm = " "; String stemp ; String shdt; String shdh; String sdegreeChar; long previousMillis = 0; //Boolean flags boolean setupScreen = false; boolean alarmON=false; boolean turnItOn = false; void setup() { //Init RTC and LCD library items rtc.begin(); lcd.begin(16,2); hdc1080.begin(0x40); //Set outputs/inputs pinMode(btSet,INPUT_PULLUP); pinMode(btAdj,INPUT_PULLUP); pinMode(btAlarm, INPUT_PULLUP); pinMode(buzzer, OUTPUT); //Check if RTC has a valid time/date, if not set it to 00:00:00 01/01/2018. //This will run only at first time or if the coin battery is low. if (! rtc.isrunning()) { Serial.println("RTC is NOT running!"); // This line sets the RTC with an explicit date & time, for example to set // January 1, 2018 at 00:00am you would call: rtc.adjust(DateTime(2021, 12, 01, 00, 00, 0)); } delay(100); //Read alarm time from EEPROM memmory AH=EEPROM.read(0); AM=EEPROM.read(1); //Check if the numbers that you read are valid. (Hours:0-23 and Minutes: 0-59) if (AH>23){ AH=0; } if (AM>59){ AM=0; } } void loop() { temp = analogRead(A6); temp = temp * 0.48828125; stemp = temp; shdt = hdc1080.readTemperature(); shdh = hdc1080.readHumidity(); sdegreeChar = String(char(223)); readBtns(); //Read buttons getTimeDate(); //Read time and date from RTC if (!setupScreen){ lcdPrint(); //Normanlly print the current time/date/alarm to the LCD if (alarmON){ callAlarm(); // and check the alarm if set on } } else{ timeSetup(); //If button set is pressed then call the time setup function } } /*************** Functions ****************/ //Read buttons state void readBtns(){ set_state = digitalRead(btSet); adjust_state = digitalRead(btAdj); alarm_state = digitalRead(btAlarm); if(!setupScreen){ if (alarm_state==LOW){ if (alarmON){ alarm=" "; alarmON=false; } else{ alarm="ALARM"; alarmON=true; } delay(500); } } if (set_state==LOW){ if(btnCount<7){ btnCount++; setupScreen = true; if(btnCount==1){ lcd.clear(); lcd.setCursor(0,0); lcd.print("------SET------"); lcd.setCursor(0,1); lcd.print("-TIME and DATE-"); delay(2000); lcd.clear(); } } else{ lcd.clear(); rtc.adjust(DateTime(YY, MM, DD, H, M, 0)); //Save time and date to RTC IC EEPROM.write(0, AH); //Save the alarm hours to EEPROM 0 EEPROM.write(1, AM); //Save the alarm minuted to EEPROM 1 lcd.print("Saving...."); delay(2000); lcd.clear(); setupScreen = false; btnCount=0; } delay(500); } } //Read time and date from rtc ic void getTimeDate(){ if (!setupScreen){ DateTime now = rtc.now(); DD = now.day(); MM = now.month(); YY = now.year(); H = now.hour(); M = now.minute(); S = now.second(); } //Make some fixes... if (DD<10){ sDD = '0' + String(DD); } else { sDD = DD; } if (MM<10){ sMM = '0' + String(MM); } else { sMM = MM; } sYY=YY-2000; if (H<10){ sH = '0' + String(H); } else { sH = H; } if (M<10){ sM = '0' + String(M); } else { sM = M; } if (S<10){ sS = '0' + String(S); } else { sS = S; } if (AH<10){ aH = '0' + String(AH); } else { aH = AH; } if (AM<10){ aM = '0' + String(AM); } else { aM = AM; } } //Print values to the display void lcdPrint(){ //String line1 = sH+":"+sM+":"+sS+" | "+aH+":"+aM; String line1 = sH+":"+sM+":"+sS+"|"+stemp+""+sdegreeChar+"C"+shdh+"%";//+stemp; String line2 = sDD+"/"+sMM+"/"+sYY +"|"+aH+":"+aM+""+alarm; lcd.setCursor(0,0);//First row lcd.print(line1); //lcd.setCursor(11,0); //lcd.write(223); //lcd.print("C"); lcd.setCursor(0,1); //Second row lcd.print(line2); } //Setup screen void timeSetup(){ int up_state = adjust_state; int down_state = alarm_state; if(btnCount<=5){ if (btnCount==1){ //Set Hour lcd.setCursor(4,0); lcd.print(">"); if (up_state == LOW){ //Up button + if (H<23){ H++; } else { H=0; } delay(350); } if (down_state == LOW){ //Down button - if (H>0){ H--; } else { H=23; } delay(350); } } else if (btnCount==2){ //Set Minutes lcd.setCursor(4,0); lcd.print(" "); lcd.setCursor(9,0); lcd.print(">"); if (up_state == LOW){ if (M<59){ M++; } else { M=0; } delay(350); } if (down_state == LOW){ if (M>0){ M--; } else { M=59; } delay(350); } } else if (btnCount==3){ //Set Day lcd.setCursor(9,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(">"); if (up_state == LOW){ if (DD<31){ DD++; } else { DD=1; } delay(350); } if (down_state == LOW){ if (DD>1){ DD--; } else { DD=31; } delay(350); } } else if (btnCount==4){ //Set Month lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(5,1); lcd.print(">"); if (up_state == LOW){ if (MM<12){ MM++; } else { MM=1; } delay(350); } if (down_state == LOW){ if (MM>1){ MM--; } else { MM=12; } delay(350); } } else if (btnCount==5){ //Set Year lcd.setCursor(5,1); lcd.print(" "); lcd.setCursor(10,1); lcd.print(">"); if (up_state == LOW){ if (YY<2999){ YY++; } else { YY=2000; } delay(350); } if (down_state == LOW){ if (YY>2018){ YY--; } else { YY=2999; } delay(350); } } lcd.setCursor(5,0); lcd.print(sH); lcd.setCursor(8,0); lcd.print(":"); lcd.setCursor(10,0); lcd.print(sM); lcd.setCursor(1,1); lcd.print(sDD); lcd.setCursor(4,1); lcd.print("/"); lcd.setCursor(6,1); lcd.print(sMM); lcd.setCursor(9,1); lcd.print("/"); lcd.setCursor(11,1); lcd.print(sYY); } else{ setAlarmTime(); } } //Set alarm time void setAlarmTime(){ int up_state = adjust_state; int down_state = alarm_state; String line2; lcd.setCursor(0,0); lcd.print("SET ALARM TIME"); if (btnCount==6){ //Set alarm Hour if (up_state == LOW){ if (AH<23){ AH++; } else { AH=0; } delay(350); } if (down_state == LOW){ if (AH>0){ AH--; } else { AH=23; } delay(350); } line2 = " >"+aH+" : "+aM+" "; } else if (btnCount==7){ //Set alarm Minutes if (up_state == LOW){ if (AM<59){ AM++; } else { AM=0; } delay(350); } if (down_state == LOW){ if (AM>0){ AM--; } else { AM=59; } delay(350); } line2 = " "+aH+" :>"+aM+" "; } lcd.setCursor(0,1); lcd.print(line2); } void callAlarm(){ if (aM==sM && aH==sH && S>=0 && S<=2){ turnItOn = true; } if(alarm_state==LOW || shakeTimes>=6 || (M==(AM+5))){ turnItOn = false; alarmON=true; delay(500); } //if(analogRead(shakeSensor)>200){ // shakeTimes++; // Serial.print(shakeTimes); // delay(50); // } if (turnItOn){digitalWrite(buzzer, HIGH); delay (500); digitalWrite(buzzer, LOW); }else{digitalWrite(buzzer, LOW);} delay(100); /*unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; tone(buzzer,melody[i],100); i++; if(i>3){i=0; }; } } else{ noTone(buzzer); shakeTimes=0; }*/ } Arduino Nano 3.pdsprj Editat Ianuarie 1, 2022 de bogdan546 Link spre comentariu
XAN77 Postat Ianuarie 2, 2022 Partajează Postat Ianuarie 2, 2022 Dacă puneai și hexu poate puteam simula măcar de curiozitate. Pe de altă parte de ce te deranjează că ai ceva de defilat prin meniu până la reglarea alarmei? Bănuiesc că nu o setezi zilnic la ore diferite. Având fizic 4 butoane, parcă atâtea am văzut în proteus, îți poți regândi partea de reglaje cum vrei tu, inclusiv funcții noi la combinații neortodoxe ale acelor butoane adică 2 apăsate simultan. Link spre comentariu
bogdan546 Postat Ianuarie 2, 2022 Autor Partajează Postat Ianuarie 2, 2022 Imi este utila setarea alarmei la inceput pentru ca pana la reglarea alarmei ceasul este oprit. Adica incepe sa functioneze abia dupa ce sunt salvate setarile Acesta este hex-ul DigitalClockAlarm_3.ino.hex Link spre comentariu
Liviu M Postat Ianuarie 2, 2022 Partajează Postat Ianuarie 2, 2022 Ca sa setezi alarma inainte de timp, cred ca e suficient sa schimbi ordinea if-urilor (apelezi setAlarmTime() la if(btnCount==1) si pentru timp folosesti btnCount == 2..7), dar salvarea in EEPROM tot la sfarsit va fi, dupa ce ai parcurs tot meniul. Pe de alta parte, chiar functioneaza setarea minutelor pentru alarma? Ca mie mi se pare ca n-ar trebui. Pe de o parte ai if(btnCount<7){ btnCount++; ... } else{ ... btnCount=0; adica btnCount ia valori in intervalul 0 .. 6, pe de alta parte ai: else if (btnCount==7){ //Set alarm Minutes care n-ar trebui sa fie niciodata adevarat. Link spre comentariu
bogdan546 Postat Ianuarie 2, 2022 Autor Partajează Postat Ianuarie 2, 2022 Imi este utila setarea alarmei la inceput pentru ca pana la reglarea alarmei ceasul este oprit . Adica asa dori sa pot salva imediat dupa ce setez alarma . Link spre comentariu
Liviu M Postat Ianuarie 2, 2022 Partajează Postat Ianuarie 2, 2022 Am inteles ce si de ce vrei, da' mi se pare complicat, practic trebuie schimbata complet structura programului... Oricum, mai sus am gresit, la setat alarma ai nevoie de doua valori pentru btnCount, asa ca potrivit ceasul va incepe de la 3. Sau de la 4 daca folosesti 3 pentru salvat alarmele. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum