Я все-таки сделал это!
Мое устройство работает! Прошивка, конечно, не идеальна с точки зрения программирования на языке C. Есть большое поле для оптимизации работы с памятью и внедрения дополнительных функций, но основная идея реализована.
Итак, вводные данные.
МК Atmega168.
28 ног, 16Кб Flash-памяти, 1Кб SRAM, 512 байт EEPROM
Адрес по умолчанию 192.168.0.14, пароль "sec", запускаем браузер
- ablog_eth_beta1.jpg (19.14 КБ) 41509 просмотров
Здесь мы видим доступные нам 13 портов. В данный момент названия портов соответствуют названиям регистров МК, но в дальнейшем я откажусь от этого и будет просто 0 1 2 3 4 и т.д.
Верхняя ссылка, страница конфигурации
- ablog_eth_beta2.jpg (17.61 КБ) 41509 просмотров
Входим в настройки порта. NC - не сконфигурирован, In - порт является входом, Out - выходом.
Настраиваем порт на выход
- ablog_eth_beta3.jpg (17.65 КБ) 41509 просмотров
State - текущее состояние порта (включен/выключен)
ON OFF - можно прямо тут включить или выключить подключенную к порту нагрузку
Далее настраиваем вход
- ablog_eth_beta4.jpg (18.62 КБ) 41509 просмотров
Здесь все аналогично, за исключением двух полей: Cmd и Eth - расскажу дальше.
Прежде чем использовать устройство, зададим ему в конфигурации адрес сервера:
- ablog_eth_beta6.jpg (18.45 КБ) 41509 просмотров
Собственно, здесь кроме адреса сервера можно задать и IP адрес устройства.
Да, все настройки (в том числе портов) хранятся в энергонезависимой EEPROM и после включения-выключения устройства естественно сохраняются.
Я задал адрес сервера 192.168.0.250
Теперь нажимаем кнопку, которая подключена к порту, сконфигурированному как In.
В логах access.log сервера Apache можно увидеть следующее:
- ablog_eth_beta7.jpg (12.38 КБ) 41509 просмотров
Модуль по протоколу HTTP обратился на сервере к скрипту test-http.php и передал номер сработавшего входа pt=0
Теперь пишем простейший скрипт на PHP
Код: Выделить всё
<?
if ( $_GET['pt'] == "0" )
{
echo "6:2";
}
?>
Если параметр pt равен 0 (сработал вход с номером 0), то ответить простой строкой "6:2"
А что такое 6:2?
Первая цифра [6] - номер порта
Вторая цифра [2] - действие. 1 - включить, 0 - выключить, 2 - изменить состояние (с вкл на выкл или с выкл на вкл)
Устройство получить эту команду от сервера, разберет ее и выполнит, произведя нужные операции с портами.
Важно отметить, что можно задать операции с несколькими портами, например так
6:1;5:0
Это будет означать: порт 6 включить, порт 5 выключить.
В одном ответе сервера может содержаться 13 таких команд.
Идем дальше.
- ablog_eth_beta5.jpg (21.82 КБ) 41509 просмотров
Поле Cmd у входа. Здесь можно задать команды, которые связаны с этим входом. Формат команд точно такой же как описано выше. И управлять можно любыми выходами сразу. Да, если порт настроен как вход, а мы попытаемся его включить, прошивка не даст это сделать.
Логика такая:
1. Если в конфигурации не прописан сервер, устройство работает само по себе. То есть в данном примере, если сработает вход 0, устройство переключит выходы 5 и 6.
2. Если в конфигурации прописан сервер, устройство пошлет запрос на сервер, но если статус ответа сервера не 200 (а, например, 301, 404 и т.д.), то модуль сам решит что делать, а именно переключит 5 и 6. Если сервер не ответил (он в дауне), то устройство будет в течение 3 секунд ждать ответа (для этого используется встроенный таймер в МК ISR(TIMER1_COMPA_vect), то есть модуль не блокируется, продолжает работать как обычно), то модуль и в этом случае выполнит эту команду.
Поле Eth. Это URL дополнительного сервера/устройства. В этом заложен глубокий смысл.
Для каждого порта можно задать свой URL, причем IP-адреса могут быть разными.
Зачем это надо? Во-первых, это может быть резервный сервер или что-нибудь в этом духе. А во-вторых, это может быть точно такое же устройство!
Например, здесь можно указать:
192.168.0.15/s/?cmd=6:1
Таким образом если в нашей сети несколько таких устройств, то при срабатывании какого-то конкретного входа на одном модуле можно отправить команду по сети Ethernet на включение выхода на другом модуле без участия сервера!
То есть устройства могут общаться между собой. С их помощью можно строить сложные распределенные схемы. Как я говорил ранее, если произошла протечка на 2-м этаже, то можно отправить команду на закрытие крана на подаче воды даже если центральный сервер лежит.
Эту же команду можно выполнить и из любого браузера, с помощью wget, curl и т.д. для управления любым из существующих в сети модулей.
В эту же прошивку входит полноценный эффективный алгоритм debouncing'а кнопок. Свет включается как от обычного выключателя, без всяких фокусов и нервотрепки.
И все это 14 700 байт.
К сожалению длины всех команд и URL пришлось ограничить. Ведь у нас в наличии только 512 байт EEPROM.
Что нужно добавить в ближайшее время:
- Новый тип порта: АЦП. Код готов
- Настройка битности АЦП
- Возможно, PWM
- Настройка в каких случаях отправлять информацию на доп. адрес (всегда или только когда основной сервер недоступен), сейчас всегда.
- Настройка MAC
- Сильно оптимизировать работу с EEPROM. Вероятно придется парсить URL-доп. сервера, чтобы хранить IP-адрес в 4-х байтах вместо 15. и т.д. В данный момент EEPROM занят на 96%.