Aller au contenu
Projet personnel · en cours depuis avril 2026
CarLog

Un datalogger embarqué pour une Honda Civic EJ9 convertie à l'E85 : du capteur au tableau de bord.

6 163 km

de roulage enregistrés

574

trajets enregistrés

507 ms

intervalle médian entre deux lignes de log (version a2.9.4)

+1,2 %

d'écart entre la consommation calculée et la pompe, sur 14 cycles plein à plein (6 083 km)

Données au 28/09/2026 · recalculées le 28/09/2026

01 · Genèse

Comprendre ce qui se passe sous le capot quand on passe à l'éthanol.

Première Civic, une EJ9 phase 1.5 à moteur D14A4, sans prise OBD standard. Pour y accéder, j'ai découvert HonDash, une application développée par un Slovaque, avec un dongle dédié. J'y ai appris sur le tas l'injection, les capteurs, l'allumage piloté : en lisant des forums, en testant, en comparant des valeurs en temps réel.

Seconde Civic, une EJ9 phase 2 à moteur D14Z2, avec prise OBD. TorquePro n'arrivait pas à y stabiliser la consommation : bus K-Line lent et requêtes mal ordonnancées. En repensant à la logique dédiée de HonDash, l'idée a germé : construire mon propre système, avec mon propre ordonnanceur.

02 · Choix techniques

Chaque brique, et comment elle a évolué.

Le projet a d'abord été maquetté pour valider l'idée, puis consolidé brique par brique. Chaque ligne se lit de gauche à droite : ce qui a servi à maquetter, ce qui tourne aujourd'hui, ce qui vient ensuite.

L'application

Le téléphone est déjà là : aucun matériel à racheter. Et une version Android, puis iOS, pourrait un jour être vendue.

MaquettageAndroid, Kotlin : version 2.1, « fonctionnelle à 90 % ».
Aujourd'hui · a2.9Audits, 393 tests automatiques, démarrage et arrêt du log automatiques.
Ensuitea3.0.0 : réécriture en Kotlin Multiplatform et Compose.
Le stockage

Un format de sortie stable, décrit par un contrat, pour que l'analyse ne casse jamais en silence.

MaquettageUn CSV par trajet et un journal JSON (pleins, versions, événements).
Aujourd'hui · a2.9CSV jusqu'à 62 colonnes, trois états (mesuré, échec, non applicable) et un dictionnaire des colonnes qui fait foi.
Ensuitea3.0.0 : base SQLite (SQLDelight) dans l'app, le journal y bascule, l'historique est importé. L'export CSV reste disponible à la demande.
Le passage vers l'analyse

MaquettageExports ZIP complets ou incrémentaux.
Aujourd'hui · a2.9Import des exports dans la base DuckDB du tableau de bord.
EnsuiteExport incrémental du fichier de base, attaché directement par DuckDB.
L'acquisition moteur

Le bus K-Line est lent : chaque requête compte.

MaquettageDongle ELM327 (Klavkarr), lectures enchaînées sans ordonnanceur.
Aujourd'hui · a2.9Ordonnanceur piloté par la mesure : +74 % de débit, une ligne toutes les 507 ms en médiane.
EnsuiteSniffer du faisceau côté ECU, sur STM32 ou ESP32, pour atteindre au moins 5 Hz.
Les capteurs

Ce que l'OBD ne donne pas : météo, températures réelles, bientôt l'éthanol.

MaquettageESP32 sur batterie, météo (BME280) et deux températures (DS18B20), en UDP.
Aujourd'hui · a2.9Même montage, pas encore fixé : son silence est un état normal.
EnsuiteInstallation définitive des trois capteurs, puis capteur E85 et sonde lambda large bande.
La position

MaquettageGPS externe GNS3000.
Aujourd'hui · a2.91 Hz : suffisant pour la distance, limite pour la dynamique fine.
EnsuiteUn récepteur plus rapide n'est pas exclu.
L'analyse

Une pile rapide à monter pour maquetter et tester, validée avec Gemini avant de démarrer.

MaquettagePython, DuckDB, Streamlit.
Aujourd'hui · a2.9Maquettage fonctionnel ; score d'éco-conduite en cours.
EnsuiteAlpha étendue, puis bêta ouverte.
Le modèle de consommation

Speed-density : le carburant se déduit du régime, de la pression d'admission et d'une courbe d'efficacité volumétrique.

