цифровая электроника
вычислительная техника
встраиваемые системы

 

Сейсмодатчик на Arduino и ADXL335 своими руками

Автор: Mike(admin) от 27-11-2017, 20:05

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


Сейсмодатчик на Arduino и ADXL335 своими руками

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


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


Акселерометр ADXL335

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


Сейсмодатчик на Arduino и ADXL335 своими руками. Схема

Номиналы элементов схемы следующие: 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


Теги: Arduino, акселерометр



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


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий