Enregistreur de données Arduino haute performance pour ballon météo
Composants et fournitures
| Composant | Quantité |
|---|---|
| Thermomètre numérique programmable 1-Wire DS18B20 (Maxim Integrated) | 2 |
| Capteur de température DHT22 | 1 |
| Accéléromètre triple axe ADXL335 (SparkFun) | 1 |
| Connecteurs mâles 36 positions 1 rangée (pas 0,1") | 2 |
| Arduino Mega 2560 | 1 |
| LED SMD 5050 | 1 |
| Résistance 4,75 kΩ | 2 |
| Résistance 100 Ω | 3 |
| Résistance 10 kΩ | 1 |
| Carte microSD | 1 |
| Module carte microSD | 1 |
Outils et machines nécessaires
- Fer à souder (générique)
- Fil à souder sans plomb
Applications et services en ligne
- Arduino IDE
À propos de ce projet
Vous vous demandez peut-être : « Peut-on vraiment envoyer un Arduino dans l'espace ? » Presque. Grâce à un ballon météo, vous pouvez propulser un Arduino, une caméra, du pain à l'ail ou tout autre objet jusqu'au tiers de l'espace ! Bien que ce ne soit qu'un tiers du chemin, 99 % de l'atmosphère est absente : on appelle cela « la limite de l'espace ». Ce guide est long, mais si vous ne le consultez pas par simple curiosité, lisez-le entièrement jusqu'au « Parcours 1 ».
Trois parcours sont proposés selon vos objectifs et votre niveau. Tous nécessitent des compétences en soudure pour résister aux vents violents de la stratosphère. Aucun n'est supérieur ; choisissez selon vos intérêts.
Parcours 1 : Enregistreur simple sur plaque d'essai
Utilise une plaque d'essai (protoboard), divers capteurs, peu de soudure. Offre flexibilité dans le choix des capteurs, de la carte et des fonctionnalités.
Parcours 2 : Shield PCB préconçu
Utilise un shield PCB (circuit imprimé) prédessiné et testé. Nécessite un ensemble de capteurs et une carte Arduino spécifiques, mais offre un montage propre, sans souci de câblage ni de code. Fichiers Gerber, réglages d'exportation et code fournis. Coût faible (environ 2 $ pour 5 PCB).
Parcours 3 : Concevoir son propre PCB
Le plus difficile. Exige la maîtrise de la conception PCB, du codage complet et de la soudure. Ce guide ne détaille pas la conception PCB, mais donne des lignes directrices et des liens vers des tutoriels.
Conseils pour choisir
- Parcours 1 : Le plus facile, flexible, nécessite quelques soudures.
- Parcours 2 : Le plus restrictif (capteurs et carte imposés), mais montage propre, pas de câblage ni de code à écrire, bonne introduction aux PCB.
- Parcours 3 : Pour experts. Si vous savez déjà tout faire, vous n'avez probablement pas besoin de ce guide, mais les restrictions et détails importants y sont rappelés.
Règles essentielles avant de commencer
L'envoi d'un ballon météo peut être réglementé selon votre pays. Ce guide ne couvre pas le choix du ballon, la construction de la nacelle ni le gonflage (de nombreux tutoriels existent). Voici les restrictions principales pour votre enregistreur (basées sur la réglementation FAA aux États-Unis) :
- Aucun signal de téléphone portable dans la nacelle. Si un téléphone est embarqué, il doit être en mode avion.
- Si vous utilisez un GPS pour la récupération, une licence radio amateur (HAM) est obligatoire (examen + frais).
- Si le rapport poids/surface de la nacelle dépasse 3,0 oz/pouce² (≈ 5,3 g/cm²), le poids total doit être < 4 lb (≈ 1,8 kg).
- Chaque nacelle/colis individuel doit peser < 6 lb (≈ 2,7 kg).
- Avec deux nacelles, le poids total doit être < 12 lb (≈ 5,4 kg).
Lien vers les directives complètes de la FAA (pour résidents US)
Parcours 1 – Plaque d'essai (Proto Board)
Considérations préalables
Définissez ce que vous voulez mesurer. Le schéma fourni inclut : capteur température/humidité (DHT22), capteur barométrique, IMU (ADXL335/337) et module carte SD. Pour la récupération, plusieurs options :
- Module GPS SPOT : Facile, portée illimitée (satellite), excellente autonomie, mais coûteux, ne fonctionne pas à l'envers, signal bloqué par objets épais. Nous avons utilisé un SPOT 3 Satellite Messenger avec un gimbal imprimé en 3D pour le maintenir droit.
- Radio APRS : La plus fiable, permet d'envoyer données et coordonnées, donne altitude précise. Nécessite licence HAM (examen + frais). Non inclus dans le schéma de câblage.
- Téléphone portable : Déconseillé. Problème de sortie du mode avion après le vol, plus cher qu'un SPOT, utilisé seulement comme secours.
Profil de vol et alimentation
Réfléchissez au déroulement du vol : déploiement parachute commandé à distance ? Choix des capteurs (température jusqu'à -40 °C). Alimentation : le froid dégrade les batteries ; prévoir une grosse capacité et une boîte en polystyrène pour l'isolation thermique, tout en respectant la limite de poids.
Faites une check-list : données souhaitées, présence caméra, contenu de la nacelle. Concevez l'enregistreur en fonction de la nacelle.
Schéma de câblage et liste de composants

L'Arduino Mega est surdimensionné pour ces capteurs, mais nécessaire pour utiliser le code fourni. Si vous utilisez un Nano, adaptez les broches SPI du module SD.
- ADXL337 (SparkFun)
- Connecteurs mâles (header pins)
- Module carte microSD
- Capteur humidité DHT22
- Capteur température DS18B20
- Plaque d'essai (protoboard)
- Arduino Mega
Vous pouvez ajouter un second DS18B20 pour la température interne et d'autres capteurs, mais le code fourni exige le câblage ci-dessus.
Code (Parcours 1)
// Configuration DHT22
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Configuration carte SD
#include
#include
File sdcard_file;
int CS_pin = 10;
// Capteur DS18B20
#include
#include
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int scale = 3; // ±3g pour ADXL337, ±200g pour ADXL377
boolean micro_is_5V = true; // true si microcontrôleur 5V (Arduino Uno/Mega)
void setup() {
Serial.begin(9600);
sensors.begin();
dht.begin();
pinMode(CS_pin, OUTPUT);
if (SD.begin()) {
Serial.print("Carte SD détectée !");
} else {
Serial.print("Erreur carte SD");
return;
}
sdcard_file = SD.open("data.csv", FILE_WRITE);
if (sdcard_file) {
// En-têtes CSV
sdcard_file.print("DS18B20");
sdcard_file.print(",");
sdcard_file.print("DHT22 Temp");
sdcard_file.print(",");
sdcard_file.print("Hum");
sdcard_file.print(",");
sdcard_file.print("H.InX");
sdcard_file.print(",");
sdcard_file.print("rawX");
sdcard_file.print(",");
sdcard_file.print("rawY");
sdcard_file.print(",");
sdcard_file.print("rawZ");
sdcard_file.print(",");
sdcard_file.print("scaledX");
sdcard_file.print(",");
sdcard_file.print("scaledY");
sdcard_file.print(",");
sdcard_file.println("scaledZ");
} else {
Serial.print("Erreur initialisation SD");
}
}
void loop() {
delay(222);
// Accéléromètre
int rawX = analogRead(A0);
int rawY = analogRead(A1);
int rawZ = analogRead(A2);
float scaledX, scaledY, scaledZ;
if (micro_is_5V) {
scaledX = mapf(rawX, 0, 675, -scale, scale);
scaledY = mapf(rawY, 0, 675, -scale, scale);
scaledZ = mapf(rawZ, 0, 675, -scale, scale);
} else {
scaledX = mapf(rawX, 0, 1023, -scale, scale);
scaledY = mapf(rawY, 0, 1023, -scale, scale);
scaledZ = mapf(rawZ, 0, 1023, -scale, scale);
}
// DS18B20
sensors.requestTemperatures();
int etemp = sensors.getTempCByIndex(0);
// DHT22
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) return;
float hic = dht.computeHeatIndex(t, h, false);
// Écriture CSV
sdcard_file = SD.open("data.csv", FILE_WRITE);
sdcard_file.print(etemp); sdcard_file.print(",");
sdcard_file.print(t); sdcard_file.print(",");
sdcard_file.print(h); sdcard_file.print(",");
sdcard_file.print(hic); sdcard_file.print(",");
sdcard_file.print(rawX); sdcard_file.print(",");
sdcard_file.print(rawY); sdcard_file.print(",");
sdcard_file.print(rawZ); sdcard_file.print(",");
sdcard_file.print(scaledX); sdcard_file.print(",");
sdcard_file.print(scaledY); sdcard_file.print(",");
sdcard_file.print(scaledZ); sdcard_file.print(",");
sdcard_file.println(" ");
sdcard_file.close();
delay(223);
}
float mapf(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Important : Formatez la carte SD en FAT16 ou FAT32, capacité ≤ 16 Go. Vérifiez le câblage et testez chaque capteur individuellement en cas de problème. Ajoutez des LED pour indiquer l'état de l'enregistreur (vital pour confirmer le fonctionnement avant le lancement). Si le module SD est capricieux, changez l'alimentation : certains modules sont très sensibles à la tension.
Votre enregistreur est prêt ! Il enregistre température, humidité et accélérations sur carte SD. Pour l'altitude, le GPS est indispensable : 90 % des altimètres barométriques échouent au-delà de 30 000 ft (≈ 9 100 m), seuil que votre ballon franchira probablement.
Parcours 2 – PCB préconçu (Shield « Eclipse »)
Ce shield PCB permet de mesurer température interne, température externe, humidité et accélérations. Composants nécessaires :
- LED SMD 5050
- ADXL337 (SparkFun)
- Nombreux connecteurs mâles (header pins)
- Module carte microSD
- Capteur humidité DHT22
- 2 × DS18B20
- Arduino Mega
- PCB « Eclipse »
Fichiers Gerber et code sur GitHub. Pour commander le PCB : téléchargez le ZIP Gerber, choisissez un service PCB (JLCPCB, PCBWay, etc.), importez le ZIP et sélectionnez :
- Épaisseur 1,6 mm
- Couleur au choix (vert = production plus rapide)
- Finition HASL (avec plomb) – adapter si soudure sans plomb
- Cuivre 1 oz
- Test Flying Probe complet
- Quantité souhaitée
Assemblage du PCB

Soudez tous les connecteurs mâles sur les côtés du PCB ; ils s'insèrent directement sur l'Arduino Mega et réalisent tout le câblage. Le PCB contient de fines pistes (0,35 mm) reliant chaque capteur aux broches correspondantes : montage propre, robuste et fiable.
Insérez la carte microSD (FAT16/32, ≤ 16 Go), téléversez le code « 1.6 » depuis le dépôt GitHub. Le moniteur série doit afficher la détection de la carte SD et le démarrage de l'enregistrement. Après 10 secondes, retirez la carte : un fichier .csv avec vos données doit être présent.
Code (Parcours 2 – avec altimètre MPL3115A2 et LEDs d'état)
// Configuration DHT22
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Carte SD
#include
#include
File sdcard_file;
int CS_pin = 10;
// DS18B20
#include
#include
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Altimètre MPL3115A2
#include
#include
Adafruit_MPL3115A2 baro = Adafruit_MPL3115A2();
int scale = 3;
boolean micro_is_5V = true;
// LEDs
int Blue = 7, Red = 6, Green = 5;
void setup() {
pinMode(23, INPUT); // Interrupteur arrêt écriture SD
sensors.begin();
pinMode(Blue, OUTPUT); pinMode(Red, OUTPUT); pinMode(Green, OUTPUT);
digitalWrite(Green, HIGH);
dht.begin();
pinMode(CS_pin, OUTPUT);
if (SD.begin()) {
// Clignotement vert = SD OK
for(int i=0;i<3;i++){ digitalWrite(Green,LOW); digitalWrite(Green,HIGH); delay(100); }
} else {
digitalWrite(Green, LOW); digitalWrite(Red, HIGH); delay(5000); return;
}
sdcard_file = SD.open("data.csv", FILE_WRITE);
if (sdcard_file) {
digitalWrite(Red, LOW); digitalWrite(Blue, LOW); digitalWrite(Green, HIGH);
} else {
// Séquence d'erreur LEDs
digitalWrite(Green, LOW); digitalWrite(Red, HIGH); delay(1000);
digitalWrite(Red, LOW); digitalWrite(Blue, HIGH); delay(1000);
digitalWrite(Blue, LOW); digitalWrite(Red, HIGH); delay(1000);
digitalWrite(Red, LOW); digitalWrite(Blue, HIGH); delay(1000);
digitalWrite(Blue, LOW); digitalWrite(Red, HIGH);
}
// En-têtes CSV (inclut pression, altitude, température interne)
sdcard_file.print(","); sdcard_file.print("DS18B20"); sdcard_file.print(",");
sdcard_file.print("DHT22 Temp"); sdcard_file.print(","); sdcard_file.print("Hum"); sdcard_file.print(",");
sdcard_file.print("H.InX"); sdcard_file.print(","); sdcard_file.print("Int. Temp"); sdcard_file.print(",");
sdcard_file.print("Pres. Pasc."); sdcard_file.print(","); sdcard_file.print("alt."); sdcard_file.print(",");
sdcard_file.print("rawX"); sdcard_file.print(","); sdcard_file.print("rawY"); sdcard_file.print(",");
sdcard_file.print("rawZ"); sdcard_file.print(","); sdcard_file.print("scaledX"); sdcard_file.print(",");
sdcard_file.print("scaledY"); sdcard_file.print(","); sdcard_file.println("scaledZ");
}
void loop() {
delay(222);
digitalWrite(Green, LOW); digitalWrite(Blue, HIGH);
if(!baro.begin()) { /* erreur baro */ }
float pascals = baro.getPressure();
float altm = baro.getAltitude();
float tempC = baro.getTemperature();
// Accéléromètre (même logique que Parcours 1)
int rawX = analogRead(A0), rawY = analogRead(A1), rawZ = analogRead(A2);
float scaledX, scaledY, scaledZ;
if (micro_is_5V) {
scaledX = mapf(rawX, 0, 675, -scale, scale);
scaledY = mapf(rawY, 0, 675, -scale, scale);
scaledZ = mapf(rawZ, 0, 675, -scale, scale);
} else {
scaledX = mapf(rawX, 0, 1023, -scale, scale);
scaledY = mapf(rawY, 0, 1023, -scale, scale);
scaledZ = mapf(rawZ, 0, 1023, -scale, scale);
}
// DS18B20 & DHT22
sensors.requestTemperatures();
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) return;
float hic = dht.computeHeatIndex(t, h, false);
// Écriture CSV
sdcard_file = SD.open("data.csv", FILE_WRITE);
sdcard_file.println(sensors.getTempCByIndex(0)); sdcard_file.print(",");
sdcard_file.print(t); sdcard_file.print(","); sdcard_file.print(h); sdcard_file.print(",");
sdcard_file.print(hic); sdcard_file.print(","); sdcard_file.print(tempC); sdcard_file.print(",");
sdcard_file.print(pascals); sdcard_file.print(","); sdcard_file.print(altm); sdcard_file.print(",");
sdcard_file.print(rawX); sdcard_file.print(","); sdcard_file.print(rawY); sdcard_file.print(",");
sdcard_file.print(rawZ); sdcard_file.print(","); sdcard_file.print(scaledX); sdcard_file.print(",");
sdcard_file.print(scaledY); sdcard_file.print(","); sdcard_file.print(scaledZ); sdcard_file.print(",");
sdcard_file.close();
delay(223);
}
float mapf(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Parcours 3 – Concevoir son propre PCB
Ce guide ne montre pas comment concevoir un PCB ; vous devez déjà savoir le faire ou l'apprendre. Voici des lignes directrices (réglementation US) :
- Listez vos objectifs de mesure : température, humidité, altitude, qualité air, radiation, GPS.
- Capteur température jusqu'à -50 °C, haute précision. Attention : rayonnement solaire fausse la mesure à haute altitude (semble plus chaud).
- Récupération : mêmes options que Parcours 1 (SPOT, APRS, téléphone déconseillé).
- Poids : limites FAA identiques (4/6/12 lb selon configuration).
- Altitude : baromètre inutilisable > 30 000 ft → GPS requis.
- Alimentation : froid extrême → batteries défaillantes. Solution : boîte polystyrène (maintient ~température ambiante), panneaux solaires, chaufferettes.
Concevez le schéma et le PCB (shield ou PCB complet). Testez tout rigoureusement avant le vol.
Conclusion
Les ballons météo offrent un accès simple à la stratosphère pour caméras (notre cas : caméra 360°) et collecte de données, avec peu de réglementations. MAIS :
- Respectez toutes les règles.
- Ajoutez un réflecteur radar et déposez un NOTAM (Notice to Airmen) avant le vol.
- Risque réel de collision avec un avion – ne prenez pas cela à la légère.
- Renforcez tout pour ne rien perdre en vol.
- La FAA impose peu de restrictions ; ne les forcez pas à durcir la réglementation par négligence.
J'espère que ce guide vous aidera. Abonnez-vous à notre chaîne YouTube pour nous soutenir, commentez ou contactez-nous pour toute question !
Bon vol avec Arduino !
NM Rocketry Reviews
Pièces personnalisées et boîtiers
Fichier .stl du gimbal pour maintenir le SPOT Personal Tracker droit pendant le vol.
Schémas
Pour le Parcours 1 :
Pour référence : 
Dépôt GitHub pour fichiers PCB et code
https://github.com/nmrocketryreviews/HADLdatalogger – Fichiers Gerber pour PCB préconçu et code associé.
Processus de fabrication
- Dé numérique Arduino sur écran LCD 16x2 – Générateur aléatoire à bouton poussoir
- Système de Capteur de Température Multi-Position pour Intégration Domotique
- Manette de jeu USB Arduino DIY – Construisez votre propre gamepad haute performance
- MotionSense : Détection d'intrusion intelligente avec Arduino et ESP8266
- Prévention incendie imprimante 3D : Système de sécurité à capteur intelligent
- Pixel Chaser : Jeu LED interactif à une touche avec Arduino Nano
- Créer une jauge IoT connectée au Web avec Arduino, Yaler et IFTTT
- Lévitation magnétique répulsive avec Arduino : circuit simple et guide DIY
- CoroFence : Détecteur Thermique Avancé PIR + Capteur Grid-EYE & IoT