
La Anatomía del Control
El sistema se divide en dos motores paso a paso que actúan como el músculo de la operación. Mientras el Motor 1 (Yugo) gestiona la presión mecánica para el sellado, el Motor 2 (Bolsa) controla el avance del material. No hay azar aquí: el sensor óptico busca una marca física en el plástico; si no la encuentra en unos segundos, el sistema se bloquea.
El Riesgo del Calor
Un termopar MAX6675 vigila la resistencia. Si la temperatura cruza el umbral de seguridad, el sistema ejecuta un apagarTodo(). En una línea de producción, el tiempo de inactividad es pérdida, pero la fundición del equipo es un fracaso administrativo. El sellado ocurre en una ventana de milisegundos donde la energía se convierte en cierre hermético.
/*
* PROYECTO: Embolsadora y Etiquetadora Automatizada (Versión Industrial)
* CLIENTE: Empresa España
* DESCRIPCIÓN: Sistema de control de estados asincrónico para sellado térmico y etiquetado.
* LÓGICA: No bloqueante (Zero-Delay) para garantizar seguridad activa.
*/
#include <SPI.h>
#include "max6675.h"
// --- CONFIGURACIÓN DE PINES ---
#define STEP_PIN1 32
#define DIR_PIN1 33
#define ENABLE_PIN1 25
#define STEP_PIN2 27
#define DIR_PIN2 26
#define ENABLE_PIN2 13
#define SWITCH_1 36
#define SWITCH_2 21
#define SWITCH_3 22
#define ENDSTOP 39
#define SENSOR_BOLSA 35
#define RELAY_RESISTENCIA 23
#define RELAY_YUGO 15
#define RELAY_IMP_ABRIR 4
#define RELAY_IMPRESION 17
// --- PARÁMETROS TÉCNICOS ---
const float TEMP_UMBRAL_SELLADO = 180.0;
const float TEMP_MAX_SEGURIDAD = 240.0;
const int YUGO_MAX_PASOS = 550;
const unsigned long TIMEOUT_BOLSA = 7500; // ms
// --- VARIABLES DE ESTADO ---
int estado = 1;
unsigned long estadoStartTime = 0;
MAX6675 termopar(18, 16, 19); // SCK, CS, SO
void setup() {
Serial.begin(115200);
configurarHardware();
Serial.println("SISTEMA INICIALIZADO - MODO SEGURIDAD ACTIVA");
}
void loop() {
monitorearTemperatura(); // Siempre activo, sin importar el estado
procesarMotores(); // Movimiento asincrónico
maquinaDeEstados(); // Lógica principal
}
// --- LÓGICA DE CONTROL (MÁQUINA DE ESTADOS) ---
void maquinaDeEstados() {
switch (estado) {
case 1: // Standby
if (digitalRead(SWITCH_1) == LOW) cambiarEstado(2);
break;
case 2: // Calibración inicial
moverMotores(1, true, false, YUGO_MAX_PASOS);
cambiarEstado(3);
break;
case 13: // Pre-calentamiento (Cero Delays)
digitalWrite(RELAY_RESISTENCIA, LOW);
if (millis() - estadoStartTime >= 100) {
cambiarEstado(14);
}
break;
case 14: // Sellado activo y presión de yugo
digitalWrite(RELAY_YUGO, LOW);
if (millis() - estadoStartTime >= 600) { // Tiempo de sellado
digitalWrite(RELAY_RESISTENCIA, HIGH);
digitalWrite(RELAY_YUGO, HIGH);
cambiarEstado(15);
}
break;
case 16: // Pulso de impresión
digitalWrite(RELAY_IMPRESION, LOW);
if (millis() - estadoStartTime >= 500) {
digitalWrite(RELAY_IMPRESION, HIGH);
cambiarEstado(10); // Reiniciar ciclo
}
break;
case 20: // EMERGENCIA
apagarTodo();
break;
}
}
// --- FUNCIONES DE SEGURIDAD ---
void monitorearTemperatura() {
static unsigned long lastCheck = 0;
if (millis() - lastCheck > 100) {
float t = termopar.readCelsius();
if (t > TEMP_MAX_SEGURIDAD || isnan(t)) {
Serial.println("ERROR CRÍTICO: TEMPERATURA FUERA DE RANGO");
cambiarEstado(20);
}
lastCheck = millis();
}
}
void cambiarEstado(int nuevoEstado) {
estado = nuevoEstado;
estadoStartTime = millis();
Serial.printf("Transición a Estado: %d\n", nuevoEstado);
}
void apagarTodo() {
digitalWrite(RELAY_RESISTENCIA, HIGH);
digitalWrite(RELAY_YUGO, HIGH);
digitalWrite(RELAY_IMPRESION, HIGH);
digitalWrite(ENABLE_PIN1, HIGH);
digitalWrite(ENABLE_PIN2, HIGH);
estado = 0;
}
void configurarHardware() {
pinMode(RELAY_RESISTENCIA, OUTPUT); digitalWrite(RELAY_RESISTENCIA, HIGH);
pinMode(RELAY_YUGO, OUTPUT); digitalWrite(RELAY_YUGO, HIGH);
pinMode(RELAY_IMPRESION, OUTPUT); digitalWrite(RELAY_IMPRESION, HIGH);
pinMode(ENABLE_PIN1, OUTPUT); digitalWrite(ENABLE_PIN1, HIGH);
pinMode(ENABLE_PIN2, OUTPUT); digitalWrite(ENABLE_PIN2, HIGH);
// ... resto de pines de motores y sensores
}
// Implementación de moverMotores y bachMotores (asincrónicos)...






