Arduino DIY Geiger Counter

5,236

49

14

About: I am a photographer, a tinker, an electronics technology engineer, and author; I write short stories and poetry for the love of writing. I started writing poetry in high school over thirty years ago where I ...

So you have ordered a DIY Geiger counter and you want to connect it to your Arduino. You go on line and try to duplicate how others have connected their Geiger counter to Arduino only to find something is wrong. Although your Geiger counter seems to work nothing works as described in the DIY you are following when you connect your Geiger counter to your Arduino.

In this Instructable I will be covering how to troubleshoot some of these glitches.

Remember; assemble and code Arduino one step at a time, if you go straight to a finished project and there is a missed wire or line of code it could take you forever to find the problem.

Step 1: Tools and Parts

Prototype box I used a Ferrero Rocher candy box.

Small breadboard

16x2 LCD

Arduino board ether a UNO or Nano

220 Ω resistor

Pot 10 kΩ adjustable resistor.

DIY Geiger Counter Kit

Jumper Wires

Battery connector or harness

Oscilloscope

Fine Nose Pliers

Small Standard Screwdriver

Step 2: Assemble Your Geiger Counter

Any damage to your Geiger Tube; and your Geiger counter won’t work, so use the protective acrylic cover to prevent damage to your Geiger tube.

This Instructable is on how I repaired the same Geiger counter with a broken Geiger tube and fitted the protective acrylic cover to prevent breakage in the future.

https://www.instructables.com/id/Repairing-a-DIY-G...

Step 3: Electrically Testing the Geiger Counter

First use the right voltage for the power supply; the USB cord supplies 5 volts DC right from your computer, however the 3 AA battery holder is for 1.5 volt alkaline batteries making a total voltage of 4.5 volts. If you use 1.2 volt rechargeable NI-Cd or NI-MH batteries you will need a 4 AA battery holder for a total voltage of 4.8 volts. If you use less than 4.5 volts the Geiger counter may not act as it should.

There is very little circuitry on the Geiger counters output; so as long as the speaker makes a ticking sound, and the LED blinks, you should get a signal on the VIN pin.

To be sure of the output signal; connect an oscilloscope to the output by connecting the positive side of the oscilloscope probe to the VIN and the negative side of the oscilloscope probe to the ground.

Rather than just waiting on background radiation to trigger the Geiger counter I used americium-241 from a smoke detectors ion chamber to increase the Geiger counters reactions. The output of the Geiger counter started at +3 volts and dropped to 0 volts every time the Geiger tube reacted to the alpha particles and returning to +3 volts a moment later. This is the signal you will be recording with Arduino.

Step 4: Wiring

There are two ways you can connect the Geiger counter to you Arduino and your computer.

Connect the GND on Arduino to the GND on the Geiger counter.

Connect the 5V on Arduino to the 5V on the Geiger counter.

Connect the VIN on the Geiger counter to the D2 on Arduino.

With independent power connected to the Geiger counter.

Connect the GND on Arduino to the GND on the Geiger counter.

Connect the VIN on the Geiger counter to the D2 on Arduino.

Connect Arduino to your computer.

Step 5: Code

Open Arduino IDE and load the code.

// This Sketch counts the number of pulses a minute.

// Connect the GND on Arduino to the GND on the Geiger counter.

// Connect the 5V on Arduino to the 5V on the Geiger counter.

// Connect the VIN on the Geiger counter to the D2 on Arduino.

unsigned long counts; //variable for GM Tube events

unsigned long previousMillis; //variable for measuring time

void impulse() { // dipanggil setiap ada sinyal FALLING di pin 2

counts++;

}

#define LOG_PERIOD 60000 // count rate

void setup() { //setup

counts = 0;

Serial.begin(9600);

pinMode(2, INPUT);

attachInterrupt(digitalPinToInterrupt(2), impulse, FALLING); //define external interrupts

Serial.println("Start counter");

}

void loop() { //main cycle

unsigned long currentMillis = millis();

if (currentMillis - previousMillis > LOG_PERIOD) {

previousMillis = currentMillis;

Serial.println(counts);

counts = 0;

}

}

In Tools select the Arduino or other board you are using.

In Tools select the Port and Com

Upload the code.

Once the code is uploaded in Tools select Serial Monitor and watch your Geiger counter work.

Look for glitches. The only thing about this code is it is a bit tedious you must wait 1 minute for every count.

Step 6: Serial.println Vs Serial.print

