Hola, aunque tengo unos dos años experimentando con Arduino aun soy un novato y me cuesta comprender algunas funciones o palabras reservadas dentro de la plataforma y en los circuitos físicos que funcionan diferentes.
Antes de describir el proyecto permíteme comentarte que el primer problema con el que me enfrento es tratar de comprender porque en terminal el switch case funciona correctamente cortando con su break y porque en el proyecto cargado y alimentado mediante una batery bank el case (por ejemplo, case 'a' que representa la válvula de solenoide del riego 1) seleccionado se repite una y otra vez y solo se detiene dicho case al seleccionar otro case (por ejemplo, case 'b' que representa la válvula de solenoide del riego 1), pero continua ese último repitiendo el tiempo asignado de manera constante.
Debo mencionar también que antes de conocer la función millis() intente utilizar un retraso con delya, ya que en otro tipo de proyectos similares en los que un caso es asignado al encendido y otro al apagado funcionan sin complicaciones (en este proyecto no debo usar encendido y apagado si no que pueda apagarse solo al concluir el tiempo asignado).
En proyecto es el siguiente, es un sistema de riego de tres niveles, controlados por una válvula de solenoide en cada nivel, activado por una aplicación instalada en un smartphone que envía una señal para activar el nivel 1 (case 'a'), nivel 2 (case 'b') y nivel 3 (case 'c') , estos deben estar abiertos el tiempo asignado por la función millis(), dicha función está siendo controlada por un ciclo if else comparando valores para asignar la activación de cada caso, el código en principio funciona ya que al correrlo con la placa Arduino conectada a la pc y haciendo uso del terminal Arduino obedece en cada caso la activación. pero como ya lo he mencionado el circuito de manera independiente no se detiene al entrar al caso seleccionado. supongo (si es que es el caso) que dentro de terminal no está activa el loop en todo momento y fuera de ella sí y por tal razón se repite.
Así que el reto es:
¿Como lograr que cada caso se detenga al terminar el tiempo asignado?
paso código:
unsigned long periodoEncendido=10000;
unsigned long periodoApagado=0;
unsigned long TiempoAhora=0;
int RIEGO1 = 2;
int RIEGO2 = 3;
int RIEGO3 = 4;
int estadoBluetooth = 0;
int estadoMotor =LOW;
void imprime_tiempo(unsigned long tiempo_millis);
void setup(){
Serial.begin(9600);
pinMode(RIEGO1, OUTPUT);
pinMode(RIEGO2, OUTPUT);
pinMode(RIEGO3, OUTPUT);
}
void loop(){
bool bucle=true;
if( Serial.available()>0) //condicional que verifica que el bluetooth esta disponible
{
estadoBluetooth = Serial.read(); //cambia es estado de apagado a encendido y pone atencion a las intrucciones que se le envien
}
switch(estadoBluetooth) // inicio de opciones de encendido y apagado
{
case'a':
Serial.println("");
Serial.println("...Inicio Riego1...");
imprime_tiempo(millis);
Serial.println("Milisegundos");
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora");
imprime_tiempo(periodoEncendido);
Serial.println("Segundos Asignados a periodoEncendido");
imprime_tiempo(periodoApagado);
Serial.println("Segundos Asignados a periodoApagado");
Serial.println("");
Serial.println("la operacion para asignar los segundos es: ");
Serial.println("(millis()- TiempoAhora) >= periodoApagado)");
Serial.println("TiempoAhora=millis()");
Serial.println("");
while(bucle == true){
if( estadoMotor ==LOW )
{
if( (millis()- TiempoAhora) >= periodoApagado){//resta los millisegundos que cuenta contra la latencia del microprocesador menos 0 y el resultado lo compara con el tiempo que se le desigan como pausa
imprime_tiempo(millis);
Serial.println("Milisegundos al empezar en 'if' periodoApagado de riego1");
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora antes de correr en 'if' periodoApagado de riego1");
imprime_tiempo(periodoApagado);
Serial.println("asigando en 'if' a periodoApagado de riego1");
estadoMotor = HIGH;// cambia el estado del motor
digitalWrite(RIEGO1,HIGH);//enciende el motor
TiempoAhora=millis();// asigna los milisengos en ese momento al la variable tiempo ahora
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora al correr en 'if' periodoApagado de riego1");
}
}
else
{
if( (millis()- TiempoAhora) >= periodoEncendido){ //resta los millisegundos que cuenta contra la latencia del microprocesador menos 0 y el resultado lo compara con el tiempo que se le desigan como encendido
imprime_tiempo(millis);
Serial.println("Milisegundos al empezar en 'else' periodoEncendido de riego1");
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora antes de correr en 'else' periodoEncendido de riego1");
imprime_tiempo(periodoEncendido);
Serial.println("asigando en 'else' a periodoEncendido de riego1");
estadoMotor =LOW;//cambia el estado del motor
digitalWrite(RIEGO1,LOW);//apaga el motor
TiempoAhora=millis();// asigna los milisengos en ese momento al la variable tiempo ahora
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora al correr en 'else' periodoEncendido de riego1");
bucle = false;//cambia el estado del bucle while
}
}
}
break;
case'b':
Serial.println("");
Serial.println("...Inicio Riego2...");
imprime_tiempo(millis);
Serial.println("Milisegundos");
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora");
imprime_tiempo(periodoEncendido);
Serial.println("Segundos Asignados a periodoEncendido");
imprime_tiempo(periodoApagado);
Serial.println("Segundos Asignados a periodoApagado");
Serial.println("");
Serial.println("la operacion para asignar los segundos es: ");
Serial.println("(millis()- TiempoAhora) >= periodoApagado)");
Serial.println("TiempoAhora=millis()");
Serial.println("");
while(bucle == true){
if( estadoMotor ==LOW )
{
if( (millis()- TiempoAhora) >= periodoApagado){//resta los millisegundos que cuenta contra la latencia del microprocesador menos 0 y el resultado lo compara con el tiempo que se le desigan como pausa
imprime_tiempo(millis);
Serial.println("Milisegundos al empezar en 'if' periodoApagado de riego2");
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora antes de correr en 'if' periodoApagado de riego2");
imprime_tiempo(periodoApagado);
Serial.println("asigando en 'if' a periodoApagado de riego2");
estadoMotor = HIGH;// cambia el estado del motor
digitalWrite(RIEGO2,HIGH);//enciende el motor
TiempoAhora=millis();// asigna los milisengos en ese momento al la variable tiempo ahora
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora al correr en 'if' periodoApagado de riego2");
}
}
else
{
if( (millis()- TiempoAhora) >= periodoEncendido){ //resta los millisegundos que cuenta contra la latencia del microprocesador menos 0 y el resultado lo compara con el tiempo que se le desigan como encendido
imprime_tiempo(millis);
Serial.println("Milisegundos al empezar en 'else' periodoEncendido de riego2");
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora antes de correr en 'else' periodoEncendido de riego2");
imprime_tiempo(periodoEncendido);
Serial.println("asigando en 'else' a periodoEncendido de riego2");
estadoMotor =LOW;//cambia el estado del motor
digitalWrite(RIEGO2,LOW);//apaga el motor
TiempoAhora=millis();// asigna los milisengos en ese momento al la variable tiempo ahora
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora al correr en 'else' periodoEncendido de riego2");
bucle = false;//cambia el estado del bucle while
}
}
}
break;
case'c':
Serial.println("");
Serial.println("...Inicio Riego3...");
imprime_tiempo(millis);
Serial.println("Milisegundos");
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora");
imprime_tiempo(periodoEncendido);
Serial.println("Segundos Asignados a periodoEncendido");
imprime_tiempo(periodoApagado);
Serial.println("Segundos Asignados a periodoApagado");
Serial.println("");
Serial.println("la operacion para asignar los segundos es: ");
Serial.println("(millis()- TiempoAhora) >= periodoApagado)");
Serial.println("TiempoAhora=millis()");
Serial.println("");
while(bucle == true){
if( estadoMotor ==LOW )
{
if( (millis()- TiempoAhora) >= periodoApagado){//resta los millisegundos que cuenta contra la latencia del microprocesador menos 0 y el resultado lo compara con el tiempo que se le desigan como pausa
imprime_tiempo(millis);
Serial.println("Milisegundos al empezar en 'if' periodoApagado de riego3");
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora antes de correr en 'if' periodoApagado de riego3");
imprime_tiempo(periodoApagado);
Serial.println("asigando en 'if' a periodoApagado de riego3");
estadoMotor = HIGH;// cambia el estado del motor
digitalWrite(RIEGO3,HIGH);//enciende el motor
TiempoAhora=millis();// asigna los milisengos en ese momento al la variable tiempo ahora
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora al correr en 'if' periodoApagado de riego3");
}
}
else
{
if( (millis()- TiempoAhora) >= periodoEncendido){ //resta los millisegundos que cuenta contra la latencia del microprocesador menos 0 y el resultado lo compara con el tiempo que se le desigan como encendido
imprime_tiempo(millis);
Serial.println("Milisegundos al empezar en 'else' periodoEncendido de riego3");
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora antes de correr en 'else' periodoEncendido de riego3");
imprime_tiempo(periodoEncendido);
Serial.println("asigando en 'else' a periodoEncendido de riego3");
estadoMotor =LOW;//cambia el estado del motor
digitalWrite(RIEGO3,LOW);//apaga el motor
TiempoAhora=millis();// asigna los milisengos en ese momento al la variable tiempo ahora
imprime_tiempo(TiempoAhora);
Serial.println("TiempoAhora al correr en 'else' periodoEncendido de riego3");
bucle = false;//cambia el estado del bucle while
}
}
}
break;
}
}
void imprime_tiempo(unsigned long tiempo_millis){ //imprimir texto
Serial.print("Tiempo: ");
Serial.print(tiempo_millis/1000);
Serial.print("s - ");
}
Les agradecere mucho su ayuda para mejorara este proyecto.