Ребятушки всем Привет. Тема далеко не новая, но от этого не менее интересная. В последнее время тема «Радиофобии», подогретая выходом сериала «Чернобыль» и возобновившимися экскурсиями в Припять, вышла на новый уровень. В социальных сетях, в Припяти запускают колесо обозрения и даже ремонтируют квартиры. В общем тема радиации, стала как говориться «на хайпе».
Отношение к радиации в обществе очень уж неоднозначное. За последние 50 лет произошло несколько техногенных катастроф. Чернобыль, Фукусима, мелкие аварии на АЭС в Северодвинске, которые всколыхнули мировое сообщество.
В общем я решил, что иногда хочется знать не только температуру или влажность на улице, но и измерять уровень радиации. А в условиях того, что Беларусь становиться еще одной страной со своей АЭС, моя разработка становиться очень актуальной. А еще было бы неплохо делиться данными и отправлять эти данные в какой-нибудь онлайн сервис. Например «Народный Мониторинг».
Для измерения радиации можно использовать счётчик Гейгера-Мюллера. Для начала немного теории о типах ионизирующих излучений и способах их детектирования.
Для абсолютного большинства людей, минимум дозиметрического оборудования — это сигнализатор, срабатывающий на превышение, гамма-фона. Энтузиастам уже нужны точные цифровые значения, высокая чувствительность, накопленная доза и т.п. Бытовой дозиметр минимального функционала просто обязан детектировать гамма-излучение и жесткое бета-излучение и иметь поисковый режим (т.е. пикает/вибрирует на каждый случай регистрации кванта/частицы).
Из всего этого следует, что для проживающих на постсоветских (с тысячами армейских баз и складов) территориях людей стоит не искать на Aliexpress китайский «якобы дозиметр» за пару долларов, а спрашивать у знакомых «дедов» на предмет счетчика Гейгера. «На каждый день» стоит искать СБМ-20 (СТС-5), а «на перспективу» — слюдяные счетчики СИ-8Б, СБТ-10, СБТ-11.
Газоразрядный счетчик Гейгера-Мюллера, как правило, выполняется в виде хорошо вакуумной герметичной стеклянной или металлической трубки. Баллон счетчика, реагирующего на жесткое, бета- и гамма-излучение, имеет обычно форму цилиндра, изготовленного из нержавеющей стали с толщиной стенки 0,05–0,3 мм. Обычно счетчики воспринимают излучение всей своей поверхностью, но существуют и такие, у которых для этого в баллоне предусмотрено специальное «окно».
Схема простейшего счетчика Гейгера-Мюллера на СБМ-20, выглядит так.
На разных тематических форумах и на YouTube, авторы делают с нуля счетчик Гейгера на трубках СБМ-20, но как советуют авторы лучше брать сразу несколько, т.к. могут попасться и нерабочие и фонящие. Однако если под рукой нет трубок. А счетчик запилить всё-таки хочется. Тогда прямиком бежим на Aliexpress. И заказываем кит набор для сборки. И хотя выше я писал, что не стоит искать чего-то путного у наших братьев с востока, но в большей степени это относилось к уже готовым дозиметрам. Особенно к тем, что с размеров с коробок спичек.
И так. Для проекта нам понадобиться:
- Набор счетчика гейгера http://ali.pub/4gt30c
- ESP8266 NodeMCU http://ali.pub/4gt3ce
- Учетка на Narodmon.ru
Собственно общий вид данного девайса:
1) — трубка J305 (аналог М4011), самая дорогая деталь здесь, она фиксирует гамма и бета излучение
2,4) — микросхемы 555, на которых собственно и работает данный модуль
3) — LM358P, двухканальный операционный усилитель
5) — перемычка J1 — отключает буззер, если звуковая индикация не нужна
6) — перемычка J4 — используется для калибровки
7) — контакты 5V, INT, GND, первый и последний из которых для подключения питания 4.5-5.5В. Контакт INT — сигнальный, используется для подключения к MCU (например Arduino), к разъёму, настроенному на получение внешних прерываний, и соответственно, с последующей обработкой полученных импульсов.
8) — разъём 3.5мм AudioJack, нужен для подключения к аудиоразъёму в смартфонах. Можно на смартфоне загрузить приложение и выводить подсчёты на экран.
9) — буззер, издаёт щелчок при регистрации импульса
10) — сдвижной выключатель, проще говоря ВКЛ./ВЫКЛ.
11) — DC-разъём питания 5В (5.5х2.5мм)
12) — контактная колодка для подключения питания 5В к модулю.
13) — светодиод, горит постоянно, если на модуль подаётся питание
14) — светодиод, кратко мигает при регистрации импульса.
15) — NPN-транзисторы S8050
16) — калибровочный потенциометр
17) — калибровочный контакт J2
18) — дополнительные контакты под зажим (если планируется установить СБМ20)
Маркировка трубки J350Br, при этом поддерживает и СБМ20 как заявляют китайцы, есть второе посадочное место. Хотя если не ошибаюсь по спецификации СБМ20 работает от большего напряжения, чем выдает китайский девайс (в документации 380-450В).
Кстати, очень заботливые китайцы хорошо упаковали посылку, чтобы не разбилась трубка, бонусом шло оргстекло, слот для батареек, USB кабель питания, кабель для подключения к DevBoard.
КОД
Напишем код для определения количества радиации.
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 |
#include <SPI.h> #define LOG_PERIOD 15000 //Период регистрации в миллисекундах, рекомендуемое значение 15000-60000. #define MAX_PERIOD 60000 //Максимальный период регистрации. unsigned long counts; // unsigned long cpm; // unsigned int multiplier; // unsigned long previousMillis; // float uSv; // Переменная для перевода в микроЗиверты float ratio = 151.0; // Коофициент для перевода импульсов в микроЗиверты float uP = 0; const byte interruptPin = D2; // Порт ESP к которому подключен счетчик void tube_impulse(){ //Функция подсчета имульсов counts++; } void setup(){ // counts = 0; cpm = 0; multiplier = MAX_PERIOD / LOG_PERIOD; Serial.begin(9600); interrupts(); pinMode(interruptPin, INPUT); attachInterrupt(digitalPinToInterrupt(interruptPin), tube_impulse, FALLING); //Определяем количество импульсов через внешнее прерывание на порту } void loop(){ //Основной цикл unsigned long currentMillis = millis(); if(currentMillis - previousMillis > LOG_PERIOD){ previousMillis = currentMillis; cpm = counts * multiplier; Serial.println(cpm); uSv = cpm / ratio ; Serial.println(uSv); uP = uSv * 100 ; Serial.println(uP); counts = 0; } } |
Расписывать код не вижу смысла. Он неплохо прокомментирован. Основной принцип подсчета сводиться, к подсчету количества импульсов от трубки J350Br, используя прерывание на порту D2. После того как получили количество импульсов, переводим наши «попугаи» в микрозиверты и микрорентгены. Конечно без калибровки наши данные так и останутся «попугаями», поэтому лучше всего найти эталонный источник радиации и попробовать откалибровать наш счетчик.
Народный Мониторинг
Когда-то давно энтузиасты из России запилили сервис, где можно было агрегировать данные с погодных датчиков по всему миру. Вроде ничего нового. Но данными можно делиться от своей домашней метеостанции, а вкупе с тем что все это выводиться на карту, сервис сразу выигрывает несколько пунктов по сравнению с другими.
И так. Регистрируемся на сайте Narodmon.ru. Процесс описывать не буду. Все очень просто. Можно зарегистрироваться через социальные сети. Вообщем все интуитивно и понятно.
Нас интересует вопрос как отправлять наши данные на этот сервис. Вариантов отправки огромное множество. Передавать показания датчиков можно посредством протоколов TCP/UDP или HTTP GET/POST, а также MQTT.
По умолчанию допустимый интервал передачи показаний датчика 5 минут, который может быть уменьшен до 2 минут для партнеров и донаторов и до 1 минуты для наших постоянных спонсоров.
Данные обрабатываются и загружаются в базу пакетно 1 раз в минуту, а отладочные логи вашего прибора по ссылке narodmon.ru/ip обновляются по нажатию F5 в браузере по мере их поступления.
Запрещается разглашать свои уникальные MAC-адреса приборов и датчиков на сторонних ресурсах и при публикации исходных кодов для передачи показаний на narodmon.ru следует их маскировать.
Для себя я выбрал вариант передачи данных по протоколам TCP/UDP на narodmon.ru:8283 Пример кода:
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 |
#include <ESP8266WiFi.h> const char* ssid = "*****"; // название и пароль точки доступа const char* password = "*****"; const char* host = "narodmon.ru"; // адрес и порт const int httpPort = 8283; int temperature = 12; // пример значения температуры void setup() { Serial.begin(115200); delay(10); } void loop() { // Подключаемся к wifi Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); Serial.print("MAC address: "); Serial.println(WiFi.macAddress()); // MAC адресс нашей ESP8266, он нам понадобиться для добавления датчика на Narodmon.ru Serial.println(); // подключаемся к серверу Serial.print("connecting to "); Serial.println(host); // WiFiClient создаем TCP соединение WiFiClient client; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // отправляем данные Serial.println("Sending..."); // заголовок client.print("#"); client.print(WiFi.macAddress()); // отправляем МАС нашей ESP8266 //client.print("#"); client.print(" ESP8266"); // название устройства client.println(); // отправляем данные с градусника client.print("#"); client.print("TEMP"); // название датчика client.print("#"); client.print(temperature); // передаем значение температуры из переменной client.println("##"); delay(10); // читаем ответ с и отправляем его в сериал Serial.print("Requesting: "); while(client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); // хотя это можно убрать } client.stop(); Serial.println(); Serial.println(); Serial.println("Closing connection"); WiFi.disconnect(); // отключаемся от сети Serial.println("Disconnect WiFi."); delay(1000*60*10); // перекур 10 минут } |
На странице narodmon.ru/ip смотрим корректность наших данных. Данные должны быть быть записаны в корректном формате.
После этого копируем MAC адрес и идем в меню «Датчики» — «Добавить мой измерительный прибор» Указываем MAC адрес ESP и нажимаем продолжить.
Выбрать верный тип данных для каждого из датчиков: температура, влажность, давление и другие. Если вашего типа датчика нет в списке — укажите «пользовательский» и его единицу измерения в «Датчиках» на сайте проекта.
Указать названия для прибора и подключенного к нему датчика.
Адрес в названии указывать не нужно, для этого есть специальное поле.
Выполнить привязку к карте прибора, указав полный адрес его размещения (с точностью до дома) или геокоординаты (например для дачи или будки в полях) кликнув по строке «Адрес» в разделе «Датчики». Уточнить местоположение можно переместив маркер вашего прибора на карте, кликнув «переместить» в его балуне на карте.
Теперь код применительно именно для нашего датчика радиации.
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 |
#include <ESP8266WiFi.h> #include <SPI.h> #define LOG_PERIOD 60000 //Период регистрации в миллисекундах, рекомендуемое значение 15000-60000. #define MAX_PERIOD 60000 //Максимальный период регистрации. #define postingInterval 300000 // Интервал между отправками данных на Narodmonitor.ru unsigned long counts; // unsigned long cpm; // unsigned int multiplier; // unsigned long previousMillis; // unsigned long previousMillis1; // float uSv; // Переменная для перевода в микроЗиверты float ratio = 151.0; // Коофициент для перевода импульсов в микроЗиверты float uP; // Переменная для перевода в микроРентгены const byte interruptPin = D2; // Порт ESP к которому подключен счетчик // Настройки WiFi const char* ssid = ""; // название и пароль точки доступа const char* password = ""; const char* host = "narodmon.ru"; // адрес и порт const int httpPort = 8283; void tube_impulse(){ //Функция подсчета импульсов counts++; } void setup() { counts = 0; cpm = 0; multiplier = MAX_PERIOD / LOG_PERIOD; Serial.begin(9600); interrupts(); pinMode(interruptPin, INPUT); attachInterrupt(digitalPinToInterrupt(interruptPin), tube_impulse, FALLING); //Определяем количество импульсов через внешнее прерывание на порту delay(10); // Подключаемся к wifi Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); Serial.print("MAC address: "); Serial.println(WiFi.macAddress()); // MAC адресс нашей ESP8266, он нам понадобиться для добавления датчика на Narodmon.ru Serial.println(); } void loop() { unsigned long currentMillis = millis(); unsigned long currentMillis1 = millis(); if(currentMillis - previousMillis > LOG_PERIOD){ previousMillis = currentMillis; cpm = counts * multiplier; //Serial.println(cpm); uSv = cpm / ratio ; //Serial.println(uSv); uP = uSv * 100 ; counts = 0; } if((currentMillis1 - previousMillis1) + LOG_PERIOD > postingInterval){ previousMillis1 = currentMillis1; Connect(); Send(); Serial.println("Каждые 5 минут"); Serial.println(uP); } } void Send(){ // WiFiClient создаем TCP соединение WiFiClient client; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // отправляем данные Serial.println("Sending..."); // заголовок client.print("#"); client.print(WiFi.macAddress()); // отправляем МАС нашей ESP8266 client.print("\n"); // отправляем данные client.print("#"); client.print("RAD"); // название датчика client.print("#"); client.print(uP); client.print("\n"); client.println("##"); delay(10); // читаем ответ с и отправляем его в сериал Serial.print("Requesting: "); while(client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); // хотя это можно убрать } client.stop(); Serial.println(); Serial.println(); //Serial.println("Closing connection"); } void Connect(){ // подключаемся к серверу Serial.print("connecting to "); Serial.println(host); } |
Меняем значения. Указываем название датчика. В ячейке «Параметры» — устанавливаем единицы измерения. И в ячейке «Доступ» — делаем наш датчик публичным.
На этом вроде бы как и все. После проверки модерации показаний датчика, он станет доступен для всех желающих. Ссылка на мой Датчик радиации в Гродно
Ну и конечно ссылка на все файлы с проектом на Github
Друзья. Если вам понравилась эта статья, поделитесь ей в социальных сетях. Обязательно напишите комментарий если у вас возникли вопросы. Мне важно ваше мнение. У нас есть групповой чат в Telegram, где вы можете оперативно задать вопрос и узнать о последних новостях. И поддержите проект монеткой.
При копировании материалов сайта ссылка на источник обязательна!