// Incluye bibliotecas necesarias
#include <LiquidCrystal.h>
// Configuración del LCD (sin I2C)
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// Pines del sensor ultrasónico
const int trigPin = 3;
const int echoPin = 4;
// Sensor de flujo
const int flowSensorPin = 2;
volatile int flowPulseCount = 0;
// Constantes
const float areaTurbina = 1.5; // Área de la turbina en m² (simulado)
const float eficiencia = 0.4; // Eficiencia del sistema (40%)
// Variables
float nivelAgua = 0.0; // En metros
float velocidadFlujo = 0.0; // En m/s
float energiaGenerada = 0.0; // En Watts
unsigned long tiempoAnterior = 0;
void setup() {
// Configuración de pines
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(flowSensorPin, INPUT_PULLUP);
// Configuración de interrupción para sensor de flujo
attachInterrupt(digitalPinToInterrupt(flowSensorPin), contarPulsos, RISING);
// Inicialización del LCD
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Energia: 0 W");
// Configuración serial
Serial.begin(9600);
}
void loop() {
// Medir nivel de agua
nivelAgua = medirNivelAgua();
// Calcular velocidad del flujo (simulado con el sensor de flujo)
velocidadFlujo = calcularVelocidadFlujo();
// Calcular energía generada
energiaGenerada = calcularEnergia(nivelAgua, velocidadFlujo);
// Mostrar en LCD
lcd.setCursor(0, 0);
lcd.print("Energia: ");
lcd.print(energiaGenerada);
lcd.print(" W");
// Mostrar datos adicionales por serial
Serial.print("Nivel de agua: ");
Serial.print(nivelAgua);
Serial.println(" m");
Serial.print("Velocidad flujo: ");
Serial.print(velocidadFlujo);
Serial.println(" m/s");
Serial.print("Energia generada: ");
Serial.print(energiaGenerada);
Serial.println(" W");
delay(1000); // Esperar 1 segundo
}
// Función para medir nivel de agua con sensor ultrasónico
float medirNivelAgua() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duracion = pulseIn(echoPin, HIGH);
float distancia = (duracion * 0.0343) / 2; // Convertir a metros
// Asumimos un rango máximo de 5 m
if (distancia > 5.0) distancia = 5.0;
return distancia;
}
// Función para calcular velocidad del flujo
float calcularVelocidadFlujo() {
noInterrupts();
int pulsos = flowPulseCount;
flowPulseCount = 0;
interrupts();
// Convertir pulsos a velocidad de flujo (simulación: 1 pulso = 0.1 m/s)
return pulsos * 0.1;
}
// Función para calcular energía generada
float calcularEnergia(float nivel, float velocidad) {
float densidadAgua = 1000.0; // kg/m³
float potencia = 0.5 * densidadAgua * areaTurbina * velocidad * velocidad * velocidad * eficiencia;
return potencia;
}
// Interrupción para contar pulsos del sensor de flujo
void contarPulsos() {
flowPulseCount++;
}