Commande montée-descente d'un ascenseur
Bonjour à toutes et à tous,
Je viens de découvrir ce blog en cherchant des solutions à un problème que je rencontre avec mon code Arduino, et j’aimerais partager mon expérience pour obtenir vos conseils. Je travaille actuellement sur un projet de simulation de montée et descente d’un ascenseur à l’aide de Thinkercad. L’objectif final est de reproduire cette simulation sur une maquette physique.
Mon objectif
Dans ce projet, le code doit, dès le lancement de la simulation, n’allumer que la première LED (représentant le rez-de-chaussée) parmi quatre LED disponibles. L’ascenseur simule ensuite une montée ou une descente lorsque l’un des quatre boutons est pressé. Par exemple, si j’appuie sur le bouton correspondant au 4e étage, l’idée est que la LED du rez-de-chaussée reste allumée pendant un certain temps avant de s’éteindre lorsque la LED du premier étage s’allume, et ainsi de suite, avec un délai entre chaque étage pour simuler la progression.
Le problème rencontré
Le souci se présente dès que je lance la simulation : toutes les LED s’allument immédiatement comme si l’ascenseur montait d’un coup jusqu’au 3e étage (représenté par la 4e LED). Ensuite, le code fonctionne correctement. Je ne comprends pas pourquoi cela se produit au démarrage, et je suis à la recherche d’idées pour résoudre ce comportement inattendu.
Voici mon code et le lien de ma simulation :
https://www.tinkercad.com/things/kVJ...scenseur-esboo
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| // Définition des pins pour les LEDs et les boutons
const int ledPins[] = {13, 12, 11, 10}; // Pins des LEDs
const int buttonPins[] = {9, 8, 7, 6}; // Pins des boutons
const int numLeds = 4;
const int numButtons = 4;
int currentFloor = -1; // Étage actuel
bool buttonsPressed[numButtons] = {false, false, false, false}; // État des boutons
void setup() {
// Initialiser les pins des LEDs comme sorties
for (int i = 0; i < numLeds; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW); // S'assurer que toutes les LEDs sont éteintes au départ
}
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
}
void loop() {
bool buttonChanged = false;
// Vérifier l'état de chaque bouton
for (int i = 0; i < numButtons; i++) {
bool buttonState = digitalRead(buttonPins[i]) == LOW; // Lire l'état du bouton (LOW signifie pressé)
if (buttonState != buttonsPressed[i]) {
// Si l'état du bouton a changé
buttonsPressed[i] = buttonState;
if (buttonState) {
// Si le bouton est pressé
moveElevator(i);
buttonChanged = true;
}
}
}
// Ajout d'un délai pour éviter les erreurs
if (buttonChanged) {
delay(300);
}
}
void moveElevator(int targetFloor) {
if (targetFloor != currentFloor) { // S'assurer que l'ascenseur se déplace seulement si nécessaire
if (targetFloor < currentFloor) {
// Déplacer l'ascenseur vers le bas
for (int i = currentFloor; i >= targetFloor; i--) {
updateLeds(i);
delay(1000); // Attendre un moment avant de changer d'étage
}
} else if (targetFloor > currentFloor) {
// Déplacer l'ascenseur vers le haut
for (int i = currentFloor; i <= targetFloor; i++) {
updateLeds(i);
delay(1000); // Attendre un moment avant de changer d'étage
}
}
currentFloor = targetFloor; // Mettre à jour l'étage actuel
}
}
void updateLeds(int floor) {
// Éteindre toutes les LEDs
for (int i = 0; i < numLeds; i++) {
digitalWrite(ledPins[i], LOW);
}
// Allumer la LED correspondant à l'étage
if (floor >= 0 && floor < numLeds) { // Vérifier que l'étage est valide
digitalWrite(ledPins[floor], HIGH);
}
} |