Électronique & Embarqué

Arduino
Programmation & Composants

De la LED clignotante à l'afficheur 7 segments complet — comprendre l'électronique de base, maîtriser le langage Arduino C++ et câbler des composants réels.

C'est quoi Arduino ?

Arduino est une plateforme de prototypage électronique basée sur un microcontrôleur (ATmega328P sur l'Uno). Il exécute un programme en boucle infinie, lit des capteurs et contrôle des actionneurs.

🆚
Arduino vs Raspberry Pi :
Arduino est un microcontrôleur — il exécute un seul programme en temps réel, pas d'OS, démarrage en millisecondes, parfait pour contrôler des moteurs, LEDs, capteurs.
Raspberry Pi est un micro-ordinateur — il fait tourner Linux, Python, des serveurs web, etc.
🔢

L'Arduino Uno est le modèle de référence : ATmega328P @ 16 MHz, 32 KB Flash, 2 KB RAM, 14 broches digitales, 6 analogiques. Le code est écrit en C++ simplifié (IDE Arduino ou VS Code + PlatformIO).

USB POWER DIGITAL 0–13 ANALOG A0–A5 ATmega 328P 16 MHz L (13) RST Vin GND 5V 3.3V 0 1 ~3 ~5 ~6 7 8 ~9 ~10 ~11 12 13
■ Digitales ~ PWM ■ Analogiques ■ Alimentation

Broches & Pinout — Arduino Uno

BrocheTypeTension / CourantUsage
GNDPOWER0 VMasse commune — toujours connecter
5VPOWER5 V / 500 mA maxAlimentation composants 5V
3.3VPOWER3.3 V / 150 mA maxComposants 3.3V (ESP, capteurs)
VinPOWER7–12 V entréeAlimentation externe (batterie, adaptateur)
D0–D13DIGITAL0–5 V / 40 mA maxHIGH (5V) ou LOW (0V)
~3,5,6,9,10,11PWM0–5 V analogique simuléVariation de luminosité, vitesse moteur
A0–A5ANALOG0–5 V → 0–1023Lecture potentiomètre, capteur lumière…
D0 (RX) D1 (TX)UART5 VCommunication série (éviter pendant upload)
D10–D13SPI5 VCommunication SPI (écrans, SD cards)
A4 (SDA) A5 (SCL)I2C5 VBus I2C — LCD, capteurs, multiplexeurs
⚠️

Limites à respecter absolument :
— Jamais plus de 40 mA sur une broche digitale (grille le microcontrôleur).
— Jamais plus de 200 mA au total sur toutes les broches.
— Toujours une résistance en série avec une LED (≥ 220 Ω sur 5V).
— Ne jamais connecter 5V directement sur une entrée analogique > 5V.

💡

Règle d'or : quand tu doutes de la valeur d'une résistance pour une LED, utilise 330 Ω. La LED sera un peu moins lumineuse mais tu ne risques rien. Calcul exact : R = (Vcc - Vled) / I = (5 - 2) / 0.02 = 150 Ω minimum.

Calcul de résistance LED
// R = (Vcc - Vled) / I_led
// Vcc  = 5V (Arduino)
// Vled = 2.0V (LED rouge/verte) ou 3.2V (bleue/blanche)
// I    = 20 mA = 0.020 A (courant typique)

// LED rouge sur 5V :
// R = (5.0 - 2.0) / 0.020 = 150 Ω → utiliser 220 Ω (standard)

// LED bleue sur 5V :
// R = (5.0 - 3.2) / 0.020 = 90 Ω → utiliser 100 Ω

Langage Arduino — C++ simplifié

Types de données Arduino
// Types entiers
int           x = 42;      // -32768 à 32767 (16 bits)
unsigned int  u = 65535;  // 0 à 65535
long          l = 100000; // -2M à 2M (32 bits)
byte          b = 255;    // 0 à 255 — très utilisé pour les broches

// Types décimaux (éviter — lents sur Arduino)
float  f = 3.14;
double d = 3.14159;

// Booléens
bool  actif = true;
bool  etat  = false;

// Constantes prédéfinies
HIGH    // = 1  (broche à 5V)
LOW     // = 0  (broche à 0V)
INPUT   // broche en entrée
OUTPUT  // broche en sortie
INPUT_PULLUP  // entrée avec résistance pull-up interne

// Tableaux
int broches[] = {2, 3, 4, 5};
byte segments[7] = {0, 0, 0, 0, 0, 0, 0};
Fonctions Arduino essentielles
// ── Configuration des broches ──────────────
pinMode(13, OUTPUT);        // broche 13 en sortie
pinMode(2,  INPUT);         // broche 2 en entrée
pinMode(7,  INPUT_PULLUP);  // entrée + résistance interne 20kΩ

// ── Écriture digitale ─────────────────────
digitalWrite(13, HIGH);  // broche 13 → 5V  (LED allumée)
digitalWrite(13, LOW);   // broche 13 → 0V  (LED éteinte)

// ── Lecture digitale ──────────────────────
int etat = digitalRead(2); // HIGH ou LOW

// ── PWM (broches ~) ───────────────────────
analogWrite(9, 128);   // 0–255 → 0%–100% (50% ici)
analogWrite(9, 0);     // éteint
analogWrite(9, 255);   // pleine puissance

// ── Lecture analogique ────────────────────
int val = analogRead(A0); // 0–1023 (10 bits)

// ── Temporisation ─────────────────────────
delay(1000);           // attendre 1 seconde (bloquant !)
delayMicroseconds(500);// attendre 500 µs
unsigned long t = millis(); // temps écoulé depuis démarrage (ms)

// ── Cartographie de valeurs ───────────────
int angle = map(val, 0, 1023, 0, 180); // remappe 0-1023 → 0-180
int clamp = constrain(val, 0, 255);     // borne entre 0 et 255

Structure d'un sketch — setup() & loop()

Squelette complet d'un sketch Arduino
// ① Variables et constantes globales
const int PIN_LED = 13;   // LED intégrée de l'Uno
const int PIN_BTN = 2;
bool etatLed = false;
unsigned long dernierAppui = 0;

// ② setup() — exécuté UNE SEULE FOIS au démarrage
void setup() {
  Serial.begin(9600);              // ouvrir port série
  pinMode(PIN_LED, OUTPUT);         // LED = sortie
  pinMode(PIN_BTN, INPUT_PULLUP);   // bouton = entrée
  Serial.println("Arduino démarré !");
}

// ③ loop() — exécuté EN BOUCLE INFINIE (le cœur du programme)
void loop() {
  if (digitalRead(PIN_BTN) == LOW) { // bouton pressé (pull-up → LOW)
    unsigned long maintenant = millis();
    if (maintenant - dernierAppui > 200) { // anti-rebond 200ms
      etatLed = !etatLed;
      digitalWrite(PIN_LED, etatLed ? HIGH : LOW);
      dernierAppui = maintenant;
      Serial.print("LED : ");
      Serial.println(etatLed ? "ON" : "OFF");
    }
  }
}

// ④ Fonctions personnalisées (après loop)
void cligner(int broche, int fois, int duree) {
  for (int i = 0; i < fois; i++) {
    digitalWrite(broche, HIGH); delay(duree);
    digitalWrite(broche, LOW);  delay(duree);
  }
}
setup() — initialisation
Appelée une seule fois. Configurer les broches (pinMode), initialiser la communication série, définir les valeurs de départ. Tout ce qu'on doit faire avant la boucle principale.
loop() — boucle principale
Appelée en boucle infinie — des milliers de fois par seconde si rien ne bloque. C'est ici que vit la logique : lire des capteurs, prendre des décisions, mettre à jour les sorties.
⚠️ Éviter delay() dans loop()
delay() bloque tout le programme pendant N ms — Arduino ne peut rien faire d'autre. Préférer millis() pour gérer plusieurs tâches simultanément (technique "blink without delay").
Blink sans delay — millis()
unsigned long dernierBlink = 0;
bool etatLed = false;

void loop() {
  if (millis() - dernierBlink >= 500) {
    etatLed = !etatLed;
    digitalWrite(LED_BUILTIN, etatLed);
    dernierBlink = millis(); // reset chrono
  }
  // Ici d'autres traitements peuvent tourner en parallèle !
}

LED & résistances — le premier circuit

Arduino PIN 13 → GND → 220 Ω + GND
Circuit LED basique — PIN 13 → 220Ω → LED → GND
Blink LED — le "Hello World" Arduino
void setup() {
  pinMode(13, OUTPUT);  // ou LED_BUILTIN
}

void loop() {
  digitalWrite(13, HIGH); // LED allumée
  delay(1000);             // attendre 1s
  digitalWrite(13, LOW);  // LED éteinte
  delay(1000);             // attendre 1s
}

Simulation interactive — clique pour basculer :

PIN 13
LOW — éteinte
LEDs multiples en tableau
const int NB_LEDS = 4;
int broches[NB_LEDS] = {8, 9, 10, 11};

void setup() {
  for (int i = 0; i < NB_LEDS; i++) {
    pinMode(broches[i], OUTPUT);
  }
}

void loop() {
  // Chenillard de gauche à droite
  for (int i = 0; i < NB_LEDS; i++) {
    digitalWrite(broches[i], HIGH);
    delay(100);
    digitalWrite(broches[i], LOW);
  }
}

Bouton-poussoir & anti-rebond

Bouton avec INPUT_PULLUP (câblage simplifié)
// Câblage : broche 2 → bouton → GND
// Pas de résistance externe nécessaire — pull-up interne 20kΩ
// Logique inversée : broche LOW quand bouton pressé !

const int BTN = 2;
const int LED = 13;
bool ledOn = false;
bool dernierEtat = HIGH;
unsigned long dernierChangement = 0;

void setup() {
  pinMode(BTN, INPUT_PULLUP); // résistance interne 20kΩ vers 5V
  pinMode(LED, OUTPUT);
}

void loop() {
  bool etatActuel = digitalRead(BTN);

  // Anti-rebond : ignorer les changements < 50ms
  if (etatActuel != dernierEtat &&
      millis() - dernierChangement > 50) {

    if (etatActuel == LOW) { // front descendant = appui
      ledOn = !ledOn;
      digitalWrite(LED, ledOn);
    }
    dernierChangement = millis();
    dernierEtat = etatActuel;
  }
}
🔄

Pourquoi INPUT_PULLUP ? Sans résistance, une broche en entrée "flotte" — elle capte les parasites électromagnétiques et lit des valeurs aléatoires. La résistance pull-up interne (20 kΩ) maintient la broche à 5V quand le bouton est ouvert. Appuyer sur le bouton connecte la broche à GND (LOW).

⚠️

Le rebond des contacts : Physiquement, un bouton "rebondit" 5 à 20 fois en quelques millisecondes lors d'un appui. Sans anti-rebond, Arduino lit 5 à 20 appuis. Solution logicielle : ignorer les changements pendant 50 ms après le premier front. Solution matérielle : condensateur 100 nF entre la broche et GND.

Compteur de clics avec Serial
int compteur = 0;

void loop() {
  if (etatActuel == LOW && dernierEtat == HIGH) {
    compteur++;
    Serial.print("Appuis : ");
    Serial.println(compteur);
  }
  // Affichage moniteur série : Outils → Moniteur série (9600)
}

PWM — Variation de luminosité et de vitesse

PWM (Pulse Width Modulation) simule un signal analogique en allumant/éteignant très rapidement la broche. Le pourcentage de temps "HIGH" (rapport cyclique) détermine la tension moyenne perçue.

25% 50% 75% 100%
Rapport cyclique PWM — fréquence 490 Hz sur Arduino Uno
Variation LED avec potentiomètre
// Câblage :
// Potentiomètre : VCC → curseur → A0, et les 2 extrémités à 5V et GND
// LED : broche 9 (PWM) → 220Ω → LED → GND

const int POT = A0;
const int LED = 9;  // doit être une broche PWM (~)

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int lecture = analogRead(POT);        // 0 à 1023
  int luminosite = map(lecture, 0, 1023, 0, 255);
  analogWrite(LED, luminosite);          // 0 à 255
  Serial.println(luminosite);
  delay(10);
}
Respiration LED — fade in/out
const int LED = 9;

