на главную
Карта сайта
English version
Вы читаете:

Беспроводной санитарно-медицинский таймер

Медтехника
4 года назад

Беспроводной санитарно-медицинский таймер

1

Устройство, описание которого приводится далее, является дальнейшим развитием проекта [1], адаптированным к резко изменившимся социальным условиям с учётом медикосанитарной обстановки, сложившейся в условиях пандемии COVID-19. Помимо собственно сигнализатора времени приёма лекарственных препаратов, оно также выполняет функцию управления бактерицидной кварцевой Уф-лампой или другими электроприборами, требующими работы по расписанию. Устройство имеет беспроводной интерфейс связи и благодаря этому может оперативно устанавливаться в изолированных помещениях с ограниченным доступом, например, санитарных боксах, и конфигурироваться дистанционно с ПК с помощью специально разработанной программы. Синхронизация времени производится через сеть Интернет от сервера точного времени.

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

Основу устройства представляет модуль NodeMCU v3 с контроллером ESP8266, имеющим встроенную поддержку протокола Wi-Fi 802.11 b/g/n в режимах точка доступа или клиент. Программа написана в среде IDE Arduino 1.8.10. Для получения возможности работы IDE Arduino с NodeMCU следует зайти в меню "Настройки" и в поле ввода "Дополнительные ссылки" для менеджера плат ввести URL: http:// arduino.esp8266.com/stable/package_ esp8266com_index.json. Этот же адрес можно скопировать из комментариев в исходном файле. Далее через пункт меню "ИнструментьиМенеджер плат" устанавливают скрипты ESP8266 by ESP8266 Community актуальной версии, выбирают в меню "Инструменты" пункт "Плата NodeMCU 1.0 (ESP-12E Module)", вводят исходный код прилагаемой программы, компилируют и загружают в плату.

Разберём код программы WiFiSync2. ino. Вначале импортируются необходимые библиотеки: ESp8266WiFi.h обеспечивает поддержку собственно контроллера ESP8266, WiFiUdp.h - работу по протоколу UDP, который используется как для синхронизации времени, так и для конфигурирования, EEPROM.h - обращение к EEPROM для сохранения текущих настроек. Первая устанавливается из репозитория вышеописанным способом, а две другие являются стандартными.

После импорта библиотек задают константы STASSID (ID-точки доступа), STAPSK (пароль доступа), URL сервера точного времени (time.nist.gov) и определяют ряд констант unsigned int: порт прослушивания UDP NTP SYNC_PORT = 2390, порт управления CTRL_PORT, размеры пакета данных точного времени NTP_PACKET_SlZE и пакета данных управления CTRL_ PACKET_SIZE, а также интервалы синхронизации времени SYNC_INT (миллисекунды), ожидания ответа сервера NTP WAITJNT (миллисекунды) и длительности звукового сигнала SND_INT (с); константы типа uint8_t (с интервалом значений 0-256): число управляющих выходов N_DEV и соответствующий ему массив GPIO AO_PIN[], максимальное число сигналов на один выход N_SIG, вход GPIO ручного сброса R_PIN, выходы GPIO подключения светодиодного индикатора LED_PIN и звукового сигнализатора SND_PIN.

Назначение выводов модуля приведено в таблице. Напомним, что обращение к портам ввода-вывода ESP8266 осуществляется согласно их нумерации по GPIO. В процедуре setup() происходят установка режимов входов-выходов GPIO, инициализация EEPROM и считывание из него данных, а также инициализация Wi-Fi операторами WiFi.mode(WIFI_STA) и WiFi.begin (STASSID, STAPSK). О структуре хранения данных в EEPROM будет сказано далее.

Таблица. Назначение выводов модуля

Обозначение на плате

GPIO

Функциональное назначение

DO

16

Устройство 0

D1

5

Устройство 1

D2

4

Устройство 2

D3

0

Устройство 3

D4

2

Светодиодный

индикатор

D5

14

Устройство 4

D6

12

Устройство 5

D7

13

Устройство 6

D8

15

Звук, сигнал

RX

3

Устройство 7

ТХ

1

Сброс

 

