[Solucionado] Problema con relés y bluetooth

Muy buenas.

Estoy haciendo un proyecto en el que manejo un motor con 3 relés y un módulo bluetooth, al cual le trasmito datos desde un movil android.

Todo funciona a la perfección excepto una cosa bastante importante:

Cuando desconecto el arduino de la corriente y lo vuelvo a conectar, los relés se activan solos como si los hubiera activado manualmente.

Tengo un Switch-case donde contemplo las diferentes órdenes que se le envían al arduino desde un movil vía bluetooth y es como si pasara al primer "case" directamente.

Alguna solución?

Si hace falta puedo pegar el código.

Gracias de antemano :slight_smile:

Buenas compañero.
Claro que siempre es muy necesario que agregues el código y una descripción de tal, para poder ayudarte.
que arduino utilizas? saludos

Utilizo un Arduino UNO con un modulo Bluetooth

El circuito que uso es el siguiente:

Debo controlar un motor de 24V, para ello usé 3 relés SPDT, uno para ON/OFF y los otros dos para regular el giro (no encontré ningún relé DPDT que me sirviera). Para gobernar los relés uso un transistor y un LED que me indica si el relé está activo.
Ahora mismo no puedo colgar el circuito, en cuanto pueda lo subo.

El código es el siguiente:

int fca; 
int fcc; 
int pulsador;

void setup()
{
   Serial.begin(9600);  //LECTURA BLUETOOTH
   pinMode(5, OUTPUT); //ON-OFF
   pinMode(7, OUTPUT); //GIRO
   pinMode(10, INPUT); //Final de carrera 1
   pinMode(11, INPUT); //Final de carrera 2
   pinMode(12, INPUT); //Pulsador
  
}

void loop() {
   byte dato;
   
   if(Serial.available()>0)
   {
     dato=Serial.read();
       switch(dato) 
       {        
        case 116: {    //ABRIR
             
                if(digitalRead(10)==LOW)
                {    
                fca=digitalRead(10);  // leemos el valor del final de carrera
                 pulsador=digitalRead(12);
                 Serial.println("ABRIENDO\n\n");
                 while(fca==LOW && pulsador==LOW) 
                 { 
                 digitalWrite(7,HIGH);  //GIRO
                 digitalWrite(5, HIGH); //Abrimos
                 fca=digitalRead(10); //Y leemos el valor del final de carrera
                 pulsador=digitalRead(12);
                 }  //Fin while  
                 digitalWrite(5,LOW); //Paramos motor
                 Serial.println("ABIERTO\n\n");
                }
                else 
                Serial.println("YA ESTA ABIERTO\n\n");
                  break;
       } // fin case
       
       pulsador=LOW;
          case 122: { //CERRAR
         
       if(digitalRead(11)==LOW)
       { 
           fcc=digitalRead(11);
           pulsador=digitalRead(12);
           Serial.println("CERRANDO\n\n");
           while(fcc==LOW && pulsador==LOW)
           {
             digitalWrite(7,LOW);
             digitalWrite(5,HIGH);
             fcc=digitalRead(11);
             pulsador=digitalRead(12);
           }
           digitalWrite(5,LOW); //Paramos motor
           Serial.println("CERRADO\n\n");
       }
       else
        Serial.println("YA ESTA CERRADO\n\n");
        break;
       }   
       
} //fin switch
   } //fin if

   }

Si se desconecta el arduino y se vuelve a conectar se activan solos los relés, como si se hubiera mandado por bluetooth el código 116. Si se presiona el final de carrera "fca" todo funciona como es debido.

podria explicar mejor que quieres hacer exactamente, es decir, no se exactamente para que usas el bluetooht, si he entendido bien el programa, para poder abrir la puerta es necesario, tener activado la orden por bluetooht ademas de pulsar un boton fisico y tener en posicion correcta el final de carrera.

Casi casi.

El código es para controlar una puerta.

Dispongo de dos finales de carrera, uno que se activa cuando la puerta está completamente abierta y otro cuando está completamente cerrada.