void loop() {
  // Augmenter progressivement
  for (int i = 0; i <= 255; i++) {
    analogWrite(LED, i);
    delay(8);  // 8ms × 255 = ~2 secondes
  }
  // Diminuer progressivement
  for (int i = 255; i >= 0; i--) {
    analogWrite(LED, i);
    delay(8);
  }
}

// LED RGB — 3 broches PWM
void setCouleur(int r, int v, int b) {
  analogWrite(9,  r);  // Rouge
  analogWrite(10, v);  // Vert
  analogWrite(11, b);  // Bleu
}

void loop() {
  setCouleur(255, 0,   0);   delay(500); // Rouge
  setCouleur(0,   255, 0);   delay(500); // Vert
  setCouleur(0,   0,   255); delay(500); // Bleu
  setCouleur(255, 100, 0);   delay(500); // Orange
}
💡

Pour contrôler un moteur DC avec PWM, ne jamais connecter le moteur directement sur une broche Arduino (trop de courant). Utiliser un transistor (2N2222, TIP120) ou un pont en H (L298N, L293D) comme interface de puissance.

Entrées analogiques — capteurs

Thermistance NTC — mesure de température
// Diviseur de tension : 5V → R_fixe(10kΩ) → A0 → NTC → GND
#include <math.h>

