TransistorSoldering_V3.0

TransistorSoldering_V3.0 Как паять

Недавно, при ремонте аппаратуры, у меня возникла острая необходимость в термофене для замены SMD компонентов на плате. Поискав в интернете я наткнулся на интернет магазин, в котором в продаже был термофен 858, но он слишком дорогой для меня, поэтому я просто купил ручку за 8$! А блок управления решил построить самостоятельно на Arduino.

667473439.jpg

 Ручка поставляется с 8 проводами:

2778248630.png

  • серый и белый провод — нагреватель, он работает от 220В переменного тока;
  • синий и коричневый провод — вентилятор постоянного тока 24 В, плюс синий, земля коричневый;
  • зеленый и жёлтый провод — геркон зеленый, земля желтый;
  • красный и черный провод — термопара, красный (плюс) и черный земля.

Управление нагревом ручкои термофена

Цель действительно проста: включать и выключать нагрев с помощью логической команды 5v.

Но просто так нельзя это сделать с 220 В переменного тока. Простое решение: симистор и оптопара.

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

Я применил оптопару moc3063 и симистр BTA140-800

2566429702.png

Управление вентилятором. Вентилятор работает от 24 В постоянного тока, его необходимо включать всегда, когда фен горячий.

Тут все просто, есть две команды:

  • включить вентилятор с помощью Arduino
  • второй — контроль скорости.

718815254.png

Примечание: тут комплектующие не самые лучшие, брал то, что было в наличии, но всё отлично работает!

Всеми процессами управляет ардуино нано. Для измерения температуры я использовал модуль с  mac6675, подключаемый напрямую к термопаре ручки.

С Arduino max6675 подключается через spi, а ее библиотека очень проста в использовании.

Для управления температурой я установил 2 кнопки и ЖК-дисплей. ЖК-дисплей управляется по i2C, это излишество, но у меня был только такой дисплей, поэтому я его использовал!

Для наглядности работы установил светодиод, который загорается при включении нагревателя.

397961638.png

Мой код самый простой из возможных:

Во-первых: на данный момент я не использую геркон, поэтому фен всегда остаётся включенным, даже когда ручка лежит!

Программа работает очень просто: считываем температуру, если она ниже установленной, включаем нагреватель, и выключаем его, когда она достигает цели!

Температура выставляется двумя кнопками.

Конечно, это не идеально, но я подумал, что это будет хорошей отправной точкой для всех новичков в электронике.

Дополнительные файлы к статье тут

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

Содержание
  1. Назначение устройства и органы управления
  2. Устройство и принцип действия
  3. Список деталей, стоимость
  4. Итак, перечень деталей:
  5. Дополнительные материалы
  6. Фотогалерея
  7. Презентация:
  8. ИК паяльная станция ⁠
  9. Правила сообщества
  10. Благодарности пост ⁠
  11. Ответ на пост «Про комплименты мужикам» ⁠
  12. О музыке ⁠
  13. И снова они ⁠
  14. Работодатели Саратова. Угрозы в режиме онлайн. Таких идиотов еще поискать. Прошу предать огласке ⁠
  15. Арендодатель Михаил ⁠
  16. Человек, 8 лет правивший Ираном, едет на работу на автобусе ⁠
  17. Звучит как план ⁠
  18. Любовный Брендинг на грани ⁠
  19. TransistorSoldering_V3.0
  20. Паяльная станция на Ардуино — версия 3.0
  21. Оглавление
  22. Описание проекта
  23. Что это?
  24. История
  25. Что дальше?
  26. Настройки в коде прошивки
  27. Описание папок в репозитории
  28. Материалы и компоненты
  29. FAQ
  30. Основные вопросы
  31. Введение
  32. Схема устройства
  33. Создание и проектирование платы
  34. Пайка компонентов
  35. Разработка программного обеспечения
  36. Энергопотребление
  37. Сбор данных
  38. Дальнейшие планы
  39. Аварийные ситуации
  40. Дальность работы
  41. Корпус устройства
  42. Датчик влажности почвы

Назначение устройства и органы управления

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

Главное отличие нашего паяльника (и фена) от обычного — это постоянный контроль температуры! Если я задал температуру в 300 градусов, то на жале паяльника будет поддерживаться именно эта температура с самыми небольшими отклонениями. Этот паяльник не нужно регулярно вынимать из розетки, как обычный, и не нужно снова вставлять в розетку когда он остыл. Той же функцией обладает и фен.

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

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

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

Устройство и принцип действия

TransistorSoldering_V3.0Основой устройства я считаю печатную плату разработки и изготовления товарища Kamik. В центре этой платы расположилась колодка, в которую установлен контроллер Arduino Nano V3. Контроллер подаёт сигналы на три MOSFET-транзистора, которые плавно управляют тремя нагрузками: Нагревательные элементы паяльника и фена, а также вентилятор фена. Также на плате есть подстроечные резисторы для настройки термопар паяльника и фена, а также множество колодок и разьёмов для подключения фена и паяльника (через разьёмы GX-16), экран, кнопки включения фена и паяльника и потенциометров. Также прямо на плату приклеен понижающий модуль LM2596 для понижения напряжения с 24в до 5вольт с целью питания самой ардуины и ЖК-экрана. Вентилятор и нагреватель фена работают от напряжения 220в, паяльник — от 24в. Для питания паяльника присутствует отдельный блок питания 220в->24в, заказывался из китая. Пятивольтовые потребители питаются от понижайки LM2596.

Фен и паяльник присоединяются к паяльной станции при помощи разьёмов GX16 с восемью и пятью контактами соответственно. Для присоединения шнура питания 220в предусмотрено специальное гнездо со встроенным выключателем и предохранителем.

Список деталей, стоимость

Мы с товарищами решили собрать сразу несколько таких паяльных станций, поэтому на некоторых деталях из Китая нам удалось сэкономить за счёт мелкооптовых партий: мы специально искали лоты где нужные нам детали продаются по 5 штук а в некоторых случаях (например потенциометры) — и по 20шт. В результате, себестоимость одной станции (без корпуса) составила около 40$.

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

Итак, перечень деталей:

  • Печатная плата (травить самостоятельно) — 7.5$
  • Контроллер Arduino Nano V32$
  • Паяльник 24в8.66$
  • Фен10,49$
  • Блок питания 24в6.61$
  • Понижающий модуль LM25960.99$
  • Гнездо 220в с выключателем и предохранителем — 0.87$
  • MOSFET-транзисторы IRFZ44 — 2шт. — 0,62$
  • Симистор BTA138
  • Дисплей 16022.35$
  • Потенциометры 10КОм 3шт — 0.72$
  • Ручки потенциометров 3шт — 0.46$
  • Кнопочные выключатели 2шт — 0.62$
  • Штекеры GX-16 (1шт 5pin и 1шт 8pin) — 1,7$

