Construire une Station Météo Intelligente avec Arduino UNO et Intégration AWS
Composants et fournitures
| Composant | Description | Quantité |
|---|---|---|
| Arduino UNO | Microcontrôleur principal | 1 |
| Câble USB-A vers Micro-USB | Programmation/alimentation | 1 |
| Plaque d'essai (breadboard) générique | Montage | 1 |
| Fils de liaison (jumper wires) génériques | Connexions | 1 |
| Plexiglas 4 mm | Boîtier découpé au laser | 1 |
| Résistance 221 Ω | Rétroéclairage LCD | 1 |
| Adafruit LCD Standard 16x2 Blanc sur Bleu | Affichage (interface I2C) | 1 |
| Module RTC DS1307 (I²C) | Horloge temps réel | 1 |
| Photorésistance (LDR) | Mesure luminosité | 1 |
| Capteur DHT11 Température & Humidité (4 broches) | Température et humidité air | 1 |
| Capteur de température LM35 | Température de précision | 1 |
| Récepteur IR générique | Télécommande infrarouge | 1 |
| Capteur de niveau d'eau | Niveau eau/neige | 1 |
| Kit RFID Sunfounder Starter | (Non utilisé dans le code final) | 1 |
Outils nécessaires
- Découpeuse laser (pour le boîtier en plexiglas)
À propos du projet
AWS (Arduino Weather Station) fournit des données environnementales précises en continu. Basée sur un microcontrôleur Arduino, elle intègre une suite complète de capteurs pour l'analyse de l'environnement.
Objectif
Détecter une série de données via les capteurs et les présenter à l'utilisateur via un écran LCD. La compacité permet de loger le tout dans un petit boîtier découpé au laser.
Capteurs utilisés
Images des différents capteurs montés sur la plaque d'essai.
Capteur de niveau d'eau et de neige
Indique le niveau d'eau dans un réservoir, évite les débordements, permet de connaître le niveau à tout moment.
Capteur DHT11 Humidité et Température
Capteur numérique calibré, sortie signal numérique, haute fiabilité, excellente stabilité long terme, réponse rapide, anti-interférences, faible coût.
Photorésistance (LDR)
Résistance dépendante de la lumière. Résistance très élevée dans l'obscurité, chute drastique sous l'éclairage (quelques ohms selon l'intensité). Utilisée pour mesurer l'intensité lumineuse ou présence/absence de lumière.
Affichage LCD I2C 1602
Bus série I2C haute performance (deux lignes bidirectionnelles SDA/SCL avec résistances de tirage). Potentiomètre bleu pour régler le rétroéclairage. Tensions typiques +5V ou +3.3V.
Module RTC DS1302
Basé sur DS1302 : horloge/calendrier temps réel + 31 octets RAM statique. Format heure hh/mm/ss, date yyyy/mm/dd.
Capteur de température LM35
Capteur de précision. L'ADC convertit : valeur ADC = échantillon × 1024 / tension de référence (5V). Soit approximation numérique = tension d'entrée × 205.
Récepteur infrarouge et télécommande
Fonctionnent en paire. Les boutons de la télécommande sont assignés :
- Bouton 0 : Afficher date/heure sur LCD.
- Bouton 1 : Afficher température (LM35) et humidité (DHT11).
- Bouton 2 : Afficher pourcentage d'obscurité (LDR).
- Bouton 3 : Afficher niveau de fluide (mm).
- Bouton « Cycle » : Défilement automatique de tous les écrans par intervalle de 4 secondes (un seul cycle).
La station AWS
Étape 1 : Construction du boîtier
Conception des faces avec emboîtements et passages de câbles sous AutoCAD, découpe laser du plexiglas 4 mm, assemblage à la colle forte.
Étape 2 : Schéma et connexions matérielles
Schéma réalisé avec Fritzing. Connexions simples.
Étape 3 : Programmation Arduino
Code développé sur Arduino IDE avec toutes les bibliothèques nécessaires.
Étape 4 : Fonctionnement
La station AWS relève des données environnementales et les rend accessibles via la télécommande IR. L'écran LCD propose 5 écrans interchangeables :
- Écran d'accueil : « Arduino Weather Station » avec effet de fondu au démarrage et après chaque consultation.
- Date/Heure : Accessible par bouton 0, retour à l'accueil après 10 s.
- Température/Humidité : Bouton 1, données LM35 et DHT11, retour après 10 s.
- Obscurité : Bouton 2, pourcentage d'obscurité via LDR, retour après 10 s.
- Niveau de fluide : Bouton 3, hauteur en mm, retour après 10 s.
Le bouton « Cycle » enchaîne les 4 écrans de données avec 4 s d'intervalle chacun (un seul tour).
Précautions
- Éviter tout contact liquide avec la carte et les capteurs.
- Après pluie, vider le récipient d'eau, vérifier et nettoyer le capteur de niveau.
- Batterie rechargeable ~2 jours d'autonomie, recharge ~2 h.
- Le récepteur IR peut mal fonctionner vers 0 °C : ouvrir le boîtier et appuyer sur RESET.
- Le module RTC DS1302 conserve date/heure grâce à sa pile de secours (~10 ans).
- Si l'alimentation est coupée, date/heure sont perdues. Remettre à jour dans le code (décommenter la ligne d'initialisation, puis la recommenter après téléversement).
Code
// Bibliothèques
#include <IRremote.h>
#include <stdio.h>
#include <string.h>
#include <DS1302.h>
#include <dht.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define lmPin A1
LiquidCrystal_I2C lcd(0x27, 16, 2);
dht DHT;
const int DHT11_PIN = 4;
const int waterSensor = 0;
int waterValue = 0, mmwaterValue = 0;
int sensorPin = A3;
int luce = 0, pluce = 0;
float tem = 0;
long lmVal = 0;
const int irReceiverPin = 3;
IRrecv irrecv(irReceiverPin);
decode_results results;
uint8_t RST_PIN = 5, SDA_PIN = 6, SCL_PIN = 7;
char buf[50], day[10];
DS1302 rtc(RST_PIN, SDA_PIN, SCL_PIN);
void print_time() {
Time t = rtc.time();
memset(day, 0, sizeof(day));
switch (t.day) {
case 1: strcpy(day, "Sun"); break;
case 2: strcpy(day, "Mon"); break;
case 3: strcpy(day, "Tue"); break;
case 4: strcpy(day, "Wed"); break;
case 5: strcpy(day, "Thu"); break;
case 6: strcpy(day, "Fri"); break;
case 7: strcpy(day, "Sat"); break;
}
snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
Serial.println(buf);
lcd.setCursor(2, 0);
lcd.print(t.yr); lcd.print("-"); lcd.print(t.mon/10); lcd.print(t.mon%10);
lcd.print("-"); lcd.print(t.date/10); lcd.print(t.date%10); lcd.print(" "); lcd.print(day);
lcd.setCursor(4, 1);
lcd.print(t.hr); lcd.print(":"); lcd.print(t.min/10); lcd.print(t.min%10);
lcd.print(":"); lcd.print(t.sec/10); lcd.print(t.sec%10);
}
void setup() {
Serial.begin(9600);
rtc.write_protect(false); rtc.halt(false);
irrecv.enableIRIn();
lcd.init(); lcd.backlight();
pinMode(sensorPin, INPUT);
Time t(2017, 12, 9, 11, 20, 00, 7);
rtc.time(t);
}
void loop() {
// Animation "Arduino Weather Station" lettre par lettre
lcd.setCursor(0,0); lcd.print("A"); delay(50);
lcd.setCursor(1,0); lcd.print("r"); delay(50);
lcd.setCursor(2,0); lcd.print("d"); delay(50);
lcd.setCursor(3,0); lcd.print("u"); delay(50);
lcd.setCursor(4,0); lcd.print("i"); delay(50);
lcd.setCursor(5,0); lcd.print("n"); delay(50);
lcd.setCursor(6,0); lcd.print("o"); delay(50);
lcd.setCursor(8,0); lcd.print("W"); delay(50);
lcd.setCursor(9,0); lcd.print("e"); delay(50);
lcd.setCursor(10,0); lcd.print("a"); delay(50);
lcd.setCursor(11,0); lcd.print("t"); delay(50);
lcd.setCursor(12,0); lcd.print("h"); delay(50);
lcd.setCursor(13,0); lcd.print("e"); delay(50);
lcd.setCursor(14,0); lcd.print("r"); delay(50);
lcd.setCursor(4,1); lcd.print("S"); delay(50);
lcd.setCursor(5,1); lcd.print("t"); delay(50);
lcd.setCursor(6,1); lcd.print("a"); delay(50);
lcd.setCursor(7,1); lcd.print("t"); delay(50);
lcd.setCursor(8,1); lcd.print("i"); delay(50);
lcd.setCursor(9,1); lcd.print("o"); delay(50);
lcd.setCursor(10,1); lcd.print("n"); delay(50);
if (irrecv.decode(&results)) {
if (results.value == 0xFF6897) { // Bouton 0
lcd.clear(); print_time(); delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF30CF) { // Bouton 1
lcd.clear();
int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0,0); lcd.print("Tem:");
lmVal = analogRead(lmPin);
tem = (lmVal * 0.0048828125 * 100);
lcd.print(tem); lcd.print(char(223)); lcd.print("C ");
lcd.setCursor(0,1); lcd.print("Hum:");
lcd.print(DHT.humidity, 1); lcd.print(" % ");
delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF18E7) { // Bouton 2
lcd.clear();
lcd.setCursor(4,0); lcd.print("Darkness:");
luce = analogRead(sensorPin);
pluce = map(luce, 0, 1023, 0, 100);
lcd.setCursor(6,1); lcd.print(pluce); lcd.print("%");
delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF7A85) { // Bouton 3
lcd.clear();
lcd.setCursor(0,0); lcd.print("Fluid level(mm):");
waterValue = analogRead(waterSensor);
mmwaterValue = map(waterValue, 0, 1023, 0, 40);
lcd.setCursor(6,1); lcd.print(mmwaterValue);
delay(10000); lcd.clear(); delay(200); irrecv.resume();
}
if (results.value == 0xFF9867) { // Bouton Cycle
lcd.clear(); print_time(); delay(4000); lcd.clear(); delay(200);
int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0,0); lcd.print("Tem:");
lmVal = analogRead(lmPin);
tem = (lmVal * 0.0048828125 * 100);
lcd.print(tem); lcd.print(char(223)); lcd.print("C ");
lcd.setCursor(0,1); lcd.print("Hum:");
lcd.print(DHT.humidity, 1); lcd.print(" % ");
delay(4000); lcd.clear(); delay(200);
lcd.setCursor(4,0); lcd.print("Darkness:");
luce = analogRead(sensorPin);
pluce = map(luce, 0, 1023, 0, 100);
lcd.setCursor(6,1); lcd.print(pluce); lcd.print("%");
delay(4000); lcd.clear(); delay(200);
lcd.setCursor(0,0); lcd.print("Fluid level(mm):");
waterValue = analogRead(waterSensor);
mmwaterValue = map(waterValue, 0, 1023, 0, 40);
lcd.setCursor(6,1); lcd.print(mmwaterValue);
delay(4000); lcd.clear(); delay(200); irrecv.resume();
}
}
}
Conclusion
Station météo Arduino avec horloge temps réel, capteurs environnementaux, affichage LCD piloté par télécommande IR. Boîtier plexiglas découpé laser.
Pièces personnalisées et boîtiers
Fichier CAO : box_a5et5f4U9F.dwg
Schémas
Fichier Fritzing : aws_DMDwb4iUZp.fzz
Processus de fabrication
- Station météo avancée v2.0 : Surveillance en temps réel de température, pression, humidité et altitude
- Détecteur de langue TinyML avec Edge Impulse sur Arduino Nano 33 BLE Sense
- Construire un jeu gyroscopique temps réel avec Arduino Nano et capteur MPU-6050
- Station de Mixage Automatique 6-Shooter Pilotée par Arduino – Construisez Votre Propre Robot Barman
- Dé numérique Arduino sur écran LCD 16x2 – Générateur aléatoire à bouton poussoir
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Construire une lampe de bureau réactive à l'audio avec Arduino Nano
- Enregistreur de données Arduino haute performance pour ballon météo
- Station Météo Arduino Portable à 10$ – Nano, DHT22, BMP180 et LCD