This is one of the first glitches I found in the code; so watch for it in your code, “Serial.println(cpm);” and “Serial.print(cpm);”.

Serial.println(cpm); will print each count on its own line.

Serial.print(cpm); will look like one big number printing each count on the same line making it impossible to tell what the count is.

Step 7: J305 Background Radiation Measurement

First is the measurement of background radiation, the natural radiation that already exists naturally. The listed number is the CPM (count per minute), which is a total of measured radioactive particles every minute.

The J305 background average count was 15.6 CPM.

Step 8: J305 Measurement of Smoke Sensor Radiation

It is not uncommon for a Geiger counter to give you the same count repeatedly so check it with a radiation source. I used the radiation measurement from Americium an ion chamber from a smoke detector. The smoke sensor utilizes Americium as a source of alpha particles that ionize smoke particles in the air. I removed the metal cap on the sensor so the alpha and beta particles can get to the Geiger tube along with the gamma particles.

If everything is all right the counts should change.

Americium-241 from a smoke detectors ion chamber average count was 519 CPM.

Step 9: SBM-20

This Arduino sketch is modified version written by Alex Boguslavsky.

This Sketch counts the number of pulses in 15 seconds and converts it to counts per minute making it less tedious.

Code I added “Serial.println("Start counter");”.

Code I changed; “Serial.print(cpm);” to “Serial.println(cpm);”.

“#define LOG_PERIOD 15000”; sets the count time to 15 seconds, I changed it to “#define LOG_PERIOD 5000” or 5 seconds. I found no appreciable difference in the average between counting for 1 minute, or 15 seconds and 5 seconds.

#include

#define LOG_PERIOD 15000 //Logging period in milliseconds, recommended value 15000-60000.

#define MAX_PERIOD 60000 //Maximum logging period without modifying this sketch

unsigned long counts; //variable for GM Tube events

unsigned long cpm; //variable for CPM

unsigned int multiplier; //variable for calculation CPM in this sketch

unsigned long previousMillis; //variable for time measurement

void tube_impulse(){ //subprocedure for capturing events from Geiger Kit

counts++;

}

void setup(){ //setup subprocedure

counts = 0;

cpm = 0;

multiplier = MAX_PERIOD / LOG_PERIOD; //calculating multiplier, depend on your log period

Serial.begin(9600);

attachInterrupt(0, tube_impulse, FALLING); //define external interrupts

Serial.println("Start counter"); // code I added

}

void loop(){ //main cycle

unsigned long currentMillis = millis();

if(currentMillis - previousMillis > LOG_PERIOD){

previousMillis = currentMillis;

cpm = counts * multiplier;

Serial.println(cpm); // code I changed

counts = 0;

}

}

The SBM-20 background average count was 23.4 CPM.

Step 10: Wiring the Geiger Counter With an LCD

LCD Connection:

LCD K pin to GND

LCD A pin to 220 Ω resistor to Vcc

LCD D7 pin to digital pin 3

LCD D6 pin to digital pin 5

LCD D5 pin to digital pin 6

LCD D4 pin to digital pin 7

LCD Enable pin to digital pin 8

LCD R/W pin to ground

LCD RS pin to digital pin 9

LCD VO pin to adjust of 10 kΩ pot

LCD Vcc pin to Vcc

LCD Vdd pin to GND

Pot 10 kΩ adjustable resistor.

Vcc, Vo, Vdd

Geiger Counter

VIN to digital pin 2

5 V to +5V

GND to ground

Step 11: Geiger Counter With LCD

// include the library code:

#include

#include

#define LOG_PERIOD 15000 //Logging period in milliseconds, recommended value 15000-60000.

#define MAX_PERIOD 60000 //Maximum logging period without modifying this sketch

#define PERIOD 60000.0 // (60 sec) one minute measure period

volatile unsigned long CNT; // variable for counting interrupts from dosimeter

unsigned long counts; //variable for GM Tube events

unsigned long cpm; //variable for CPM

unsigned int multiplier; //variable for calculation CPM in this sketch

unsigned long previousMillis; //variable for time measurement

unsigned long dispPeriod; // variable for measuring time

unsigned long CPM; // variable for measuring CPM

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(9, 8, 7, 6, 5, 3);

void setup() { // setup

lcd.begin(16, 2);

CNT = 0;

CPM = 0;

dispPeriod = 0;

lcd.setCursor(0,0);

lcd.print(" RH Electronics ");

lcd.setCursor(0,1);

lcd.print(" Geiger Counter ");

delay(2000);

cleanDisplay();

attachInterrupt(0,GetEvent,FALLING); // Event on pin 2

}