const float R_FIXE = 10000.0;   // 10 kΩ
const float BETA   = 3950.0;    // coefficient NTC (vérifier datasheet)
const float T0     = 298.15;    // 25°C en Kelvin
const float R0     = 10000.0;   // résistance à 25°C

void setup() { Serial.begin(9600); }

void loop() {
  int   brut = analogRead(A0);              // 0–1023
  float R_ntc = R_FIXE * (1023.0 / brut - 1.0);
  float tempK = 1.0 / (log(R_ntc / R0) / BETA + 1.0 / T0);
  float tempC = tempK - 273.15;

  Serial.print("Temp : ");
  Serial.print(tempC, 1);
  Serial.println(" °C");
  delay(1000);
}
Capteur lumière LDR + seuil LED
// LDR (Light Dependent Resistor) — diviseur de tension
// 5V → 10kΩ → A0 → LDR → GND
// Plus il fait sombre, plus la valeur lue est haute

const int LDR    = A0;
const int LED    = 13;
const int SEUIL  = 600;  // à calibrer selon ambiance

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int lumiere = analogRead(LDR);  // 0 (lumineux) → 1023 (sombre)

  if (lumiere > SEUIL) {
    digitalWrite(LED, HIGH);  // veilleuse automatique
    Serial.println("Sombre → LED ON");
  } else {
    digitalWrite(LED, LOW);
  }
  delay(100);
}

