УДК 004.41:62-79

Создание и принцип работы датчика обнаружения землетрясений на основе ARDUINO UNO

Калашников Василий Сергеевич - студент Московского государственного технического университета им. Н.Э. Баумана

Ткачева Елизавета Григорьевна - студент студент Московского государственного технического университета им. Н.Э. Баумана

Аннотация: В статье рассматривается один из способов создания и принципов работы простейшей сигнализации землетрясений для домашнего использования, созданную на базе Arduino UNO и высокочувствительного акселерометра ADXL335, реагирующего на вибрации.

Индикатор землетрясений на Arduino – это простой и доступный инструмент для предупреждения людей о возможном землетрясении. Он может быть создан с помощью простых компонентов и программы на платформе Arduino UNO. Индикатор землетрясений на Arduino имеет несколько преимуществ перед другими системами предупреждения о землетрясениях, включая низкую стоимость, простоту в использовании и гибкость. 

Ключевые слова: землетрясение, Arduino UNO, акселерометр ADXL335, индикатор землетрясений, пороговое значение вибрации, электрически стираемая программируемая память EEPROM.

В схеме (Рисунок 1) используется плата Arduino UNO, подключенная к модулю акселерометра ADXL335 и входам АЦП (A0 для оси X, A1 для оси Y и A2 для оси Z). Две кнопки (SW1 и SW2) с напряжением питания 5В подключены к контактам D2 и D3 прерывания Arduino UNO, которые соединены с землей через резисторы R1 и R3. Эти кнопки используются для повышения и понижения порога обнаружения вибрации. ЖК-дисплей 16 × 2 (LCD1602_I2C) подключен в 4-проводном режиме с включенной регулировкой контрастности и подсветкой на выводах Arduino.

Транзистор BC548 (Q1) подключен к выводу 5 Arduino для включения светодиода локальной сигнализации (LCD1602_I2C) и зуммера (BZ1). Контакты 13 и 14 служат для управления ЖК-дисплеем и линиями передачи данных. При подаче питания на устройство и его неподвижности текущее значение акселерометра считывается и сохраняется во внутреннем EEPROM Arduino UNO независимо от ориентации устройства.

1

Рисунок 1. Принципиальная схема датчика обнаружения землетрясений на Arduino

Поскольку АЦП 10-битный, в коде предусмотрен специальный заголовочный файл. Перед считыванием первых значений предусмотрена задержка в несколько секунд для проверки всех напряжений и стабильности системы; микроконтроллер Arduino считывает данные с акселерометра по всем трем осям и сохраняет их в EEPROM. Он также сохраняет в EEPROM пороговое значение по умолчанию ±10.

В режиме отображения система непрерывно считывает значение акселерометра и сравнивает его с предыдущим фиксированным значением акселерометра, сохраненным в EEPROM при инициализации. Если текущее значение отличается, т.е. сохраненное значение больше положительного порога или меньше отрицательного порога, то подается сигнал тревоги и реле отключается. Конструкция и кодирование поддерживают как положительные, так и отрицательные значения по всем трем осям.

Кнопки, подключенные к выводам D2 и D3 Arduino, выполняют роль прерывателей для увеличения или уменьшения порогового значения для настройки чувствительности. Пороговое значение от 30 до 90 хорошо подходит для землетрясений. Для обнаружения ударов и вибрации можно также использовать пороговое значение от 20 до 45.

Код программы в среде разработки Arduino

#include<Wire.h> // Библиотека ЖК-дисплея

#include<LiquidCrystal.h> // Библиотека ЖК-дисплея

#include<LiquidCrystal_I2C.h> // Библиотека ЖК-дисплея

LiquidCrystal_I2C lcd(0x27,16,2);

 

#define buzzer 13 // pin зуммера

#define led 5 // pin светодиода

 

#define x A3 // pin выхода x акселерометра

#define y A1 // pin выхода y акселерометра

#define z A0 // pin выхода z акселерометра

 

/*Переменные*/

int xsample=0;

int ysample=0;

int zsample=0;

long start;

int buz=0;

int var=0;

int maxVal=10; // максимальный порог обнаружения вибрации

int minVal=-10; // минимальный порог обнаружения вибрации

 

const int buttonPin = 2;

const int button1Pin = 3;

bool button_old = 1;

bool button1_old = 1;

 

/*Макро-функции*/

#define samples 50

#define buzTime 5000 // время звукового сигнала 

 

 void setup()