void loop() {

lcd.setCursor(0,0); // print text and CNT on the LCD

lcd.print("CPM:");

lcd.setCursor(0,1);

lcd.print("CNT:");

lcd.setCursor(5,1);

lcd.print(CNT);

if (millis() >=dispPeriod + PERIOD) { // If one minute is over

cleanDisplay(); // Clear LCD

// Do something about accumulated CNT events....

lcd.setCursor(5, 0);

CPM = CNT;

lcd.print(CPM); //Display CPM

CNT = 0;

dispPeriod = millis();

}

}

void GetEvent(){ // Get Event from Device

CNT++;

}

void cleanDisplay (){ // Clear LCD routine

lcd.clear();

lcd.setCursor(0,0);

lcd.setCursor(0,0);

}

Step 12: Files

Download and install these files to your Arduino.

Place each .ino file in a folder by the same name.

Share

    Recommendations

    • Frozen Treats Challenge

      Frozen Treats Challenge
    • Pets Challenge

      Pets Challenge
    • Sensors Contest

      Sensors Contest

    14 Discussions

    0
    None
    SHOE0007

    23 days ago

    Hmm, so with an LCD oscilloscope these can measure up to 60,000 counts per minute. That pretty darn impressive my 150 dollars one can read up to 65,000 max of beta, gamma and x ray radiation. Always wanted to do something like this.

    1 reply
    0
    None
    Josehf MurchisonSHOE0007

    Reply 22 days ago

    When I got the kit the glass GM tube was broken so I bought a couple different GM tubes from Russia. It was a bit of a challenge translating the datasheets to English. The rest of the Giger counter is just a high voltage source and a clicker. There is a noticeable difference between them on the same circuit board so you will need to customize the programming to the tubes sensitivity.

    0
    None
    StephanM13

    Question 3 months ago on Step 12

    I am trying to do this project with a Hazzah ESP8266 running this sketch
    #define LOG_PERIOD 15000 //Logging period in milliseconds, recommended value 15000-60000.
    #define MAX_PERIOD 60000 //Maximum logging period without modifying this sketch
    unsigned long counts; //variable for GM Tube events
    unsigned long cpm; //variable for CPM
    unsigned int multiplier; //variable for calculation CPM in this sketch
    unsigned long previousMillis; //variable for time measurement
    void tube_impulse(){ //subprocedure for capturing events from Geiger Kit
    counts++;
    }
    void setup(){ //setup subprocedure
    counts = 0;
    cpm = 0;
    multiplier = MAX_PERIOD / LOG_PERIOD; //calculating multiplier, depend on your log period
    Serial.begin(9600);
    attachInterrupt(0, tube_impulse, FALLING); //define external interrupts
    Serial.println("Start counter"); // code I added
    }
    void loop(){ //main cycle
    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > LOG_PERIOD){
    previousMillis = currentMillis;
    cpm = counts * multiplier;
    Serial.println(cpm); // code I changed
    counts = 0;
    }
    }

    All I get is a count of Zero,
    I've tried Vin and (Ground as BigClive says its marked wrong). I have it plugged in to pin 2 on the Hazzah, also known as 11, IO2, 2. I do only have 1 wire connect from the Gieger to the Hazzah as they are both running on external power. Any help would be great.

    7 answers
    1
    None
    Josehf MurchisonStephanM13

    Answer 3 months ago

    Is it the same geiger counter?
    The wiring might be different if it is not the exact same, can you send a pic or a link to where you bought it?
    Did you try My code from step 5?

    0
    None
    StephanM13StephanM13

    Reply 3 months ago

    I finally have been able to get it to work.I have the ground connected to the Hazzah ESP8266 ground and I connected the vin to pin 12 on the Hazzah ESP8266.

    0
    None
    StephanM13Josehf Murchison

    Reply 3 months ago

    I have not fired that part up yet, I still need to add to the code the temp and pressure then I will add the code for Wifi, But I have connected to Wifi, Just not sent any thing yet.

    0
    None
    JackSoldano

    1 year ago

    Nice one, I've very interesting in building one of these myself! Thanks

    1 reply
    0
    None
    Gadisha

    1 year ago

    Cool project! I'll keep this one in mind for when I finally get to learning Arduino!

    1 reply