Les Réseaux N du Musée de St Sulpice de Pommeray
Réalisation des 2 réseaux par Francois Xavier Lestriat Président du Cheval de Fer Blaisois Décédé en 2022 ces réseaux on rejoint le Musée de St Sulpice de Pommeray
Francois Xavier Lestriat
Réseau d'exposition modulaire a l’échelle N en cour de réalisation, représentant les lignes du Cantal, de Condat à Murat .
Les Réseaux N du Musée de St Sulpice de Pommeray
Réalisation des 2 réseaux par Francois Xavier Lestriat Président du Cheval de Fer Blaisois Décédé en 2022 ces réseaux on rejoint le Musée de St Sulpice de Pommeray
//
#include <Servo.h>
// Déclaration de constantes et variables
const int Detect1 = A0; // Détection 1 branchée sur l'entée A0
const int Detect2 = A1; // Détection 2 branchée sur l'entée A1
const int pulse_dfplayer = 11;
const int barriere1 = 8; // Fil signal servo1
const int barriere2 = 9; // Fil signal Servo2
int tempo_fermeture = 4000; // temps clignotement avant fermeture barrières
int angle_fermeture = 0; // angle servo position fermée
int angle_ouverture = 80; // angle servo position ouverte
int vitesse_barriere = 70; // temps entre 2 degrés
int inhibition = 10000; // Pendant cette durée le PN ne peut pas se redéclencher
int angle_barriere;
Servo servo1;
Servo servo2;
unsigned long compteur_temps;
boolean etat_feux = false; // Variable 0 si leds éteintes et 1 si allumées
int valeur_Detect1 = 1023; // Détecteur 1 ( + de 512 pas de détection. - de 512 détection.)
int valeur_Detect2 = 1023; // Détecteur 2
int premiere_detection = 0; // 1 si détecteur1 en premier, 2 si détecteur2 en premier.
boolean detection = false; // 0 si pas de détection. 1 si train détecté.
boolean barriere_ouverte; // 1 si barrières ouvertes.
enum { ETEINT, EN_AUGMENTATION, ALLUME, EN_DIMINUTION };
struct FeuClignotant {
const byte pin;
byte etat;
unsigned long dateDernierChangement;
};
struct FeuClignotant feuPN = {3, ETEINT, 0 };
void gereFeuClignotant(struct FeuClignotant& feu)
{
unsigned long date = millis();
int valeurPWM;
switch (feu.etat)
{
case ETEINT:
analogWrite(feu.pin, 0);
// Attente de 200ms
if (date - feu.dateDernierChangement >= 200) {
// les 200ms sont passée, on change l'état du feu
feu.dateDernierChangement = date;
feu.etat = EN_AUGMENTATION;
}
break;
case EN_AUGMENTATION:
// La valeur de la PWM est donnée par la difference entre
// la date et la dateDernierChangement
valeurPWM = date - feu.dateDernierChangement;
if (valeurPWM <= 250) analogWrite(feu.pin, valeurPWM);
else {
// Les 250 ms sont passées, on change l'état du feu
feu.dateDernierChangement = date;
feu.etat = ALLUME;
}
break;
case ALLUME:
analogWrite(feu.pin, 250);
// Attente de 200ms
if (date - feu.dateDernierChangement >= 200) {
// les 200ms sont passée, on change l'état du feu
feu.dateDernierChangement = date;
feu.etat = EN_DIMINUTION;
}
break;
case EN_DIMINUTION:
// La valeur de la PWM est donnée par 250 moins la difference entre
// la date et la dateDernierChangement. Attention aux parenthèses
valeurPWM = 250 - (date - feu.dateDernierChangement);
if (valeurPWM >= 0) analogWrite(feu.pin, valeurPWM);
else {
// Les 250 ms sont passées, on change l'état du feu
feu.dateDernierChangement = date;
feu.etat = ETEINT;
}
break;
}
}
void setup() {
pinMode(feuPN.pin, OUTPUT);
pinMode(pulse_dfplayer,OUTPUT);
digitalWrite(pulse_dfplayer,HIGH);
servo1.attach(barriere1,500,2500);
servo2.attach(barriere2,500,2500);
servo1.write(angle_ouverture); //ouverture au début
servo2.write(angle_ouverture);
barriere_ouverte = true;
}
void loop() {
valeur_Detect1 = analogRead(Detect1);
valeur_Detect2 = analogRead(Detect2);
if (detection == 1 && premiere_detection == 0) {
if (valeur_Detect1 > 512 && valeur_Detect2 > 512) {
analogWrite(feuPN.pin,0);
for (int angle_barriere=angle_fermeture; angle_barriere<=angle_ouverture; angle_barriere+=1){ //OUVERTURE BARRIERES
servo1.write(angle_barriere);
servo2.write(angle_barriere);
delay(vitesse_barriere);
}
barriere_ouverte = true;
detection = 0;
delay(inhibition);
}
}
// Permet de savoir quel détecteur est passé à l'état bas en premier
if (detection == false) {
// détection d'un train
if (valeur_Detect1 < 512 || valeur_Detect2 < 512) {
detection = true;
digitalWrite(pulse_dfplayer,LOW);
delay(100);
digitalWrite(pulse_dfplayer,HIGH);
// Mise en mémoire du détecteur.
if (valeur_Detect1 < 512) {
premiere_detection = 1;
} else {
premiere_detection = 2;
}
}
}
// Un train est détecté.
else {
// Appel de la fonction qui gère les feux
gereFeuClignotant(feuPN);
if (barriere_ouverte == true) {
for (int tempo = 0; tempo <= tempo_fermeture; tempo +=1){ // Temporisation avant fermeture
// Appel de la fonction qui gère les feux
gereFeuClignotant(feuPN);
delay(1);
}
for (int angle_barriere=angle_ouverture; angle_barriere>=angle_fermeture; angle_barriere-=1){ //FERMETURE BARRIERES
servo1.write(angle_barriere);
servo2.write(angle_barriere);
// Appel de la fonction qui gère les feux
gereFeuClignotant(feuPN);
delay(vitesse_barriere); // Vitesse angle barrière
}
barriere_ouverte = false;
}
if (premiere_detection == 1) {
if (valeur_Detect2 < 512) {
premiere_detection = 0;;
}
}
if (premiere_detection == 2) { // Si non c'est que c'est le 2eme capteur
if (valeur_Detect1 < 512) {
premiere_detection = 0;
}
}
}
delay(50);
}
LA GARE DE CONDAT ST AMANDIN EN MODE EXPO
Partie 2 l'expo
Partie 1
Création d'une coulisse , la menuiserie ( partie jaune et rose)