{

lcd.init();

lcd.backlight(); 

lcd.begin(16,2); // инициализация ЖК-дисплея

Serial.begin(9600); // инициализирующая последовательность

delay(1000);

lcd.print("EarthQuake ");

lcd.setCursor(0,1);

lcd.print("Detector ");

delay(2000);

lcd.clear();

lcd.print("Calibrating.....");

lcd.setCursor(0,1);

lcd.print("Please wait...");

pinMode(buzzer,OUTPUT);

pinMode(led, OUTPUT);

pinMode(buttonPin, INPUT_PULLUP);

pinMode(button1Pin, INPUT_PULLUP);

buz=0;

digitalWrite(buzzer, buz);

digitalWrite(led, buz);

for(int i=0;i<samples;i++) // отбор проб для калибровки

{

xsample+=analogRead(x);

ysample+=analogRead(y);

zsample+=analogRead(z);

}

 

xsample/=samples; // среднее значение x

ysample/=samples; // среднее значение y

zsample/=samples; // среднее значение z

 

delay(3000);

lcd.clear();

lcd.print("Calibrated");

delay(1000);

lcd.clear();

lcd.print("Device Ready");

delay(1000);

lcd.clear();

lcd.print("X   Y   Z  H:");

lcd.setCursor(11,1);

lcd.print("L:");

lcd.print(minVal+10);

lcd.print(maxVal+10);

}

 

void loop()

{

int value1=analogRead(x); // считывание с выхода x

int value2=analogRead(y); // считывание с выхода y

int value3=analogRead(z); // считывание с выхода z

 

int xValue=xsample-value1; // обнаружение изменений в x

int yValue=ysample-value2; // обнаружение изменений в x

int zValue=zsample-value3; // обнаружение изменений в x

 

/*отображение изменений значений по осям x, y и z на ЖК-дисплее*/

lcd.setCursor(0,1);

lcd.print(xValue);

lcd.setCursor(4,1);

lcd.print(yValue);

lcd.setCursor(8,1);

lcd.print(zValue);

lcd.setCursor(14,0);

lcd.print(maxVal);

lcd.setCursor(13,1);

lcd.print(minVal);

delay(1000);

 

/*отправка значений в обработку для построения поверх графика*/

Serial.print("x=");

Serial.println(xValue);

Serial.print("y=");

Serial.println(yValue);

Serial.print("z=");

Serial.println(zValue);

Serial.println(" $");

 

/*реализация увеличения и уменьшения порога обнаружения вибрации с

помощью кнопок*/

bool button = digitalRead(buttonPin);

if (!button && button_old) {

button_old = 0;

maxVal = maxVal + 10;

if (maxVal >= 90) maxVal = 20;

}

if (button && !button_old) {

button_old = 1;

}

bool button1 = digitalRead(button1Pin);

if (!button1 && button1_old) {

button1_old = 0;

minVal = minVal - 10;

if (minVal <= -90) minVal = -20;

}

if (button1 && !button1_old) {

button1_old = 1;

}

 

/*сравнение изменений с заранее установленными пределами*/

if(xValue < minVal  xValue > maxVal  yValue < minVal  yValue > maxVal  zValue <

minVal || zValue > maxVal)

{

if(buz == 0)

start=millis(); // старт таймера

buz=1; // активация флага зуммера/светодиода

}

 

else if(buz == 1) // активация флага зуммера, предупреждающего о землетрясении

{

lcd.setCursor(0,0);

lcd.print("Earthquake Alert ");

delay(3000);

lcd.print("X   Y   Z  H:");

lcd.clear();

delay(500);

lcd.setCursor(11,1);

lcd.print("L:");

lcd.clear();

delay(1000);

lcd.print(minVal);

lcd.clear();

delay(1000);

lcd.print(maxVal);

lcd.clear();

delay(1000);

if(millis()>= start+buzTime)

buz=0;

}

 

else

{

lcd.clear();

lcd.print("X   Y   Z  H:");

lcd.setCursor(11,1);

lcd.print("L:");

lcd.print(minVal);

lcd.print(maxVal);

}

 

digitalWrite(buzzer,buz); // команда включения и выключения зуммера

digitalWrite(led, buz); // команда включения и выключения светодиода

}

2

Рисунок 2. Датчик обнаружения землетрясений на Arduino UNO

Устройство (Рисунок 2) может быть подключено и помещено в жесткий корпус и может быть установлено в любом месте на предприятии или в доме. Пользователь также может рассчитать полученное ускорение, используя уравнение с квадратным корнем X2 + Y2 + Z2 (где X, Y и Z - выходные данные ADXL335), а затем сравнить его с пороговым значением для подачи сигнала тревоги. При необходимости пользователь может вносить изменения на той же платформе.

Список литературы

  1. ARDUINO Быстрый старт. Первые шаги по освоению ARDUINO // Макскит, Москва, 2015. C. 39-42.
  2. Ященко В.C. От Arduino до Omega: платформы для мейкеров шаг за шагом // БХВ-Петербург, Санкт-Петербург, 2018. С. 81.
  3. МГС Измерение общей вибрации и оценка ее воздействия на человека // Стандартинформ, Москва, 2008. С. 7.
  4. Петрухин В.В., Петрухин С.В. Основы вибродиагностики и средства измерения вибрации // Инфра-Инженерия, Москва, 2010. С. 45-79.
  5. Калинкина М.Е., Пирожникова О.И., Ткалич В.Л., Комарова А.В. Микроэлектрические системы и датчики // Университет ИТМО, Санкт-Петербург, 2020. С. 23-25.
Интересная статья? Поделись ей с другими: