#define BLYNK_TEMPLATE_ID "TMPL4tIeANvw8"
#define BLYNK_TEMPLATE_NAME "Monitor VV"
#define BLYNK_AUTH_TOKEN "v1GS0xB_fMHQwaSmf6b1aBuefdnUi45M"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <DHT.h>
// --- Налаштування Wi-Fi (Для Wokwi) ---
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// --- Піни дисплея ILI9341 ---
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 14
#define TFT_MOSI 11
#define TFT_CLK 12
#define TFT_MISO 13
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
// --- Піни датчиків ---
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;
#define MQ2_PIN 5
#define NTC_PIN 6
#define TRIG_PIN 16
#define ECHO_PIN 17
#define BUZZER_PIN 7
BlynkTimer timer;
bool securityArmed = false; // Статус охорони
// Функція для зчитування аналогового датчика температури
float getNTCTemperature() {
int analogValue = analogRead(NTC_PIN);
float celsius = 1 / (log(1 / (4095. / analogValue - 1)) / 3950 + 1.0 / 298.15) - 273.15;
return celsius;
}
// Функція вимірювання відстані (HC-SR04)
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
float duration = pulseIn(ECHO_PIN, HIGH);
return (duration * 0.0343) / 2; // Відстань у см
}
// Головна функція збору даних і відправки
void sendSensorData() {
// Зчитування даних
float t_dht = dht.readTemperature();
float h_dht = dht.readHumidity();
float pressure = bmp.readPressure() / 133.322; // Перевід у мм рт. ст.
float t_bmp = bmp.readTemperature();
int gas_level = analogRead(MQ2_PIN);
float t_ntc = getNTCTemperature();
float distance = getDistance();
// Логіка безпеки
if (gas_level > 2000) { // Поріг для газу
tone(BUZZER_PIN, 1000); // Сирена
Blynk.logEvent("fire_alert", "Увага! Зафіксовано задимлення!");
} else if (securityArmed && distance < 50.0) { // Якщо охорона увімкнена і хтось ближче 50 см
tone(BUZZER_PIN, 2000); // Інша сирена
Blynk.logEvent("security_alert", "Рух у зоні охорони!");
} else {
noTone(BUZZER_PIN);
}
// Оновлення дисплея
tft.fillRect(0, 40, 240, 280, ILI9341_BLACK); // Очищення робочої зони
tft.setCursor(10, 50); tft.print("DHT Temp: "); tft.print(t_dht, 1); tft.println(" C");
tft.setCursor(10, 80); tft.print("Humidity: "); tft.print(h_dht, 1); tft.println(" %");
tft.setCursor(10, 110); tft.print("Pressure: "); tft.print(pressure, 0); tft.println(" mmHg");
tft.setCursor(10, 140); tft.print("NTC Temp: "); tft.print(t_ntc, 1); tft.println(" C");
tft.setCursor(10, 170); tft.print("Gas Level: "); tft.println(gas_level);
tft.setCursor(10, 200); tft.print("Distance: "); tft.print(distance, 0); tft.println(" cm");
tft.setCursor(10, 240);
tft.setTextColor(securityArmed ? ILI9341_GREEN : ILI9341_RED);
tft.print(securityArmed ? "SECURITY: ARMED" : "SECURITY: DISARMED");
tft.setTextColor(ILI9341_WHITE);
// Відправка в Blynk
Blynk.virtualWrite(V0, t_dht);
Blynk.virtualWrite(V1, h_dht);
Blynk.virtualWrite(V2, pressure);
Blynk.virtualWrite(V3, t_ntc);
Blynk.virtualWrite(V4, gas_level);
Blynk.virtualWrite(V5, distance);
}
// Отримання команди з Blynk (Кнопка на V6 для вкл/викл охорони)
BLYNK_WRITE(V6) {
securityArmed = param.asInt();
if(securityArmed) tone(BUZZER_PIN, 500, 200); // Короткий пік при активації
}
void setup() {
Serial.begin(115200);
// Ініціалізація пінів
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Ініціалізація I2C для BMP180 (SDA, SCL)
Wire.begin(8, 18);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP180 sensor!");
}
// Ініціалізація дисплея
SPI.begin(TFT_CLK, TFT_MISO, TFT_MOSI, TFT_CS);
tft.begin();
tft.setRotation(0);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.setCursor(20, 10);
tft.println("SYSTEM STARTING");
// Ініціалізація DHT
dht.begin();
// Підключення до Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(20, 10);
tft.setTextColor(ILI9341_CYAN);
tft.println("WORKSPACE MONITOR");
tft.setTextColor(ILI9341_WHITE);
// Налаштовуємо таймер на виконання sendSensorData кожні 2 секунди
timer.setInterval(2000L, sendSensorData);
}
void loop() {
Blynk.run();
timer.run();
}