Дополнительные материалы

И теперь, наконец-то предлагаю Вашему вниманию прошивку паяльной станции: СКЕТЧ.

Схему разводки печатной платы.

А так же скетч I2C-Сканера, который поможет вам узнать адрес вашего экрана в шине I2c, ведь его адрес придётся прописывать в вышеуказанный скетч.

Фотогалерея

Презентация:

Бонусом предлагаю посмотреть спонтанную презентацию этой паяльной станции.

ИК паяльная станция

Да да, очередная, но у меня первая. И самодельная, ибо денег нет но вы держитесь.
Собрана из того что было:
Бп на 12 вольт, ардуино нано, конфорка от ИК плитки, 4 линейные галогенки, 2 ДХО на подсветку, дисплей Нокиа 5510, кулеры со старых серверов, всякий нержавеющей металл, горсть радиодеталей. Программу написал за несколько вечеров на работе, в ардуино иде.

ИК паяльная станция Пайка, Arduino, Инфракрасная паяльная станция, Своими руками, Длиннопост

ИК паяльная станция Пайка, Arduino, Инфракрасная паяльная станция, Своими руками, Длиннопост

ИК паяльная станция Пайка, Arduino, Инфракрасная паяльная станция, Своими руками, Длиннопост

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

ИК паяльная станция Пайка, Arduino, Инфракрасная паяльная станция, Своими руками, Длиннопост

Плата изготовлена методом лут, схема (вместе с клавиатурой). Кнопки взяты готовые, с мёртвого телека

ИК паяльная станция Пайка, Arduino, Инфракрасная паяльная станция, Своими руками, Длиннопост

ИК паяльная станция Пайка, Arduino, Инфракрасная паяльная станция, Своими руками, Длиннопост

ИК паяльная станция Пайка, Arduino, Инфракрасная паяльная станция, Своими руками, Длиннопост

Верхний нагреватель, собран из алюминиевого профиля, линейных галогенок 4х150 вт, включённых по 2 последовательно. Мощности с избытком, ограничил на 60% и всё равно программа отключает в процессе, т.к. температура набирается быстрее, чем указано в профиле

ИК паяльная станция Пайка, Arduino, Инфракрасная паяльная станция, Своими руками, Длиннопост

ИК паяльная станция Пайка, Arduino, Инфракрасная паяльная станция, Своими руками, Длиннопост

ИК паяльная станция Пайка, Arduino, Инфракрасная паяльная станция, Своими руками, Длиннопост

711 плюсов 13 минусов

Аватар сообщества "Arduino & Pi"

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте — используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

Лучшие посты за сегодня

Благодарности пост

Благодарности пост Благодарность, Ежедневник, Подарки, Длиннопост, Скриншот, Комментарии на Пикабу

Даже не думал, что получу, но списались, отправил адрес

Благодарности пост Благодарность, Ежедневник, Подарки, Длиннопост, Скриншот, Комментарии на Пикабу

Благодарности пост Благодарность, Ежедневник, Подарки, Длиннопост, Скриншот, Комментарии на Пикабу

Благодарности пост Благодарность, Ежедневник, Подарки, Длиннопост, Скриншот, Комментарии на Пикабу

Ответ на пост «Про комплименты мужикам»

Мне 35+ и я женщина,но шанс получать комплименты не оставили мне заурядная внешность и скудные интеллектуальные данные. Но ровно полгода назад это случилось, делала скт и пришла к лор- врачу, она посмотрела мои снимки и воскликнула:

— Какой череп! Какие воздушные кости!

Я честно несколько смутилася и сразу спросила:

На что девушка мне парировала, то такой красивый рисунок черепа редко встретишь и он очень эстетичен.

И этим фактом я поделилась, пожалуй,со всеми знакомыми мне людьми. И, думаю, помнить об этом буду ещё очень долго.

О музыке

О музыке Музыка, Скриншот, Юрий Лоза, Twitter

киньте свои варианты в комменты

И снова они

И снова они Агентство недвижимости, Риэлтор, Фламп, Новосибирск, Жилфонд, Скриншот, Длиннопост, Переписка

И снова они Агентство недвижимости, Риэлтор, Фламп, Новосибирск, Жилфонд, Скриншот, Длиннопост, Переписка

Работодатели Саратова. Угрозы в режиме онлайн. Таких идиотов еще поискать. Прошу предать огласке

Итак, собственно сабж. Некий идиот нанимает работяг, а через какое-то время кидает их. Вот в местном паблике пост:

Работодатели Саратова. Угрозы в режиме онлайн. Таких идиотов еще поискать. Прошу предать огласке Негатив, Угроза, Огласка, Длиннопост, Скриншот, Переписка, Саратов, Без рейтинга

Этот герой начал отмечать в комментариях:

Работодатели Саратова. Угрозы в режиме онлайн. Таких идиотов еще поискать. Прошу предать огласке Негатив, Угроза, Огласка, Длиннопост, Скриншот, Переписка, Саратов, Без рейтинга

Далее пошли угрозы:

Работодатели Саратова. Угрозы в режиме онлайн. Таких идиотов еще поискать. Прошу предать огласке Негатив, Угроза, Огласка, Длиннопост, Скриншот, Переписка, Саратов, Без рейтинга

Все сначала думали, что это тролль, но нет, это реально директор какого-то общепита.

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

Работодатели Саратова. Угрозы в режиме онлайн. Таких идиотов еще поискать. Прошу предать огласке Негатив, Угроза, Огласка, Длиннопост, Скриншот, Переписка, Саратов, Без рейтинга

Зная силу пикабу, просто хочется поджечь как следует этого идиота

Работодатели Саратова. Угрозы в режиме онлайн. Таких идиотов еще поискать. Прошу предать огласке Негатив, Угроза, Огласка, Длиннопост, Скриншот, Переписка, Саратов, Без рейтинга

Анонимно. Без рейтинга. Может Саратов очистится хоть от одного такого кретина?

Арендодатель Михаил

Дело было пару лет назад, после развода. Денег впритык, нужно копить первый первый взнос и поднимать с колен бизнес после пандемии (фактически с нуля, имея только знания)
Искал квартиру максимально дёшево и нашел. КГТ 23 кв.м. общей площади за 12.500 руб, включая к/у.
Арендодатель Михаил выдал ключи, номер, куда деньги переводить и сразу сделал скидку за сломанный диван (в итоге я его починил за час)
Когда сгорел автомат стоимость его замены просто вычел из аренды.
За полгода аренды сам позвонил раза 3, только поинтересоваться, всё ли хорошо.
Поддержал, когда новая пассия кинула меня и свинтила к более успешному.
Если вы это читаете, Михаил, или его сын — знайте, вы замечательные люди, здоровья вам!

