Je mets une petite laine pour sortir ?

Le facteur est passé et il fait frais ....

Wifi station pres

            Non, non, non ce n'est pas seulement un thermomètre d'extérieur ! Ca fait beaucoup plus ... La boîte, placée suivant ce que vous voulez, va connecter votre box et vous donner une multitude d'informations sur votre Smartphone ou sur votre PC puisque vous y êtes asservis par le télétravail . Qu'est-ce que l'on trouve là dessus ?

  • La température bien sûr (bon les centièmes de degrés, c'est un peu de la frime )
  • L'hygrométrie ( la photo a été prise un jour de pluie ...)
  • Le baromètre donne la pression atmosphérique ( là, j'ai l'impression que le temps s'améliore )
  • Une fenêtre indique la pollution atmosphérique IQA (indice de qualité de l'air ) Cet indice est obtenu par la mesure de la suspension des particules de carbone flottantes dans l'air et qui joue sur sa conductibilité ... Les autres polluants ne sont pas pris en compte sauf si ils influent sur la résistance galvanique du gaz que nous respirons !
  • La tension de la batterie est également affichée pour avoir une idée sur l'autonomie restante de l'analyseur !
  • Et la dernière fenêtre me dit si le facteur est passé et depuis combien de temps, en minutes ( J'ai monté un aimant sur le volet de la boîte aux lettres qui libère un interupteur REED normalement fermé, en tombant, par l'ouverture de ce volet lors de l'introduction du courrier ! )
  • .... ( Et ce n'est pas figé, le but est que chacun puisse l'adapter à ses besoins )

           L'autonomie de l'ensemble étant assurée par une batterie rechargée par des cellules photovoltaïques. Il faut tout de même veiller à rester dans la portée du réseau Wi-Fi de la boxe, sinon il faudra user de quelques artifices pour en augmenter la portée .

Vue de la page sur Smartphone:

 Wifi station smrt1 Wifi station smrt2

 

Vue de l'écran PC :

Wifi station pc 

 

 

Le couple idéal: BME680 et ESP 32

Qui fait quoi ?

Wifi station sch

 

          Un ESP32 de chez Espressif (Devkit V4) va s'imposer comme pièce maîtresse pour gérer toutes les fonctions, ainsi que la communication Wi-Fi ! Une autre communication, en I2C celle-ci, avec un circuit BME680 permet à l'ESP d'obtenir les valeurs de température, hygrométrie, pression et résistance de l'air (pollution aux particules de carbone) . En effet, le circuit BME680, pour une petite pièce de moins de 2 Euros, peut faire les mesures précitées et les communiquer via deux moyens: soit en  SPI ou en bus I2C (le moyen retenu dans mon cas )

Wifi station bme680

          Ce module s'alimente sous 3,3 volts bien que le 5 volts soit accepté également; mais comme j'utilise un module de régulation de charge, je prends ce qui sort de ce dernier . La mise en oeuvre est relativement aisée car le Gitub du net nous fourni tous ce dont nous avons besoin ...

          Une entrée GPIO 4 est déclarée pour recevoir un bouton qui est tiré à l'état logique de VCC à travers une résistance de 47 K (La fonction PULL_UP ne semble pas exister sur toutes les entrées du ESP ...) Et c'est sur cette dernière que je vais raccorder mon interrupteur ILS qui me détectera l'ouverture du volet de la boîte aux lettres, par la séparation de l'aimant, pour m'afficher qu'il y a du courrier depuis tant de minutes ....

          Cette entrée peut servir à plein d'autres choses suivant ce que l'on souhaite visualiser  => la fermeture du contact lance le comptage qui est fait par incrémentation de boucle, puisque les analyses ont été réglées à la minute . Un exemple qui peut s'avérer utile; c'est le contrôle de l'ouverture de la porte de garage ou du portillon ! En asservissant cette entrée au même interupteur REED on pourra depuis le PC ou le Smartphone en contrôler l'état, sans avoir à se déplacer (je suis en train de contribuer à l'obésité de la France ).

          Une autre entrée est intéressante aussi, c'est l'entrée GPIO34 déclarée en analogique et qui mesure la tension d'alimentation du circuit; donc de la batterie  ... Via un potentiomètre multi tours de 25 Kohms, on ajuste la tension par comparaison, entre la valeur affichée et celle prise au multimètre, en procédant par itération jusqu'à ce quelles soient identiques ! On verra dans le logiciel comment est traitée cette mesure ...

Wifi station pot

          Un circuit TP4056 assure les fonctions de gestion, de la protection de charge à maxi 4,2 volts de la batterie et de sa décharge à la tension mini de 3;2 volts. Ce circuit va recevoir son énergie de petits panneaux photovoltaïques, ou d'une entrée Mini-USB  pour réguler la charge de l'accu LI-Ion de 3,6 volt 1400 mA !

Wifi station chg1

          Une LED rouge est allumée pendant toute la charge et une verte s'éclaire en fin de cycle ... Pour une pièce de 1 €, les Chinois vous fournissent une barrette de 5 circuits, sécables individuellement et sérigraphiés sur chaque pad de connexion . Que du bonheur !

          Sur le prototype, j'ai mis une batterie de Li-Ion de 3,6 volts 1400 mA et je me suis vite rendu compte que c'était insuffisant ... hé oui dans l'Est, nous n'avons pas du soleil tous les jours et j'ai dû en doubler la capacité car le ESP32 consomme environ 70 mA et sur 24h de météo sombre, je tombais en rade comme avec une voiture électrique !

          Sur le circuit, j'ai également inclus un jumper (cavalier enfichable), qui permet de couper l'alimentation du circuit, et ne le mettre en service que lorsque l'on en a besoin ! Si l'on sort cette connexion, on peut y adjoindre n'importe quel switch, interrupteur ou contact pour économiser la batterie premièrement, et n'avoir les informations que dans un cas bien défini par la commutation de ce dernier .

Wifi station jumper

          Un autre problème est vite apparu avec les panneaux photovoltaïques : à la vue des datasheets fournies, (5 volts 0,5 watt ) j'en ai mis deux et ils se sont vite révélés bien pauvres: je ne récupérais que quelques milliampères => pas assez pour charger correctement la batterie ! Les caractéristiques données sont un peu prétentieuses par rapport à la réalité . Pour avoir un fonctionnement convenable, il a fallu que je multiplie par 4 (donc 8 cellules ) et que je les monte en série /parallèle . Naturellement la surface occupée n'était plus la même et dépassait largement de la surface du couvercle du boîtier que j'avais initialement réservée à cette fonction .... On va faire avec, tant pis pour l'esthétique .

 

Le Circuit Imprimé:

          Tout petit, le PCB reçoit les éléments et connecteurs de raccordement . C'est du simple face, pour être réalisé par l'amateur, et panache des composants dit traversants et de surface ! Un soin bien évident est à apporter lors du perçage sur l'alignement des rangées de trous . Les CMS et le strap sont à souder les premiers puis les autres; et enfin le ESP32 ! Sur ce dernier je n'ai soudé que les pinuches qui sont en service afin de le remplacer facilement si la nécessité devait s'imposer...

Wifi station prnt

Wifi station pcb1   

 

La mise en boîte :

          Le boîtier est réalisé à l'imprimante 3D... Avec des compartiments pour recevoir le circuit, et des bossages pour les vis Parker de fixation. Un autre est réservé pour la batterie et un troisième pour le BME680. Ce dernier est ajouré pour permettre la circulation de l'air à évaluer ... Ce cloisonnage permet de limiter l'incidence thermique de l'accu et des autres circuits  sur la sonde de mesure ...

Wifi station inbox

          Le dessus du boîtier était censé recevoir les panneaux photovoltaïques, mais comme mentionné plus haut, j'ai dû en multiplier le nombre faute de ne pas m'être méfié du rendement. J'ai donc reconsidéré l'esthétique et collé ces cellules sur un cadre extérieur . Comme d'habitude, tous les fichiers de réalisation sont dans le fichier zip plus bas !

 

Et pour faire causer tout ça :

          Déjà un grand merci à Sarah et Rui Santo, pour le développement de la partie HTML du programme ! C'est l'avantage du freeware, je n'ai eu qu'a adapter ce qui était existant a ce que je veux faire ... (et le langage HTML, je n'ai jamais trop fricoté avec ... mais je vais approfondir, ça a l'air rigolo ) .

Je ne vais pas détailler tout le programme ici; les commentaires dans le squetch le font tout au long de la rédaction; je ne vais que décrire les passages spécifiques .

 

/*********************************************************************  
   Thanks to Sara & Rui Santos for the JavaScript part !
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
**********************************************************************/

//Appel des sous programmes utilisés
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#include <WiFi.h>
#include "ESPAsyncWebServer.h"

// Remplacer par les paramètres d'accès au réseau
const char* ssid = "Nom du réseau";
const char* password = "Clé du réseau XXXX";

Adafruit_BME680 bme; // Choix de la communication ==> I2C

//Déclaration des variables utilisées
float temperature;
float humidity;
float pressure;
float gasResistance;
float voltBattery = 34;
float volt;
float voltCalc;

const int buttonPin = 4;
int buttonState;
int passTim;


AsyncWebServer server(80);
AsyncEventSource events("/events");

unsigned long lastTime = 0;
unsigned long timerDelay = 60000;  //Règle l'interval de lecture


// Impose au BME680 de commencer les mesures 
void getBME680Readings() {

  unsigned long endTime = bme.beginReading();
  if (endTime == 0) {
    return;
  }
  if (!bme.endReading()) {
    return;
  }

  temperature = bme.temperature;
  pressure = (bme.pressure / 100.0) + 40;
//ajustement suivant baromètre étalon de l'altitude
  humidity = bme.humidity;
  gasResistance = 1 / (bme.gas_resistance / 230000.0);
// 1/R => plus il y a de carbone moins l'air est pur !
}

String processor(const String& var) {
  getBME680Readings();
  if (var == "TEMPERATURE") {
    return String(temperature);
  }
  else if (var == "HUMIDITY") {
    return String(humidity);
  }
  else if (var == "PRESSURE") {
    return String(pressure);
  }
  else if (var == "GAS") {
    return String(gasResistance);
  }
  else if (var == "VOLT") {
    return String(volt);
  }
  else if (var == "PST") {
    return String(passTim);
  }
}

//Elaboration de la page HTML (Merci Sara et Rui Santo)
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <title>BME680 Web Server</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <link rel="icon" href="data:,">
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    p {  font-size: 1.2rem;}
    body {  margin: 0;}
    .topnav { overflow: hidden; background-color: #4B1D3F; color: white; font-size: 1.7rem; }
    .content { padding: 20px; }
    .card { background-color: white; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); }
    .cards { max-width: 700px; margin: 0 auto; display: grid; grid-gap: 2rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
    .reading { font-size: 2.8rem; }
    .packet { color: #bebebe; }
    .card.temperature { color: #0e7c7b; }
    .card.humidity { color: #17bebb; }
    .card.pressure { color: #3fca6b; }
    .card.gas { color: #d62246; }
    .card.battery { color: #EE8F0E; }
    .card.button { color: #0EBEEE; }
  </style>
</head>
<body>
  <div class="topnav">
    <h3>Le Temps Chez Nous</h3>
  </div>
  <div class="content">
    <div class="cards">
      <div class="card temperature">
        <h4><i class="fas fa-thermometer-half"></i> TEMPERATURE</h4><p><span class="reading"><span id="temp">%TEMPERATURE%</span> &deg;C</span></p>
      </div>
      <div class="card humidity">
        <h4><i class="fas fa-tint"></i> HUMIDITE</h4><p><span class="reading"><span id="hum">%HUMIDITY%</span> &percnt;</span></p>
      </div>
      <div class="card pressure">
        <h4><i class="fas fa-angle-double-down"></i> PRESSION</h4><p><span class="reading"><span id="pres">%PRESSURE%</span> hPa</span></p>
      </div>
      <div class="card gas">
        <h4><i class="fas fa-wind"></i> POLLUTION</h4><p><span class="reading"><span id="gas">%GAS%</span> IQA</span></p>
      </div>
      <div class="card battery">
        <h4><i class="fas fa-battery-quarter"></i> BATTERIE</h4><p><span class="reading"><span id="volt">%VOLT%</span> Volt</span></p>
      </div>
      <div class="card button">
        <h4><i class="far fa-bell"></i> PASSAGE</h4><p><span class="reading"><span id="passTim">%PST%</span> Min</span></p>
      </div>
    </div>
  </div>
<script>
if (!!window.EventSource) {
 var source = new EventSource('/events');

 source.addEventListener('open', function(e) {
  console.log("Events Connected");
 }, false);
 source.addEventListener('error', function(e) {
  if (e.target.readyState != EventSource.OPEN) {
    console.log("Events Disconnected");
  }
 }, false);

 source.addEventListener('message', function(e) {
  console.log("message", e.data);
 }, false);

 source.addEventListener('temperature', function(e) {
  console.log("temperature", e.data);
  document.getElementById("temp").innerHTML = e.data;
 }, false);

 source.addEventListener('humidity', function(e) {
  console.log("humidity", e.data);
  document.getElementById("hum").innerHTML = e.data;
 }, false);

 source.addEventListener('pressure', function(e) {
  console.log("pressure", e.data);
  document.getElementById("pres").innerHTML = e.data;
 }, false);

 source.addEventListener('gas', function(e) {
  console.log("gas", e.data);
  document.getElementById("gas").innerHTML = e.data;
 }, false);
}

</script>
</body>
</html>)rawliteral" :

void setup() {
  pinMode(buttonPin, INPUT);

  // Reglage du circuit et du logiciel sur le point d'accès Wi-Fi
  WiFi.mode(WIFI_AP_STA);

  // Accorde le composant sur la sattion Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
  }

  // Initialisation du capteur BME680
  if (!bme.begin()) {
    while (1);
  }
 
// Réglage de la rampe et initialisation du filtre
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150); // 320*C for 150 ms


 
// Prise en charge du serveur Web
  server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/html", index_html, processor);
  });

  // Prise en charge des évenements du serveur Web
  events.onConnect([](AsyncEventSourceClient * client) {

  // envoi le message "hello", les milli-seconde en cours de l' id
  // et remet la reconnection à 1 seconde
    client->send("hello!", NULL, millis(), 10000);
  });
  server.addHandler(&events);
  server.begin();
}

void loop() {

  // Boucle pour une relecture après l'interval
  if ((millis() - lastTime) > timerDelay) {
    getBME680Readings();
    
 
// Lecture de la tension batterie
    voltCalc = analogRead(voltBattery);
    volt = (voltCalc * (4.9/4095));
    
 
// Lecture du temps depuis que le boutton est actif (comptage du Nb de boucle si bouton actif)
    buttonState = digitalRead(buttonPin); 
  if (buttonState==LOW) {
      passTim++;
  } 
  else {
    passTim = 0;
  }

    // Envoi les événements lus sur les capteurs, sur le web 
    events.send("ping", NULL, millis());
    events.send(String(temperature).c_str(), "temperature", millis());
    events.send(String(humidity).c_str(), "humidity", millis());
    events.send(String(pressure).c_str(), "pressure", millis());
    events.send(String(gasResistance).c_str(), "gas", millis());
    events.send(String(volt).c_str(), "volt", millis());
    events.send(String(passTim).c_str(), "passTim", millis());

    lastTime = millis();
  }
}

Et pour ceux qui sont intéressés, les fichiers de réalisation :

La version décrite plus haut; avec un module ESP32 

Meteo stationMeteo station (192.6 Ko)

Avant la réalisation, il est un site qui est une véritable encyclopédie et qu'il faut regarder impérativement :

          Ce site est une mine de connaissances; fort bien fait et très détaillés, il présente une arborescence qui permet d'aller directement sur ce que l'on cherche sans perdre de temps !  A garder précieusement dans les favoris et merci encore aux auteurs Sara & Rui Santos !

La mine d'or est ici :  https://randomnerdtutorials.com/

Si vous préférez la version ESP8266 :

Pour ceux qui se sentent plus à l'aise avec les modules ESP8266, j'ai développé, sur le même principe l'équivalence ! 

          Un gros avantage car il est moins capricieux à 'téléverser' avec l'IDE Arduino et offre la fonction "deepSleep" qui va mettre en sommeil le circuit pour une économie non négligeable de la batterie (~50 µA) .... Et on peut le réveiller avec le prince charmant (non pas du tout), par un puls low sur la borne RST venant de l'extérieur ou le timer interne par la liaison D0 sur RST. (n'établir cette liaison qu'après le téléversement du sketch sous peine de voir des gros mots s'afficher ) .... Hélas pendant le sommeil, il n'y a pas de liaison Wi-Fi ...

Meteo esp8266

Et dans le ZIP ci-joint les fichiers pour la deuxième réalisation :

Meteostation esp8266Meteostation esp8266 (217.87 Ko)

 

Pour résumer et conclure :

  • Il faut une bonne surface de panneaux photovoltaique si vous voulez une autonomie suffisante .
  • Pour avoir des mesures fiables, il ne faut pas laisser le boîtier en rayonnement direct avec le soleil; la mesure de tempétature se fait sous abri .
  • Il sera peut-être nécessaire de retoucher le logiciel pour l'adapter à votre altitude et pression atmosphérique ! Une comparaison avec le site local de météo France permet cet étalonnage .
  • J'ai décris la détection de présence de courrier dans la boîte aux lettres, mais le boîtier peut aussi bien contrôler la fermeture d'une porte, que la présence d'eau dans la cave, le niveau de remplissage des tonneaux de récupération d'eau de pluie ou le besoin d'arosage de votre cactus préféré; il suffit juste de changer l'intittulé du caption et le symbole de la case attribuée à cet effet et de mettre le capteur relatif à l'événement .
  • Si vous choisissez d'alimenter le montage par un bloc secteur à découpage, il faut assurer la protection électrique et IP adéquat afin de protéger dans les règles de l'art, toutes personnes qui entreraient en contact direct ou indirect avec l'objet ou un de ses composants ...

          En cas de grandes distances et si la couverture est insuffisante, je suis en train d'essayer d'augmenter la portée Wi-Fi ... Peut-être des antennes directives ou des module LoRa ! Dès les premiers résultats, je me ferai un plaisir de les publier . En tous cas bonne lecture et prenez soins de vous .

Ajouter un commentaire