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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
#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; } |