// Broches boutons et capteurs
const int boutons[4] = {2, 3, 4, 5};
const int capteurs[4] = {6, 7, 8, 9};
// Moteur pas à pas via ULN2003
const int IN1 = 10;
const int IN2 = 11;
const int IN3 = 12;
const int IN4 = 13;
// Broches 74HC595
const int dataPin = A0;
const int latchPin = A1;
const int clockPin = A2;
// Bouton arrêt d'urgence
const int urgenceBtn = A3;
// Données pour afficheur 7 segments (anode commune)
byte digits[10] = {
B00111111, B00000110, B01011011, B01100110,
B01101101, B01111101, B01111111, B00000111,
B01111111, B01101111
};
int etageActuel = 0;
int etageCible = -1;
bool arretUrgence = false;
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(boutons[i], INPUT);
pinMode(capteurs[i], INPUT);
}
pinMode(urgenceBtn, INPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
arreterMoteur();
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
update7Seg(etageActuel);
}
void loop() {
if (digitalRead(urgenceBtn) == HIGH) {
arretUrgence = true;
arreterMoteur();
return;
} else {
arretUrgence = false;
}
for (int i = 0; i < 4; i++) {
if (digitalRead(boutons[i]) == HIGH) {
etageCible = i;
}
}
if (etageCible != -1 && etageCible != etageActuel && !arretUrgence) {
if (etageCible > etageActuel) {
while (digitalRead(capteurs[etageCible]) == LOW) {
stepSequenceUp();
}
} else {
while (digitalRead(capteurs[etageCible]) == LOW) {
stepSequenceDown();
}
}
arreterMoteur();
etageActuel = etageCible;
etageCible = -1;
update7Seg(etageActuel);
}
}
// Séquences moteur pas à pas
void stepSequenceUp() {
const int steps[4][4] = {
{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 1, 0},
{0, 0, 0, 1}
};
for (int i = 0; i < 4; i++) {
digitalWrite(IN1, steps[i][0]);
digitalWrite(IN2, steps[i][1]);
digitalWrite(IN3, steps[i][2]);
digitalWrite(IN4, steps[i][3]);
delay(5);
}
}
void stepSequenceDown() {
const int steps[4][4] = {
{0, 0, 0, 1},
{0, 0, 1, 0},
{0, 1, 0, 0},
{1, 0, 0, 0}
};
for (int i = 0; i < 4; i++) {
digitalWrite(IN1, steps[i][0]);
digitalWrite(IN2, steps[i][1]);
digitalWrite(IN3, steps[i][2]);
digitalWrite(IN4, steps[i][3]);
delay(5);
}
}
void arreterMoteur() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
// Affichage via 74HC595 + afficheur 7 segments
void update7Seg(int valeur) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, digits[valeur]);
digitalWrite(latchPin, HIGH);
}