/*
*************************************************
* Feux de passage à niveau français *
* version 20240513 *
* double voies *
* Arduino Nano *
* https://youtu.be/-hZ-K13oVk4 *
* simulation sur *
* https://wokwi.com/projects/397782671014151169 *
*************************************************
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Ce code est distribué gratuitement sous licence !
! Creativ Commons CC-BY-NC-ND 3.0 !
! !
! Cette licence permet à d'autres utilisateurs d'utiliser ce code !
! à des fins non commerciales, dans la mesure où le nom de l'auteur est !
! mentionné. Toute modification du code devra être soumise à !
! l'autorisation expresse de l'auteur. !
! !
! auteur Philippe GUENET - [email protected] - https://wgnt-train.fr !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*/
/*
Déroulement :
Détection de présence ON => Feux rouges + sonnerie
8" après => fermeture barrière
barrières fermées => arrêt sonnerie
Détection de présence OFF => arrêt feux rouges + ouverture barrières
la luminosité peut se régler de 0 à 255 ... mais on pourra prendre des valeurs plus faibles pour plus de visibliyé
les paramètres dont les commentaires commencent par * peuvent être modifiés.
le 24/05/2023 => Tests => OK avec la bibliothèque DFPlayerMini_Fast
le 25/05/2023 => Ajouter un bouton de réglage du volume avec mémorisation en EEprom.
le 26/05/2023 => Elimination des "delay()"" dans les procédures de rebonds.
le 27/05/2023 => Elimination des boucles "for" dans les procédures de rebonds.
le 01/06/2023 => Elimination des boucles "while" dans les procédures de rebonds
le 11/06/2023 => Utilisation de debounce pour la détection.
le 13/05/2024 => Modification de la procédure d'extinction à l'aide d'un drapeau.
*/
/* LES CONNECTEURS
pour Nano
D13 =| |= D12
+3.3V =| |= ~D11 /!\
AREF =| |= ~D10 /!\ La bibliothèque Servo désactive le PWM sur D10&D11
A0 =| |= ~D9
A1 =| |= D8
A2 =| |= D7
A3 =| |= ~D6
A4-SDA =| |= ~D5
A5-SCL =| |= D4
A6 =| |= ~D3 - INT1
A7 =| |= D2 - INT0
5V =| |= GND
RESET =| |= RESET
GND =| |= D0-RX
VIN =| |= D1-TX
*/
//#define IsDebug
#include <Bounce2.h>
Bounce BPDetection = Bounce();
const int dureeAntiRebond = 10;
/* LES CONNECTEURS */
const int pinDetection = 2; // BP - Relais détection connectés à D2
// pin 3 réservé pour les leds blanches du code Belgique
const int pinLedsRouge1 = 5;
const int pinLedsRouge2 = 6;
const byte pinBPMilieu = 7;
const byte pinServo1 = 8; // Les servos sont connectés sur D8 et D9
const byte pinServo2 = 9;
const int pinBPEqualizer = 10;
const int pinBPVolume = 11;
const int pinRelaisSon = 12; // Déclanche le relais qui va déclancher le lecteur MP3
const int pinLedPM = A7; // 16 sur ATTiny88
/* =============== */
/* POUR LA DETECTION */
uint32_t departChronoDetection = 0ul; // initialise la tempo de démarrage de détection // interval de temps pour le déclanchement de la sonnerie
bool blocageDetection = false;
/* ================= */
/* POUR LES SERVOMOTEURS */
#include <Servo.h>
Servo servoPassageNiveau1;
Servo servoPassageNiveau2;
const int angleFerme = 550; // * à déterminer. PaN fermé
const int angleOuvert = 1500; // * à déterminer. PaN ouvert
const byte ralentissementServos = 3; // * Règle la vitesse de rotation du servo en introduisant une pause entre chaque rotation.
int angleIntermediaire; // valeur de l'angle intermédiaire pendant le mouvement
const int angleRebondsDown = 140; // * angles de dépacement maxi de rebonds. Doit être un multiple de 20
const int angleRebondsUp = 140;
const int pasRebonds = 10;
int amplitudeRebonds;
int angleRebonds;
uint32_t actuelTempsRebonds;
uint32_t precedentTempsRebonds;
const uint32_t delaisFermetureBarrieres = 3000ul; // * interval de temps pour la fermeture des barrière (14" / 2)
uint32_t precedentMillisBarrieres = 0ul;
uint32_t precedentMillisServos = 0ul;
Bounce BPMilieu = Bounce();
bool etatPointMilieu;
enum barrieres {
INIT_FERMETURE,
FERMETURE,
FERME,
INIT_OUVERTURE,
OUVERTURE,
OUVERT
};
barrieres etatBarrieres;
enum rebonds {
UP,
DOWN
};
rebonds sensRebonds;
/* ======================= */
/* POUR LA SONNERIE */
#include <EEPROM.h>
#include <DFPlayerMini_Fast.h>
DFPlayerMini_Fast Sonnerie;
Bounce BPVolume = Bounce();
Bounce BPEqualizer = Bounce();
const uint32_t delaisRelaisSon = 0ul; // * interval de temps pour le déclanchement de la sonnerie
bool etatSonnerie = false;
int volumeSonnerie = 20; // de 0 à 30. BP de réglage au pas de 5
int equalizerSonnerie = 0; // de 0 à 5
/* ============ */
/* POUR LES LEDS ROUGES */
//const int incrementLuminositeRouges = 6; // * Pas d'incrémentation de la luminosité. Plus la valeur est grande, moins la variation de luminosité sera progressive
const int incrementLuminositeRouges = 7; // * Pas d'incrémentation de la luminosité. Plus la valeur est grande, moins la variation de luminosité sera progressive
const int intervalRouges = 10; // * Délai entre 2 incrémentations
const int luminositeMiniRouges = 0; // *
const int luminositeMaxiRouges = 250; // *
int luminositeLedsRouges = luminositeMiniRouges;
uint32_t previousMillisRouges = 0ul; // Temps précédent état led rouge en millisecondes
enum etatRouges {
Rouges_INIT,
Rouges_UP,
Rouges_DOWN,
};
etatRouges etatLedsRouges = Rouges_INIT;
/* ==================== */
/* LES DRAPEAUX */
bool flagExtinctionRouges = false;
/* ============ */
void setup() {
Serial.begin(9600);
pinMode(pinLedsRouge1, OUTPUT);
pinMode(pinLedsRouge2, OUTPUT);
pinMode(pinServo1, OUTPUT);
pinMode(pinServo2, OUTPUT);
pinMode(pinRelaisSon, OUTPUT);
pinMode(pinLedPM, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
BPDetection.attach(pinDetection, INPUT);
BPDetection.interval(dureeAntiRebond);
BPMilieu.attach(pinBPMilieu, INPUT_PULLUP);
BPMilieu.interval(dureeAntiRebond);
BPVolume.attach(pinBPVolume, INPUT_PULLUP);
BPVolume.interval(dureeAntiRebond);
BPEqualizer.attach(pinBPEqualizer, INPUT_PULLUP);
BPEqualizer.interval(dureeAntiRebond);
if (!servoPassageNiveau1.attached()) {servoPassageNiveau1.attach(pinServo1); }
if (!servoPassageNiveau2.attached()) {servoPassageNiveau2.attach(pinServo2); }
delay(100);
if(digitalRead(pinDetection) == true){
// Voies occupées on ferme les barrières
angleIntermediaire = angleFerme;
etatBarrieres = FERME;
} else {
// Voies libres on ouvre les barrières
angleIntermediaire = angleOuvert;
etatBarrieres = OUVERT;
} // Fin de if(digitalRead(pinDetection) == true)
servoPassageNiveau1.writeMicroseconds(angleIntermediaire);
servoPassageNiveau2.writeMicroseconds(angleIntermediaire);
delay(400);
if (servoPassageNiveau1.attached()) {servoPassageNiveau1.detach(); }
if (servoPassageNiveau2.attached()) {servoPassageNiveau2.detach(); }
delay(150);
initDFPlayer(); // initialisation de la carte DFPlayer
lectureEEprom (); // lecture de la valeur du volume enregistrée en EEprom
BPDetection.update();
BPMilieu.update();
BPVolume.update();
BPEqualizer.update();
} // Fin de setup
void loop() {
BPDetection.update();
BPMilieu.update();
BPVolume.update();
BPEqualizer.update();
if(BPDetection.changed()){
if (blocageDetection == false){
litDetection();
} // Fin de if (blocageDetection == false)
} // Fin de if(BPDetection.changed())
if (BPVolume.changed()) {
reglageVolume();
} // Fin de if (BPVolume.changed())
if (BPEqualizer.changed()) {
reglageEqualizer();
} // Fin de if (BPEqualizer.changed())
if (BPMilieu.changed() && BPMilieu.read() == HIGH){
etatPointMilieu =! etatPointMilieu;
pointMilieu();
} // Fin de if (BPMilieu.changed && BPMilieu.read == HIGH)
actionsBarrieres();
afficheLedsRouges();
} // Fin de loop
void litDetection() {
if (BPDetection.read() == HIGH) {
etatBarrieres = INIT_FERMETURE;
} else {
etatBarrieres = INIT_OUVERTURE;
} // Fin de if (BPDetection.read() == HIGH)
} // Fin de procédure litDetection()
void actionsBarrieres () {
switch (etatBarrieres) {
case INIT_FERMETURE :
#if defined(IsDebug)
Serial.println(F("Changent vers fermeture"));
#endif
/* On bloque la lecture de la détection le temps du mouvement des servos. */
if (blocageDetection == false) {blocageDetection = true;}
/* On démarre le chrono pour déclancher la sonnerie et la fermeture des barrières. */
departChronoDetection = millis();
/* On met à jour l'état de l'action sur les barrières. */
etatBarrieres = FERMETURE;
break;
case FERMETURE :
/* On allume les leds rouges. */
if (etatLedsRouges == Rouges_INIT){
etatLedsRouges = Rouges_UP;
}
if ((millis() - departChronoDetection) >= delaisRelaisSon) {
/* On déclanche la sonnerie. */
if (etatSonnerie == false){
etatSonnerie = true;
Sonnerie.loop(1);
digitalWrite(pinRelaisSon, HIGH);
} // Fin de if (etatSonnerie == false)
} // Fin de if ((millis() - departChronoDetection) >= delaisRelaisSon)
if ((millis() - departChronoDetection) >= delaisFermetureBarrieres) {
/* On abaisse les barrières. */
if (angleFerme > angleOuvert){
fermetureBarrieres_Inverse();
} else {
fermetureBarrieres();
} // Fin de if (angleFerme > angleOuvert){
} // Fin de if ((millis() - departChronoDetection) >= delaisFermetureBarrieres)
break;
case FERME :
#if defined(IsDebug)
Serial.println(F("Restent fermees"));
#endif
/* On arrête la sonnerie. */
if (etatSonnerie == true){
etatSonnerie = false;
Sonnerie.pause();
digitalWrite(pinRelaisSon, LOW);
} // Fin de if (etatSonnerie == true)
if (etatLedsRouges == Rouges_INIT){
etatLedsRouges = Rouges_UP;
}
/* On débloque la lecture de l'état de la détection. */
if (blocageDetection == true) {blocageDetection = false;}
break;
case INIT_OUVERTURE :
#if defined(IsDebug)
Serial.println(F("Changent vers ouverture"));
#endif
/* On bloque la lecture de la détection le temps du mouvement des servos. */
if (blocageDetection == false) {blocageDetection = true;}
/* On éteint les leds rouges */
if (etatLedsRouges != Rouges_INIT){
flagExtinctionRouges = true;
}
/* On met à jour l'état de l'action sur les barrières. */
etatBarrieres = OUVERTURE;
break;
case OUVERTURE :
/* On ouvre les barrières */
if (angleFerme > angleOuvert){
ouvertureBarrieres_Inverse();
} else {
ouvertureBarrieres();
} // Fin de if (angleFerme > angleOuvert){
break;
case OUVERT :
#if defined(IsDebug)
Serial.println(F("Restent ouvertes"));
#endif
/* On débloque la lecture de l'état de la détection. */
if (blocageDetection == true) {blocageDetection = false;}
break;
} // Fin de switch (etatBarriere)
} // Fin de procédure actionsBarrieres()
void afficheLedsRouges(){
uint32_t currentMillisRouges = millis();
if (currentMillisRouges - previousMillisRouges >= intervalRouges) {
previousMillisRouges = currentMillisRouges;
switch (etatLedsRouges) {
case Rouges_UP:
luminositeLedsRouges += incrementLuminositeRouges;
if (luminositeLedsRouges >= luminositeMaxiRouges) {
etatLedsRouges = Rouges_DOWN;
}
break;
case Rouges_DOWN:
luminositeLedsRouges -= incrementLuminositeRouges;
if (luminositeLedsRouges <= luminositeMiniRouges) {
if (flagExtinctionRouges){
etatLedsRouges = Rouges_INIT;
flagExtinctionRouges = false;
} else {
etatLedsRouges = Rouges_UP;
}
}
break;
} // Fin de switch (etatLedsRouges)
analogWrite(pinLedsRouge1, luminositeLedsRouges);
analogWrite(pinLedsRouge2, luminositeLedsRouges);
} // Fin de if (currentMillisRouges - previousMillisRouges >= tempoRouges)
} // Fin de procédure afficheLedRouge()
void ouvertureBarrieres(){
#if defined(IsDebug)
Serial.println(F("Barrieres en ouverture"));
#endif
if (!servoPassageNiveau1.attached()) {servoPassageNiveau1.attach(pinServo1); }
if (!servoPassageNiveau2.attached()) {servoPassageNiveau2.attach(pinServo2); }
if (angleIntermediaire < angleOuvert) {
// Si l'angle intermédiaire n'est pas arrivé à la valeur angle ouvert, on continue
//en appiquant un ralentissement pour diminuer la vitesse d'ouverture
uint32_t currentMillis = millis();
if (currentMillis - precedentMillisBarrieres >= ralentissementServos) {
precedentMillisBarrieres = currentMillis;
angleIntermediaire += 1;
servoPassageNiveau1.writeMicroseconds(angleIntermediaire);
servoPassageNiveau2.writeMicroseconds(angleIntermediaire);
//if (angleIntermediaire == angleOuvert){rebondsUp();}
} // Fin de if (currentMillis - previousMillis >= Ralentissement)
amplitudeRebonds = angleRebondsUp;
angleRebonds = 0;
sensRebonds = DOWN;
} else {
// Si l'angle intermédiaire est arrivé à la valeur angle ouvert,
/* Effet de rebonds à l'ouverture' */
if (amplitudeRebonds > 0){
rebondsUp();
} else {
// on débranche le servo, on met à jour etatBarriere
uint32_t currentMillis = millis(); // Obtenir le temps actuel
if (currentMillis - precedentMillisServos >= 150) {
if (servoPassageNiveau1.attached()) {servoPassageNiveau1.detach(); }
if (servoPassageNiveau2.attached()) {servoPassageNiveau2.detach(); }
} // Fin de if (currentMillis - previousMillis >= 150)
angleIntermediaire = angleOuvert;
etatBarrieres = OUVERT;
} // Fin de if (amplitudeRebonds > 0)
} // Fin de if (angleIntermediaire < angleOuvert)
} // Fin de procédure ouvertureBarrieres()
void fermetureBarrieres(){
if (!servoPassageNiveau1.attached()) {servoPassageNiveau1.attach(pinServo1);}
if (!servoPassageNiveau2.attached()) {servoPassageNiveau2.attach(pinServo2);}
if (angleIntermediaire > angleFerme) {
// Si l'angle intermédiaire n'est pas arrivé à la valeur angle fermé, on continue
//en appiquant un ralentissement pour diminuer la vitesse de fermeture
uint32_t currentMillis = millis();
if (currentMillis - precedentMillisBarrieres >= ralentissementServos) {
precedentMillisBarrieres = currentMillis;
angleIntermediaire -= 1;
servoPassageNiveau1.writeMicroseconds(angleIntermediaire);
servoPassageNiveau2.writeMicroseconds(angleIntermediaire);
}
amplitudeRebonds = angleRebondsDown;
angleRebonds = 0;
sensRebonds = UP;
} else {
// Si l'angle intermédiaire est arrivé à la valeur angle fermé,
/* Effet de rebonds à la fermeture */
if (amplitudeRebonds > 0){
rebondsDown();
} else {
// on débranche le servo, on met à jour etatBarriere et on arrête le son
uint32_t currentMillis = millis();
if (currentMillis - precedentMillisServos >= 150) {
if (servoPassageNiveau1.attached()) {servoPassageNiveau1.detach();}
if (servoPassageNiveau2.attached()) {servoPassageNiveau2.detach();}
} // Fin de if (currentMillis - previousMillisServos >= 150)
angleIntermediaire = angleFerme;
etatBarrieres = FERME;
//Serial.println(F("Barrieres fermees"));
} // Fin de if (amplitudeRebonds > 0)
} // Fin de if (angleIntermediaire > angleFerme)
} // Fin de procédure fermetureBarrieres()
void ouvertureBarrieres_Inverse(){
if (!servoPassageNiveau1.attached()) {servoPassageNiveau1.attach(pinServo1);}
if (!servoPassageNiveau2.attached()) {servoPassageNiveau2.attach(pinServo2);}
if (angleIntermediaire > angleOuvert) {
// Si l'angle intermédiaire n'est pas arrivé à la valeur angle fermé, on continue
//en appiquant un ralentissement pour diminuer la vitesse de fermeture
unsigned long actuelMillis = millis();
if (actuelMillis - precedentMillisBarrieres >= ralentissementServos) {
precedentMillisBarrieres = actuelMillis;
angleIntermediaire -= 1;
servoPassageNiveau1.write(angleIntermediaire);
servoPassageNiveau2.write(angleIntermediaire);
//SoftwareServo::refresh();
}
amplitudeRebonds = angleRebondsDown;
angleRebonds = 0;
sensRebonds = DOWN;
} else {
// Si l'angle intermédiaire est arrivé à la valeur angle fermé,
/* Effet de rebonds à la fermeture */
if (amplitudeRebonds > 0){
rebondsUp();
} else {
// on débranche le servo, on met à jour etatBarriere et on arrête le son
unsigned long actuelMillis = millis();
if (actuelMillis - precedentMillisServos >= 150) {
if (servoPassageNiveau1.attached()) {servoPassageNiveau1.detach();}
if (servoPassageNiveau2.attached()) {servoPassageNiveau2.detach();}
} // Fin de if (actuelMillis - previousMillisServos >= 150)
angleIntermediaire = angleOuvert;
etatBarrieres = OUVERT;
//Serial.println(F("Barrieres fermees"));
} // Fin de if (amplitudeRebonds > 0)
} // Fin de if (angleIntermediaire > angleFerme)
} // Fin de procédure fermetureBarrieres()
void fermetureBarrieres_Inverse(){
#if defined(IsDebug)
Serial.println(F("Barrieres en ouverture"));
#endif
if (!servoPassageNiveau1.attached()) {servoPassageNiveau1.attach(pinServo1); }
if (!servoPassageNiveau2.attached()) {servoPassageNiveau2.attach(pinServo2); }
if (angleIntermediaire < angleFerme) {
// Si l'angle intermédiaire n'est pas arrivé à la valeur angle ouvert, on continue
//en appiquant un ralentissement pour diminuer la vitesse d'ouverture
unsigned long actuelMillis = millis();
if (actuelMillis - precedentMillisBarrieres >= ralentissementServos) {
precedentMillisBarrieres = actuelMillis;
angleIntermediaire += 1;
servoPassageNiveau1.write(angleIntermediaire);
servoPassageNiveau2.write(angleIntermediaire);
//SoftwareServo::refresh();
} // Fin de if (actuelMillis - previousMillis >= Ralentissement)
amplitudeRebonds = angleRebondsUp;
angleRebonds = 0;
sensRebonds = UP;
} else {
// Si l'angle intermédiaire est arrivé à la valeur angle ouvert,
/* Effet de rebonds à l'ouverture' */
if (amplitudeRebonds > 0){
rebondsDown();
} else {
// on débranche le servo, on met à jour etatBarriere
unsigned long actuelMillis = millis(); // Obtenir le temps actuel
if (actuelMillis - precedentMillisServos >= 150) {
if (servoPassageNiveau1.attached()) {servoPassageNiveau1.detach(); }
if (servoPassageNiveau2.attached()) {servoPassageNiveau2.detach(); }
} // Fin de if (actuelMillis - previousMillis >= 150)
angleIntermediaire = angleFerme;
etatBarrieres = FERME;
} // Fin de if (amplitudeRebonds > 0)
} // Fin de if (angleIntermediaire < angleOuvert)
} // Fin de procédure ouvertureBarrieres()
void rebondsUp(){
switch (sensRebonds) {
case DOWN :
/* Le rebond redescend */
if (angleRebonds < amplitudeRebonds) {
actuelTempsRebonds = millis();
if (actuelTempsRebonds - precedentTempsRebonds >= 10) {
angleRebonds += pasRebonds;
servoPassageNiveau1.writeMicroseconds(angleOuvert - angleRebonds);
servoPassageNiveau2.writeMicroseconds(angleOuvert - angleRebonds);
precedentTempsRebonds = actuelTempsRebonds;
} // Fin de if (actuelTempsRebonds - precedentTempsRebonds >= 10)
} else {
angleRebonds = amplitudeRebonds;
sensRebonds = UP;
} // Fin de if (angleRebonds < amplitudeRebonds)
break;
case UP :
if (angleRebonds > 0) {
actuelTempsRebonds = millis();
if (actuelTempsRebonds - precedentTempsRebonds >= 10) {
angleRebonds -= pasRebonds;
servoPassageNiveau1.writeMicroseconds(angleOuvert - angleRebonds);
servoPassageNiveau2.writeMicroseconds(angleOuvert - angleRebonds);
precedentTempsRebonds = actuelTempsRebonds;
} // Fin de if (actuelTempsRebonds - precedentTempsRebonds >= 10)
} else {
amplitudeRebonds -= 20;
angleRebonds = 0;
sensRebonds = DOWN;
} // Fin de (angleRebonds > 0)
break;
} // Fin de switch (sensRebond)
} // Fin de procédure rebondsDown
void rebondsDown(){
/* angleRebonds s'incrémente de 0 à la valeur de amplitudeRebonds par pas de 10
quand la valeur angleRebondsDown est atteinte angleRebond se décrémente par pas de 10
jusque la valeur 0.
Quand ce cycle est termnié on recommence en décrémentant la valeur amplitude rebonds
de 20 et ainsi de suite jusqu'à ce que amplitudeRebonds soit égal à
*/
switch (sensRebonds) {
case UP:
/* Le rebond remonte */
if (angleRebonds < amplitudeRebonds) {
actuelTempsRebonds = millis();
if (actuelTempsRebonds - precedentTempsRebonds >= 10) {
angleRebonds += pasRebonds;
servoPassageNiveau1.writeMicroseconds(angleFerme + angleRebonds);
servoPassageNiveau2.writeMicroseconds(angleFerme + angleRebonds);
precedentTempsRebonds = actuelTempsRebonds;
} // Fin de if (actuelTempsRebonds - precedentTempsRebonds >= 10)
} else {
angleRebonds = amplitudeRebonds;
sensRebonds = DOWN;
} // Fin de if (angleRebonds < amplitudeRebonds)
break;
case DOWN :
/* Le rebond redescend */
if (angleRebonds > 0) {
actuelTempsRebonds = millis();
if (actuelTempsRebonds - precedentTempsRebonds >= 10) {
angleRebonds -= pasRebonds;
servoPassageNiveau1.writeMicroseconds(angleFerme + angleRebonds);
servoPassageNiveau2.writeMicroseconds(angleFerme + angleRebonds);
precedentTempsRebonds = actuelTempsRebonds;
} // Fin de if (actuelTempsRebonds - precedentTempsRebonds >= 10)
} else {
amplitudeRebonds -= 20;
angleRebonds = 0;
sensRebonds = UP;
} // Fin de if (angleRebonds > 0)
} // Fin de switch (sensRebond)
} // Fin de procédure rebondsDown
void initDFPlayer(){
Serial.end();
Sonnerie.begin(Serial);
Serial.begin(9600);
Sonnerie.volume(volumeSonnerie); // de 0 à 30
Sonnerie.EQSelect(equalizerSonnerie);
/*----Set different EQ----
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
myDFPlayer.EQ(DFPLAYER_EQ_POP);
myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
myDFPlayer.EQ(DFPLAYER_EQ_BASS);
*/
} // Fin de procédure initDFPlayer
void lectureEEprom(){
volumeSonnerie = EEPROM.read(200);
if ((volumeSonnerie < 5) || (volumeSonnerie > 30)) {
volumeSonnerie = 20;
EEPROM.update(200, volumeSonnerie);
} else {
for (byte J = 0; J < (volumeSonnerie / 5); J += 1){
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
} // Fin de for (byte J = 0; J < (volumeSonnerie / 5); J += 1)
} // Fin de if ((volumeSonnerie < 5) || (volumeSonnerie > 30))
equalizerSonnerie = EEPROM.read(220);
if ((equalizerSonnerie > 5) || (equalizerSonnerie < 0)) {
equalizerSonnerie = 0;
EEPROM.update(220, equalizerSonnerie);
} // Fin de if (equalierSonnerie > 5)
} // Fin de procédure lectureEEprom()
void reglageVolume(){
if (BPVolume.read() == HIGH) {
volumeSonnerie += 5; if(volumeSonnerie > 30) {volumeSonnerie = 5;}
//Serial.print(F("Volume :")); Serial.println(volumeSonnerie);
} else {
EEPROM.update(200, volumeSonnerie);
for (byte J = 0; J < (volumeSonnerie / 5); J += 1){
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
} // Fin de for (byte J = 0; J < (volumeSonnerie / 5); J += 1)
} // Fin de if (BPVolume.read() == HIGH)
} // Fin de procédure reglageVolume()
void reglageEqualizer(){
if (BPEqualizer.read() == HIGH) {
equalizerSonnerie += 1; if(equalizerSonnerie > 5) equalizerSonnerie = 0;
Serial.print(F("Equalizer :")); Serial.println(equalizerSonnerie);
} else {
EEPROM.update(220, volumeSonnerie);
for (byte J = 0; J < equalizerSonnerie; J += 1){
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
} // Fin de for (byte J = 0; J < equalizerSonnerie; J += 1)
} // Fin de if (BPEqualizer.read() == HIGH)
} // Fin de procédure reglageEqualizer()
void pointMilieu(){
if (!servoPassageNiveau1.attached()) {servoPassageNiveau1.attach(pinServo1); }
if (!servoPassageNiveau2.attached()) {servoPassageNiveau2.attach(pinServo2); }
delay(150);
if (etatPointMilieu == true){
// Si le drapeau etatMilieu est vrai on positionne à angle moyen.
digitalWrite(pinLedPM, HIGH); digitalWrite(LED_BUILTIN, HIGH);
servoPassageNiveau1.writeMicroseconds((angleFerme + angleOuvert) / 2);
servoPassageNiveau2.writeMicroseconds((angleFerme + angleOuvert) / 2);
delay(150);
if (servoPassageNiveau1.attached()) {servoPassageNiveau1.detach(); }
if (servoPassageNiveau2.attached()) {servoPassageNiveau2.detach(); }
delay(150);
} else {
// Si le drapeau etatMilieu est faux on repositionne à la position initiale.
digitalWrite(pinLedPM, LOW);digitalWrite(LED_BUILTIN, LOW);
if (etatBarrieres == OUVERT){
// Les voies étaient libres. On repositionne les barrières à ouvertes.
servoPassageNiveau1.writeMicroseconds(angleOuvert);
servoPassageNiveau2.writeMicroseconds(angleOuvert);
delay(150);
} else if (etatBarrieres == FERME) {
// Les voies étaient occupées. On repositionne les barrières à fermées.
servoPassageNiveau1.writeMicroseconds(angleFerme);
servoPassageNiveau2.writeMicroseconds(angleFerme);
delay(150);
} // Fin de if (etatBarrieres == OUVERT)
if (servoPassageNiveau1.attached()) {servoPassageNiveau1.detach(); }
if (servoPassageNiveau2.attached()) {servoPassageNiveau2.detach(); }
delay(150);
} // Fin de if (etatMilieu == true)
} // Fin de procédure pointMilieu()
Ici montage de D2 en PullDown