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

