juliandwillett
Published © GPL3+

Customizable Geiger Muller Counter

An easily customizable Geiger Muller counter.

IntermediateFull instructions provided11,342
Customizable Geiger Muller Counter

Things used in this project

Hardware components

Arduino UNO
Arduino UNO
Can be any arduino device, does not have to be UNO
×1
DC-DC 1.5-3V to 300-400V 380V High Voltage Boost Step-up Voltage Inverter Module
Ideal final voltage is 400V, but can be from 350-450V (the power range of the GM tube).
×1
STS-5 Geiger Muller Tube
I found mine on ebay (less expensive). Be aware that you will likely have to buy from the Ukraine and it won't arrive for probably 2-3 weeks.
×1
SunFounder IIC I2C TWI Serial 2004 20x4 LCD Module Shield for Arduino Uno Mega2560
Flexibility on the unit. I used this LED display as had fewer wires involved going into it. Get a 20x4 and you will be fine.
×1

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
Needed to create device matching to circuit board. Also required to solder the capacitor to the voltage transformer.
Breadboard, 270 Pin
Breadboard, 270 Pin
My final project employed a solderable self-assembled circuit board, but if one is interested in a less permanent project, I found this to work as well.

Story

Read more

Schematics

Schematic.

Schematic is weird so when you open with Fritzing, things are moved around for some reason.

Code

Code

Arduino
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

unsigned long counts; //variable for GM Tube events
unsigned long previousMillis; //variable for measuring time
float averageCPM;
float sdCPM;
int currentCPM;
float calcCPM;
LiquidCrystal_I2C lcd(0x27, 20, 4);
float CPMArray[100];

#define LOG_PERIOD 30000 // count rate (in milliseconds)

void setup() { //setup
  counts = 0;
  currentCPM = 0;
  averageCPM = 0;
  sdCPM = 0;
  calcCPM = 0;
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);
  pinMode(2, INPUT);
  attachInterrupt(digitalPinToInterrupt(2), impulse, FALLING); //define external interrupts
}

void loop() { //main cycle
  lcd.setCursor(0,2);
  lcd.print("CPM Count: ");
  lcd.print(counts);
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > LOG_PERIOD) {
    previousMillis = currentMillis;
    CPMArray[currentCPM] = counts * 2;
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("uSv/hr: ");
    lcd.print(outputSieverts(CPMArray[currentCPM]));
    counts = 0;
    averageCPM = 0;
    sdCPM = 0;
    //calc avg and sd
    for (int x=0;x<currentCPM+1;x++)  {
      averageCPM = averageCPM + CPMArray[x];
    }
    averageCPM = averageCPM / (currentCPM + 1);
    for (int x=0;x<currentCPM+1;x++)  {
      sdCPM = sdCPM + sq(CPMArray[x] - averageCPM);
    }
    sdCPM = sqrt(sdCPM / currentCPM) / sqrt(currentCPM+1);

    Serial.println("Avg: " + String(averageCPM) + " +/- " + String(sdCPM) + "  ArrayVal: " + String(CPMArray[currentCPM]));
    currentCPM = currentCPM + 1;
    displayAverageCPM();
  } 
}

void impulse() {
  counts++;
}
void displayAverageCPM()  {
  lcd.setCursor(0,1);
  lcd.print("Avg: ");
  lcd.print(outputSieverts(averageCPM));
  lcd.print("+/-");
  lcd.print(outputSieverts(sdCPM));
}
float outputSieverts(float x)  {
  float y = x * 0.0057;
  return y;
}

Credits

juliandwillett
4 projects • 4 followers

Comments