ESP, IoT Счетчик Гейгера с GPS, выводом на MQTT брокер и/или Народный Мониторинг.

ИгорьК

✩✩✩✩✩✩✩
8 Апр 2020
8
1
62
Москва
igorkandaurov.com
Рефералки запрещены, см. правила. Исправь или ветка будет удалена. Срок 1 час
Из китайского комплекта создал простое устройство для мониторинга уровня радиации.

1586441764763.png
1586802488213.png

Суть его - передача данных на любой агрегатор умного дома (OpenHab, Domoticz, etc), что принимает данные по протоколу mqtt.

Одна неделя на даче и в городе, чет неуютно:

1587551808475.png

Устройство состоит из:
1. Указанного выше счетчика Гейгера.
2. Очень странной платы ESP32.
1586444205565.png
3. I2C двустрочного дисплея. Подойдут абсолютно любые от наших восточных братьев.
4. (Для этой моей неудачной ESP32) любой подходящий стабилизатор напряжения. Если берем нормальную еспшку - стабилизатор не нужен, об этом чуть позже.
Провода, разъемы, платы для пайки, корпус - по вкусу.

Пару слов о выборе МК. Не слишком вдаваясь в детали, заказал десяток плат недорого и не заметил, что на плате не наблюдается приличного стабилизатора.
По прибытии плат успешно прошил их, загрузил скриптик, попытался завести в сетку и получил ошибку, которую никогда не встречал. Недолгое гугление показало целый ворох причин, среди которых не первой значилась недостаток питания. Трехвольтовый стабилизатор, напаянный прямо на еспшку, решил все проблемы. По сей причине, любви у меня к модулю не возникло и решил разогнать его по разным малополезным устройствам, типа этого.

Что касается желающих повторить, годится любой модуль ESP32 с нормальным стабилизатором. Можно делать устройство и на ESP-8266, но модуль дисплея и кое-что про wifi придется править.

Соединение:
1586371811775.png
Перечень ног:
26
- SDA Дисплея
27 - SCL Дисплея
18 - Счетчик Гейгера.

Питание:
На счетчик Гейгера подавать 5 вольт.
На дисплей подавать - зависит от вашего дисплея! В моем случае 3.3 вольта, но так не обязательно у вас.

Код устройства, в целом, элементарный, несколько слов об общей логике.
Устройство просто считает количество "щелчков", что прилетают с платы счетчика Гейгера в течение одной минуты, отнимает число 12 и отправляет на брокер.
12 = собственный фон 0,2 импульса в секунду (даташит) х 60 секунд.

Из этого получается указанный выше график.
Устройство, также, имеет кольцевой буфер, где усредняются значения со счетчика, эти данные выводятся на дисплей.
Полагаю, на дисплее лучше видеть усредненное значение, ибо как бы там ни было, мы на него постоянно не пялимся, а в агрегаторе удобнее иметь мгновенные значения в виде графика.
Ниже видна работа кольцевого фильтра. в 20 часов фильтр был выключен:
radiarion02.jpg
На брокер идет и полученное значение, и усредненное и еще много чего.
Также устройство может по команде от брокера переходить в режим программирования по сети, что позволяет реализовывать любые замыслы, что-то подправлять в коде, etc.

Код устройства написан на языке Lua, который позволяет неучам без специального образования и со средним соображением, к коим я отношусь, делать проекты самостоятельно.

