diff --git a/caldera_rata/caldera_rata.ino b/caldera_rata/caldera_rata.ino index dc561ea..020df53 100644 --- a/caldera_rata/caldera_rata.ino +++ b/caldera_rata/caldera_rata.ino @@ -15,7 +15,7 @@ Servo myservo_X; RTC_DS3231 reloj; volatile DateTime fecha; -unsigned long intervalo_loop=5000; +unsigned long intervalo_loop=2500; unsigned long previoMillisTermo=0; unsigned long previoMillisLoop=0; unsigned long actualMillis; @@ -27,47 +27,170 @@ byte posON1; byte posON2; byte posOFF1; byte posOFF2; +byte posTEMP; byte cont; bool estado_termo; bool espera; +bool espera_man; bool start; +byte manual; +byte estado; +byte hr, mn, sg, di, me; +int an; void setup() { Serial.begin(9600); myservo_X.attach(9); reloj.begin(); - //setVarControl(); // Provisorio, a dividir segun control horario, posiciones. futuras vars + estado=1; estado_termo=0; - variablesControl(); start=1; - ajustaReloj(2021, 7, 8, 4, 59, 50); + //ajustaReloj(2021, 7, 8, 4, 59, 50); //reloj.adjust(DateTime(__DATE__, __TIME__)); } void loop() { if(start) { myservo_X.write(30); - start=0; fecha=reloj.now(); + cargarVarsControl(); + start=0; } actualMillis = millis(); if ((unsigned long)(actualMillis - previoMillisLoop) >= intervalo_loop) { printFecha(); printVars(); fecha = reloj.now(); - if((((fecha.hour() >= horaON1) && (fecha.hour() < horaOFF1)) || - ((fecha.hour() >= horaON2) && (fecha.hour() < horaOFF2))) && (estado_termo==0)) { - termoACC(posON1, posON2); - Serial.println("TERMO ON"); - } else if((((fecha.hour() < horaON1) || (fecha.hour() >= horaOFF1)) && - ((fecha.hour() < horaON2) || (fecha.hour() >= horaOFF2))) && (estado_termo==1)) { - termoACC(posOFF1, posOFF2); - Serial.println("TERMO OFF"); + switch(estado) { + case 1: + Serial.println(estado); + if((((fecha.hour() >= horaON1) && (fecha.hour() < horaOFF1)) || + ((fecha.hour() >= horaON2) && (fecha.hour() < horaOFF2))) && (estado_termo==0)) { + termoACC(posON1, posON2); + Serial.println("TERMO ON"); + } 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(); } } +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) { myservo_X.write(pos1); espera=0; @@ -95,27 +218,57 @@ void termoACC(byte pos1, byte pos2) { estado_termo=!estado_termo; } -// provisorio, case config para hora, horas o dias, posiciones, etc. -void setVarControl() { - //horaON1 = 5; - //horaOFF1 = 7; - //horaON2 = 16; - //horaOFF2 = 18; - //posON1 = 120; - //posON2 = 110; - //posOFF1 = 45; - //posOFF2 = 62; - //EEPROM.put(dirHoraON1, horaON1); - //EEPROM.put(dirHoraOFF1, horaOFF1); - //EEPROM.put(dirHoraON2, horaON2); - //EEPROM.put(dirHoraOFF2, horaOFF2); - //EEPROM.put(dirPosON1,posON1); - //EEPROM.put(dirPosON2, posON2); - //EEPROM.put(dirPosOFF1, posOFF1); - //EEPROM.put(dirPosOFF2, posOFF2); +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"); + } } -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); horaOFF1 = EEPROM.read(dirHoraOFF1); horaON2 = EEPROM.read(dirHoraON2); @@ -124,13 +277,21 @@ void variablesControl() { 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 ) { - DateTime dt(ano, mes, dia, hra, mins, segs); - reloj.adjust(dt); + 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); + 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 diff --git a/caldera_rata_deb/caldera_rata_deb.ino b/caldera_rata_deb/caldera_rata_deb.ino index 75a0547..020df53 100644 --- a/caldera_rata_deb/caldera_rata_deb.ino +++ b/caldera_rata_deb/caldera_rata_deb.ino @@ -45,7 +45,7 @@ void setup() { estado=1; estado_termo=0; start=1; - ajustaReloj(2021, 7, 8, 4, 59, 50); + //ajustaReloj(2021, 7, 8, 4, 59, 50); //reloj.adjust(DateTime(__DATE__, __TIME__)); } @@ -77,27 +77,18 @@ void loop() { break; case 2: // ajustaReloj - //validar - ajustaReloj(an, me, di, hr, mn, sg); + setVarsEP(); estado = 1; break; case 3: // ajuste horas de funcionamiento - // validar - EEPROM.put(dirHoraON1, horaON1); - EEPROM.put(dirHoraOFF1, horaOFF1); - EEPROM.put(dirHoraON2, horaON2); - EEPROM.put(dirHoraOFF2, horaOFF2); + setVarsEP(); cargarVarsControl(); estado = 1; break; case 4: // ajustaPosServo - // validar - EEPROM.put(dirPosON1, posON1); - EEPROM.put(dirPosON2, posON2); - EEPROM.put(dirPosOFF1, posOFF1); - EEPROM.put(dirPosOFF2, posOFF2); + setVarsEP(); cargarVarsControl(); estado = 1; break; @@ -112,12 +103,12 @@ void loop() { } break; case 6: - myservo_X.write(posTEMP); - // funcionamiento 'externo' + if(validaPOS(posTEMP)) { + myservo_X.write(posTEMP); + estado_termo=0; + } // debe reaccionar a los parametros enviados por Serial // movimiento libre, termoACC, ajustaReloj, configs, etc. - //previoMillisLoop = millis(); - estado_termo=0; break; default: estado=1; @@ -147,6 +138,7 @@ void leerDatos() { 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(); @@ -184,20 +176,20 @@ void limpiaSerial() { } } -//como bash: cut d',' -f 0,1,.. file -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]) : ""; -} +//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) { myservo_X.write(pos1); @@ -226,6 +218,55 @@ void termoACC(byte pos1, byte pos2) { 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() { horaON1 = EEPROM.read(dirHoraON1); @@ -239,8 +280,18 @@ void cargarVarsControl() { } void ajustaReloj(int ano, byte mes, byte dia, byte hra, byte mins, byte segs ) { - DateTime dt(ano, mes, dia, hra, mins, segs); - reloj.adjust(dt); + 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); + 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