地震是一種不可預(yù)測(cè)的自然災(zāi)害,會(huì)對(duì)生命和財(cái)產(chǎn)造成損害。它突然發(fā)生,我們無(wú)法阻止它,但我們可以從中得到警報(bào)。在當(dāng)今時(shí)代,有許多技術(shù)可以用來(lái)檢測(cè)微小的震動(dòng)和敲擊,以便我們可以在地球發(fā)生一些重大振動(dòng)之前采取預(yù)防措施。在這里,我們使用加速度計(jì)ADXL335來(lái)檢測(cè)地震前的振動(dòng)。加速度計(jì)ADXL335對(duì)所有三個(gè)軸的振動(dòng)和振動(dòng)都非常敏感。在這里,我們正在 使用加速度計(jì)構(gòu)建一個(gè)基于Arduino的地震探測(cè)器 。
我們?cè)谶@里構(gòu)建這個(gè) 地震探測(cè)器作為PCB上的Arduino屏蔽, 還將使用處理在計(jì)算機(jī)上顯示振動(dòng)圖。
Arduino地震探測(cè)器盾牌所需的組件
加速度計(jì):
加速度計(jì)的引腳說(shuō)明:
- Vcc 5 伏電源應(yīng)在此引腳連接。
- X-OUT 此引腳在 x 方向上提供模擬輸出
- Y-OUT 此引腳在 y 方向上提供模擬輸出
- Z-OUT 該引腳在 z 方向上提供模擬輸出
- 接地
- ST 此引腳用于設(shè)置傳感器的靈敏度
工作說(shuō)明:
這個(gè)Arduino地震探測(cè)器的工作非常簡(jiǎn)單。正如我們之前提到的,我們已經(jīng)使用加速度計(jì)來(lái)檢測(cè)沿三個(gè)軸中的任何一個(gè)的地震振動(dòng),以便每當(dāng)振動(dòng)發(fā)生時(shí),加速度計(jì)都會(huì)感知振動(dòng)并將其轉(zhuǎn)換為等效的ADC值。然后,這些ADC值由Arduino讀取,并通過(guò)16x2 LCD顯示。我們還使用處理在圖形上顯示了這些值。通過(guò)在此處瀏覽我們的其他加速度計(jì)項(xiàng)目,了解有關(guān)加速度計(jì)的更多信息。
首先,我們需要通過(guò)在 Arduino 通電時(shí)采集周?chē)駝?dòng)的樣本來(lái) 校準(zhǔn)加速度計(jì) 。然后我們需要從實(shí)際讀數(shù)中減去這些樣本值以獲得真實(shí)讀數(shù)。需要進(jìn)行此校準(zhǔn),以便它不會(huì)顯示有關(guān)其正常周?chē)駝?dòng)的警報(bào)。找到真實(shí)讀數(shù)后,Arduino將這些值與預(yù)定義的最大值和最小值進(jìn)行比較。如果Arduino發(fā)現(xiàn)任何變化值大于或小于兩個(gè)方向(負(fù)和正)上任何軸的預(yù)定義值,則Arduino會(huì)觸發(fā)蜂鳴器并通過(guò)16x2 LCD顯示警報(bào)狀態(tài),并且LED也打開(kāi)。我們可以通過(guò)更改Arduino代碼中的預(yù)定義值來(lái)調(diào)整地震探測(cè)器的靈敏度。
電路說(shuō)明:
這個(gè)地震探測(cè)器Arduino Shield PCB的電路也很簡(jiǎn)單.在這個(gè)項(xiàng)目中,我們使用了Arduino來(lái)讀取加速度計(jì)的模擬電壓并將其轉(zhuǎn)換為數(shù)字值。Arduino還驅(qū)動(dòng)蜂鳴器,LED,16x2 LCD,并計(jì)算和比較值并采取適當(dāng)?shù)拇胧?。下一部分是加速度?jì),它檢測(cè)大地振動(dòng)并在 3 個(gè)軸(X、Y 和 Z)上產(chǎn)生模擬電壓。LCD用于顯示X,Y和Z軸的值變化,并在其上顯示警報(bào)消息。此LCD以4位模式連接到Arduino。RS、GND 和 EN 引腳直接連接到 Arduino 的 9、GND 和 8 個(gè)引腳,LCD 的其余 4 個(gè)數(shù)據(jù)引腳(即 D4、D5、D6 和 D7)直接連接到 Arduino 的數(shù)字引腳 7、6、5 和 4。蜂鳴器通過(guò) NPN BC547 晶體管連接到 Arduino 的引腳 12。10k電位器也用于控制LCD的亮度。
編程說(shuō)明:
在這個(gè)Arduino地震探測(cè)器項(xiàng)目中,我們制作了 兩個(gè)代碼 :一個(gè)用于Arduino檢測(cè)地震,另一個(gè)用于處理IDE,用于在計(jì)算機(jī)上繪制圖形上的地震振動(dòng)。我們將一一了解這兩個(gè)代碼:
Arduino 代碼 :
首先,我們根據(jù)加速度計(jì)的放置表面校準(zhǔn)加速度計(jì),使其不會(huì)顯示有關(guān)其正常周?chē)駝?dòng)的警報(bào)。在此校準(zhǔn)中,我們采集一些樣本,然后取平均值并存儲(chǔ)在變量中。
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 ");
現(xiàn)在,每當(dāng)加速度計(jì)獲取讀數(shù)時(shí),我們都會(huì)從讀數(shù)中減去這些樣本值,以便它可以忽略周?chē)恼駝?dòng)。
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將這些校準(zhǔn)(減去)值與預(yù)定義的限制進(jìn)行比較。并采取相應(yīng)的行動(dòng)。如果值高于預(yù)定義的值,則它將發(fā)出蜂鳴器嗶嗶聲并使用處理在計(jì)算機(jī)上繪制振動(dòng)圖。
/* 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;
}
處理代碼:
我們使用處理設(shè)計(jì)了一個(gè)用于地震振動(dòng)的圖表,其中我們定義了窗口的大小、單位、字體大小、背景、讀取和顯示串行端口、打開(kāi)選定的串行端口等。
// 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)
在下面的函數(shù)中,我們從串行端口接收數(shù)據(jù)并提取所需的數(shù)據(jù),然后將其映射到圖形的大小。
// 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 軸值的藍(lán)色、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
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/=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() { / displying change in x,y and z axis values over lcd / /* comparing change with predefined limits*/ else if(buz == 1) // buzzer flag activated then alerting earthquake { } / sending values to processing for plot over the graph / }xsample+=analogRead(x);
ysample+=analogRead(y);
zsample+=analogRead(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
lcd.setCursor(0,1);
lcd.print(zValue);
lcd.setCursor(6,1);
lcd.print(yValue);
lcd.setCursor(12,1);
lcd.print(zValue);
delay(100);
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
}
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
Serial.print("x=");
Serial.println(xValue);
Serial.print("y=");
Serial.println(yValue);
Serial.print("z=");
Serial.println(zValue);
Serial.println(" $");
-
探測(cè)器
+關(guān)注
關(guān)注
14文章
2656瀏覽量
73283 -
加速度計(jì)
+關(guān)注
關(guān)注
6文章
704瀏覽量
46048 -
Arduino
+關(guān)注
關(guān)注
188文章
6477瀏覽量
187958
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
MEMS加速度計(jì)性能成熟
2476-100加速度計(jì)
2460-010加速度計(jì)
2422H-400加速度計(jì)
2227-050加速度計(jì)模塊
1410L-100加速度計(jì)
1527J-010加速度計(jì)
1521L-200加速度計(jì)
設(shè)計(jì)具有成本效益的加速度計(jì)
選擇一個(gè)加速度計(jì)的技巧
![選擇<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>加速度計(jì)</b>的技巧](https://file.elecfans.com/web2/M00/49/C5/pYYBAGKhvFyAUT62AAANF7Zp6e0705.jpg)
MEMS加速度計(jì)的概念,MEMS加速度計(jì)的原理
使用Arduino和加速度計(jì)構(gòu)建一個(gè)簡(jiǎn)單且便宜的計(jì)步器
![使用<b class='flag-5'>Arduino</b>和<b class='flag-5'>加速度計(jì)</b><b class='flag-5'>構(gòu)建</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>簡(jiǎn)單且便宜的計(jì)步器](https://file.elecfans.com/web2/M00/62/DC/poYBAGL_ODKAef6aAAEZnm_R1Js761.png)
評(píng)論