Hola, muchas gracias por tomarse el tiempo en atender a la presente, Resumen de lo deseado:
Necesito hacer un reloj con Arduino, en el cual ingresare 6 rangos de horarios, cada rango de horario tiene 6 variables:
Hon = Hora de inicio de ciclo
Mon = Minuto de inicio de ciclo
Hoff = Hora de apagado de ciclo
Moff = Minuto de apagado de ciclo
Ton = PEriodo durante el ciclo en el que se activan 2 relays conectados a los pines 4 y 5
Toff = Periodo durante el cuclo en el que se apagan los 2 relays mencionados.
Se desea ingresar los valores usando Softwareserial (2,3), el puerto serie de Arduino lo dejo libre para ver el comportamiento del sketch durante las ejecuciones.
Para aislar el problema realice lo siguiente, Al ingresar por BT (Bluetooh) solo 1 caracter desde A hasta F (Ciclo 1 hasta 6 respectivamente), el Sketch se ejecuta a la perfeccion.
Pero cuando ingreso las variables mencionadas (Hon,Mon, Hoff, etc…) mediante un String separado por comas y con un comando finalización por ejemlplo:
Rango inicia 11h00 hasta 14h00 Ton= 14seg y Toff = 2 min el String sería de la siguiente manera:
String enviado por BT 11,00,14,00,14,2, este String lo valido matematicamente, que sean ENTEROS, y depues lo almaceno en una dirección de EEPROM, para posteriormente leerlos y almacenarlos en un String de ejecución llamado VECTOR_RELAY, en este caso, todo funciona bien, PEEEROOO!!! despues de intentar ingresar varias veces un rango en la misma posición el SKETCH se inhibe!!
Que realice? Investigue y he liberado la memoria del Arduino UNO lo mas que puedo, actualmente mi sktch esta a un 63% y la memoria está a un 55%, de lo cual no esta nada mal… Adicional he investigado el metodo de ingresar cadenas por String, y cuando prueba la técnica SOLITA sin nada mas de código funciona a la perfección, por tanto no creo que sea la forma de leer el String… sin embargo… SOSPECHO que la info guardada en la EEPROM a veces… y eso es lo que no se como validar, la información se almacena con DATOS BASURA, que al leerlos y guardarlos en el VECTOR_RELAY causa que el sketch colapse porque no estaría leyendo NUMEROS, sino cualquier información que se pudiera haber almacenado… Adjunto mi código que uso en el simulador PROTEUS.
COmo dato adicional, para simularlo en PROTEUS, al puerto serial 2,3 del bluetooh, lo uso para visualizar el comportamiento de las variables durante su ejecución, y el puerto natural de arduino (0,1), lo uso como metodo de INGRESO, de esta manera simulo que por un lado ingreso información y por otro lado veo el comportamiento.
Funcion de lectura de String:
String convertirHora(byte orden)
{
int count =0;
char caracter ="";
reiniciar_vector(ciclo_actual01);
delay(30); //caracter != '\n')
while(count<6)
{
if (Serial.available()) //caracteres especiales > o < 1,2,3,4,5,6 11,22,33,44,55,66'\n'
{
caracter = Serial.read();
if(caracter != ',' && caracter != '\n')
{
if(caracter>='0' && caracter <='9')
{ciclo_actual01[orden][count]+=caracter;}
}
else{
if(ciclo_actual01[orden][count].length()==1)
if(ciclo_actual01[orden][count].toInt()>=0 && ciclo_actual01[orden][count].toInt() <=9){ciclo_actual01[orden][count] ='0'+ciclo_actual01[orden][count];}
else {
if(ciclo_actual01[orden][count].toInt()>=10 && ciclo_actual01[orden][count].toInt() <=60)ciclo_actual01[orden][count]=ciclo_actual01[orden][count];
}
count++;}
}
}
for (int h=0;h<6;h++)
{
blue.print(F("Valor almacenado: "));
blue.println(ciclo_actual01[0][h]);
}
}
Función de captación de la variable para inciar proceso de lectura de String:
void loop() {
if (Serial.available()) //Si el puerto serie (Bluetooth) está disponible
{
valor = Serial.read(); //Lee el dato entrante via Bluetooth
}
//CICLO 01 ESTA ES LA FUNCION QUE HACE QUE EL SKETCH COLAPSE
if (valor == 'A'){ convertirHora(0);
ciclo=0;eeAddress=0; EEPROM.update(301,1); while (!EEPROM.isReady()) {delay(1);}
blue.println(F("Valor A ingresado"));
}
//CICLO 02 - CUANDO INGRESO LOS VALORES MANUALMENTE DESDE EL SKETCH, COMO EN ESTE EJEMPLO, EL SKETCH
// tRABAJA SIN NINGUN PROBLEMA
if (valor == 'B'){
reiniciar_vector(ciclo_actual01);
ciclo_actual01[0][0]= "12";
ciclo_actual01[0][1]= "30";
ciclo_actual01[0][2]= "12";
ciclo_actual01[0][3]= "45";
ciclo_actual01[0][4]= "12";
ciclo_actual01[0][5]= "01";
ciclo=0;eeAddress=0; EEPROM.update(301,1); while (!EEPROM.isReady()) {delay(1);}}
//CICLO 03
//CICLO 04
//CICLO 05 ... ETC AQUI VAN OTROS PROCESOS QUE POR EL MOMENTO CONSIDERO INNECESARIOS PARA EXPRESAR MI PROBLEMA.
}
y Finalmente el proceso de validación y lectura de EEPROM que realizo:
if(grabar)
{
//aqui van funciones para validar que los datos numericos estan correctos,si todo esta bien pasa a lo siguiemte:
blue.println(F("Valores de Ciclo Correcto - Proceso de Grabacion"));
for(int k1=0;k1 <6 ;k1++)
{
if(ciclo_actual01[ciclo][k1] != vector_relay[ciclo][k1])
{
EEPROM.updateInt(eeAddress,ciclo_actual01[ciclo][k1].toInt()); //poner PUr Update de la nueva libreria de EEPROM
while (!EEPROM.isReady()) {delay(1);}
}
eeAddress += sizeof(int);
}
EEPROM.update(300,1);// posicion para validar que existió una grabación START
while (!EEPROM.isReady()) {delay(1);}
if(ciclo==0) eeAddress = 0;
if(ciclo==1) eeAddress = 12;
if(ciclo==2) eeAddress = 24;
if(ciclo==3) eeAddress = 36;
if(ciclo==4) eeAddress = 48;
if(ciclo==5) eeAddress = 60;
for(int k1=0; k1<6; k1++)
{
if(ciclo_actual01[ciclo][k1].toInt() != EEPROM.readInt(eeAddress)){error++;}
eeAddress += sizeof(int);
}
if(error!=0){ blue.println(F("Grabacion Incorrecta"));
}
else
{
error=0;
blue.println(F("Grabacion Ok"));
//hacer sonar un buzzer
eeAddress =0;
for (int h=0;h<6;h++)
{
blue.print(F("Valor almacenado EN GRABAR: "));
blue.println(ciclo_actual01[0][h]);
blue.print(F("Valor almacenado EN EEPROM GRABAR: "));
blue.println(EEPROM.readInt(eeAddress));
eeAddress += sizeof(int);
}
}
}
He decidido eliminar los adjuntos, porque he visto que se descargan pero no comentan nada al respecto.