// Déclaration des broches pour les capteurs de fin de course
const int finCourse0Pin = 2; // Butée fin course 0
const int finCourse1Pin = 3; // Butée fin course 1
const int finCourse2Pin = 4; // Butée fin course 2
// Déclaration des broches pour les boutons
const int boutonRAZPin = 5; // Bouton RAZ
const int boutonDCYPin = 6; // Bouton DCY
const int boutonSelectPin1 = 11; // Bouton sélecteur de niveau d'emballage 1
const int boutonSelectPin2 = 12; // Bouton sélecteur de niveau d'emballage 2
const int boutonAR = 0; // Bouton d'arrêt d'urgence
// Déclaration des broches pour les voyants
const int voyantTensionPin = 8; // Voyant de présence de tension
const int voyantMoteur1Pin = 9; // Voyant de fonctionnement du moteur 1
const int voyantMoteur2Pin = 10; // Voyant de fonctionnement du moteur 2
const int urgence = 7; // Voyant Urgence
const int voyantniveau0 = A0; // Voyant niveau 0 (preparation de cartons)
const int voyantstandby = A1; // Voyant cycle terminée et chariot en butée 2
// Variables de contrôle du système
bool razActif = false;
bool niveauEmballageChoisi = false;
bool cycleEnCours = false;
bool cycletermine = false;
void setup() {
// Initialisation des broches en entrée/sortie
pinMode(finCourse0Pin, INPUT);
pinMode(finCourse1Pin, INPUT);
pinMode(finCourse2Pin, INPUT);
pinMode(boutonRAZPin, INPUT_PULLUP);
pinMode(boutonDCYPin, INPUT);
pinMode(boutonSelectPin1, INPUT);
pinMode(boutonSelectPin2, INPUT);
pinMode(voyantTensionPin, OUTPUT);
pinMode(voyantMoteur1Pin, OUTPUT);
pinMode(voyantMoteur2Pin, OUTPUT);
pinMode(urgence, OUTPUT);
pinMode(boutonAR, INPUT_PULLUP);
pinMode(voyantniveau0, OUTPUT);
pinMode(voyantstandby, OUTPUT);
// Allumer le voyant de présence de tension
digitalWrite(voyantTensionPin, HIGH);
cycletermine = false ;
}
void loop() {
// l'appel d'indication
indications();
// Vérifier l'état du bouton RAZ
if (digitalRead(boutonRAZPin) == LOW) {
razActif = true;
delay(50); // Délai de rebond
}
// Vérifier si le niveau d'emballage a été choisi
if (digitalRead(boutonSelectPin1) == LOW && digitalRead(boutonSelectPin2) == HIGH) {
niveauEmballageChoisi = true;
delay(50); // Délai de rebond
} else if (digitalRead(boutonSelectPin2) == LOW && digitalRead(boutonSelectPin1) == HIGH) {
niveauEmballageChoisi = true;
delay(50); // Délai de rebond
}
// Vérifier l'état du bouton DCY pour démarrer le cycle
if (digitalRead(boutonDCYPin) == HIGH && !razActif && niveauEmballageChoisi && !cycleEnCours) {
demarrerCycle();
}
// Vérifier l'état du bouton AR pour l'arrêt d'urgence
if (digitalRead(boutonAR) == HIGH) {
arretUrgence();
}
// Vérifier l'état des capteurs de fin de course
if (!cycleEnCours) {
if (digitalRead(finCourse0Pin) == LOW) {
// Arrêter le moteur 1
digitalWrite(voyantMoteur1Pin, LOW);
}
if (digitalRead(finCourse1Pin) == LOW || digitalRead(finCourse2Pin) == LOW) {
// Arrêter le moteur 2
digitalWrite(voyantMoteur2Pin, LOW);
}
}
}
void indications(){
// cette fontion et dédiée pour les voyants d'etats
// indication que le chariot soit en niveau bas (butée 0 actionée)
if (digitalRead(finCourse0Pin)== LOW && !cycleEnCours)
{
digitalWrite(voyantniveau0, HIGH);
delay(500);
digitalWrite(voyantniveau0,LOW);
delay(500);
}
// indication que le chariot soit en niveau haut (butée 2 actionnée et que le cycle est fini !)
if(digitalRead(finCourse2Pin) == HIGH && cycletermine)
{
digitalWrite(voyantstandby,HIGH);
}
delay(500);
digitalWrite(voyantstandby,LOW);
}
void arretUrgence() {
// Arrêter les moteurs et désactiver les voyants
digitalWrite(voyantMoteur1Pin, LOW);
digitalWrite(voyantMoteur2Pin, LOW);
// Allumer le voyant d'urgence
digitalWrite(urgence, HIGH);
delay(1000);
digitalWrite(urgence, LOW);
delay(1000);
// Réinitialiser les variables de contrôle
razActif = false;
niveauEmballageChoisi = false;
cycleEnCours = false;
cycletermine = false ;
}
void demarrerCycle() {
cycleEnCours = true;
do{// Allumer le voyant du moteur 1
digitalWrite(voyantMoteur1Pin, HIGH);
// Attendre 3 secondes
delay(3000);
// Allumer le voyant du moteur 2
digitalWrite(voyantMoteur2Pin, HIGH);
// Attendre 5 secondes pour le premier délai
delay(5000);
// Lancer le mouvement du plateau (moteur 1)
// Effectuer le mouvement vertical (moteur 2)
digitalWrite(voyantMoteur2Pin, LOW);
delay(3000);
digitalWrite(voyantMoteur1Pin, LOW);
cycletermine = true ; }while(cycletermine == false);
}