⏱️ درس 67: کرنومتر دقیق با millis
شروع، توقف و صفر با دو دکمه — و نمایش mm:ss.d روی سریال.
سطح: پیشرفته · زمان: حدود 20 دقیقه · مفاهیم: millis، زمان، دکمه
قدمهای این درس
- ساعت درونی آردوینو
- قدم ۱ — دو دکمه
- قدم ۲ — ذخیرهی زمان
- اشتباه رایج: سرریز ۴۹ روزه
- چالش: زمان دور
نمونهای از کد این درس
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));
}
}
چرا این درس؟
دورهی تینکرکد فارسی تعاملی است: هر قدم را خودت داخل شبیهساز انجام میدهی — مدار واقعی میچینی، کد واقعی اجرا میکنی و نتیجه را همان لحظه میبینی. این درس روی درسهای قبلی ساخته شده، پس اگر تازه شروع کردهای از درس ۱ بیا!
این درس را رایگان در شبیهساز شروع کن 🎓