I’ve been running a DIY seismometer station here in Tennessee for a while now, and it has turned into one of the most rewarding projects in the lab. What started as a curiosity about whether I could detect ground motion from my home has evolved into a fully networked seismic monitoring system with custom dashboards, spectral analysis, and even microseism detection. This page documents the full build.

The system consists of a DIY vertical geophone sensor, an Arduino running nerdaqII firmware, an ESP8266 WiFi bridge, a Raspberry Pi data logger, and a suite of custom Python dashboards. I’m located about 96 km from the IRIS WVT reference station (IU.WVT.00.BHZ), which gives me a useful benchmark for calibration.

The Sensor

The sensor is a DIY vertical geophone based on mircemk’s design. The core idea is elegantly simple: a small magnet on a spring suspended above a relay coil. When the ground moves, the coil (which is rigidly attached to the case) moves relative to the inertial mass (the magnet on its spring). By Faraday’s law, that relative motion induces a voltage in the coil proportional to velocity. It’s the same principle a professional geophone uses, just built from scrap parts for a few dollars.

DIY geophone sensor using relay coil and magnet
DIY geophone sensor using relay coil and magnet

The relay coil I used has a resistance of ~3Kohm, which gives decent sensitivity. The magnet is a small neodymium type from an old PC hard drive mounted on a lightweight spring. The whole assembly is housed in a PVC enclosure to remove air currents. It’s not going to match a professional sensor, but for a hobbyist build it performs remarkably well.

The Preamp Evolution

This is where the project got really interesting. The geophone coil produces tiny signals, on the order of microvolts. You need a lot of clean gain to bring that up to something an Arduino ADC can read, and the preamp design turned out to be the single biggest factor in system performance.

LM358: The Starting Point (and Why It Wasn’t Good Enough)

I started with a cheap LM358 op-amp module from Amazon. It worked, in the sense that it produced output, but the noise floor was terrible. The LM358 has an input noise around 40 nV/sqrt(Hz), which is loud for this application. My noise floor with the LM358 was around 2.7 counts RMS, and most of that was amplifier noise, not signal. I could see microseism peaks in the PSD, but they were sitting on top of a broad hump of amplifier hiss.

OP27: The Real Workhorse

The upgrade was a custom OP27 dual op-amp preamp built on a perfboard shield that plugs directly into the Arduino. The OP27 is a low-noise precision op-amp with 3 nV/sqrt(Hz) input noise, which is roughly 60x quieter than the LM358. That’s a massive difference. Here are the key design details:

  • Dual +/-12V supply (requires external split power supply)
  • Two-stage amplifier with ~10,000x total gain
  • AC coupling between stages to eliminate DC drift
  • 2.5V bias divider for single-supply ADC compatibility (the Arduino ADC reads 0-5V, so the signal sits at 2.5V midrail)
  • Offset null trim pots on both op-amps for zeroing
  • Noise floor: ~0.5 counts RMS (dominated by ADC quantization, not amplifier noise)
OP27 dual op-amp preamp on Arduino perfboard shield
OP27 dual op-amp preamp on Arduino perfboard shield
OP27 noise floor comparison: geophone overnight vs shorted input PSD
OP27 preamp noise floor: geophone overnight vs shorted input. The preamp contributes only ~0.5 counts RMS. Real microseism signals dominate easily.

OPA2350: The Rail-to-Rail Alternative

I also tested the OPA2350, a rail-to-rail CMOS op-amp that runs on a single 5V supply. The advantage here is simplicity: single 5V supply from the Arduino, no dual +/-12V supply needed. It has a max gain of about 10,201x in my configuration. The input noise is higher than the OP27 (about 5 nV/sqrt(Hz)), but still far better than the LM358. It’s a good option if you want to keep the build simple.

OPA2350 rail-to-rail op-amp alternative preamp
OPA2350 rail-to-rail op-amp alternative preamp

The schematic files for both preamp designs are available here: OP27 schematic, OPA2350 schematic.

nerdaqII Firmware

The Arduino runs nerdaqII, firmware originally written by Martin L. Smith in 2012 for the TC1 seismometer project. This is a brilliant piece of code that squeezes remarkable performance out of the Arduino’s modest ATmega328 ADC.

Here’s what it does under the hood:

  • Oversampling: The ADC free-runs at 9.6 kHz, and the firmware averages 2048 samples to produce each output sample. That’s 2048x oversampling, which buys about 3 extra bits of effective resolution, bringing the 10-bit ADC up to roughly 13-bit performance.
  • Three-stage digital filtering: First, a denoise FIR filter removes high-frequency noise. Second, a detrend IIR Butterworth high-pass removes DC drift. Third, an optional long-period boost stage amplifies low-frequency content.
  • Output: 18.78 samples per second, 16-bit unsigned integers sent over serial.

I run mode 3, which disables the long-period boost. The reason is simple: I want the response to be flat in the microseism band (3-20 second periods), and the boost stage distorts that. Mode 3 gives me a clean, honest response curve that I can compare against reference stations. I am able to remotely change the mode that the nerdaqII uses via the WeMos wifi microcontroller (see below) using a custom page that runs on the WeMos.

WiFi Bridge and Data Pipeline

One of the design goals was to make this a networked sensor, not something tethered to a PC by USB. The solution is an ESP8266 WeMos D1 R2 that sits between the Arduino and the network.

The WeMos reads serial data from the Arduino’s TX pin, batches 19 samples (one second’s worth), and POSTs them via WiFi to a Raspberry Pi logger on my network. The Pi runs a Flask API on port 8905 that accepts the sample batches and writes them to two destinations simultaneously: an InfluxDB time-series database for real-time querying, and flat CSV files for long-term archival. Dual write means I have both fast access and durable storage.

