🗂️ درس 70: منوی چندصفحه‌ای روی LCD با دکمه

سه دکمه، سه صفحه، یک تنظیم قابل تغییر — مثل منوی یک دستگاه واقعی.

سطح: پیشرفته · زمان: حدود 25 دقیقه · مفاهیم: LCD، منو، ماشین حالت

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

  1. منو یک ماشین حالت است
  2. قدم ۱ — LCD، سه دکمه، LED و بازر
  3. قدم ۲ — draw و change
  4. اشتباه رایج: کشیدن صفحه در هر دور
  5. چالش: صفحه‌ی چهارم

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

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int UP = 2, DOWN = 3, SEL = 4, LED = 9, BUZZER = 8;
const int PAGES = 3;
int page = 0;              // which page we are on
bool editing = false;      // false = browsing, true = changing a value
int brightness = 5;        // 0..10
bool beepOn = true;
int lastUp = HIGH, lastDown = HIGH, lastSel = HIGH;

void draw() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(editing ? "* " : "> ");
  switch (page) {
    case 0: lcd.print("Brightness"); lcd.setCursor(2, 1); lcd.print(brightness); break;
    case 1: lcd.print("Beep"); lcd.setCursor(2, 1); lcd.print(beepOn ? "ON" : "OFF"); break;
    case 2: lcd.print("Info"); lcd.setCursor(2, 1); lcd.print("tinkercad.ir"); break;
  }
}

void change(int dir) {
  if (!editing) {
    page = (page + dir + PAGES) % PAGES;      // browse pages, wrap around
  } else if (page == 0) {
    brightness = constrain(brightness + dir, 0, 10);
  } else if (page == 1) {
    beepOn = !beepOn;
  }
  analogWrite(LED, brightness * 25);
  draw();
}

void setup() {
  pinMode(UP, INPUT_PULLUP);
  pinMode(DOWN, INPUT_PULLUP);
  pinMode(SEL, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
  lcd.init();
  lcd.backlight();
  analogWrite(LED, brightness * 25);
  draw();
}

void loop() {
  int u = digitalRead(UP), d = digitalRead(DOWN), s = digitalRead(SEL);
  if (u == LOW && lastUp == HIGH) change(-1);
  if (d == LOW && lastDown == HIGH) change(1);
  if (s == LOW && lastSel == HIGH) {
    if (page != 2) editing = !editing;          // Info has nothing to edit
    if (beepOn) tone(BUZZER, 1000, 50);
    draw();
  }
  lastUp = u; lastDown = d; lastSel = s;
  delay(20);                                    // crude debounce
}

چرا این درس؟

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

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

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

💖

درس 69: حرف‌های سفارشی روی LCD

🖥️

درس 71: نمایشگر OLED: متن و شکل