⏰ درس 75: ساعت زنگدار
RTC + بازر + دکمه: ساعتی که سر وقت زنگ میزند و با یک فشار ساکت میشود.
سطح: پیشرفته · زمان: حدود 20 دقیقه · مفاهیم: RTC، بازر، ماشین حالت
قدمهای این درس
- یک زنگ چه چیزهایی لازم دارد؟
- قدم ۱ — مدار
- قدم ۲ — مقایسهی ساعت و دقیقه
- اشتباه رایج: فقط دقیقه را مقایسه کردن
- چالش: چُرت (Snooze)
نمونهای از کد این درس
// Alarm clock: RTC + buzzer (D8) + button (D2 to GND).
// The alarm is set to one minute from now so you can hear it soon.
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 rtc;
const int BUZZER = 8, BUTTON = 2;
int alarmHour, alarmMinute;
bool ringing = false;
bool doneToday = false;
void setup() {
Serial.begin(9600);
pinMode(BUZZER, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
rtc.begin();
DateTime now = rtc.now();
alarmHour = now.hour();
alarmMinute = now.minute() + 1;
if (alarmMinute == 60) { alarmMinute = 0; alarmHour = (alarmHour + 1) % 24; }
Serial.print("Alarm set for ");
Serial.print(alarmHour); Serial.print(":"); Serial.println(alarmMinute);
}
void loop() {
DateTime now = rtc.now();
// compare hour AND minute - the minute alone would ring every hour
if (!doneToday && now.hour() == alarmHour && now.minute() == alarmMinute) {
if (!ringing) Serial.println("Wake up!");
ringing = true;
}
if (ringing) {
digitalWrite(BUZZER, millis() % 500 < 250 ? HIGH : LOW); // beep-beep, no delay
if (digitalRead(BUTTON) == LOW) { // pressed = LOW (pull-up)
ringing = false;
doneToday = true;
digitalWrite(BUZZER, LOW);
Serial.println("Alarm stopped. Good morning!");
}
}
if (now.hour() == 0 && now.minute() == 0) doneToday = false; // new day
}
چرا این درس؟
دورهی تینکرکد فارسی تعاملی است: هر قدم را خودت داخل شبیهساز انجام میدهی — مدار واقعی میچینی، کد واقعی اجرا میکنی و نتیجه را همان لحظه میبینی. این درس روی درسهای قبلی ساخته شده، پس اگر تازه شروع کردهای از درس ۱ بیا!
این درس را رایگان در شبیهساز شروع کن 🎓