🛗 ماموریت ۹۷: آسانسور با ماشین حالت

سه دکمه (D2–D4) طبقه را صدا می‌زنند، سه LED (D11–D13) طبقه را نشون می‌دن و سروو D6 کابینه. حالت‌ها: IDLE، MOVING، DOORS با switch.

سطح: چالشی ⭐⭐⭐ · مود: آردوینو — با کد

هدف‌ها

قطعه‌های لازم

▶ همین ماموریت را در شبیه‌ساز امتحان کن
💡 گیر کردی؟ داخل شبیه‌ساز راهنما را ببین، و اگر باز هم نشد دکمه‌ی «برام حلش کن» مدار را برایت می‌چیند تا ببینی چطور کار می‌کند.

جواب کامل

اول خودت امتحان کن! بعد جواب را ببین 👀

سیم‌کشی

  1. Arduino Uno (D2) ⟷ Push Button (PIN_A1)
  2. Push Button (PIN_A2) ⟷ Arduino Uno (GND2)
  3. Arduino Uno (D3) ⟷ Push Button (PIN_A1)
  4. Push Button (PIN_A2) ⟷ Arduino Uno (GND2)
  5. Arduino Uno (D4) ⟷ Push Button (PIN_A1)
  6. Push Button (PIN_A2) ⟷ Arduino Uno (GND2)
  7. Arduino Uno (D11) ⟷ مقاومت 220Ω (PIN1)
  8. مقاومت 220Ω (PIN2) ⟷ LED (Green) (ANODE)
  9. LED (Green) (CATHODE) ⟷ Arduino Uno (GND1)
  10. Arduino Uno (D12) ⟷ مقاومت 220Ω (PIN1)
  11. مقاومت 220Ω (PIN2) ⟷ LED زرد (ANODE)
  12. LED زرد (CATHODE) ⟷ Arduino Uno (GND1)
  13. Arduino Uno (D13) ⟷ مقاومت 220Ω (PIN1)
  14. مقاومت 220Ω (PIN2) ⟷ LED (Red) (ANODE)
  15. LED (Red) (CATHODE) ⟷ Arduino Uno (GND1)
  16. Arduino Uno (VCC5) ⟷ سروو موتور (VCC)
  17. سروو موتور (GND) ⟷ Arduino Uno (GND2)
  18. Arduino Uno (D6) ⟷ سروو موتور (SIG)

کد

// Elevator: 3 call buttons, 3 floor LEDs, a servo as the car (0/90/180 deg)
#include <Servo.h>

const int IDLE = 0;
const int MOVING = 1;
const int DOORS = 2;

int buttons[3] = {2, 3, 4};
int leds[3] = {11, 12, 13};
Servo car;
int state = IDLE;
int floorNow = 0;
int target = 0;
int angle = 0;
unsigned long doorsSince = 0;

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 3; i++) {
    pinMode(buttons[i], INPUT_PULLUP);
    pinMode(leds[i], OUTPUT);
  }
  car.attach(6);
  car.write(0);
  digitalWrite(leds[0], HIGH);
}

void loop() {
  switch (state) {
    case IDLE:
      for (int i = 0; i < 3; i++) {
        if (digitalRead(buttons[i]) == LOW && i != floorNow) {
          target = i;
          state = MOVING;
          digitalWrite(leds[floorNow], LOW);
          Serial.print("Going to floor ");
          Serial.println(target);
        }
      }
      break;
    case MOVING:
      if (angle < target * 90) angle++;
      if (angle > target * 90) angle--;
      car.write(angle);
      if (angle == target * 90) {
        floorNow = target;
        digitalWrite(leds[floorNow], HIGH);
        doorsSince = millis();
        state = DOORS;
        Serial.println("Ding! Doors open");
      }
      break;
    case DOORS:
      if (millis() - doorsSince > 2000) state = IDLE;
      break;
  }
  delay(10);
}

ماموریت‌های مشابه

🌞

ماموریت ۹۶: ردیاب خورشید

🥤

ماموریت ۹۸: دستگاه فروش خودکار

🎯

ماموریت ۹۵: کنترل تناسبی سروو

🐍

ماموریت ۹۹: بازی مار روی ماتریس

📚 برای یاد گرفتن پایه‌ها سری به دوره‌ی آموزش آردوینو بزن · 🎯 همه‌ی ماموریت‌ها