Человек, 8 лет правивший Ираном, едет на работу на автобусе

Махмуд Ахмадинежад — иранский политический и государственный деятель, шестой президент Исламской Республики Иран с 3 августа 2005 по 3 августа 2013 года. Прежде чем стать президентом, занимал пост губернатора провинции Ардебиль и губернатора Тегерана. На фото Ахмадинежад, пользуется общественным транспортом. Под фотографией сделана запись, что за 8 лет президентства Ахмадинежад не получил из госбюджета ни одного риала и жил на преподавательскую зарплату. Во время своего президентства не инициировал принятие закона «Об экс-президентах», чтобы получать высокую пенсию. Он снова вернулся к преподавательской деятельности и ездит на работу на автобусе.

Человек, 8 лет правивший Ираном, едет на работу на автобусе Иран, Президент, Преподаватель, Старое фото, Фотография, Ахмадинежад

Звучит как план

Звучит как план Мастурбация, Скриншот, Комментарии на Пикабу, План, Длиннопост

Логотипер. Брендинг на грани

Любовный Брендинг на грани

Проникновенное поздравление и небольшая любовная подборка на грани. Всех с днём влюблённых!

Любовный Брендинг на грани Юмор, Игра слов, Маркетинг, Каламбур, Дизайн, Логотип, Нейминг, Знакомства, Приложение, Слоган, 14 февраля - День святого Валентина, Боги маркетинга, Креатив, Идея, Праздники, Поздравление, Бренды, Открытка, Длиннопост

Любовный Брендинг на грани Юмор, Игра слов, Маркетинг, Каламбур, Дизайн, Логотип, Нейминг, Знакомства, Приложение, Слоган, 14 февраля - День святого Валентина, Боги маркетинга, Креатив, Идея, Праздники, Поздравление, Бренды, Открытка, Длиннопост

Любовный Брендинг на грани Юмор, Игра слов, Маркетинг, Каламбур, Дизайн, Логотип, Нейминг, Знакомства, Приложение, Слоган, 14 февраля - День святого Валентина, Боги маркетинга, Креатив, Идея, Праздники, Поздравление, Бренды, Открытка, Длиннопост

Любовный Брендинг на грани Юмор, Игра слов, Маркетинг, Каламбур, Дизайн, Логотип, Нейминг, Знакомства, Приложение, Слоган, 14 февраля - День святого Валентина, Боги маркетинга, Креатив, Идея, Праздники, Поздравление, Бренды, Открытка, Длиннопост

Любовный Брендинг на грани Юмор, Игра слов, Маркетинг, Каламбур, Дизайн, Логотип, Нейминг, Знакомства, Приложение, Слоган, 14 февраля - День святого Валентина, Боги маркетинга, Креатив, Идея, Праздники, Поздравление, Бренды, Открытка, Длиннопост

Любовный Брендинг на грани Юмор, Игра слов, Маркетинг, Каламбур, Дизайн, Логотип, Нейминг, Знакомства, Приложение, Слоган, 14 февраля - День святого Валентина, Боги маркетинга, Креатив, Идея, Праздники, Поздравление, Бренды, Открытка, Длиннопост

Любовный Брендинг на грани Юмор, Игра слов, Маркетинг, Каламбур, Дизайн, Логотип, Нейминг, Знакомства, Приложение, Слоган, 14 февраля - День святого Валентина, Боги маркетинга, Креатив, Идея, Праздники, Поздравление, Бренды, Открытка, Длиннопост

Любовный Брендинг на грани Юмор, Игра слов, Маркетинг, Каламбур, Дизайн, Логотип, Нейминг, Знакомства, Приложение, Слоган, 14 февраля - День святого Валентина, Боги маркетинга, Креатив, Идея, Праздники, Поздравление, Бренды, Открытка, Длиннопост

Любовный Брендинг на грани Юмор, Игра слов, Маркетинг, Каламбур, Дизайн, Логотип, Нейминг, Знакомства, Приложение, Слоган, 14 февраля - День святого Валентина, Боги маркетинга, Креатив, Идея, Праздники, Поздравление, Бренды, Открытка, Длиннопост

Любовный Брендинг на грани Юмор, Игра слов, Маркетинг, Каламбур, Дизайн, Логотип, Нейминг, Знакомства, Приложение, Слоган, 14 февраля - День святого Валентина, Боги маркетинга, Креатив, Идея, Праздники, Поздравление, Бренды, Открытка, Длиннопост

Сбрендил для вас,

TransistorSoldering_V3.0

Паяльная станция на Ардуино — версия 3.0

IMAGE

Оглавление

Описание проекта

Что это?

Это один из крупнейших моих проектов — паяльная станция на основе Ардуино и паяльника от паяльной станции Lukey 702. Крупнейшим он является не по количеству входящих в него деталей, а по времени работы над ним и количеству промежуточных версий. Самая первая была собрана 16 июня прошлого уже 2017 года. Вот видео про нее: https://vk.com/wall367284984_1137. 19 июня была собрана версия 2.0, уже имевшая экран. Но проект был внезапно закончен по техническим причинам: в Ардуино УНО из-за КЗ 5-вольтовой линии на землю и последовавшего за ним выхода из строя стабилизатора питания в 5-вольтовую часть станции попало напряжение 17 вольт. Микроконтроллер и операционный усилитель чудом уцелели, а вот экран и встроенный в дуню программатор выпустили волшебный дымок и перестали работать (как известно, все электронные компоненты работают за счет него). Ну и совсем недавно была разработана последняя на сегодняшний момент версия 3.0. В ней был добавлен режим сна, был оптимизирован вывод информации на экран, а также реле включения паяльника было заменено на мощный полевой транзистор IRF3205 для последующей разработки режимов поддержания температуры. Заморский англоязычный интерфейс был заменен родным русским, паяльник стал подключаться через удобный разъем, регулировка температуры была реализована на энкодере, а все устройство было убрано в небольшой деревянный корпус.

История

