#include <Wire.h> // Biblioteca para comunicación I2C (no necesaria en este caso)
#include <LiquidCrystal.h> // Biblioteca para manejar pantallas LCD de 16 pines
#include <WiFi101.h> // Libreria para hacer uso de las caracteristicas WiFi del arduino Nano
#include <ArduinoJson.h> // Biblioteca para manejar JSON
// Configuración del LCD de 16 pines
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Configuración de pines: RS, EN, D4, D5, D6, D7
// Constantes
//Configuracion WiFi
const char* ssid = "Redmi Note 9"; // Nombre de la red WiFi a conectarse
const char* password = "22884646"; // Contraseña de la red WiFi en cuestión
const char* server = "192.168.1.100"; // Cambia por la IP de tu servidor local
const int port = 3000; // Puerto del servidor
WiFiClient client;
// Configuración de variables para el cálculo de potencia y energía
const int pinPotenciometro = A0; // Pin analógico donde está conectado el potenciómetro
const float voltaje = 230.0; // Voltaje fijo de la red eléctrica en voltios (230 V)
const float factor_escala = 10.0; // Factor para convertir la lectura del potenciómetro a corriente (amperios)
const unsigned long intervaloActualizacion = 5000; // Intervalo de actualización de la energía en milisegundos (1 segundo)
// Variables globales
float energiaAcumulada = 0.0; // Energía acumulada en Wh
unsigned long tiempoPrevio = 1000; // Marca de tiempo del último cálculo de energía acumulada (en milisegundos)
// Configuración inicial del programa
void setup() {
Serial.begin(9600); // Inicializa la comunicación serial para depuración
lcd.begin(16, 2); // Inicializa la pantalla LCD de 16 columnas y 2 filas
lcd.clear(); // Limpia cualquier contenido previo en la pantalla LCD
// Mensaje de bienvenida
lcd.setCursor(0, 0); // Posiciona el cursor en la primera fila
lcd.print("Medidor Energia"); // Muestra un mensaje inicial
lcd.setCursor(0, 1); // Cambia a la segunda fila
lcd.print("Iniciando..."); // Muestra un mensaje de inicio
delay(2000); // Pausa de 2 segundos para que el usuario vea el mensaje
lcd.clear(); // Limpia la pantalla antes de comenzar el programa principal
//Intentando conectar a Wi-Fi
conectarWiFi(); // Llamada a la función de conexión Wi-Fi
lcd.clear();
}
void loop() {
float potencia, corriente;
// Leer datos del potenciómetro y calcular potencia y corriente
leerPotenciometro(corriente, potencia);
calcularEnergia(potencia);
// Mostrar datos en la pantalla LCD
mostrarDatos(potencia, corriente);
// Enviar datos al servidor
enviarDatos(potencia, energiaAcumulada);
delay(5000); // Envía los datos cada 5 segundos
}
// Función para leer el valor del potenciómetro y calcular corriente y potencia
void leerPotenciometro(float &corriente, float &potencia) {
int valorPotenciometro = analogRead(pinPotenciometro); // Lee el valor analógico del potenciómetro
corriente = (valorPotenciometro / 1023.0) * factor_escala; // Convierte el valor a corriente (amperios)
potencia = voltaje * corriente; // Calcula la potencia (P = V * I)
}
// Función para calcular la energía acumulada en Wh
void calcularEnergia(float potencia) {
unsigned long tiempoActual = millis(); // Obtiene el tiempo actual en milisegundos
if (tiempoActual - tiempoPrevio >= intervaloActualizacion) { // Verifica si ha pasado el intervalo
float tiempoHoras = (tiempoActual - tiempoPrevio) / 3600000.0; // Convierte el tiempo transcurrido a horas
energiaAcumulada += potencia * tiempoHoras; // Calcula la energía acumulada (E = P * t)
tiempoPrevio = tiempoActual; // Actualiza la marca de tiempo
}
}
// Función para mostrar los datos en la pantalla LCD
void mostrarDatos(float potencia, float corriente) {
// Muestra la potencia actual en la primera fila del LCD
lcd.setCursor(0, 0); // Posiciona el cursor en la primera fila
lcd.print("Pot: "); // Etiqueta de potencia
lcd.print(potencia, 1); // Muestra la potencia con 1 decimal
lcd.print(" W "); // Agrega espacios para evitar residuos de caracteres
// Muestra la energía acumulada en la segunda fila del LCD
lcd.setCursor(0, 1); // Cambia a la segunda fila
lcd.print("Energia: "); // Etiqueta de energía
lcd.print(energiaAcumulada, 2); // Muestra la energía acumulada con 2 decimales
lcd.print(" Wh "); // Agrega espacios para evitar residuos de caracteres
}
// Conexión a la red Wi-Fi
void conectarWiFi() {
lcd.setCursor(0, 0);
lcd.print("Conectando Wi-Fi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcd.setCursor(0, 1);
lcd.print("Intentando...");
delay(1000);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wi-Fi Conectado");
delay(2000);
}
// Envía los datos al servidor en formato JSON
void enviarDatos(float potencia, float energia) {
if (client.connect(server, port)) {
StaticJsonDocument<200> jsonDoc;
jsonDoc["potencia"] = potencia;
jsonDoc["energia"] = energia;
String jsonData;
serializeJson(jsonDoc, jsonData);
client.println("POST /api/datos HTTP/1.1");
client.println("Host: " + String(server));
client.println("Content-Type: application/json");
client.println("Content-Length: " + String(jsonData.length()));
client.println();
client.println(jsonData);
client.stop();
} else {
Serial.println("Error conectando al servidor.");
}
}