Логика работы находится в файле main.lua, который ниже с комментариями.
JavaScript:
do
    ----------------------------------
    -- Чтобы можно было запустить файл для настройки и проверки работы отдельно
    -- от всей программы, создаем необходимые таблицы и константы.
    -- В процессе работы программы в целом код ниже не выполняетя.

    if not wth then wth = {} end
    if not dat then
        dat = {}
        dat.pin = 18
        dat.ringbuf = 10
    end
    ----------------------------------

    -- Счетчик импульсов с платы Гейгера
    counter = 0

    -- Создаем два кольцевых буфера для устреднения
    ringCPM = dofile'_ciclecount.lua'(dat.ringbuf)
    ringMKR = dofile'_ciclecount.lua'(dat.ringbuf)

    -- Конфигурируем ногу счетчика на вход
    gpio.config( { gpio=dat.pin, dir=gpio.IN}) --, pull=gpio.PULL_UP })

    -- Функция счета  импульсов от Гейгера
    function pin1cb(level)
            counter = counter + 1
            --print(counter)
    end

    -- Завешиваем функцию счета на прерывание соответствющей ноги
    gpio.trig(dat.pin, gpio.INTR_UP, pin1cb)

    -- Создаем рабочий таймер, что будет читать показания счетчикараз в минуту
    worktmr = tmr.create()

    -- Определяем функцию чтения
    worktmr:alarm(60000, 1, function(t)

        -- Заносим в таблицу результаты счетчика и обнуляем его
        wth.rad = counter - 12 -- 12  - Собственные CPM
        counter = 0
        -- Если собственных СРМ меньше 12, то все равно ноль
        wth.rad = wth.rad > 0 and wth.rad or 0

        -- Здесь помещаем СРМ в кольцевой буфер и извлекаем среднее,
        -- одновременно форматируем в целое число
        wth.radRing = string.format('%d',ringCPM(wth.rad))

        -- Здесь считаем и форматируем микрозиверты.
        -- Возможны ваши уточнения, как считаете нужным
        wth.uS = string.format('%.2f', 0.00812 * wth.rad)

        -- Здесь усредняем микрозиверты.
        wth.uSRing = string.format('%.2f', ringMKR(0.00812 * wth.rad))

        -- Гоним в консоль результаты
        print("\nRadioactivity:\n"..wth.rad.." and Ring ".. wth.radRing .." cpm\n"..wth.uS.." and Ring ".. wth.uSRing.." uSv/h\n")

        -- Отправляем данные на дисплей, причем СРМ - усредненные.
        -- Для проверки и настройки в части счетчика  все что касается hd44780 следует закомментировать, иначе ошибка.
        hd44780.setCursor(0,1)
        hd44780.printString('                ')
        hd44780.setCursor(0,1)
        hd44780.printString(wth.radRing..'cpm  '..wth.uSRing..'uSv/h')

        -- Отправляем данные на брокер
        if dat then dofile('mqttpub.lua') end

      end)
    -- Первая строка дисплея
    hd44780.setCursor(0,0)
    hd44780.printString('                ')
    hd44780.setCursor(0,0)
    hd44780.printString('   Radiation:')
end

Начнем загружать код в устройство.

1. Прошиваем esp32 при помощи Flash Download Tools.
1586428043673.png
1. Указываем путь к файлам bin
2. Указываем адреса как на картинке
3. Указываем порт
4. Стираем память esp32
5. Шьем прошивку.
2. Скачиваем и запускаем программу ESPlorer:

3. Правим в текстовом редакторе типа notepad++, sublime, etc. и загружаем в модуль файл wifi32.lua:
1586429936392.png
1586430232638.png
1. Выбрать и загрузить файл.
2. Обновить список файлов.
3. Исполнить файл wifi32.lua
4. Увидеть полученный ip в сети.
5. Перегрузить ESP32.

4. Правим еще несколько файлов и загружаем все оставшееся.
1586430730286.png
Грузим все остальные файлы, делаем две проверки:
исполняем main.lua:
1586432181499.png
Идем дальше ===>.
 

Вложения

Изменено:

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Мысли на будущее: вместо есп32 можно взять ардуину/стм, добавить модуль GPS и модуль GSM/GPRS а затем покататься по городу с отправкой показаний на сервер и на карте посмотреть радиационный фон города, а также каких мест стоит избегать.
 
  • Лойс +1
Реакции: ИгорьК

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
говорят типа есть какие-то ускорители частиц, которые включают несколько раз в сутки и они облучают и дозиметры пикают
причем замечено даже в деревнях
и нормальный фон это до 15, а подскакивает до 40, как в рентгеновском кабинете

