Pub

jeudi 11 février 2021

Un baromètre simple à réaliser avec Arduino - a simple but smart barometer

 Voici un petit montage simple à réaliser et qui vous donnera une indication de la pression atmosphérique et de son évolution, le tout s'affichant sur une seule LED RGB.

Vous aurez besoin d'un Arduino, d'un module BME280, d'un petit breadboard, de huit fils de raccordement, d'une LED RGB et de trois résistances de 1 kilo-ohms.

Voici le schéma de raccordement des éléments :


Une fois monté, ça donne ça :



Les fonctionnalités :

- LED fixe rouge : la pression atmosphérique ramenée au niveau de la mer (QNH) est inférieure à 1013 hPa (dépression).
- LED fixe verte : le QNH égal ou supérieur à 1013 hPa (anticyclone).
- LED clignotante rouge : la pression atmosphérique locale (QFE) a baissé d'au moins 1 hPa durant les 30 dernières minutes.
- LED clignotante verte : le QFE a augmenté d'au moins 1 hPa durant les 30 dernières minutes.
A noter que l'affichage en bleu n'est pas encore géré dans cette version du code. Mais je prévois dans la prochaine version un clignotement en bleu lorsque le QNH chute rapidement (alerte orage ou tornade) avec un bip et un bouton pour l'arrêter.

 
Le code (version 1.1.1 modifiée le 12/02/2021) :


/* Program name: BARO1-1-guyvano.ino
   Author: Guy Vanoverbeke @GuyVano
   Program last update (dd/mm/yyyy) : 12/02/2021 (v.1 r.1 c.1)
   Arduino IDE V1.8.13
   Board: Arduino UNO R3
   Function: display the barometric pressure and trend on a RGB LED.
*/
#include <Wire.h>
//
// I2C Temperature, humidity and barometric pressure sensor
//
#include <Adafruit_BME280.h>
Adafruit_BME280 bme;
//
//  Define the 3 LED pins
//
const byte pblueled = 9;    // Future use in next version for fast qnh falling warning
const byte pgreenled = 10;  // Barometric pressure Green Led : fixed means the pressure is equal or above Anticyclonic value / blinking : pressure is rising
const byte predled = 11;    // Barometric pressure Red Led : fixed means the pressure is below Anticyclonic value / blinking : pressure is falling
//
const int anticyc = 1013;  // define the Anticyclonic value
//
const int myaltitude = 186;  // altitude above sea level en meter
//
const boolean acnt = false; // true for serial monitor/debug
//
// variables
//
int qfe = 0; // Local barometric pressure
int dqfe = 0; // Local barometric pressure difference between 2 sensor reads cycle
int pqfe = 0; // Local barometric pressure of the previous read cycle
int qnh = 0;  // Barometric pressure calculated at sea level
int i = 0; // Loop control
boolean fqfeup = false; // flag mem qnh up
boolean fqfedown = false; // flag mem qnh down
byte blqfe = 0 ; // number of cycles before clearing flags mem qfe up or down
//
void setup()
{
  if (acnt) {
    Serial.begin(9600);
    Serial.println(" ");
    Serial.println("*******************************************************");
    Serial.println(" ");
    Serial.println("BARO1-1-guyvano restarted!");
  } else {};
  //
  //   Define pins modes
  //
  pinMode(predled, OUTPUT);
  pinMode(pgreenled, OUTPUT);
  pinMode(pblueled, OUTPUT);
  //
  // Sensor
  //
  bme.begin(0x76);    // address of the BME280 I2C sensor
  //
  // LED check
  //
  digitalWrite(predled, HIGH);
  delay(500);
  digitalWrite(predled, LOW);
  digitalWrite(pgreenled, HIGH);
  delay(500);
  digitalWrite(pgreenled, LOW);
  digitalWrite(pblueled, HIGH);
  delay(500);
  digitalWrite(pblueled, LOW);
  //
  qfe = bme.readPressure() / 100.0F;
  qnh = qfe + (myaltitude * 0.1205);
  pqfe = qfe;

}

void loop()
{
  qfe = bme.readPressure() / 100.0F;
  qnh = qfe + (myaltitude * 0.1205);
  dqfe = qfe - pqfe;
  //
  if ((dqfe > 0) & ~(fqfeup)) {
    blqfe = 20; // 20 corrisponds to 10 minutes blinking when a cycle is 30 seconds
    fqfeup = true;
    fqfedown = false;
  } else {};
  //
  if ((dqfe < 0) & ~(fqfedown)) {
    blqfe = 20; // 20 corrisponds to 10 minutes blinking when a cycle is 30 seconds
    fqfeup = false;
    fqfedown = true;
  } else {};
  //
  // QFE +/- blink conditions
  //
  if (fqfeup) {
    digitalWrite(predled, LOW);
    digitalWrite(pgreenled, LOW);
    delay(200);
    for (i = 0; i < 5; i++ ) {
      digitalWrite(pgreenled, HIGH);
      delay(100);
      digitalWrite(pgreenled, LOW);
      delay(200);
    };
    blqfe = blqfe - 1;
  }
  else {};
  if (fqfedown) {
    digitalWrite(pgreenled, LOW);
    digitalWrite(predled, LOW);
    delay(200);
    for (i = 0; i < 5; i++ ) {
      digitalWrite(predled, HIGH);
      delay(100);
      digitalWrite(predled, LOW);
      delay(200);
    };
    blqfe = blqfe - 1;
  }
  else {};
  if (blqfe < 1) {
    fqfeup = false;
    fqfedown = false;
  }
  else {};
  //
  //   Long light on conditions
  //
  if (qnh < anticyc) {
    digitalWrite(predled, HIGH);
    digitalWrite(pgreenled, LOW);
  }
  else {
    digitalWrite(pgreenled, HIGH);
    digitalWrite(predled, LOW);
  };
  //
  // serial control values
  //
  if (acnt) {
    Serial.println(" ");
    Serial.print("qnh:");
    Serial.print(qnh);
    Serial.print(", qfe:");
    Serial.print(qfe);
    Serial.print(", pqfe:");
    Serial.print(pqfe);
    Serial.print(", dqfe:");
    Serial.print(dqfe);
    Serial.print(", blqfe:");
    Serial.print(blqfe);
    Serial.print(", fqfeup:");
    Serial.print(fqfeup);
    Serial.print(", fqfedown:");
    Serial.print(fqfedown);
  } else {};
  //
  pqfe = qfe;
  //
  delay(30000);  // 30000 means 30 seconds to wait before a new cycle
}

// End of the program - Thanks for watching !

... habillage avec un petit tube en papier ...

edit 14/02/2021 : new program release available here!

*** Guy F8ABX - 11-14/02/2021 ***


Aucun commentaire:

Enregistrer un commentaire