Ethernet shield для Arduino: подключение и веб-сервер

Плата расширения на чипе Wiznet W5100 подключает Arduino к локальной сети. Получение IP-адреса, проверка связи и сервер с показаниями датчика BMP280.
Назначение и характеристики
Ethernet shield — плата расширения, которая подключает Arduino к сети. Она построена на чипе Wiznet W5100 и дополнительно несёт разъём для карт micro-SD.

| Контроллер | W5100 |
| Напряжение питания | 5 В |
| Число соединений | до 4 |
| Скорость подключения | 10 и 100 Мбит/с |
| Карта памяти | micro-SD |
| Протокол обмена с Arduino | SPI |
| Габариты | 74х54х27 мм |
Установка на Arduino
Плата выполнена в формате шилда и надевается поверх Arduino. И с чипом W5100, и с SD-картой контроллер общается по SPI. Вывод 10 выбирает W5100, вывод 4 — SD-карту; одновременно активным может быть только одно из двух устройств.

MAC-адрес и получение IP
Сетевое взаимодействие программируют с помощью библиотеки Ethernet из стандартной поставки Arduino IDE; вместе с ней подключают SPI.h. Библиотеке нужно передать MAC-адрес — уникальный идентификатор сетевого устройства. На новых версиях шилда он указан на наклейке. Если наклейки нет, подойдёт любая комбинация, лишь бы в сети не оказалось устройства с таким же адресом.
У каждого устройства локальной сети должен быть и свой IP-адрес. Его назначают вручную или получают автоматически от DHCP-сервера, который обычно работает на роутере.
В первом варианте скетч вызывает Ethernet.begin(mac) с одним только MAC-адресом. Если функция вернула 0, в последовательный порт на скорости 9600 выводится сообщение об ошибке, иначе — полученный адрес, который читается через Ethernet.localIP().

Во втором варианте адрес статический. В скетче задают массивы с IP, сервером DNS, шлюзом и маской подсети — значения подставляют под свою сеть — и вызывают Ethernet.begin(mac, ip, dns, gtway, subnet). Через секунду адрес выводится в монитор порта.

Проверка связи
Чтобы убедиться, что плата доступна по сети, на компьютере открывают командную строку и выполняют ping <ip-адрес> -t, указав адрес, полученный Arduino. Если плата подключена и связь с компьютером по локальной сети есть, в окне командной строки начнут появляться ответы от неё.
Если адрес по DHCP не выдаётся, проверяют сетевой кабель и наличие DHCP-сервера в сети. Когда связи нет при статическом адресе, кроме кабеля проверяют IP, шлюз и маску. В обоих случаях причиной может быть совпадение MAC-адреса с другим устройством — тогда его меняют на другой.
Веб-сервер с датчиком BMP280
Практический пример — сервер, который по запросу отдаёт страницу с показаниями датчика. Для сборки нужны плата Arduino, Ethernet shield, макетная плата, датчик BMP280 и провода.
К библиотекам SPI и Ethernet в скетче добавляются Wire, Adafruit_Sensor и Adafruit_BMP280: датчик работает по шине I2C. Сервер создаётся на порту 80 — EthernetServer srv(80). В setup() настраивается сеть со статическим адресом, запускаются сервер и датчик, а IP выводится в последовательный порт.
В основном цикле программа ждёт клиента. Когда тот подключился, она посимвольно читает запрос и по пустой строке определяет его конец. В ответ уходят HTTP-заголовки — статус 200 OK, тип text/html, закрытие соединения и Refresh: 10 — и сама страница с температурой в градусах Цельсия и давлением. Давление датчик выдаёт в паскалях; для перевода в миллиметры ртутного столба значение делится на 133.3224. После отправки соединение закрывается.
При сборке собственного варианта стоит помнить про занятые шилдом линии: шина SPI и выводы 10 и 4 используются для обмена с W5100 и картой памяти.
Остаётся набрать IP-адрес сервера в браузере: откроется страница с температурой и атмосферным давлением, которая обновляется каждые 10 секунд.