#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 4); // Dirección I2C de la pantalla y dimensión
int valorReaccion = 850;
int valorFoto;
int ledrojo = 2;
int ledverde = 3;
int rele = 4;
float voltaje;
float voltajeReaccion;
int valorReaccDeseado = 820; // Aprox 9V
int valorFotoDeseado = 500; // Valores menores = más oscuridad
// Cronómetro
int botonCronoPin = 12; // Pin del botón
unsigned long startTime = 0;
unsigned long elapsedTime = 0;
unsigned long lastElapsedTime = 0;
bool running = false;
bool stopped = false;
void setup() {
lcd.init(); // Inicializar la pantalla
lcd.backlight(); // Encender el backlight de la pantalla
pinMode(botonCronoPin, INPUT_PULLUP); // Configurar el botón como pull-up interno
pinMode(ledrojo, OUTPUT);
pinMode(ledverde, OUTPUT);
pinMode(rele, OUTPUT);
digitalWrite(ledrojo, LOW);
digitalWrite(ledverde, LOW);
//Serial.begin(9600);
}
void loop() {
//valorReaccion = analogRead(A0);
valorFoto = analogRead(A1);
/*voltaje = map(valorReaccion, 0, 1023, 0, 5000);
voltajeReaccion = map(valorReaccion, 0, 1080, 0, 12000);
if (voltajeReaccion > 11300) {
voltajeReaccion = 12000;
} else {
voltajeReaccion = voltajeReaccion;
}*/
// Voltaje de 9V de la reaccion es aproximadamente 4.00 V en el divisor de voltaje
// 4.00V en bits son aprox. 810 (12V son 1023), hecho con regla de 3 (comprobar en Monitor Serial)
// OJO, EL RELÉ SE ACTIVA CON DIGITAL LOW IRL, OJEAR EL CÓDIGO
if (valorReaccion < valorReaccDeseado || valorFoto > valorFotoDeseado) { // Recordar cambiar valor de acuerdo a mediciones
digitalWrite(ledrojo, HIGH);
digitalWrite(ledverde, LOW);
digitalWrite(rele, LOW);
lcd.setCursor(0, 3);
lcd.print(" ESTADO: NEGADO");
} else {
digitalWrite(ledrojo, LOW);
digitalWrite(ledverde, HIGH);
digitalWrite(rele, HIGH);
lcd.setCursor(0, 3);
lcd.print(" ESTADO: LISTO ");
}
// Código para cronómetro
if (digitalRead(botonCronoPin) == LOW && !running) {
startTime = millis(); // Iniciar el cronómetro
running = true;
stopped = false;
}
if (valorFoto > valorFotoDeseado && running) {
elapsedTime = millis() - startTime; // Calcular el tiempo transcurrido
lastElapsedTime = elapsedTime; // Guardar el tiempo anterior
running = false;
stopped = true;
}
if (running) {
unsigned long currentTime = millis();
elapsedTime = currentTime - startTime; // Calcular el tiempo transcurrido
}
if (stopped) {
startTime = 0; // Reiniciar el cronómetro
elapsedTime = 0; // Establecer el tiempo transcurrido en cero
running = false;
stopped = false;
}
int segundos = elapsedTime / 1000; // Calcular los segundos
int milisegundos = elapsedTime % 1000; // Calcular los milisegundos
lcd.setCursor(0, 0);
lcd.print(" Time: ");
lcd.print(segundos);
lcd.print("s ");
lcd.print(milisegundos);
lcd.print("ms ");
int lastSegundos = lastElapsedTime / 1000; // Calcular los segundos del tiempo anterior
int lastMilisegundos = lastElapsedTime % 1000; // Calcular los milisegundos del tiempo anterior
lcd.setCursor(0, 1);
lcd.print(" Past: ");
lcd.print(lastSegundos);
lcd.print("s ");
lcd.print(lastMilisegundos);
lcd.print("ms ");
//Serial.println(digitalRead(botonCronoPin));
//Serial.println(valorFoto);
lcd.setCursor(0, 2);
// Mostrar el valor de la fotoresistencia sin agregar ceros a la izquierda
if (valorFoto < 1000) {
lcd.print("VR: " + String(voltajeReaccion/1000, 1) + " V FR: " + String(valorFoto).substring(0, 3) + " ");
} else if (valorFoto < 100) {
lcd.print("VR: " + String(voltajeReaccion/1000, 1) + " V FR: " + String(valorFoto).substring(0, 2));
} else {
lcd.print("VR: " + String(voltajeReaccion/1000, 1) + " V FR: " + String(valorFoto));
}
delay(50);
}Led Naranja = Motor
En el Wokwi, el valor de la
reacción está por predeterminado
en 850 para su funcionamiento.
Cambiarlo después y checar los
comentarios en el código.
Voltaje del Regulador
Tierra del Regulador
Asegurarse de que
todas las tierras
sean comunes
(incluso la del
regulador)