Station météo sans capteur

Pas de capteur (Ou comment extraire des données du site météo... )

Meteo esp32 kmr2

      Encore une ! Oui mais celle-ci est capable de nous fournir une multitude d'informations et tout ça sans capteur extérieur, simplement en allant les chercher sur un site internet via la boxe de la maison et gratuitement bien sûr . Bon, qu'est-ce qu'on voit là dessus :

  • L'heure locale pour commencer (c'est pratique bien que tous les autres le fassent aussi... )
  • La ville ou le village concerné par cette météo (on va dire "la localisation géographique" )
  • L'aspect météorologique: Nuageux, pluvieux, ciel dégagé, légères pluies, neiges, ensoleillé, etc etc 
  • Evidement la température extérieure, sous abris, avec en option le mini et le maxi de la journée par appui sur le bouton
  • La pression atmosphérique en hecto pascal pour apprécier l'évolution ou la dégradation du temps et prévenir des crises rhumatismales 
  • L'humidité ambiante en pourcentage de saturation dans l'air 
  • La vitesse  en Km/h et la direction du vent par changement de la couleur de ce nombre ! Le vent du Nord est en blanc, la bise de l'Est, Nord-Est est en bleu, le vent du Sud et Sud-Est apparait en rouge et le vent d'Ouest, Nord-Ouest s'affiche en vert .
  • Et tout en bas, l'adresse IP juste pour savoir si la connexion est toujours opérante ...

      La luminosité de l'écran est ajustable pour limiter le détournement d'attention, s'il est posé sur un bureau . Et pour l'alimentation, une prise USB ou un vieux bloc secteur de recharge de smartphone ( on en a plein les fonds de tiroirs  ) 

Meteo esp32 vue

Et comme tout évolue ... Voici la version beaucoup plus compacte !

Meteo esp32 kmrv2      Sur les conseils de mon entourage, j'ai fait évoluer la chose ... Nous les électroniciens, restons trop souvent obnubilés par la partie technique du projet, au détriment de son aspect. Donc parfois un peu de rappel à l'esthétique par un oeil extérieur, ne peut qu'être profitable. Si l'électronique et le programme sont restés les mêmes ou sensiblement, le boîtier et le circuit ont été totalement modifié et c'est ce qui est raconté dans les lignes qui suivent ...

 

Mais comment est-ce possible ?

Le Matériel :

       En matos, il n'y en a même pas pour 10 balles ! Déjà parce qu'il y a très peu de choses et ensuite les fournisseurs habituels d'Asie, bien qu'ayant lourdement remonté leurs prix, restent compétitifs si l'on est pas trop pressé . En premier, on va choisir un micro contrôleur capable de se connecter sur le réseau et comme j'ai l'habitude des ESP32, pourquoi en changer ? Il est largement puissant et suffisant pour cette application . La seule chose que j'ai changée, c'est un modèle avec antenne extérieure; simplement parce que le gain est plus grand qu'avec une antenne sérigraphiée, donc la distance d'utilisation s'en trouve accrue  .

Esp32 wroom 32u

L' ESP32 intègre une antenne RF, un amplificateur de puissance, des amplificateurs à faible bruit, les filtres, les modules de gestion de l'alimentation sur une petite surface de circuit imprimé.
Cette carte utilise un Wi-Fi et Bluetooth bi-mode de 2.4 GHz par la technologie de faible puissance TSMC 40nm, sûre, fiable et évolutive pour une variété d'applications. Prise en charge du protocole LWIP, Freertos et supporte les trois modes normalisés: AP, STA et AP + STA
Un grand nombres d'I/Os et de protocoles de communication ... Et le tout, développable et programmable avec l'IDE Arduino  ! Un régal ...

 

 

 

 

 

 

      En suite, il nous faut un écran pour afficher les valeurs importées ! Un grand choix s'offre à nous : les petits écrans I2C OLED de 0,96" sont bon marché mais vu le paquet d'informations disponibles, il sont trop petits, sauf à faire défiler les données, avec tout les inconvénients que ça engendre . Les plus  grands sont hors de prix et nécessitent des dimensions de boitier énorme, qui corrompent l'aspect initial désiré ! Je me suis donc orienté vers un écran de 1,8" 

Ecrantft spi 1 8 Module d'affichage LCD TFT ST7735, 1.8 pouces, résolution 128x160 pixel, Interface série SPI, avec driver ST7735R . Interfaçage: RESET, CS , A0  (registre de contrôle IO sélectionné) ,SDA  (transmission de données),  SCL (synchronisation IO bus SPI ),  BL (rétro-éclairage à led sous  3.3V)

 

 

 

 

 

 

 Multi dices r470    Une résistance de 100 ohms-1/4 de watt (facultative seulement si l'on utilise le réglage de l'intensité lumineuse du rétro-éclairage ).

 

