Re: Panneau d'affichgage de gare
Posté : 27 juil. 2026, 15:48
Ah oui, on pourrait 
Le forum des passionnés de trains miniature, de petites autos etc etc
https://forum-passionnement.eu/




Code : Tout sélectionner
#pragma once
// ---------- Page web servie par l'ESP32 (reglage de l'heure) ----------
// Le JavaScript lit l'heure LOCALE du téléphone (déjà juste, été/hiver
// géré automatiquement par le téléphone) et l'envoie à l'ESP32.
//
// NOTE : ce contenu est dans un fichier .h séparé (et non dans le .ino)
// car le générateur automatique de prototypes de fonctions d'Arduino IDE
// (basé sur ctags) se laisse piéger par les accolades et guillemets
// contenus dans ce bloc HTML/CSS/JS, ce qui casse la compilation de
// TOUT le fichier .ino (plus aucune fonction n'est "trouvée"). Un fichier
// .h inclus via #include n'est jamais analysé par ce générateur.
const char PAGE_HTML[] = R"rawliteral(
<!DOCTYPE html><html><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Panneau Gare - Reglage heure</title>
<style>
body{font-family:sans-serif;text-align:center;background:#111;color:#eee;padding:30px 20px;}
button{font-size:1.2em;padding:18px 36px;border-radius:10px;border:none;background:#2a6;color:white;margin-top:20px;}
#heurePhone{font-size:1.6em;margin-top:10px;}
#msg{margin-top:20px;font-size:1.1em;color:#7f7;}
</style></head><body>
<h2>Panneau de gare HO</h2>
<p>Heure actuelle du telephone :</p>
<p id="heurePhone"></p>
<button onclick="reglerHeure()">Regler l'horloge du panneau</button>
<p id="msg"></p>
<p><a href="/horaires" style="color:#7cf;">Gerer les horaires des trains</a></p>
<script>
function majAffichage() {
document.getElementById('heurePhone').innerText = new Date().toLocaleString();
}
setInterval(majAffichage, 1000);
majAffichage();
function reglerHeure() {
const d = new Date();
const params = 'y=' + d.getFullYear() + '&mo=' + (d.getMonth()+1) + '&d=' + d.getDate()
+ '&h=' + d.getHours() + '&mi=' + d.getMinutes() + '&s=' + d.getSeconds();
fetch('/settime?' + params)
.then(r => r.text())
.then(t => { document.getElementById('msg').innerText = t; });
}
</script>
</body></html>
)rawliteral";
Code : Tout sélectionner
#pragma once
// ============================================================
// Page web de gestion des horaires : tableau modifiable, ajout/suppression
// de lignes, enregistrement en un clic. Réutilise le même format texte
// compact ("heure;minute;nom;arrivee;quai" par ligne) que la sauvegarde.
//
// NOTE : voir page_accueil.h pour l'explication du pourquoi ce contenu
// est dans un fichier .h séparé plutôt que dans le .ino.
// ============================================================
const char PAGE_HTML_HORAIRES[] = R"rawliteral(
<!DOCTYPE html><html><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Horaires - Panneau Gare</title>
<style>
body{font-family:sans-serif;background:#111;color:#eee;padding:15px;}
h2{text-align:center;}
table{width:100%;border-collapse:collapse;font-size:0.9em;}
th,td{padding:4px;text-align:center;}
input{width:100%;box-sizing:border-box;background:#222;color:#eee;border:1px solid #444;border-radius:4px;padding:4px;}
input[type=number]{width:3.2em;}
button{font-size:1.1em;padding:12px 20px;border-radius:10px;border:none;background:#2a6;color:white;margin:6px 4px;}
#btnReset{background:#a33;}
.del{background:#a33;padding:6px 10px;font-size:0.9em;}
#msg{text-align:center;margin-top:15px;font-size:1.1em;color:#7f7;}
a{color:#7cf;}
</style></head><body>
<h2>Gestion des horaires</h2>
<table>
<thead><tr><th>H</th><th>Min</th><th>Destination</th><th>Arrivee</th><th>V</th><th></th></tr></thead>
<tbody id="corps"></tbody>
</table>
<div style="text-align:center;">
<button onclick="ajouterLigne()">+ Ajouter un train</button>
<button onclick="enregistrer()">Enregistrer</button>
<button id="btnReset" onclick="reinitialiser()">Horaires par defaut</button>
</div>
<p id="msg"></p>
<p style="text-align:center;"><a href="/">Retour au reglage de l'heure</a></p>
<script>
function ajouterLigne(h='', m='', nom='', arr='', quai='') {
const tbody = document.getElementById('corps');
const tr = document.createElement('tr');
tr.innerHTML =
'<td><input type="number" min="0" max="23" value="' + h + '"></td>' +
'<td><input type="number" min="0" max="59" value="' + m + '"></td>' +
'<td><input type="text" value="' + nom + '"></td>' +
'<td><input type="text" value="' + arr + '"></td>' +
'<td><input type="text" value="' + quai + '"></td>' +
'<td><button class="del" onclick="this.closest(\'tr\').remove()">X</button></td>';
tbody.appendChild(tr);
}
// Chargement des horaires actuels au chargement de la page
fetch('/horaires_data').then(r => r.text()).then(txt => {
txt.trim().split('\n').forEach(ligne => {
if (!ligne) return;
const c = ligne.split(';');
ajouterLigne(c[0], c[1], c[2], c[3], c[4]);
});
});
function enregistrer() {
let data = '';
document.querySelectorAll('#corps tr').forEach(tr => {
const champs = tr.querySelectorAll('input');
const nom = champs[2].value.trim();
if (nom === '') return; // ignore les lignes vides
data += champs[0].value + ';' + champs[1].value + ';' + nom + ';'
+ champs[3].value + ';' + champs[4].value + '\n';
});
fetch('/horaires_save', { method: 'POST', headers: {'Content-Type':'text/plain'}, body: data })
.then(r => r.text())
.then(t => { document.getElementById('msg').innerText = t; });
}
function reinitialiser() {
if (!confirm('Revenir aux horaires par defaut ? Les modifications seront perdues.')) return;
fetch('/horaires_reset', { method: 'POST' })
.then(r => r.text())
.then(t => { document.getElementById('msg').innerText = t; location.reload(); });
}
</script>
</body></html>
)rawliteral";

| Canal Touch | GPIO |
|---|---|
| T0 | GPIO4 |
| T1 | GPIO0 |
| T2 | GPIO2 |
| T3 | GPIO15 |
| **T4** | **GPIO13** |
| T5 | GPIO12 |
| T6 | GPIO14 |
| T7 | GPIO27 |
| T8 | GPIO33 |
| T9 | GPIO32 |
Code : Tout sélectionner
#define TOUCH_PIN 13 // GPIO13 = canal T4
#define SAMPLES 10 // nombre de lectures pour la calibration
#define MARGIN 10 // marge de détection (à ajuster selon test)
uint16_t baseline = 0; // valeur de repos (sans contact)
bool touched = false;
void setup() {
Serial.begin(115200);
delay(500);
// Calibration : on mesure la valeur "au repos" au démarrage
uint32_t sum = 0;
for (int i = 0; i < SAMPLES; i++) {
sum += touchRead(TOUCH_PIN);
delay(20);
}
baseline = sum / SAMPLES;
Serial.print("Valeur de repos (baseline) : ");
Serial.println(baseline);
}
void loop() {
uint16_t val = touchRead(TOUCH_PIN);
// Le touché fait BAISSER la valeur lue
bool isTouchedNow = (val < baseline - MARGIN);
if (isTouchedNow && !touched) {
touched = true;
Serial.println(">>> Touché détecté !");
// --> ici ton action (allumer une LED, déclencher une fonction, etc.)
}
if (!isTouchedNow && touched) {
touched = false;
Serial.println("Relâché.");
}
Serial.printf("val=%d baseline=%d\n", val, baseline);
delay(100);
}
