Пирометр ардуино – как проверить работоспособность через скетч для Ардуино, польза покупки и возможности сборки самодельного пирометра

Самодельный тепловизор на базе Arduino менее чем за 100$ / Habr


Не секрет что каждый из нас хоть раз но мечтал получить в свои руки настоящий тепловизор. Ведь это уникальный шанс взглянуть на мир вокруг совершенно «другими глазами», увидеть скрытое и возможно даже глубже познать суть некоторых явлений. И единственной преградой к этой мечте служит цена подобных устройств. Несмотря на весь прогресс, она остается непомерно высокой для простого смертного.
Однако подобно лучу света в непроглядном мраке безысходности на свет появилась разработка двух студентов из Германии. Их устройство на базе микроконтроллера Arduino является довольно простым в изготовлении и существует аж с 2010 года.

Создателями данного чуда являются Макс Риттер и Марк Коул из города Миндельхейм, что в Германии. Их проект принес им награду на научно-техническом молодежном форуме в 2010 году, и с тех самых пор в сети имеются исходники с подробным описанием конструкции.

Низкая стоимость устройства достигается благодаря использованию одного-единственного температурного датчика MLX90614, подобного тому, что используются в пирометрах и системы механической развертки изображения, состоящей из двух сервоприводов. Таким образом, датчик по сути обходит будущую картину, точка за точкой сканируя температуру. Само-собой, это выливается в долгое время получения изображения, что и является главным недостатком самодельного тепловизора. Но ведь если вспомнить о том, сколько мы сэкономили на цене, на это глаза сами-собой закрываются.

Итак, из компонентов для создания устройства, понадобится:

  • Старая веб-камера, разумеется, рабочая;
  • Микроконтроллер Arduino;
  • Сервоприводы, 2 штуки;
  • Датчик температуры MLX90614-BCI;
  • Китайская лазерная указка;
  • Корпуса для сервоприводов;
  • Любой штатив (оптимально).
  • Два резистора на 4.7кОм.

Веб-камера
Камера здесь будет являться источником исходной картинки а также своеобразным видоискателем для области сканирования. Подойдет практически любая дешевая вебка. Я нашел у себя в бардаке старую-добрую Logitech. Если же подходить к вопросу практично, чем меньше веб-камера по размерам, тем лучше. Поэтому огромный корпус моей старушки пришлось снять.

Сервоприводы и крепления
К этому моменту тоже можно подступиться с широким размахом. Нам понадобятся 2 сервопривода — один будет отвечать за движение по вертикали, второй по горизонтали соответственно. Учитывая, что на горизонтальном приводе держится и вертикальный и сама веб-камера, стоит взять более мощный. Хотя многие, уже сделавшие устройство спокойно пользуются одинаковыми маломощными.
Крепления для сервоприводов в оригинале называются «поворотно-наклонным механизмом» а у нас «Серво-кронштейном»
Я покупал все эти компоненты тут.
В сборе данный элемент конструкции выглядит примерно так:

Нижний привод крепится к штативу или другому корпусу/подставке туда же надо вставить и лазерную указку, к вертикальному сервоприводу приделывается веб-камера и датчик MLX90614 путем хитрых манипуляций с клеем или деталями от конструктора или например запчастями от старых электросчетчиков (как у меня).

Датчик температуры MLX90614-BCI
Самая сложная часть данной конструкции. Сложная в плане добычи. Найти его непросто (по крайней мере на отечественных сайтах) и он является самой дорогой частью конструкции. Сам я ждал его около двух месяцев, везли видимо из Китая. Подсказать где взять не смогу, ибо ту лавочку уже прикрыли. Автор проекта ссылается на Futureelectronics.
При выборе необходимо обратить особое внимание на последние буквы «BCI» в названии, что означает наличие у датчика насадки для обеспечения узкого поля зрения.
Выглядит он так:

Arduino и схема подключения
Схема подключения датчика и сервоприводов к микроконтроллеру простейшая:

Скетч для Arduino и программное обеспечение для работы с тепловизором можно скачать здесь:

Официальная страница проекта
Программное обеспечение (на JAVA)
Скетч для микроконтроллера
Также хочу обратить внимание, что авторы указывают на необходимость дополнительной настройки датчика при помощи специального скетча, что вроде как должно ускорить работу устройства. Однако в моем случае, датчик после конфигурации стал выдавать ложные значения температуры и я сделал откат.
После сборки всей схемы, ее можно поместить в корпус, и закрепить на штативе:

Небольшие пояснения:
В качестве корпуса для микроконтроллера взял пластиковую упаковку из-под автомобильного освежителя (на фото слева), он в свою очередь держится на штативе при помощи крепежа от учебного оптического прицела. В общем, строго выдержан принцип дешевизны и использования того, что было под рукой. Светится на фото фонарик, который был бонусом к лазерной указке и оказался весьма полезным при сканировании темных областей.

