Подключение Ethernet Shield к Arduino с подробным объяснением. Создание web-сервера для Arduino на базе Ethernet shield W5100
Самым интересным элементом в совокупности с ардуино является Ethernet Shield.
Ethernet Shield - это особая плата расширения, с помощью которой возможно управление устройствами через сервер и интернет.
Этот элемент является одним из самых интересных дополнений к Arduino.
Он открывает огромное количество возможностей в управлении вашими устройствами
,с помощью него вы сможете облегчить себе жизнь, сделать ее в несколько раз удобней.
Сейчас мы - Helpduino, вас научим пользоваться Ethernet Shield на Arduino и подробно объясним скетч программы.
Характеристики шилда и его составляющее
Ethernet Shield основан на чипе W51000, который имеет не топовые характеристики, но их вполне хватает. Данный шилд работает с использованием библиотеки Arduino Ethernet library.
Хотелось бы отметить, что на плате шилда присутствует слот для micro SD карты. Это нужно для того, чтобы можно было хранить большее количество информации и загружать веб-сайты с самого Arduino. Для использования micro SD карты нужно использовать дополнительную библиотеку.
Технические характеристики Ethernet Shield
- Рабочее питание – 5 В (питание платы воспроизводится от Arduino)
- Размер буфера: 16 КБ
- Скорость подключения: 10/100Мб
Принцип работы Ethernet Shield и необходимые компоненты для подключения
Ethernet Shield связывает Arduino с сервером при помощи сети интернет или Wi-Fi роутера. На данный момент мы будем использовать Wi-Fi роутер для передачи информации с датчиков и для управления светодиодом. Вся информация будет выводиться на простейшем сайте, который мы сделали заранее.
Для нашей работы нам необходимы следующие компоненты:
- Плата Arduino (мы используем Arduino UNO)
- Ethernet Shield
- Датчик влажности и температуры DHT11
- Соединительные провода
- Вспомогательная макетная плата - Breadboard
- Любой Wi-Fi роутер
- Сетевой кабель
Все эти элементы можно приобрести по низкой цене и с высоким качеством в интернет магазине SmartElements.
Для большего удобства вы можете кликнуть мышкой по названию в списке выше, чтобы перейти к покупке товара.
Подключение Ethernet Shield к Arduino
Схема подключение этих элементов приведена ниже. Хочу напомнить, что подключать все элементы нужно очень осторожно!.
Для начала я расскажу, как нужно подключать Wi-Fi роутер к Ethernet шилду. Для подключения вам понадобится сетевой кабель, который и будет связывать эти два элемента. Для нашей процедуры не нужен интернет, поэтому подключаем один конец кабеля к Ethernet Shield, а другой к Wi-Fi роутеру. Остается подключить Wi-Fi роутер к питанию и все готово, мы связали эти два элемента.
Поговорим о подключении Ethernet шилда к Arduino. Как вы могли догадаться, чтобы связать Ethernet Shield с Arduino, необходимо напрямую подключить эти два элемента, как показано на рисунке.
Осталось подключить остальные компоненты к Ethernet Shield`у, как показано на фотографии выше. Примерно такое соединение у вас должно получиться.
Внимание, при продолжительном подключении Ethernet шилда к запитанному Arduino существенно нагревается чип шилда. Для продолжительного использования необходимо установить охлаждение, например, радиатор или вентилятор. Обязательно учтите этот момент.
Написание скетча программы для создания web-сервера для Arduino на базе Ethernet shield W5100
Для работы датчика на Arduino нужно скачать и установить библиотеку DHT11 .
Скачать библиотеку можно здесь .
После того, как мы скачали нужную библиотеку, ее нужно правильно установить. скачанные файлы нужно переместить по следующему пути :
Диск C Progtam Files Arduino Libraries
После того, как мы все сделали перейдем к самой важной ступеньке, а именно к программированию.
/*---------------- 1 часть ----------------*/
#include
"DHT.h" //библиотека для работы с DHT
#include
"SPI.h" //библиотека для работы с SPI
#include
"Ethernet.h" //библиотека для работы с Ethernet
#define
DHTPIN 3 //Обозначаем номер пина, к которому подключен датчик
boolean
newInfo = 0; //переменная для новой информации
byte
mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//вводим mac адрес, обычно он такого вида, может отличаться
IPAddress
ip(192, 168, 1, 177);
//вводим любой IP , который не совпадает с вашим
EthernetServer
server(80); //инифиализация библиотеки Ethernet server library
DHT
dht(DHTPIN, DHT11); //инициируем датчик DHT
/*---------------- 2 часть ----------------*/
void
setup() {
pinMode
(8, OUTPUT);//инициализируем 8 пин как выход для светодиода
Ethernet.begin
(mac, ip);//запускаем сервер с указанными ранее MAC и вашим IP
Serial.begin
(9600);
dht.
begin();
server.
begin();
}
/*---------------- 3 часть ----------------*/
void
loop() {
float
h = dht.readHumidity(); //Считываем влажность в переменную "h"
float
t = dht.readTemperature(); //Считываем температуру в переменную "t"
EthernetClient
client = server.available(); //принимаем данные, посылаемые клиентом
if
(client){ //если запрос оканчивается пустой строкой
boolean
currentLineIsBlank = true;
//ставим метку об окончании запроса (дословно: текущая линия чиста)
while
(client.connected()) { //пока есть соединение с клиентом
if
(client.available()) { //если клиент активен
char
c = client.read(); //считываем посылаемую информацию в переменную "с"
if
(newInfo && c == ' '){
//если переменная новой информации = 1 и "с", в которой записан запрос, равен пустой строке
newInfo = 0; //то обнуляем переменную поступления новой информации
}
if
(c == '$'){
// если переменная "с", несущая отправленный нам запрос, содержит символ $
// "$" подразумевает разделение получаемой информации (символов)
newInfo = 1; //то пришла новая информация, ставим метку новой информации в 1
}
//Проверяем содержание URL - присутствует $1 или $2
if
(newInfo == 1){ //если есть новая информация
Serial.println
(c);
if
(c == '1'){ //и "с" содержит 1
Serial.println
("Включить");
digitalWrite
(8, HIGH); //то зажигаем светодиод
}
if
(c == '2'){ //если "с" содержит 2
Serial.println
("Выключить");
digitalWrite
(8, LOW); //гасим светодиод
}
}
if
(c == '\n') { //если "с" равен символу новой строки
currentLineIsBlank = true; //то начинаем новую строку
}
else if
(c != '\r') {
//иначе, если "с" не равен символу возврата курсора на начало строки
currentLineIsBlank = false; //то получаем символ на текущей строке
}
if
(c == '\n' && currentLineIsBlank) { //выводим HTML страницу
/*---------------- 4 часть ----------------*/
client.
println
("HTTP/1.1 200 OK");
//заголовочная информация
client.
println
("Content-Type: text/html");
client.
println
("Connection: close");
client.
println
("Refresh: 5");
//автоматическое обновление каждые 5 сек
client.
println
();
//Это не ошибка, так должно быть
client.
println
("<!DOCTYPE HTML>");
//HTML тип документа
client.
println
("<html>");
//открытие тега HTML
client.
println
("<head> ");
//открытие тега Head
client.
println
("<meta http-equiv='Content-Type' content='text/html ; charset=utf-8'/> ");
client.
print
("<title>HelpDuino Web Server</title>");
//название страницы
client.
println
("</head>");
//заголовочная информация
client.
println
("<body>");
client.
print
("<H1>HelpDuino Web Server</H1>");
//заголовк на странице
client.
print
("<a href=\"/$1\"><button>Включить</button></a>");
//кнопка включить
client.
print
("<a href=\"/$2\"><button>Выключить</button></a>");
//кнопка выключить
client.
println
("<>br> <br>");
//перенос на след. строчку
client.
println
("<hr/>");
//линия=====================================
client.
println
("Tемпература = ");
//Температура с DHT 11
client.
println
(t);
//переменная температуры
client.
println
(" *C");
client.
println
("<br> ");
//перенос на след. строчку
client.
println
("Влажность = ");
//Влажность с DHT 11
client.
println
(h);
//переменная влажности
client.
println
(" %\t");
client.
println
("<br> ");
//перенос на след. строчку
client.
println
("<hr/>");
//линия=====================================
client.
println
("</body>");
client.
println
("</html>");
//закрываем тег HTML
break;
//выход
}
}
}
delay
(1);
//время на получение новых данных
client.
stop();
//закрываем соеднение
}
}
Выше вам представлен скетч нашей программы. С помощью него вы сможете управлять светодиодом и принимать информацию с датчика влажности и температуры DHT11. Отдельно мы уже работали и со светодиодом, и с датчиком DHT11, вы можете рассмотреть их подключение к Arduino в отдельности нажав кнопкой мышки по названию. В самом скетче есть пояснение к каждой строчке кода, но мы дополнительно обговорим некоторые детали
Для начала, я бы хотел разделить код нашей программы на несколько частей. Вы можете увидеть это разделение в самом коде, который представлен выше. Мы будем рассматривать их по отдельности для нашего удобства. Почему я разбил код нашей программы на четыре части, вы сейчас поймете.
Первая часть кода
В первой части кода мы как, обычно, указываем пусть к необходимым библиотекам, номер пинов наших устройств. Для подключения Ethernet Shield нам пришлось указать ip адрес и mac адрес
byte
mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress
ip(192, 168, 1, 177);
Хотелось бы сказать, что mac адрес не зашит в шилд и вы сами задаете его в скетче. Можно использовать mac адрес, который мы привели в нашем примере! Что касается ip адреса,как известно, по стандартам протокола для частных сетей можно использовать разные адреса, в частности, адресация 192.168... Последующие четыре цыфры могут быть произвольные, но в той последовательности, как у нас приведены в скетче. Важно, что ip адрес, указанный в скетче программы не должен пересекаться с ip адресами всех устройств в домашней сети!
Вторая часть кода
Во второй части кода мы инициируем датчики и запускаем сервер с указанными раннее ip и mac. Тут ничего сложного нет, так что мы пойдем дальше.
Третья часть кода
В третьей части кода происходят основные действия. Подробно их описывать я не буду, ведь в скетче программы все подробно описано. Здесь мы указали переменную "t" и "h".
float
h = dht.readHumidity(); //Считываем влажность в переменную "h"
float
t = dht.readTemperature(); //Считываем температуру в переменную "t"
Также мы вводим переменную "c" для работы со светодиодом.
while
(client.connected()) {
if
(client.available()) {
char
c = client.read();
Также указываем условие для включения и выключения светодиода
if
(c == '1'){
Serial.println
("Включить");
digitalWrite
(8, HIGH);
}
if
(c == '2'){
Serial.println
("Выключить");
digitalWrite
(8, LOW);
}
Четвертая часть кода
Заключающей частью нашего скетча я выделил html код, который будет отображаться в браузере. Описание каждой строчки вы также можете найти в самом скетче. Это самый простой web-сайт, так что тут ничего сложного нет.
В конце у вас должно получиться что-то похожее на это!
Также вы можете посмотреть видео версию нашего проекта!
Надеюсь у вас все получилось! Если у вас остались вопросы, можете написать нам в вконтакте или в комментариях ниже. Мы постараемся ответить на ваши вопросы в скором времени!