Le Matériel :
En premier, on va choisir un microcontrô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 . On peut, si on le souhaite, utiliser 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 .

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"
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)

Ainsi qu'un bouton 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. Et si l'on ne veux pas afficher les valeurs mini et maxi de la température, celui-ci est facultatif .
Et c'est tout ! il n'y a rien de plus ... Il est temps de passer au schéma !
Le schéma :

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 !
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, notre bouton poussoir, qui pour le premier permet d'afficher la température Mini/Maxi pendant cinq secondes suite à un appui . Revenons à notre 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 dessu fait passer son entrée au potentiel GND. L'analyse de l'état logique de cette entrée est dans la boucle du programme qui les scrute en permanence . Cette action 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 :
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. Le bouton est monté côté soudure, ainsi que l'écran 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 reçoit un connecteur sécable type tulipe femelle; sur le circuit ce sera une rangée doubles picots mâle/mâle. Le module ESP32 est soudé 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 !

La programmation :
Le programme est développé et téléversé avec l'IDE Arduino. 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, çà 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 éclaircir 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
- 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(15,INPUT_PULLUP);
- Scrutation du bouton dans la boucle et action si activé
// Si le bouton 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 ASCII standarts sur les caractères accentués
// 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.
Le câble d'alimentation passe à l'intérieur et sort à 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 Dominos'.
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 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 .
Meteoesp tft v2 (364.18 Ko)