Bouton push

       Ainsi que deux boutons poussoir ! Avec un empattement de 6,5 par 4,5 mm ils sont capable de commuter plusieurs millions de fois, un contact normalement ouvert, avec une résistance de contact inférieure à 100 mili-ohms. Si l'on désire ne pas utiliser la variation d'intensité des leds du rétro-éclairage, un seul bouton suffit .

       Et c'est tout ! il n'y a rien de plus ... Il est temps de passer au schéma !

 

 

Le schéma :

Meteo esp32 sch       Le tour du propriétaire va être très rapide, grâce à un grand niveau d'intégration sur le circuit ESP32 et de multiples possibilités qu'il nous offre pour un mini prix ... Les nostalgiques des années 80, avec le 6502 ou le Z80, vont regretter les belles cartes au format Europe qui ne réalisaient qu'une infime partie de ce que peut faire notre circuit. Des fois, c'est quand même beau le progrès !

      Donc, on va alimenter le circuit par une tension de 5 volts qui rentre sur le connecteur JP1; celle-ci est issue d'une fiche USB d'un PC ou d'un quelconque appareil à proximité, voir d'un vieux bloc secteur de smartphone ou autre, suivant l'endroit où l'on utilise la station. Ce 5 volts (VIN) est ramené a 3,3 volts (VCC) par le régulateur intégré sur la platine de l'ESP32 et alimente l'afficheur TFT_KMR_1.8 pour son fonctionnement !

      Un jumper à deux positions (JP2), permet de choisir le mode plein éclairage ( les leds seront alimentées en plein avec du 3,3 volts ) ou d'utiliser une sortie PWM (Modulation de Largeur d'Amplitude) pour réduire l'éclairement des leds. Une résistance de 100 ohms (R1) est là pour limiter le courant à  33mA et protéger la sortie du µcontrôler.

      L'écran d'affichage est piloté par un driver intégré (ST7735R) qui a besoin de 5 informations pour valider, synchroniser, séparer, les fonctions d'affichage ! Toutes les pins inutilisées servent pour l'accès au support de la carte SD, derrière le TFT  et qui ne sert pas dans cette application .

      En haut à gauche, nos deux boutons poussoir, qui pour le premier permet d'afficher la température Mini/Maxi pendant cinq secondes suite à un appui . Et l'autre, agit sur la largeur des impulsions de modulation des leds de rétro-éclairage, dans le cas où l'option est validée par le cavalier JP2.  

      Revenons à nos boutons : pas de résistance de pull-up ! He oui car cette possibilité peut être déclarée par logiciel et simplifie encore bien plus le schéma. Une action sur les boutons fait passer son entrée au potentiel GND. L'analyse de l'état logique de ces entrées est dans la boucle du programme qui les scrute en permanence . Pour le rétro éclairage, une valeur maxi de 255 est donnée au setup et l'appui sur le bouton va décrémenter par tranche de 25 la largeur des impulsions tant que l'on maintient le poussoir pressé . Quand la valeur atteint 0  elle est remise à 255 au prochain pas ! 

      L'appui sur le deuxième bouton, efface l'écran dans le rectangle de la valeur des température, réduit la taille des caractères, et affiche les valeurs mini/maxi extraites des datas fournies par le site connecté, et ce, pour une durée de 5 secondes .

 

Un morceau de bakélite pour supporter tout ça :

Meteo esp32 pcb

      Pas de souci pour la réalisation du circuit : il n'y a rien dessus ! C'est un circuit simple face, pour rester faisable par l'amateur, avec quelques straps. Les boutons sont montés côté soudure et le reste de l'autre côté . Attention cependant, car par rapport au schéma j'ai dû user de la symétrie de retournement du connecteur  de l'afficheur pour pouvoir le monter ainsi ! Si quelqu'un utilise un autre boîtier, genre Heiland transparent, il ne faut pas oublier de remettre la connectique dans le bon sens ! L'écran TFT et le module ESP32 sont soudés sur support : pour l'un ça facilite la mise en boîte et pour l'autre, ça permet de le libérer de tout potentiel ou impédance lors de la programmation ! 

      Et pour ceux qui préfèrent une version plus miniaturisé, voici ce que l'on peut faire avec les fichier contenus dans le zip Version 2 :  C'est beaucoup plus compact ...

Meteoesp32 tft v2 cmp

 

