Welcome to the Tweaking4All community forums!
When participating, please keep the Forum Rules in mind!
Topics for particular software or systems: Start your topic link with the name of the application or system.
For example “MacOS X – Your question“, or “MS Word – Your Tip or Trick“.
Please note that switching to another language when reading a post will not bring you to the same post, in Dutch, as there is no translation for that post!
Ad Blocking Detected
Please consider disabling your ad blocker for our website.
We rely on these ads to be able to run our website.
You can of course support us in other ways (see Support Us).
Need help arduino earthquake detector
Joined: 1 second ago
Posts: 0
Topic starter
July 9, 2022 1:44 AM
hello guys, i am doing this project to detect earthquake, when there is still movement after 5 seconds the arduino will activate the relay. My problem is the timer resets immediately when the sensor goes back to its original position so the 5 second timer does not end and it keeps resetting.
i used adxl 335 accelerometer sensor
here is my code:
#define buzzer 12 // buzzer pin
#define led 13 //led pin
#define relay 11 // relay 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;
unsigned long movementStarted;
unsigned long currentMillis;
unsigned long period = 5000;
/*Macros*/
#define samples 50
#define maxVal 4 // max change limit
#define minVal -4 // min change limit
bool moving = false;
void setup()
{
pinMode(buzzer, OUTPUT);
pinMode(led, OUTPUT);
pinMode(relay, OUTPUT);
for (int i = 0; i < samples; i++) // taking samples for calibration
{
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);
}
void loop()
{
currentMillis = millis();
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
// Check if there is currently movement.
if (xValue < minVal || xValue > maxVal || yValue < minVal || yValue > maxVal || zValue < minVal || zValue > maxVal)
{
if (moving == false) // Did we just started moving?
{
movementStarted = currentMillis; // Capture the time we started moving
tone(buzzer, 1000);
}
moving = true; // Flag that we are moving
if (currentMillis - movementStarted > period) // Check how long we have been moving for
{
digitalWrite(relay, HIGH);
}
}
else // Not moving.
{
moving = false; // Flag that we are not moving
noTone(buzzer);
// Turn relay OFF (active LOW)
}
}
(@hans)
Famed Member Admin
Joined: 10 years ago
Posts: 2507
July 10, 2022 6:08 AM
Hi vjcp,
I do not have an accelerometer available (or earthquakes for that matter 😋 ).
This is an interesting challenge for sure though.
One key problem would be this:
Say we detection motion at 0 seconds. And again at 1 second, 2 seconds, 4 seconds, and ... 6 seconds.
This could be seen as an earthquake detection, right? But when we strictly stick to 5 seconds it would not be seen as such.
Maybe we'd need to define clearer what is considered motion that indicates an earth quake.
For example:
X number of motion detection within 5 seconds?
Or at the most X seconds between two motion detections?
Note: I'd make a separate function for motion detection to make code more readable. Something like this (returns true or false):
bool motionDetected()
{
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
return (xValue < minVal || xValue > maxVal || yValue < minVal || yValue > maxVal || zValue < minVal || zValue > maxVal);
}
(@hans)
Famed Member Admin
Joined: 10 years ago
Posts: 2507
Ad Blocking Detected
Please consider disabling your ad blocker for our website.
We rely on these ads to be able to run our website.
You can of course support us in other ways (see Support Us).