
Интернет-магазин «Неглупый Дом»
Часы реального времени DS1307 хранят точное время независимо от скетча, а модуль реле включает нагрузку строго по расписанию — например, свет или насос с 18:00 до 23:00 каждый день, без привязки к тому, когда Arduino включили.
DS1307 — микросхема часов реального времени на шине I2C: внутри неё есть собственный генератор и счётчик секунд/минут/часов/даты, который продолжает идти, даже когда Arduino выключен или перезагружается — именно поэтому проект получает "настоящее" текущее время, а не просто считает секунды от старта программы, как это делал бы `millis()`. Для этого модулю нужна отдельная батарейка типа CR2032 в держателе на плате — модуль, указанный в комплекте, продаётся без неё, и без батарейки часы будут сбрасываться на 2000 год при каждом отключении питания.
Время один раз нужно записать в модуль (обычно это дата и время компьютера на момент заливки скетча), после чего DS1307 сам продолжает отсчёт. В каждом цикле `loop()` Arduino просто спрашивает у модуля текущий час и минуту и сравнивает их с заданными границами интервала — если текущее время внутри интервала, реле включено, иначе выключено.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
#include <Wire.h>
#include <RTClib.h> // библиотека Adafruit RTClib — поддерживает DS1307/DS3231
RTC_DS1307 rtc;
const int RELAY_PIN = 2;
const int ON_HOUR = 18; // включаем в 18:00
const int OFF_HOUR = 23; // выключаем в 23:00
void setup() {
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
if (!rtc.begin()) {
Serial.println("DS1307 не найден на шине I2C!");
while (1) delay(1000);
}
if (!rtc.isrunning()) {
Serial.println("Часы не были запущены — выставляю время компиляции скетча.");
// ВНИМАНИЕ: это запишет в часы дату/время компиляции только один раз,
// после первой успешной загрузки можно закомментировать эту строку.
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
int h = now.hour();
Serial.print("Сейчас: ");
Serial.print(h);
Serial.print(":");
Serial.println(now.minute());
bool shouldBeOn = (h >= ON_HOUR && h < OFF_HOUR);
digitalWrite(RELAY_PIN, shouldBeOn ? HIGH : LOW);
delay(30000); // проверяем время раз в 30 секунд — для реле этого достаточно
}
Библиотека RTClib ставится через Менеджер библиотек Arduino IDE (поиск "RTClib" от Adafruit). После первой прошивки со строкой `rtc.adjust(...)` время будет записано в модуль и сохранится на батарейке — эту строку рекомендуется закомментировать и перезалить скетч ещё раз, чтобы повторные перезагрузки Arduino не сбивали время на момент компиляции при каждом ресете.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 177 ₽ 159 ₽ (экономия 18 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.