Termporizador con potenciometro para insoladora UV

Hola, antes que nada quiero saludar a todos dado que esta es la primera vez que ingreso al foro, pero siempre lei con mucha atención la buena predisposición para ayudar a los que menos sabemos.

Una vez dicho esto les relato el proyecto que necesito hacer.
La maquina cuenta con una luz ultra violeta, una bomba de vacío y los tiempo de encendido los estoy haciendo de manera manual tomando los lapsos de de tiempo con un cronometro.

Mi idea es usar
arduino uno + potenciometro + 2 pulsadores + lcd + buzzer + 2 relay

Potenciometro = seleccionar tiempo en un rando de 2 a 13 minutos
Botón START
Botón STOP
LCD
BUZZER
RELAY Bomba Vacio
RELAY Luz UV.

Viendo ejemplos de otros proyectos descriptos aquí en esta comunidad pude armar el siguiente sketch el cual estaría funcionando. Pero tengo problemas por usar tantos delay. Se que se puede usar millis() y no le encuentro la vuelta de como implementarlo. Me gustaria poner un nro y este defina el lapso. Por dar un ejemplo quiero un delay(5000) y reemplazarlo por millis() con el mismo lapso, quiero un delay(75) y reemplazarlo con un millis etc. Esas pausas son diferentes para cada acción, incluso para el buzzer cuando da aviso del final de alguna rutina.

  1. Solo me interesa poder cambiar de a 1/2 minuto. Por ejemplo la escala de tiempo que va desde: 2.00 --> 2:30 --> 3:00 --> 3.30 --> 4 y así hasta llegar a los 13 minutos.

  2. Me gustaría agregar el poder guardar en memoria la cuenta regresiva pre seleccionada. Por ejemplo cuando arranco por primera vez se pueda leer el tiempo pre guardado en memoria. Presiono START arranca normal. Pero tener la opción que si al STOP lo mantengo presionado más de 5 segundos vaya a otro menú donde pueda ajustar el tiempo a memorizar ---> luego START guarda el tiempo.

Desde ya muchas gracias y un gusto estar en este prestigioso foro.

///////////////////////// PINES /////////////////////////////////
#define   POTENCIOMETRO   A1
#define   START     A2
#define   STOP      A3
#define   VACIO     3
#define   LUZ_UV    4
#define   BUZZER    5
//#define   LCD_RS    7
//#define   LCD_EN    8
//#define   LCD_D4    9
//#define   LCD_D5    10
//#define   LCD_D6    11
//#define   LCD_D7    12

///////////////////////// VARIABLES //////////////////////////////
unsigned int tiempo, cont = 0;
unsigned int display_time = 0;
unsigned long prev_millis = 0;
const int FALSE = 0;
const int TRUE = 1;
short FLAG_STOP = 0;
char buffer[16];
///////////////////////// LIBRERIAS //////////////////////////////
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);    // Modulo I2C del LCD direccion  puedes usar (0x3f,16,2) || (0x27,16,2)  ||(0x20,16,2) 
////////////////////////////// VOID SETUP ////////////////////////////////////

