#include <EnableInterrupt.h> // https://www.arduino.cc/reference/en/libraries/enableinterrupt/
// For https://forum.arduino.cc/t/control-a-wind-turbine-direction-thanks-to-a-program/962692/
// with wind simulation code
#include <Servo.h>
unsigned long displayTimer = millis(); // Tempo pour affichage
#define anemometrePin A2 // Pin ou est connecté l'anémomètre
float anemometreKmH = 0.0; // Vitesse du vent
const float anemometreKmHimpuls = 2.4; // KmH par impulsion
volatile int anenometreImpulsions = 0; // Compteur d'impulsions 1/sec = 2.4 kmH
unsigned long anemometreTempoStart= millis(); // Début periode de comptage
int anemometreTempo= 2; // Période de comptage 2sec.
#define servoAnemoPin A0 // Pin ou est connecté le servo (Ex pluvio)
int servoPositionBas = 20; // Position bas en degrés
int servoPositionHaut = 110; // Position haut en degrés
Servo servoAnemo; // creation de l'objet servo
int servoPosition = 0; // Position actuelle
const float servoActionLimite = 5.0; // Limite d'action
void setup()
{
Serial.begin(9600);
pinMode(anemometrePin, INPUT_PULLUP);
enableInterrupt(anemometrePin, anemImpulsionMesure, RISING);
servoAnemo.attach(servoAnemoPin); // Attacher le servo sur la pin servoAnemoPin
Serial.println("\nProchaine mesure dans " + String(anemometreTempo) + " secondes");
servoAnemo.write(servoPositionBas);
}
int simAnalogPin = 0; // simulated anemometer ADC
void loop()
{
simulateWind();
// int anemometreDirectionADC = analogRead(???);
int anemometreDirectionADC = simAnalogPin;
if (millis() - anemometreTempoStart >= (anemometreTempo*1000)) // Toutes les anemometreTempo millisecondes
{
anemometreKmH = ((float)anenometreImpulsions * anemometreKmHimpuls)/(float)anemometreTempo;
Serial.print("Vitesse " + String(anemometreKmH) + " km/h");
anenometreImpulsions = 0;
anemometreTempoStart = millis();
if (anemometreKmH <= servoActionLimite)
{
servoPosition = servoPositionBas;
}
else if (anemometreKmH > servoActionLimite)
{
servoPosition = servoPositionHaut;
}
Serial.println("\tServo = " + String(servoPosition));
servoAnemo.write(servoPosition);
}
}
// Traitement de l'interrupt
void anemImpulsionMesure()
{
anenometreImpulsions ++;
}
void simulateWind(void){
// per https://forum.arduino.cc/t/control-a-wind-turbine-direction-thanks-to-a-program/962692
const unsigned long interval = 100UL;
static unsigned long last = -interval;
static int tick = 0;
static float speed = 0;
static float direction = 0;
const float vaneResistanceK[] ={64.4,39.2,99.7,54.4,119.4,33.8,47.1,27.2};
const float vanePullupK = 10;
int dirIndex;
float simImpulsions = 0;
if(millis() - last >= interval){
if( tick == 0 ){ //choose a different direction
speed = 0.1*random(0,1000);
direction = random(0,359);
dirIndex = floor(direction/45);
Serial.print("simulateWind: ");
Serial.print(speed);
Serial.print("km/h, ");
Serial.print(direction);
Serial.print("°, simAnalogPin: ");
Serial.print(simAnalogPin);
Serial.println(" counts");
}
// update simulation time
tick = (tick + 1) % (30000/interval) ; // every 30 seconds...
last += interval;
// update sensors with simulated data:
dirIndex = floor(direction/45);
simImpulsions += speed * interval/ 1000 /anemometreKmHimpuls;
noInterrupts();
anenometreImpulsions += floor(simImpulsions);
interrupts();
simImpulsions -= floor(simImpulsions);
// windvane pot per https://forum.arduino.cc/t/control-a-wind-turbine-direction-thanks-to-a-program/962692/5
simAnalogPin= 1023*vaneResistanceK[dirIndex]/(vaneResistanceK[dirIndex]+vanePullupK);
}
}