и так в разных городах

надо запиливать свои счетчики и выводить на народный мониторинг
только в лабу надо нести эти самопалы для калибровки
 
  • Лойс +1
Реакции: ИгорьК

ИгорьК

✩✩✩✩✩✩✩
8 Апр 2020
8
1
62
Москва
igorkandaurov.com
Мысли на будущее: вместо есп32 можно взять ардуину/стм, добавить модуль GPS и модуль GSM/GPRS а затем покататься по городу с отправкой показаний на сервер и на карте посмотреть радиационный фон города, а также каких мест стоит избегать.
Да и к этому устройству можно приладить GPS. Кстати в комплекте с платой счётчика идёт блок на три батарейки, шнурок-коннектор чтобы питать саму плату от USB. На ней есть стабилизатор с 5 вольт ну и дальше на свои 400в.

Модуль GSM/GPRS вообще не нужен, ибо esp32 легко пишет лог в свою внутреннюю память, кою, если надо, легко дополнить какой-нибудь I2C FRAM.

Но... что с этой информацией потом делать.
 

ИгорьК

✩✩✩✩✩✩✩
8 Апр 2020
8
1
62
Москва
igorkandaurov.com
надо запиливать свои счетчики и выводить на народный мониторинг
А вот это можно сделать здесь, ибо модуль отправки данных на narodmon у меня давно имеется. По ходу дела добавлю эту фичу. Спасибо.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Да и к этому устройству можно приладить GPS.
Можно, но есп32 раза в 3 дороже атмеги/стмки, а таких мощностей и связи не требуется. Так что нет смысла увеличивать себестоимость изделия.
Модуль GSM/GPRS вообще не нужен, ибо esp32 легко пишет лог в свою внутреннюю память, кою, если надо, легко дополнить какой-нибудь I2C FRAM.
Без него теряется онлайн мониторинг. Здесь же смысл в том что если множество людей сделают и будут выгружать в онлайн режиме - то будет общая картина онлайн мониторинга города. По этому и предложил добавить GSM/GPRS модуль.
 

ИгорьК

✩✩✩✩✩✩✩
8 Апр 2020
8
1
62
Москва
igorkandaurov.com
Можно, но есп32 раза в 3 дороже атмеги/стмки, а таких мощностей и связи не требуется. Так что нет смысла увеличивать себестоимость изделия.
Здесь же смысл в том что если множество людей сделают и будут выгружать в онлайн режиме - то будет общая картина онлайн мониторинга города.
1. Не согласен. Сейчас каждый первый смартфон раздает wifi, следовательно применение атмеги/gprs шилда (+ сим) как раз увеличивает стоимость.

2. Ну очень нравится мне писать код на Lua и я готов пожертвовать ради этого бутылкой пива в месяц. Это же хобби, не так ли? А здесь кому что нравится.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
1. Не согласен. Сейчас каждый первый смартфон раздает wifi, следовательно применение атмеги/gprs шилда (+ сим) как раз увеличивает стоимость.
сим модуль + контроллер на атмеги стоит дешевле чем есп32. Что касается раздачи вайфая - то операторы её отслеживают и по другому тарифицируют кроме того это делает устройство зависимым от смартфона (т.е. не автономным). А для умных устройств есть специальные тарифы с дешевым интернетом и низкой скоростью, так что и в использовании выйдет дешевле.
1586433969244.png
1586434064052.png
2. Ну очень нравится мне писать код на Lua и я готов пожертвовать ради этого бутылкой пива в месяц. Это же хобби, не так ли? А здесь кому что нравится.
Конечно так. Я предложил вариант своего видения устройства, кому понравится - тот сам сделает или закажет, а кому нет - тот не сделает, все просто)
 
  • Лойс +1
Реакции: ИгорьК

ИгорьК

✩✩✩✩✩✩✩
8 Апр 2020
8
1
62
Москва
igorkandaurov.com
Продолжение этого.

