📡 IoT

iot-arduino-project-guide

Développement de projets Arduino avec circuits, capteurs, code et communication série.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- iot-arduino-project-guide --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } iot-arduino-project-guide -Launch"

🚀 Déjà installé ?

claude "/iot-arduino-project-guide"

Ou tapez /iot-arduino-project-guide dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

ArduinocapteurservoGPIOcircuit Arduinosketch

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/iot-arduino-project-guide ~/.claude/skills/

Payload du plugin : skills/iot-arduino-project-guide · source éditable : iot-skills/arduino-project-guide

📖 Manuel

Arduino Project Guide

1. Analyse du besoin

Identifier avant tout :

Critères de sélection de carte :

BesoinCarte recommandée
Prototype simple, 5VArduino Uno / Nano
Nombreuses brochesArduino Mega 2560
WiFi intégréESP8266 (NodeMCU) / ESP32
Faible conso batterieArduino Pro Mini 3.3V / ESP32 deep sleep
BLE + WiFiESP32 DevKit

2. Conception du circuit

Avant de câbler :

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>          // I2C
// #include <SPI.h>        // SPI
// #include <SoftwareSerial.h>

// --- Constantes ---
const uint8_t PIN_LED   = 13;
const uint8_t PIN_BTN   = 2;   // interrupt-capable sur Uno
const unsigned long INTERVAL_MS = 1000;

// --- Variables globales (volatile si ISR) ---
volatile bool eventFlag = false;
unsigned long lastMillis = 0;

// --- ISR ---
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();

  // Tâche périodique non-bloquante (jamais de delay() en prod)
  if (now - lastMillis >= INTERVAL_MS) {
    lastMillis = now;
    readSensors();
    publishData();
  }

  // Traitement événement ISR
  if (eventFlag) {
    eventFlag = false;
    handleButton();
  }
}

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);
// setup: dht.begin();
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); // timeout 30ms
  return dur * 0.034 / 2; // cm
}

Servo

#include <Servo.h>
Servo srv;
// setup: srv.attach(9);
srv.write(90); // 0–180°

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.

// Stocker les strings en Flash, pas en SRAM
Serial.println(F("Démarrage OK"));

// Vérifier la SRAM libre
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>
// Mettre l'Uno en sleep entre lectures
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu(); // réveil par interrupt

// ESP32 deep sleep (µA)
esp_sleep_enable_timer_wakeup(30e6); // 30s
esp_deep_sleep_start();

Consommation indicative :


8. Anti-patterns / Pièges

PiègeCorrection
delay() dans loop()Pattern millis() non-bloquant
Variables ISR non volatileToujours déclarer volatile
Courant LED sans résistanceCalcul R obligatoire (→ brûle la broche)
ESP32 I/O à 5V directDiviseur résistif ou level shifter 3.3V
String dynamique sur UnoUtiliser char[] + snprintf()String fragmente la SRAM
Lire analogRead() sans stabilisationFaire un premier analogRead() factice après changement de pin
Upload bloqué par Serial sur pins 0/1Utiliser SoftwareSerial sur d'autres pins
Lib manquante = erreur cryptiqueGestionnaire de bibliothèques : Ctrl+Shift+I

9. Bonnes pratiques 2026