// Calibration interactive via Serial
void loop() {
  Serial.println(analogRead(LDR));  // observer les valeurs en direct
  delay(200);
}

Afficheur 7 segments — anatomie

Un afficheur 7 segments contient 7 LEDs (a à g) disposées en chiffre 8, plus une LED pour le point décimal (dp). Chaque segment est une LED indépendante.

💡

Deux types : Anode commune (CA) — la broche commune est reliée au +5V, on active un segment en mettant sa broche à LOW. Cathode commune (CC) — la broche commune est reliée à GND, on active un segment en mettant sa broche à HIGH. Vérifier le datasheet !

Correspondance segments → chiffres
Chiffreabcdefg
0
1
2
3
4
5
6
7
8
9

Simulateur interactif — clique sur un chiffre :

Code complet — afficheur 7 segments

Arduino D2 D3 D4 D5 D6 D7 D8 220Ω ×7 7-SEG a b c d e f g GND (broche commune CC) ← a ← b ← c ← d ← e ← f ← g
Câblage afficheur CC — 7 résistances 220Ω obligatoires
Correspondance broches
D2a (segment haut)
D3b (droite haut)
D4c (droite bas)
D5d (segment bas)
D6e (gauche bas)
D7f (gauche haut)
D8g (segment milieu)
GND → broche commune (CC)
Code complet — afficheur 7 segments cathode commune avec compteur
// ─── Broches pour les 7 segments (a, b, c, d, e, f, g) ───────────────────
// Afficheur CATHODE COMMUNE — HIGH allume, LOW éteint
const int SEG[7] = {2, 3, 4, 5, 6, 7, 8};
//                    a   b   c   d   e   f   g

// ─── Table des segments pour chaque chiffre 0–9 ──────────────────────────
// Ordre : {a, b, c, d, e, f, g}   1 = allumé, 0 = éteint
const byte CHIFFRES[10][7] = {
  {1,1,1,1,1,1,0}, // 0
  {0,1,1,0,0,0,0}, // 1
  {1,1,0,1,1,0,1}, // 2
  {1,1,1,1,0,0,1}, // 3
  {0,1,1,0,0,1,1}, // 4
  {1,0,1,1,0,1,1}, // 5
  {1,0,1,1,1,1,1}, // 6
  {1,1,1,0,0,0,0}, // 7
  {1,1,1,1,1,1,1}, // 8
  {1,1,1,1,0,1,1}, // 9
};

// ─── Bouton-poussoir pour incrémenter ────────────────────────────────────
const int BTN = 9;    // broche 9 → bouton → GND (INPUT_PULLUP)
int valeurAffichee = 0;
bool etatPrecedent = HIGH;
unsigned long dernierAppui = 0;

// ─── Fonctions ────────────────────────────────────────────────────────────
void afficher(int chiffre) {
  for (int i = 0; i < 7; i++) {
    digitalWrite(SEG[i], CHIFFRES[chiffre][i]);
  }
}

void eteindre() {
  for (int i = 0; i < 7; i++) {
    digitalWrite(SEG[i], LOW);
  }
}

// ─── setup ────────────────────────────────────────────────────────────────
void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(SEG[i], OUTPUT);
  }
  pinMode(BTN, INPUT_PULLUP);
  Serial.begin(9600);
  afficher(valeurAffichee);
  Serial.println("Afficheur 7 seg prêt — appuie sur le bouton !");
}

// ─── loop ─────────────────────────────────────────────────────────────────
void loop() {
  bool etatActuel = digitalRead(BTN);

  if (etatActuel == LOW && etatPrecedent == HIGH &&
      millis() - dernierAppui > 200) {          // anti-rebond
    valeurAffichee = (valeurAffichee + 1) % 10; // 0→1→…→9→0
    afficher(valeurAffichee);
    Serial.print("Affiche : ");
    Serial.println(valeurAffichee);
    dernierAppui = millis();
  }
  etatPrecedent = etatActuel;
}

Avec registre à décalage 74HC595 — 3 fils au lieu de 7

Le 74HC595 est un registre à décalage 8 bits — il reçoit les données en série (3 fils) et les retransmet en parallèle (8 sorties). Parfait pour piloter un afficheur 7 segments avec seulement 3 broches Arduino au lieu de 7.

🔌

Câblage 74HC595 → Arduino :

74HC595ArduinoRôle
DS (14)D11Données série (DATA)
SH_CP (11)D13Horloge (CLOCK)
ST_CP (12)D10Validation (LATCH)
VCC (16)5VAlimentation
GND (8)GNDMasse
OE (13)GNDActiver sorties (LOW)
MR (10)5VMaster Reset (HIGH = actif)
Q0–Q6→ 220Ω → segments a–gSorties vers l'afficheur
74HC595 + afficheur 7 segments — shiftOut()
const int DATA  = 11;  // DS
const int CLOCK = 13;  // SH_CP
const int LATCH = 10;  // ST_CP

// Chaque octet encode les 8 segments (bit 0 = a, bit 7 = dp)
// Cathode commune — 1 = allumé
const byte CHIFFRES[10] = {
  0b00111111, // 0 : a,b,c,d,e,f
  0b00000110, // 1 : b,c
  0b01011011, // 2 : a,b,d,e,g
  0b01001111, // 3 : a,b,c,d,g
  0b01100110, // 4 : b,c,f,g
  0b01101101, // 5 : a,c,d,f,g
  0b01111101, // 6 : a,c,d,e,f,g
  0b00000111, // 7 : a,b,c
  0b01111111, // 8 : tous
  0b01101111, // 9 : a,b,c,d,f,g
};

