Проект 29: Робота з Інтернетом на прикладі Arduino Ethernet shield W5100

В цьому експерименті ми покажемо, як нашої платі Arduino отримати доступ до мережі Інтернет за допомогою модуля Ethernet shield W5100.

Необхідні компоненти:

Ethernet Shield дозволяє легко підключити вашу плату Arduino до локальної мережі або мережі Інтернет. Він надає можливість Arduino відправляти і приймати дані з будь-якої точки світу за допомогою інтернет-з'єднання. Наприклад, можна реалізувати дистанційне керування вашими виконавчими пристроями, підключеними до реле, через веб-сайт або створити пристрій, який за допомогою звукового сигналу сповістить вас про новий електронному пісьме.В першої частини експерименту розглянемо використання плати Arduino з підключеним Ethernet Shield як сервер, видає клієнтові (браузеру) веб-сторінку і дозволяє запитами з браузера змінювати стану підключеного до Arduino світлодіода.Подключаем до плати Arduino Ethernet shield, а до виводів D7, D8 - світлодіоди через резистор 220 м (див. рис. 29.1).


Рис. 29.1. Схема підключення модуля Ethernet shield і світлодіодів

При написанні скетчу використовуємо вбудовану в Arduino IDE бібліотеку Ethernet.Содержімое скетчу показано в лістингу 29.1.

#include <SPI.h>
#include <Ethernet.h>
// mac-адресу плати і ip-адреса сервера
byte mac [] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip (192,168,0,214);
// 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 pins [] = {7, 8}; // Піни для світлодіодів
int pinState [] = {0, 0}; // Стан пинов
String getData = "";
boolean startGet = false;
void setup ()
{
Serial.begin (9600);
for (int i = 0; i <2; i ++)
{
pinMode (pins [i], OUTPUT); // контакти підключення світлодіодів
digitalWrite (i, LOW); // вимкнути світлодіоди
}
// ініціалізації бібліотеки Ethernet server
Ethernet.begin (mac, ip);
server.begin ();
}
void loop ()
{
// очікування підключення клієнтів
EthernetClient client = server.available ();
if (client)
{
boolean currentLineIsBlank = true;
while (client.connected ())
{
if (client.available ())
{
char c = client.read ();
if (startGet == true) // дані після '?'
getData + = c;
if (c == '?') // початок збору даних після '?'
startGet = true;
if (c == '\ n' && currentLineIsBlank) // закінчення отримання
{
if (getData.length () <1) // запит без get-даних
{
pinState [0] = 0;
pinState [1] = 0;
}
else
{
pinState [0] = int (getData [5]) - 48;
pinState [1] = int (getData [12]) - 48;
}
// відправка заголовків клієнту
client.println ( "HTTP / 1.1 200 OK");
client.println ( "Content-Type: text / html");
client.println ( "Connection: close");
client.println ();
// формування сторінки відповіді
client.println ( "<! DOCTYPE HTML>");
client.println ( "<html>");
client.println ( "<h3> Ethernet shield + LEDS </ h3>");
client.println ( "<form method = 'get'>");
// світлодіод 1
client.print ( "<div>");
client.print ( "led1 off <input type = 'radio' name = 'led1' value = 0
onclick = 'document.getElementById (\ "submit \"). click ();' ");
if (pinState [0] == 0)
client.print ( "checked");
client.println ( ">");
client.print ( "<input type = 'radio' name = 'led1' value = 1
onclick = 'document.getElementById (\ "submit \"). click ();' ");
if (pinState [0] == 1)
client.print ( "checked");
client.println ( "> on");
client.println ( "</ div>");
// світлодіод 2
client.print ( "<div>");
client.print ( "led2 off <input type = 'radio' name = 'led2' value = 0
onclick = 'document.getElementById (\ "submit \"). click ();' ");
if (pinState [1] == 0)
client.print ( "checked");
client.println ( ">");
client.print ( "<input type = 'radio' name = 'led2' value = 1
onclick = 'document.getElementById (\ "submit \"). click ();' ");
if (pinState [1] == 1)
client.print ( "checked");
client.println ( "> on");
client.println ( "</ div>");
client.println ( "<input type = 'submit' id = 'submit'
style = 'visibility: hidden;' value = 'Refresh'> ");
client.println ( "</ form>");
client.println ( "</ html>");
break;
}
if (c == '\ n')
{CurrentLineIsBlank = true;}
else if (c! = '\ r')
{CurrentLineIsBlank = false;}
}
}
}
// затримка для отримання клієнтом даних
delay (1);
// закрити з'єднання
client.stop ();
for (int i = 0; i <2; i ++) // світлодіоди включити або вимкнути
{DigitalWrite (pins [i], pinState [i]);}
startGet = false;
getData = "";
}


Порядок підключення:

  1. Підключаємо Ethernet shield до плати Arduino, за допомогою кабелю RJ45 підключаємо Ethernet shield до мережі.
  2. Підключаємо світлодіоди за схемою на рис. 29.1.
  3. Завантажуємо в плату Arduino скетч з лістингу 29.1.
  4. Відкриваємо браузер на будь-якому комп'ютері даної мережі і в адресному рядку набираємо http://192.168.0.214 (ту адресу, яку ви привласнюєте Arduino в скетчі).
  5. На сторінці (рис. 29.2), змінюючи статус елементів input radio, бачимо зміна стану світлодіодів, підключених до плати Arduino.

Рис. 29.2. Веб-сторінка, яка формується Arduino-сервером