Мне давно хотелось сделать переносную паяльную станцию на аккумуляторе. Гугление выдавало то, что люди делают аккумуляторные паяльники по типу выжигателя (импульсные). Так как в трудные времена (когда после летних каникул я забыл паяльник в деревне) я паял детским выжигателем, что было ну очень неудобно, мне эта конструкция не понравилась. И тут я решил узнать про паяльники от паяльных станций, про которые я слышал, что они очень быстро греются. И когда я пошел в магазин радиодеталей я купил первый попавшийся паяльник от станции «Lukey 702». Именно им я паяю постоянно и именно он подключается к моей станции. Тогда мне улыбнулась удача — паяльник оказался на 24 вольта 50 ватт и он отличто работал от блока питания зарядника шуруповерта на 17 вольт. Я тогда уже знал про великое творение китайцев — повышающие модули. И когда у меня появился такой (был куплен для питания усилителя звука), я решил попробовать все 24 вольта с аккума от модели на 12 вольт. Паяльник разогрелся за считанные секунды. Тогда то и было положено начало этому проекту.

Что дальше?

Планируется дорабатывать прошивку для повышения удобства работы, т. к. в этой версии, например, используется обработка энкодера без прерываний, которую я хочу в будующем доработать с помощью PCINT (Pin Change INTerrupts — прерывания на всех пинах микроконтроллера). Ну и конечно же будет придумано крепление модельного акума, внутрь будет установлен повышающий модуль, а сверху — ручка для переноски.

Настройки в коде прошивки

#define MIN_PRESET    200// Минимальная устанавливаемая температура
#define MAX_PRESET   480// Максимальная устанавливаемая температура

Описание папок в репозитории

  • libraries — требуемые для компиляции прошивки библиотеки — закинуть в C://Program Files/Arduino/libraries
  • src — код прошивки
  • scheme — схемы подключения
  • Readme_src — это вам не надо — это картинки, вставленные в README.md

Материалы и компоненты

FAQ

Основные вопросы

В: Скачался какой то файл .zip, куда его теперь?
О: Это архив. Можно открыть стандартными средствами Windows, но думаю у всех на компьютере установлен WinRAR, или, на крайний случай, 7-zip, архив нужно правой кнопкой и извлечь.

В: Я совсем новичок! Что мне делать с Ардуиной, где взять все программы?
О: Читай и смотри видосы, например, тут

В: Компьютер никак не реагирует на подключение Ардуины!
О: Возможно у тебя зарядный USB кабель, а нужен именно data-кабель, по которому можно данные передавать
О: Если у тебя китайская Ардуино, то для нее надо поставить драйвера, гугли «Драйвера CH340G» или сразу лезь сюда

В: Сколько стоит?
О: Ничего не продаю, а по отдельности зависит от уровня инфляции в стране и мест покупки комплектующих)))

Просмотры

Почти все созданные датчики
Почти все созданные датчики

Введение

Smart_U — студенческий проект по созданию метеодатчиков для контроля микроклимата в различных помещениях. В статье рассказывается о разработке проекта, используемых технологиях, возникших ошибках и т.д. Сразу скажу, что набор компонентов довольно банален: микроконтроллеры Atmegа328(168), датчик температуры и влажности HTU21D, датчик интенсивности света MAX44009/BH1750, LoRa для передачи данных и в качестве эксперимента — ёмкостной датчик влажности почвы.

Идея создания метеодатчиков возникла по причине отсутствие в одном из производственных зданий каких-либо систем контроля температуры в помещениях: батареи отопления — чугунные, без возможности их регулировки, а существующий контроль сводился только к контролю температуры теплоносителя на входе и выходе из здания. Из-за этого создавался существенный перекос температуры по помещениям здания: 30 градусов тепла в ближайших помещениях к теплоузлу, а в удаленных 18. Понятно, что с помощью датчиков температуры эту проблему не решить, но сбор статистики и аналитики вполне возможен. С небольшой группой студентов под чутким руководством преподавателя приступили к поиску решения.

Схема устройства

Заранее определили показатели, которые хотелось фиксировать:

  • в тестом варианте был также добавлен датчик качества воздуха (tvOC);

  • далее в качестве эксперимента был добавлен ёмкостной датчик влажности почвы.

Для беспроводной передачи данных протокол выбрали LoRa на 433 МГц, на максимально разрешённой мощности в России 10 мВт, позволяющий передавать данные на относительно большие расстояния внутри зданий. Сами метеодатчики должны быть компактными и энергоэффективными. В качестве источника питания остановились на 2АА батарейках с теоретической емкостью 1500мАч до напряжения 2 вольта (минимальное напряжение при котором микроконтроллер и передатчик стабильно работали).

За основу на этапе разработки метеостанции выбрали стандартный набор компонентов:

Создание и проектирование платы

Тестовый вариант собрали навесным монтажом с использованием макетной платы, провода МГТФ и готовых модулей. Все работало, но судя по показаниям мультиметра потребляло около 50 мА, что давало нам 40 часов работы.

Первый собраный вариант
Первый собраный вариант

Устройство хотелось сделать миниатюрным, дешевым и энергоэффективным, поэтому решили создавать свою плату с минимальным числом элементов и использовать «голые» компоненты. Среди участников проекта не было специалистов по разработке платы, поэтому насмотревшись видеороликов начали «творить» в Easyeda. Для начала просто соединили все устройства между собой и добавили необходимую обвязку согласно даташитам, подключили к нужным ногам микроконтроллера. Использовать решили внутренний тактовый генератор Atmega на частоте 8 МГц(использовали модифицированное ядро от AlexGyver). Дальше добавили конденсаторы по питанию, увидев такие рекомендации в интернете. Вывели дополнительные контакты для прошивки и питания микроконтроллера. Изготовление плат заказали в JLCPCB, обошлось в 2$ + 8$ доставка (3 раза).

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

    1 вариант платы
    1 вариант платы
  2. Второй вариант плат оказался работоспособен, добавили тестовые точки для замера напряжений и сопротивлений, которые очень сильно упростили отладку в поиске коротких замыкании и неправильного подключения компонентов. Но без ошибок опять не обошлось: ошиблись с размером разъёма для прошивки — вместо шага 2.54мм установили что-то меньшего размера. Также оказалось, что Lora модуль мешает прошивки Atmega с использованием ISP программатора. Погуглив, нашли решения в виде 3 резисторов на 500 Ом по шинам MOSI, MISO, SCK. На основе этих плат было создано 3 устройства, которые сейчас продолжают работать в тестовом режиме уже более 5 месяцев. 

    2 вариант платы
    2 вариант платы
  3. Сейчас ждём 3 заказ плат (которые были отправлены в феврале, но, к сожалению, так и не пришли) Получили 3 вариант платы, где датчик MAX44009 был заменён на более дешевый BH1750 и добавлена вся необходимая обвязка для него, а также в качестве эксперимента добавили емкостной датчик для измерения влажности почвы. 

    3 вариант платы
    3 вариант платы

