Промониторив много различных вакансий на позиции Backend-разработчика на HH.ru, понял, что с учебными проектами, которые предлагаются на различных IT-курсах, мне просто не выделиться на фоне тысяч(если не десятков тысяч) выпускников подобных заведений. По этой причине, и конечно же, из чистого(бескорыстного) любопытства решил реализовать проект передачи данных с солнечной панели SDM-50 в Интернет с использованием всех технологий, которым обучился в Нетологии на курсе по NodeJS.
Итак, идея - передать данные с датчиков, соединенных к солнечной панели SDM-50, сначала на удаленный сервер с использованием GSM-модема, затем по запросу пользователей на веб-интерфейс, реализованный на NextJS.
Цель pet-проекта: Разработка веб-приложения для мониторинга параметров(напряжения) солнечной панели SDM-50 и управления реле с использованием аппаратной платформы Arduino, серверной платформы Node.js и фреймворка Next.js.
Стек:
Backend: NodeJS, nginx, MongoDB, Windows Server 2022(ПО для настройки модема не работает в Linux);
Frontend: NextJS, Bootstrap, gsap;
Оборудование: GSM-модем Промодем, контроллер заряда солнечной панели, панель SDM-50, свинцовый АКБ, Arduino, датчик напряжения, лампочка 12В.
Сразу решил для себя, что буду делать проект так, чтобы потом не стыдно было его показать потенциальному рекрутеру и друзьям. Для этого отказался от навесного монтажа в пользу электрического шкафа, арендовал виртуальный сервер, подкрутил домен и SSL-сертификат к нему. Кстати, приложение будет доступно по ссылке еще в течение 2 месяцев после публикации этой статьи.
Первым этапом проекта была разработка и сборка электрической схемы. Здесь было все просто:
1. Проектирование принципиальной электрической схемы;
2. Тестирование преобразователя MAX485 в связке с Arduino и виртуальным сервером;
3. Вывод датчиков от солнечной панели на Arduino Uno;
4. Подключение реле к Arduino;
5. Написание прошивки для Arduino;
6. Сборка шкафа
C приложением верхнего уровня пришлось поработать чуть подольше, потому что хотелось реализовать не просто вывод цифр на html-ку, а полноценный интерфейс с возможностью редактирования устройств, системой авторизации и т.п.
Ссылка на репозиторий на GitHub

I. Силовая часть электрической цепи
К контроллеру заряда подключены солнечная панель, свинцовый АКБ и нагрузка 12 В (лампа).
II. Цепь Arduino
В текущей реализации к аналоговому входу(№0) контроллера подключен датчик напряжения. К одному из цифровых пинов подключено реле, переключения которого замыкает/размыкает цепь с нагрузкой 12 В (лампой).
Алгоритм загруженный в память контроллера, организован так, что из сообщения, получаемого от GSM-модема через плату MAX485, будет принят номер пина и его тип(аналоговый, цифровой). По этим данным будет вычислен пин, которому следует выставить высокий/низкий сигнал и с какого аналогового входа считать данные и передать их обратно.
III Цепь модем - Arduino
Модем соединен с Arduino по RS-485 интерфейсу через MAX485. В системе он играет роль прозрачного канала и нужен для того, чтобы связать физическую схему и экземпляр backend, который запущен на удаленном сервере.

После подачи питания на контроллер Arduino и GSM-модем система начинает работать. Чтобы увидеть данные, нужно пройти процедуру авторизации в веб-приложении. После чего станет доступен функционал, отвечающий за отображение данных пользователя(роут /devices). Если администратор назначил юзеру датчики и реле, то пользователь сможет увидеть данные с сенсоров и выполнить переключения реле, нажимая на кнопку в веб-интерфейсе.
На схеме ниже приведен сценарий, который происходит после нажатия на кнопку карточки.

Вот такой проект получился. Выделит ли он меня на фоне других JS-разрабов джунов, не знаю. Но теперь с уверенностью могу сказать, что разработать веб-приложение от А до Я, с возможностью управления контроллерами Arduino, точно смогу.