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.
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
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.
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.
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