#include <LiquidCrystal.h>
const int buzzerPin = 7; // Pin para el buzzer
const int pwmPin = 11; // Pin PWM conectado al MOSFET
const int buttonPin = 1; // Pin del botón
int pwmValue = 0; // Valor PWM inicial (0-255)
int targetPower = 4; // Potencia deseada en Watts
int deliveryTime = 60; // Tiempo de entrega en segundos
unsigned long startTime; // Tiempo de inicio en milisegundos
bool deliveryStarted = false; // Bandera para indicar que la entrega ha comenzado
const unsigned long messageDelay = 3000; // Tiempo de espera entre mensajes (en milisegundos)
// Configuración de pines del display
const int rs = 9;
const int en = 8;
const int d4 = 5;
const int d5 = 4;
const int d6 = 3;
const int d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const char DISPLAY_FILA1[][9] = { // Mensajes configurables por el usuario
"COMIENZA",
"FAVOR DE",
"MUCHAS"
};
const char DISPLAY_FILA2[][9] = { // Mensajes configurables por el usuario
"PROGRAMA",
"ESPERAR",
"GRACIAS"
};
const int numMessages = sizeof(DISPLAY_FILA1) / sizeof(DISPLAY_FILA1[0]);
void setup() {
pinMode(pwmPin, OUTPUT);
analogWrite(pwmPin, pwmValue); // Comienza en valor 0, definido previamente.
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH); // Habilitar resistor de pull-up interno
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, HIGH); // Apagar el buzzer
lcd.begin(8, 2); // Configuración para un LCD de 8x2
lcd.setCursor(0, 0);
lcd.print("PRESIONA");
lcd.setCursor(0, 1);
lcd.print("EL BOTON");
}
void loop() {
if (digitalRead(buttonPin) == LOW) { // Lectura de boton y posterior accion con transistor MOSFET
//Indicacion sonora de inicio del programa
for (int k=0; k<3 ; k++){
digitalWrite(buzzerPin, HIGH);
delay(70);
digitalWrite(buzzerPin, LOW);
delay(70);
}
// Mensajes iniciales en display, de bienvenida.
for (int i = 0; i < numMessages; ++i) {
digitalWrite(buzzerPin, HIGH); //Para el Buzzer este apagado mientras tanto.
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(DISPLAY_FILA1[i]);
lcd.setCursor(0, 1);
lcd.print(DISPLAY_FILA2[i]);
delay(messageDelay);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tiempo: 0s");
startTime = millis(); // Registrar el tiempo de inicio
deliveryStarted = true; // Marcar que la entrega ha comenzado
while (deliveryStarted) {
unsigned long currentTime = millis();
unsigned long elapsedTime = (currentTime - startTime) / 1000;
if (elapsedTime >= deliveryTime) {
deliveryStarted = false; // Finalizar la entrega cuando se alcanza el tiempo deseado
analogWrite(pwmPin, 0); // // Detener la entrega de potencia
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ENTREGA");
lcd.setCursor(0, 1);
lcd.print("FIN.");
//Indicacion sonora de finalizacion del programa.
for (int j=0; j<3 ; j++){
digitalWrite(buzzerPin, HIGH);
delay(70);
digitalWrite(buzzerPin, LOW);
delay(70);
}
digitalWrite(buzzerPin, HIGH); // Apagar buzzer
delay(5000);
}
else {
updateElapsedTime(elapsedTime); // Actualizar y mostrar el tiempo transcurrido en minutos y segundos
pwmValue = map(analogRead(A0), 0, 1023, 0, 255); // Leer el potenciómetro para ajustar potencia
analogWrite(pwmPin, pwmValue);
float Vcc = 12; // Debes ajustar esto a la tensión de alimentación real
int analogValue = analogRead(A0); // Lee el valor del potenciómetro en A0
float power = calculatePower(Vcc, analogValue); // Llama a 'calculatePower' con Vcc y el valor del potenciómetro
// Ahora, 'power' contiene la potencia calculada, que puedes usar como desees
lcd.setCursor(0, 1);
lcd.print("P: " + String(power, 1) + "W ");
delay(1000); // Actualizar cada segundo
}
}
}
digitalWrite(buzzerPin, HIGH);
lcd.setCursor(0, 0);
lcd.print("PRESIONA");
lcd.setCursor(0, 1);
lcd.print("EL BOTON");
}
///////////////////////////////////
///// FUNCIONES EXTRAS ////////
///////////////////////////////////
float calculatePower(float Vcc, int analogValue) {
// Calcular la resistencia del potenciómetro
float Rp = Vcc / (analogValue / 1023.0); // Suponiendo 1023 como la lectura máxima del potenciómetro
// Calcular la corriente a través de la resistencia calefactora
float I = Vcc / Rp;
// Calcular la potencia entregada a la resistencia calefactora
float P = (Vcc * Vcc) / Rp;
return P; // Devolver la potencia en vatios (W).
}
void updateElapsedTime(unsigned long elapsedTime) {
// Función para calcular y mostrar el tiempo transcurrido
unsigned int minutes = elapsedTime / 60;
unsigned int seconds = elapsedTime % 60;
lcd.setCursor(0, 0);
lcd.print("t: " + String(minutes) + ":" + String(seconds) + " ");
}