MaquettagePseudo-VE extrapolée de la physique.
Aujourd'hui · a2.9Recalibrée sur les pleins : +1,2 % d'écart sur 14 cycles.
EnsuiteVE physique mesurée au banc, moteur d'origine.

03 · Évolutions

De la version « fonctionnelle à 90 % » à la réécriture.

02/04/2026v1Premiers logs. Leur continuité s'est perdue : voir les erreurs.
03/05/20262.0.0Première installation relevée dans le journal de l'app.
avant le 19/072.1 → a2.6ESP32, fusion de capteurs pour la vitesse, gestion des tunnels, poids et passagers.
19/07/2026a2.6.1Premier audit : corrections critiques.
25/07/2026a2.8.0Ordonnanceur piloté par la mesure : +74 % de débit OBD (3,77 → 6,55 requêtes/s), cadences conditionnelles, trois états dans le CSV.
27/07/2026a2.8.2La boucle qui tournait à vide : voir les erreurs.
05/08/2026a2.8.13Les pauses d'enregistrement laissent une trace dans le CSV.
11/09/2026a2.9.0Le log démarre, se met en pause et s'arrête seul.
21/09/2026a2.9.1 → a2.9.3Audit complet : ce qui est perdu se dit. Aucune ligne perdue en silence.
en coursa3.0.0Nouveau stockage et passage en Kotlin Multiplatform.

Dates d'installation lues dans le journal de l'app (événements de mise à jour).

04 · Erreurs

Ce qui a raté, et ce que j'en ai retenu.

01
La continuité des logs v1, perdue

Au début, j'ai mis l'app à jour en la désinstallant puis en la réinstallant, au lieu d'une mise à jour qui conserve les données. Une partie des logs a survécu, pas leur continuité. Le « 0,56 L d'écart sur environ 1 000 km » annoncé en v1 était cité de mémoire : il attend d'être recalculé sur le trajet qui subsiste.

Une mise à jour ne passe jamais par une désinstallation. Exporter avant toute intervention, et ne publier un chiffre qu'avec ses données.

02
La boucle qui tournait à vide

En cadençant deux lectures, j'ai retiré sans le voir ce qui temporisait la boucle. Résultat au roulage du 28/07 : 626 à 695 lignes par seconde au lieu de 2, soit 1 817 380 lignes en 48 minutes et 460 Mo pour un seul trajet.

Quand on retire un délai, chercher ce qui en dépendait. Les mesures étaient justes : seules les lignes étaient dupliquées.

03
Un zéro qui n'en était pas un

En cas d'échec de lecture, le décodage renvoyait « 0 ». Chaque coupure injectait un zéro indiscernable d'une vraie mesure, dans tous les logs historiques.

Une valeur de repli prise parmi les valeurs valides est une corruption silencieuse. D'où les trois états : mesuré, échec, non applicable.

04
Le +13,3 % qui était faux

Le modèle semblait surestimer la consommation de 13,3 %. La comparaison incluait 13 jours roulés après le dernier plein. Entre pleins consécutifs, l'écart tombait à +1,9 %.

Un bilan de matière ne vaut que sur un cycle fermé.

05 · Données de roulage

Où tourne le moteur, et ce que la courbe en fait.

Les deux graphiques partagent le même axe des régimes. La zone de croisière, de 1 250 à 2 000 tr/min, est surlignée sur les deux.

Temps passé par régime[part du temps dans la zone]
rapport engagépoint mortrapport non journalisé (logs avant a2.8.2)
Efficacité volumétrique (VE)D14Z2 · courbe du modèle

Régime moteur en tr/min.

Courbe VE : pseudo-VE du code de l'app, extrapolée de la physique et recalibrée sur les pleins. Le pic de VE coïncide avec le couple maximal (4 800 tr/min, pas de la table : 250) ; la puissance maximale est à 6 300 tr/min.

06 · Consommation

Le calcul, confronté à la pompe.

Pour chaque cycle entre deux pleins complets, les litres calculés par l'app sont comparés aux litres réellement achetés, lus dans le journal des pleins. Les pointillés marquent chaque nouvelle version de l'app.

Écart calcul / pompe par cycle[total]

Chaque barre couvre la durée d'un cycle. Au-dessus de zéro, le calcul surestime. Bande claire : objectif de ±2 %. Survoler une barre pour le détail, ou l'espace entre deux pointillés pour la version en service.