В основном цикле, во-первых, происходит проверка подключения к точке доступаWiFi с интервалом SYNC_INT по значению свойства WiFi.status() == WL_CONNECTED. При наличии подключения открываются два канала обмена данными: udp_sync.begin(SYNC_PORT) и udp_ctrl.begin(CTRL_P0RT) на заданных портах. Первый канал используется для обмена данными с сервером точного времени, а второй - для конфигурирования устройства. При "обрыве" связи по какой-либо причине каналы закрываются методом stop(). Если к этому моменту были проведены синхронизация и конфигурирование, таймер продолжит работу в автономном режиме. Переменная noCon является флагом наличия подключения и устанавливается или сбрасывается при выполнении соответствующего условия. Если эта переменная истинна, происходят разрешение конкретного IP-сервера WiFi. hostByName(ntpServerName, time ServerIP) и отправка запроса к нему с помощью стандартной функции sendNTPpacket(timeServerlP). Проверка ответа сервера производится с интервалом WAlT_INT Полученные данные помещаются в массив syncBuf размером NTP_PACKET_SIZE с помощью функции udp_sync.read(). В указанном пакете метка точного времени передаётся четырьмя байтами, начиная с 40-го. Поэтому сначала производится побайтовая сборка старшего и младшего слов (highWord и lowWord), из которых затем формируется значение времени в секундах, прошедших с 1 января 1900 г. (переменная secsSince1900). Метка времени epoch в формате Unix получается из этого значения простым вычитанием константы SEVENTY_YEARS.

Далее аналогично происходит проверка данных в канале управления и при их наличии - помещение в буфер ctrlBuf размером CTRL_PACKET_SIZE с помощью функции udp_ctrl.read(). Структура кадра управления следующая.

Байт 0:

- биты 0-2 - номер устройства;

- биты 3, 4 - номер сигнала;

- бит 5 - флаг повтора сигнала;

- бит 7 - флаг инверсии выхода.

Байты 1-4 - время включения (в

формате Unix timestamp).

Байты 5-8 - время отключения.

Байты 9-12 - текущее время для синхронизации от ПК.

Итого - 13 байт.

Номер внешнего устройства (0-7) определяется первыми тремя битами пакета и присваивается переменной devNo. Следующие два бита (3 и 4) определяют номер сигнала (0-4). Бит 5 является флагом ежесуточного повтора сигнала, бит 7 - флагом инверсии управляющего выхода. Бит 6 зарезервирован для расширения системы. Время включения устройства в формате Unix формируется аналогично вышеописанному и сохраняется для каждого сигнала в элементе массива timeOn[devNo] [sigNo]. Время отключения - в элементе timeOff[devNo] ][sigNo]. Если значение времени отключения меньше, чем значение времени включения, потребуется ручной сброс. При этом присваивается истинное значение соответствующему элементу массива man_mode [devNo] ][sigNo], в котором хранятся флаги разрешения ручного сброса по выходам/сигналам.

Значение переменной epoch синхронизируется со временем,переданным с ПК. Это требуется в случае, если сервер точного времени недоступен. Следует обратить внимание, что порядок следования байт метки времени в пакете канала управления - обратный. Это обусловлено особенностями компонентов, используемых в программе конфигурирования со стороны ПК.

После получения данных контрольного канала происходит их запись в EEPROM. Структура хранения - следующая: байты 0-63 содержат данные по времени включения/отключения сигнала 0 для всех устройств, байты 64-127 - сигнала 1, байты 128-191 - сигнала 2 и байты 192-255 - сигнала 3. То есть каждому сигналу отводится 64 байта. Из этих байт в каждой группе первые 4 (0-3) содержат значение времени включения (timeOn) для первого выхода, байты 4-7 - времени выключения timeOff для первого выхода, байты 8-11 - значение timeOn для второго выхода, байты 12-15 - timeOff для второго выхода и т. д. В группе байт 256-259 хранятся флаги повторения сигналов 0-3 соответственно. Байт 260 выделен для хранения флагов инверсии управляющих выходов 0-7.

При первоначальной загрузке все сохранённые данные считываются в оперативную память. Флаги разрешения ручного сброса man_mode[devNo] ][sigNo] устанавливаются в ходе загрузки расчётным способом в результате сравнения значений времени включения и отключения.

