В предыдущих постах уже описал как программируется arduino, доработка библиотеки LCD и особенности подключения потенциометра.
ИМХО, для понимания работы скетча и переноса его в arduino этого достаточно. Остальное описано на сайте arduino.ru/.
Arduino для маршрутизатора является консолью с LCD экраном и клавиатурой в виде много оборотного потенциометра. Можно использовать одно оборотный потенциометр, но тогда будет тяжело задавать больше 10 опций, хотя стоить он будет в 10 раз меньше.
Алгоритм работы.
Сразу после включения ардуино ждет строку "TPL may play <число каналов> channal.", если оно этого не дождется за 10 минут (переменная cuTimeoutOpenWRT), то начинает слать в роутер строку о необходимости сброса маршрутизатора, ибо это говорит о том, что во время работы по непонятным причинам arduino перезагрузилось.
Когда оно этой строки дождется, то начинает принимать команды с роутера.
Он понимает следующие команды:
- Имя проигрываемой станции: "play:<номер канала>. <имя канала>".
- Сброс arduino: "reset arduino".
- Изменение числа доступных каналов: "TPL may play <число доступных каналов> channal.".
- Сообщение об ошибке роутера: "error:<число>. <имя ошибки>".
- Текущее время:"time:<текстовое сообщение о времени>".
ЖКИ поделен на 2 области.
- Верхняя строка, в которую выводится сведения о положении потенциометра. Сведения о положении потенциометра выводятся только когда он поворачивается, если после последнего сдвига придет сообщение с текущем временем, то сведения о положении потенциометра будут затерты строкой с текущем временем.
- Три нижних строки в которых индицируется имя текущего канала или ошибка проигрывателя. Они берутся из команд "play:<номер канала>. <имя канала>" и "error:<число>. <имя ошибки>", только слово "play" вырезается, а "error" нет.
Для упрощения протокола обмена между arduino и роутером имя проигрываемого канала повторяется каждую секунду, поэтому для предотвращения ежесекундного мигания экрана, LCD переписывается только если придет строка отличная от предыдущей.
По прошествии 0.1 секунды после последнего сдвига потенциометра (переменная SPTIME), с периодичностью в 3 секунды (переменная STPLTIME) посылается в роутер команда сменить канал: "
Tuner: <номер канала>".
!!!ВНИМАНИЕ!!!
1. Компилятор с++ для arduino имеет ошибку: не умеет корректно сравнивать переменные типа unsigned long, поэтому для обработки длительных временных промежутков, я сначала милисекунды преобразовывал в секунды, а потом уже их сравнивал.
2. Если непрерывно слать данные в arduino по последовательному порту, то по непонятным причинам, оно превращается в пожирателя энергии, которому БП в 1A недостаточно. Поэтому, для предотвращения перегрева, зависаний и сбоев arduino, непрерывно слать данные ему нельзя.
( под катом код скетча )