Premier gain concret

Grâce au suivi en direct et à des logs enfin fiables, j'ai modifié ma conduite en ville et dans les bouchons. Résultat : environ 0,5 L/100 km de moins qu'à l'époque où je loggais avec Torque, avant mon application.

Ce gain compare deux périodes de conduite, avant et après l'application. Il ne mesure pas l'écart calcul / pompe du graphique ci-dessus. Le détail de la mesure fera l'objet d'un article dans le Lab.

07 · En cours

maquettage fonctionnel

Le tableau de bord Python

Le support principal de l'analyse : import des trajets dans DuckDB, puis quatre usages visés.

1Tableau de bord interactif : trajets, voyages, consommations, coûts, cartes, anomalies.
2Rétro-ingénierie : courbe de VE, avance, boucles de sonde lambda.
3Prédiction de consommation d'un trajet à préparer.
4Maintenance prédictive : alerter quand une valeur dérive.
Analyse d'un trajet dans le tableau de bord : tracé GPS coloré par la vitesse, courbes de vitesse et de régime, répartition autoroute, ville et route
Analyse d'un trajet du 27/07/2026 dans la maquette. Capture faite hors ligne : le fond de carte n'est pas chargé.
brique du tableau de bord · en cours

Le score d'éco-conduite

Il ne note pas une conduite dans l'absolu. Il répond à une question : combien ai-je consommé, par rapport à ce que j'aurais dû consommer ? « Ce que j'aurais dû » est un calcul de physique : masse, surface frontale, pneus, distance, dénivelé, vitesse.

Global
tous les pleins
pompe
Plein
σ 4,1 pts
pompe
Trajet
σ 6,3 pts
modèle
Tronçon
σ 33,6 pts
modèle

Le tronçon est la seule échelle qui isole la conduite : deux passages sur la même voie partagent le relief, la route et les feux.

08 · Limites et problèmes connus

Une VE qui n'est pas mesurée

La courbe d'efficacité volumétrique est extrapolée de la physique, puis recalibrée sur les pleins. Elle est juste en moyenne sur un plein, pas à chaque instant. Un passage au banc, moteur d'origine, doit donner une VE physique exploitable.

Une dépendance circulaire

La vitesse estimée dépend du rapport engagé, et le rapport se déduit de la vitesse. Solution prévue : un capteur de position de rapport fait maison.

Un taux d'éthanol mesuré à la main

Test de séparation à l'eau : 10 mL d'eau pour 100 mL d'E85, précision de ±1 %. Environ 0,085 € par test, soit 3 € par an au plus, mais près de 4 L de déchets par an, eau et carburant. D'où le capteur E85 prévu.

Un GPS à 1 Hz

Le récepteur externe GNS3000 donne une position par seconde. Suffisant pour la distance, limite pour la dynamique fine. Un récepteur plus rapide n'est pas exclu.

Un projet développé avec l'IA, par choix

Je n'écris ni le C++ de l'ESP32, ni le Kotlin de l'app, ni le Python du tableau de bord : le code est produit par IA générative. Mon travail est ailleurs : l'architecture du projet, la physique du moteur et la donnée brute. Cahiers de décision, audits, dictionnaire des colonnes, pièges documentés : c'est ce pilotage qui fait tenir un projet de cette taille, et c'est ce savoir-faire que CarLog démontre.

09 · Feuille de route

La route, étape par étape.

Liste d'étapes non exhaustive, appelée à évoluer.

court terme
  • Version alpha a3.0.0 : nouveau système de stockage dans l'app Android et passage en Kotlin Multiplatform.
  • Installation définitive de l'ESP32 et de ses trois capteurs.
moyen terme
  • Passage au banc, moteur d'origine, pour une VE physique exploitable.
  • Sondes importantes : capteur E85 et sonde lambda large bande.
  • Mise en fonction étendue de l'alpha du tableau de bord Python.
moyen à long terme
  • Valider les maths et la physique, puis une bêta plus ouverte : tests sur plusieurs Honda avec des bêta-testeurs.
  • Tableau de bord : fin du maquettage et bêta ouverte.
  • Sniffer du faisceau côté ECU, sur STM32 ou ESP32, pour atteindre au moins 5 Hz.
long terme
  • Capteurs supplémentaires.
  • Version de production de l'app.
  • Version pro : carte industrielle sous Linux et application sur mesure intégrée.

En construction