Исполняем файл mqttset.lua:
1586439380350.png
5. Перезагружаем и запускаем проект в целом - _init.lua:
1586440659494.png
Все получилось?

6. Организуем автостарт - перегружаемся и выполняем _renameinit.lua:
1586441124629.png
7. Смотрим на устройство со стороны брокера.
1586441379611.png
Видим его текущее состояние ("ON"), CPM и микрозиверты текущие и пропущенные через фильтр, состояние кучи и записей регистра ESP32.
Последние два параметра не должны существенно изменяться в меньшую сторону с течением времени.

Таким образом, мы положили данные на mqtt брокер.

Впереди - отправка на Народный Мониторинг.

_______________________________________________________________________________

Народный Мониторинг.

Теперь экспериментальная версия, которая может отправлять данные и на брокер и на Народный Мониторинг, может в одно из этих мест, а может не отправлять никуда, лишь выводить на дисплей.

Дисплей тоже можно не подключать :)

Экспериментальная, потому что в мои планы пока не входит гнать информацию на narodmon и в реальной работе я его протестировать не могу, однако некоторым неправильным образом я его протестировал и убедился в работоспособности, а именно:

C++:
> dofile("_init.lua")
Try Run     setglobals.lua
> i2c started!
NodeMCU Got IP:    192.168.1.70
rad_esp32_002
Connected to 192.168.1.125 as raddachatest
Subscribed

Radioactivity:
0 and Ring 0 cpm
0.00 and Ring 0.00 uSv/h


Publishing:
uS    0.00
radRing    0
rad    0
heap    191976
uSRing    0.00
reg    26

Start narodmon!
#12-34-56-78-90-AB
#uS#0.00
#uSRing#0.00
#rad#0
#radRing#0
##

Narodmon says OK
1586464887620.png
Настройка в файле _setuser.lua:

1586465736705.png
Прошивка, настройка сети и общий порядок действий как в предыдущей версии.

Скрипты в приложении. Всем здоровья.
 

Вложения

Изменено:

ИгорьК

✩✩✩✩✩✩✩
8 Апр 2020
8
1
62
Москва
igorkandaurov.com
добавить модуль GPS и модуль GSM/GPRS а затем покататься по городу с отправкой показаний на сервер и на карте посмотреть радиационный фон города
Добавлен модуль GPS для желающих покататься по городу. Данные пока гонит на MQTT брокер, откуда их можно забирать, например, NodeRed.

radgps.png
Если найдутся желающие для таких покатушек, и уточнят, куда и как надо отправлять показания, код можно допилить.
В данный момент изменения минимальные.

(У меня ) GPS GY-GPS6MV2 подключаем выходом ТХ на 17 ногу esp32. Полагаю, все GPS, что работают по протоколу NMEA, будут работать.

Из потока данных парсится строка $GPGLL .

1. В модуль дополнительно к предыдущей программе загружаем файл uart2.lua (в приложении)
2. Еще вносим изменения в файл _setuser.lua:

1586607237746.png

Все. Кто поедет? :)
___________________________________________________________


Как я забираю данные с устройства в Domoticz.
В агрегатор беру всего один параметр с каждого датчика - СРМ и (аналогичным способом как в устройстве) превращаю в два.
Остальные параметры, что идут на брокер, лишь по необходимости просматриваю через MqttSpy.

Применяю NodeRed:
1586608005718.png

1586608076359.png1586608139338.png
1586608173074.png
1586608750546.png
1586608781242.png
 

Вложения

  • 562 байт Просмотры: 2
Изменено:
  • Лойс +1
Реакции: IamNikolay

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Добавлен модуль GPS для желающих покататься по городу. Данные пока гонит на MQTT брокер, откуда их можно забирать, например, NodeRed.
....
Если найдутся желающие для таких покатушек, и уточнят, куда и как надо отправлять показания, код можно допилить.
В данный момент изменения минимальные.
....
Отлично! Полагаю какие либо общественные карты мониторинга есть (видел с мониторингом температуры).
 
  • Лойс +1
Реакции: ИгорьК