0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用加速度计构建一个基于Arduino的地震探测器

科技观察员 来源:circuitdigest 作者:萨达姆 2023-01-25 15:57 次阅读

地震是一种不可预测的自然灾害,会对生命和财产造成损害。它突然发生,我们无法阻止它,但我们可以从中得到警报。在当今时代,有许多技术可以用来检测微小的震动和敲击,以便我们可以在地球发生一些重大振动之前采取预防措施。在这里,我们使用加速度计ADXL335来检测地震前的振动。加速度计ADXL335对所有三个轴的振动和振动都非常敏感。在这里,我们正在 使用加速度计构建一个基于Arduino的地震探测器

我们在这里构建这个 地震探测器作为PCB上的Arduino屏蔽, 还将使用处理在计算机上显示振动图。

Arduino地震探测器盾牌所需的组件

加速度计:

加速度计的引脚说明:

  1. Vcc 5 伏电源应在此引脚连接。
  2. X-OUT 此引脚在 x 方向上提供模拟输出
  3. Y-OUT 此引脚在 y 方向上提供模拟输出
  4. Z-OUT 该引脚在 z 方向上提供模拟输出
  5. 接地
  6. ST 此引脚用于设置传感器的灵敏度

加速度计加速度计-ADXL335

工作说明:

这个Arduino地震探测器的工作非常简单。正如我们之前提到的,我们已经使用加速度计来检测沿三个轴中的任何一个的地震振动,以便每当振动发生时,加速度计都会感知振动并将其转换为等效的ADC值。然后,这些ADC值由Arduino读取,并通过16x2 LCD显示。我们还使用处理在图形上显示了这些值。通过在此处浏览我们的其他加速度计项目,了解有关加速度计的更多信息

首先,我们需要通过在 Arduino 通电时采集周围振动的样本来 校准加速度计 。然后我们需要从实际读数中减去这些样本值以获得真实读数。需要进行此校准,以便它不会显示有关其正常周围振动的警报。找到真实读数后,Arduino将这些值与预定义的最大值和最小值进行比较。如果Arduino发现任何变化值大于或小于两个方向(负和正)上任何轴的预定义值,则Arduino会触发蜂鸣器并通过16x2 LCD显示警报状态,并且LED也打开。我们可以通过更改Arduino代码中的预定义值来调整地震探测器的灵敏度。

阿杜伊诺地震指示器工作框图

使用加速度计的地震指示器 arduino 盾牌

电路说明:

这个地震探测器Arduino Shield PCB的电路也很简单.在这个项目中,我们使用了Arduino来读取加速度计的模拟电压并将其转换为数字值。Arduino还驱动蜂鸣器,LED,16x2 LCD,并计算和比较值并采取适当的措施。下一部分是加速度计,它检测大地振动并在 3 个轴(X、Y 和 Z)上产生模拟电压。LCD用于显示X,Y和Z轴的值变化,并在其上显示警报消息。此LCD以4位模式连接到Arduino。RS、GND 和 EN 引脚直接连接到 Arduino 的 9、GND 和 8 个引脚,LCD 的其余 4 个数据引脚(即 D4、D5、D6 和 D7)直接连接到 Arduino 的数字引脚 7、6、5 和 4。蜂鸣器通过 NPN BC547 晶体管连接到 Arduino 的引脚 12。10k电位器也用于控制LCD的亮度。

使用加速度计的地震指示器 arduino 屏蔽电路图

编程说明:

在这个Arduino地震探测器项目中,我们制作了 两个代码 :一个用于Arduino检测地震,另一个用于处理IDE,用于在计算机上绘制图形上的地震振动。我们将一一了解这两个代码:

Arduino 代码

首先,我们根据加速度的放置表面校准加速度计,使其不会显示有关其正常周围振动的警报。在此校准中,我们采集一些样本,然后取平均值并存储在变量中。

