Mini station météo Arduino UNO – Hub capteurs DIY avec ESP8266 IoT
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Espressif ESP8266 ESP-01 | 1 |
| Shield prototype Arduino (ou plaque d'essai ordinaire) | 1 |
| Capteur température DHT22 | 1 |
| Seeed Grove - Capteur de lumière | 1 |
| Seeed Grove - Capteur UV | 1 |
| Seeed Grove - Capteur barométrique | 1 |
| Seeed Grove - Capteur de poussières | 1 |
| Résistance 1 kΩ | 2 |
| Résistance 10 kΩ | 1 |
| Résistance 4,75 kΩ | 1 |
| Fils de connexion (standard) | 1 lot |
Applications et services en ligne
- Arduino IDE
- API ThingSpeak
À propos de ce projet
Voici la première génération de ma mini-station météo à base d'Arduino avec connexion Wi-Fi, capable de publier des données publiquement en ligne via la plateforme ThingSpeak.
La station collecte les données météo et environnementales suivantes via différents capteurs :
- Température
- Humidité
- Pression atmosphérique
- Intensité lumineuse
- Indice UV
- Concentration de poussières
L'objectif : une station météo petite et simple, en matériel open source.
C'est parti, amusez-vous !
Composants électroniques
Pas d'outils spécifiques nécessaires pour l'assemblage. Tous les composants se trouvent en ligne sur votre site e-commerce préféré.
Le circuit est alimenté par le port USB (ordinateur ou chargeur téléphone), mais vous pouvez ajouter une alimentation DC externe ou une batterie sur la prise d'alimentation de l'Arduino.
Un boîtier pour la station météo est hors sujet de ce projet.
Connexion des composants
Connectez tous les composants selon le schéma. Vous aurez besoin de fils de connexion pour relier chaque capteur à la plaque d'essai. Vous pouvez utiliser un protoshield (circuit plus compact), une plaque d'essai ordinaire, ou concevoir votre propre shield Arduino.
Branchez le câble USB sur l'Arduino Uno et passez à l'étape suivante.
Code
En supposant que vous ayez déjà installé le dernier Arduino IDE, téléchargez et installez les bibliothèques suivantes :
- Bibliothèque DHT22
- Bibliothèque Adafruit BMP085
Pour les instructions d'ajout de bibliothèques, consultez le guide Arduino.
Téléchargez le code Arduino (weatherBox.ino) dans la section code. Remplacez XXXXX par le SSID de votre routeur WiFi, YYYYY par le mot de passe, et ZZZZZ par la clé d'écriture API de votre canal ThingSpeak (voir étape suivante).
Connectez l'Arduino à l'ordinateur via USB et téléversez le code.
Configuration ThingSpeak
- Créez un compte ThingSpeak
- Créez un nouveau Canal
Nommez et décrivez votre station météo. Attribuez les canaux suivants et sauvegardez :
- Canal 1 = lumière
- Canal 2 = humidité
- Canal 3 = température (DHT22)
- Canal 4 = indice UV
- Canal 5 = concentration de poussières
- Canal 6 = pression
- Canal 7 = température (BMP085)
Copiez la clé d'écriture API. Elle est utilisée dans l'étape précédente dans le code Arduino. Une fois la station allumée, les valeurs des capteurs seront envoyées périodiquement au canal. Vous pouvez configurer des visualisations publiques/privées pour chaque variable.
Exemple de canal public : https://thingspeak.com/channels/35540
Utilisation de l'application Android
Vous pourrez visualiser les données de la station météo dans n'importe quel navigateur. Mais vous pouvez aussi les consulter sur votre smartphone Android quand vous voulez.
- Téléchargez et installez l'application ThingsView depuis le Google Play Store
- Dans l'app, insérez votre numéro d'identifiant de canal et cliquez sur « ajouter ». L'ID se trouve dans la configuration de votre canal ThingSpeak
- Les valeurs actuelles de chaque variable s'afficheront en graphique
Amusez-vous bien !
Code
weatherBox.ino (Arduino)
#include <stdlib.h>
#include <SoftwareSerial.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#define SSID "XXXXX" // Remplacez par votre SSID routeur
#define PASS "YYYYY" // Remplacez par votre mot de passe routeur
#define IP "184.106.153.149" // IP thingspeak.com
#define DHT22_PIN 2
String GET = "GET /update?key=ZZZZZ&field1="; // Remplacez ZZZZZ par votre clé d'écriture ThingSpeak
SoftwareSerial monitor(10, 11); // Communication série avec module ESP8266 (RX, TX)
dht DHT;
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
// Variables
int luminancePin = A0;
int uvPin = A1;
int dustPin = 8;
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;
unsigned long delay_time = 60000;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;
void setup() {
Serial.begin(9600);
monitor.begin(9600);
Serial.println("Initialisation...");
pinMode(dustPin, INPUT);
Serial.println("Détection capteur pression BMP085...");
if (!bmp.begin()) {
Serial.println("Capteur BMP085 non détecté. Vérifiez connexions ou adresse I2C !");
while (1);
}
Serial.println("BMP085 détecté !");
// Communication module WiFi
monitor.flush();
monitor.println("AT");
delay(2000);
if (monitor.find("OK")) {
Serial.println("Communication module ESP8266 : OK");
} else {
Serial.println("ERREUR module ESP8266");
}
// Connexion WiFi
connectWiFi();
Serial.print("Échantillonnage (");
Serial.print(sampletime_ms / 1000);
Serial.println("s)...");
starttime = millis();
}
void loop() {
// Mesure particules de poussière
duration = pulseIn(dustPin, LOW);
lowpulseoccupancy += duration;
// Cycle 30 secondes
if ((millis() - starttime) >= sampletime_ms) {
ratio = lowpulseoccupancy / (sampletime_ms * 10.0); // pourcentage (0-100%)
concentration = 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.62; // depuis datasheet
lowpulseoccupancy = 0;
// Lecture autres capteurs
char buffer[10];
float luminance = analogRead(luminancePin);
float uv = analogRead(uvPin);
uv = uv * 0.0049; // conversion volts
uv = uv * 307; // conversion mW/m²
uv = uv / 200; // calcul indice UV
// Température et humidité
int chk = DHT.read22(DHT22_PIN);
float humidity = DHT.humidity;
float temperature = DHT.temperature;
// Pression et température BMP085
sensors_event_t event;
bmp.getEvent(&event);
float pressure = 0;
float temperature1 = 0;
if (event.pressure) {
pressure = event.pressure;
bmp.getTemperature(&temperature1);
}
// Conversion valeurs en chaînes
String luminanceStr = dtostrf(luminance, 4, 1, buffer); luminanceStr.replace(" ", "");
String uvStr = dtostrf(uv, 4, 1, buffer); uvStr.replace(" ", "");
String humidityStr = dtostrf(humidity, 4, 1, buffer); humidityStr.replace(" ", "");
String temperatureStr = dtostrf(temperature, 4, 1, buffer); temperatureStr.replace(" ", "");
String dustStr = dtostrf(concentration, 4, 1, buffer); dustStr.replace(" ", "");
String pressureStr = dtostrf(pressure, 4, 1, buffer); pressureStr.replace(" ", "");
String temperature1Str = dtostrf(temperature1, 4, 1, buffer); temperature1Str.replace(" ", "");
// Envoi données ThingSpeak
updateSensors(luminanceStr, humidityStr, temperatureStr, uvStr, dustStr, pressureStr, temperature1Str);
// Attente cycle suivant
Serial.print("Attente ");
Serial.print(delay_time / 1000);
Serial.println("s pour prochain échantillonnage");
Serial.println();
delay(delay_time);
// Nouveau cycle
Serial.println();
Serial.print("Échantillonnage (");
Serial.print(sampletime_ms / 1000);
Serial.println("s)...");
starttime = millis();
}
}
void updateSensors(String luminanceStr, String humidityStr, String temperatureStr, String uvStr, String dustStr, String pressureStr, String temperature1Str) {
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += IP;
cmd += "\",80";
monitor.println(cmd);
delay(2000);
cmd = GET;
cmd += luminanceStr;
cmd += "&field2=";
cmd += humidityStr;
cmd += "&field3=";
cmd += temperatureStr;
cmd += "&field4=";
cmd += uvStr;
cmd += "&field5=";
cmd += dustStr;
cmd += "&field6=";
cmd += pressureStr;
cmd += "&field7=";
cmd += temperature1Str;
cmd += "\r\n";
delay(1000);
int strsize = cmd.length();
monitor.println("AT+CIPSEND=" + String(strsize));
delay(2000);
monitor.print(cmd);
if (monitor.find("OK")) {
Serial.println("Transmission réussie");
} else {
Serial.println("Échec transmission !");
}
}
void sendDebug(String cmd) {
Serial.print("SEND: ");
Serial.println(cmd);
monitor.println(cmd);
}
boolean connectWiFi() {
Serial.println("Connexion WiFi...");
String cmd = "AT+CWMODE=1";
monitor.println(cmd);
delay(2000);
monitor.flush();
cmd = "AT+CWJAP=\"";
cmd += SSID;
cmd += "\",\"";
cmd += PASS;
cmd += "\"";
monitor.println(cmd);
delay(5000);
if (monitor.find("OK")) {
Serial.println("Connexion réussie !");
return true;
} else {
Serial.println("Échec connexion !");
return false;
}
Serial.println();
}
Ressources GitHub
Processus de fabrication
- Construire une station météo Raspberry Pi qui envoie les données météo quotidiennes par email
- Robot de détection humaine basé sur Arduino Uno : Intégration capteurs étape par étape
- Capteur CO2 K30 : Surveillance en temps réel de la qualité de l'air intérieur
- Construisez un Stadiomètre Numérique : Suivez la Croissance avec Arduino et Capteur Laser
- Serveur Web Arduino Uno WiFi : Commander une LED via Navigateur
- Calculatrice basique Arduino UNO - Projet facile pour débutants
- Tour de Capteurs avec Arduino Cloud : Température, Mouvement et Gaz
- Construire un affichage à persistance rétinienne portable avec Arduino UNO et ATtiny85
- Station météo Arduino Nano : Kit capteurs & affichage OLED