/* Ejercicio entregable 111
Deben de utilizar este archivo los alumnos con c>=5, d>=5, u>=5
siendo c,d,u las tres últimas cifras del DNI 22000cdu-W
Anemómetro y motor de continua con potenciometro
Para cambiar la velocidad del viento haz click sobre el anemometro durante la simulacion
rellenar vuestro nombre y DNI
NOMBRE ALUMNO: Adrián Tarongi Marco
DNI: 53790587G
ENLACE WOKWI: https://wokwi.com/projects/419010141862945793
*/
// Pines de conexión
const int anemometerPin = 17; // Pin del anemómetro
const int motorPinVPlus = 26; // Pin V+ del motor
const int motorPinVMinus = 27; // Pin V- del motor
const int potentiometerReadPin = 34; // Pin de lectura del potenciómetro
// Variables globales
unsigned long tiempo_muestreo = 100; // Tiempo entre muestreos (ms)
unsigned long tiempo_lectura = 0; // Marca de tiempo para muestreo
int suma_pot = 0; // Acumulador para sobremuestreo
int muestras = 0; // Contador de muestras
float currentAngle = 10.0; // Ángulo actual inicial (10°)
float bladeAngle = 0.0; // Ángulo deseado inicial (10°)
float windSpeed = 0.0;
// Configuración inicial
void setup() {
Serial.begin(115200);
pinMode(anemometerPin, INPUT_PULLUP);
pinMode(potentiometerReadPin, INPUT);
// Configuración de canales PWM
ledcAttach(motorPinVPlus,1000, 12); // Asignar canal 0 a motorPinVPlus
ledcAttach(motorPinVMinus,1000, 12); // Asignar canal 1 a motorPinVMinus
}
// Bucle principal
void loop() {
// **Leer la frecuencia del anemómetro**
float tiempo_encendido = pulseIn(anemometerPin, HIGH);
float tiempo_apagado = pulseIn(anemometerPin, LOW);
float periodo = tiempo_encendido + tiempo_apagado; // Periodo total (μs)
float frecuencia = 0;
if (periodo > 0) {
float frecuencia = 1000000.0 / periodo; // Calcular frecuencia en Hz
windSpeed = map(frecuencia, 0, 50, 0, 100); // Convertir Hz a km/h
bladeAngle = map(windSpeed, 0, 100, 10, 90); // Convertir km/h a grados de orientación
} else {
windSpeed = 0; // Sin frecuencia, viento en calma
bladeAngle = 10; // Orientar a 10º
}
// **Sobremuestrear el potenciómetro**
suma_pot += analogRead(potentiometerReadPin); // Sumar lectura
muestras++;
if (millis() > tiempo_lectura) {
tiempo_lectura += tiempo_muestreo; // Actualizar tiempo de lectura
int potValue = suma_pot / muestras; // Calcular promedio
suma_pot = 0;
muestras = 0;
// Convertir valor del potenciómetro a ángulo actual
float normalizedPotValue = potValue / 4095.0; // Normalizado a 0-1
currentAngle = normalizedPotValue * 180.0; // Convertir a ángulo (0° a 180°)
}
// **Calcular diferencia de ángulo**
float angleDifference = bladeAngle - currentAngle;
int pwmValue = map(abs(angleDifference), 0, 80, 0, 4095); // Calcular PWM (0-4095)
// **Controlar el motor**
if (angleDifference > 0) {
// Mover en una dirección
ledcWrite(motorPinVPlus, pwmValue); // Canal 0 para mover en una dirección
ledcWrite(motorPinVMinus, 0); // Canal 1 en 0
} else if (angleDifference < 0 ) {
// Mover en la otra dirección
ledcWrite(motorPinVPlus, 0); // Canal 0 en 0
ledcWrite(motorPinVMinus, pwmValue); // Canal 1 para mover en la otra dirección
} else {
// Detener el motor si está en la posición deseada
ledcWrite(motorPinVPlus, 0); // Canal 0
ledcWrite(motorPinVMinus, 0); // Canal 1
}
// **Imprimir valores en el monitor serie**
Serial.print("Wind Speed: ");
Serial.print(windSpeed);
Serial.print(" km/h, Blade Angle: ");
Serial.print(bladeAngle);
Serial.print("°, Current Angle: ");
Serial.print(currentAngle);
Serial.print("°, PWM Value: ");
Serial.println(pwmValue);
}