
Интернет-магазин «Неглупый Дом»
В другом проекте на сайте DS1307 включает реле на заданный интервал времени, управляя внешним прибором. Здесь часы используются проще — просто как напоминание самому человеку: в заданные моменты времени звучит короткая мелодия через зуммер, без управления никакой внешней нагрузкой.
Принцип работы с часами такой же, как и в проекте с реле: DS1307 хранит точное текущее время независимо от того, включена ли Arduino, и код в каждом цикле `loop()` спрашивает у модуля текущий час и минуту. Разница — не в способе чтения времени, а в том, что делается при совпадении: вместо сравнения с длинным интервалом "включено/выключено" код проверяет точное совпадение часа И минуты с одним из нескольких заданных моментов напоминания, и при совпадении один раз проигрывает короткую мелодию.
Важная деталь — напоминание должно сработать ровно один раз в заданную минуту, а не продолжать звучать всю эту минуту подряд (цикл `loop()` выполняется много раз в секунду, и без защиты от повторного срабатывания мелодия проигрывалась бы десятки раз за одну минуту). Для этого код запоминает, для какой минуты уже было напоминание, и не повторяет его, пока минута не сменится.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
const int BUZZER_PIN = 8;
// моменты напоминания: {час, минута}
const int REMINDERS[2][2] = {{9, 0}, {18, 30}};
int lastReminderMinute = -1;
void playChime() {
tone(BUZZER_PIN, 1500, 150);
delay(200);
tone(BUZZER_PIN, 2000, 150);
delay(200);
tone(BUZZER_PIN, 2500, 300);
}
void setup() {
Serial.begin(9600);
pinMode(BUZZER_PIN, OUTPUT);
if (!rtc.begin()) {
Serial.println("DS1307 не найден!");
while (1) delay(1000);
}
}
void loop() {
DateTime now = rtc.now();
for (int i = 0; i < 2; i++) {
if (now.hour() == REMINDERS[i][0] && now.minute() == REMINDERS[i][1]) {
if (lastReminderMinute != now.minute()) {
Serial.println("Напоминание!");
playChime();
lastReminderMinute = now.minute();
}
}
}
delay(1000);
}
Библиотека RTClib (Adafruit) ставится через Менеджер библиотек Arduino IDE. Массив `REMINDERS` можно расширить до любого количества моментов напоминания — просто увеличьте размер массива и число в условии цикла `for`.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 142 ₽ 128 ₽ (экономия 14 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.