Использование шильд платы Ethernet  и библиотеки Ethernet позволяет расширить возможности платы ардуино по управлению сенсорами и актюаторами. Шильд-плата Ethernet основана на микросхеме  Wiznet W5100. Wiznet W5100 предоставляет сетевой стек протоколов  (IP) совместимый с протоколами TCP и UDP. Она поддерживает одновременно до четырех сокетных соединений. Библиотека Ethernet library используется для написания скетчей, которые работают с сетью, используя плату. Плата –шильд соединяться с платой Ардуино, используя разъемы. Библиотека Ethernet позволяет создавать или сервер, принимающий входящие соединения или  клиент, делающий внешние запросы и содержит следующие функции Ethernet class begin()-инициализирует библиотеку и сетевые настройки. Функции Server class создают сервера, которые могут посылать данные клиентам и принимать данные от присоединенных клиентов ( программ, запущенных на других компьютерах или устройствах)-Server(),begin(),available(),write(),print(),println().

Функции Client class создают клиентов, которые могут присоединяться к серверам и посылать и принимать данные Client(), connected(), connect(), write(), print(), println(), available(), read(), flush(), stop(). Пример использования функций библиотеки приведен в руководстве

Пример использования клиента

 

#include

 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 0, 0, 177 };
byte server[] = { 64, 233, 187, 99 }; // Google
 
Client client(server, 80);
 
void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
 
  delay(1000);
 
  Serial.println("connecting...");
 
  if (client.connect()) {
    Serial.println("connected");
    client.println("GET /search?q=arduino HTTP/1.0");
    client.println();
  } else {
    Serial.println("connection failed");
  }
}
 
void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
 
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
}
 

Пример использования сервера

 

#include

 

// network configuration.  gateway and subnet are optional.

 

// the media access control (ethernet hardware) address for the shield:

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

//the IP address for the shield:

byte ip[] = { 10, 0, 0, 177 };

// the router's gateway address:

byte gateway[] = { 10, 0, 0, 1 };

// the subnet:

byte subnet[] = { 255, 255, 0, 0 };

 

// telnet defaults to port 23

Server server = Server(23);

 

void setup()

{

// initialize the ethernet device

Ethernet.begin(mac, ip, gateway, subnet);

 

// start listening for clients

server.begin();

}

 

void loop()

{

// if an incoming client connects, there will be bytes available to read:

Client client = server.available();

if (client == true) {

// read bytes from the incoming client and write them back

// to any clients connected to the server:

server.write(client.read());

}

}

 

Кроме этого на сайте имеются конкретные примеры реализации серверов.

Web Server

В этом примере мы создадим простой  Web server. Используя библиотеку Ethernet , ваше устройство будет способно отвечать на HTTP запросы с помшщью шильд-платы. После открытия браузера и навимгации на IP  адрес вашей платы, ваша плата ардуино будет создавать HTML  страницу, способную показать полученные значения ввода со всех шести аналоговых пинов. Шильд –плата использует пины 10, 11, 12, and 13 для  SPI соединения, поэтому их нельзя использовать для своих целей. Шильд-плата должна быть связана с сетью сетевым кабелем. Вам необходимо изменить сетевые настройки в программе, чтобы соответствовать вашей сети.

Код

/*
Web  Server

A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.

Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)

created 18 Dec 2009
by David A. Mellis
modified 4 Sep 2011
by Tom Igoe

*/

#include
#include

// 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 };
byte ip[] = { 192,168,1, 177 };

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
Server server(80);

void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
}

void loop()
{
// listen for incoming clients
Client client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// 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) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(analogRead(analogChannel));
client.println("
");
}
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();
}
}

 

