Simulateur d’ascenseur multi-étages avec file d’attente de demandes et priorité de direction

Simulateur d’ascenseur multi-étages avec gestion de file d’attente, priorité de direction, affichage LCD et contrôle Arduino pour optimisation des déplacements.

Brève Introduction

Simulateur d’ascenseur multi-étages avec file d’attente de demandes et priorité de direction (cpp)
DESCRIPTION :
Cet exemple implémente un simulateur d'ascenseur multi-étages qui gère une file d'attente de demandes d'étage avec une priorité basée sur la direction de déplacement. L'ascenseur se déplace vers le haut et vers le bas entre les étages, servant les demandes de manière efficace en évitant les mouvements inutiles.

NOTES SUPPLÉMENTAIRES :
Le code est prêt à être chargé sur une carte Arduino Uno avec les composants matériels indiqués. Les boutons simulent les appels aux différents étages, l'ascenseur gère les demandes de manière ordonnée et affiche l'état sur un LCD et des LED. Il est possible d'étendre le nombre d'étages en modifiant la constante NUM_PIANI et en ajoutant les boutons correspondants.

EXPLICATIONS :
- La file des demandes est implémentée comme un tableau booléen indiquant quels étages ont été demandés.
- L'ascenseur maintient un état de direction (haut ou bas) et sert les demandes dans cette direction avant d'inverser.
- Les boutons sont configurés en INPUT_PULLUP et lus avec un anti-rebond pour éviter les déclenchements erronés.
- L'écran LCD affiche l'étage actuel et la direction du mouvement.
- Les LED indiquent visuellement la direction actuelle de l'ascenseur.

Code d'Exemple : cpp

#include <LiquidCrystal.h>

// Constantes de configuration
const int NUM_PIANI = 5; // Nombre total d'étages
const int pinPulsanti[NUM_PIANI] = {2, 3, 4, 5, 6}; // Broches des boutons pour les étages
const int pinLedSu = 13; // LED direction haut
const int pinLedGiu = A0; // LED direction bas

// Brochage LCD : RS, E, D4, D5, D6, D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// Variables d'état
bool richieste[NUM_PIANI] = {false, false, false, false, false}; // État des demandes par étage
int pianoCorrente = 0; // Indice de l'étage actuel (base 0)
bool direzioneSu = true; // Direction actuelle : true = haut, false = bas

// Variables anti-rebond
unsigned long lastDebounceTime[NUM_PIANI] = {0,0,0,0,0};
const unsigned long debounceDelay = 50; // ms
bool lastButtonState[NUM_PIANI] = {HIGH, HIGH, HIGH, HIGH, HIGH};

// Fonction pour lire les boutons avec anti-rebond
void leggiPulsanti() {
  for (int i = 0; i < NUM_PIANI; i++) {
    int reading = digitalRead(pinPulsanti[i]);
    if (reading != lastButtonState[i]) {
      lastDebounceTime[i] = millis();
    }
    if ((millis() - lastDebounceTime[i]) > debounceDelay) {
      if (reading == LOW) { // Bouton pressé (INPUT_PULLUP)
        richieste[i] = true; // Enregistrer la demande d'étage
      }
    }
    lastButtonState[i] = reading;
  }
}

// Fonction pour mettre à jour les LED de direction
void aggiornaLed() {
  digitalWrite(pinLedSu, direzioneSu ? HIGH : LOW);
  digitalWrite(pinLedGiu, direzioneSu ? LOW : HIGH);
}

// Fonction pour mettre à jour l'affichage LCD
void aggiornaDisplay() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Etage : ");
  lcd.print(pianoCorrente + 1); // Affiche étage base 1
  lcd.setCursor(0, 1);
  lcd.print("Direction : ");
  lcd.print(direzioneSu ? "Haut" : "Bas");
}

// Fonction pour trouver le prochain étage à servir dans la direction actuelle
// Retourne l'indice de l'étage ou -1 s'il n'y a pas de demandes dans cette direction
int prossimoPiano() {
  if (direzioneSu) {
    for (int i = pianoCorrente + 1; i < NUM_PIANI; i++) {
      if (richieste[i]) return i;
    }
  } else {
    for (int i = pianoCorrente - 1; i >= 0; i--) {
      if (richieste[i]) return i;
    }
  }
  return -1;
}

// Fonction pour vérifier s'il y a des demandes sur n'importe quel étage
bool ciSonoRichieste() {
  for (int i = 0; i < NUM_PIANI; i++) {
    if (richieste[i]) return true;
  }
  return false;
}

// Configuration initiale
void setup() {
  // Configurer les broches des boutons
  for (int i = 0; i < NUM_PIANI; i++) {
    pinMode(pinPulsanti[i], INPUT_PULLUP);
  }
  // Configurer les broches des LED
  pinMode(pinLedSu, OUTPUT);
  pinMode(pinLedGiu, OUTPUT);

  // Initialiser le LCD
  lcd.begin(16, 2);
  aggiornaDisplay();
  aggiornaLed();
}

// Boucle principale
void loop() {
  leggiPulsanti();

  if (ciSonoRichieste()) {
    int prossimo = prossimoPiano();

    if (prossimo == -1) {
      // Aucune demande dans la direction actuelle, inverser la direction
      direzioneSu = !direzioneSu;
      aggiornaLed();
      prossimo = prossimoPiano();
    }

    if (prossimo != -1) {
      // Simuler le déplacement de l'ascenseur vers l'étage demandé
      if (pianoCorrente < prossimo) {
        pianoCorrente++;
      } else if (pianoCorrente > prossimo) {
        pianoCorrente--;
      }

      aggiornaDisplay();

      // Si nous sommes arrivés à l'étage demandé
      if (pianoCorrente == prossimo) {
        // Servir la demande
        richieste[pianoCorrente] = false;
        // Simuler l'ouverture des portes (delay)
        delay(1000);
      }
    }
  } else {
    // Aucune demande, ascenseur à l'arrêt
    aggiornaDisplay();
    delay(200);
  }
}
×
×
×
Veux-tu régénérer la réponse ?
×
Exporter le chat
Choisissez le format d'export
⏳ Generazione PDF in corso…
Allegati
×
⚠️ Vous êtes sur le point de fermer le chat et de passer au générateur d’images. Si vous n’êtes pas connecté, vous perdrez notre conversation. Confirmez-vous ?
👁 Tu consultes une discussion partagée en mode temporaire. Elle ne sera pas enregistrée.
💬
×
Prompts enregistrés
×
Note privée
×
Étiquette
×
Rechercher dans toutes les discussions
×
Vos insights
Analyse en cours…
×
Préférences IA
Nom de l'assistant 30
Longueur des réponses
Modèle IA
Réponses structurées
Inclure des exemples
Utiliser des emojis
Guide-moi, ne résous pas Des indices et des questions plutôt que la réponse toute faite
Plus de réglages →
×
Partager cette discussion
Toute personne ouvrant ce lien pourra consulter la discussion ou l'ajouter à son profil comme discussion personnelle.
⚠️ Attention : les pièces jointes de la discussion seront également partagées. Qui l'ajoutera recevra une copie des fichiers dans son dossier.
Discussion partagée
Quelqu'un a partagé une discussion avec toi. Veux-tu seulement la consulter ou l'ajouter à tes discussions ?
⚠️ Attention : les pièces jointes de la discussion seront également partagées. Qui l'ajoutera recevra une copie des fichiers dans son dossier.
×

📌 Messages enregistrés

Chargement...

×

Historique des discussions

programmes-exemples · HISTORIQUE DU CHAT

Chargement...

Préférences IA

×
  • 🟢 BasiqueRéponses rapides et essentielles pour étudier
  • 🔵 MoyenQualité supérieure pour étude et programmation
  • 🟣 AvancéRaisonnement complexe et analyses détaillées
Expliquer les étapes

Qu'est-ce qu'il faut ?

Matériel Arduino :
  • Arduino Uno ou compatible
  • Écran LCD 16x2 (optionnel) connecté aux broches numériques 7 (RS), 8 (Enable), 9-12 (D4-D7)
  • Boutons pour simuler les demandes d'étage connectés aux broches numériques 2-6 (étages 1-5)
  • LED pour indiquer la direction de l'ascenseur connectées aux broches numériques 13 (haut) et A0 (bas)
  • Alimentation 5V standard
Câblage/Pinout :
  • Boutons étages 1-5 : broches 2,3,4,5,6 (INPUT_PULLUP)
  • LED direction haut : broche 13 (OUTPUT)
  • LED direction bas : broche A0 (OUTPUT)
  • LCD : RS=7, E=8, D4=9, D5=10, D6=11, D7=12
Logiciel :
  • Dépendances : bibliothèque LiquidCrystal pour gestion LCD (incluse dans l'IDE Arduino)
  • Configuration : définition du nombre d'étages, anti-rebond des boutons, gestion de la file prioritaire
  • Logique : gestion de l'état de l'ascenseur, file des demandes, mouvement et priorité de direction
  • Fonctions de support pour mise à jour de l'affichage et état des LED

Sujets Similaires

Générateur de table de multiplication d’un nombre
Programme C++ simple pour générer la table de multiplication d’un nombre entier, idéal pour apprendre les boucles et la gestion des entrées utilisateur.
Simulateur de lancer de dé (1-6)
Simulateur de lancer de dé Arduino avec afficheur 7 segments, bouton poussoir et génération aléatoire pour afficher un nombre de 1 à 6.
Conversion de l’euro vers d’autres devises avec des taux fixes
Programme C++ simple pour convertir des euros en dollars, livres sterling et yens avec des taux fixes, affichage précis et interface console facile.
Carnet de contacts textuel avec recherche par nom
Programme C++ simple pour un carnet de contacts textuel avec insertion, affichage et recherche par nom insensible à la casse via un menu interactif.
Gestion d’une liste de livres avec sauvegarde dans un fichier texte
Programme C++ pour gérer une liste de livres avec ajout, affichage et sauvegarde dans un fichier texte, simple et extensible.
Simulateur de file d’attente au supermarché avec std::queue
Simulateur de file d’attente au supermarché en C++ utilisant std::queue pour gérer les clients en FIFO, idéal pour apprendre la gestion des files.
Gestion d’un inventaire de magasin avec structures et vecteurs
Gestion d’inventaire en C++ avec structures et vecteurs : ajout, suppression, recherche et affichage de produits, code pédagogique et extensible.
Mini agenda quotidienne avec rendez-vous triés par heure
Programme C++ simple pour gérer un mini agenda quotidien avec rendez-vous triés automatiquement par heure, saisie console et affichage clair.