-
- Модуль RTC (DS3231/DS1307): SDA к A4, SCL к A5 (на Arduino Uno/Nano).
- Дисплей LCD (I2C): SDA к A4, SCL к A5, питание 5V.
- Кнопки: Подключаются к цифровым пинам (например, 2, 3, 4) с использованием подтягивающих резисторов или режима
INPUT_PULLUP. - Реле насоса: Управляется через цифровой пин (например, D8).
#include <Wire.h>
#include <RTClib.h> // Библиотека для работы с RTC
#include <LiquidCrystal_I2C.h> // Библиотека для LCD
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int pumpPin = 8; // Пин реле насоса
int startHour = 8; // Час включения (можно менять кнопками)
int startMinute = 0; // Минута включения
int durationMin = 5; // Длительность работы в минутах
void setup() {
pinMode(pumpPin, OUTPUT);
digitalWrite(pumpPin, LOW); // Насос выключен
if (!rtc.begin()) {
while (1); // Остановка, если RTC не найден
}
lcd.init();
lcd.backlight();
}
void loop() {
DateTime now = rtc.now(); // Получаем текущее время
// Вывод времени на дисплей
lcd.setCursor(0, 0);
lcd.print(«Time: «);
lcd.print(now.hour()); lcd.print(«:»); lcd.print(now.minute());
// Логика включения
if (now.hour() == startHour && now.minute() >= startMinute && now.minute() < (startMinute + durationMin)) {
digitalWrite(pumpPin, HIGH);
lcd.setCursor(0, 1);
lcd.print(«Pump: ON «);
} else {
digitalWrite(pumpPin, LOW);
lcd.setCursor(0, 1);
lcd.print(«Pump: OFF»);
}
delay(1000);
}
-
- LCD & RTC: SDA -> A4, SCL -> A5, VCC -> 5V, GND -> GND.
- Кнопки: Пин 2 (Меню), Пин 3 (+), Пин 4 (-). Все к GND (используем
INPUT_PULLUP). - Реле насоса: Пин 8.
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int btnMenu = 2, btnPlus = 3, btnMinus = 4, pumpPin = 8;
int startH, startM, duration;
int menuMode = 0; // 0-Главный экран, 1-Час, 2-Мин, 3-Длительность
void setup() {
pinMode(pumpPin, OUTPUT);
pinMode(btnMenu, INPUT_PULLUP);
pinMode(btnPlus, INPUT_PULLUP);
pinMode(btnMinus, INPUT_PULLUP);
rtc.begin();
lcd.init();
lcd.backlight();
// Чтение настроек из EEPROM
startH = EEPROM.read(0);
startM = EEPROM.read(1);
duration = EEPROM.read(2);
if (startH > 23) startH = 8; // Значения по умолчанию
if (duration > 60) duration = 5;
}
void loop() {
DateTime now = rtc.now();
if (digitalRead(btnMenu) == LOW) {
delay(200);
menuMode++;
if (menuMode > 3) {
menuMode = 0;
saveSettings();
}
lcd.clear();
}
if (menuMode == 0) {
displayMain(now);
checkPump(now);
} else {
handleSettings();
}
delay(100);
}
void displayMain(DateTime now) {
lcd.setCursor(0, 0);
lcd.print(«Time: «);
if (now.hour() < 10) lcd.print(‘0’); lcd.print(now.hour()); lcd.print(‘:’);
if (now.minute() < 10) lcd.print(‘0’); lcd.print(now.minute());
lcd.setCursor(0, 1);
lcd.print(«Start «); lcd.print(startH); lcd.print(‘:’); lcd.print(startM);
}
void handleSettings() {
lcd.setCursor(0, 0);
if (menuMode == 1) { lcd.print(«Set Start Hour»); updateVal(startH, 23); }
if (menuMode == 2) { lcd.print(«Set Start Min «); updateVal(startM, 59); }
if (menuMode == 3) { lcd.print(«Set Duration m»); updateVal(duration, 60); }
lcd.setCursor(0, 1);
if (menuMode == 1) lcd.print(startH);
if (menuMode == 2) lcd.print(startM);
if (menuMode == 3) lcd.print(duration);
}
void updateVal(int &val, int maxV) {
if (digitalRead(btnPlus) == LOW) { val++; if (val > maxV) val = 0; delay(150); }
if (digitalRead(btnMinus) == LOW) { val—; if (val < 0) val = maxV; delay(150); }
}
void saveSettings() {
EEPROM.update(0, startH);
EEPROM.update(1, startM);
EEPROM.update(2, duration);
}
void checkPump(DateTime now) {
int nowTotal = now.hour() * 60 + now.minute();
int startTotal = startH * 60 + startM;
if (nowTotal >= startTotal && nowTotal < (startTotal + duration)) {
digitalWrite(pumpPin, HIGH);
} else {
digitalWrite(pumpPin, LOW);
}
}
- Меню: Кнопка на пине 2 переключает режимы настройки.
- Энергонезависимость: Благодаря
EEPROM.update, данные сохраняются только при изменении, что бережет ресурс памяти. - Насос: Включается строго по расписанию, рассчитанному в минутах от начала дня.