Interfacing With A Cheap Geiger Counter

I got a cheap Geiger counter from Aliexpress:

This picture was taken on an airplane: you have more radiation (cosmic rays) at high altitude.

I figured out how to interface with this counter in Python to log real time data:

#!/usr/bin/env python

from future import print_function

description = “Program for geiger meter”
author = ‘Didier Stevens’
version = ‘0.0.1’
date = ‘2024/05/11’

“”"

Source code put in the public domain by Didier Stevens, no Copyright
https://DidierStevens.com
Use at your own risk

History:
2024/05/11: start

Todo:
“”"

import optparse
import serial
import time

def FormatTime(epoch=None):
if epoch == None:
epoch = time.time()
return ‘%04d%02d%02d-%02d%02d%02d’ % time.localtime(epoch)[0:6]

def FindCOMPorts():
ports =
for number in range(1, 10):
try:
comport = ‘COM%d’ % number
with serial.Serial(comport) as oSerial:
ports.append(comport)
except serial.serialutil.SerialException as e:
if ‘PermissionError’ in e.args[0]:
ports.append(comport)
return ports

def LogToCSV(comport):
ser = serial.Serial(comport, 115200, timeout=0, write_timeout=0)
ser.write(b’\xAA\x05\x0E\x01\xBE\x55\x00’)
alldata = b’’
fOut = open(‘geiger.csv’, ‘a’)
while True:
data = ser.read(1000)
if data != b’‘:
alldata += data
lines = alldata.split(b’\xaaU\x0e’)
alldata = lines[-1]
lines = lines[:-1]
for line in lines:
if line != b’‘:
out = FormatTime() + ‘;’ + line.decode(‘latin’)
print(out)
fOut.write(out + ‘\n’)
if alldata.endswith(b’U’) and not alldata.endswith(b’\xaaU’):
out = FormatTime() + ‘;’ + alldata.decode(‘latin’)
print(out)
fOut.write(out + ‘\n’)
alldata = b’’
time.sleep(0.40)

def Main():
oParser = optparse.OptionParser(usage=‘usage: %prog [options]\n’ + description , version=‘%prog ’ + version)
oParser.add_option(’-l’, ‘–listports’, action=‘store_true’, default=False, help=‘List ports’)
(options, args) = oParser.parse_args()

comports = FindCOMPorts()
if options.listports:
    print('Available ports:')
    for comport in comports:
        print(' %s' % comport)
    return

if len(args) == 1:
    LogToCSV(args[0])
elif len(comports) == 1:
    print('Using %s' % comports[0])
    LogToCSV(comports[0])
else:
    print('Provide the COM port as argument')
    print('Available ports:')
    for comport in comports:
        print(' %s' % comport)

if name == ‘main’:
Main()

Article Link: Interfacing With A Cheap Geiger Counter | Didier Stevens