Процесс съемки
Зачем здесь нужен китайский лазер и как же происходит процесс сканирования легко понять на примере моего шикарного ковра:

Не удивляйтесь, что ПО на русском, просто я уже некоторое время занимаюсь его доработкой под свои нужды, попутно изучая язык Java. К несчастью, пока моих знаний недостаточно для окончательного оформления готового продукта.

Итак, на картинке с веб-камеры есть две желтые точки и точка нашего лазера (снизу по центру). Вся калибровка состоит в том, чтобы выбрать координаты центра и левого нижнего угла будущей термограммы. В этом собственно и поможет лазерная указка:

Сегодняшнее ПО поддерживает всего два типа разрешения будущей картинки, в то время, как прошлая версия была богата на это дело, насчитывая шесть разных разрешений. Особенно было забавно получать сильно «пиксельные» картинки за 15 секунд. Думаю, разработчики осознали ненужность остальных режимов и убрали их, хотя программно они остались и могут быть активированы.

Результаты на десерт
Приведенные термограммы в различном разрешении.

Как греется нетбук:

Мой Кот:

Старый счетчик:

Новый щит:

Окно:

Мой друг в темной комнате перед компьютером

Применение
Из-за большого времени сканирования, данный прибор не подходит для проведения энергетического аудита (по крайней мере, для профессионального применения), этот вопрос рассмотрен в этой Статье (Англ.).
Тем не менее, как мне кажется он мог бы стать отличным подспорьем для проверки на нагрев электрических соединений и силовых сборок. В моей практике (а я подрабатываю электриком) иногда использую этот тепловизор для оценки надежности соединений. Пирометр в данном случае проигрывает в наглядности.

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

В общем, дальнейшее развитие идеи лежит на плечах любителей и умельцев. Буду рад любым предложениям по доработке/усовершенствованию конструкции.
Спасибо за внимание!
Официальная страница проекта (Англ.)

Ардуино термометр & гигрометр с E-PAPER на nRF52832 — или о том, что забыли выпустить производители

Приветствую всех читателей Habr! В своей очередной статье снова поведу речь о ARDUINO. Хочу поделиться с вами очередным своим проектом, реализованном на микроконтролере nRF52832. Это датчик температуры и влажности на sht20 | (даташит) c монохромным дисплеем на электронных чернилах(E-INK|E-PAPER), который является частью экосистемы MySensors.
Основной его функционал это мониторинг температуры и влажности в помещении, отправка данных на контролер умного дома или непосредственно на исполнительное устройство. Ну а дополнительным функционалом является как раз вывод данных с датчика sht20, сетевой информации и уровня заряда батареи на монитор. В моей реализации это именно прямое взаимодействие непосредственно с исполнительным устройством (контроллер контуров системы отопления). Реализация неканоническая с точки зрения MySensors, мною добавлен функционал мастер-слейв режимов, типы сенсоров, привязка по воздуху. Так же в моей реализации изменена процедура инициализации транспортного уровня, т.к. логика MySensors не очень хороша для автономных девайсов. Но все это немного другая история, возможно достойная отдельной публикации, а пока статья о девайсе в традициях протокола MySensors.

Идея девайса с таким функционалом зрела в голове давно, первая попытка реализовать эту идею была предпринята на микроконтроллере atmega328. И в принципе это было сделано, но хотелось большей энергоэфективности, более красочного вывода информации на дисплей.

версия на atmega 328

При презентации датчика в сообществе иногда ссылались на девайс компании Сяоми, мол это уже есть. Но есть небольшая разница, у Сяоми это показометр, в моем случае это датчик системы умного дома с функцией показометра. Зачем дисплей? Просто иногда хочется просто повернуть голову в направлении датчика и посмотреть на температуру в комнате :).

Датчик был реализован на двух платах, за основу схемы для дисплея была взята схема от распространенных дисплеев Waveshare | Даташит. Правда позднее были внесены незначительные изменения. Мозгом датчика является чип nRF52832 в модульной реализации от HOLYIOT. Сами модули заслуживают отдельного внимания, это самая беспроблемная реализация в плане работы в Ардуино IDE. В устройстве использованы модули — YJ-16048.

За основу программной реализации работы с дисплеем был взят «экземпл» распространяемый на сайте Waveshare Electronics. Правда и тут не обошлось без доработки.

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

Питание в датчике реализовано на двух батарейках cr2450, понижает до рабочих 3.3V микросхема TPS62745DSSR1 c довольно неплохими характеристиками | даташит. На данный момент можно уверенно сказать что работать даное устройство (описываемая версия) способно 1 год.

