地震是一种不可预测的自然灾害,会对生命和财产造成损害。它突然发生,我们无法阻止它,但我们可以从中得到警报。在当今时代,有许多技术可以用来检测微小的震动和敲击,以便我们可以在地球发生一些重大振动之前采取预防措施。在这里,我们使用加速度计ADXL335来检测地震前的振动。加速度计ADXL335对所有三个轴的振动和振动都非常敏感。在这里,我们正在 使用加速度计构建一个基于Arduino的地震探测器 。
我们在这里构建这个 地震探测器作为PCB上的Arduino屏蔽, 还将使用处理在计算机上显示振动图。
加速度计:
加速度计的引脚说明:
这个Arduino地震探测器的工作非常简单。正如我们之前提到的,我们已经使用加速度计来检测沿三个轴中的任何一个的地震振动,以便每当振动发生时,加速度计都会感知振动并将其转换为等效的ADC值。然后,这些ADC值由Arduino读取,并通过16x2 LCD显示。我们还使用处理在图形上显示了这些值。通过在此处浏览我们的其他加速度计项目,了解有关加速度计的更多信息。
首先,我们需要通过在 Arduino 通电时采集周围振动的样本来 校准加速度计 。然后我们需要从实际读数中减去这些样本值以获得真实读数。需要进行此校准,以便它不会显示有关其正常周围振动的警报。找到真实读数后,Arduino将这些值与预定义的最大值和最小值进行比较。如果Arduino发现任何变化值大于或小于两个方向(负和正)上任何轴的预定义值,则Arduino会触发蜂鸣器并通过16x2 LCD显示警报状态,并且LED也打开。我们可以通过更改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检测地震,另一个用于处理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
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(" $");
全部0条评论
快来发表一下你的评论吧 !