void afficher(byte donnee) {
  digitalWrite(LATCH, LOW);              // bloquer l'affichage
  shiftOut(DATA, CLOCK, MSBFIRST, donnee); // envoyer 8 bits en série
  digitalWrite(LATCH, HIGH);             // valider → afficher
}

void setup() {
  pinMode(DATA,  OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(LATCH, OUTPUT);
}

void loop() {
  for (int i = 0; i <= 9; i++) {
    afficher(CHIFFRES[i]);
    delay(800);
  }
  // Éteindre
  afficher(0b00000000);
  delay(500);
}

Écran LCD I2C — texte & données

📺

Le LCD 1602 I2C (16 colonnes × 2 lignes) se connecte avec seulement 4 fils grâce au module I2C : VCC→5V, GND→GND, SDA→A4, SCL→A5. Bibliothèque : LiquidCrystal_I2C. Adresse I2C typique : 0x27 ou 0x3F.

LCD I2C — affichage température
// Bibliothèque : LiquidCrystal_I2C (gestionnaire de bibliothèques IDE)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// LiquidCrystal_I2C(adresse, colonnes, lignes)
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  lcd.init();         // initialiser
  lcd.backlight();    // allumer le rétroéclairage

  lcd.setCursor(0, 0);       // colonne 0, ligne 0
  lcd.print("Arduino LCD !");

  lcd.setCursor(0, 1);       // colonne 0, ligne 1
  lcd.print("Temp: -- degC");
}

void loop() {
  float temperature = lireTemperature(); // fonction de l'ex. 08

  lcd.setCursor(6, 1);   // positionner après "Temp: "
  lcd.print(temperature, 1);
  lcd.print(" C  ");       // espaces pour effacer les anciens chiffres

  delay(1000);
}

// Effacer une partie de l'écran (éviter lcd.clear() — clignote)
void effacerLigne(int ligne) {
  lcd.setCursor(0, ligne);
  lcd.print("                "); // 16 espaces
}
LCD + 7 seg : station météo mini
// Projet combiné :
// - Potentiomètre sur A0 → simule une température
// - LCD 16×2 affiche "Temp: XX.X °C"
// - Afficheur 7 seg : dizaine de degrés (0–9)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
const int SEG[7] = {2,3,4,5,6,7,8};
const byte DIGITS[10] = {
  0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,
  0b01101101,0b01111101,0b00000111,0b01111111,0b01101111
};

void setup() {
  for(int i=0;i<7;i++) pinMode(SEG[i], OUTPUT);
  lcd.init(); lcd.backlight();
  lcd.setCursor(0,0); lcd.print("Station Meteo");
}

void afficher7Seg(int chiffre) {
  byte masque = DIGITS[chiffre];
  for(int i=0;i<7;i++)
    digitalWrite(SEG[i], (masque >> i) & 1);
}

void loop() {
  float temp = map(analogRead(A0), 0, 1023, 0, 400) / 10.0;

  lcd.setCursor(0,1);
  lcd.print("Temp: ");
  lcd.print(temp, 1);
  lcd.print(" C  ");

  int dizaine = (int)temp / 10;         // dizaine
  afficher7Seg(constrain(dizaine, 0, 9));
  delay(500);
}

Communication Série — debug & échanges

Lecture commandes depuis le PC
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  Serial.println("Commandes: ON, OFF, BLINK");
}

void loop() {
  if (Serial.available() > 0) {
    String cmd = Serial.readStringUntil('\n');
    cmd.trim();  // supprimer \r\n

    if      (cmd == "ON")    { digitalWrite(13, HIGH); Serial.println("LED allumée"); }
    else if (cmd == "OFF")   { digitalWrite(13, LOW);  Serial.println("LED éteinte"); }
    else if (cmd == "BLINK") { cligner(13, 5, 100);  Serial.println("Blink !"); }
    else                       { Serial.println("Commande inconnue"); }
  }
}

