#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <Adafruit_BMP280.h>
// Параметры подключения
#define DHTPIN 2
#define DHTTYPE DHT22
#define BMP_SCK (9)
#define BMP_MISO (8)
#define BMP_MOSI (7)
#define BMP_CS (6)
#define BUTTON_UP 11
#define BUTTON_DOWN 12
#define BUTTON_SELECT 10
#define BUTTON_BACK 13
// Инициализация компонентов
LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP280 bmp(BMP_CS);
// Глобальные переменные
int currentPage = 0;
int lightingMode = 0; // 0: Выключено, 1: День, 2: Сигнализация, 3: Ночь
int lightThreshold = 500;
int tempThreshold = 25;
#define TOTAL_PAGES 7
bool alarmActive = false;
// Функции для меню
void displayMenu();
void navigateMenu();
voud updateSensorData();
// Функции для безопасности
// void triggerAlarm();
// Функции для климат-контроля
// void checkClimate();
// Функции для освещения
void setup() {
// Инициализация компонентов
lcd.begin(20, 4);
lcd.backlight();
bmp.begin();
dht.begin();
// Пины кнопок
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
pinMode(BUTTON_SELECT, INPUT_PULLUP);
pinMode(BUTTON_BACK, INPUT_PULLUP);
lcd.setCursor(0, 0);
lcd.print("Smart Home");
delay(2000);
lcd.clear();
lcd.print("Sensor Data:");
updateSensorData();
}
void loop() {
// navigateMenu();
updateSensorData();
// // Проверка текущей страницы
// if (currentPage == 0) { // Страница безопасности
// // checkSecurity();
// } else if (currentPage == 4) { // Страница "Sensor Data"
// updateSensorData(); // Обновляем данные на странице
// }
delay(1000); // Небольшая задержка для стабильности
}
// -------------------- Функция обновления данных --------------------
void updateSensorData() {
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(dht.readTemperature());
lcd.print(" C "); // Пробелы для стирания старых символов
lcd.setCursor(0, 2);
lcd.print("Humid: ");
lcd.print(dht.readHumidity());
lcd.print(" % ");
lcd.setCursor(0, 3);
lcd.print("Pressure: ");
lcd.print(bmp.readPressure());
lcd.print(" Pa");
}
// -------------------- Пользовательский интерфейс --------------------
// Увеличиваем количество страниц меню
// int subMenuIndex = 0; // Индекс для подменю
// int editing = -1; // -1: ничего не редактируем, >=0: редактируем параметр
// void displayMenu() {
// lcd.clear();
// if (editing == -1) { // Обычный режим
// switch (currentPage) {
// case 0: // Система безопасности
// lcd.print("Security:");
// lcd.setCursor(0, 1);
// lcd.print(alarmActive ? "Enabled" : "Disabled");
// lcd.setCursor(0, 2);
// lcd.print("Up/Down to toggle");
// lcd.setCursor(0, 3);
// lcd.print("Select to confirm");
// break;
// case 1: // Климат-контроль
// lcd.print("Climate Ctrl:");
// lcd.setCursor(0, 1);
// lcd.print("Temp > ");
// lcd.print(tempThreshold);
// lcd.print(" C");
// lcd.setCursor(0, 2);
// lcd.print("Up/Down to edit");
// lcd.setCursor(0, 3);
// lcd.print("Select to confirm");
// break;
// case 2: // Освещение
// lcd.print("Lighting:");
// lcd.setCursor(0, 1);
// lcd.print("Light < ");
// lcd.print(lightThreshold);
// lcd.print(" lux");
// lcd.setCursor(0, 2);
// lcd.print("Up/Down to edit");
// lcd.setCursor(0, 3);
// lcd.print("Select to confirm");
// break;
// case 3: // Настройки
// lcd.print("Settings:");
// lcd.setCursor(0, 1);
// lcd.print("Under Development");
// break;
// case 4: // Страница "Sensor Data"
// lcd.print("Sensor Data:");
// updateSensorData(); // Первичное заполнение данных
// break;
// case 5: // Управление дверью
// lcd.print("Door Control:");
// lcd.setCursor(0, 1);
// lcd.print(doorServo.read() > 45 ? "Door: Open" : "Door: Closed");
// lcd.setCursor(0, 2);
// lcd.print("Select: Toggle");
// break;
// case 6: // Страница режима освещения
// lcd.print("Lighting Mode:");
// lcd.setCursor(0, 1);
// switch (lightingMode) {
// case 0: lcd.print("Off"); break;
// case 1: lcd.print("Day"); break;
// case 2: lcd.print("Night"); break;
// case 3: lcd.print("Auto"); break;
// }
// lcd.setCursor(0, 2);
// lcd.print("Select to toggle");
// break;
// default:
// lcd.print("Invalid Page");
// break;
// }
// }
// }
// void navigateMenu() {
// if (editing == -1) { // Навигация по главному меню
// if (!digitalRead(BUTTON_UP)) {
// currentPage = (currentPage + 1) % TOTAL_PAGES; // Учитываем новое количество страниц
// displayMenu();
// delay(200);
// } else if (!digitalRead(BUTTON_DOWN)) {
// currentPage = (currentPage - 1 + TOTAL_PAGES) % TOTAL_PAGES;
// displayMenu();
// delay(200);
// }
// }
// // Управление дверью
// if (currentPage == 5) {
// if (!digitalRead(BUTTON_SELECT)) {
// toggleDoor(); // Переключаем состояние двери
// displayMenu();
// delay(200);
// }
// }
// if (currentPage == 0) {
// if (!digitalRead(BUTTON_SELECT)) {
// alarmActive = !alarmActive;
// displayMenu();
// }
// }
// // Управление режимами освещения
// if (currentPage == 6 && editing == -1) {
// if (!digitalRead(BUTTON_SELECT)) {
// lightingMode = (lightingMode + 1) % 4; // Переключаем режим освещения
// displayMenu(); // Обновляем меню для отображения текущего режима
// delay(200);
// }
// }
// }
// -------------------- Система безопасности --------------------
// void triggerAlarm() {
// // Включаем красный свет и буззер
// controlLightingMode(2); // Красный свет (сигнализация)
// for (int i = 0; i < 5; i++) {
// tone(BUZZER_PIN, 1000); // Звук с частотой 1000 Гц
// delay(300);
// noTone(BUZZER_PIN);
// delay(300);
// }
// // После завершения работы сигнализации свет возвращается к текущему режиму
// checkLighting();
// }
// -------------------- Климат-контроль --------------------
// void checkClimate() {
// float temp = dht.readTemperature();
// lcd.setCursor(0, 0);
// lcd.print("Temp: ");
// lcd.print(temp);
// }
// -------------------- Управление освещением --------------------