Anémomètre Arduino Uno

Cahier des charges

  • Mesurer la vitesse du vent et au delà d’un certain seuil piloter un relais qui pourra par exemple commander la rentrée d’un store banne.
  • Pour les heureux possesseurs d’un IPX800, enregistrer toutes les minutes les mesures dans une base MYSQL

Matériel nécessaire

  • Un anémomètre à coupelles (Voir ICI)
  • Un arduino uno
  • Une carte prototypage
  • Un afficheur LCD 2×16 I2C
  • Une platine 2 relais
  • 1 trimmer 10 ko
  • 1 résistance 10 ko 1/4 de watts
  • 1 résistance 47 ko 1/4 de watts
  • 1 résistance 470 ohms 1/4 de watts
  • 1 transistor NPN BC547
  • 1 diode 1N4007
  • 1 relais bobine 5 Vcc
  • 1 alim 220Vca / 9Vcc

Schéma de câblage

http://kergoaler.fr/wordpress/2018/11/30/anemometre-arduino-uno/1_anemometre/

Principe de fonctionnement

Le seuil de basculement du relais est ajusté avec le trimmer de 10 Ko.
La première ligne de l’afficheur visualise le seuil réglé au trimmer.
La seconde ligne affiche la dernière mesure effectuée. Elle est remise à jour toutes les 10 secondes. Pendant cette période l’anémomètre incrémente un compteur qui est remis à zéro sitôt l’affichage effectué.

Code Arduino

int etatPrecedent;
int out6 =6; // Vers IPX
int out7 =7; // relais de seuil

int nbcar;
int compteur;
unsigned long previousMillis = 0 ;
unsigned long interval = 10000; // 10 secondes
//Afficheur
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
  pinMode(8, INPUT);   // interrupteur Reed à la pin 8
  pinMode(13, OUTPUT); // LED indicatrice à la pin 13
  pinMode(out6, OUTPUT); //Relais de seuil
  pinMode(out7, OUTPUT); //Relais vers entrée IPX
  Serial.begin(115200);
  
  lcd.init();  // initialisation de l'afficheur
  lcd.backlight();   //Rétroéclairage
  etatPrecedent = digitalRead(8); 
}

void loop() {
  int potard = analogRead(1);   //Consigne potentiomètre Branché sur A1
  //Affichage 1ère ligne (consigne)
  lcd.setCursor(0, 0);
  lcd.print("Seuil:           ");
  lcd.setCursor(10, 0);
  lcd.print(potard);
  unsigned long currentMillis = millis();
  int etat;
  etat = digitalRead(8);  // on Lit état ILS
  digitalWrite(13, etat);
  digitalWrite(out6, etat); // IPX

  if ((etat) && (!etatPrecedent)) { // ILS change d'état
    compteur ++;
  }
  // Controle si intervalle dépassé (10000 milliseconds)
  if ((unsigned long)(currentMillis - previousMillis) >= interval) {
    Serial.println(compteur);
  
    lcd.setCursor(0, 1);
    lcd.print("Mesure:         ");
    lcd.setCursor(10, 1);
    lcd.print(compteur);
    //Si mesure > au seuil on pilote le relais
    if (compteur > potard) {
      digitalWrite(out7, HIGH);
      Serial.println("Relais =1");
    }
    else {
      digitalWrite(out7, LOW);
      Serial.println(potard);
    }
    compteur = 0;
    previousMillis = millis();
    
  }

  etatPrecedent = etat;  // mise à jour de la variable
}

Photo de la réalisation

dav

 

Interfaçage éventuel avec un  IPX800

J’ interface l’arduino et l’ IPX avec un optocoupleur, la fréquence des impulsions pouvant être élevée.
Les impulsions envoyées sur l’entrée I6 de l’IPX800 incrémentent un compteur.
Concernant la récupération des données contenues dans le fichier status.xml puis leur stockage dans une base MYSQL, merci de vous référer aux articles précédents.