Here’s my latest project with the Pi: interfacing it with the Sparkfun Geiger counter & outputting the resulting data to a character LCD.
The geiger counter is interfaced with it’s USB port, with the random number generator firmware. A Python script reads from the serial port & every minute outputs CPM & µSv/h data to the display.
The Python code is a mash of a few different projects I found online, for different geiger counters & some of my own customisations & code to write the info to the display & convert CPM into µSv/h.
This also writes all the data into a file at /var/log/radlog.txt
The code for this is below:
import time import sys import serial import os import RPIO from RPLCD import CharLCD from subprocess import * from datetime import datetime # configuration settings logfile = "/var/log/radlog" # location to save log data serial_port = "/dev/ttyUSB0" lcd = CharLCD(pin_rs=15, pin_rw=18, pin_e=16, pins_data=[21, 22, 23, 24], numbering_mode=RPIO.BOARD, cols=16, rows=4, dotsize=10) #Init LCD with physical parameters f = open(logfile,"a") ser = serial.Serial(serial_port,9600,timeout=1) one = 0 #Init LCD with initial values. lcd.cursor_pos = (0, 1) lcd.write_string("Geiger Counter") lcd.cursor_pos = (1, 2) lcd.write_string("Initializing") lcd.cursor_pos = (2,-3) lcd.write_string("Please Wait...") lcd.cursor_pos = (3, 0) lcd.write_string(str(0) +" uSv/h") f.write("Geiger Counter Initialized\n") f.flush() while 1==1: stamp = int(time.time()) stamp == round(stamp,0) stamp = stamp + 60 count = 0 while 1==1: ct = int(time.time()) ct == round(ct,0) if ct > stamp: break #Read from serial port bit = ser.read(1) if bit != "": count = count + 1 #Conversion of counts per minute to uSv/hr usvh = count * 0.01 at = str(time.asctime()) t = str(time.time()) #Write line to log file & print info to console f.write("["+at+"."+t+"] "+str(count) + " CPM " +str(usvh) + " uSv/h\n") f.flush() print "["+at+"."+t+"] Count "+str(count) + " " + str(usvh) +" uSv/hr" #Send measurement info to LCD lcd.clear() lcd.cursor_pos = (0, 0) lcd.write_string(datetime.now().strftime('%b %d %H:%M:%S\n')) lcd.cursor_pos = (1, 0) lcd.write_string("Radiation Level:") lcd.cursor_pos = (2, 1) lcd.write_string(str(count) +" CPM") lcd.cursor_pos = (3, -1) lcd.write_string(str(usvh) +" uSv/h")