← 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.
Code sur GitHub ↗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.
- Station ouverte ? Un capteur de luminosité est lu. S’il fait nuit, l’écran affiche « Closed Station » et tout est bloqué.
- Carte insérée. Un capteur détecte la carte ; tant qu’elle n’est pas là, la borne attend.
- 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.
- Retrait de la carte. Impossible de servir tant que la carte est encore détectée, comme sur les bornes CB.
- Pistolet décroché. L’écran invite à prendre le pistolet tant qu’il est raccroché.
- Distribution. Tant que la gâchette est maintenue, le carburant « coule » : litres et prix s’affichent en direct.
- Ticket. Pistolet raccroché, la borne affiche le récapitulatif (litres + montant) puis « À bientôt ! ».
Entrées et sorties.
| Composant | Broche(s) | Rôle |
|---|---|---|
| Clavier matriciel 4×3 | 22–28 | Saisie du code PIN |
| Écran LCD 16×2 | 8, 9, 2, 3, 5, 6 | Instructions, litres, montant |
| Capteur de luminosité | A1 | Horaires d’ouverture |
| Détection carte | 12 | Carte insérée ou retirée |
| Détection pistolet | 10 | Pistolet décroché ou raccroché |
| Gâchette | 4 | Maintenue = distribution |
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.
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(); } } } }
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.
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.