После синхронизации времени любым способом (от сервера или от ПК) устанавливается истинное значение переменной sync. При этом каждую секунду значение переменной epoch инкрементируется, а светодиодный индикатор меняет состояние на обратное (секция //LED). Постоянное свечение индикатора свидетельствует об отсутствии синхронизации.

Проверка на совпадение текущего и установленного значений времени производится во вложенных циклах по всем сигналам и выходам. В случае совпадения на соответствующий выход поступает управляющий сигнал с учётом флага инверсии. При установленном флаге повтора значения timeOn[][] и timeOff[][] увеличиваются на величину SEC_IN_DAY Также присваивается истинное значение переменной snd, которое сбрасывается по прошествии интервала SND_INT или при равенстве текущего времени значению timeOff[][]. Значение этой переменной является ритерием для установки высокого уровня на выходе подачи звукового сигнала.

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

if (epoch%2 ==0)analogWrite (LED_PIN, LL*man_mode_);

else analogWrite(LED_PIN, 1023).

Как видно, среднее значение напряжения на выходе ШИМ LED_PIN при чётных значениях переменной текущего времени epoch зависит от значения переменной man_mode_, если она равна 1 (требуется ручной сброс сигнала), то гашение светодиодного индикатора, подключённого к выходу LED_PIN, будет неполным, и его яркость будет меняться в интервале от LL до 1023 (максимальное значение для режима ШИМ по умолчанию). Константа LL, таким образом, определяет минимальную яркость свечения индикатора при man_mode_ = 1.

Ручной сброс выходов в исходное состояние производится по проверке состояния входа R_PIN и флагов разрешения ручного сброса с учётом флагов инверсии.

Конфигурирование устройства осуществляется с помощью специальной программы WiFiSync2.exe. Её назначение - формирование пакета данных в соответствии с форматом кадра управления. Программа создана на языке Object Pascal в среде Embarcadero Delphi 10.2. Исполняемый файл и исходный код программы прилагаются. Внешний вид интерфейса показан на рис. 1 и рис. 2. Он прост и интуитивно понятен. С помощью селекторов Select Device и Signal выбирают соответственно номера управляющего выхода (внешнего устройства) и сигнала. Для удобства конечного пользователя нумерация начинается с 1. Селекторами времени устанавливают время включения (верхним) и отключения (нижним) для выбранной комбинации устройстваисигнала. Выключатели I, R служат, соответственно, для установки режимов инверсии выхода и ежесуточного повтора сигнала. Текстовое поле предназначено для ввода пометок по выбранному устройству (например, "Управление кварцевой УФ-лампой", "Приём препарата № 1" и т. д.). Установленные параметры передаются на таймер нажатием на кнопку Send. При этом выводится окно с сообщением об успешной отправке данных, а также происходит запись параметров в конфигурационный файл set-tings.ini. При переключении селекторов устройства/сигнала последние значения отправленных параметров отображаются в интерфейсе программы. Если время отключения меньше времени включения, под текстовым полем выводится предупреждающая надпись о том, что потребуется ручной сброс данного сигнала.

Внешний вид интерфейса программы

Рис. 1. Внешний вид интерфейса программы

 

Внешний вид интерфейса программы

Рис. 2. Внешний вид интерфейса программы

 

В меню Settings вызывают окно настроек программы. Здесь нужно установить часовой пояс, выбрать сетевой интерфейс, подключённый к общей точке доступа, назначить IP конкретного таймера (если их несколько) и порт управления, которые должны соответствовать значениям, определённым в программе для контроллера NodeMCU. Для отправки на все таймеры в одном сегменте сети нужно ввести значение 255 в последнем октете IP Настройки применяются и сохраняются сразу, перезапуска программы не требуется.

Схема таймера

Рис. 3. Схема таймера

 

Схема таймера показана на рис. 3. К каждому управляющему выходу подключены светодиоды (HL1, HL2), индицирующие состояние данного выхода, и может быть подключён оптрон U1 для коммутации слаботочной нагрузки переменного тока. При уровне лог. 0 на управляющем выходе симистор оптрона откроется, и нагрузка будет подключена к сети. Максимальный ток нагрузки - 1 А. Этого достаточно для управления бактерицидными УФ-лампами, типовое значение мощности которых - 80...140 Вт. При необходимости управления более мощной нагрузкой следует применить стандартную схему, приведённую в [2]. Узел звуковой сигнализации собран на микросхеме DA2 музыкального синтезатора серии UM66TxxL [3]. Микросхемы этой серии изготовлены по КМОП-тех-нологии, имеют встроенные ПЗУ с одной запрограммированной мелодией и RC-генератор. Выпускаются в трёхвыводных корпусах TO-92 и требуют всего несколько внешних элементов для воспроизведения звука. Допустимый интервал напряжения питания - 1,5...4,5 В, собственный потребляемый ток не превышает 60 мкА. Список возможных запрограммированных мелодий приведён в [3]. Индекс в обозначении соответствует определённой мелодии. При появлении любого сигнала на выходе D8 (GPIO15) появится уровень лог. 1 (+3,3 В), и мелодия будет проигрываться циклически, непрерывно до момента нажатия на кнопку сброса SB1. Громкость звучания регулируют резистором R4.

Питание таймера - резервированное, осуществляется подачей на вывод +3.3V внешнего напряжения от Low Dropout стабилизатора DA1 MCP1700-3302E. На вход стабилизатора поступает стабилизированное напряжение +5 В от внешнего источника питания (на схеме не показан). Аккумулятор GB1 с контроллером зарядки A1 обеспечивает резервное питание устройства в отсутствие внешнего напряжения. Применение Low Dropout стабилизатора совместно с Li-Ion аккумулятором является обязательным ввиду малой разницы минимального напряжения аккумулятора (около 3,6 В) и напряжения питания микроконтроллера +3,3±0,3 В. Общей особенностью Low Dropout стабилизаторов в смысле устойчивости к самовозбуждению является критическая чувствительность к ёмкости и ESR конденсаторов фильтра. Поэтому ёмкость конденсаторов необходимо выбирать исходя из справочных данных на микросхему, конденсаторы рекомендуется применять керамические с диэлектриками X5R или X7R на напряжение 6,3...10 В или танталовые.

Налаживание таймера сводится к установке тока через излучающий диод
оптопары U1 5...6 мА подборкой резистора R3 при уровне лог 0 на соответствующем управляющем выходе A2. Все закомментированные строки в коде, содержащие функцию Serial.print(), предназначены и оставлены для возможности отладки и вывода данных в консоль IDE. При желании воспользоваться ими следует временно отключить в коде все операторы, связанные с обращением к выводам RX/TX (GPIO 3,1, задействованные для выхода звукового сигнала и входа сброса).

Потребляемый модулем NodeMCU ток может достигать 170 мА, а максимальный выходной ток стабилизатора - 250 мА. Следовательно, суммарный выходной ток управляющих выходов при подключении нагрузки к линии питания +3,3 В не должен превышать 80 мА. Целесообразно ограничиться значением 30...50 мА. Также необходимо учесть, что максимальный ток нагрузки одного выхода ESP8266 равен 12 мА. Поэтому для коммутации нагрузки применены симисторные оптроны с номинальным значением управляющего тока 5 мА. Ток индикаторных светодиодов не превышает 5...7 мА. К выходу D4 (GPIO 2) подключён "бортовой" LED-индикатор, состояние которого дублирует внешний светодиод HL1. Подключать к этому выходу ещё и оптопару не рекомендуется. Общее число коммутируемых устройств не должно превышать четырёх, а при конфигурировании таймера следует избегать превышения числа одновременно включённых выходов более пяти. Одновременный переход всех управляющих выходов в активное состояние при наличии на каждом из них оптрона может вызвать возрастание потребляемого тока до максимально допустимого значения. Это вызовет срабатывание встроенной защиты стабилизатора и, как следствие, перезагрузку контроллера. При необходимости следует применить промежуточные каскады на переключательных n-канальных КМОП-транзисторах с напряжением открывания не более 2,5 В или маломощных биполярных транзисторах структуры n-p-n со статическим коэффициентом передачи тока не менее 200, при этом сопротивление в цепи базы транзистора должно быть не менее 100 кОм. В этом случае целесообразно в программе для NodeMCU инвертировать активный выходной уровень, сменив его на лог. 1, используя закомментированные строки с предварительным комментарием //инверсный режим в коде программы.

Если в качестве точки доступа используется смартфон или подобное устройство на базе ОС Android, дополнительных настроек, как правило, не требуется. Для роутера может понадобиться разрешить маршрутизацию протокола UDP для беспроводного интерфейса по заданному порту. Как это сделать, обычно указано в техническом описании на конкретное устройство.

Внимание! В конструкции имеются элементы, находящиеся в процессе эксплуатации под напряжением ~230 В, в связи с чем необходимо соблюдать требования электробезопасности, предъявляемые к эксплуатации электроустановок до 1000 В.

Детали. Модуль контроллера A2 - NodeMCU v3. Стабилизатор DA1 - MCP1700-3302E или HT7333 в корпусе TO-92 с напряжением стабилизации 3,3 В и максимальным током нагрузки 250 мА [4, 5]. Допустимо применить микросхему L4931. Модуль контроллера зарядки A1 - TP4056 DD05CVSA [6] или аналогичный с напряжением питания +5 В и максимальным током зарядки не менее 1 А. Его особенностью является необходимость первичного подключения полностью заряженного аккумулятора, иначе модуль его не определяет. Однако в остальном модуль вполне удобен для данного применения.

Оптрон U1 - MOC3083 (800 В) или MOC3063 (600 В) с встроенным Zero-Cross детектором и током открывания 5 мА. Микросхема музыкального синтезатора DA2 - UM66T-xxL или BT66T-xxL, где xx - любой цифровой индекс. Последний символ служит для обозначения кратности проигрывания музыкального фрагмента: L - непрерывно, S - однократно. В качестве звукового сигнализатора может быть применён любой другой, произвольной схемной реализации, включающийся подачей уровня лог. 1 (+3,3 В) с управляющего выхода D8 A2 и потребляющий от него ток не более 5 мА.

Светодиоды HL1, HL2 - Cree C503B-RCN или аналогичные сверхъяркие в корпусе диаметром 5 мм, красного или жёлтого свечения с прямым напряжением не более 2,2 В. Постоянные резисторы - С2-23Н, МЛТ, переменный резистор - СП3-4аМ сопротивлением 4,7-51 кОм. Конденсаторы С1-С6 - К10-17б ёмкостью 0,33 мкФтипоразмера 1812 или 2225 с диэлектриком X7R [7], конденсатор C7 - К73-17 на номинальное напряжение 630 В. Аккумулятор G1 - 18650 ёмкостью от 2400 мА^ч. Разъём питания XS1 - DJK-04A гнездовой 5,5х2,1 мм на панель с гайкой. Кнопка SB1 - RWD-304, DS-316 или аналогичная слаботочная без фиксации.

Конструкция таймера в целом аналогична [1]. Модули A1, A2 и все дискретные элементы, за исключением индикаторных светодиодов HL1 и HL2, размещены в ПВХ-корпусе IP54 размерами 75х75х35 мм. Индикаторные светодиоды размещают на передней поверхности выдвижных ячеек для их идентификации при срабатывании таймера. Элементы DA1, DA2, C1-C6, U1, R3 размещены на перфорированной монтажной плате с шагом отверстий 2,54 мм и размерами 20х30 мм. Модули, монтажная плата, аккумулятор и пьезоизлучатель закрепляют с помощью термоклея. Элементы HL1, HL2, SB1, R4, XS1 размещают на боковых поверхностях корпуса или его крышке исходя из требований электробезопасности, эргономических соображений и удобства доступа. Токоограничивающие резисторы R1, R2 смонтированы на выводах катодов соответствующих индикаторных светодиодов и вместе с выводами изолированы с помощью ПВХ-трубки. Все соединения выполнены гибким монтажным проводом МГТФ-0,12. Подключение нагрузки следует производить гибким многожильным проводом сечением не менее 0,75 мм2.

Литература

1. Панкратьев Д. USB-сигнализатор времени приёма лекарств. - Радио, 2017, № 1, с. 37-42.

2. MOC3083.- URL:https://www.alldatasheet.com/datasheet-pdf/pdf/ 199135/FAIRCHILD/MOC3083.html (09.09.2020).

3. UM66TXXL CMOS IC Melody Integrated Circuit. - URL: https://html.alldatasheet. com/html-pdf/173553/UTC/UM66TXXL/55/ 1 /UM66TXXL.html (09.09.2020).

4. MCP1700.-URL:https://www.microchip.com/wwwproducts/en/MCP1700 (09.09.2020).

5. HT7333 Low Power Consumption LDO. - URL:https://www.alldatasheet.com/ datasheet-pdf/pdf/1 42963/HOLTEK/ HT7333.html (09.09.2020).

6. 3,7 В 4,2 В 3 A Li-Ion зарядное устройство. - URL: https://russian.alibaba.com/ product-detaN/3-7v-4-2v-3a-li-ion-lithium-battery-charger-over-charge-discharge-overcurrent-protection-board-for-18650-tp4056-dd05cvsa-60747606987.html (09.09.2020).

7. Конденсаторы К10-17Б. - URL: https:// cxem.net/ckfinder/userfiles/comments/ 61664_K10-17B.pdf (09.09.2020).

Автор: Д. Панкратьев, г. Ташкент, Узбекистан

Мнения читателей
  • МАКСИМ_1971/27.12.2020 - 19:07

    А где можно скачать прошивку или код?