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;
}