Всем добрый день, Столкнулся с проблемой совместить работу в интернете и оффлайне. Поиск решения не дал, своя голова уже не тащит. Вопросы подобные видел, но решения не нашёл. Призываю сообщество! Максимально упростив задачу получаем: Имеем: 1 реле 1 кнопка Wi-Fi (в моём случае Troyka-модуль, но думаю подойдёт любой на ESP8266) Ethernet Shield (в моём случае на W5100) Arduino Uno (в моём случае Iskra Neo, но это не важно) Хотим: Чтобы мы могли управлять реле по интернету и по кнопке (оффлайн). Кнопка обычная, не тумблер. Для интернета доступны 3 страницы с командами: включить выключить узнать текущий статус Проблемы: По реализации более-менее понятно: Код (C++): void loop() { //Проверяем web server if (Serial1.available()) { ... } //Проверяем кнопку if (button_click()) { ... } } Но так работать будет не стабильно: мы нажали кнопку в тот момент, когда arduino проверяло наличие подключения по ethernet (операция не мгновенная), и наше нажатие она просто не заметила. Конечно если зажать кнопку, или нажимать пока не получится, все отработает - но это будет постоянно раздражать. Возможное решение: Аппаратно (Конденсаторами) сохранять "нажатое" состояние кнопки на 1 сек после отпускания. Я не смог это реализовать. Решение: Мне на помощь пришёл esp8266, который я прошил отдельно, полностью разместив на нём серверную часть. Если пришла команда по интернету, esp8266 - отправляет команду для arduino. А ардуино в цикле проверяет: есть ли сообщение от esp8266 в каком состоянии кнопка Всё работает очень быстро без проблем вот уже 3месяца. (никаких проблем ни с кнопкой и с сервером.) А теперь моя проблема: Мне нужно заменить Wifi на Lan интерфейс (не достаёт wifi, ну и проводам я больше доверяю) Подскажите, пожалуйста, как это можно сделать? Есть ли программируемые модули для Lan, аналогичные с esp8266? P.s. Из всех возможных вариантов, пока вижу только использование второй Ардуино, а это делать очень не хочется. P.s.s. ну или вернуться к аппаратному решению, но как сделать не знаю.
Усложняете Вы все. Почитайте про таймеры, прерывания. Есть Ethernet шилд. Кнопки опрашиваете в обработчике таймера, в loop() проверяйте связь по Ethernet, занимайтесь преподключениями. Ничего не будет друг другу мешать.
Большое спасибо за подсказку! Но тогда как быть с прерываниями, если имеем 4 реле и 4 кнопки? Ведь доступны только 2 входа для прерываний.
Настраиваем таймер (например TimerOne) на периодичность в 10 миллисекунд. При срабатывании таймера опрашиваем все кнопки. Если состояние какой-то кнопки изменилось, и остается одинаковым последние 4 проверки – значит, нажали или отпустили кнопку. Выполняем действие, выставляем флаг. В loop() проверяем флаги, и сообщаем куда нужно. Это и борьба с дребезгом и отсутствие задержек.