Пайка компонентов

Паяльная маска датчика освещенности и зубочистка
Паяльная маска датчика освещенности и зубочистка

Все конденсаторы и резисторы в форм-факторе SMD0805, ATmega328P-AU в корпусе TQFP-32, датчик температуры в DFN, а датчик влажности BH1750 WSOF6I и мы посчитали, что наших «прямых» рук будет недостаточно. Для уверенной пайки этих компонентов приобрели подогреваемый столик: питается от 220 вольт, размер 50×80мм, никаких регулировок не имеет, разогревается до 230-250 градусов. Данный аппарат сделал пайку всех компонентов гораздо проще и быстрее: в нужные места накладываем паяльную пасту, расставляем компоненты, включаем подогрев, ждем когда паста расплавится, выключаем, ждем до полного остывания. Для проверки качества пайки использовали максимально дешевый и простой микроскоп AOMEKIE 20X/40X.

Для удобства прошивки использовали прищепку, на которую выведены 2×4 pogo пина с шагом 2,54 мм. На плате вывели контакты RX, TX, GND, VCC, MOSI, MISO, SCK для прошивки и отладки. Для прошивки применили UsbISP-программатор, для отладки USB-TTL конвертер.

Микроскоп, паяльный столик, пайка

Разработка программного обеспечения

Основная причина выбора Arduino в качестве сердца устройства — это простота разработки, низкий порог вхождения на начальном этапе, наличие большого числа сторонних библиотек. За основу были взяты библиотеки:

Первый прототип прошивки собрали буквально за 1 вечер, используя готовые модули и примеры кода. Основным недостатком данного варианта стало относительное большое время работы в активном режиме — более 1,5 секунд. Дальше приступили к оптимизации кода.

  1. Скачали калькулятор для протокола Lora и начали подбирать оптимальные показатели для передачи на те расстояния, которые у нас были — около 30 метров внутри помещений и минимальное время передачи. Связь односторонняя, без подтверждения приема данных. Подобранные параметры представлены ниже.

    Скриншоты из калькулятора 
    Основные параметры передачи
    Основные параметры передачи
    Расчет затрат энергии
    Расчет затрат энергии

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

  2. В первом варианте данные передавались в виде строки: 
    "id устройства#температура#влажность#освещенность#заряд батарей" 
    Как потом оказалось, эта строка занимала много байт и долго передавалась. Погуглив, решили использовать структуру (Struct) для передачи пакета информации, также перевели все числа с плавающей запятой в целые числа просто умножив их на 100. В итоге id, температура, влажность, освещённость, влажность почвы и заряд батареи поместился в 11 байт.

  3. Также нашли интересную статью о том, что команды DigitalRead, DigitalWrite выполняются продолжительное время и заменили их на управление через регистры.

Данный вариант пока остался окончательным и используется в существующих устройствах. Раз в 3-4 дня приходят некорректные данные, но они успешно отсеиваются на стороне сервера. Ниже представлены осциллограммы до и после оптимизации кода и настроек Lora. 

До оптимизации кода и настроек
До оптимизации кода и настроек
После оптимизации
После оптимизации

TransistorSoldering_V3.0

Есть у меня «рабочая лошадка» — Hakko 936. Работает исправно уже больше 2х лет.
Но мне хотелось большей информативности и возможности менять некоторые характеристики станции.

Решил сделать «с нуля» свою станцию(без фена, т.к. хотелось некой мобильности) на основе atmega328 на «китайдуино nano».

Давно заказывал для Хакко запасной паяльник, но китайцы прислали паяльник с термопарой(сопр. терм. — 2.1Ом, сопр. нагр. — 15.5Ом), решил его использовать.

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

Корпус решил взять в магазине электротоваров. Подошла по габаритам коробка распаячная Tyco 200х140х75 IP55.
TransistorSoldering_V3.0

Блок питания взял с запасом: XK-2412-24 (220В.->24В.\6a)
TransistorSoldering_V3.0

Экран решил использовать двухстрочный:LCD1602 с зелёной подсветкой.

Адаптер I2C к экрану на PCF8574AT
TransistorSoldering_V3.0

Пошла мелочевка: Разъем для паяльника GX12 5 Pin
TransistorSoldering_V3.0

Энкодер с кнопкой EC11

«Степ-даун» конвертер gw1584 для питания ардуинки и экрана.

Двухканальный операционный усилитель LM358P для снятия даных с датчика температуры паяльника.
TransistorSoldering_V3.0

Полевой транзистор — IRFZ44N для управления нагревательным элементом паяльника путем ШИМ-модуляции.
TransistorSoldering_V3.0

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

Схема была скопирована и доработана из «схемы паяльной станции Aleks Link для ардуино NANO». Изменена под управление инкрементным энкодером с защитой от «дребезга».
Вот оригинальная схема:
TransistorSoldering_V3.0

Почти все в схеме осталось нетронутым — заменил только экран.

Приступаю к сборке — высверлил все нужные отверстия и пропилил прямоугольник для экрана:
TransistorSoldering_V3.0

Этапы установки элементов

TransistorSoldering_V3.0
TransistorSoldering_V3.0

Полевик — все контакты залил изолятором потом.
TransistorSoldering_V3.0

Энкодер с припаянным делителем на резисторах:
TransistorSoldering_V3.0

Проверка работоспособности скетча:
TransistorSoldering_V3.0

Готовый вид — невзрачно, но работоспособно:
TransistorSoldering_V3.0

С разных ракурсов но еще не собран окончательно

TransistorSoldering_V3.0
TransistorSoldering_V3.0
TransistorSoldering_V3.0
TransistorSoldering_V3.0

По итогу: Вышло не плохо, набор температуры от комнатной до 300гр. за ~20-25сек.
Поддержание заданной температуры(но паять массивные детали не стоит.)
Есть режим «сон», который вырубает поддержку температуры(жало перестает нагреваться)через 10минут(в моем случае), при этом, станция работает, но на экране справа будет знак «S» — sleep. Для выхода из режима сна, нужно повернуть энкодер в любую сторону, и тогда знак поменяется на «W» — work, и начнется набор температуры до выставленной.

Скетч, по понятным причинам, не публикую, но покажу скетч от первоисточника — там нужно подправить вывод на экран(семисегментник) и всё.

