Иногда говорят: «Профилактика лучше лечения». Это утверждение отлично подходит для событий, вероятность которых довольно высока. Землетрясение, особенно в некоторых сейсмоопасных районах земного шара, является одним из таких бедствий, которое приходит как злая судьба и сметает драгоценные человеческие жизни и инфраструктуру, это непредсказуемое разрушительное явление, но по крайней мере мы можем принять меры для сведения к минимуму неблагоприятного воздействия его последствий. При этом новейшие технологии играют жизненно важную роль.

В данном материале представлен проект устройства мониторинга сейсмоактивности, которое может сообщить о землетрясении за некоторое время до его начала. Для достижения наших целей используются плата Arduino и высокочувствительный акселерометр ADXL335.
Акселерометр ADXL335 в данном случае работает как датчик для обнаружения вибраций и позволяет прогнозировать появление землетрясения. Устройство способно регистрировать вибрации по трем осям пространства (X, Y и Z), что делает его более чувствительным. ADXL335 генерирует аналоговое напряжение, эквивалентное ускорению, налагаемому на него вибрацией. Выводы осей X, Y и Z подключены к контактам АЦП платы Arduino Uno.

В Arduino Uno сравниваются уровни напряжения. В случаях землетрясения, когда движение породы является чрезмерным, регистрируются достаточно большие сигналы, и Arduino активирует оповестительные и превентивные действия. Во-первых, начинает светиться светодиод, и звучать пьезозуммер, чтобы предупредить окружающих людей, а также активируется реле. Реле нужно для подключения более мощной нагрузки, например, динамиков или сирен, поскольку светодиод и зуммер подойдут только для домашнего применения. Для информативности также используется LCD-дисплей. Схема подключения для реализации сейсмографа на Arduino показана ниже.

Номиналы элементов схемы следующие: R1, R2 = 10 КОм; R3, R6 = 1 КОм; R4, R5 = 330 Ом; VR1 = 10 КОм. Транзисторы T1 и T2 являются биполярными NPN-транзисторами марки BC548.
Далее приведен код (скетч) Arduino для функционирования устройства мониторинга сейсмоактивности. Следует отметить, что в данном случае микроконтроллер платы Arduino, принимает показания акселерометра с АЦП, а затем сохраняет их в EEPROM. Пороговое значение считывания также сохраняется в том же месте, то есть в EEPROM, что облегчает выборку данных для сравнения. В этом примере пороговое значение по умолчанию установлено равным 25.
#include <EEPROM.h>
#include "EEPROMAnything.h"
#include <LiquidCrystal.h>
const int alarmPin = 5;
const int relayPin = 10;
int Xacc, Yacc, Zacc, threshold = 0, thresholdSET = 25;
long debouncing_time = 15; // время компенсации дребезга в миллисекундах
volatile unsigned long last_micros;
LiquidCrystal lcd(12, 11, 9, 8, 7, 6);
struct sensorValue
{
int X;
int Y;
int Z;
};
sensorValue acceleration;
void debounceInterrupt_Increment()
{
if ((long)(micros() - last_micros) >= debouncing_time * 1000) {
IncrementThreshold();
last_micros = micros();
}
}
void debounceInterrupt_Decrement()
{
if ((long)(micros() - last_micros) >= debouncing_time * 1000) {
DecrementThreshold();
last_micros = micros();
}
}
void IncrementThreshold() {
thresholdSET = EEPROM.read(500);
thresholdSET++;
EEPROM.write(500, thresholdSET);
}
void DecrementThreshold() {
thresholdSET = EEPROM.read(500);
thresholdSET--;
EEPROM.write(500, thresholdSET);
}
void setup() {
lcd.begin(16, 2);
attachInterrupt(0, debounceInterrupt_Increment, RISING);
attachInterrupt(1, debounceInterrupt_Decrement, RISING);
pinMode(alarmPin, OUTPUT);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, HIGH);
EEPROM.write(500, thresholdSET);
digitalWrite(alarmPin, LOW);
lcd.setCursor(0, 0);
lcd.print("Initializing....");
delay(5000);
sensorValue acceleration = { analogRead(A0) , analogRead(A1) , analogRead(A2) };
EEPROM_writeAnything(0, acceleration);
EEPROM_readAnything(0, acceleration);
lcd.clear();
}
void loop() {
EEPROM_readAnything(0, acceleration);
threshold = EEPROM.read(500);
lcd.setCursor(0, 0);
lcd.print("Monitoring Mode");
lcd.setCursor(0,1);
lcd.print("Threshold = ");
lcd.print(threshold);
Xacc = analogRead(A0);
Yacc = analogRead(A1);
Zacc = analogRead(A2);
if ((Xacc >= (acceleration.X + threshold)) || (Xacc <= (acceleration.X - threshold))||(Yacc >= (acceleration.Y + threshold)) || (Yacc <= (acceleration.Y - threshold))||(Zacc >= (acceleration.Z + threshold)) || (Zacc <= (acceleration.Z - threshold))) {
digitalWrite(relayPin, LOW);
digitalWrite(alarmPin, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ALARM !!!!!");
lcd.setCursor(0,1);
lcd.print("PLEASE EVACUATE");
delay(5000);
digitalWrite(relayPin, HIGH);
digitalWrite(alarmPin, LOW);
lcd.clear();
}
}
Файл EEPROMAnything.h:
#include <EEPROM.h>
#include <Arduino.h> // для определений типов
template <class T> int EEPROM_writeAnything(int ee, const T& value)
{
const byte* p = (const byte*)(const void*)&value;
unsigned int i;
for (i = 0; i < sizeof(value); i++)
EEPROM.write(ee++, *p++);
return i;
}
template <class T> int EEPROM_readAnything(int ee, T& value)
{
byte* p = (byte*)(void*)&value;
unsigned int i;
for (i = 0; i < sizeof(value); i++)
*p++ = EEPROM.read(ee++);
return i;
}
© digitrode.ru