Arduino. Первый опыт. Школьный звонок и недоwebserver.

Добрый день. Хочу поделиться с вами первым горьким (или не очень) опытом. Было решено изучить что-же такое arduino и как его практически можно было использовать. Естественно решил сделать замену школьному звонку, с возможностью управления по локальной сети без поднятия web сервера и с записью расписания звонков на microsd карту.
Что использовалось:

- arduino mega 2560;
- ethernet модуль enc28j60;
- модуль MicroSD Card Adapter на базе LVC125A;
- твердотельное реле на базе G3MB-202P;
- модуль часов реального времени DS3231M;
- макетная плата 70*90;
- кривые руки;
- нулевые знания в arduino и С++;
- боль и слезы.

Что в итоге вышло:

Arduino. Первый опыт. Школьный звонок и недоwebserver. Arduino, Arduino Mega, Длиннопост

Теперь по порядку.

Поскольку познания в C++ у меня были совершенно никакие, поэтому было решено брать arduino mega 2560, для того чтобы был запас памяти, ввиду работы со строками (массивами). Модули взял какие были в продаже, не изучив возможные проблемы работу с ними (первая ошибка). По отдельности все модули, кроме модуля реального времени работали нормально, RTC модуль потом пришлось заменить на DS3231. В целом с данным модулем проблем дальше не было, ибо он подключается к шине (интерфейсу I2C).

Этап слез и боли.

Когда уже где-то на горизонте замаячил финал и сладостное предвкушение от результата работы, жизнь вновь окунула меня в жесткие реалии. Ethernet модуль и microsd ну никак не хотели работать вместе. Данные модули подключаются к шине (интерфейсу) ICSP и вроде как все должно работать сразу и без проблем. Изучение теории интерфейса ICSP и поиск по форумам ничего не дал. Я грешил на модуль microsd, купил второй такой же, и ничего.....
Работа полностью встала, но решение все же нашлось, даже два: 1. купить модуль другого производителя на другом чипе; 2. исправить недоразумение инженерной мысли создателя сего модуля. Решение заключалось в том, что нужно было кинуть перемычку с 13 ноги LVC125A на резистор R1 и всё. Иначе данный модуль не давал возможность работать другим модулям на данном интерфейсе (это если утрировать).

Arduino. Первый опыт. Школьный звонок и недоwebserver. Arduino, Arduino Mega, Длиннопост

Вытираем слезы и радуемся, мы не настолько плохи.

Чтобы все это дело не паять к arduino было решено сделать шилд для выноса шины ICSP, I2C и кнопки ресет. Купил макетную плату, отпилил лишнее, припаял пины в местах выводов интерфейсов и кнопки ресет. Любителей качественной пайки и перфекционистов прошу не смотреть.

Arduino. Первый опыт. Школьный звонок и недоwebserver. Arduino, Arduino Mega, Длиннопост

Справа внизу подключен модуль RTC.

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

Все это дело отлично вписалось в корпус роутера D-Link DIR-400.

На этом я аппаратной частью можно и закончить.

Программная часть.

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

- EtherCard.h;

- SD.h;

- DS3231.h;.

Почему именно они.

DS3231.h - может показывать в

ремя в unixtime и в виде hh:mm:ss в формате string. Также умеет работать с днями недели.

SD.h - ничего особенного, просто с ней получилось сразу подружиться.

EtherCard.h - выбор библиотеки для работы с сетью стал для меня камнем преткновения. Поскольку мне хотелось отсылать расписание по сети, получать ответ, синхронизацию по NTP и все это делать со своего сайта (или приложения), а также не хотелось поднимать web сервер (как многие рекомендуют), выбор пал на данную библиотеку. Суть решения свелась к тому, что я отсылаю запрос вида http://ip/?command=команда, arduino парсит запрос и ищет нужные вхождения в строке. После чего шлет http ответ, либо 200 OK, либо 404 not found, это в упрощенной версии. (этот момент более подробно описан в скетче). А в нормальной реализации arduino возвращает json строку и сайт обрабатывает её. В Json строке может быть получено текущее время на arduino, логи за определенный период, текущий урок и пр. информация. Данная реализация находится в стадии допиливания и поэтому пока её не выкладываю.

