Einen eigenen Geiger-Müller-Zähler mit Arduino, HV-Boost und 20x4-LCD bauen
Komponenten und Zubehör
| Komponente | Menge | Hinweise |
|---|---|---|
| Arduino UNO (oder kompatibles Board) | 1 | Jedes Arduino-Board funktioniert, muss kein UNO sein. |
| DC-DC 1,5-3V auf 300-400V 380V High-Voltage Boost Step-Up Spannungswandler Modul | 1 | Ideale Endspannung 400V, Betriebsbereich 350-450V (Arbeitsspannungsbereich des GM-Röhrchens). |
| STS-5 Geiger-Müller-Röhrchen | 1 | Günstig auf eBay erhältlich; Versand oft aus der Ukraine (2-3 Wochen Lieferzeit). |
| SunFounder IIC I2C TWI Serial 2004 20x4 LCD Modul Shield für Arduino Uno Mega2560 | 1 | Weniger Verkabelung durch I2C; jedes 20x4-Display funktioniert. |
Benötigte Werkzeuge
- Lötkolben (für die Platine und den Kondensator am Spannungswandler)
- Steckbrett (270 Pins) – optional für Prototypen
Projektbeschreibung
WICHTIGE SICHERHEITSHINWEIS: Dieses Gerät arbeitet mit Hochspannung (400 V). Obwohl die Ströme gering sind, kann jede Spannung oder jeder Strom, der in den menschlichen Körper gelangt, Herzrhythmusstörungen auslösen, die zum Tod führen können. Nur Personen mit Elektronikerfahrung und strikter Beachtung aller Sicherheitsvorkehrungen sollten dieses Projekt nachbauen.
Ziel war es, die Arbeit von AdNovea zu übernehmen und einen frei programmierbaren Geiger-Müller-Zähler zu schaffen. Der ursprüngliche Code ließ sich nicht anpassen, daher wurde eine eigene Firmware entwickelt, die sowohl die Physik der Röhre verständlich macht als auch individuelle Erweiterungen erlaubt.
Der Schaltplan wurde gegenüber AdNovea vereinfacht: Auf Ethernet, Buzzer und den Vorwiderstand zur GM-Röhre wurde verzichtet, da letzterer den Strom zu stark begrenzte und die Röhre nicht zündete. Der Aufbau erfolgte zunächst auf dem Steckbrett, danach auf einer gelöteten Lochrasterplatine.
Als Gehäuse diente der Karton des Arduino-Starterkits. Ausschnitte für das LCD und den USB-Anschluss wurden hineingeschnitten und mit Klebeband verstärkt. Die GM-Röhre und die Hochspannungsmodul-Anschlüsse wurden mit Isolierband gesichert. Ein 9V-Block hielt nicht lange; die Stromversorgung erfolgt schließlich per USB.
Firmware-Funktionen
- Zählung der Impulse über 30 Sekunden, Hochrechnung auf Counts per Minute (CPM)
- Umrechnung in µSv/h (Faktor 0,0057)
- Laufender Mittelwert und Standardfehler (SD/√n) der letzten Messwerte
- Speicher für 100 Messwerte (≈ 50 Minuten) – durch Arduino-RAM begrenzt
Weitere Ideen (Alarm bei erhöhter Strahlung, kürzere Log-Intervalle) wurden aus Zeitgründen nicht umgesetzt, können aber leicht ergänzt werden.
Code
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
unsigned long counts = 0;
unsigned long previousMillis = 0;
float averageCPM = 0;
float sdCPM = 0;
int currentCPM = 0;
float calcCPM = 0;
LiquidCrystal_I2C lcd(0x27, 20, 4);
float CPMArray[100];
#define LOG_PERIOD 30000 // 30 Sekunden
void 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);
}
void loop() {
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; // CPM
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("uSv/hr: ");
lcd.print(outputSieverts(CPMArray[currentCPM]));
counts = 0;
// Mittelwert & Standardfehler berechnen
averageCPM = 0;
sdCPM = 0;
for (int x = 0; x < currentCPM + 1; x++) {
averageCPM += CPMArray[x];
}
averageCPM /= (currentCPM + 1);
for (int x = 0; x < currentCPM + 1; x++) {
sdCPM += sq(CPMArray[x] - averageCPM);
}
sdCPM = sqrt(sdCPM / currentCPM) / sqrt(currentCPM + 1);
Serial.println("Avg: " + String(averageCPM) + " +/- " + String(sdCPM) + " ArrayVal: " + String(CPMArray[currentCPM]));
currentCPM++;
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) {
return x * 0.0057; // CPM → µSv/h
}
Schaltplan
Die Fritzing-Datei (geiger_counter_4LAnJvZEpC.fzz) liegt bei. Beim Öffnen in Fritzing können Bauteile verschoben erscheinen.
Herstellungsprozess
- Raspberry Pi Geigerzähler bauen – Open-Hardware Strahlungssensor Tutorial
- Echtzeit-Solarmonitoring mit Arduino: Low-Cost Datenerfassungssystem
- Bluetooth-gesteuerter Arduino-Spybot bauen – Überwachungsroboter mit IP-Kamera
- FlickMote: Gestensteuerung per Ultraschall & IR für Smart Home (Arduino 101)
- DIY Arduino TV-B-Gone: Universelle TV-Aus-Fernbedienung
- Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
- Sichere Warmwasserbereitung: Thermospannungs-Monitor für Zündflamme (Arduino & Raspberry Pi)
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- Selbstbau: Schlagbare, anpassbare Tasten mit Arduino und Piezo-Element
- Valentinstags-Geschenk: DIY Tage-zusammen-Zähler