Station Météo IoT Portable avec Arduino Nano 33 IoT
Composants et fournitures
| Arduino Nano 33 IoT | 1 |
| Capteur météo BME280 (température, humidité, pression) | 1 |
| Écran OLED 0,96" 128×64 | 1 |
| Boîtier plastique 3,9" × 2,7" | 1 |
| Câble micro-USB | 1 |
| Fils de liaison mâle-femelle (breadboard) | 1 jeu |
| Chargeur secteur USB | 1 |
Outils nécessaires
- Pistolet à colle chaude
Applications et services en ligne
- Arduino IDE
- Blynk
À propos du projet
Il existe beaucoup d'applications pour connecter son smartphone à l'Internet des Objets. J'en ai testé plusieurs et ai souvent été déçu. Pas avec Blynk ! C'est flexible, interface soignée, compatible avec de nombreuses plateformes IoT, fonctionne sur Android et iOS, et gratuit pour les hobbyistes. Ce projet IoT relativement simple m'a permis d'explorer Blynk.
Matériel
Le hardware est simple : Arduino Nano 33 IoT (gère le Wi-Fi), capteur BME280 (température, humidité, pression barométrique en un seul module), écran OLED 1". Les trois fonctionnent en 3,3 V. L'écran est optionnel — l'objectif est l'affichage sur smartphone — mais il facilite grandement la mise au point avant d'intégrer Blynk.
Le schéma ci-dessous montre l'interconnexion. Capteur et écran utilisent l'I2C. En théorie un bus I2C supporte plusieurs périphériques, mais les bibliothèques du capteur et de l'écran avaient des conflits, donc j'ai utilisé deux ports I2C distincts :
- Capteur : port I2C par défaut sur broches analogiques A4 (SDA) et A5 (SCL).
- Écran : second port I2C sur broches numériques 4 (SCL) et 5 (SDA). (Note : ils sont inversés — SDA est sur la broche numérique 5.)

