Arduino-based touchscreen controlled geiger counter

I saw a neat looking 3.2 inch LCD touchscreen shield (http://www.sainsmart.com/arduino-compatibles-1/lcd-module/sainsmart-3-2-tft-lcd-display-touch-panel-pcb-adapter-sd-slot-for-arduino-2560.html) for Arduino on ebay for about 30 euros. Turns out this even included the Arduino Mega board! So I thought why not build a geiger counter. Because that's a perfectly sensible thing to build.

And yeah I know, it's not the most amazing thing in the world. But it's a neat thing to have, and my major goal was a geiger counter for less than what you pay for on ebay and such. And with touchscreen control. Because I want touchscreen controls and gullwing doors on everything.

I decided to skip the entire tube thing and opted for a semiconductor sensor from http://www.radiation-watch.org

Radiation detector from radiation-watch.org

The radiation detector needs GND, +5V, and two signal lines, one for radiation pulses, one for vibration. An optional 3.5 mm 4-conductor TRRS phone connector is also fitted on the pcb. The NS pin stands for Noise, and outputs a pulse whenever physical vibration is detected. This is used to prevent falsified radiation measurements.

No components on the backside, safe for one mysterious wire.

The sensor sold by these guys is intended to be cheap and widely available, there's versions you can plug into your smartphone, and the software allows you to upload the radiation data to a website that builds a huge radation map. Judging from the area around Fukushima the folks in Japan can really use a cheap sensor...

My ambient radiation level is typically around 0.3uSv/h...

As for the wiring, that's really not worth writing home about. The piezo buzzer is connected to Pin 8 on the Arduino Mega, the radiation sensor output is connected to pin 20 and the noise output is on pin 10.

The super complex wiring ;)

For the user interface I used the UTouch library to access the touch controller, and modified the ITDB02 display library with additional font rendering functions for getting the rendered string pixel width etc.

I noticed that the Arduino library for the radiation sensor just used a loop to detect the incoming pulses. Because I spent considerable time drawing the histogram and handling user input, accuracy went down quite a bit. So I went ahead and changed the library to use a hardware IRQ instead. The noise pin is still being checked via a loop but I don't really care that much for it - after all it's only used to discard radiation pulses while vibration is messing with the sensor.

While I was at it, I made the interrupt handler also output a pulse on pin 8 for the piezo buzzer, to get that classic geiger counter clicking.

The user interface. +/- buttons zoom in/out of the histogram, UNIT button toggles the displayed measurement value between cpm and uSv/h

Display switched to cpm mode

The histogram can be zoomed out to display up to 25 minutes of history

So anyway, funny thing: Before I had an actual case for this, I kept it in a cardboard box. I took it with me to work, and when I brought it to a meeting room it went crazy. Not right away, mind you, it was slowly ramping up the clicks for about 10 minutes, then slowly died down again. Toggling power did not change the measurement. I have no idea what caused this.

Geiger counter going nuts in a meeting room

So yeah, a $100 Geiger counter with touchscreen control. It won't set the world on fire but I'm happy :)

The finished device



Want to build your own? I've put up the Software on GitHub.

GeigerCounter: https://github.com/Toumal/GeigerCounter

ITDB02 Graphics Library: https://github.com/Toumal/ITDB02_Graph16

Radiation Watch Library: https://github.com/Toumal/RadiationWatch