Потребление в режиме deep sleep — ~ 25мкА (с тестовой программой). Среднее потребление в рабочем режиме ~ 9мА.

Проект является открытым, гербер фалы доступны на сайте ОпенХардВар, код программы и библиотека доступны по ссылке (гугл драйв) Почему не GitHub? Просто так получилось, в окончательной реазизации(v2) будет и там.

Отдельного разговора для решивших повторить этот девайс заслуживает тема конвертации символов нужных шрифтов в C массивы. Мой опыт это конвертация с помощью программы TheDotFactory.

Процесс постараюсь описать с картинками 🙂

Абсолютно любой шрифт, вы ограничены только возможностями памяти nRf52.… И нет смысла хранить все символы, Если вам нужны только цифры, это очень хорошо экономит место.


Еще одна проблема с которой столкнулся это обновление информации на экране. На данных дисплеях доступно частичное обновление нужной области на экране что является безусловным плюсом со стороны энергопотребления, но минусом является появление артефактов в области обновления данных от предыдущих символов.

Но и эту проблему удалось решить(см.код программы). В итоге получилось так:

В видео демонстрируется работа дисплея.


Тут демонстрируется обновление данных на экране, после доработки:


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

Пример запуска трехцветного дисплея:


Настоятельно рекомендуется (для желающих повторить) к прочтению моя тема на форуме .org по этому проекту (на английском). Если язык проблема то всегда с радостью помогу всем в чате (установка плат, работа с микроконтролерами nRF5 в среде arduino ide, советы по работе с протоколом mysensors — @mysensors_rus

Бюджетный GSM термометр на Arduino Nano

Внимание! Команды выделенные жирным шрифтом могут быть выполнены только с основного номера, так как отвечают за конфигурацию устройства. Команды можно отправлять через смс сообщения или вводить в командной строке монитора порта Arduino IDE.

Команды управления не чувствительны к регистру:
AddPhone — Добавить номер телефона. Всего может быть добавлено не более 9 номеров + 1 основной номер который автоматически сохраняется в память при первом звонке на устройство после сброса на заводские установки командами ResetPhone, FullResetили MemTest. То есть кто первый позвонил на устройство после его сброса на заводские установки тот и «главный», этот номер заносится в первую ячейку памяти и его невозможно изменить или удалить через смс.
Пример команды:

AddPhone:2+71234567891risp
AddPhone:3+71234567892s
AddPhone:4+71234567893sp
AddPhone:5+71234567894r

Синтаксис команды:

AddPhone — команда
: — разделитель
5 — записать в пятую ячейку памяти
+71234567890 — номер телефона
s — Параметр «SMS» — будет отправлено sms сообщение при срабатывании датчиков
r — Параметр «Ring» — будет совершен голосовой вызов при срабатывании датчиков
p — Параметр «Power» — будет отправлено sms сообщение при включении/отключении внешнего питания
i — Параметр «Info» — будет отправлено sms сообщение о включении или отключении оповещения при изменении температуры
При отсутствии параметров «s», «r», «p»,«i» телефон заносится в память, но никак не используется.


DeletePhone — Удалить номер телефона.
Пример команды:
DeletePhone:+71234567891

Синтаксис команды:

DeletePhone — команда
: — разделитель
+71234567891 — номер телефона


EditMainPhone — Изменить параметры «s», «r», «p», «i» основного телефона, этот номер занесён в первую ячейку памяти.
Пример команды:
EditMainPhone:spri

Синтаксис команды:

EditMainPhone — команда
: — разделитель
srpi — параметры


RingTime — Длительность тревожного голосового вызова, параметр может иметь значение от 10 до 255 секунд.
Пример команды:
RingTime:40

Синтаксис команды:

RingTime — команда
: — разделитель
40 — длительность вызова составит 40 секунд, после чего будет вызван следующий абонент.


ModemID — Принудительная установка модели используемого модема. Возможные значения: 0 — автоопределение модема, 1 — M590, 2 — SIM800l, 3 — A6_Mini.
Пример команды:
ModemID:2

Синтаксис команды:

ModemID — команда
: — разделитель
2 — ID модема.


NetCheckTime — Интервал проверки регистрации модема в сети оператора в минутах, параметр может иметь значение от 1 до 60 минут. При значении 0 проверка отключена.
Пример команды:
NetCheckTime:10

Синтаксис команды:

NetCheckTime — команда
: — разделитель
10 — каждые 10 минут будет производиться поочерёдная проверка уровня сигнала сети или проверка регистрации модема в домашней сети оператора, то есть весь цикл проверки будет занимать 20 минут. В случае отсутствия сигнала или регистрации в домашней сети модем будет перезагружен.


TempCheckTime — Интервал автоматического обновления температуры, параметр может иметь значение от 1 до 60 минут.
Пример команды:
TempCheckTime:10

Синтаксис команды:

TempCheckTime — команда
: — разделитель
10 — каждые 10 минут будет производиться снятие показаний с датчика температуры.


LowTemp — Нижний порог температуры при достижении которого будет отправлено оповещение. Параметр может иметь значение от -50 до 125 и не может превышать или равняться значению параметра HighTemp.
Пример команды:
LowTemp:25

Синтаксис команды:

LowTemp — команда
: — разделитель
25 — температура


HighTemp — Верхний порог температуры при достижении которого будет отправлено оповещение. Параметр может иметь значение от -50 до 125 и не может быть меньше или равняться значению параметра LowTemp.
Пример команды:
HighTemp:60

Синтаксис команды:

HighTemp — команда
: — разделитель
60 — температура


WatchPowerTime — Время в минутах по истечении которого будет отправлено смс сообщение об отключении внешнего источника питания. Если внешнее питание будет восстановлено до истечения установленного времени, то сообщение не будет отправлено.
Пример команды:
WatchPowerTime:5

Синтаксис команды:

WatchPowerTime — команда
: — разделитель
5 — 5 минут до отправки смс сообщения


WatchPowerOn1 — включить контроль внешнего питания, смс сообщение об отключении внешнего питания будет отправлено при условии что включено оповещение при изменении температуры (GuardOn).

WatchPowerOn2 — включить контроль внешнего питания, смс сообщение об отключении внешнего питания в любом случае будет отправлено

WatchPowerOff — выключить контроль внешнего питания

BalanceNum — Изменение номера запроса баланса и обработка длины ответа запроса. Значение по умолчанию для Beeline: #100#L22.
Пример команды:

BalanceNum:#103#L24

Синтаксис команды:

BalanceNum — команда
: — разделитель
#103# — номер запроса баланса
L24 — Длина (len) пересылаемого ответа 24 символа, обрезаем спам из запроса баланса.


Reboot — перезагрузка устройства (только Arduino)

ResetConfig — сброс настроек на заводские установки

ResetPhone — удаление из памяти всех телефонных номеров

FullReset — сброс настроек, удаление из памяти всех телефонных номеров, восстановление значения по умолчанию команды BalanceNum.

GuardOn — включить оповещение при изменении температуры
GuardOff — выключить оповещение при изменении температуры

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

TestOn — включается тестовый режим.
TestOff — выключается тестовый режим.

LedOff — выключает светодиод режима ожидания.
LedOn — включает светодиод режима ожидания.

Money — запроса баланса.

ClearSms — Удалить из памяти все sms

ListPhone — вывод в монитор порта списка сохранённых в памяти телефонов

Memtest — тест энергонезависимой памяти устройства, все настройки устройства будут сброшены, аналогично команде FullReset.

ListConfig — вывод в монитор порта текущей конфигурации устройства.

ARDUINO Термометр & гигрометр с E-INK на nRF52

Приветствую всех читателей блога Mysku!!! В данной статье хочу поделится с Вами очередным своим проектом. Это датчик температу и влажности, который является частью экосистемы MySensors, основной его функционал это мониторинг температуры и влажности в помещении, отправка данных на контролер умного дома или непосредственно на исполнительное устройство. В моей реализации исполнительное устройство это контролер контуров системы отопления. Ну а дополнительным функционалом является как раз вывод данных с датчика sht20, сетевой информации и уровня заряда батареи на монитор.

Идея девайса с таким функционалом «бродила» в голове давно, первая попытка была это сделать на atmega328. И впринципе это было реализовано, но хотелось большей энергоэфективности, более красочного вывода информации на дисплей.

версия на atmega 328

Часто указывают на то то что такие девайсы уже сделаны Сяоми, но разница есть, У Сяоми это показометр, в моем случае это датчик системы умного дома с функцией показометра. Зачем дисплей? Ну просто иногда хочется просто повернуть голову в направлении датчика и посмотреть на температуру в комнате :).


