Сборка собственного счётчика Гейгера‑Мюллера на Arduino, HV Boost и LCD 20x4
Компоненты и материалы
| Arduino UNO | Можно использовать любую плату Arduino, не обязательно UNO | 1 |
| DC-DC преобразователь 1.5‑3V в 300‑400V 380V | Идеальное выходное напряжение 400V, допустимый диапазон 350‑450V (рабочий диапазон ГМ‑трубки) | 1 |
| Гейгера‑Мюллера трубка STS‑5 | Можно найти на eBay (дешевле). Обычно отправляется из Украины, доставка 2‑3 недели | 1 |
| Модуль LCD 20x4 с I2C (SunFounder IIC I2C TWI Serial 2004) | Удобен меньшим числом проводов. Подойдёт любой 20x4 дисплей | 1 |
Необходимые инструменты
- Паяльник — для сборки на макетной плате и пайки конденсатора к преобразователю напряжения
- Беспаяная макетная плата (270 отверстий) — для первичной сборки и тестирования схемы
О проекте
ВНИМАНИЕ: ЭТО УСТРОЙСТВО ИСПОЛЬЗУЕТ ВЫСОКОЕ НАПРЯЖЕНИЕ (400 В), КОТОРОЕ ОПАСНО ДЛЯ ЖИЗНИ. ХОТЯ ТОКИ НЕБОЛЬШИЕ, ЛЮБОЕ ПОПАДАНИЕ ТОКА ИЛИ НАПРЯЖЕНИЯ В ОРГАНИЗМ ЧЕЛОВЕКА МОЖЕТ ВЫЗВАТЬ АРИТМИЮ СЕРДЦА И ПРИВЕСТИ К СМЕРТИ. СБИРАЮЩИЕ ЭТО УСТРОЙСТВО ДОЛЖНЫ ИМЕТЬ ОПЫТ РАБОТЫ С ЭЛЕКТРОНИКОЙ И СТРОГО СОБЛЮДАТЬ МЕРЫ ПРЕДОСТОРОЖНОСТИ ПРИ РАБОТЕ С ВЫСОКОВОЛЬТНОЙ ЧАСТЬЮ СХЕМЫ.
Цель проекта — взять за основу работу AdNovea и создать счётчик Гейгера‑Мюллера, который можно свободно программировать под свои задачи (оригинальный проект использовал скрипты, сложные для модификации). Это позволяет лучше понять физику работы трубки и адаптировать прибор под свои нужды.
Схема упрощена по сравнению с оригиналом AdNovea: убраны Ethernet‑модуль, зуммер и подключение к внешним сетям. Экспериментировалось с Bluetooth‑модулями и зуммерами, но в итоговом варианте оставлен только фоновый измеритель дозы.

Сборка простая (см. схему). Основная сложность — закупка деталей (ГМ‑трубка и высоковольтный преобразователь). Оба заказаны на eBay из Украины и Китая, доставка заняла 3‑4 недели.
Сначала схема собиралась на макетной плате для отладки. Сборка производилась по схеме AdNovea, но без зуммера, Ethernet‑модуля и резистора, идущего к ГМ‑трубке (с ним ток был недостаточным для работы трубки). Затем всё перепаяно на монтажную плату.

Использован Arduino Uno, но можно сэкономить место, применив Arduino Nano. ГМ‑трубка закреплена на плате изолентой, контакты преобразователя также изолированы изолентой для безопасности. Корпус сделан из картонной коробки от набора Arduino.

В крышке вырезано отверстие под LCD‑дисплей, закреплённый скотчем. Сбоку — отверстие для USB‑кабеля питания.


Питание от 9V батареек быстро садилось, поэтому устройство запитано от USB. Дополнительная изолента защищает плату от контакта с картоном.
Программа
Счётчик фиксирует импульсы от ГМ‑трубки каждые 30 секунд, умножает на 2 для получения CPM (счётов в минуту). Затем переводит в мкЗв/ч (микрозиверт в час) по формуле uSv/h = CPM * 0.0057. На дисплее показываются текущие CPM, текущая доза в мкЗв/ч, а также накопленное среднее значение и стандартная ошибка (SD / sqrt(n)). Из‑за ограничений памяти Arduino массив хранит только 100 измерений (50 минут работы), что достаточно для статистической выборки фонового излучения.
Планы по доработке: добавить зуммер для тревоги при превышении фона, экспериментировать с периодом логирования для более быстрых измерений. Код открыт для модификаций.
Код
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
unsigned long counts; // переменная для событий ГМ‑трубки
unsigned long previousMillis; // переменная для замера времени
float averageCPM;
float sdCPM;
int currentCPM;
float calcCPM;
LiquidCrystal_I2C lcd(0x27, 20, 4);
float CPMArray[100];
#define LOG_PERIOD 30000 // период логирования в миллисекундах (30 сек)
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;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("uSv/hr: ");
lcd.print(outputSieverts(CPMArray[currentCPM]));
counts = 0;
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) {
float y = x * 0.0057;
return y;
}
Схемы
Схема в Fritzing может отображаться со смещением компонентов. Файл схемы: geiger_counter_4LAnJvZEpC.fzz
Производственный процесс
- Создание счетчика Гейгера на Raspberry Pi — туториал по открытому датчику радиации
- Мониторинг солнечной панели в реальном времени: дешёвая система сбора данных на Arduino и Excel
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Мониторинг термопары газового водонагревателя: SMS/Email алерт при погасании горелки
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Создание настраиваемой «бьющейся» клавиши на Arduino: пошаговое руководство
- Подарок на День святого Валентина: Счетчик дней вместе своими руками