Привет! Пришло время подключить Ардуино к интернету. Одно из самых интересных направлений использования Ардуино — это интернет вещей. А управление устройствами на Ардуино через интернет, пожалуй, самое востребованное направление на сегодня. Поэтому сегодня поговорим о дополнительной плате для подключения Ардуино к интернету, об Ethernet Shield.
Содержание
- Для того, чтобы выполнить этот урок нам понадобиться
- Ethernet Shield
- Принципиальная схема
- Программа
- Полный текст программы
- Заключение
В предыдущем уроке мы говорили о bluetooth модуле и электромагнитном реле. Это тоже часть проектов на Ардуино, которые помогают в интернете вещей и беспроводной передаче информации от Ардуино к приложениям в телефоне или компьютере. Поэтому, посмотрите его, если пропустили или уже забыли.
Реле SRD-05VDC-SL-C. Урок 15. Ардуино
А сегодня мы повторим предыдущий урок, но вместо bluetooth модуля используем подключение через ethernet. Напишем сервер, к которому можно будет подключиться из браузера. И простую веб страницу, на которой можно будет зажигать свет.
Для того, чтобы выполнить этот урок нам понадобиться
- Ардуино UNO
- Макетная плата
- Перемычки
- Ethernet Shield
- Реле SRD-05VDC-SL-C
- Лампа на 220 вольт и патрон к ней
- Ethernet провод
- Кабель USB
Об электромагнитном реле мы в прошлый раз мы говорили более подробно. В этом плане сегодняшний проект не измениться. Нам нужно получить на Ардуино управляющий сигнал. И в зависимости от него, включить или выключить реле.
Управляющий сигнал будем получать от платы расширения Ethernet shield и веб страницы, которая будет генерироваться внутри кода. Когда пользователь нажмет на кнопку, чтобы включить свет, сервер получит данные и использует, для управления реле.
Ethernet Shield
В нашем распоряжении оказался ethernet shield hanrun hr91105a или w5100. Он имеет форм фактор для подключения к плате Ардуино Uno.
Он предоставляет доступ к TCP и UDP стекам. А библиотека для работы с ethernet shield позволяет быстро подключить устройство и настроить скетч.
Контакты сверху платы позволяют подключать дополнительные устройства и использовать контакты Ардуино как обычно.
Имейте в виду, при подключении платы, пины 4, 10, 11, 12 и 13 используются для взаимодействия платы с Ардуино. Использовать их для других устройств уже нельзя.
Так же на плате есть слот для карты micro-SD. С его помощью можно сохранять необходимую информацию на карту памяти. Или загружать на нее веб страницы. Памяти внутри Ардуино хватит только на небольшую страницу с парой кнопок.
На плате расширения есть несколько индикаторных светодиодов
- PWR: показывает, что платы подключены к питанию
- LINK: показывает, подключение к сетевому устройству и мигает когда плата получает или отправляет данные
- FULLD: показывает, что интернет соединение full duplex
- 100M: показывает, что скорость соединения поддерживает 100 Mb/s (а не 10 Mb/s)
- RX: мигает, когда плата получает данные
- TX: мигает, когда плата отправляет данные
- COLL: мигает, когда обнаружены интернет коллизии
Принципиальная схема
Подключим Ethernet shield к материнской плате Ардуино. А электромагнитное реле уже к плате расширения. Используем питание 5 вольт и землю. А для управление реле возьмем 7 цифровой пин.
Программа
Смысл проекта такой же как и с bluetooth. Плата должна получить от нас сигнал и установить реле в нужное состояние. Тогда подключенное к реле оборудование включится или выключится соответственно.
Используем пример из библиотеки Ethernet.
Откроем скетч из Меню File -> Examples -> Ethernet -> WebServer
Здесь используются библиотеки <SPI.h> и <Ethernet.h>
Вы можете задать mac адрес и ip адрес для вашей платы. Ip адрес должен подходить для вашей локальной сети. HTTP сервер будет работать на 80 порту как обычно. А реле подключим к 7 пину.
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 0, 177);
EthernetServer server(80);
int RelayPin = 7;
В функции setup() настраиваем все необходимые функции для работы через интернет. И раскомментируем строку Ethernet.init(10);
// You can use Ethernet.init(pin) to configure the CS pin
Ethernet.init(10); // Most Arduino shields
Настроим пин для реле на вывод и выключим его.
// start the server
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, 0);
Теперь разберемся с циклом loop(). Каждый раз, когда к серверу подключается новый клиент, мы должны передать ему веб страницу с необходимой информацией. Используем монитор последовательного порта для отладки программы. Информацию от клиента мы будем получать через http заголовки и для этого считаем всю информацию, которую мы можем получить при соединении к серверу.
void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
String readString = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
readString += c;
Таким образом мы получили строку, в которой будет вся имеющаяся информация. В том числе о хосте, рефферере и данных о браузере. Из-за того, что данные в рефферере и хосте будут дублироваться, а нам нужна только строка хоста, уберем лишнюю информацию.
//Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
readString.replace("http://192.168.0.177/LightOff?", "refferer");
readString.replace("http://192.168.0.177/LightOn?", "refferer");
Serial.println(readString);
Теперь мы можемиспользовать информацию о состоянии реле и сформировать нужную веб страницу для пользователя.
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// output the value of each analog input pin
if(readString.indexOf("LightOn") > 0) {
digitalWrite(RelayPin, 1);
} else {
digitalWrite(RelayPin, 0);
}
int Relay = digitalRead(RelayPin);
String ButtonText = "";
String ButtonLink = "";
if( Relay ){
ButtonText = " LightOff ";
ButtonLink = "/LightOff";
} else {
ButtonText = " LightOn ";
ButtonLink = "/LightOn";
}
client.print("<div style='height: 100vh;width: 100%;border: 1px solid black;'><h1 style='text-align:center;'>Relay is ");
client.print(Relay);
client.println("</h1><br />");
client.print("<div style='text-align:center;'><form action='");
client.print(ButtonLink);
client.print("'> <input type='submit' style='box-shadow:inset 0px -3px 7px 0px # 29bbff;background:linear-gradient(to bottom, # 2dabf9 5%, # 0688fa 100%);background-color:# 2dabf9;border-radius:3px;border:1px solid # 0b0e07;display:inline-block;cursor:pointer;color:# ffffff;font-family:Arial;font-size:15px;padding:9px 23px;text-decoration:none;text-shadow:0px 1px 0px # 263666;' value='");
client.print(ButtonText);
client.print("' /></div></form>");
client.println("</div></html>");
break;
В итоге получим кнопку со ссылкой на включение реле, если реле выключено. И наоборот, на выключение, если свет включен в настоящий момент.
Полный текст программы
# include <SPI.h>
# include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 0, 177);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
int RelayPin = 7;
void setup() {
// You can use Ethernet.init(pin) to configure the CS pin
Ethernet.init(10); // Most Arduino shields
//Ethernet.init(5); // MKR ETH shield
//Ethernet.init(0); // Teensy 2.0
//Ethernet.init(20); // Teensy++ 2.0
//Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet
//Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Ethernet WebServer Example");
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
// Check for Ethernet hardware present
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :(");
while (true) {
delay(1); // do nothing, no point running without Ethernet hardware
}
}
if (Ethernet.linkStatus() == LinkOFF) {
Serial.println("Ethernet cable is not connected.");
}
// start the server
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, 0);
}
void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
String readString = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
readString += c;
//Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
readString.replace("http://192.168.0.177/LightOff?", "refferer");
readString.replace("http://192.168.0.177/LightOn?", "refferer");
Serial.println(readString);
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// output the value of each analog input pin
if(readString.indexOf("LightOn") > 0) {
digitalWrite(RelayPin, 1);
} else {
digitalWrite(RelayPin, 0);
}
int Relay = digitalRead(RelayPin);
String ButtonText = "";
String ButtonLink = "";
if( Relay ){
ButtonText = " LightOff ";
ButtonLink = "/LightOff";
} else {
ButtonText = " LightOn ";
ButtonLink = "/LightOn";
}
client.print("<div style='height: 100vh;width: 100%;border: 1px solid black;'><h1 style='text-align:center;'>Relay is ");
client.print(Relay);
client.println("</h1><br />");
client.print("<div style='text-align:center;'><form action='");
client.print(ButtonLink);
client.print("'> <input type='submit' style='box-shadow:inset 0px -3px 7px 0px # 29bbff;background:linear-gradient(to bottom, # 2dabf9 5%, # 0688fa 100%);background-color:# 2dabf9;border-radius:3px;border:1px solid # 0b0e07;display:inline-block;cursor:pointer;color:# ffffff;font-family:Arial;font-size:15px;padding:9px 23px;text-decoration:none;text-shadow:0px 1px 0px # 263666;' value='");
client.print(ButtonText);
client.print("' /></div></form>");
client.println("</div></html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
} else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disconnected");
}
}
Если все настроено правильно, то зайдя по адресу указанному в настройках IPAddress ip(192, 168, 0, 177) мы увидим веб страницу.
И нажав на кнопку мы сможем управлять реле, соединенным с платой Ардуино.
Заключение
Мы использовали Ethernet shield для Ардуино, чтобы подключить устройство к интернету. И настроили управление светом через веб страницу сгенерированную на Ардуино.
Естественно, вы можете использовать такую схему для управления любыми устройствами. А использование электромагнитного реле дает возможность включать и выключать электрические приборы с любой нагрузкой.
Спасибо, что дочитали статью до конца.
Пожалуйста, подписывайтесь на блог в яндекс дзен, ставьте лайки и пишите комментарии.
Посмотрите больше уроков и проектов на сайте arcadepub.ru
И подписывайтесь на соц. сети.
Спасибо за внимание, скоро увидимся.