Датчик был реализован на двух платах, за основу схемы для дисплея была взята схема от распостраненных дисплеев Waveshare | Даташит. Правда позднее были внесены незначительные изменения. Дисплеи прибретались пустыми здесь. Мозгом датчика является чип nRF52832 в модульной реализации от HOLYIOT. Сами модули заслуживают отдельного внимания, это самая беспроблемная реализация в плане работы в Ардуино IDE. В устройстве использованы модули — YJ-16048.

За основу програмной реализации работы с диплеем был взят экземпл распостраняемый на сайте Waveshare Electronics. Правда и тут не обошлось без доработки. Замеры потребления дисплея соответствуют заявленным в даташите, самое главное что этот дисплей может спать а на экране остаются данные. Правда переводить в сон дисплей получилось не сразу, реализация от Waveshare этого не позволяла.
Питание в модуле реализовано на двух батарейках cr2450, понижает до рабочих 3.3V микра TPS62745DSSR1 c довольно неплохими характеристиками | даташит. На данный момент можно уверенно сказать что работать устройство способно 1 год точно.

Была проблема с которой я столкнулся это обновление информации на экране. На данных дисплеях доступно частичное обновление нужной области на экране что является безусловным плюсом со стороны энергопотребления, но минусом является появление артефактов в области обновления данных от предыдущих символов.

