Pub

samedi 13 février 2021

Mise à jour du programme BARO1-2 - new release for the simple but smart barometer

 Une nouvelle release avec une palette de couleur plus étendue pour voir de manière plus sympa l'évolution du temps et une alerte (en rouge) dans le cas où la pression chute rapidement.

Voici la version 1.2.0 du programme :

/* Program name: BARO1-2-guyvano.ino
   Author: Guy Vanoverbeke @GuyVano
   Program last update (dd/mm/yyyy) : 13/02/2021 (v.1 r.2 c.0)
   Arduino IDE V1.8.13
   Board: Arduino UNO R3
   Function: Using the BME280 sensor, we display the barometric pressure and trend on a single RGB LED.
     Fixed Purple + flashing Blue each 30 seconds :  
barometric pressure is low (QNH < 1023 hPa) and falling during last the 15 minutes.
     Fixed Indigo : barometric pressure is low.
     Fixed Blue + flashing Green each 30 seconds : barometric pressure is low and rising during the last 15 minutes.
     Fixed Green + flashing Blue each 30 seconds : barometric pressure is high (QNH => 1023 hPa) and falling during last the 15 minutes.
     Fixed Yellow : barometric pressure is high.
     Fixed White + flashing Green each 30 seconds : barometric pressure is high and rising during last 15 minutes.
     Fixed Red + flashing Red each 30 seconds : barometric pressure fast falling warning.
     If there is no variation for 15 minutes, the change and alert indicators are reset.
   Disclaimer:
   This program (in other words: this code, this software or this application) is a personal creation made as part of a hobby
   and it is given without guarantee of any kind and no support is provided. It is free of rights
   and can be reused freely as you wish.
*/

#include <Wire.h>
//
// I2C Temperature, humidity and barometric pressure sensor
//

#include <Adafruit_BME280.h>
Adafruit_BME280 bme;
//
//  Define the 3 pins of the RGB LED
//

const byte pblueled = 9;
const byte pgreenled = 10;
const byte predled = 11;
//
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 qfesf = 0; // Local barometric pressure stored at the begining of the falling period
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
boolean fqfewarn = false; // flag mem qnh fast 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-2-guyvano restarted! v.1 r.2 c.0");
  } 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);
  digitalWrite(pblueled, HIGH);
  delay(1000);
  digitalWrite(predled, LOW);
  delay(1000);
  digitalWrite(pgreenled, HIGH);
  delay(1000);
  digitalWrite(pblueled, LOW);
  delay(1000);
  digitalWrite(predled, HIGH);
  delay(1000);
  digitalWrite(pgreenled, LOW);
  delay(1000);
  digitalWrite(pblueled, HIGH);
  digitalWrite(predled, HIGH);
  digitalWrite(pgreenled, HIGH);
  delay(1000);
  digitalWrite(pblueled, LOW);
  digitalWrite(predled, LOW);
  digitalWrite(pgreenled, LOW);
  for (i = 0; i < 5; i++ ) {
    digitalWrite(pblueled, HIGH);
    digitalWrite(predled, HIGH);
    digitalWrite(pgreenled, HIGH);
    delay(100);
    digitalWrite(pblueled, LOW);
    digitalWrite(predled, LOW);
    digitalWrite(pgreenled, LOW);
    delay(300);
  };
  //
  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 = 30; // 30 corrisponds to 15 minutes blinking when a cycle is 30 seconds
    fqfeup = true;
    fqfedown = false;
    fqfewarn = false;
  } else {};
  //
  if ((dqfe < 0) & ~(fqfedown)) {
    blqfe = 30; // 30 corrisponds to 15 minutes blinking when a cycle is 30 seconds
    qfesf = qfe;
    fqfeup = false;
    fqfedown = true;
  } else {};
  //
  if ((qfesf - qfe) > 2 & (fqfedown)) {
    fqfewarn = true;
  }
  else {};
  //
  // QFE +/- flashing conditions
  //
  // UP (green flashing)
  //

  if ((fqfeup) & ~(fqfewarn)) {
    digitalWrite(pblueled, LOW);
    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 {};
  //
  // DOWN
  //

  if ((fqfedown) & ~(fqfewarn)) {
    digitalWrite(pblueled, LOW);
    digitalWrite(pgreenled, LOW);
    digitalWrite(predled, LOW);
    delay(200);
    for (i = 0; i < 5; i++ ) {
      digitalWrite(pblueled, HIGH);
      delay(100);
      digitalWrite(pblueled, LOW);
      delay(200);
    };
    blqfe = blqfe - 1;
  }
  else {};
  //
  // FAST FALLING WARNING
  //

  if (fqfewarn) {
    digitalWrite(pblueled, LOW);
    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;
    fqfewarn = false;
  }
  else {};
  //
  //   Long light on conditions
  //
  // depression and trend falling : Purple (R+G)
  //

  if ((qnh < anticyc) & (fqfedown)) {
    digitalWrite(predled, HIGH);
    digitalWrite(pblueled, HIGH);
    digitalWrite(pgreenled, LOW);
  }
  else {};
  //
  //  depression and stable : Indigo (B)
  //

  if ((qnh < anticyc) & ~(fqfedown) & ~(fqfeup)) {
    digitalWrite(pblueled, HIGH);
    digitalWrite(predled, LOW);
    digitalWrite(pgreenled, LOW);
  } else {};
  //
  // depression and trend rising : light blue (B+G)
  //

  if ((qnh < anticyc) & (fqfeup)) {
    digitalWrite(pblueled, HIGH);
    digitalWrite(pgreenled, HIGH);
    digitalWrite(predled, LOW);
  } else {};
  //
  // anticyclone and trend falling : green (G)
  //

  if ((anticyc <= qnh) & (fqfedown)) {
    digitalWrite(pblueled, LOW);
    digitalWrite(pgreenled, HIGH);
    digitalWrite(predled, LOW);
  } else {};
  //
  // anticyclone and stable : yellow (G+R)
  //

  if ((anticyc <= qnh) & ~(fqfedown) & ~(fqfeup)) {
    digitalWrite(pblueled, LOW);
    digitalWrite(pgreenled, HIGH);
    digitalWrite(predled, HIGH);
  } else {};
  //
  // anticlone and trend rising : white (R+G+B)
  //

  if ((anticyc <= qnh) & (fqfeup)) {
    digitalWrite(pblueled, HIGH);
    digitalWrite(pgreenled, HIGH);
    digitalWrite(predled, HIGH);
  } else {};
  //
  // Warning : red (R)
  //

  if (fqfewarn) {
    digitalWrite(pblueled, LOW);
    digitalWrite(pgreenled, LOW);
    digitalWrite(predled, HIGH);
  } else {};
  //
  // 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);
    Serial.print(", fqfewarn:");
    Serial.print(fqfewarn);
  } else {};
  //
  pqfe = qfe;
  //
  delay(30000);  // 30000 means 30 seconds to wait before a new cycle
}
// End of the program - Thanks for watching !


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


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


Aucun commentaire:

Enregistrer un commentaire