| name | arduino-project-guide |
| description | Développement de projets Arduino avec circuits, capteurs, code et communication série. Se déclenche avec "Arduino", "capteur", "servo", "GPIO", "circuit Arduino", "sketch". Also triggers on "Arduino project", "wire a sensor", "serial communication". |
Arduino Project Guide
1. Analyse du besoin
Identifier avant tout :
- Type de projet : lecture périodique (température, humidité), événementiel (bouton, détecteur PIR), temps réel (servo, PID)
- Contraintes alimentation : USB (debug), batterie 3.7V LiPo, secteur 5V
- Communication : local seulement, WiFi, BLE, LoRa, UART vers RPi
Critères de sélection de carte :
| Besoin | Carte recommandée |
|---|
| Prototype simple, 5V | Arduino Uno / Nano |
| Nombreuses broches | Arduino Mega 2560 |
| WiFi intégré | ESP8266 (NodeMCU) / ESP32 |
| Faible conso batterie | Arduino Pro Mini 3.3V / ESP32 deep sleep |
| BLE + WiFi | ESP32 DevKit |
2. Conception du circuit
Avant de câbler :
- Vérifier la tension logique (3.3V ESP32 vs 5V Uno — diviseur résistif ou level shifter si mixte)
- Ajouter une résistance pull-up/pull-down sur chaque entrée numérique non pilotée (typique : 10kΩ)
- Protéger les sorties LED : R = (Vcc - Vled) / Iled, ex. 5V, LED 2V, 20mA → R = 150Ω
Règle des broches :
Analog → A0–A5 (lecture ADC 10 bits, 0–1023)
PWM → 3, 5, 6, 9, 10, 11 (Uno) — marque ~ sur la carte
I2C → A4 (SDA), A5 (SCL)
SPI → 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK)
UART → 0 (RX), 1 (TX) — éviter pendant l'upload
Capacité de découplage : 100nF céramique sur VCC/GND de chaque CI sensible (capteur I2C, module RF).
3. Structure du sketch
Template minimal opérationnel :
#include <Wire.h>
const uint8_t PIN_LED = 13;
const uint8_t PIN_BTN = 2;
const unsigned long INTERVAL_MS = 1000;
volatile bool eventFlag = false;
unsigned long lastMillis = 0;
void onButton() {
eventFlag = true;
}
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_BTN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIN_BTN), onButton, FALLING);
Wire.begin();
}
void loop() {
unsigned long now = millis();
if (now - lastMillis >= INTERVAL_MS) {
lastMillis = now;
readSensors();
();
}
(eventFlag) {
eventFlag = ;
();
}
}
Règle : ne jamais bloquer loop() — remplacer delay(x) par le pattern millis().
4. Capteurs courants — snippets copiables
DHT22 (température + humidité)
#include <DHT.h>
DHT dht(4, DHT22);
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) { Serial.println("DHT error"); return; }
HC-SR04 (ultrason)
long getDistance(uint8_t trig, uint8_t echo) {
digitalWrite(trig, LOW); delayMicroseconds(2);
digitalWrite(trig, HIGH); delayMicroseconds(10);
digitalWrite(trig, LOW);
long dur = pulseIn(echo, HIGH, 30000UL);
return dur * 0.034 / 2;
}
Servo
#include <Servo.h>
Servo srv;
srv.write(90);
I2C scan (debug)
for (uint8_t addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0)
Serial.println(addr, HEX);
}
5. Communication série et débogage
Serial.begin(115200);
Serial.print("T="); Serial.print(t); Serial.print("°C H="); Serial.println(h);
Moniteur série : menu Outils > Moniteur série, baud rate identique au sketch.
Plotter série : Outils > Traceur série — affiche les valeurs numériques en graphe temps réel.
Macro de debug conditionnel (0 overhead en production) :
#define DEBUG 1
#if DEBUG
#define DBG(x) Serial.println(x)
#else
#define DBG(x)
#endif
6. Gestion mémoire (SRAM limitée)
Arduino Uno : 2 Ko SRAM, 32 Ko Flash.
Serial.println(F("Démarrage OK"));
int freeRam() {
extern int __heap_start, *__brkval;
int v;
return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
}
Si freeRam() < 100 : risque de crash — passer sur Mega ou ESP32.
7. Optimisation énergie (batterie)
#include <avr/sleep.h>
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu();
esp_sleep_enable_timer_wakeup(30e6);
esp_deep_sleep_start();
Consommation indicative :
- Uno actif : ~50 mA | sleep : ~35 µA avec watchdog
- ESP32 actif : ~240 mA | deep sleep : ~10 µA
8. Anti-patterns / Pièges
| Piège | Correction |
|---|
delay() dans loop() | Pattern millis() non-bloquant |
Variables ISR non volatile | Toujours déclarer volatile |
| Courant LED sans résistance | Calcul R obligatoire (→ brûle la broche) |
| ESP32 I/O à 5V direct | Diviseur résistif ou level shifter 3.3V |
String dynamique sur Uno | Utiliser char[] + snprintf() — String fragmente la SRAM |
Lire analogRead() sans stabilisation | Faire un premier analogRead() factice après changement de pin |
| Upload bloqué par Serial sur pins 0/1 | Utiliser SoftwareSerial sur d'autres pins |
| Lib manquante = erreur cryptique | Gestionnaire de bibliothèques : Ctrl+Shift+I |
9. Bonnes pratiques 2026
- PlatformIO (VS Code) plutôt qu'Arduino IDE pour les projets > 1 fichier : gestion de dépendances, multi-targets, CI possible.
- Schéma : utiliser Fritzing ou Wokwi (simulation en ligne) avant de câbler physiquement.
- Versionner le sketch dans Git (
.gitignore : build/, .pio/).
- Tests : avec PlatformIO + Unity, tester la logique métier hors matériel (native env).
- OTA : sur ESP32/ESP8266, prévoir
ArduinoOTA dès le départ pour les mises à jour sans fil.