Но и эту проблему удалось. В итоге получилось так:

В итоге получилось так

Демонстрация работы устройсва | обновления экрана



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

Проект является открытым. Библиотека с кодом доступна на моем личном гугл драйве — drive.google.com/file/d/13wmxCt9XehJr1E2eyG1RnYsQTMb9A2LR/view Настоятельно рекомендуется к прочтению моя тема на форуме Mysensors по этому проекту (На английском). Так как эта ссылка так же не прошла модерацию то попробую описать некоторые трудности здесь, итак поехали:

Отдельного разговора для решивших повторить этот девайс заслуживает тема конвертации символов нужных шрифтов в C массивы. Мой опыт это конвертация с помощью программы TheDotFactory. (ссылку не даю, но вроде бы гуглится)

Процесс установки библиотек

Список компонентов:
PCB 2 pcs.
SW1, SW2 Buttons clocks cm 2 pcs.
J5 Connector 2×3 P6 1.27mm 1 pcs.
C1, C7, C13, C15, Condenser 100NF X7R 10% 50V 0603 4 pcs.
NRF52832, YJ-16048 1 pcs.
200×200, 1.54inch E-Ink raw display 1 pcs.
D1, LED SIDE SMD 1204 (2012) 1 pcs.
U5, FPC Pitch 0.5mm 24 pins 1 pcs.
L1, CD43 SMD Power Inductor 68uh 1 pcs.
U4, SI1304BDL N-Channel 30 V (D-S) MOSFET 1 pcs.
U2, U3, U6, MBR0530 Schottky Power Rectifier 3 pcs.
C2, C3, C4, C5, C6, C8, C9, C10, C11, Condenser 1UF X5R 10% 16V 0603 9 pcs.
C14, Condenser 10uf 10v 0805 1 pcs.
R7, Resistors 24K 1% 0805 1 pcs.
R5, R6, Resistors 4,7K 1% 0805 2 pcs.
R3, R4, Resistors 10K 1% 0805 3 pcs.
R1, Resistors 1K 1% 0805 1 pcs.
R2, Resistors 3R0 1% 0805 1 pcs.
J1, J2, J3, J4, 2.54mm Connectors Header 4 pcs.
U1, SHT20 Temperature And Humidity Sensor 1 pcs.
U1, U3 Battery holder 2 pcs.
TPS62745DSSR1, TPS62745DSSR 1 pcs.
C2, Condenser 10uf 25v 1206 XTR7 1 pcs.
C1, Condenser 10uf 16v 1206 XTR5 1 pcs.
L1, Inductance 4.7uh 1210
U2, Micro Slide Toggle Switch 1P2T 1 pcs.
R2, Resistors 1M 1% 0805 1 pcs.
R1, Resistors 160K 1% 0805 1 pcs.

Все закупалось на Али, но думаю статья будет перегружена ссылками на товары.

Процесс установки плат nRF5 в среду Ардуино:

Необходим програматор Програматор J-Link или ST-Link V2 (ссылки на Али)

Скачать последнюю версию ARDUINO IDE(Windows Installer) — линк гуглится.
(не рекомендуется скачивать Windows app Requires Win 8.1 or 10)

Запустить ARDUINO IDE.

Перейти в настройки (файл —> настройки)

В открывшемся окне настроек найти пункт «Дополнительные ссылки для менеджера плат»
Ввести ссылку №1

https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json

Ввести ссылку №2
https://raw.githubusercontent.com/mysensors/ArduinoBoards/master/package_mysensors.org_index.json

Перейти в менеджер плат (инструменты —> плата — > менеджер плат)

В открывшемся окне менеджера плат спустится вниз списка и найти Nordic Semiconductor nRF5 boards by Sandeep Mistry

Нажать на кнопку «установить» (Необходимо набратся терпения, тк в какой-то момент покажется что установка зависла. Не прерывать процесс установки!!!)

Теперь найти плату MySensors nRF5 boards by MySensors, нажать на кнопку «установить»

Установить библиотеку MySensors v2.3.0 — ссылка гуглится

