Hola.
Ya conseguí que el circuito y el código funcionara como busco para la versión de 12v, y si bien funciona también con 14v, voy a probar con un LM317 (fue lo más parecido a la indicación de Tauro que conseguí) para evitar el recalentamiento que se genera.
Publico el programa y el esquema principalente a modo de referencia (tal vez le sea útil a alguien más), sin embargo, debo explicar que hice que el timer se ajustara por el tiempo de encendido del optoacoplador, pero en otros casos puede ser distinto.
Este es el código:
/* Programa de control de torniquete
Desarrollado por Yohann Hernández
Con el apoyo de tauro0221 y Surbyte (forum.arduino.cc)
Abril de 2018 */
//***************************************************
int timer = 10000; //Timer predefinido
byte pulsador, opto;
//****************************************************
void setup()
{
pinMode(6, INPUT);
pinMode(13, OUTPUT);
pinMode(5, INPUT);
pinMode(4, INPUT);
Serial.begin(9600);
}
//****************************************************
void loop()
{
int x = timer / 1000; //Convierte el timer en segundos
Serial.println(String("El temporizador actual es: ") + x + String(" Segundos"));
Serial.println("Comprobando computador y pulsador...");
pulsador = digitalRead(6); //Lee el pulsador
Serial.println(String("Pulsador: ") + pulsador);
opto = digitalRead(4); //Lee el optoacoplador
Serial.println(String("Computador: ") + opto);
delay(50);
Serial.flush(); //Vacía el bufer de puerto serie
if (opto == HIGH) //El optoacoplador se activa segun tiempo definido en programa
{
Serial.println("Computador activado \nModo activación + ajuste temporizador");
timer = 0; //Pone a 0 el timer para ajustarlo
Serial.println("Temporizador puesto a 0");
timer = encender(0); //Activar torniquete y ajustar timer
}
else if (pulsador == HIGH) //El pulsador no depende de tiempo (1 toque)
{
Serial.println("Pulsador Activado \nModo Solo apertura");
Serial.println(String("Temporizador predefinido:") + timer);
encender(timer); //Activar torniquete segun timer predefinido/ajustado
}
digitalWrite(13, LOW); // Apaga el mosfet
delay(500); // Espera 1/2 segundo
Serial.println("Torniquete Desactivado");
Serial.flush(); //Vacía el bufer de puerto serie
}
//*****************************************************
int encender(int tiempo) //Activar torniquete
//tiempo: Timer temporal
{
byte iman = 0, com = 1; //Inicializa variables de concicional
int x = 0; //Inicializa timer de ciclo
while (iman == 0 && x <= tiempo){
digitalWrite(13, HIGH); //Activa el mosfet
Serial.println(String("Tiempo abierto: ") + x);
if (timer == 0) //Ajuste de timer si está en 0 (Activacion por opto)
{
Serial.println("Ajustando tiempo...");
com = digitalRead(4); //Lee el optoacoplador
Serial.println(String("Computador: ") + com);
tiempo += 100; //Modifica el temporizador
Serial.println(String("Tiempo: ") + tiempo);
if (com == 0) //Apaga el mosfet si el opto se apaga
{
Serial.println("Computador Desactivado");
break;
}
}
iman = digitalRead(5); //Lee el sensor de iman
Serial.println(String("Sensor Iman: ") + iman);
delay(100);
x += 100;
};
if (tiempo != timer) //Si se modificó el timer, muestre el nuevo
{
float x = tiempo / 1000; //Convierte en nuevo timer a segundos
Serial.println(String("El nuevo temporizador es: ") + x + String(" Segundos"));
}
return tiempo; //Retorna el timer modificado
}
//*****************************************************
Y la imagen (Ya tengo todos los pines en las posiciones de la imagen, incluyendo LPT):
