⏱️ درس 67: کرنومتر دقیق با millis

شروع، توقف و صفر با دو دکمه — و نمایش mm:ss.d روی سریال.

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

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

  1. ساعت درونی آردوینو
  2. قدم ۱ — دو دکمه
  3. قدم ۲ — ذخیره‌ی زمان
  4. اشتباه رایج: سرریز ۴۹ روزه
  5. چالش: زمان دور

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

const int START_BTN = 2, RESET_BTN = 3;
bool running = false;
unsigned long startTime = 0, elapsed = 0, lastPrint = 0, lastPress = 0;
int lastStart = HIGH, lastReset = HIGH;

// prints t milliseconds as mm:ss.d
void printTime(unsigned long t) {
  unsigned long tenths = (t % 1000 - t % 100) / 100;
  unsigned long totalSec = (t - t % 1000) / 1000;
  unsigned long sec = totalSec % 60;
  unsigned long minutes = (totalSec - sec) / 60;
  if (minutes < 10) Serial.print("0");
  Serial.print(minutes);
  Serial.print(":");
  if (sec < 10) Serial.print("0");
  Serial.print(sec);
  Serial.print(".");
  Serial.println(tenths);
}

void setup() {
  pinMode(START_BTN, INPUT_PULLUP);
  pinMode(RESET_BTN, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("start/stop = D2, reset = D3");
}

void loop() {
  unsigned long now = millis();
  int s = digitalRead(START_BTN);
  int r = digitalRead(RESET_BTN);

  if (s == LOW && lastStart == HIGH && now - lastPress > 50) {
    lastPress = now;
    if (running) {
      elapsed = elapsed + (now - startTime);   // bank the time
      running = false;
      Serial.print("STOP  ");
      printTime(elapsed);
    } else {
      startTime = now;
      running = true;
      Serial.println("START");
    }
  }
  if (r == LOW && lastReset == HIGH && now - lastPress > 50) {
    lastPress = now;
    running = false;
    elapsed = 0;
    Serial.println("RESET  00:00.0");
  }
  lastStart = s;
  lastReset = r;

  if (running && now - lastPrint >= 100) {
    lastPrint = now;
    printTime(elapsed + (now - startTime));
  }
}

چرا این درس؟

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

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

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

🔢

درس 66: بیت‌ها و عملگرهای بیتی

🕹️

درس 68: جوی‌استیک: کنترل دو محوره