/*
Arduino IDE 1.5.4
Паяльник на Arduino Pro Mini v0.4

Alex link
http://www.youtube.com/c/AlexLink-Free
http://vk.com/linklife
http://www.facebook.com/groups/Arduno.life/
// Пины еодключения индикаторов
ANODES(CATHODES):
D1 — a
D2 — b
D4 — c
D6 — d
D7 — e
D5 — f
D3 — g
D0 — dp (digital point) Я НЕ подключал — резерв… индикатора :)))

a1
********
* *
f * * b2
5 * g3 *
********
* *
e * * c4
7 * d6 *
******** # dp0

CATHODES(ANODES):
D16 — cathode 3
D15 — cathode 2
D12 — cathode 1
*/

// ————————————————————————————————
int indicator = 1; // 0 = Катод  1 = Анод  — Выбрать под Ваш индикатора !!!!

byte digits[] = {
B00001001,B11101011,B00110001,B10100001,B11000011,B10000101,B00000101,B11101001,B00000001,B10000001};

int digit_common_pins[]={16,15,12}; // пины для разрядов сегментов(при изменении убедитесь что Ваш порт не используется)
int refresh_delay = 5;
int count_delay = 1000; // COUNTING SECONDS IF count_delay = 1000
long actual_count_delay = 0;
long actual_refresh_delay = 0;
int increment = 0; //Стартовое значение на сегментах
int max_digits =3; // Кол-во знакомест
int current_digit=max_digits-1;
int increment_max = pow(10,max_digits);
// ————————————————— не изменять, это для Сегментов ————————————————

//——————— переменные паяльника ——————————
int knopka = 3; //Пин кнопки

int tin = 0; // Пин Датчика температуры IN Analog через LM358N
int pinpwm = 11;// порт нагревательного элемента(через транзистор)PWM

int tempust = 230; // установленная температура
int tempmin = 200; // минимальная температура
int tempmax = 480; // максимальная температура
int tempreal = 250; // переменная датчика текущей температуры
int temppwmmin = 40; // минимальное значение PWM нагревателя
int temppwmmax = 180; // максимальное значение PWM нагревателя
int temppwmreal = 0; // текущее значение PWM нагревателя
int airreal = 100; // стартовое значение PWM вентилятора(если нужно)

int temperror = -50; // разница температур(установленная — реальная)

int temprazn = 0; // переменная разницы температуры(установленная — текущая)

void setup(){

if(indicator == 0){ //Если вначале был выбран общий Катод
for(int i=0; i<10;i++){
digits[i] = ~ digits[i];
}
}

pinMode(pinpwm,OUTPUT); // Порт нагрузки(паяльника) настраиваем на выход
analogWrite(pinpwm, temppwmreal); //Вывод шим в нагрузку паяльника (выводим 0 — старт с выключеным паяльником- пока не опредилим состояние температуры)

// ————————————————— не изменять, это для Сегментов ————————————————
DDRD = B11111111;
for (int y=0;y<max_digits;y++)
{
pinMode(digit_common_pins[y],OUTPUT);
digitalWrite(digit_common_pins[y], LOW);
}
// ————————————————— не изменять, это для Сегментов ————————————————

}

