Licznik Geigera, znany również jako licznik Geigera-Müllera, to jedno z najbardziej rozpoznawalnych urządzeń do wykrywania promieniowania jonizującego. Choć często kojarzony jest z katastrofami nuklearnymi lub filmami science fiction, w rzeczywistości ma szerokie zastosowanie w nauce, medycynie jak i przemyśle.
Czym jest licznik Geigera?
Licznik Geigera to przyrząd służący do wykrywania i pomiaru promieniowania jonizującego, takiego jak promieniowanie alfa, beta oraz gamma. Jego nazwa pochodzi od nazwiska niemieckiego fizyka Hansa Geigera oraz jego współpracownika Walthera Müllera, którzy opracowali to urządzenie w latach 20. XX wieku.
Jak działa licznik Geigera?
Podstawowym elementem urządzenia jest tzw. tuba Geigera-Müllera – cylindryczna komora wypełniona gazem (najczęściej mieszaniną gazów szlachetnych). W jej wnętrzu znajduje się elektroda (anoda), a ścianki tuby pełnią rolę katody. Gdy cząstka promieniowania przenika przez tubę, jonizuje gaz, powodując powstanie jonów dodatnich i elektronów. Te naładowane cząstki są przyciągane do elektrod, co generuje impuls elektryczny. Każdy taki impuls jest rejestrowany przez licznik i może być przedstawiony jako charakterystyczne „kliknięcie” lub odczyt wartości w sposób cyfrowy.
Dziś zajmiemy się właśnie odczytem wartości cyfrowych wraz z prezentacja wyniku na wyświetlaczu OLED SSD1306. Jako bezę użyję modułu z tubą J315B (oczywiście mogą występować też inne tuby). Tu dobrze było by wiedzieć jaką mamy gdyż, będzie nam to potrzebne do przelicznika CPM na µSb/h.
Potrzebne komponenty
- Arduino np. Uno / Mega
- moduł Gaigera DIY (RadiationD-v1.1) lub odpowiednik tuba J315B
- ekran OLED SSD1306
Z racji, że bezpośrednio z modułu Radiation uzyskujemy dane jednak w CPM, nie są tak łatwe w odbiorze jak znane wszystkim µSv/h. µSv/h. W tym celu w kodzie musimy ustawić zmienne dla naszej tuby, przeliczniki:
- dla tuby J315B przyjmujemy 0.0065,
- dla tuby SBM-20 przyjmujemy 0.0057,
- dla tuby J305 przyjmujemy 0.0081.
Nie zamieszczam tu przelicznika dla każdej z dostępnych tub, gdyż byłoby tego….Każdy zainteresowany na bank znajdzie dla swojej. Poniże podrzucam odrazu gotowe wpisy do zmiany w kodzie.
|
1 2 3 |
float conversionFactor = 0.0065; // dla J315B float conversionFactor = 0.0057; // dla SBM-20 float conversionFactor = 0.0081; // dla J305 |
Opis połączeń
Arduino UNO z wyświetlaczem OLED (0,96″ I2C):
GND → GND
VDD → 5 V
SCK → A5 (SCL)
SDA → A4 (SDA)
Arduino Uno z modułem Gaigera
GND → GND
5V → 5 V
VIN → PIN 2
|
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 |
// by swistak // pobrano z www.tranzystor.pl // License CC BY-NC-ND 4.0 // https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode.pl #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); volatile unsigned long counts = 0; const int geigerPin = 2; // pin odczytu danych z modułu unsigned long lastTime = 0; unsigned long interval = 10000; // 10s float conversionFactor = 0.0065; // dla tuby J315B void setup() { Serial.begin(9600); pinMode(geigerPin, INPUT); attachInterrupt(digitalPinToInterrupt(geigerPin), countPulse, FALLING); // inicjalizacja OLED if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("OLED error ? chyba nie podłączyłeś ;) "); while (true); } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(20, 20); display.println("Licznik Geigera"); display.setCursor(35, 30); display.println("by swistak"); display.setCursor(15, 40); display.println("www.tranzystor.pl"); display.display(); delay(2000); } void loop() { unsigned long currentTime = millis(); if (currentTime - lastTime >= interval) { noInterrupts(); unsigned long c = counts; counts = 0; interrupts(); float cpm = (c * 60000.0) / interval; float uSv = cpm * conversionFactor; // Serial Serial.print("CPM: "); Serial.print(cpm); Serial.print(" |uSv/h: "); Serial.println(uSv); // OLED display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println("Radiation:"); display.setTextSize(2); display.setCursor(0, 20); display.print(uSv, 3); display.println("uSv/h"); display.setTextSize(1); display.setCursor(0, 40); display.print("CPM: "); display.print(cpm); display.setCursor(15, 50); display.println("www.tranzystor.pl"); display.display(); lastTime = currentTime; } } void countPulse() { counts++; } |
Na szybko złożony do obudowy i działa w terenie.





Dzięki wreszcie wersja z uSv/h
Jak zawsze konkretnie i ciekawie 😉