Le tout est logé dans un petit boîtier plastique à face transparente (pour voir l'écran). Le plastique est nécessaire pour la transparence aux RF (Wi-Fi). Le boîtier doit être relativement étanche, mais le capteur est exposé à l'air extérieur par un trou de 1/2" en bas. Le capteur est positionné juste à l'intérieur de ce trou. Fixation à la colle chaude (pour l'extérieur en été, préférez l'époxy).
L'alimentation passe par le câble USB : programmation ou alimentation par un seul câble sortant du boîtier. Branché sur l'ordi pour programmer, sur un chargeur USB secteur pour l'usage station météo.
Logiciel
Le code sur l'Arduino est un assemblage des exemples des bibliothèques : capteur, écran, Blynk. Bibliothèques utilisées :
Adafruit_BME280_Librarypour le capteurss_oledpour l'écran OLEDBlynkpour Blynk
Toutes disponibles via le gestionnaire de bibliothèques Arduino. Testez chacune séparément pour bien les comprendre.
Blynk propose des exemples de configuration hardware : examples.blynk.cc. Malheureusement, le Nano 33 IoT n'est pas listé parmi les Arduino supportés. Mais Blynk supporte WiFiNINA, utilisé par le Nano 33 IoT. Il suffit d'ajouter :
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
Autre ajout dans mon code : #include <avr/dtostrf.h> pour convertir les valeurs numériques du capteur en chaînes adaptées à l'affichage OLED. Un point m'a bloqué : Blynk accepte d'afficher les données qu'elles soient envoyées comme chaîne ou nombre. Au début j'envoyais la même chaîne qu'à l'OLED. Ça marchait pour l'affichage, mais échouait totalement pour les graphiques. Pour les graphiques, Blynk a besoin de vrais nombres.
Note sur la pression barométrique : elle est normalement corrigée au niveau de la mer. En altitude, la pression chute. Pour corriger la valeur du capteur à son équivalent niveau de la mer, ajoutez environ 1 pouce Hg (inHg) par 1000 pieds d'altitude. Dans mon code, j'ai ajouté 1.3 pour mon altitude de 1300 pieds. Adaptez cette valeur à votre altitude. Le 1 inHg / 1000 ft est une approximation ; pour une correction précise, consultez des tables en ligne.
Station météo sans Blynk
À ce stade, vous pouvez monter le hardware et utiliser mon logiciel joint pour afficher les données météo sur l'OLED. Commentez simplement la ligne Blynk.begin() dans setup() pour faire tourner la station sans Blynk. (Sans cette mise en commentaire, sans connexion Blynk valide, le sketch bloque à cet endroit.) La section suivante couvre l'intégration Blynk.
Blynk
Blynk s'installe facilement sur iPhone/Android avec doc détaillée : docs.blynk.cc. Mais il y a tant d'infos et d'options que j'ai trouvé ça confus au début. Voici ma version simplifiée pour démarrer.
J'ai utilisé Blynk sur iPhone, l'expérience Android est similaire. Une fois l'app installée, créez un compte. Dans l'app, créez un nouveau projet. Il reçoit un code d'authentification pour lier votre hardware. Première mission : connecter le hardware via Wi-Fi à votre projet Blynk. Testez avec le sketch par défaut Blynk Blink (examples.blynk.cc) qui allume/éteint la LED intégrée du Nano 33 IoT (broche 13). Faites-le marcher avant d'attaquer la station météo.
Configuration du sketch pour Nano 33 IoT : sur examples.blynk.cc, le défaut est ESP8266. Remplacez :
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
par :
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
Ajoutez vos identifiants Wi-Fi et le code d'auth du projet Blynk. On verra le contrôle de la LED dans un instant, mais d'abord vérifions la connexion. Avec le sketch Blynk Blink bien configuré et en cours, ouvrez le Moniteur Série Arduino : vous verrez la connexion au serveur cloud Blynk. À ce stade, on peut laisser le hardware de côté et travailler sur l'app Blynk du téléphone.
L'app Blynk m'a paru un peu déroutante. L'icône en haut à gauche permet de changer de projet ou se déconnecter. Celle en haut à droite entre/sort du mode Édition. Celle du milieu fait selon le contexte.

Pour contrôler la LED intégrée : mode Édition → écran vide → glisser vers la gauche pour afficher la boîte à outils → sélectionner « Button » → il apparaît sur l'écran principal → cliquer pour configurer → passer de mode « Push » à « Switch » → Pin Select → choisir broche 13 (LED intégrée du Nano 33 IoT) → OK → quitter le mode Édition (icône haut droite). Le bouton contrôle maintenant la LED.
Station météo avec Blynk
Prêt à lier notre station météo à Blynk. Ouvrez mon code joint, décommentez Blynk.begin() dans setup(), ajoutez votre code d'auth et identifiants Wi-Fi, téléversez sur l'Arduino.

Ouvrez Blynk sur votre téléphone. Si vous avez suivi ce tutoriel, votre bouton est là et contrôle encore la LED. Mode Édition → cliquer le bouton → configurer → « Delete » tout en bas. Maintenant, dans la boîte à outils, sélectionnez « Labeled Value » (sous « Displays »). De retour sur l'écran principal, cliquez sur le Labeled Value pour configurer. Pin → Virtual Pin V3. Label (là où c'est écrit « e.g. Temp ») : tapez Temp /pin.#/ deg.F. Le .# affiche une décimale. Taille de texte grande, Refresh Interval sur « Push », Couleur texte verte. OK. Le Labeled Value est presque prêt, mais trop étroit. Sélectionnez-le lentement (sans réentrer en config) : le contour s'allume. Étirez-le sur ~3/4 de l'écran. Sortez du mode Édition : la température s'affiche.
Avant de finir la config Blynk, deux notions vues ci-dessus :
- Broches virtuelles (Virtual Pins) : Blynk utilise ce concept unique. Un widget d'affichage peut lire une broche analogique, ou l'état d'une broche numérique. Mais souvent on veut afficher le contenu d'une variable. On assigne cette variable à un numéro de broche virtuelle, et l'app Blynk référencera cette variable par ce numéro. Dans mon code, la température en Fahrenheit est assignée à la broche virtuelle V3.
- Intervalle de rafraîchissement (Refresh Interval) : laissé en « Push » = l'Arduino pousse les données (mise à jour temp/humidité/pression toutes les minutes). Blynk supporte aussi le mode « Pull » : l'app interroge le hardware à intervalle régulier.
Finissons l'affichage météo sur Blynk. Il faut deux autres Labeled Value :
- Humidité en % (Virtual Pin V4) — couleur or, 1 décimale.
- Pression en « in Hg » (Virtual Pin V5) — couleur rouge, 2 décimales.
Si les trois Labeled Value affichent température, humidité, pression, ajoutez le graphique des trois avec le widget « SuperChart ». Étirez-le vers le bas pour remplir l'écran. Configurez : Show X axis values ON, résolutions : live, 1h, 6h, 1j, 1sem, 1mois, 3mois. Trois flux de données (un par variable). Pour chaque flux : icône à droite → sélectionner la broche virtuelle correspondante. Échelle Y : « height ». Temp : height 67–100. Humidité : 34–66. Pression : 0–33. Couleurs assorties aux Labeled Value. Show Y axis ON. Sortez du mode Édition : l'affichage devrait ressembler au mien. Le graphique met un peu de temps à se remplir. Pour résultats rapides, affichez en résolution live ou 1h.
Une dernière fonction Blynk à connaître : le partage de votre projet fini avec d'autres smartphones, pour que plusieurs téléphones voient la station météo. Mode Édition → icône du milieu en haut (Project Settings) → activer « Sharing » → générer un lien → QR code à envoyer par email ou autre. Le nouvel utilisateur a besoin de l'app Blynk mais pas de compte. L'app non enregistrée a un lien pour charger le QR code d'un projet partagé. C'est tout.
Cette intro à Blynk est limitée, mais donne de bonnes bases. Blynk est « presque » gratuit : widgets et partage consomment des points appelés « énergie ». 2500 points offerts au début, assez pour ce projet gratuitement. Mais partager ou étendre peut épuiser l'énergie. J'ai dépensé 6 $ pour 5000 points supplémentaires. Vous devrez peut-être investir quelques dollars si vous multipliez les projets Blynk.
Code
Tiny Internet Weather Station
Avec Wi-Fi et Blynk vers smartphone.
/* Sketch pour Arduino Nano 33 IoT
* Capteur BME280
* Écran OLED 0.96" 128x64
* Connexion WiFi vers serveur cloud Blynk pour affichage météo sur smartphone */
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BME280.h> // Bibliothèque BME280
#include <avr/dtostrf.h> // Conversion nombres -> chaînes pour OLED
#include <ss_oled.h> // Bibliothèque OLED
// Deux includes requis pour Nano 33 IoT + Blynk
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
char auth[] = "YourBlynkProjectCode";
char ssid[] = "YourWifiID";
char pass[] = "YourWiFiPassword";
Adafruit_BME280 bme; // interface I2C
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
#define SDA_PIN 5
#define SCL_PIN 4
#define RESET_PIN -1
#define OLED_ADDR -1
#define FLIP180 0
#define INVERT 0
#define USE_HW_I2C 0
#define MY_OLED OLED_128x64
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
SSOLED ssoled; // instance OLED
BlynkTimer timer; // instance timer Blynk
void setup() {
if (!bme.begin(0x76)) {
while (1) delay(10); // attend détection capteur
}
bme_temp->printSensorDetails();
bme_pressure->printSensorDetails();
bme_humidity->printSensorDetails();
oledInit(&ssoled, MY_OLED, OLED_ADDR, FLIP180, INVERT, USE_HW_I2C, SDA_PIN, SCL_PIN, RESET_PIN, 400000L);
oledFill(&ssoled, 0x0, 1);
Blynk.begin(auth, ssid, pass); // commentez cette ligne pour fonctionnement sans Blynk
timer.setInterval(60000L, myupdate); // myupdate toutes les minutes
myupdate(); // mise à jour initiale (affichage + envoi Blynk) car loop attend 1 min
}
void loop() {
Blynk.run(); // Blynk préfère tourner seul dans loop principal
timer.run(); // tout le reste géré via timer Blynk
}
// Routine appelée par timer Blynk pour mettre à jour OLED et pousser données vers Blynk
void myupdate() {
sensors_event_t temp_event, pressure_event, humidity_event;
bme_temp->getEvent(&temp_event);
bme_pressure->getEvent(&pressure_event);
bme_humidity->getEvent(&humidity_event);
float ctemp = temp_event.temperature; // température en °C
float ftemp = 32 + (9 * ctemp) / 5; // conversion en °F
float hum = humidity_event.relative_humidity; // humidité relative %
float ppress = pressure_event.pressure; // pression en hPa (mm)
float mpress = 1.3 + ppress / 33.8939; // conversion en inHg + correction altitude (1.3 = 1300 ft)
// Adaptez ou retirez 1.3 selon votre altitude
char mytemp[8]; dtostrf(ftemp, 6, 2, mytemp); // temp -> chaîne
char myhum[8]; dtostrf(hum, 6, 2, myhum); // humidité -> chaîne
char mypress[8]; dtostrf(mpress, 6, 2, mypress); // pression -> chaîne
// Mise à jour affichage OLED
oledWriteString(&ssoled, 0, 2, 1, (char *)"Weather Station", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0, 2, 3, (char *)"Temp = ", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0, 50, 3, (char *)mytemp, FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0, 105, 3, (char *)"F", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0, 2, 5, (char *)"Humid=", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0, 50, 5, (char *)myhum, FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0, 105, 5, (char *)"%", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0, 2, 7, (char *)"Press=", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0, 50, 7, (char *)mypress, FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0, 105, 7, (char *)"in", FONT_NORMAL, 0, 1);
// Envoi nouvelles données météo vers Blynk
Blynk.virtualWrite(V3, ftemp);
Blynk.virtualWrite(V4, hum);
Blynk.virtualWrite(V5, mpress);
}
Schémas

Processus de fabrication
- Circuits intégrés (CI) : puces compactes et puissantes alimentant l'électronique moderne
- Station météo solaire DIY avec Raspberry Pi
- Construction d'une station météo extérieure avec Raspberry Pi 2 et ADS‑WS1
- Construire une station météo Raspberry Pi qui envoie les données météo quotidiennes par email
- Intégrer votre station météo à CWOP : Guide pratique
- Station météo avancée v2.0 : Surveillance en temps réel de température, pression, humidité et altitude
- Construire une Centrale DCC Numérique pour Modélisme Ferroviaire avec Arduino – Application Android Gratuite Incluse
- Station de Mixage Automatique 6-Shooter Pilotée par Arduino – Construisez Votre Propre Robot Barman
- MotionSense : Détection d'intrusion intelligente avec Arduino et ESP8266