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

 

Сейсмодатчик на 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, акселерометр




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

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

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