// Depuis Python (pyserial) ─────────────────────
// import serial, time
// s = serial.Serial('COM3', 9600, timeout=1)
// time.sleep(2)  # laisser l'Arduino se réinitialiser
// s.write(b'ON\n')
// print(s.readline().decode().strip())
Envoyer des données structurées (CSV)
// Arduino envoie : timestamp,temperature,luminosite
void loop() {
  float temp  = lireTemperature();
  int   lum   = analogRead(A1);

  Serial.print(millis());
  Serial.print(',');
  Serial.print(temp, 2);
  Serial.print(',');
  Serial.println(lum);    // println = fin de ligne
  delay(1000);
}
// Sortie : 5000,22.50,450
//          6000,22.48,460

// Python — lire et tracer en temps réel ────────
// import serial, csv, matplotlib.pyplot as plt
// s = serial.Serial('COM3', 9600)
// with open('data.csv','w') as f:
//   w = csv.writer(f)
//   w.writerow(['t','temp','lum'])
//   for _ in range(60):
//     line = s.readline().decode().strip().split(',')
//     w.writerow(line)
//     print(line)

Bibliothèques utiles

BibliothèqueUsageComposant
LiquidCrystal_I2CÉcran LCD 1602/2004 via I2CLCD 16×2
DHTTempérature + humiditéDHT11, DHT22
ServoContrôle servomoteur 0–180°SG90, MG90S
WireCommunication I2C (incluse)Tout composant I2C
SPICommunication SPI (incluse)SD, écrans, RF
EEPROMMémoire persistante (incluse)Interne ATmega
UltrasonicCapteur ultrasonique HC-SR04HC-SR04
KeypadClavier matriciel 4×4Keypad
FastLED / NeoPixelLEDs RGB adressablesWS2812, NeoPixel
IRremoteÉmission/réception infrarougeTélécommande IR
Servomoteur — bibliothèque Servo
#include <Servo.h>

Servo monServo;

void setup() {
  monServo.attach(9);   // broche signal du servo
  monServo.write(90);  // position centrale
}

void loop() {
  int pos = map(analogRead(A0), 0, 1023, 0, 180);
  monServo.write(pos);  // 0° à 180°
  delay(15);            // laisser le servo bouger
}
DHT22 — température + humidité
#include <DHT.h>

DHT dht(4, DHT22); // broche 4, type DHT22

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("Erreur lecture DHT !");
    return;
  }
  Serial.print("Humidité: "); Serial.print(h); Serial.print(" %  ");
  Serial.print("Temp: ");     Serial.print(t); Serial.println(" °C");
  delay(2000);
}

Cheat sheet Arduino

⚡ Fonctions entrées/sorties

pinMode(p, MODE)Configurer broche
digitalWrite(p, V)HIGH ou LOW
digitalRead(p)Lire HIGH/LOW
analogRead(p)0–1023 (A0–A5)
analogWrite(p, v)PWM 0–255 (~)
tone(p, freq, ms)Buzzer

⏱️ Temps & maths

millis()ms depuis démarrage
micros()µs depuis démarrage
delay(ms)Pause (bloquant)
map(v,a,b,c,d)Remapper une valeur
constrain(v,mn,mx)Borner une valeur
random(min,max)Nombre aléatoire

📡 Communication

Serial.begin(9600)Init série
Serial.print(v)Envoyer valeur
Serial.println(v)Envoyer + retour
Serial.available()Données reçues ?
Serial.readStringUntil('\n')Lire ligne
shiftOut(d,c,o,b)74HC595

🔌 Électronique rapide

Résistance LED220Ω (5V)
Courant max broche40 mA
Total max broches200 mA
INPUT_PULLUPRésistance 20kΩ interne
Anti-rebond logiciel50–200 ms
Adresse I2C LCD0x27 ou 0x3F

🔢 7 segments — câblage CC

Segment a (haut)D2 → 220Ω
Segment b (dr. haut)D3 → 220Ω
Segment c (dr. bas)D4 → 220Ω
Segment d (bas)D5 → 220Ω
Segment e (g. bas)D6 → 220Ω
Segment f (g. haut)D7 → 220Ω
Segment g (milieu)D8 → 220Ω
Broche commune CC→ GND

74HC595 — shiftOut

DS (14)DATA → D11
SH_CP (11)CLOCK → D13
ST_CP (12)LATCH → D10
OE (13)→ GND
MR (10)→ 5V
Chiffre en binaire0b01111111 = 8