В основном используется пока что три команды:

http://ip/?3bells=now - дает тройной звонок;

http://ip/?acttim=timenow - принудительная синхронизация с NTP сервером

http://ip/?nwrasp=08:00:00=08:45:00=... (макс. 20 звонков) - передаем новое расписание по сети и сохраняем его на карту.


Прилагаю ссылку на код скетча на ваш суд, код старался максимально комментировать.

Ссылка


p.s. какие проблемы выявлены:
1. иногда запрос не доходит до arduino и приходиться повторно отправлять команду.
2. при проблемах с локальной сетью, не всегда корректно загружается.


Отдельное спасибо @pangoleen.

Arduino & Pi

1.4K постов20.6K подписчика

Добавить пост

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

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

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

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

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

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

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

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий
Что так все сложно, esp + rtc + транзистор или реле и все, причем подключиться к mqtt и хоть из дома в час ночи вклбючай, что бы охраники не спали, а если еще парсить время с интернета, то можно и без rtc сделать
раскрыть ветку (6)
1
Автор поста оценил этот комментарий

Зачем mqtt когда можно напрямую запросы слать?

Это все планируется запихнуть в arduino uno, а там возможно уже не будет памяти подключить лишнюю библиотеку.

раскрыть ветку (5)
Автор поста оценил этот комментарий

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

А и еще ESP8266 стоит дешевле UNO, а имеет тонну ресурсов. Около 80Кб оперативки и целых 4Мб флэша. Разве что пинов там немного, надо для ваших задач с головой.

раскрыть ветку (4)
Автор поста оценил этот комментарий

А что мешает грамотно настроить NAT? И еще, Вы видимо упустили, сие "порождение" управляется с внутреннего сайта, который, в случае не получения ответа, сам отправляет повторный запрос, а уж настроить NAT до внутреннего сайта не так уж и сложно. Так что все равно не вижу причины использовать mqtt. Хотя, честно, помимо mqtt я еще рассматривал пару аналогичных вариантов, но иногда, все же, чем проще - тем лучше. В моем случае достаточно любого браузера и все.

раскрыть ветку (3)
Автор поста оценил этот комментарий
А что мешает грамотно настроить NAT

Тем, что NAT у провайдера. Сейчас почти все не дают белый IP за так.

Вы хоть и пишите, что веб не подняли, но по сути отправляете всё-равно HTTP запросы.

С MQTT тоже можно с веб-мордой сделать. Просто вебсервер с мордой будет в другом месте и передавать данные брокеру. В принципе это нюансы уже.


Я тоже в общем-то без MQTT делал железку. Только у меня железка (ESP8266) сама забирает данные с веб-сервера, который в инете на хостинге лежит. Поэтому управлять ей можно с любого месте, по адресу с нормальным доменным именем. И железка гарантированно данные примет, т.к. если раз даже оборвется передача, во время след. сеанса проверки получит обновления всё-равно.

раскрыть ветку (2)
Автор поста оценил этот комментарий

Я просто все равно не пойму, зачем посредник в виде брокера, его же где-то надо поставить и настроить. Не проще уж настроить DDNS с таким же успехом? Я не хочу сказать что mqtt или что-то подобное плохо, но просто зачем лишний раз усложнять?

Да, вебсервера полноценного нет, о чем и написано в заголовке, он там и не нужен. Изначально вообще планировалось реализовать все на TCP/IP, но не очень хорошо получилось. Поэтому решил свести к http запросам. Проще отслеживать и обрабатывать.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Ну MQTT как раз и разработан для таких вещей. Он оптимирован для низкоскоростных и ненадежных сетей и медленных железок. DDNS вам никак не поможет, если вы за NATом провайдера. Вы не достучитесь из инета до себя, только от себя.

Вебсервер у вас есть, может не полноценный, но штука отвечающая на http запросы и есть соб-но веб-сервер )

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку