A pedido de uno de los integrantes del grupo, AMLO MX, acá le comparto un sencillo ejemplo de como hacer un Temporizador secuencial programable en hora de inicio y tiempo de funcionamiento, de tres canales con una RTC
///////////////////////////////////////////////////////////////////////////////////////////////// //////////// - ETI PATAGONIA - Alejandro Martin Torres - prof.martintorres@educ.ar - //////////// //////////// - https://sites.google.com/a/educ.ar/eti/ - //////////// ///////////////////////////////////////////////////////////////////////////////////////////////// #include <EEPROM.h> #include <LiquidCrystal.h> #include "RTClib.h" #define set_hr 1 #define set_min 2 #define set_sec 3 #define enter 4 #define device1 5 #define device2 6 #define device3 7 LiquidCrystal lcd(8, 9, 10, 11, 12, 13); RTC_DS1307 rtc; int hr=0, minut=0,sec=0,set_time_flag=1,sys_en_flag=0; int process1_time_flag=0,process2_time_flag=0,process3_time_flag=0; int process1_hr,process1_min,process1_sec; int process2_hr,process2_min,process2_sec; int process3_hr,process3_min,process3_sec; int strt_hr,strt_min,strt_sec,time_flag=1; void setup () { //Serial.begin(9600); lcd.begin(16, 4); lcd.clear(); pinMode(set_hr,INPUT); pinMode(set_min,INPUT); pinMode(set_sec,INPUT); pinMode(enter,INPUT); pinMode(device1,OUTPUT); pinMode(device2,OUTPUT); pinMode(device3,OUTPUT); digitalWrite(device1,LOW); digitalWrite(device2,LOW); digitalWrite(device3,LOW); } void loop () { int hr_set_but,min_set_but,ent_but,sec_set_but; hr_set_but = digitalRead(set_hr); min_set_but = digitalRead(set_min); sec_set_but = digitalRead(set_sec); ent_but = digitalRead(enter); ///////////////// encender o apagar el dispositivo //////////////////////////////// if(time_flag) { DateTime now = rtc.now(); lcd.print("Tiempo actual es"); lcd.setCursor(0,1); lcd.print(now.hour()); lcd.print(':'); lcd.print(now.minute()); lcd.print(':'); lcd.print(now.second()); delay(3000); lcd.clear(); lcd.print("confg. secuencia"); lcd.setCursor(0,1); lcd.print("iniciar tiempo:"); lcd.setCursor(0,2); lcd.print("00:00:00"); time_flag=0; } if(sys_en_flag) { DateTime now = rtc.now(); ///////////// mostrar la hora actual en la pantalla LCD ////////////////////////// lcd.setCursor(6,0); lcd.print(" "); lcd.setCursor(6,0); lcd.print(now.hour()); lcd.print(':'); lcd.print(now.minute()); lcd.print(':'); lcd.print(now.second()); if(now.hour()==EEPROM.read(11) && now.minute()==EEPROM.read(12) && now.second()==EEPROM.read(13)) { digitalWrite(device1,HIGH); lcd.setCursor(8,1); lcd.print('2'); lcd.setCursor(6,2); lcd.print(EEPROM.read(14)); lcd.print(':'); lcd.print(EEPROM.read(15)); lcd.print(':'); lcd.print(EEPROM.read(16)); lcd.setCursor(0,3); lcd.print("Inicio proceso 1"); } if(now.hour()==EEPROM.read(14) && now.minute()==EEPROM.read(15) && now.second()==EEPROM.read(16)) { digitalWrite(device1,LOW); digitalWrite(device2,HIGH); lcd.setCursor(8,1); lcd.print('3'); lcd.setCursor(6,2); lcd.print(EEPROM.read(17)); lcd.print(':'); lcd.print(EEPROM.read(18)); lcd.print(':'); lcd.print(EEPROM.read(19)); lcd.setCursor(0,3); lcd.print("Inicio proceso 2"); } if(now.hour()==EEPROM.read(17) && now.minute()==EEPROM.read(18) && now.second()==EEPROM.read(19)) { digitalWrite(device2,LOW); digitalWrite(device3,HIGH); lcd.setCursor(8,1); lcd.print("3 fin "); lcd.setCursor(6,2); lcd.print(EEPROM.read(20)); lcd.print(':'); lcd.print(EEPROM.read(21)); lcd.print(':'); lcd.print(EEPROM.read(22)); lcd.setCursor(0,3); lcd.print("Inicio proceso 3"); } if(now.hour()==EEPROM.read(20) && now.minute()==EEPROM.read(21) && now.second()==EEPROM.read(22)) { digitalWrite(device3,LOW); lcd.setCursor(0,3); lcd.print("Fin proceso 3 "); } delay(1000); } ///////////// establecer la hora de encendido y apagado para el dispositivo /////////////////// if(hr_set_but) { if(hr<24) hr++; if(hr==24) hr=0; lcd.setCursor(0,2); lcd.print(" "); lcd.setCursor(0,2); lcd.print(hr); delay(200); } if(min_set_but) { if(minut<60) minut++; if(minut==60) minut=0; lcd.setCursor(3,2); lcd.print(" "); lcd.setCursor(3,2); lcd.print(minut); delay(200); } if(sec_set_but) { if(sec<60) sec++; if(sec==60) sec=0; lcd.setCursor(6,2); lcd.print(" "); lcd.setCursor(6 ,2); lcd.print(sec); delay(200); } if(ent_but) { if(set_time_flag==1) { strt_hr=hr; strt_min = minut; strt_sec = sec; EEPROM.write(11,strt_hr); EEPROM.write(12,strt_min); EEPROM.write(13,strt_sec); set_time_flag=0; process1_time_flag=1; lcd.setCursor(0,0); lcd.print("inicio secuencia "); lcd.setCursor(0,1); lcd.print("conf tiempo para "); lcd.setCursor(0,2); lcd.print(strt_hr); lcd.print(':'); lcd.print(strt_min); lcd.print(':'); lcd.print(strt_sec); delay(2000); lcd.setCursor(0,0); lcd.print("ejec. proces. 1 "); lcd.setCursor(0,1); lcd.print("Duracion tiempo "); lcd.setCursor(0,2); lcd.print("00:00:00"); hr = 0; minut = 0; sec = 0; } else if(process1_time_flag==1) { process1_sec = sec + EEPROM.read(13); if(process1_sec>60) { process1_sec = process1_sec-60; minut++; } process1_min = minut+EEPROM.read(12); if(process1_min>60) { process1_min = process1_min-60; hr++; } process1_hr = hr+EEPROM.read(11); EEPROM.write(14,process1_hr); EEPROM.write(15,process1_min); EEPROM.write(16,process1_sec); process1_time_flag=0; process2_time_flag=1; lcd.setCursor(0,0); lcd.print("Proces tiempo 1 "); lcd.setCursor(0,1); lcd.print("Duracion es "); lcd.setCursor(0,2); lcd.print(hr); lcd.print(" Hr "); lcd.print(minut); lcd.print(" minuto"); lcd.setCursor(0,3); lcd.print("y "); lcd.print(sec); lcd.print(" seg."); delay(2000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Ejec. proses 2 "); lcd.setCursor(0,1); lcd.print("Duracion tiempo "); lcd.setCursor(0,2); lcd.print("00:00:00"); hr = 0; minut = 0; sec = 0; } else if(process2_time_flag==1) { process2_sec = sec + EEPROM.read(16); if(process2_sec>60) { process2_sec = process2_sec-60; minut++; } process2_min = minut+EEPROM.read(15); if(process2_min>60) { process2_min = process2_min-60; hr++; } process2_hr = hr+EEPROM.read(14); EEPROM.write(17,process2_hr); EEPROM.write(18,process2_min); EEPROM.write(19,process2_sec); process2_time_flag=0; process3_time_flag=1; lcd.setCursor(0,0); lcd.print("Tiempo proses.2 "); lcd.setCursor(0,1); lcd.print("duracion es "); lcd.setCursor(0,2); lcd.print(hr); lcd.print(" Hr "); lcd.print(minut); lcd.print(" mn "); lcd.setCursor(0,3); lcd.print("y "); lcd.print(sec); lcd.print(" sec"); delay(2000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Eject. proces 3 "); lcd.setCursor(0,1); lcd.print("Tiempo duracion "); lcd.setCursor(0,2); lcd.print("00:00:00"); hr = 0; minut = 0; sec = 0; } else if(process3_time_flag==1) { process3_sec = sec + EEPROM.read(19); if(process3_sec>60) { process3_sec = process3_sec-60; minut++; } process3_min = minut+EEPROM.read(18); if(process3_min>60) { process3_min = process3_min-60; hr++; } process3_hr = hr+EEPROM.read(17); EEPROM.write(20,process3_hr); EEPROM.write(21,process3_min); EEPROM.write(22,process3_sec); process3_time_flag=0; lcd.setCursor(0,0); lcd.print("Tiempo proces 3 "); lcd.setCursor(0,1); lcd.print("duracion es "); lcd.setCursor(0,2); lcd.print(hr); lcd.print(" Hr "); lcd.print(minut); lcd.print(" mn "); lcd.setCursor(0,3); lcd.print("y "); lcd.print(sec); lcd.print(" sec"); delay(2000); lcd.clear(); lcd.print("Tiempo:-"); lcd.setCursor(0,1); lcd.print("Inicio proces.1 "); lcd.setCursor(0,2); lcd.print("Tiempo: "); lcd.print(strt_hr); lcd.print(':'); lcd.print(strt_min); lcd.print(':'); lcd.print(strt_sec); sys_en_flag=1; } } }