Pretendo controlar la apertura/cierre vía Bluetooth desde un movil Androidy la app BlueTerm, y el proceso sería el siguiente:

  • Si desde el móvil escribo una "t" (116) y el final de carrera "fca" está desactivado, la puerta se abre mientras no active un pulsador físico (pulsador de emergencia).
  • Si escribo una "t" y "fca" está activado, quiere decir que la puerta está abierta y manda al móvil el mensaje "YA ESTA ABIERTO"
  • Si escribo una "z" y el final de carrera "fcc" está desactivado, la puerta se abre mientras no active el pulsador físico de emergencia.
  • Por otro lado, si escribo una "z" y el final de carrera está activado, quiere decir que la puerta ya está cerrada y manda al móvil el mensaje "YA ESTA CERRADO"

Todo funciona y cumple con su cometido. Seguro que el código se puede optimizar y no he usado las funciones adecuadas, pero funciona.

El problema es que cuando desconecto el Arduino UNO de la corriente eléctrica, al volver a conectarlo la puerta empieza a abrirse sola, como si hubiera pulsado una "t" en el móvil.

En el setup tienes que establecer el valor por defecto de las salidas. El problema es que no indicas qué hacer con ellas al arrancar y Arduino por lo visto te pone ambas en high. Creo que directamente podrías poner ambas en LOW y debería funcionar.
Saludos.

creo que podrias evitar el problema nombrando una nueva variable llamada "estadopulsador" est la podrias al inicio del programa de la siguiente forma:
estadopulsador= digitalRead(pulsador);
y despues sustituir la variable pulsador de los if y los while por la variable "estadopulsador" y tambien lo haria lo mismo con los finales de carrera, no se si me explico bien.

creo que me explicado mal lo que se conseguiria creando las nuevas variables seria hacer que el programa al iniciarse leiera las entradas del arduino.

int fca;
int fcc;
int pulsador;
int estadopulsador;
int estadofca;
int estadofcc;

void setup()
{
Serial.begin(9600); //LECTURA BLUETOOTH
pinMode(5, OUTPUT); //ON-OFF
pinMode(7, OUTPUT); //GIRO
pinMode(10, INPUT); //Final de carrera 1
pinMode(11, INPUT); //Final de carrera 2
pinMode(12, INPUT); //Pulsador

}

void loop() {
byte dato;
estadopulsador=pulsador;
estadofca=fca;
estadofcc=fcc;

if(Serial.available()>0)
{
dato=Serial.read();
switch(dato)
{
case 116: { //ABRIR

if(estadofca==LOW)
{
Serial.println("ABRIENDO\n\n");
while(estadofca==LOW && estadopulsador==LOW)
{
digitalWrite(7,HIGH); //GIRO
digitalWrite(5, HIGH); //Abrimos

} //Fin while
digitalWrite(5,LOW); //Paramos motor
Serial.println("ABIERTO\n\n");
}
else
Serial.println("YA ESTA ABIERTO\n\n");
break;
} // fin case

case 122: { //CERRAR

if(estadofcc==LOW)
{
Serial.println("CERRANDO\n\n");
while(estadofcc==LOW && estadopulsador==LOW)
{
digitalWrite(7,LOW);
digitalWrite(5,HIGH);
}
digitalWrite(5,LOW); //Paramos motor
Serial.println("CERRADO\n\n");
}
else
Serial.println("YA ESTA CERRADO\n\n");
break;
}

} //fin switch
} //fin if

}

prueba si funciona, pero esa creo que es la idea para que funcione mas o menos puede que tengas que depurar alguna cosilla, un saludo.

apolo150:
prueba si funciona, pero esa creo que es la idea para que funcione mas o menos puede que tengas que depurar alguna cosilla, un saludo.

Creo que falta algo en el While. Faltaría leer el valor del final de carrera, no?

Prueba a leer las entradas dentro del while, de esa manera te evitas que pueda quedarse el while siempre funcionando un saludo.

apolo150:
Prueba a leer las lecturas de entradas dentro del while, de esa manera te evitas que pueda quedarse el while siempre funcionando un saludo.

Ahora mismo estoy de viaje y no puedo probar. En cuanto llegue lo pruebo y comento :wink:

Ya está solucionado el problema. No era problema de código propiamente dicho, simplemente era que en el "handshake" que hacía el módulo bluetooth con Arduino mandaba justamente los caracteres que yo había puesto en el "switch-case". Los he cambiado por otros y todo funciona a la perfección :wink: