🥤 درس 95: دستگاه فروش خودکار

کی‌پد، LCD و سروو: اعتبار، کد کالا و باقی پول.

سطح: پیشرفته · زمان: حدود 20 دقیقه · مفاهیم: کی‌پد، LCD، آرایه، منطق

قدم‌های این درس

  1. چرا؟ یک فروشنده‌ی بی‌خطا
  2. قدم ۱ — مدار
  3. قدم ۲ — کد: اعتبار، کالا، باقی پول
  4. اشتباه رایج: خرید بدون انتخاب
  5. چالش: موجودی انبار

نمونه‌ای از کد این درس

// دستگاه فروش: A = سکه ۱۰۰۰، B = اسکناس ۵۰۰۰، ۱..۳ = کالا، # = خرید، * = پس گرفتن
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>

const byte ROWS = 4, COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},{'4','5','6','B'},
  {'7','8','9','C'},{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad pad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo gate;

const long prices[4] = {0, 2000, 3500, 5000};   // product 1..3 (0 unused)
long credit = 0;
int choice = 0;

void show(long top, long bottom) {
  lcd.clear();
  lcd.setCursor(0, 0); lcd.print("Etebar: "); lcd.print(top);
  lcd.setCursor(0, 1); lcd.print("Kala: "); lcd.print(choice);
  lcd.print(" $"); lcd.print(bottom);
}

void setup() {
  lcd.init();
  lcd.backlight();
  gate.attach(11);
  gate.write(0);
  show(credit, 0);
}

void loop() {
  char k = pad.getKey();
  if (!k) return;

  if (k == 'A') credit = credit + 1000;
  else if (k == 'B') credit = credit + 5000;
  else if (k == '1') choice = 1;
  else if (k == '2') choice = 2;
  else if (k == '3') choice = 3;
  else if (k == '*') {                       // cancel: give all the money back
    lcd.clear(); lcd.print("Bargasht: "); lcd.print(credit);
    credit = 0; choice = 0; delay(1500);
  } else if (k == '#' && choice > 0) {
    if (credit >= prices[choice]) {
      long change = credit - prices[choice];
      lcd.clear(); lcd.print("Befarmaid :)");
      lcd.setCursor(0, 1); lcd.print("Baghi: "); lcd.print(change);
      gate.write(90); delay(1000); gate.write(0);   // drop the product
      delay(1000);
      credit = 0;
    } else {
      lcd.clear(); lcd.print("Kam ast: "); lcd.print(prices[choice] - credit);
      delay(1500);
    }
    choice = 0;
  }
  show(credit, prices[choice]);
}

چرا این درس؟

دوره‌ی تینکرکد فارسی تعاملی است: هر قدم را خودت داخل شبیه‌ساز انجام می‌دهی — مدار واقعی می‌چینی، کد واقعی اجرا می‌کنی و نتیجه را همان لحظه می‌بینی. این درس روی درس‌های قبلی ساخته شده، پس اگر تازه شروع کرده‌ای از درس ۱ بیا!

این درس را رایگان در شبیه‌ساز شروع کن 🎓

درس‌های دیگر دوره

🛗

درس 94: آسانسور: ماشین حالت بزرگ

🚨

درس 96: سیستم امنیتی کامل