funcinamiento autonomo y/o Serial

This commit is contained in:
jp.av.dev 2021-07-11 20:44:55 -04:00
parent d31ad074f8
commit a2afc5c7ea
2 changed files with 234 additions and 223 deletions

View File

@ -1,81 +1,179 @@
#include <Servo.h> #include <Servo.h>
#include <RTClib.h> #include <RTClib.h>
#include <EEPROM.h>
#define dirHoraON1 0
#define dirHoraOFF1 1
#define dirHoraON2 2
#define dirHoraOFF2 3
#define dirPosON1 4
#define dirPosON2 5
#define dirPosOFF1 6
#define dirPosOFF2 7
Servo myservo_X; Servo myservo_X;
RTC_DS3231 reloj; RTC_DS3231 reloj;
volatile DateTime fecha; volatile DateTime fecha;
unsigned long intervalo_loop=5000; unsigned long intervalo_loop=500;
unsigned long previoMillisTermo=0;
unsigned long previoMillisLoop=0; unsigned long previoMillisLoop=0;
unsigned long previoMillisTermo=0;
unsigned long previoMillisAUTO=0;
unsigned long actualMillis; unsigned long actualMillis;
byte horaON=5; byte horaON1;
byte horaOFF=7; byte horaOFF1;
byte horaON2=16; byte horaON2;
byte horaOFF2=18; byte horaOFF2;
byte cont=0; byte posON1;
byte posON2;
byte posOFF1;
byte posOFF2;
byte posTEMP;
byte cont;
bool estado_termo; bool estado_termo;
bool espera; bool espera;
bool espera_man;
bool start; bool start;
byte manual;
byte estado;
byte hr, mn, sg, di, me;
int an;
void setup() { void setup() {
Serial.begin(9600);
myservo_X.attach(9); myservo_X.attach(9);
reloj.begin(); reloj.begin();
start=1; estado=1;
estado_termo=0; estado_termo=0;
start=1;
} }
//reloj.adjust(DateTime(__DATE__, __TIME__));
void loop() { void loop() {
if(start) { if(start) {
myservo_X.write(30); myservo_X.write(30);
start=0;
fecha=reloj.now(); fecha=reloj.now();
cargarVarsControl();
start=0;
} }
actualMillis = millis(); actualMillis = millis();
if ((unsigned long)(actualMillis - previoMillisLoop) >= intervalo_loop) { if ((unsigned long)(actualMillis - previoMillisLoop) >= intervalo_loop) {
printVars();
fecha = reloj.now(); fecha = reloj.now();
if((((fecha.hour() >= horaON) && (fecha.hour() < horaOFF)) || switch(estado) {
case 1:
// funcionamiento autonomo, por defecto
if ((unsigned long)(actualMillis - previoMillisAUTO) >= 2000) {
if((((fecha.hour() >= horaON1) && (fecha.hour() < horaOFF1)) ||
((fecha.hour() >= horaON2) && (fecha.hour() < horaOFF2))) && (estado_termo==0)) { ((fecha.hour() >= horaON2) && (fecha.hour() < horaOFF2))) && (estado_termo==0)) {
termoON(); termoACC(posON1, posON2);
} else if((((fecha.hour() < horaON) || (fecha.hour() >= horaOFF)) && } else if((((fecha.hour() < horaON1) || (fecha.hour() >= horaOFF1)) &&
((fecha.hour() < horaON2) || (fecha.hour() >= horaOFF2))) && (estado_termo==1)) { ((fecha.hour() < horaON2) || (fecha.hour() >= horaOFF2))) && (estado_termo==1)) {
termoOFF(); termoACC(posOFF1, posOFF2);
} }
}
previoMillisAUTO = millis();
break;
case 2:
// ajustaReloj
setVarsEP();
estado = 1;
break;
case 3:
// ajuste horas de funcionamiento
setVarsEP();
cargarVarsControl();
estado = 1;
break;
case 4:
// ajustaPosServo
setVarsEP();
cargarVarsControl();
estado = 1;
break;
case 5:
// ON y OFF manual
if(espera_man) {
if(manual == 1) {
termoACC(posON1, posON2);
} else if (manual == 0){
termoACC(posOFF1, posOFF2);
}
espera_man=0;
}
break;
case 6:
// movimiento 'libre'
if(validaPOS(posTEMP)) {
myservo_X.write(posTEMP);
estado_termo=0;
}
break;
default:
estado=1;
}
leerDatos();
previoMillisLoop = millis(); previoMillisLoop = millis();
} }
} }
// Secuencias de encendido y apagado de Caldera void leerDatos() {
void termoON() { if (Serial.available() > 0) {
myservo_X.write(120); byte temp_var=0;
espera=0; temp_var = Serial.readStringUntil(',').toInt();
cont=0; if(temp_var < 7 && temp_var > 0){
previoMillisTermo=millis(); estado = temp_var;
do{ } else {
actualMillis=millis(); estado = 1;
if(espera==0) {
if((unsigned long)(actualMillis - previoMillisTermo) >= 500) {
myservo_X.write(110);
previoMillisTermo=millis();
espera=1;
cont++;
} }
switch (estado) {
case 1:
limpiaSerial();
break;
case 2:
di = Serial.readStringUntil(',').toInt();
me = Serial.readStringUntil(',').toInt();
an = Serial.readStringUntil(',').toInt();
hr = Serial.readStringUntil(',').toInt();
mn = Serial.readStringUntil(',').toInt();
sg = Serial.readStringUntil(',').toInt();
break;
case 3:
horaON1 = Serial.readStringUntil(',').toInt();
horaOFF1 = Serial.readStringUntil(',').toInt();
horaON2 = Serial.readStringUntil(',').toInt();
horaOFF2 = Serial.readStringUntil(',').toInt();
break;
case 4:
posON1 = Serial.readStringUntil(',').toInt();
posON2 = Serial.readStringUntil(',').toInt();
posOFF1 = Serial.readStringUntil(',').toInt();
posOFF2 = Serial.readStringUntil(',').toInt();
break;
case 5:
manual = Serial.readStringUntil(',').toInt();
espera_man = 1;
break;
case 6:
posTEMP = Serial.readStringUntil(',').toInt();
break;
default:
limpiaSerial();
} }
if(espera==1) { limpiaSerial();
if((unsigned long)(actualMillis - previoMillisTermo) >= 500) {
myservo_X.write(120);
previoMillisTermo=millis();
espera=0;
cont++;
} }
} }
} while(cont<4);
estado_termo=1;
}
void termoOFF() {
myservo_X.write(45);
void limpiaSerial() {
while(Serial.available() > 0) {
char temp = Serial.read();
}
}
void termoACC(byte pos1, byte pos2) {
myservo_X.write(pos1);
espera=0; espera=0;
cont=0; cont=0;
previoMillisTermo=millis(); previoMillisTermo=millis();
@ -83,20 +181,108 @@ void termoOFF() {
actualMillis=millis(); actualMillis=millis();
if(espera==0) { if(espera==0) {
if ((unsigned long)(actualMillis - previoMillisTermo) >= 500) { if ((unsigned long)(actualMillis - previoMillisTermo) >= 500) {
myservo_X.write(62); myservo_X.write(pos2);
previoMillisTermo=millis();
espera=1; espera=1;
cont++; cont++;
previoMillisTermo=millis();
} }
} }
actualMillis=millis();
if(espera==1) { if(espera==1) {
if ((unsigned long)(actualMillis - previoMillisTermo) >= 500) { if ((unsigned long)(actualMillis - previoMillisTermo) >= 500) {
myservo_X.write(45); myservo_X.write(pos1);
previoMillisTermo=millis();
espera=0; espera=0;
cont++; cont++;
previoMillisTermo=millis();
} }
} }
} while (cont<4); } while (cont<4);
estado_termo=0; estado_termo=!estado_termo;
}
void setVarsEP(){
switch (estado) {
case 2:
ajustaReloj(an, me, di, hr, mn, sg);
break;
case 3:
if(validaHR(horaON1)) {
EEPROM.put(dirHoraON1, horaON1);
} else {
horaON1 = EEPROM.read(dirHoraON1);
}
if(validaHR(horaOFF1) && horaOFF1 > horaON1) {
EEPROM.put(dirHoraOFF1, horaOFF1);
} else {
EEPROM.put(dirHoraOFF1, horaON1 + 1);
horaOFF1 = EEPROM.read(dirHoraOFF1);
}
if(validaHR(horaON2) && horaON2 > horaOFF1) {
EEPROM.put(dirHoraON2, horaON2);
} else if(validaHR(horaON1)) {
EEPROM.put(dirHoraON2, horaON1);
EEPROM.put(dirHoraOFF2, horaOFF1);
horaON2 = EEPROM.read(dirHoraON2);
horaOFF2 = EEPROM.read(dirHoraOFF2);
}
if(validaHR(horaOFF2) && (horaOFF2 > horaON2) && (horaOFF2 > horaOFF1)) {
EEPROM.put(dirHoraOFF2, horaOFF2);
} else {
EEPROM.put(dirHoraON2, horaON1);
EEPROM.put(dirHoraOFF2, horaOFF1);
}
break;
case 4:
if(validaPOS(posON1)) {
EEPROM.put(dirPosON1, posON1);
}
if(validaPOS(posON2)) {
EEPROM.put(dirPosON2, posON2);
}
if(validaPOS(posOFF1)) {
EEPROM.put(dirPosOFF1, posOFF1);
}
if(validaPOS(posOFF2)) {
EEPROM.put(dirPosOFF2, posOFF2);
}
break;
}
}
bool validaHR(byte hr) {
return (hr < 24 && hr >= 0);
}
bool validaPOS(byte pos) {
return (pos < 165) && (pos >15);
}
void cargarVarsControl() {
horaON1 = EEPROM.read(dirHoraON1);
horaOFF1 = EEPROM.read(dirHoraOFF1);
horaON2 = EEPROM.read(dirHoraON2);
horaOFF2 = EEPROM.read(dirHoraOFF2);
posON1 = EEPROM.read(dirPosON1);
posON2 = EEPROM.read(dirPosON2);
posOFF1 = EEPROM.read(dirPosOFF1);
posOFF2 = EEPROM.read(dirPosOFF2);
}
void ajustaReloj(int ano, byte mes, byte dia, byte hra, byte mins, byte segs ) {
if((ano > 2000) &&
(mes > 0 && mes < 13) &&
(dia > 0 && dia < 32) &&
(hra >= 0 && hra < 24) &&
(mins >= 0 && mins < 60) &&
(segs >= 0 && segs < 60)) {
DateTime dt(ano, mes, dia, hra, mins, segs);
reloj.adjust(dt);
}
}
void printVars() {
Serial.println((String)estado+","+(String)estado_termo+","+(String)horaON1+","+(String)horaOFF1+","+(String)horaON2+","+
(String)horaOFF2+","+(String)posON1+","+(String)posON2+","+(String)posOFF1+","+(String)posOFF2+","+
(String)fecha.hour()+","+(String)fecha.minute()+","+(String)fecha.second()+","+(String)fecha.day()+","+
(String)fecha.month()+","+(String)fecha.year());
} }

