Para este proyecto se parte de la necesidad a solucionar: Controlar con exactitud los tiempos de trabajo y enfriamiento de una máquina termoselladora de bolsas que incorpora el corte automático si se desea.
Para este objetivo se tiene:
Dos entradas digitales para decirle mediante binario qué función va a realizar: 11= CORTE; 10= SELLA; 01= SELLA Y CORTE; 00= NOP.
Una entrada digital para Habilitar secuencia(HIGH) ó Inhabilitar (LOW); SI Inhabilitar dura más de 1 segundo entonces reinicia la secuencia que se esté ejecutando; si es igual o menor a 1 segundo solo la pausa pero puede continuar si cambia a HIGH.
Dos entradas análogas (x, x') mediante potenciómetros a 5V que al leerlas indicarán cúantos segundos están ajustados así: 0V = 0 segundos; 2.5V = 2.5 segundos; 5V = 5 segundos; cualquier otro valor ingresado dará otro equivalente en esta proporción.
TRES salidas digitales: OUT_SELLA, OUT_CORTA Y BUZZER_OUT
Secuencias de trabajo
Al comienzo TODAS LAS SALIDAS EN 0 (LOW). EL micro siempre lee primero las dos entradas digitales binarias para saber la función a realizar. SECUENCIA PARA FUNCIONES A REALIZAR:
1.SELLADO (Leyó 1 - 0) ESPERA QUE HABILITADOR SE PONE HIGH
DELAY (NOP) 1000 mS (MILISEGUNDOS, EDITABLE)
SALIDA DE OUT_SELLA PASA A 1(HIGH)
DELAY mS AJUSTADOS EN ENTRADA ANALOGA X
SALIDA OUT_SELLA PASA A 0 (LOW)
DELAY mS AJUSTADOS EN ENTRADA ANALOGA X
DELAY_FRIO 1000mS (EDITABLE)
SALIDA BUZZER_OUT PASA A 1
delay 250mS
SALIDA BUZZER_OUT PASA A 0
fINAL.
2.CORTE (Leyó 1 - 1) ESPERA QUE HABILITADOR SE PONE HIGH
DELAY (NOP) 1000 mS (MILISEGUNDOS, EDITABLE)
SALIDA DE OUT_CORTE PASA A 1(HIGH)
DELAY mS AJUSTADOS EN ENTRADA ANALOGA X'
SALIDA OUT_CORTE PASA A 0 (LOW)
DELAY mS AJUSTADOS EN ENTRADA ANALOGA X'
DELAY_FRIO 1000mS
SALIDA BUZZER_OUT PASA A 1
delay 250mS
SALIDA BUZZER_OUT PASA A 0
fINAL.
3.SELLADO Y CORTE (Leyó 0 - 1) ESPERA QUE HABILITADOR SE PONE HIGH
DELAY (NOP) 1000 mS (MILISEGUNDOS, EDITABLE)
SALIDA DE OUT_SELLA PASA A 1(HIGH)
DELAY mS AJUSTADOS EN ENTRADA ANALOGA X
SALIDA OUT_SELLA PASA A 0 (LOW)
DELAY mS AJUSTADOS EN ENTRADA ANALOGA X
SALIDA DE OUT_CORTE PASA A 1(HIGH)
DELAY mS AJUSTADOS EN ENTRADA ANALOGA X'
SALIDA OUT_CORTE PASA A 0 (LOW)
DELAY mS AJUSTADOS EN ENTRADA ANALOGA X'
DELAY 1000mS
SALIDA BUZZER_OUT PASA A 1
delay 250mS
SALIDA BUZZER_OUT PASA A 0
fINAL.
4. NOP (LEYÓ 0 - 0)
Código propuesto para utilizar con arduino ProMini
// ==========================
// CONFIGURACION DE PINES
// ==========================
const int BIN1 = 2;
const int BIN2 = 3;
const int HABILITADOR = 4;
const int ANALOG_X = A0; // Tiempo sellado
const int ANALOG_XP = A1; // Tiempo corte
const int OUT_SELLA = 8;
const int OUT_CORTA = 9;
const int BUZZER_OUT = 10;
// ==========================
// TIEMPOS FIJOS EDITABLES
// ==========================
const unsigned long DELAY_NOP = 1000;
const unsigned long DELAY_FRIO = 1000;
const unsigned long BUZZER_TIME = 250;
const unsigned long RESET_TIME = 1000; // >1s reinicia
// ==========================
// VARIABLES
// ==========================
enum Estado {
IDLE,
NOP_DELAY,
SELLANDO,
ESPERA_POST_SELLA,
CORTANDO,
ESPERA_POST_CORTE,
FRIO,
BUZZER,
WAIT_RELEASE
};
Estado estado = IDLE;
unsigned long tiempoEstado = 0;
unsigned long tiempoPausaInicio = 0;
bool pausado = false;
bool cicloTerminado = false;
unsigned long tiempoX = 0;
unsigned long tiempoXP = 0;
int modo = 0;
// ==========================
// SETUP
// ==========================
void setup() {
pinMode(BIN1, INPUT);
pinMode(BIN2, INPUT);
pinMode(HABILITADOR, INPUT);
pinMode(OUT_SELLA, OUTPUT);
pinMode(OUT_CORTA, OUTPUT);
pinMode(BUZZER_OUT, OUTPUT);
apagarTodo();
}
// ==========================
void loop() {
bool habilitado = digitalRead(HABILITADOR);
// ==========================
// MANEJO DE PAUSA / RESET
// ==========================
if (!habilitado && estado != IDLE && estado != WAIT_RELEASE) {
if (!pausado) {
pausado = true;
tiempoPausaInicio = millis();
}
if (millis() - tiempoPausaInicio > RESET_TIME) {
resetear();
return;
}
return; // pausa simple
}
if (habilitado && pausado) {
pausado = false;
}
// ==========================
switch (estado) {
case IDLE:
apagarTodo();
if (habilitado) {
leerModo();
leerTiempos();
if (modo != 0) {
estado = NOP_DELAY;
tiempoEstado = millis();
}
}
break;
case NOP_DELAY:
if (millis() - tiempoEstado >= DELAY_NOP) {
if (modo == 2) { // 10 = SELLADO
digitalWrite(OUT_SELLA, HIGH);
estado = SELLANDO;
}
else if (modo == 3) { // 11 = CORTE
digitalWrite(OUT_CORTA, HIGH);
estado = CORTANDO;
}
else if (modo == 1) { // 01 = SELLADO Y CORTE
digitalWrite(OUT_SELLA, HIGH);
estado = SELLANDO;
}
tiempoEstado = millis();
}
break;
case SELLANDO:
if (millis() - tiempoEstado >= tiempoX) {
digitalWrite(OUT_SELLA, LOW);
estado = ESPERA_POST_SELLA;
tiempoEstado = millis();
}
break;
case ESPERA_POST_SELLA:
if (millis() - tiempoEstado >= tiempoX) {
if (modo == 1) { // luego cortar
digitalWrite(OUT_CORTA, HIGH);
estado = CORTANDO;
} else {
estado = FRIO;
}
tiempoEstado = millis();
}
break;
case CORTANDO:
if (millis() - tiempoEstado >= tiempoXP) {
digitalWrite(OUT_CORTA, LOW);
estado = ESPERA_POST_CORTE;
tiempoEstado = millis();
}
break;
case ESPERA_POST_CORTE:
if (millis() - tiempoEstado >= tiempoXP) {
estado = FRIO;
tiempoEstado = millis();
}
break;
case FRIO:
if (millis() - tiempoEstado >= DELAY_FRIO) {
digitalWrite(BUZZER_OUT, HIGH);
estado = BUZZER;
tiempoEstado = millis();
}
break;
case BUZZER:
if (millis() - tiempoEstado >= BUZZER_TIME) {
digitalWrite(BUZZER_OUT, LOW);
estado = WAIT_RELEASE;
}
break;
case WAIT_RELEASE:
apagarTodo();
if (!habilitado) {
estado = IDLE;
}
break;
}
}
// ==========================
void leerModo() {
int b1 = digitalRead(BIN1);
int b2 = digitalRead(BIN2);
modo = (b1 << 1) | b2;
}
// ==========================
void leerTiempos() {
tiempoX = map(analogRead(ANALOG_X), 0, 1023, 0, 5000);
tiempoXP = map(analogRead(ANALOG_XP), 0, 1023, 0, 5000);
}
// ==========================
void apagarTodo() {
digitalWrite(OUT_SELLA, LOW);
digitalWrite(OUT_CORTA, LOW);
digitalWrite(BUZZER_OUT, LOW);
}
// ==========================
void resetear() {
apagarTodo();
estado = IDLE;
pausado = false;
}