void setup()
{
pinMode(START,INPUT_PULLUP);                   // Habilito resistencia interna Pullup
pinMode(STOP,INPUT_PULLUP);                    // Habilito resistencia interna Pullup

pinMode(BUZZER, OUTPUT);
pinMode(LUZ_UV, OUTPUT);
pinMode(VACIO, OUTPUT);

Wire.begin();
lcd.backlight();
lcd.init();

Serial.begin(9600);
mensaje_bienvenida();
while(digitalRead(START) || tiempo == 0)             // leo botón START
{

  tiempo = analogRead(POTENCIOMETRO) * 0.176;        // equivale a 3 minutos
  display_tiempo();
  delay(200);
}
iniciar_vacio();                                      // Iniciamos vacio y luz
}
//////////////////////////// VOID LOOP //////////////////////////////////////
void loop()
{
while (FLAG_STOP == FALSE)
{
  unsigned long CURRENT_MILLIS = millis();
  display_tiempo();
  delay(200);

  if (CURRENT_MILLIS - prev_millis >= 1000)
{
    tiempo--;
    prev_millis = CURRENT_MILLIS; 
  }

  if (!digitalRead(STOP)||(tiempo==0))       // leer cuando pulsamos STOP
{   
    FLAG_STOP = TRUE;
    stop_proceso() ;
}
}
while(FLAG_STOP)
{
digitalWrite(LUZ_UV, LOW);                          // LUZ APAGADA
final_proceso();
lcd.clear();
Serial.println("");
Serial.println("Seleccionar tiempo");                // Ajustar tiempo mientras espero START
Serial.println("------------------");
delay(200);
while(digitalRead(START) || tiempo == 0)
{
tiempo = analogRead(POTENCIOMETRO) * 0.176;            // equivale 3 minutos
display_tiempo();
delay(100);
} 
FLAG_STOP = FALSE;                                    // Reseteamos bandera
iniciar_vacio();                                      // Iniciamos vacio y luz
}
}
////////////////////////// MENSAJE BIENVENIDA ///////////////////////////////
void mensaje_bienvenida()
{
Serial.println("");
Serial.println("IMPRENTA LEGEIN");
Serial.println("   Ver: 1.0");
Serial.println("");
  
lcd.clear();
lcd.setCursor(0,0);
lcd.print("IMPRENTA LEGEIN");
lcd.setCursor(0, 1);
lcd.print(" --->  Ver: 1.4");

Serial.println("INICIALIZANDO");
Serial.println("-------------"); 
delay(5000);    

lcd.setCursor(0, 1);
lcd.print("PROGRAMAR LAPSO");
delay(1000);
}
//////////////////////// DISPLAY TIEMPO ////////////////////////////////
void display_tiempo()
{
unsigned int minuto, segundo;

lcd.setCursor(0, 0);
minuto = tiempo / 60;
segundo = tiempo % 60;
sprintf(buffer, " TIEMPO : %u:%0.2u   ", minuto, segundo);
lcd.print(buffer);
Serial.println(buffer);                                                          // imprimo tiempo leido por potenciometro
}
//////////////////////////// PLAY PROCESO ////////////////////////////////
void play_proceso()
{
  Serial.println("");
  Serial.println("PLAY");
  Serial.println("CUENTA REGRESIVA");
  Serial.println("----------------");

  lcd.clear();
  lcd.print("    PLAY");
  lcd.setCursor(0, 1);
  lcd.print("CUENTA REGRESIVA");
  digitalWrite(LUZ_UV, HIGH);
  digitalWrite(BUZZER, HIGH);
  delay(250);
  digitalWrite(BUZZER, LOW);
  delay(250);
  digitalWrite(BUZZER, HIGH);
  delay(250);
  digitalWrite(BUZZER, LOW);
  delay(250);
  digitalWrite(BUZZER, HIGH);
  delay(250);
  digitalWrite(BUZZER, LOW);
}
//////////////////////////// STOP PROCESO ////////////////////////////////
void stop_proceso()
{
  Serial.println(""); 
  Serial.println("DETENER");

  lcd.clear();
  lcd.setCursor(0,0);   
  lcd.print("   ! S T O P !");
  lcd.setCursor(0, 1);
  lcd.print("     -------");
  digitalWrite(LUZ_UV, LOW);                       //  APAGO LUZ
  digitalWrite(VACIO, LOW);                        //  APAGO BOMBA
  digitalWrite(BUZZER, HIGH);
  delay(100);
  digitalWrite(BUZZER, LOW);
  delay(100);
  digitalWrite(BUZZER, HIGH);
  delay(100);
  digitalWrite(BUZZER, LOW);
  delay(100);
  digitalWrite(BUZZER, HIGH);
  delay(100);
  digitalWrite(BUZZER, LOW);
  delay(1000);
}
//////////////////////////// INICIAR VACIO ////////////////////////////////
void iniciar_vacio()
{
digitalWrite(VACIO, HIGH);                           //  PRENDO BOMBA
Serial.println("");
Serial.println("START");
Serial.println("HACIENDO VACIO");
delay(250); 
Serial.println("Aguarde por favor...");

lcd.clear();
lcd.setCursor(0,0);
lcd.print("START");
lcd.setCursor(0, 1);
lcd.print("Haciendo vacio");
delay(4000);  
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Haciendo vacio");
lcd.setCursor(0, 1);
lcd.print("Espere por favor"); 
delay(6000);
lcd.clear(); 
lcd.setCursor(0,0);
lcd.print("Iniciando");
lcd.setCursor(0, 1);
lcd.print("Cuenta regresiva");
digitalWrite(LUZ_UV, HIGH);                           //  LUZ PRENDIDA
FLAG_STOP = FALSE;
}
//////////////////////// FINAL PROCESO ////////////////////////////////
void final_proceso()
{
  Serial.println(""); 
  Serial.println("PROCESO TERMINADO");

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("    PROCESO ");
  lcd.setCursor(0, 1);
  lcd.print("   FINALIZADO ");
  digitalWrite(LUZ_UV, LOW);                       //  APAGO LUZ
  delay(250);
  digitalWrite(VACIO, LOW);                        //  APAGO BOMBA
  digitalWrite(BUZZER, HIGH);
  delay(1000);
  digitalWrite(BUZZER, LOW);
  delay(1000);
  digitalWrite(BUZZER, HIGH);
  delay(1000);
  digitalWrite(BUZZER, LOW);
  delay(1000);
  digitalWrite(BUZZER, HIGH);
  delay(1000);
  digitalWrite(BUZZER, LOW);
}

esquema electrico insoladora.jpg

esquema electrico insoladora.jpg

Moderador
Hola, bienvenido al foro Arduino en Español

Por favor edita tu post usando etiquetas de código.
Normas del foro

Agradezco que hayas modificado tu hilo.
Mañana analizo tu código y hare mis sugerencias y/o cambios.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.