for(int i=0;i
  {
    xsample+=analogRead(x);
    ysample+=analogRead(y);
    zsample+=analogRead(z);
  }

  xsample/=samples;   // taking avg for x
  ysample/=samples;   // taking avg for y
  zsample/=samples;   // taking avg for 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   ");

现在,每当加速度计获取读数时,我们都会从读数中减去这些样本值,以便它可以忽略周围的振动。

int value1=analogRead(x);   // reading x out
    int value2=analogRead(y);   //reading y out
    int value3=analogRead(z);   //reading z out

    int xValue=xsample-value1;    // finding change in x
    int yValue=ysample-value2;    // finding change in y
    int zValue=zsample-value3;    // finding change in z

  /*displying change in x,y and z axis values over lcd*/
    lcd.setCursor(0,1);
    lcd.print(zValue);
    lcd.setCursor(6,1);
    lcd.print(yValue);
    lcd.setCursor(12,1);
    lcd.print(zValue);
    delay(100)

然后Arduino将这些校准(减去)值与预定义的限制进行比较。并采取相应的行动。如果值高于预定义的值,则它将发出蜂鸣器哔哔声并使用处理在计算机上绘制振动图。

/* comparing change with predefined limits*/
    if(xValue < minVal || xValue > maxVal  || yValue < minVal || yValue > maxVal  || zValue < minVal || zValue > maxVal)
    { 
      if(buz == 0)
      start=millis();   // timer start
       buz=1;       // buzzer / led flag activated
    } 

   else if(buz == 1)        // buzzer flag activated then alerting earthquake
   {
      lcd.setCursor(0,0);
      lcd.print("Earthquake Alert   ");
      if(millis()>= start+buzTime)    
      buz=0;
   }

处理代码:

我们使用处理设计了一个用于地震振动的图表,其中我们定义了窗口的大小、单位、字体大小、背景、读取和显示串行端口、打开选定的串行端口等。

// set the window size:  and Font size
  f6 = createFont("Arial",6,true);
  f8 = createFont("Arial",8,true);
  f10 = createFont("Arial",10,true);
  f12 = createFont("Arial",12,true);
  f24 = createFont("Arial",24,true);
  size(1200, 700);        
 
 // List all the available serial ports
 println(Serial.list());
 myPort = new Serial(this, "COM43", 9600);
 println(myPort);
 myPort.bufferUntil('\\n');
 background(80)

在下面的函数中,我们从串行端口接收数据并提取所需的数据,然后将其映射到图形的大小。

// extracting all required values of all three axis:
 int l1=inString.indexOf("x=")+2;
 String temp1=inString.substring(l1,l1+3);
 l1=inString.indexOf("y=")+2;
 String temp2=inString.substring(l1,l1+3);
 l1=inString.indexOf("z=")+2;
 String temp3=inString.substring(l1,l1+3);
 
 //mapping x, y and z value with graph dimensions
 float inByte1 = float(temp1+(char)9); 
 inByte1 = map(inByte1, -80,80, 0, height-80);
 float inByte2 = float(temp2+(char)9); 
 inByte2 = map(inByte2,-80,80, 0, height-80);
 float inByte3 = float(temp3+(char)9); 
 inByte3 = map(inByte3,-80,80, 0, height-80);
 float x=map(xPos,0,1120,40,width-40);

在此之后,我们绘制了单位空间、最大和最小限制、x、y 和 z 轴的值。

//ploting graph window, unit 
  strokeWeight(2);
  stroke(175);                        
  Line(0,0,0,100);
  textFont(f24);       
  fill(0,00,255);
  textAlign(RIGHT);
  xmargin("EarthQuake Graph By Circuit Digest",200,100); 
  
   fill(100); 
   strokeWeight(100);
   line(1050,80,1200,80);
   .... ....
   ..........

在此之后,我们使用 3 种不同的颜色在图形上绘制值,例如 x 轴值的蓝色、y 轴的绿色和红色表示的 z。

stroke(0,0,255);         
   if(y1 == 0)
   y1=height-inByte1-shift;
   line(x, y1, x+2, height-inByte1-shift) ;
   y1=height-inByte1-shift;
   
   stroke(0,255,0);            
   if(y2 == 0)
   y2=height-inByte2-shift;
   line(x, y2, x+2, height-inByte2-shift) ;
   y2=height-inByte2-shift;
   
   stroke(255,0,0);             
   if(y2 == 0)
   y3=height-inByte3-shift;
   line(x, y3, x+2, height-inByte3-shift) ;
   y3=height-inByte3-shift;

#include // lcd Header

LiquidCrystal lcd(9,8,7,6,5,4); // pins for LCD Connection

#define buzzer 12 // buzzer pin

#define led 13 //led pin

#define x A0 // x_out pin of Accelerometer

#define y A1 // y_out pin of Accelerometer

#define z A2 // z_out pin of Accelerometer

/ variables /

int xsample=0;

int ysample=0;

int zsample=0;

long start;

int buz=0;

/ Macros /

#define samples 50

#define maxVal 20 // max change limit

#define minVal -20 // min change limit

#define buzTime 5000 // buzzer on time

void setup()

{

lcd.begin(16,2); //initializing lcd

Serial.begin(9600); // initializing serial

delay(1000);

lcd.print("EarthQuake ");

lcd.setCursor(0,1);

lcd.print("Detector ");

delay(2000);

lcd.clear();

lcd.print("Circuit Digest ");

lcd.setCursor(0,1);

lcd.print("Saddam Khan ");

delay(2000);

lcd.clear();

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

lcd.setCursor(0,1);

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

pinMode(buzzer, OUTPUT);

pinMode(led, OUTPUT);

buz=0;

digitalWrite(buzzer, buz);

digitalWrite(led, buz);

for(int i=0;i

{

xsample+=analogRead(x);

ysample+=analogRead(y);

zsample+=analogRead(z);

}

xsample/=samples; // taking avg for x

ysample/=samples; // taking avg for y

zsample/=samples; // taking avg for 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 ");

}

void loop()

{

int value1=analogRead(x);   // reading x out

int value2=analogRead(y);   //reading y out

int value3=analogRead(z);   //reading z out


int xValue=xsample-value1;    // finding change in x

int yValue=ysample-value2;    // finding change in y

int zValue=zsample-value3;    // finding change in z

/ displying change in x,y and z axis values over lcd /

lcd.setCursor(0,1);

lcd.print(zValue);

lcd.setCursor(6,1);

lcd.print(yValue);

lcd.setCursor(12,1);

lcd.print(zValue);

delay(100);

/* comparing change with predefined limits*/

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

{ 

  if(buz == 0)

  start=millis();   // timer start

   buz=1;       // buzzer / led flag activated

}

else if(buz == 1) // buzzer flag activated then alerting earthquake

{

lcd.setCursor(0,0);

  lcd.print("Earthquake Alert   ");

  if(millis()>= start+buzTime)    

  buz=0;

}

else

{

  lcd.clear();

  lcd.print(" X     Y     Z   ");

}


digitalWrite(buzzer, buz);    // buzzer on and off command

digitalWrite(led, buz);   // led on and off command

/ sending values to processing for plot over the graph /

Serial.print("x=");

Serial.println(xValue);

Serial.print("y=");

Serial.println(yValue);

Serial.print("z=");

Serial.println(zValue);  

Serial.println(" $");

}


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 探测器
    +关注

    关注

    14

    文章

    2501

    浏览量

    72403
  • 加速度计
    +关注

    关注

    6

    文章

    681

    浏览量

    45571
  • Arduino
    +关注

    关注

    186

    文章

    6446

    浏览量

    185474
收藏 人收藏

    评论

    相关推荐

    MEMS加速度计性能成熟

    结果。这表明,MEMS加速度计非常适合新型状态监测产品的重新构建输出通道,特别是可实现基于半导体元件的全新概念,这些概念可在单个+5 V电源上运行,例如无线智能传感。从表面上看,第
    发表于 10-29 17:11

    2476-100加速度计

    ,密封,低噪声的SDI 1522型表面安装加速度计,在气候室内分别进行了测试,编程,校准和验证以确保在热挥发条件下的最大精度。 2470和2476包含初始校准报告详细测试性能数据。板载稳压和内部
    发表于 05-27 19:18

    2460-010加速度计

    的噪声和长期稳定性是绝对要求。2460包含3英尺长的集成电缆,并且在操作上与2466相同,它具有连接,可轻松定制电缆的长度和位置。每个SDI三轴加速度计均具有三
    发表于 05-28 14:41

    2422H-400加速度计

    在零到中频应用中经历过大或快速的温度过高温度变化或长时间保持极端高温或低温。SDI 2422H型包含三正交安装的高级加速度计LCC,使它们对-55至+ 125°C的温度变化和梯度更加不敏感,并大大
    发表于 05-28 14:44

    2227-050加速度计模块

    获得专利的电容式硅感测元件和密封LCC封装的高精度,定制CMOS集成电路。差分输出MEMS加速度计的电压在PCB上转换为与施加的电流成比例的电流加速。可以为2227模块提供热校准参
    发表于 05-28 14:56

    1410L-100加速度计

    `1410型是款集成式加速度计,可用于零至中频仪器应用测量加速。每个微型密封包装结合了微机械电容感应元件和包括检测放大器和sigma-的定制集成电路Delta A / D转换。对温
    发表于 05-28 15:01

    1527J-010加速度计

    `1527型是款小型,轻巧的集成MEMS加速度计,用于用于要求高重复性,低重复性的战术级惯性应用噪声,以及在-55至+ 125°C的环境中的长期稳定性。 1527型加速度计是由美国SDI完全
    发表于 05-28 15:04

    1521L-200加速度计

    `1521型是款低成本通用集成MEMS加速度计,适用于零至中频需要极低噪声和可靠长期稳定性的工业应用。每个微型密封密封封装结合了MEMS电容式感应元件和包含感应的定制集成电路放大器和差分输出级
    发表于 05-28 15:08

    设计具有成本效益的加速度计

    等低成本 MEMS 加速度计稍贵(约 40 美元)。也许对于某些应用我们可以避免使用 ADXL355 并节省更多的钱;知道是否可行的唯方法是比较两传感。为了比较这两
    发表于 08-23 06:20

    文带你了解加速度计

    加速度计到底是什么?本文将对加速度计进行简单介绍。
    发表于 07-07 10:52 1.3w次阅读

    选择加速度计的技巧

    加速度计,是测量运载体线加速度的仪表。加速度计由检测质量(也称敏感质量)、支承、电位、弹簧、阻尼和壳体组成。
    发表于 09-17 11:46 10次下载
    选择<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>加速度计</b>的技巧

    MEMS加速度计的概念,MEMS加速度计的原理

    MEMS加速度计的概念 加速度计种惯性传感,能够测量物体的加速力。加速力就是当物体在
    发表于 06-01 11:28 4102次阅读

    加速度计的安装方法分享

    在本文中,了解安装加速度计的不同方法、它们对加速度计频率响应的影响以及安装MEMS加速度计的解决方案。
    的头像 发表于 04-16 16:35 4731次阅读
    <b class='flag-5'>加速度计</b>的安装方法分享

    使用Arduino加速度计构建简单且便宜的计步器

    在本教程中,我们将使用 Arduino加速度计构建简单且便宜的 DIY 计步器。该计步器将计算脚步的数量并将其显示在16x2 LCD
    的头像 发表于 08-19 15:15 4271次阅读
    使用<b class='flag-5'>Arduino</b>和<b class='flag-5'>加速度计</b><b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>简单且便宜的计步器

    mems加速度计的量程是指什么

    Mems加速度计(Micro Electro Mechanical Systems Accelerometer)是种微型化的加速度传感,可以测量物体在三
    的头像 发表于 12-15 10:21 933次阅读