Для электронщиков и радиолюбителей

Система оповещения для угольных шахт на базе Arduino

Система оповещения для угольных шахт на базе Arduino

В угольных шахтах используется много ручного труда при ежедневных операциях. Часто происходят различные аварии. Особенно в процессе подземной выемки генерируются газы, такие как CO (угарный газ), которые представляют угрозу для здоровья. Иногда высокая температура вызывает сильные пожары. В этом проекте используется несколько датчиков, объединённых в одну систему. Это приложение, ориентированное на безопасность в реальных условиях, способно спасать жизни работников угольных шахт при возникновении опасных ситуаций.

Мы представляем проект системы оповещения на базе Arduino для угольных шахт. Этот проект может быть использован для студенческих выставок или лабораторных работ, а также в качестве прототипа для реальной системы оповещения в шахтах.

В проект входят следующие компоненты: DHT-11 (датчик температуры и влажности), CO-датчик (MQ-2) и датчик вибрации SW-420, подключённые к Arduino через аналоговые и цифровые выводы. Зуммер подключён к цифровому выводу.

  • DHT-11 считывает температуру и влажность в шахте (высокая температура может привести к пожарам).
  • MQ-2 определяет концентрацию угарного газа (CO).
  • SW-420 считывает данные о вибрациях.

Данные с датчиков непрерывно отображаются на дисплее LCD или OLED. При возникновении опасной ситуации включается звуковой сигнал для оповещения рабочих шахты.

Схема подключения компонентов системы оповещения для угольных шахт:

При необходимости модуль Wi-Fi (ESP8266/IoT) может непрерывно отправлять данные на сервер. Пользователь может просматривать данные на IoT-сервере из любой точки мира. Перед входом в шахту рабочие должны проверить данные на сервере. Также система отправляет push-уведомления на мобильное устройство в случае превышения пороговых значений.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>

// Настройка OLED-дисплея
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Пины для датчиков
#define DHTPIN A1
#define DHTTYPE DHT11
#define MQ2_PIN A0
#define VIBRATION_PIN A2
#define BUZZER_PIN 7

DHT dht(DHTPIN, DHTTYPE);

// Пороговые значения
const int TEMP_THRESHOLD = 50;         // Температура (°C)
const int HUMIDITY_THRESHOLD = 80;     // Влажность (%)
const int SMOKE_THRESHOLD = 300;       // Уровень дыма (аналог)
const int VIBRATION_THRESHOLD = 500;   // Вибрация (аналог)

unsigned long vibrationStartTime = 0;
const unsigned long MIN_VIBRATION_DURATION = 2000;

void setup() {
  Serial.begin(9600);
  dht.begin();

  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, HIGH); // Изначально зуммер выключен
  pinMode(VIBRATION_PIN, INPUT);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C — стандартный I2C-адрес
    Serial.println(F("Ошибка инициализации дисплея SSD1306"));
    for (;;);
  }

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 25);
  display.println("Earthquake Monitor");
  display.display();
  delay(2000);
  display.clearDisplay();
}

void activateBuzzer() {
  digitalWrite(BUZZER_PIN, LOW);
}

void deactivateBuzzer() {
  digitalWrite(BUZZER_PIN, HIGH);
}

void loop() {
  float temp = dht.readTemperature();
  float humidity = dht.readHumidity();
  int smoke = analogRead(MQ2_PIN);
  int vibration = analogRead(VIBRATION_PIN);

  bool earthquakeDetected = false;
  if (vibration >= VIBRATION_THRESHOLD) {
    if (vibrationStartTime == 0) {
      vibrationStartTime = millis();
    } else if (millis() - vibrationStartTime >= MIN_VIBRATION_DURATION) {
      earthquakeDetected = true;
    }
  } else {
    vibrationStartTime = 0;
  }

  bool alert = (temp >= TEMP_THRESHOLD || humidity >= HUMIDITY_THRESHOLD || 
                smoke >= SMOKE_THRESHOLD || earthquakeDetected);

  if (alert) {
    activateBuzzer();
  } else {
    deactivateBuzzer();
  }

  // Обновление дисплея
  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("Temp: "); display.print(temp); display.println(" C");
  display.print("Hum: "); display.print(humidity); display.println(" %");
  display.print("Smoke: "); display.println(smoke);
  display.print("Vib: "); display.println(vibration);
  display.print("Earthquake: ");
  display.println(earthquakeDetected ? "YES" : "NO");
  if (alert) {
    display.setCursor(90, 50);
    display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
    display.println("ALERT");
    display.setTextColor(SSD1306_WHITE);
  }
  display.display();

  // Вывод в Serial Monitor
  Serial.print("Temp: ");
  Serial.print(temp);
  Serial.print("C | Hum: ");
  Serial.print(humidity);
  Serial.print("% | Smoke: ");
  Serial.print(smoke);
  Serial.print(" | Vib: ");
  Serial.print(vibration);
  Serial.print(" | Earthquake: ");
  Serial.print(earthquakeDetected ? "YES" : "NO");
  Serial.print(" | Alert: ");
  Serial.println(alert ? "ACTIVE" : "INACTIVE");

  delay(500);
}