Geigerzähler-Arduino

Mit dem Arduino und einem Geiger-Müller-Zählrohr (zum Beispiel mit dem weit verbreiteten und günstigen SBM-20 aus Russland) lässt sich recht einfach ein Geigerzähler basteln. Die für das Zählrohr notwenige Hochspannung (rund 400-500V) liefert ein CCFL-Inverter. Diesen bekommt man auch für kleines Geld im Internet zu kaufen.

Die restliche Schaltung ist eigentlich sehr einfach gehalten. Die Ausgangspulse gehen an ein Interrupt. Angezeigt wird die vergangene Messzeit, die aufsummierten Pulse bzw. die Pulse pro Minute (cpm). Mit einem Taster lassen sich alle Werte wieder auf 0 setzen.

Der CCFL-Inverter wird bei mir von einem LM317 über das 1 kOhm-Potentiometer mit variabler Spannung versorgt. Dadurch lässt sich die konkret für das Zählrohr benötigte Hochspannung (z.B. 400V für das SBM-20 oder 500V für das Endfensterzählrohr ZP1401) anpassen.

 


Arduino-Code:

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

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!!

// Anschlüsse:
// GND - GND
// VCC - 5V
// SDA - ANALOG Pin 4
// SCL - ANALOG pin 5

const int buttonPin = 10;
const byte interruptPin = 2;
volatile long pulse = 0;
volatile long pulse_min = 0;
long time_sec = 0;
long time_min = 0;
long time_min_old = 0;
long time_hour = 0;
long Anzeige_second = 0;
long Anzeige_minute = 0;
long Anzeige_hour = 0;
long millis_reset = 0;
int buttonState = 0;


// ===========================
// =======   SETUP   =========
// ===========================

void setup()
   {
    Serial.begin(9600);
    
    pinMode(interruptPin, INPUT_PULLUP);
    pinMode(buttonPin, INPUT);
    
    //pinMode(interruptPin, INPUT);
    
    attachInterrupt(digitalPinToInterrupt(interruptPin), Puls, RISING);
    
    lcd.init();        // initialize the lcd
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("Geigerzaehler");
    lcd.setCursor(0,1);
    lcd.print("Version 1.0");
    
    delay(3000);
    
    lcd.setCursor(0,0);
    lcd.print("             ");
    lcd.setCursor(0,1);
    lcd.print("            ");
        
   }


// ===========================
// =======    LOOP   =========
// ===========================

void loop()
   {
    time_sec = (millis() - millis_reset) / 1000;
    time_min = ((millis() - millis_reset) / 60000);
    time_hour = ((millis() - millis_reset) / 3600000);
    

    Anzeige_second = time_sec - time_min * 60;
    Anzeige_minute = time_min - time_hour * 60;
    Anzeige_hour = time_hour;
    
    delay(100);
    
    Serial.print(Anzeige_hour);
    Serial.print("   ");
    Serial.print(Anzeige_minute);
    Serial.print("   ");
    Serial.print(Anzeige_second);
    Serial.print("   ");
    Serial.println(pulse);
    
    if (time_min > time_min_old)     // "Minutensprung"
       {
        Serial.println();
        Serial.print(pulse_min);
        Serial.println();
        
        lcd.setCursor(8,1);
        lcd.print(pulse_min);
        lcd.print(" CPM    ");
    
        pulse_min = 0;
       }
    
    
    lcd.setCursor(0,0);
    lcd.print(Anzeige_hour);
    lcd.print(" h ");
    lcd.print(Anzeige_minute);
    lcd.print(" min ");
    lcd.print(Anzeige_second);
    lcd.print(" sec  ");    
    
    lcd.setCursor(0,1);
    lcd.print(pulse);
    
    
    buttonState = digitalRead(buttonPin);

    if (buttonState == HIGH)    // Reset-Knopf gedrückt
       {
        millis_reset = millis();
        
        pulse = 0;
        pulse_min = 0;
                
        lcd.setCursor(0,1);
        lcd.print(pulse);
        lcd.print("       ");
                
        lcd.setCursor(8,1);
        lcd.print("-");
        lcd.print(" CPM    ");
       }
    
    time_min_old = time_min;    // Werteübergabe
   }


// ==============================
// =======   INTERRUPT  =========
// ==============================

void Puls()
   {
    pulse = pulse + 1;
    pulse_min = pulse_min + 1;
   }