This is what makes the whole system work. The seismometer is in my garage, the Pi is in on my desk, and the dashboards run on my PC. Everything talks over the LAN. No USB cables, no physical proximity requirements. The sensor just streams data 24/7 and anything on the network can consume it.

WeMos WiFi bridge remote control interface
The WeMos WiFi bridge includes a web interface for remotely switching nerdaqII filter modes and adjusting the long-period boost level, no USB connection required.

AmaSeis Integration

In addition to my custom dashboards, the seismometer feeds AmaSeis, the seismology software written by Alan Jones. AmaSeis is the standard tool for amateur seismology, with professional-quality seismogram display, event extraction, and analysis tools.

The connection works through com0com, a virtual serial port driver for Windows. I set up a virtual COM port pair: one end receives data from the Pi logger (pulled over the network), and the other end is what AmaSeis reads. To AmaSeis, it looks like a real seismometer plugged into a serial port.

I also wrote an auto-backfill script that checks the Pi’s data archive and fills in any gaps in AmaSeis’s local record. If my PC reboots or AmaSeis crashes, the backfill script pulls the missing data from the Pi so the seismogram record stays complete. No gaps, no manual intervention.

Custom Helicorder Dashboard

The helicorder is the classic seismologist’s tool: a strip-chart that shows hours of seismic data stacked vertically, so you can see patterns and events at a glance. I built a custom helicorder-style dashboard using HTML5 Canvas, running on my PC.

Custom helicorder dashboard showing 24 hours of seismic data
Custom helicorder dashboard showing 24 hours of seismic data

Features:

  • Configurable time window from 1 to 48 hours
  • Click-to-zoom on any time range
  • USGS earthquake overlay that plots recent quakes with estimated P and S wave arrival times
  • Adjustable gain control for viewing different noise levels
  • Real-time updating, pulling fresh data from the Pi every few seconds

The earthquake overlay is particularly satisfying. When the USGS reports a nearby event, the dashboard draws lines at the expected P-wave and S-wave arrival times. If I see a wiggle at exactly the predicted P arrival, I know I’m looking at a real event, not noise.

Spectral Analysis

The spectral analysis page is a real-time FFT tool that shows both a spectrogram (time-frequency waterfall) and a power spectral density plot. It pulls live data from the Pi and updates continuously. The wispy lines around 0.67s on the spectrogram are from my deep freezer in the garage cycling on and off. I put the freezer on rubber pads to try to suppress the vibrations, but the seismometer is still detecting it.

Real-time spectral analysis page with spectrogram and PSD
Real-time spectral analysis page with spectrogram and PSD

Key features:

  • Configurable FFT window size
  • Stacking and octave smoothing for cleaner PSD estimates
  • Real-time spectrogram with configurable color scale

PSD Analysis and Microseism Detection

The stacked PSD CLI tool is where the science gets real. It fetches a configurable number of hours of data from the Pi, computes a power spectral density using the McNamara and Buland (2004) methodology, and produces publication-quality plots with the Peterson noise model overlay. The Peterson curves are the gold standard for seismometer noise evaluation. The New High Noise Model (NHNM) and New Low Noise Model (NLNM) define the range of ground noise you’d expect to see at a good station. If your sensor’s PSD sits between those curves, you’re doing well.

24-hour stacked PSD with Peterson NHNM/NLNM noise model overlay
24-hour stacked PSD with Peterson NHNM/NLNM noise model overlay

The results are genuinely exciting. I am solidly detecting both the primary microseism peak (around 15 second period, caused by direct wave action on the ocean floor) and the secondary microseism peak (around 6 second period, caused by wave-wave interactions near coastlines). Both peaks sit comfortably between the NLNM and NHNM curves, which means the sensor has enough sensitivity to resolve the global seismic background noise. That’s a hobbyist build detecting ocean wave energy from thousands of miles away.

Future: Earthquake Detection

The sensor should be capable of detecting M5+ teleseismic events (distant earthquakes) and M4+ regional events (within a few hundred kilometers). I have an empirical calibration tool in development that compares my data against the IRIS WVT reference station to derive a frequency-dependent sensitivity curve. WVT is about 96 km away, which is close enough that we see similar signals but far enough that the comparison is still meaningful.

As of this writing, I’m waiting for the first clearly detectable event. The Illinois M3.5 in June 2026 was close enough to potentially show up, and I’m watching the helicorder for P and S wave arrivals from anything M4+ in the New Madrid or Gulf Coast regions. When the first clear event arrives, it will validate the entire system end to end.

References and Credits

  • nerdaqII firmware: Martin L. Smith, 2012 (TC1 seismometer project). The digital signal processing backbone of this system.
  • DIY seismometer design: mircemk’s Arduino seismometer on Hackster.io. The relay coil and magnet sensor design is based on this project.
  • AmaSeis: Alan Jones’ seismology software, the standard for amateur seismology display and analysis.
  • com0com: Virtual serial port driver for Windows, making the network-to-AmaSeis bridge possible.
  • Peterson (1993): NHNM/NLNM noise models, the reference standard for seismometer noise evaluation.
  • McNamara & Buland (2004): PSD-PDF methodology for seismic noise analysis.
  • IRIS WVT: IU.WVT.00.BHZ reference station, used for calibration comparison.
  • OP27 preamp schematic: View full schematic
  • OPA2350 preamp schematic: View full schematic