Lehman Seismograph

This project turned out to be very simple compared with my last project(Ultrasonic
Anemometer). There is plenty of detailed information on the web.

I was very interested in:


However I decided to keep it simple and go with:


I followed the mechanical design very closely:

I used the basic LED LDR circuit described at the above site.
His project uses a PC as a continuous logger of the data.
I did not want to allocate a PC for this job.
I used a Arduino 2009 with a SD card as the logger.

I use my library function SDCARDFILES.
This creates text files and appends data to an open file 512 bytes at a time.

#include <SDCARDFILES.h>

unsigned long now = 0; //the timekeeper
unsigned char buffer[512] ; // this 512 bytes read from or written to sd card
unsigned int bp = 0; //bufferpointer
unsigned long filesectors = 0; //record of number of sectors in file
const unsigned long maxsectors = 4236; //maximun number of sectors per file(12hrs)

void setup()
pinMode(2, OUTPUT); //error indicator
digitalWrite(2, LOW); // set the LED off
pinMode(3, OUTPUT); //busy indicator
digitalWrite(3, LOW); // set the LED off
int error = SDCARDFILES.createfile();
if (error !=0)
digitalWrite(2, HIGH); // set the LED on for error
}//end of setup

void loop()
while (millis() - now < 100)
; //do nothing until 125 ms has passed
now += 100; //update time keeper
unsigned int sensor = analogRead(A0);
buffer[bp++] = ((sensor)/1000)%10 + 48; //msb to ascii
buffer[bp++] = ((sensor)/100)%10 + 48; //next to ascii
buffer[bp++] = ((sensor)/10)%10 + 48; //next to ascii
buffer[bp++] = (sensor)%10 + 48; //lsb to ascii
buffer[bp++] = 32; //followed by a space
if(bp == 510)
digitalWrite(3, HIGH); // set the LED on for busy
buffer[bp++] = 13; //followed by a CR
buffer[bp] = 10; //followed by a LF
int error = SDCARDFILES.fileappend(); //append one sector to created file
if (error !=0)
digitalWrite(2, HIGH); // set the LED on for error
bp = 0; //reset buffer
if(++filesectors >= maxsectors) //have we filled up one file
int error = SDCARDFILES.createfile(); //move on to the next file
if (error !=0)
digitalWrite(2, HIGH); // set the LED on for error
filesectors = 0; //reset the sector counter
}//end of we have filled up one file
}//end of used buffer 102 samples
digitalWrite(3, LOW); // set the LED on for not busy
}//end of loop

The time that the arduino is reset is noted and used as the time reference.
When the SD card is removed the files are copied to a folder “seismic” on a PC.
This is accessed by a VB program which displays the data:

Simulated plot of an earthquake by a gentle puff of air from 2 meters.
The times are all relative to the start time.

For all the construction details download seismograph_project.zip from:


Very cool. How sensitive is it? Can it also detect trains, cars, or people?

Yes it is very sensitive to extraneous noise.

Also it will have to be in an enclosed box as any air movement will set it off.

I did not have it running during the recent big one in Japan.

I now have it logging data and I expect that it will detect magnitude 6 and above any where in the world on the line I have set.

I'm on the east coast of Australia and the detector is most sensitive on a line China to New Zealand.

To get full world coverage it is necessary to have two detectors at right angles.

On our news this morning a magnitude 6.8 on the Burma Thailand border at 8 pm their time.

I checked my data and found:

The onset of the quake sent the detector to full scale.

I checked:


I found the quake:

M7.0 Myanmar.

UTC time: 24 March 13:55

They have not published their seismograph data yet.

Its nice to see that this design works as advertised.

Really nice work Carl.

Thanks novice.

I was really pleased to see a bunch of wood,bolts and nuts(it looks quite odd to me) actually detect an eartquake.