Un Pong multijoueur où l'écran est un Minitel de 1982 et les manettes sont les téléphones des joueurs. Pas d'app à installer : on scanne le QR code, on touche l'écran, on joue.

Bun · Hono React · Vite · PWA ESP32 · Videotex WebSocket 30 Hz Licence MIT
Comment ça marche ▾ Code source ↗
▚ rendu Videotex 40×25 · diff différentiel

Le concept

Du vieux matériel, du temps-réel, et zéro installation côté joueur.

📺

L'écran : un Minitel

Un terminal Videotex des années 80, ressorti du placard. Le jeu s'affiche en 40×25 caractères verts, piloté par un ESP32 en liaison série.

📱

La manette : ton téléphone

Une web-app PWA tactile. On scanne le QR code affiché sur le Minitel, et le smartphone devient une raquette. Aucune application à installer.

Le quiz bonus

Entre les manches, une question surprise. Le premier à répondre juste gagne une raquette agrandie pour l'échange suivant.

🏆

Le classement

Points, séries de victoires et prestige : un classement général retrace les exploits de toute la soirée.

Le défi technique

Tenir 20+ FPS sur un bus à 480 octets/seconde.

Un Minitel communique en Videotex à 4800 bauds — soit 480 octets par seconde. Effacer et redessiner l'écran entier à chaque frame plafonne à ~2 FPS. La solution : un renderer différentiel qui ne retransmet que les caractères qui changent (la balle, les raquettes, le score), laissant le reste de l'écran statique.

Stratégie A — full clear   :  2,2 FPS  → inacceptable
Stratégie B — diff simple  :   20 FPS  → limite acceptable
Stratégie C — diff optimisé:   22 FPS  → production ✓

Le serveur est la seule source de vérité sur l'état du jeu : ESP32 et téléphones sont des clients stateless qui reçoivent des snapshots et affichent. Un joueur se déconnecte sans interrompre la partie ; l'ESP32 qui redémarre se resynchronise au message suivant.

Architecture

Trois couches découplées, reliées par WebSocket et liaison série.

          ┌───────────────────────────────────────────┐
          │              Serveur (cloud)                │
          │   Machine à états  IDLE → WAITING → PLAYING │
          │   Moteur physique  30 Hz · Quiz · Classement│
          └───────────────┬───────────────┬─────────────┘
                  WebSocket │               │ WebSocket
            ┌───────────────▼──┐      ┌─────▼──────────────┐
            │   ESP32           │      │  Smartphone (PWA)  │
            │  WiFi + renderer  │      │  React · tactile   │
            │  différentiel     │      └────────────────────┘
            └────────┬──────────┘
              Série 4800 bauds
            ┌────────▼──────────┐
            │   Minitel 1982     │
            │  Videotex 40×25    │
            └────────────────────┘
ComposantRôleStack
server/Serveur de jeu, broker WebSocket, SQLiteBun, Hono, TS
webapp/Manette tactile PWAReact 18, Vite, TS
esp32/Firmware affichage MinitelC++, Arduino
simulator/Benchmark des stratégies de renduNode.js

Reproduire le setup

Du matériel à la partie, sans fer à souder.

📺

1 · Un Minitel

Modèle 1, 1B ou 2 avec prise péri-informatique (DIN 5 broches à l'arrière).

🔌

2 · Le dongle ESP32-Minitel

La pièce qui rend le projet reproductible : elle s'enfiche sur la prise DIN et expose l'ESP32 en USB, sans câblage maison. Vendue prête à l'emploi par iodeo ↗.

☁️

3 · Ton propre serveur

Déploie le serveur (image Docker sur un VPS, ou en local) : c'est lui qui pilote le jeu. Un serveur par Minitel — l'état de la partie vit en mémoire dans une seule instance, alors deux Minitels branchés sur le même serveur partageraient le même lobby. Note son URL pour l'étape suivante.

4 · Flasher

Copier config.h.example, renseigner WiFi et l'URL de ton serveur, puis téléverser MinitelPong.ino depuis l'Arduino IDE.

🎮

5 · Jouer

Brancher le dongle, allumer le Minitel : le QR s'affiche. Les joueurs le scannent et la partie démarre à deux.

Conçu pour l'événementiel

Tourner sans supervision pendant une AG, une soirée, un stand.

ESP32

Watchdog WiFi (60 s) et reconnexion automatique avec retry.

Webapp

Reconnexion WebSocket avec backoff exponentiel (1 s → 30 s), keepalive toutes les 20 s.

Serveur

Timeout de déconnexion configurable, machine à états qui revient proprement en IDLE.

Auto-hébergé

Déployable en une image Docker sur un VPS (Coolify), sans dépendance à un service tiers.