Закрыть ARDUINO IDE

Скачать программу для установки USB драйверов — zadig — ссылка гуглится

Подсоеденить программатор (J-Link или ST-Link) к usb порту компьютера, Запустить программу zadig

Открыть «Options», установить галку «List All Devices»

Выбрать подсоединенный программатор из списка доступных устройств

Ниже под списком устройств, в правой части выбрать устанавливаемый драйвер — WinUSB (v6. 1. 7600. 16385)

Нажать на кнопку «INSTALL»

Желательно перезагрузить компьютер.

Запустить ARDUINO IDE

Подключить програматор в плате NRF5

Выбрать плату (инструменты —> плата —> MySensors nRF5 boards(MyBoardNRF5 nRF51822 или MyBoardNRF5 nRF52832))

Выбрать програматор (инструменты —> програматор) J-Link или ST-Link V2

Открыть скетч репитера MySensors (Файл —> Примеры —> MySensors — Repiter Node)

В скетче закоментировать — // #define MY_RADIO_NRF24 и раскоментировать #define MY_RADIO_NRF5_ESB

Заргузить скетч на плату NRF5 (Скетч —> Загрузить через програматор или просто нажав на иконку — загрузить)

Процесс компиляции достаточно длинный.



Процесс разблокировки некоторых модулей nRF5:

Проверено в Windows7 и Windows10

Необходим програматор — Програматор J-Link (ссылки на Али)

Если ранее на компьютере использовался програматор J-link, необходимо удалить все драйвера через диспечер устройств, возможно процедуру придется повторить несколько раз.

Далее необходимо скачать драйвер JLINK WINDOWS V640(не гуглится) — dropmefiles.com.ua/file?source=18112314190081213094

Установите драйвер JLINK WINDOWS V640 на компьютер.

Далее скачиваем программу nRFGO STUDIO — гуглится

Устанавливаем. ВАЖНО!!!, при установке програмы будет предложена установка драйверов для JLINK(более рання версия, нам не подходит), — ОТКАЗЫВАЕМСЯ от установки драйверов, тк ранее мы поставили правильные драйвера

Подключаем програматор к модулю nRF52832 по очень простой схеме:

VDD — VDD
GND — GND
SWDIO — SWDIO
SWDCLK — SWCLK
(названия могут немного отличатся, но общий смысл такой, плюс к плюсу, земля к земле, IO к IO, CLK к CLK)

Подключаем програматор к USB компьютера, запускаем програму nRFGO STUDIO

В открывшейся програме должен быть активен пункт — nRF5x Programming (не серого цвета, это произойдет если установили правильные драйвера V640)

Нажимаем на кнопку — Recover

После востановления на следуюшей открывшейся странице можно полностью очистить чип — Erase all

На этом все, модуль разблокирован.

Гербер файлы плат(ссылки на мой личный гугл драйв)
drive.google.com/file/d/1keT2tisy5k0hM1eYpYbmdf_0PLAdC4zI/view?usp=sharing