La programmation :

        Le programme est développé et téléversé avec l'IDE Arduino (je n'ai pas encore essayé la version 2 Beta ) ... Après avoir mis dans les "Préférences " du gestionnaire de cartes supplémentaires" https://dl.espressif.com/dl/package_esp32_index.json ", on se rend sous l'onglet "outil", et dans le type de carte, on choisi:"ESP32 Dev Module " sur le port com adéquat, avec le driver CP210x ou CH34x préalablement installé . Vive l'Open Source, ça m'a permis de copier des morceaux de programmes existants, ça et là, sans avoir à les recréer . Le listing est riche en commentaires donc je ne vais pas écrire pour écrire, car il est  long, mais relativement simple .

      Je ne vais eclaircire que ce qui sort de l'ordinaire: l'intégralité des fichiers se trouve dans le zip plus bas .

  • GPIO de commande de l'afficheur 

// Pin de raccordement de la gestion de l'afficheur sur l'ESP32
#define TFT_DC     2       // registre du Data Control
#define TFT_RST   4         // Pin de reste de l'afficheur par l'ESP32
#define TFT_CS   5       // Validation de l'affichage

 

  • Chaînes de caractères à renseigner pour la connexion à la boxe  

const char* ssid     = "Xxxxbox-ZZSSZZ";// A MODIFIER PAR VOTRE SSID 

const char* password = "AbcdEfghIjKlMon1";// A MODIFIER PAR VOTRE PASSE

  • Renseignement du lieu géographique à extraire (Ville & Pays )

String town="Dijon";// A MODIFIER PAR VOTRE VILLE 
String Country="FR";// A MODIFIER SI AUTRE PAYS

  • Clé d'accés fournie par l'enregistrement sur le site sonnecté 

const String endpoint = "http://api.openweathermap.org/data/2.5/weather?q="+town+","+Country+"&units=metric&lang=fr&APPID=";
const String key = "vlujkuhjvkunjhksjtfusykygik"; // A MODIFIER PAR LA CLEF DE L'API

  • Chaîne de caractères au format .doc extraite du site

String payload=""; // Chaine de caractère entière extraite par json 

  • La sortie PWM sur ESP32 ne se gère pas comme sur un arduino Uno ou Nano (Il faut définir un canal, une fréquence de découpage, la pin de sortie et le Nb de bits de résolution  )

int pwmChannel = 0; //Choisit le canal 0
int frequence = 1000; //Fréquence PWM de 1 KHz
int resolution = 8; // Résolution de 8 bits, 256 valeurs possibles
int pwmPin = 16;

  • Que l'on retrouve dans le setup pour asservissement

   // Configuration du canal 0 avec la fréquence et la résolution choisie
    ledcSetup(pwmChannel, frequence, resolution);
    // Assigne le canal PWM au pin 16
    ledcAttachPin(pwmPin, pwmChannel);
    // Créer la tension en sortie choisi
    ledcWrite(pwmChannel,255); //3.3V

  • Sens du DDR des boutons avec les résistances logicielles de tirage au niveau logique haut

// Orientation du registre des entrées des boutons
   pinMode(0,INPUT_PULLUP);
   pinMode(15,INPUT_PULLUP);
   

  • Scrutation des boutons dans la boucle et action si activé 

//Si le bouton 1 est pressé => diminution du rétro-éclairege 
  if(digitalRead(15)==0){
    b=--b;
   }
  if(b<1){ 
    b=10;
   }
  retroLed = (b * 25 ); //Création de la valeur du rétro-éclérage
// Créer la tension en sortie choisi
   ledcWrite(pwmChannel, retroLed); //Tension variable
    
