validaciones OK

This commit is contained in:
jp.av.dev 2021-07-09 21:55:06 -04:00
parent 764ea6a6f2
commit d1bfc4b934
2 changed files with 281 additions and 69 deletions

View File

@ -15,7 +15,7 @@ Servo myservo_X;
RTC_DS3231 reloj; RTC_DS3231 reloj;
volatile DateTime fecha; volatile DateTime fecha;
unsigned long intervalo_loop=5000; unsigned long intervalo_loop=2500;
unsigned long previoMillisTermo=0; unsigned long previoMillisTermo=0;
unsigned long previoMillisLoop=0; unsigned long previoMillisLoop=0;
unsigned long actualMillis; unsigned long actualMillis;
@ -27,47 +27,170 @@ byte posON1;
byte posON2; byte posON2;
byte posOFF1; byte posOFF1;
byte posOFF2; byte posOFF2;
byte posTEMP;
byte cont; 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); Serial.begin(9600);
myservo_X.attach(9); myservo_X.attach(9);
reloj.begin(); reloj.begin();
//setVarControl(); // Provisorio, a dividir segun control horario, posiciones. futuras vars estado=1;
estado_termo=0; estado_termo=0;
variablesControl();
start=1; start=1;
ajustaReloj(2021, 7, 8, 4, 59, 50); //ajustaReloj(2021, 7, 8, 4, 59, 50);
//reloj.adjust(DateTime(__DATE__, __TIME__)); //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) {
printFecha(); printFecha();
printVars(); printVars();
fecha = reloj.now(); fecha = reloj.now();
if((((fecha.hour() >= horaON1) && (fecha.hour() < horaOFF1)) || switch(estado) {
((fecha.hour() >= horaON2) && (fecha.hour() < horaOFF2))) && (estado_termo==0)) { case 1:
termoACC(posON1, posON2); Serial.println(estado);
Serial.println("TERMO ON"); if((((fecha.hour() >= horaON1) && (fecha.hour() < horaOFF1)) ||
} else if((((fecha.hour() < horaON1) || (fecha.hour() >= horaOFF1)) && ((fecha.hour() >= horaON2) && (fecha.hour() < horaOFF2))) && (estado_termo==0)) {
((fecha.hour() < horaON2) || (fecha.hour() >= horaOFF2))) && (estado_termo==1)) { termoACC(posON1, posON2);
termoACC(posOFF1, posOFF2); Serial.println("TERMO ON");
Serial.println("TERMO OFF"); } else if((((fecha.hour() < horaON1) || (fecha.hour() >= horaOFF1)) &&
((fecha.hour() < horaON2) || (fecha.hour() >= horaOFF2))) && (estado_termo==1)) {
termoACC(posOFF1, posOFF2);
Serial.println("TERMO OFF");
}
//previoMillisLoop = 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:
if(espera_man) {
if(manual == 1) {
termoACC(posON1, posON2);
} else if (manual == 0){
termoACC(posOFF1, posOFF2);
}
espera_man=0;
}
break;
case 6:
if(validaPOS(posTEMP)) {
myservo_X.write(posTEMP);
estado_termo=0;
}
// debe reaccionar a los parametros enviados por Serial
// movimiento libre, termoACC, ajustaReloj, configs, etc.
break;
default:
estado=1;
} }
leerDatos();
previoMillisLoop = millis(); previoMillisLoop = millis();
} }
} }
void leerDatos() {
if (Serial.available() > 0) {
byte temp_var=0;
temp_var = Serial.readStringUntil(',').toInt();
if(temp_var < 7 && temp_var > 0){
estado = temp_var;
} else {
estado = 1;
}
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();
Serial.print("Datos leidos :"+(String)di+"/"+(String)me+"/"+(String)an+" "+(String)hr+":"+(String)mn+":"+(String)sg);
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();
}
limpiaSerial();
} else {
Serial.println("Nada q hacer");
}
}
void limpiaSerial() {
while(Serial.available() > 0) {
char temp = Serial.read();
}
}
//como bash: cut -d
//String getValue(String data, char separator, int index){
// int found = 0;
// int strIndex[] = { 0, -1 };
// int maxIndex = data.length() - 1;
// for (int i = 0; i <= maxIndex && found <= index; i++) {
// if (data.charAt(i) == separator || i == maxIndex) {
// found++;
// strIndex[0] = strIndex[1] + 1;
// strIndex[1] = (i == maxIndex) ? i+1 : i;
// }
// }
// return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
//}
void termoACC(byte pos1, byte pos2) { void termoACC(byte pos1, byte pos2) {
myservo_X.write(pos1); myservo_X.write(pos1);
espera=0; espera=0;
@ -95,27 +218,57 @@ void termoACC(byte pos1, byte pos2) {
estado_termo=!estado_termo; estado_termo=!estado_termo;
} }
// provisorio, case config para hora, horas o dias, posiciones, etc. void setVarsEP(){
void setVarControl() { switch (estado) {
//horaON1 = 5; case 2:
//horaOFF1 = 7; ajustaReloj(an, me, di, hr, mn, sg);
//horaON2 = 16; break;
//horaOFF2 = 18; case 3:
//posON1 = 120; if(validaHR(horaON1)) {
//posON2 = 110; EEPROM.put(dirHoraON1, horaON1);
//posOFF1 = 45; }
//posOFF2 = 62; if(validaHR(horaOFF1)) {
//EEPROM.put(dirHoraON1, horaON1); EEPROM.put(dirHoraOFF1, horaOFF1);
//EEPROM.put(dirHoraOFF1, horaOFF1); }
//EEPROM.put(dirHoraON2, horaON2); if(validaHR(horaON2) && horaON2 > horaOFF1) {
//EEPROM.put(dirHoraOFF2, horaOFF2); EEPROM.put(dirHoraON2, horaON2);
//EEPROM.put(dirPosON1,posON1); } else if(validaHR(horaON1)) {
//EEPROM.put(dirPosON2, posON2); EEPROM.put(dirHoraON2, horaON1);
//EEPROM.put(dirPosOFF1, posOFF1); } // validacion incompleta
//EEPROM.put(dirPosOFF2, posOFF2); if(validaHR(horaOFF2) && horaOFF2 > horaON2 && horaOFF2 > horaOFF1) {
EEPROM.put(dirHoraOFF2, horaOFF2);
} else if(validaHR(horaOFF1)) {
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;
default:
Serial.print("default setVarsEP");
}
} }
void variablesControl() { bool validaHR(byte hr) {
return (hr < 24 && hr >= 0);
}
bool validaPOS(byte pos) {
return (pos < 165) && (pos >15);
}
void cargarVarsControl() {
horaON1 = EEPROM.read(dirHoraON1); horaON1 = EEPROM.read(dirHoraON1);
horaOFF1 = EEPROM.read(dirHoraOFF1); horaOFF1 = EEPROM.read(dirHoraOFF1);
horaON2 = EEPROM.read(dirHoraON2); horaON2 = EEPROM.read(dirHoraON2);
@ -124,13 +277,21 @@ void variablesControl() {
posON2 = EEPROM.read(dirPosON2); posON2 = EEPROM.read(dirPosON2);
posOFF1 = EEPROM.read(dirPosOFF1); posOFF1 = EEPROM.read(dirPosOFF1);
posOFF2 = EEPROM.read(dirPosOFF2); posOFF2 = EEPROM.read(dirPosOFF2);
} }
void ajustaReloj(int ano, byte mes, byte dia, byte hra, byte mins, byte segs ) { void ajustaReloj(int ano, byte mes, byte dia, byte hra, byte mins, byte segs ) {
DateTime dt(ano, mes, dia, hra, mins, segs); if((ano > 2000) &&
reloj.adjust(dt); (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);
Serial.println("Set RTC: valido");
} else {
Serial.println("Set RTC: invalido");
}
} }
//En caso de ser necesario mostrar hora, este codigo añade un 0 a los valores menores a 10 //En caso de ser necesario mostrar hora, este codigo añade un 0 a los valores menores a 10

View File

@ -45,7 +45,7 @@ void setup() {
estado=1; estado=1;
estado_termo=0; estado_termo=0;
start=1; start=1;
ajustaReloj(2021, 7, 8, 4, 59, 50); //ajustaReloj(2021, 7, 8, 4, 59, 50);
//reloj.adjust(DateTime(__DATE__, __TIME__)); //reloj.adjust(DateTime(__DATE__, __TIME__));
} }
@ -77,27 +77,18 @@ void loop() {
break; break;
case 2: case 2:
// ajustaReloj // ajustaReloj
//validar setVarsEP();
ajustaReloj(an, me, di, hr, mn, sg);
estado = 1; estado = 1;
break; break;
case 3: case 3:
// ajuste horas de funcionamiento // ajuste horas de funcionamiento
// validar setVarsEP();
EEPROM.put(dirHoraON1, horaON1);
EEPROM.put(dirHoraOFF1, horaOFF1);
EEPROM.put(dirHoraON2, horaON2);
EEPROM.put(dirHoraOFF2, horaOFF2);
cargarVarsControl(); cargarVarsControl();
estado = 1; estado = 1;
break; break;
case 4: case 4:
// ajustaPosServo // ajustaPosServo
// validar setVarsEP();
EEPROM.put(dirPosON1, posON1);
EEPROM.put(dirPosON2, posON2);
EEPROM.put(dirPosOFF1, posOFF1);
EEPROM.put(dirPosOFF2, posOFF2);
cargarVarsControl(); cargarVarsControl();
estado = 1; estado = 1;
break; break;
@ -112,12 +103,12 @@ void loop() {
} }
break; break;
case 6: case 6:
myservo_X.write(posTEMP); if(validaPOS(posTEMP)) {
// funcionamiento 'externo' myservo_X.write(posTEMP);
estado_termo=0;
}
// debe reaccionar a los parametros enviados por Serial // debe reaccionar a los parametros enviados por Serial
// movimiento libre, termoACC, ajustaReloj, configs, etc. // movimiento libre, termoACC, ajustaReloj, configs, etc.
//previoMillisLoop = millis();
estado_termo=0;
break; break;
default: default:
estado=1; estado=1;
@ -147,6 +138,7 @@ void leerDatos() {
hr = Serial.readStringUntil(',').toInt(); hr = Serial.readStringUntil(',').toInt();
mn = Serial.readStringUntil(',').toInt(); mn = Serial.readStringUntil(',').toInt();
sg = Serial.readStringUntil(',').toInt(); sg = Serial.readStringUntil(',').toInt();
Serial.print("Datos leidos :"+(String)di+"/"+(String)me+"/"+(String)an+" "+(String)hr+":"+(String)mn+":"+(String)sg);
break; break;
case 3: case 3:
horaON1 = Serial.readStringUntil(',').toInt(); horaON1 = Serial.readStringUntil(',').toInt();
@ -184,20 +176,20 @@ void limpiaSerial() {
} }
} }
//como bash: cut d',' -f 0,1,.. file //como bash: cut -d
String getValue(String data, char separator, int index){ //String getValue(String data, char separator, int index){
int found = 0; // int found = 0;
int strIndex[] = { 0, -1 }; // int strIndex[] = { 0, -1 };
int maxIndex = data.length() - 1; // int maxIndex = data.length() - 1;
for (int i = 0; i <= maxIndex && found <= index; i++) { // for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) { // if (data.charAt(i) == separator || i == maxIndex) {
found++; // found++;
strIndex[0] = strIndex[1] + 1; // strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i+1 : i; // strIndex[1] = (i == maxIndex) ? i+1 : i;
} // }
} // }
return found > index ? data.substring(strIndex[0], strIndex[1]) : ""; // return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
} //}
void termoACC(byte pos1, byte pos2) { void termoACC(byte pos1, byte pos2) {
myservo_X.write(pos1); myservo_X.write(pos1);
@ -226,6 +218,55 @@ void termoACC(byte pos1, byte pos2) {
estado_termo=!estado_termo; 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);
}
if(validaHR(horaOFF1)) {
EEPROM.put(dirHoraOFF1, horaOFF1);
}
if(validaHR(horaON2) && horaON2 > horaOFF1) {
EEPROM.put(dirHoraON2, horaON2);
} else if(validaHR(horaON1)) {
EEPROM.put(dirHoraON2, horaON1);
} // validacion incompleta
if(validaHR(horaOFF2) && horaOFF2 > horaON2 && horaOFF2 > horaOFF1) {
EEPROM.put(dirHoraOFF2, horaOFF2);
} else if(validaHR(horaOFF1)) {
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;
default:
Serial.print("default setVarsEP");
}
}
bool validaHR(byte hr) {
return (hr < 24 && hr >= 0);
}
bool validaPOS(byte pos) {
return (pos < 165) && (pos >15);
}
void cargarVarsControl() { void cargarVarsControl() {
horaON1 = EEPROM.read(dirHoraON1); horaON1 = EEPROM.read(dirHoraON1);
@ -239,8 +280,18 @@ void cargarVarsControl() {
} }
void ajustaReloj(int ano, byte mes, byte dia, byte hra, byte mins, byte segs ) { void ajustaReloj(int ano, byte mes, byte dia, byte hra, byte mins, byte segs ) {
DateTime dt(ano, mes, dia, hra, mins, segs); if((ano > 2000) &&
reloj.adjust(dt); (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);
Serial.println("Set RTC: valido");
} else {
Serial.println("Set RTC: invalido");
}
} }
//En caso de ser necesario mostrar hora, este codigo añade un 0 a los valores menores a 10 //En caso de ser necesario mostrar hora, este codigo añade un 0 a los valores menores a 10