#include <Wire.h>
#include "ssd1306.h"
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define BUZZER_PIN 3
#define RED_LED_PIN 4
#define GREEN_LED_PIN 5
#define PIR_PIN 6
#define PHOTO_PIN A0
#define MQ2_PIN A1
#define RELAY_PIN 7
#define SMOKE_THRESHOLD 300
#define TEMP_THRESHOLD 50
#define LIGHT_THRESHOLD 200
#define WORKING_HOUR_START 8
#define WORKING_HOUR_END 18
void setup() {
Serial.begin(9600);
ssd1306_128x64_i2c_init();
ssd1306_fillScreen(0x00);
dht.begin();
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(GREEN_LED_PIN, HIGH);
displayNormalState();
}
void loop() {
int currentHour = 10; // Для тестування
// Зчитування даних
bool smokeDetected = analogRead(MQ2_PIN) > SMOKE_THRESHOLD;
bool highTempDetected = dht.readTemperature() > TEMP_THRESHOLD;
bool motionDetected = (currentHour < WORKING_HOUR_START || currentHour >= WORKING_HOUR_END)
&& digitalRead(PIR_PIN) == HIGH;
bool lowLightDetected = analogRead(PHOTO_PIN) < LIGHT_THRESHOLD;
bool systemNormal = !smokeDetected && !highTempDetected && !motionDetected && !lowLightDetected;
// Керування виходами
digitalWrite(GREEN_LED_PIN, systemNormal);
digitalWrite(RED_LED_PIN, !systemNormal);
digitalWrite(BUZZER_PIN, !systemNormal);
digitalWrite(RELAY_PIN, (smokeDetected || highTempDetected || lowLightDetected) ? HIGH : LOW);
// Оновлення дисплея
updateDisplay(systemNormal, smokeDetected, highTempDetected, motionDetected, lowLightDetected);
delay(2000);
}
void updateDisplay(bool normal, bool smoke, bool temp, bool motion, bool light) {
ssd1306_clearScreen();
if(normal) {
ssd1306_drawString(0, 0, "Стан нормальний", 1, 1);
} else {
int y = 0;
if(smoke) {
ssd1306_drawString(0, y, "ДИМ! ТРИВОГА!", 1, 1);
y += 10;
}
if(temp) {
ssd1306_drawString(0, y, "ВИСОКА ТЕМП!", 1, 1);
y += 10;
}
if(motion) {
ssd1306_drawString(0, y, "РУХ! ТРИВОГА!", 1, 1);
y += 10;
}
if(light) {
ssd1306_drawString(0, y, "ЗАТЕМНЕННЯ!", 1, 1);
y += 10;
}
}
// Відображення даних сенсорів
char buffer[20];
snprintf(buffer, sizeof(buffer), "Темп: %.1f C", dht.readTemperature());
ssd1306_drawString(0, 40, buffer, 1, 1);
snprintf(buffer, sizeof(buffer), "Дим: %d", analogRead(MQ2_PIN));
ssd1306_drawString(0, 50, buffer, 1, 1);
snprintf(buffer, sizeof(buffer), "Світло: %d", analogRead(PHOTO_PIN));
ssd1306_drawString(0, 60, buffer, 1, 1);
}
void displayNormalState() {
ssd1306_clearScreen();
ssd1306_drawString(0, 0, "Система активна", 1, 1);
ssd1306_drawString(0, 10, "Стан нормальний", 1, 1);
}