// Si le bouton 2 est pressé --> affichage de la tempéraure Mini maxi pendant 5 sec 
   if(digitalRead(0)==0){
    if(press1==0){
      press1=1;// anti rebond
        tft.fillRect(0,85,55,20,ST7735_BLACK);//Fond de la température
        tft.setTextSize(1);
        tft.setCursor(3, 90);
        tft.println(tmpMin+"min");
        tft.setCursor(3, 98);
        tft.println(tmpMax+"max");
       delay (5000);
     tft.fillRect(0,85,55,20,ST7735_BLACK);//Fond de la température
    }
   else press1=0;
   }

  • Changement de la couleur d'affichage suivant la direction du vent 

     if ((windSens > 29)and (windSens <120) ) {
          tft.setTextColor(ST77XX_RED);
      }
      if ((windSens > 119 )and(windSens < 240)) {
          tft.setTextColor(ST77XX_BLUE);
      }
      if ((windSens > 239) and (windSens < 301)) {
          tft.setTextColor(ST77XX_GREEN);
      }
          tft.setCursor(75, 125);
          tft.println(wind.substring(0,3));

  • Dans le sous programme 'getData' , récupération de la chaine de caractères, après contrôle de la connexion active, et transformation en caractères ASCII 

  if ((WiFi.status() == WL_CONNECTED)) { //Contrôle de l'état de la connexion

    HTTPClient http;
 
    http.begin(endpoint + key); //Specify the URL
    int httpCode = http.GET();  //Make the request
    if (httpCode > 0) payload = http.getString();
    http.end(); //Libère les ressources
  }
 char inp[1000];
 payload.toCharArray(inp,1000);
 deserializeJson(doc,inp);
   
  String tmp2 = doc["main"]["temp"];
  String tmp3 = doc["main"]["temp_min"];
  String tmp4 = doc["main"]["temp_max"];
  String pres2 = doc["main"]["pressure"];
  String wind2 = doc["wind"]["speed"];
  String deg2 = doc["wind"]["deg"];
  String hum2 = doc["main"]["humidity"];
  String town2 = doc["name"];
  tmp=tmp2;
  tmpMin=tmp3;
  tmpMax=tmp4;
  hum=hum2;
  pres=pres2;
  wind=((wind2.toInt())* 3.6); //Remplace la chaine de caractère et les m/s par Km/h
  deg=deg2;
   
//On sort la meteo en cours 
  String meteo1 = doc["weather"];//                                     
  int test = meteo1.indexOf("description")+14;//14 = chaque lettre du mot "description" en comptant les guillemets !
  String meteo2 = meteo1.substring(test,test+meteo1.length()-1);
  test = meteo2.indexOf(",")-1;
//Sortie de la meteo mais avec des accents
  String meteo = meteo2.substring(0,test);

  • Remplacement des caractères accentués en caractères ASCII standarts

//    REMPLACEMENT DES ACCENTS PAR LES LETTRES SANS ACCENT
  meteo.replace("é", "e");
  meteo.replace("è", "e");
  meteo.replace("ê", "e");
  meteo.replace("à", "a");

      Voilà, ce qui est intéressant et particulier dans ce programme; je vais m'amuser un peu sur d'autres sites pour me familiariser avec l'extraction de données ! ça évite de tout recopier et d'exploiter ces données, par exemple  pour déclencher des automatismes spécifiques à certaines applications en combinant GPS et Datas ! Mais c'est un autre sujet .... 

 

Et maintenant l'habillage ...

      Comme d'habitude, j'utilise l'imprimante 3D pour sortir un boîtier personnalisé, mais rien n'empêche de prendre un coffret Heiland cristal ( de plus en plus difficile à trouver ) transparent ou autres coffrets n'ayant que pour limites notre imagination . Le boîtier se compose de 4 parties: le dessus, le dessous, le cache avant et le pied ...  Toutes sont dessinées avec le fabuleux logiciel Design Spark Mechanical puis exportées en format stl et imprimées en différentes couleurs . La partie supérieure tient l'électronique, vissée sur des bossages, ainsi que par un des trous de l'écran. Deux trous laissent dépasser les poussoirs des boutons: ces orifices doivent être alésés avec un jeu certain pout ne pas gêner la remontée des tiges de commandes . 

      L'antenne est vissée sur la face arrière et le pied est collé sur le dessous à la néoprène. Le câble d'alimentation passe à l'intérieur et ressort à la base de celui-ci pour une raison évidente d'esthétique qui m'a été notifiée par ma femme lors de la réalisation de l'horloge à affichage 'style Dés'.

Meteo esp32 av box

 

Tout le nécessaire à la réalisation :

      Je donne tout (sauf mes codes perso, évidement  ) Donc après avoir renseigné les identifiants et le mot de passe de la boxe, il est nécessaire de s'enregistrer sur le site :  https://openweathermap.org/api  et de demander une clé d'accès aux données. Si l'on ne choisi pas d'options spéciales, cette clé est gratuite ... Il ne reste plus qu'a renseigner les champs spécifiés et la réalisation devrait se connecter sans problème sur le site via la boxe familiale .

Meteo esp32 kmrMeteo esp32 kmr (740.49 Ko)

      Et les fichiers de réalisation de la version 2 (bien simplifiée et miniaturisée )

Meteoesp tft v2Meteoesp tft v2 (364.18 Ko)

Meteo esp32 kmrv2

 

Commentaires

  • Di Mascio
    Superbe projet et merci pour le partage.

Ajouter un commentaire