// -------------- Librerias ------------
#include <LiquidCrystal_I2C.h> // LCD libreria
#include <Wire.h> // I2C libreria
#include <WiFi.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
// -------------- Variables constantes ------------
///////////// SIMULACIÓN BATERÍAS //////////////
#define MAX_CAPACITY_BATT 5000 //mAh
#define BATT_CYCLE 500 //ms
#define BUZZER_PIN GPIO_NUM_12
////////////////////////////////////////////////
#define LED_PIN GPIO_NUM_5 // Led Blanco = WiFi OK
#define BUTTON_PIN GPIO_NUM_4 // Pulsador Check Hora & Bat
// T2: Credenciales Wifi
#define WIFI_NET "Wokwi-GUEST"
#define WIFI_PASS ""
// T2: Ajustes NTP (Server y ajustes)
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 7200 // Sera usado en Andorra :)
#define UTC_OFFSET_DST 0
// T2 Manejo del intervalo WifiCheck Task_2
unsigned long lastWiFiCheck = 0;
// T3: LCD Direccion y tamaño
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C LCD(I2C_ADDR, LCD_COLUMNS, LCD_LINES); // Ini la libreria pasando la Direccion y dimensiones
// -------------- Variables dinámicas globales -------------------------
///////////// SIMULACIÓN BATERÍA //////////////
float level_init = 3500;
float level_bat;
bool charging = false;
unsigned long timeelapsed = 0;
////////////////////////////////////////////////
// ------------------- Funciones ---------------------//
// Task 2 : Verificar conectividad a WiFi cada 10 segundos y encender LED Blanco si es Ok
void task_2(void * parameters){
for(;;){
unsigned long now = millis();
if (now - lastWiFiCheck >= 10000) { // Reviso estado cada 10 s.
lastWiFiCheck = now;
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Connected to WiFi");
digitalWrite(LED_PIN, HIGH); // Enciende el LED Blanco
vTaskDelay(1000 / portTICK_PERIOD_MS); // Mantengo el LED por 1 s
digitalWrite(LED_PIN, LOW);
}
}
}
}
// Task 3: Al liberar el pulsador mostar hora
// Print Hora
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
LCD.setCursor(0, 0);
LCD.println("Connection Err");
return;
}
LCD.clear();
LCD.print ("HORA:");
LCD.setCursor(8, 0);
LCD.println(&timeinfo, "%H:%M:%S");
}
// ------------------------ Setup ---------------------//
void setup() {
Serial.begin(9600); // Inicialización del serial
///////////// SIMULACIÓN BATERÍA //////////////
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
level_bat = level_init;
///////////////////////////////////////////////
// Inicializacion LED pin
pinMode(LED_PIN, OUTPUT);
// Inicializacion Boton
pinMode(BUTTON_PIN, INPUT_PULLUP);
// T3: Inicializo LCD
LCD.init();
LCD.backlight();
// Conectar a WiFi
WiFi.begin(WIFI_NET, WIFI_PASS);
Serial.print("Conectando...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// T3: Inicializo NTP ////
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
//printLocalTime();
// ------------Creo Tareas
xTaskCreate(
task_2, // Función tarea
"task_2", // Nombre Tarea
1000, // Tamaño de stack
NULL, // parámetros tarea
1, // Prioridad tarea (0(bajo)-> MAX (alto))
NULL // Handle Tarea
);
}
// ------------- Ejecución principal --------------
void loop() {
///////////// SIMULACIÓN BATERÍA //////////////
//Serial.print("Estado :");
//Serial.println(charging);
unsigned long time1 = millis();
// Estado de batería
// Serial.println(charging);
if (charging){
level_bat = level_bat + 10; //mAh
} else {
level_bat = level_bat - 40; //mAh
}
// Alerta batería
if (level_bat<1000)
tone(BUZZER_PIN, 262);
else if (level_bat > 4000)
tone(BUZZER_PIN, 660);
else
noTone(BUZZER_PIN);
unsigned long time2 = millis();
unsigned long timeelapsed = time2 - time1;
float delay_time = BATT_CYCLE - timeelapsed;
delay(delay_time);
//unsigned long time3 = micros();
//unsigned long cycle = time3 - time1;
//Serial.print("Cycle = ");
//Serial.println(cycle);
///////////////////////////////////////////////
}