void loop() {

show(increment); // Вывести значение переменной на экран(LED)

if (tempreal < tempust ){ // Если температура паяльника ниже установленной температуры то:

if ((tempust — tempreal) < 16 & (tempust — tempreal) > 6 ) // Проверяем разницу между у становленной температурой и текущей паяльника,
// Если разница меньше 10 градусов то
{
temppwmreal = 99; // Понижаем мощность нагрева (шим 0-255 мы делаем 99) — таким образом мы убираем инерцию перегрева
}
else if ((tempust — tempreal) < 7 & (tempust — tempreal) > 3)
{
temppwmreal = 80; // Понижаем мощность нагрева (шим 0-255 мы делаем 99) — таким образом мы убираем инерцию перегрева
}

else if ((tempust — tempreal) < 4 ) { temppwmreal = 45; // Понижаем мощность нагрева (шим 0-255 мы делаем 99) — таким образом мы убираем инерцию перегрева } else { temppwmreal = 230; // Иначе Подымаем мощность нагрева(шим 0-255 мы делаем 230) на максимум для быстрого нагрева до нужной температуры } analogWrite(pinpwm, temppwmreal); //Вывод в шим порт (на транзистор) значение мощности } else { //Иначе (если температура паяльника равняется или выше установленной) temppwmreal = 0; // Выключаем мощность нагрева (шим 0-255 мы делаем 0) — таким образом мы отключаем паяльник analogWrite(pinpwm, temppwmreal); //Вывод в шим порт (на транзистор) значение мощности } if(millis() — actual_count_delay > count_delay) // это для сегментов

{
actual_count_delay = millis();
// Здесь мы пишем нашу прогу по считыванию состояния кнопок (это место в счетчк не будет тормозить вывод на сегменты)

tempreal = analogRead(0);// считываем текущую температуру

tempreal=map(tempreal,-50,700,0,500); // нужно вычислить
increment=tempreal;

//———————————————————- Кнопки ————————————————————————-
if (analogRead(knopka) == 0) // Если нажата вниз кнопка то понизить температуру на 5
{
if( tempust <= tempmin || (tempust-5) <= tempmin ) { tempust= tempmin; increment = tempust; } else { tempust=tempust-5; increment = tempust; show(increment); // Вывести значение переменной на экран(LED) } } else if (analogRead(knopka) > 500 && analogRead(knopka) < 524 ) // Если нажата вверх кнопка то повысить температуру на 5 { tempust=tempust+5; if( tempust >=tempmax)
{
tempust= tempmax;
}
increment = tempust;
show(increment); // Вывести значение переменной на экран(LED)

}

}
}

void show(int value) { //——————————- подпрограмма для вывода на сегменты — лучше не изменять ———————————————
int digits_array[]={};
int y=0;
boolean empty_most_significant = true;

if(millis() — actual_refresh_delay >= refresh_delay)
{

for (int z=max_digits-1;z>=0;z—)
{

digits_array[z] = value / pow(10,z); //rounding down by converting from float to int

if(digits_array[z] != 0 ) empty_most_significant = false; // DON’T SHOW LEADING ZEROS

value = value — digits_array[z] * pow(10,z);

if(z==current_digit)
{
if(!empty_most_significant || z==0){ // DON’T SHOW LEADING ZEROS EXCEPT FOR THE LEAST SIGNIFICANT

PORTD = digits[digits_array[z]];
}
else
{
if(indicator == 0){ //Если вначале был выбран общий Катод
PORTD = B00000000;
}
else{
PORTD = B11111111;
}
}

if(indicator == 0){
digitalWrite(digit_common_pins[z], LOW);
}
else{
digitalWrite(digit_common_pins[z], HIGH);
}
}
else{

if(indicator == 0){
digitalWrite(digit_common_pins[z], HIGH);
}
else{
digitalWrite(digit_common_pins[z], LOW);
}
}

}

current_digit—;
if(current_digit < 0)
{
current_digit= max_digits; // NEED AN EXTRA REFRESH CYCLE TO CLEAR ALL DIGITS
}

actual_refresh_delay = millis();
}

}

И обновленный скетч от первоисточника:

/*
Arduino IDE 1.5.4
Паяльник на Arduino Pro Mini  v0.4

Alex link
http://www.youtube.com/c/AlexLink-Free
http://vk.com/linklife
http://www.facebook.com/groups/Arduno.life/
 // Пины еодключения индикаторов
 ANODES(CATHODES):
 D1 - a
 D2 - b
 D4 - c
 D6 - d
 D7 - e
 D5 - f
 D3 - g
 D0 - dp (digital point) Я НЕ подключал - резерв... индикатора :)))
 
      a1
   ********
   *      *
 f *      * b2
 5 *  g3  *
   ********
   *      *
 e *      * c4
 7 *  d6  *
   ******** # dp0
 
 CATHODES(ANODES):
 D16 - cathode 3
 D15 - cathode 2
 D12 - cathode 1
 */

// ------------------------------------------------------------------------------------------------
int indicator = 1; // 0 = Катод  1 = Анод  Выбрать под Ваш индикатор !!!!

byte  digits[] = {
  B00001001,B11101011,B00110001,B10100001,B11000011,B10000101,B00000101,B11101001,B00000001,B10000001};

int digit_common_pins[]={16,15,12};  // пины для разрядов сегментов(при изменении убедитесь что Ваш порт не используется)
int refresh_delay = 5;
int count_delay = 1000; // COUNTING SECONDS IF count_delay = 1000
long actual_count_delay = 0;
long actual_refresh_delay = 0;
int increment = 0;   //Стартовое значение на сегментах
int max_digits =3;  //  Кол-во знакомест
int current_digit=max_digits-1;
int increment_max = pow(10,max_digits);
// -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------


//--------------------- переменные паяльника -----------------------------
int knopka = 3; //Пин кнопок


int tin = 0; // Пин Датчика температуры IN Analog через LM358N
int pinpwm = 11;// порт нагревательного элемента(через транзистор)PWM

int tempust = 230; // установленная температура
int tempmin = 200; // минимальная температура
int tempmax = 480; // максимальная температура
int tempreal = 250; // переменная датчика текущей температуры
int temppwmmin = 40; // минимальное значение PWM нагревателя  
int temppwmmax = 180; // максимальное значение PWM нагревателя
int temppwmreal = 0; // текущее значение PWM нагревателя
int airreal = 100; // стартовое значение PWM вентилятора(если нужно)

int temperror = -50; // разница температур(установленная - реальная)

int temprazn = 0; // переменная разницы температуры(установленная - текущая)

void setup(){
  
 if(indicator == 0){   //Если вначале был выбран общий Катод
                    for(int i=0; i<10;i++){
                                           digits[i] = ~ digits[i];
                                           }
                   }
  
  pinMode(pinpwm,OUTPUT);     // Порт нагрузки(паяльника) настраиваем на выход
  analogWrite(pinpwm, temppwmreal);     //Вывод  шим в нагрузку паяльника (выводим 0 - старт с выключеным паяльником- пока не опредилим состояние температуры)
  
 
  // -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------
  DDRD = B11111111;
  for (int y=0;y<max_digits;y++)
          {
           pinMode(digit_common_pins[y],OUTPUT);
           digitalWrite(digit_common_pins[y], LOW);    
          }
  // -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------

}

void loop() {
    
  show(increment);   // Вывести значение переменной на экран(LED)
   
    
   if (tempreal < tempust ){   // Если температура паяльника ниже установленной температуры то:
      
            if ((tempust - tempreal) < 16 & (tempust - tempreal) > 6 ) // Проверяем разницу между у становленной температурой и текущей паяльника,
                                     // Если разница меньше 10 градусов то 
                             { 
                              temppwmreal = 99;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева
                              }
             else  if ((tempust - tempreal) < 7 & (tempust - tempreal) > 3)
                                                                {              
                                                                  temppwmreal = 80;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева
                                                                 }
                              
                         else if ((tempust - tempreal) < 4 )
                                                      {              
                                                       temppwmreal = 45;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева
                                                       }  
                                                     
                                                     
                            else {
                                  temppwmreal = 230; // Иначе Подымаем мощность нагрева(шим 0-255  мы делаем 230) на максимум для быстрого нагрева до нужной температуры
                                 }
                        
                              
      analogWrite(pinpwm, temppwmreal);     //Вывод в шим порт (на транзистор) значение мощности
    }
 else { //Иначе (если температура паяльника равняется или выше установленной) 
            
            temppwmreal = 0;  // Выключаем мощность нагрева (шим 0-255  мы делаем 0)  - таким образом мы отключаем паяльник
            analogWrite(pinpwm, temppwmreal);   //Вывод в шим порт (на транзистор) значение мощности
          } 
 
  
  if(millis() - actual_count_delay > count_delay) // это для сегментов 

  {  
    actual_count_delay = millis();
     // Здесь мы пишем нашу прогу по считыванию состояния кнопок (это место в счетчк не будет тормозить вывод на сегменты)
   
    tempreal = analogRead(0);// считываем текущую температуру
    
    tempreal=map(tempreal,-50,700,0,500);   // нужно вычислить
    increment=tempreal;
  
  //---------------------------------------------------------- Кнопки -------------------------------------------------------------------------  
          if (analogRead(knopka) == 0)  // Если нажата вниз кнопка то понизить температуру на 5
                               {
                               if( tempust <= tempmin || (tempust-5) <= tempmin )
                                                          {
                                                            tempust= tempmin;
                                                            increment = tempust;
                                                          }
                                       else { 
                                             tempust=tempust-5;
                                             increment = tempust;
                                             show(increment);   // Вывести значение переменной на экран(LED)
                                            
                                              } 
                                 
                                 
                              
                               }
  
          else if (analogRead(knopka) > 500 && analogRead(knopka) < 524 )  // Если нажата вверх кнопка то повысить температуру на 5
                                       {
                                       tempust=tempust+5;
                                       if( tempust >=tempmax)
                                                          {
                                                            tempust= tempmax;
                                                          }
                                       increment = tempust;
                                       show(increment);   // Вывести значение переменной на экран(LED)
                                      
                                       } 
 
    
  }
}

void show(int value) { //------------------------------- подпрограмма для вывода на сегменты   - лучше не изменять ---------------------------------------------
  int digits_array[]={};  
  int y=0;
  boolean empty_most_significant = true; 
  

  
  if(millis() - actual_refresh_delay >= refresh_delay)
  {  

  for (int z=max_digits-1;z>=0;z--)
  {


    digits_array[z] = value / pow(10,z); //rounding down by converting from float to int
    
    if(digits_array[z] != 0 ) empty_most_significant = false;  // DON'T SHOW LEADING ZEROS
    
    value = value - digits_array[z] * pow(10,z);




 
   if(z==current_digit)
        {
         if(!empty_most_significant || z==0){ // DON'T SHOW LEADING ZEROS EXCEPT FOR THE LEAST SIGNIFICANT
            
                                            PORTD = digits[digits_array[z]];
                                            }
                                       else
                                            {
                                             if(indicator == 0){   //Если вначале был выбран общий Катод
                                                                PORTD = B00000000;  
                                                                }
                                                     else{
                                                           PORTD = B11111111;
                                                          }  
                                            }

       if(indicator == 0){ 
                         digitalWrite(digit_common_pins[z], LOW);
                         }
             else{
                  digitalWrite(digit_common_pins[z], HIGH);
                 }
      }
 else{
     
     if(indicator == 0){ 
                         digitalWrite(digit_common_pins[z], HIGH);
                         }
             else{
                  digitalWrite(digit_common_pins[z], LOW);
                 }
   }

}
  

      current_digit--;
      if(current_digit < 0) 
      {
        current_digit= max_digits; // NEED AN EXTRA REFRESH CYCLE TO CLEAR ALL DIGITS
      }
 
 actual_refresh_delay =  millis();     
 }

}

Если есть вопросы, задавайте. По возможности буду отвечать.

Энергопотребление

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

Режим работы
Режим работы

Расчет показывает, что продолжительность работы на 2AA-батарейках емкостью 1500мАч составит:

0.85*1500/(24*(30мА*0.5сек + 0.01мА*180сек)*20/3600) = 569 дней,

  • 0.85 — коэффициент саморазряда;

  • 1500 — емкость батареек (мАч);

  • 24 — количество часов в сутках;

  • 30 — потребление энергии в режиме передачи (мА);

  • 0.5 — время работы в режиме передачи (сек.);

  • 0.01 — потребление в спящем режим (мА) (очень оптимистичный вариант);

  • 180 — время нахождения в спящем режиме (сек.);

  • 20 — количество циклов пробуждения в 1 часе;

  • 3600 — количество секунд в часе.

Падение напряжения за 2 месяца
Падение напряжения за 2 месяца

Скачок напряжения связан с изменением температуры в серверной с 20 на 16 градусов. 

Скачок напряжения батареи
Скачок напряжения
Скачок напряжения

Сбор данных

В качестве приемника данных используем Arduino Nano c подключенным передатчиком Lora и по UART передаем данные по USB-кабелю на компьютер с простеньким Python-скриптом, который парсит данные и кладет их в InfluxDB. Дальше уже в Grafana рисуем графики.

Температура по помещениям
Температура по помещениям
Температура и влажность по помещениям
Температура и влажность по помещениям

Дальнейшие планы

  • Сейчас есть желание все таки установить датчик TVOC CO2 CSS811. Проблема в том, что он является энергозатратным и от батареек продержится недолго. В тестовом режиме одновременно работают от сети датчики MH-Z19 (с калибровкой раз в сутки) и CSS811. Результаты между ними очень похожи. Только CSS811 нужно двое суток, чтобы откалиброваться.

    Сравнения показании MH-Z19 и CSS811
    Сравнения показании MH-Z19 и CSS811
  • Научиться «высасывать» батарейки до конца используя stepup-преобразователи (хотя в них остается не так уж много, 0,2-0,3 В).

  • Также хочется увеличить дальность передачи данных, возможно перейти на 868МГц.

  • Создание этакой «станции приема данных», которая будет расположена повыше с выносной антенной.

  • Возможно перейти на STM32.

  • Создать интерактивную web-карту с микроклиматом.

Спасибо за внимание.

Аварийные ситуации

На данный момент работают 5 устройств и дважды уже сигнализировали о температуре. В первом случае, отключился кондиционер в серверной, как назло в праздничный день. В Grafana настроены уведомления о температуре выше 30 градусов. 

Аварийная ситуация в серверной
Аварийная ситуация в серверной

Во втором случае была централизованная проблема с отоплением (отключилось) и тоже в праздники. Температура в помещениях опустилась ниже 15 градусов. 

Проблема с отоплением
Проблема с отоплением

Дальность работы

На данный момент с антеннами, сделанными из проволоки, дальность внутри помещений – 30 метров с тремя несущими стенами, дальность на улице – 45 метров через две стены. Мощность установлена 10 мВт. С приемника мы также забираем показатель SNR (Signal-to-Noise Ratio — отношение между мощностью принятого сигнала и фонового шума) и видим, что он сильно меняется. Пока мы решили, что это сигнализации на ближайших машинах создают дополнительные помехи. 

SNR
SNR

Корпус устройства

Изначально решили использовать готовые корпуса для РЭА, купленные в местном магазине радиотоваров. 

Первый вариант корпуса
Первый вариант корпуса

А так как в наличии был 3D-принтер, решили попробовать создать корпус самостоятельно. 

Второй вариант корпуса
Второй вариант корпуса

И последний вариант, разработанный в рамках акции «ДоброВспышка». 

Третий вариант корпуса
Третий вариант корпуса

Датчик влажности почвы

В качества эксперимента на последний вариант платы была добавлена обвязка для емкостного датчика влажности почвы. 

Схема емкостного датчика влажности почвы
Схема емкостного датчика влажности почвы

Насколько мы поняли, здесь один из выходов Atmega используется как ШИМ-генератор, а контакты датчика являются обкладками конденсатора, которые вносят изменения в сигнал. При контакте с водой или влажной почвой емкость конденсатора изменяется, эти изменения потом фиксируются с помощью аналогового входа микроконтроллера. Основная проблема возникла с подбором емкостей конденсатора и сопротивления резистора, даже попробовали создать и протестировать схему в Multisim. Сам тестовый датчик промазан лаком, установлен в корпус с экранами Стивенсона (ссылка на модель), в качестве контактов (обкладками конденсатора) является 2 провода, уходящих в землю. Он уже пережил несколько сильных ливней и пока следов попадания влаги не обнаружено. 

Уличный датчик
Уличный датчик
Читайте также:  Сварочное оборудование ЗУБР. Купить сварочное оборудование ЗУБР
Оцените статью
Про пайку
Добавить комментарий