C радостью помогу всем в чате(установка плат, работа с микроконтролерами nRF5 в среде arduino ide, советы по работе с протоколом — @mysensors_rus

Эксперимент 15. Комнатный термометр [Амперка / Вики]

Список деталей для эксперимента

Для дополнительного задания

Принципиальная схема

Схема на макетке

Обратите внимание

Скетч

p150_bar_thermometer.ino
// Огромное количество готового кода уже написано другими людьми
// и хранится в виде отдельных файлов, которые называются
// библиотеками. Для использования кода из библиотеки, её нужно
// подключить (англ. include). Библиотека «math» даёт разные
// математические функции, в том числе функцию логарифма
// (англ. log), которая нам понадобится далее
#include <math.h>
 
#define FIRST_LED_PIN 2
#define LED_COUNT     10
 
// Параметр конкретного типа термистора (из datasheet):
#define TERMIST_B 4300 
 
#define VIN 5.0
 
void setup()
{
  for (int i = 0; i < LED_COUNT; ++i)
    pinMode(i + FIRST_LED_PIN, OUTPUT);
}
 
void loop()
{
  // вычисляем температуру в °С с помощью магической формулы.
  // Используем при этом не целые числа, а вещественные. Их ещё
  // называют числами с плавающей (англ. float) точкой. В
  // выражениях с вещественными числами обязательно нужно явно
  // указывать дробную часть у всех констант. Иначе дробная
  // часть результата будет отброшена
 
   float voltage = analogRead(A0) * VIN / 1023.0;
   float r1 = voltage / (VIN - voltage);
 
 
   float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
 
  for (int i = 0; i < LED_COUNT; ++i) {
    // при 21°С должен гореть один сегмент, при 22°С — два и
    // т.д. Определяем должен ли гореть i-й нехитрым способом
    boolean enableSegment = (temperature >= 21+i);
    digitalWrite(i + FIRST_LED_PIN, enableSegment);
  }
}

Пояснения к коду

  • Директивы для подключения библиотек #include включаются в начало программы.

  • В этом эксперименте мы подключаем библиотеку math.h для того, чтобы использовать функцию взятия натурального логарифма x log(x).

  • В переменных типа float можно хранить дробные числа, числа с плавающей точкой.

  • При использовании переменных данного типа имейте в виду:

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

    • они могут принимать значения от -3.4028235×1038 до 3.4028235×1038,

    • при этом количество значащих цифр может быть 6-7: всех цифр, не только после запятой!

    • точность вычислений с такими данными невелика, у вас могут возникнуть неожиданные ошибки, например, при использовании float в условном операторе. Не полагайтесь на точность!

    • вычисления с float происходят медленнее, чем с целыми числами

  • Показания термистора связаны с температурой нелинейно, поэтому нам приходится использовать такую громоздкую формулу.

Вопросы для проверки себя

  1. Как нужно подключить термистор, чтобы получать на Arduino данные о температуре?

  2. Каким образом можно воспользоваться ранее разработанными функциями, не переписывая их в программный код?

  3. Чем неудобно использование чисел с плавающей точкой на Arduino?

  4. Что за выражение стоит справа от = при объявлении булевой переменной enableSegment?

Задания для самостоятельного решения

  1. Измените код программы таким образом, чтобы индикатор включался при 0 градусов и его показания прирастали на одно деление каждые 5 градусов.

  2. Добавьте в схему пьезопищалку и доработайте программу так, чтобы срабатывала звуковая сигнализация при достижении температуры, например, 25 градусов.


← Счётчик нажатий | Оглавление | Метеостанция →

Arduino + ESP8266 с нуля на примере Wi-Fi термометра, часть первая / Habr

Часть 1. Подготовка ESP8266

Зачем эта статья? На хабре уже есть ряд статей про использование ESP в разных конфигурациях, но почему-то без подробностей о том, как именно все подключается, прошивается и программируется. Типа «я взял ESP, две пальчиковые батарейки, DHT22, закинул в коробку, потряс часик и термометр готов!». В итоге, получается странно: те, кто уже работают с ESP не видят в сделанном ничего необычного, а те, кто хочет научиться — не понимают с чего начать. Поэтому, я решил написать подробную статью о том, как подключается и прошивается ESP, как его связать с Arduino и внешним миром и какие проблемы мне попадались на этом пути. Ссылки на Aliexpress привожу лишь для представления порядка цен и внешнего вида компонентов.

Итак, у меня было два микроконтроллера, семь разных сенсоров, пять источников питания, температурный датчик DHT22 и целое множество проводков всех сортов и расцветок, а так же бессчетное количество сопротивлений, конденсаторов и диодов. Не то, чтобы все это было необходимо для термометра, но если уж начал заниматься микроэлектроникой, то становится трудно остановиться.



Питание

Для работы ESP8266 нужно напряжение 3.3В и ток не ниже 300мА. К сожалению, Arduino Uno не в состоянии обеспечить такой ток, как не в состоянии обеспечить его и переходники USB-UART (программаторы) типа FT232RL — их предел около 50мА. А значит придется организовать отдельное питание. И лучше бы, чтобы Arduino тоже работал от 3.3В, чтобы избежать проблем типа «я подал пятивольтовый сигнал на вывод RX модуля ESP, почему пахнет паленой пластмассой?».

Есть три решения.

1. Купить готовый блок питания на 3.3В.

2. Купить готовый модуль с регулятором напряжения, понижающий 5В до 3.3В. Пожалуй, это самый удобный вариант.

3. Собрать модуль самому из регулятора AMS1117 и одного танталового конденсатора на 22мкФ.

Я выбрал третий пункт, поскольку мне часто нужно 3.3В, я жадный и я люблю встраивать регуляторы прямо в блоки питания.

С AMS1117 все просто: если положить его текстом вверх, то напряжение на ногах растет слева направо: 0(Gnd), 3.3В (Vout), 5В (Vin).
Между нулем и выходом нужен танталовый конденсатор на 22мкФ (так по инструкции, что будет если поставить электролитический — я не проверял). У танталового SMD-конденсатора плюс там, где полоска. Немного чудовищной пайки совершенно не предназначенных для такого варварства SMD-компонентов и:

Обязательно проверяйте выходное напряжение. Если оно значительно меньше 3.3В (например, 1.17В) — дайте регулятору остыть после пайки и проверьте контакты. Если поставите конденсатор больше, чем на 22мкФ, то мультиметр может показать более высокое напряжение.

Почему именно AMS1117? Он широко используется. Его вы можете найти почти везде, даже в Arduino Uno, как правило, стоит AMS1117-5.0.
Если вы знаете что-то схожих габаритов и цены, еще более простое в использовании — напишите, пожалуйста.

Важный момент. Не знаю уж почему, но AMS1117 крайне капризно относится к качеству соединений. Контакты должны быть надежны. Лучше — пропаяны. Иначе он на тестах выдает 3.3В, но под нагрузкой не выдает ничего.

Подключение ESP8266

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

Чтобы чип запустился нужно соединить VCC и CH_P через резистор 10кОм. Если такого нет, то сгодится любой из диапазона 1-20кОм. Кроме того, конкретно модель 07 еще требует, чтобы GPIO15 (самый ближний к GND) был «на земле» (этого на картинке не видно, потому что соединение с другой стороны).

Теперь берем переходник USB-UART, переключаем его на 3.3В и подключаем RX к TX, TX к RX и GND к «земле» (у меня без этого передача нестабильна). Если вы не можете переключить на 3.3В, то можно использовать простейший резисторный делитель напряжения: соедините ESP RX с TX переходника через сопротивление в 1кОм, а ESP RX с «землей» через 2кОм. Существует масса более сложных и более надежных способов связать 3.3В и 5В, но в данном случае и так сойдет.

И соединяемся на скорости 9600 по нужному COM-порту (можно посмотреть в диспетчере устройств).

Я использую SecureCRT, Putty тоже подойдет, а ценители Линукса и так знают, что делать и где смотреть.

(AT+RST перезагружает чип)

Если ничего не происходит — выключите — включите питание, если все равно ничего не происходит — проверьте соответствие TX/RX, попробуйте переставить их местами или припаять к чипу.

Иногда чип в ходе издевательств экспериментов зависает и тогда его надо обесточить, в том числе отключив и переходник (например, вытащив его из USB), поскольку чипу хватает даже поступающих крох питания, чтобы упорно тупить и не работать.

Иногда фокусы с переходником вешают USB-порт. Можно в качестве временного решения использовать другой USB-порт, но вообще лучше перезагрузить компьютер.

Иногда при этом меняется номер COM-порта. Под Linux это можно решить с помощью udev.

Если вместо текста приходит мусор, то проверьте настройки скорости. Некоторые старые чипы работают на 115200.

На старте чип нагревается, но если он реально горячий и продолжает греться — отключайте и проверяйте все соединения. Чтобы на корпус не попадало +3.3В, чтобы 5В к нему вообще никуда не приходили, чтобы «земля» переходника была соединена с «землей» чипа. Модели с металлическим экраном очень трудно сжечь (но нет ничего невозможного), а на модели без экранов жалуются, мол даже небольшая ошибка может стать последней в жизни чипа. Но это я не проверял.

Прошивка

Мой выбор — NodeMCU. У нее проблемы с памятью и поддержкой железа, но это многократно окупается простотой кода и легкостью отладки.

Так же потребуются NodeMCU flasher и LuaLoader (последнее — опционально, есть и другие клиенты для работы с этой прошивкой).

Выключаем чип. Подсоединяем GPIO0 к земле и включаем чип:

Если ничего не происходит и поля AP MAC/STA MAC пустые — проверьте еще раз, чтобы GPIO0 был на «земле».
Если прошивка началась, но зависла — посмотрите в закладке Log, у меня почему-то конкретно этот чип отказался прошиваться на FT232RL, но зато без проблем прошился на PL2303HX на скорости 576000. PL2303HX в указанном варианте не имеет переключения на 3.3В, чтобы им воспользоваться нужно открыть пластиковый корпус и перепаять провод с 5V на 3.3V, есть варианты с пятью выходами: 3.3, 5, TX, RX, Gnd.


Обратите внимание: STA MAC поменялся. Подозреваю, что flasher его неправильно показывал, но требуется проверка.

Для экономии сил и нервов можно взять готовый или полуготовый вариант.

Есть одноразовые адаптеры с удобной разводкой.
Есть готовые к прошивке.
Есть варианты с простенькие кит-комплекты и посложнее — ESP8266-EVB
Есть с готовым USB-адаптером — NodeMCU Development Board. Под нее даже какие-то шилды делают.

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

Ценные ссылки из комментариев:
NodeMCU custom builds
Programming ESP8266-EVB with Arduino IDE
Объяснение про танталовый конденсатор.

Update: заменил в тексте «программатор» на «переходник USB-UART» или просто «переходник». По моему опыту термин «программатор» используется чаще, но, пожалуй, «переходник USB-UART» будет точнее.

Author:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *