← Tous les projets

P—07 · Étude de cas

Pompe à essence

Reproduire tout le parcours d’un client à une pompe automatique 24h/24, de l’insertion de la carte au ticket final, sur une carte Arduino et un écran de deux lignes.

RôleSystèmes embarqués
CadreProjet école · IMT Nord Europe
MatérielArduino · clavier · LCD 16×2
LangageC / Arduino
Code sur GitHub ↗
01 — Le principe

Une borne, sept étapes.

Le système est une machine à états : chaque étape doit être validée avant de passer à la suivante, exactement comme sur une vraie borne. Voici le parcours tel que l’utilisateur le vit.

  1. Station ouverte ? Un capteur de luminosité est lu. S’il fait nuit, l’écran affiche « Closed Station » et tout est bloqué.
  2. Carte insérée. Un capteur détecte la carte ; tant qu’elle n’est pas là, la borne attend.
  3. Code PIN. Quatre chiffres sur un clavier 4×3, masqués au fur et à mesure par des « * ». Trois erreurs et la carte est bloquée.
  4. Retrait de la carte. Impossible de servir tant que la carte est encore détectée, comme sur les bornes CB.
  5. Pistolet décroché. L’écran invite à prendre le pistolet tant qu’il est raccroché.
  6. Distribution. Tant que la gâchette est maintenue, le carburant « coule » : litres et prix s’affichent en direct.
  7. Ticket. Pistolet raccroché, la borne affiche le récapitulatif (litres + montant) puis « À bientôt ! ».
02 — Câblage

Entrées et sorties.

ComposantBroche(s)Rôle
Clavier matriciel 4×322–28Saisie du code PIN
Écran LCD 16×28, 9, 2, 3, 5, 6Instructions, litres, montant
Capteur de luminositéA1Horaires d’ouverture
Détection carte12Carte insérée ou retirée
Détection pistolet10Pistolet décroché ou raccroché
Gâchette4Maintenue = distribution
03 — Le code

La boucle de distribution.

Toutes les secondes où la gâchette est maintenue, on ajoute 2 L, on recalcule le prix et on rafraîchit l’écran. Le réservoir est plafonné à 45 L. Le temps est mesuré avec millis() plutôt que delay(), pour que la borne continue de réagir pendant le remplissage.

pompe.inoC / Arduino
float P_SP22 = 4.30;                 // prix au litre

while (digitalRead(10) == 1) {           // pistolet en main
  if (digitalRead(4) == 1) {           // gâchette appuyée
    unsigned long t0 = millis();
    while (digitalRead(4) == 1 && plein < 45) {
      if (millis() - t0 >= 1000) {
        plein += 2;                       // +2 L par seconde
        prix = (plein - LPT) * P_SP22;
        lcd.clear();
        lcd.print(plein);
        lcd.setCursor(10, 0);
        lcd.print(prix);
        t0 = millis();
      }
    }
  }
}
04 — Sécurité

Se comporter comme une vraie pompe.

  • Anti-fraude : après trois codes faux, la carte est marquée bloquée et refusée.
  • Retrait obligatoire de la carte avant de servir, pour ne pas l’oublier dans la borne.
  • Pas de distribution sans pistolet décroché, et pas de ticket sans pistolet raccroché.
  • Prix recalculé en continu à partir du volume réellement servi.
05 — Ce que j’en retiens

Les acquis.

  • Modéliser un parcours utilisateur en machine à états et n’autoriser que les transitions valides.
  • Sécuriser une interface qui touche à de l’argent : authentification, limitation des essais, blocage.
  • Écrire des boucles temps réel non bloquantes.
  • Guider l’utilisateur avec 32 caractères d’écran : chaque message compte.