Теперь мы рассмотрим пример немного посложнее (http://robocraft.ru/blog/238.html). Мы будем управлять светодиодом через локальную сеть, используя Ethernet shield. Идея очень проста — с помощью Arduino в браузере пользователя мы выводим форму с элементами управления, которые позволяют или включать или отключать светодиод.
Что нам понадобится:
1. Arduino, или другой аналог.
2. Ethernet shield.
3. Библиотеки для работы скрипта. Библиотека Ethernet — входит в состав arduino-0018 и библиотека WString.
4. Светодиод и резистор с рассчитанным сопротивлением.

Библиотека Ethernet — отвечает за работу нашего Ethernet shield. С помощью этой библиотеки мы присвоим нашей плате IP адрес и создадим web-сервер для управления.
Во время программирования вам понадобится библиотека

#include <Ethernet.h>Конечно вы также можете использовать дополнительную библиотеку WString.h, которая используется для извлечения данных из HTTP запроса. Первым делом нужно назначить MAC и IP адреса, которые приписываются плате в локальной сети:

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address

byte ip[] = { 192, 168, 1, 110 }; // ip in lan

byte gateway[] = { 192, 168, 1, 1 }; // internet access via router

byte subnet[] = { 255, 255, 255, 0 }; //subnet mask

Плата Wiznet не поддерживает динамическое распределение адресов- и это необходимо делать вручную. Вы можете захотеть испробовать библиотеку DHCP, которая все еще находится в стадии тестирования. Печать простого текста, рисование таблиц является простым заданием, так как они заканчиваются многочисленными строками функций печати вида client.println() с HTML форматированием внутри. Более сложной задачей, когда вам понадобится посылать некоторые данные на сам сервер. Одним из общих методов является чтение HTTP запроса посимвольно. Просто, когда посылается адрес с дополнительными параметрами типа /?L=1 ардуино может захватить эту строку символ за символом по команде char c=client.read(); и затем анализировать ее определенным образом. В этом случае удобно использовать строковые функции подобные append и contains ( смотри TextString)

2. Подключаем к Arduino модуль Ethernet shield, устанавливаем светодиод в 4 пин, подключаем USB и Ethernet кабель к плате.
3. Загружаем скетч в Arduino.
4. Тестируем. После запуска в браузере по адресу http://192.168.88.25/ (ip адрес можно менять) будет доступна следующая страница:
схема20

Ниже представлен скетч для управления светодиодом через локальную сеть.

#include

#include

/*Управление светодиодом через Ethernet */

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //mac - адрес ethernet shielda

byte ip[] = { 192, 168, 88, 25 };        // ip адрес ethernet shielda

byte subnet[] = { 255, 255, 255, 0 }; //маска подсети

Server server(80); //порт сервера

int ledPin = 4; // указываем что светодиод будет управляться через 4 Pin

String readString = String(30); //string for fetching data from address

boolean LEDON = false; //изначальный статус светодиода - выключен

 

void setup(){

//запускаем Ethernet

Ethernet.begin(mac, ip, subnet);

//устанавливаем pin 4 на выход

pinMode(ledPin, OUTPUT);

//enable serial datada print

Serial.begin(9600);

}

void loop(){

// Создаем клиентское соединение

Client client = server.available();

if (client) {

while (client.connected()) {

if (client.available()) {

char c = client.read();

//read char by char HTTP request

if (readString.length() < 30) {

//store characters to string

readString.append( c); }

//output chars to serial port

Serial.print( c);

//if HTTP request has ended

if (c == '\n') {

//Проверяем включили ли светодиод?

//Level=1 - включен

//Level=0 - выключен

if(readString.contains("Level=1")) {

//Включаем светодиод

digitalWrite(ledPin, HIGH); // set the LED on

LEDON = true;

}else{

//Выключаем светодиод

digitalWrite(ledPin, LOW); // set the LED OFF

LEDON = false;

}

// Формируем HTML

client.println("HTTP/1.1 200 OK");

client.println("Content-Type: text/html");

client.println();

client.println(" ");

client.println(" ");

client.println("");

client.println(" ");

client.println("

//controlling led via radio elements

client.println("

Управление светодиодом 4pin

");

 

if (LEDON){

client.println("

Включить

 

Выключить

");

client.println("

LED-статус: ");

 

client.println("

Вкл.");

 

}else{

client.println("

Включить

 

Выключить

");

client.println("

LED-статус: ");

 

client.println("

Выкл");

 

}

client.println("


");

 

client.println("");

//clearing string for next read

readString="";

//останавливаем web-client

client.stop();

}

}

}

}

}