Etiquetadora de bolsas para empresa en España

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)...

Proyectos:

guest
0 Comentarios
El más antiguo
El más nuevo Más votado
Opiniones integradas
Ver todos los comentarios

GDPR