View File

@ -1,175 +0,0 @@
#include <Servo.h>
#include <RTClib.h>
Servo myservo_X;
RTC_DS3231 reloj;
volatile DateTime fecha;
unsigned long intervalo_loop=5000;
unsigned long previoMillisTermo=0;
unsigned long previoMillisLoop=0;
unsigned long actualMillis;
byte horaON=5;
byte horaOFF=7;
byte horaON2=16;
byte horaOFF2=18;
byte cont=0;
bool estado_termo;
bool espera;
bool start;
void setup() {
Serial.begin(9600);
myservo_X.attach(9);
reloj.begin();
start=1;
estado_termo=0;
DateTime dt(2021, 7, 5, 5, 32, 0);
reloj.adjust(dt);
}
//reloj.adjust(DateTime(__DATE__, __TIME__));
void loop() {
if(start) {
Serial.println("Inicio");
myservo_X.write(30);
start=0;
fecha=reloj.now();
}
actualMillis = millis();
if ((unsigned long)(actualMillis - previoMillisLoop) >= intervalo_loop) {
fecha = reloj.now();
if((((fecha.hour() >= horaON) && (fecha.hour() < horaOFF)) ||
((fecha.hour() >= horaON2) && (fecha.hour() < horaOFF2))) && (estado_termo==0)) {
Serial.print("pre ON : ");
Serial.println((String)estado_termo);
termoON();
Serial.print("post ON : ");
Serial.println((String)estado_termo);
} else if((((fecha.hour() < horaON) || (fecha.hour() >= horaOFF)) &&
((fecha.hour() < horaON2) || (fecha.hour() >= horaOFF2))) && (estado_termo==1)) {
Serial.print("pre OFF : ");
Serial.println((String)estado_termo);
termoOFF();
Serial.print("post OFF : ");
Serial.println((String)estado_termo);
}
previoMillisLoop = millis();
}
}
// Secuencias de encendido y apagado de Caldera
void termoON() {
myservo_X.write(120);
espera=0;
cont=0;
previoMillisTermo=millis();
do{
actualMillis=millis();
if(espera==0) {
if((unsigned long)(actualMillis - previoMillisTermo) >= 500) {
myservo_X.write(110);
previoMillisTermo=millis();
espera=1;
cont++;
}
}
if(espera==1) {
if((unsigned long)(actualMillis - previoMillisTermo) >= 500) {
myservo_X.write(120);
previoMillisTermo=millis();
espera=0;
cont++;
}
}
} while(cont<4);
estado_termo=1;
}
void termoOFF() {
myservo_X.write(45);
espera=0;
cont=0;
previoMillisTermo=millis();
do{
actualMillis=millis();
if(espera==0) {
if ((unsigned long)(actualMillis - previoMillisTermo) >= 500) {
myservo_X.write(62);
previoMillisTermo=millis();
espera=1;
cont++;
}
}
if(espera==1) {
if ((unsigned long)(actualMillis - previoMillisTermo) >= 500) {
myservo_X.write(45);
previoMillisTermo=millis();
espera=0;
cont++;
}
}
} while (cont<4);
estado_termo=0;
}
//En caso de ser necesario mostrar hora, este codigo añade un 0 a los valores menores a 10
String getHora(char var) {
switch (var) {
case 'h':
if(fecha.hour() < 10) {
return ('0'+(String)fecha.hour()); break;
} else {
return (String)fecha.hour();break;
}
case 'm':
if(fecha.minute() <10) {
return ('0'+(String)fecha.minute()); break;
} else {
return (String)fecha.minute();break;
}
case 's':
if(fecha.second() <10) {
return ('0'+(String)fecha.second()); break;
} else {
return (String)fecha.second();break;
}
case 'd':
if(fecha.day() <10) {
return ('0'+(String)fecha.day()); break;
} else {
return (String)fecha.day();break;
}
case 'n':
if(fecha.month() <10) {
return ('0'+(String)fecha.month()); break;
} else {
return (String)fecha.month();break;
}
case 'a':
if(fecha.year() <10) {
return ('0'+(String)fecha.year()); break;
} else {
return (String)fecha.year();break;
}
}
}
// Enviar hora y fecha por puerto serie
void printFecha() {
Serial.print(getHora('d'));
Serial.print("/");
Serial.print(getHora('n'));
Serial.print("/");
Serial.print(getHora('a'));
Serial.print(" ");
Serial.print(getHora('h'));
Serial.print(":");
Serial.print(getHora('m'));
Serial.print(":");
Serial.println(getHora('s'));
Serial.println("Día de la semana: ");
Serial.println((String)fecha.dayOfTheWeek());
}