Ayuda con Programa para automatizar puerta.

Hola: Vuelvo a escribir correctamente un post anterior mal explicado. Necesitaria realizar el siguiente programa:

Se trata de una puerta doble,con dos finales de carrera por puerta,una fotocelula y una entrada del mando.

Entonces por seguridad,mientras esta cerrando y la fotocelula detecta, ha de parar; y si durante la apertura y el cierre se vuelve a pulsar el mando,primero ha de parar y si se vuelve a pulsar realizar la acción contraria a la que estaba realizando (abriendo-para-cerrando).

La cuestion es que me han comentado que una máquina de estados sería lo correcto en este caso. Creo que se refería al tema del Switch control. Me comentaron 4 estados: Abierto-abriendo-cerrado y cerrando. Ejemplo: Void loop() { Switch Case() Case 1(abriendo):¿¿como sabe cual es el estado de los finales de carrera y si se ha pulsado el mando? {digitalWrite(releapertura,HIGH)//Activa relé motor para abrir if (digitalRead(mando)==HIGH) digitalWrite(releapertura,LOW)};//Como le digo a continuación que ejecute el caso cerrando si vuelvo a pulsar el mando?

No consigo entender lo del Switch por el motivo que como sabe el programa en que estado estoy, y si estoy en uno de esos estados como puedo decirle que ejecute otro estado.Me explico: Estoy abriendo y pulso dos veces el mando, cierra y si estoy cerrando y detecta la fotocélula, abre.

Creo que me he explicado fatal pero lo he intentado. Muchas Gracias a cualquier aportación.

Facil Guarda en una variable lo que has hecho:

Si final de carrera = cerrado y comienzo de carrera = abierto -->entonces esta cerrado. Si final de carrera = abierto y comienzo de carrera = cerrado -->entonces esta abierto.

Si final de carrera = abierto y comienzo de carrera = abierto -->entonces puede ser cerrando o abriendo, en este caso, almacenaria una variable de forma que:

pulso para que abra con lo cual variable estado = Abriendo. Si a mitad, pulso de nuevo, Variable de estado = cerrando. Si vuelvo a pulsar sin dejar que termine, variable de estado = abriendo.

Es un flip flop, que antes se hacia con integrado o transistores y hoy en dia, el micro se encarga de ello.

La otra posibilidad seria leer el sentido de rotacion del motor, que si no me equivoco, tendra presente tensiones distintas en algun punto, bien sea en la caja de control electronica o en el propio inversor de giro y podrias detectarlas.

Hola jeke: Muchas gracias por la replica. Soy nuevo en esto y es muy complicado para mi,podrias ponerme un pequeño ejemplo de como almacenar esa variable? y en referéncia al sentido de giro del motor no hay problema,ya que aunque no lo indique por error en el enunciado principal hay dos reles por motor para invertir el giro.

Entiendo que te refieres a que esa variable la tenga en cuenta el switch case en la cabecera o que la almacene en cada función que ejecute...bufff...que lio

Algo asi:

int estado = 0;

if (digitalRead(mando)==HIGH) digitalWrite(releapertura,LOW) if (estado ==1) { estado = 0; } else { estado = 1; } }

hazlo con If y cada estado un número

estado =0 --> estado de inicio. posibles estados el numero de ellos 4 de 1 a 4. estado =1 --> cerrado estado=2 --> abriendo estado=3 --> abriendo estado=4 --> cerrando

cuando arranca tienes que ver el estado de los sensores y que vaya al estado que tu quieras. si esta a medio recorrido que primero se abra por ejemplo y luego pasado un tiempo se cierre. esto lo haces el el setup antes de entrar al loop estao debe valer algo distinto de 0 para que funcione,

en el loop ...

if estado==1) //si está cerrado { if(botonmando=1) // si se presiona el boton del mando (pon el pin que utilices) { estado=2; // pasa de estado cerrado a abriendo } }

y así con lo demás

leugo las salidas asociadas a los estados

if (estado==1){ / si esta enciende led de cerrado } si esta abriendo enciende motor tal si esta cerrando enciendo motor cual..

asi igual con todos los condicionantes

heke, algo has puesto mal por hay en el codigo revisalo , solo cambia de 1 a 0 y 0 a 1 continuamente.

un saludo

y morenitop, no está bien que borres post en los que la gente se ha molestado en contestarte, o sigues el hilo o vuelves a preguntar pero borrar post no está bien. los foros estan para aprender y compartir informacion y experiencias. Si borras post no dejas que los demas aprendan ...

un saludo

Tiene razon SrDonGato, no se deben de borrar, un vistazo a los consejos de http://arduino.cc/playground/Es/Consejos es lo mejor.

Respecto al codigo que puse es solo una orientacion, y justo eso es lo que debia de hacer, me explico:

int estado = 0; // Aqui se define estado globalmente y el valor de 0=cerrrando y 1=abriendo

if (digitalRead(mando)==HIGH) // si le da a abrir puerta
digitalWrite(releapertura,LOW) // entonces le da al rele de apertura (que le faltaria darle un pulso y no siempre)
if (estado ==1) { // tambien comprueba si estaba abriendo (recuerda 1=abriendo)
estado = 0; // y si es asi, como el motor se va a invertir, o sea va a cerrar, el estado lo pongo a 0
} // o sea 0=cerrando
else { // si resulta que era al reves, o sea, 0=cerrando, entonces como cambia el sentido de giro a abrir
estado = 1; // pues estado pasa a valer 1, que es abriendo
}
}

Conclusion, era mostrarle al compañero la forma de poner una variable para decirle en que estado estaba independientemente que pulsara a mitad de camino
1, 2 o 20000 veces el mando.

Lo mejor, como ha dicho que tiene reles independientes, comprobar el estado de estos en entradas y asi sabe el giro.

Pero bueno, no queria ponerle todo el codigo, solo orientarlo en el problema principal porque si le haces el programa no aprende

Es como lo de darle los peces o la caña…

Un saludo

PD: lo que si me ha faltado es el corchete, y el punto y coma, que se ve lo he comido, seria asi:

int estado = 0;

if (digitalRead(mando)==HIGH) { ← este corchete no lo habia escrito aunque es obvio
digitalWrite(releapertura,LOW) ; ← este punto y coma tampoco, pero tambien es obvio.
if (estado ==1) {
estado = 0;
}
else {
estado = 1;
}
}

Si te resulta demasiado complicado vete haciéndolo poco a poco. Si la programación es demasiado complicada empieza con cosas más simples y irás aprendiendo. Para hacer programas en C la única manera es prueba y error, así hemos aprendido todos. Salu2