🛒
0 товаров
0 руб.

Интернет-магазин «Неглупый Дом»


⏰ Проект: напоминание-будильник по расписанию на часах реального времени DS1307

В другом проекте на сайте DS1307 включает реле на заданный интервал времени, управляя внешним прибором. Здесь часы используются проще — просто как напоминание самому человеку: в заданные моменты времени звучит короткая мелодия через зуммер, без управления никакой внешней нагрузкой.

Как это работает

Принцип работы с часами такой же, как и в проекте с реле: DS1307 хранит точное текущее время независимо от того, включена ли Arduino, и код в каждом цикле `loop()` спрашивает у модуля текущий час и минуту. Разница — не в способе чтения времени, а в том, что делается при совпадении: вместо сравнения с длинным интервалом "включено/выключено" код проверяет точное совпадение часа И минуты с одним из нескольких заданных моментов напоминания, и при совпадении один раз проигрывает короткую мелодию.

Важная деталь — напоминание должно сработать ровно один раз в заданную минуту, а не продолжать звучать всю эту минуту подряд (цикл `loop()` выполняется много раз в секунду, и без защиты от повторного срабатывания мелодия проигрывалась бы десятки раз за одну минуту). Для этого код запоминает, для какой минуты уже было напоминание, и не повторяет его, пока минута не сменится.

Пошаговая сборка

Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.

  1. Убедитесь, что в держателе DS1307 установлена батарейка CR2032 и в модуль ранее было записано правильное текущее время (см. проект с реле по расписанию, если нужно сделать это заново).
  2. DS1307: SDA → A4, SCL → A5, VCC → 5V, GND → GND.
  3. Зуммер: сигнал → D8, GND → GND.

Скетч

// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.

#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: Электронные модули.

← 🔀 многозонная сигнализация через мультиплекс…📡 удалённый монитор пульса через ESP8266 на … →

🎁 Купить весь комплект со скидкой 10%

Все 2 товара сразу в корзину: 142 ₽ 128 ₽ (экономия 14 ₽)

Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.

Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.

Корзина


Поиск



Пример: понижающий или DC-DC или mini360 или aw-023 или арт. OZ/WB/YA