Это сравнительно новый сетевой модуль, который пришел на смену китайским платам на чипах W5100 и ENC28J60. Питается как от 5 так и 3,3 вольта. Подключается на протоколу SPI.
Данный модуль хорошо работает со встроенной в Arduino IDE библиотекой Ethernet. Библиотеку требуется обновить до версии 2.0.
Скетч ниже сделан на базe библиотечного примера webserver.ino. Добавлен вывод нескольких кнопок, которые управляют блоком реле, подключенным к цифровым пинам 4 — 7.
IP адрес модуля в данном коде — 192.168.0.177
#include <SPI.h>
#include <Ethernet.h>
// введите ниже MAC-адрес и IP-адрес вашего контроллера;
// IP-адрес будет зависеть от вашей локальной сети:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0, 177);
// инициализируем библиотеку Ethernet Server, указывая нужный порт
// (по умолчанию порт для HTTP – это «80»):
EthernetServer server(80);
// задаем контакт и начальное состояние для реле:
String relay1State = "Off";
String relay2State = "Off";
const int relay4 = 7;
const int relay3 = 6;
const int relay2 = 5;
const int relay1 = 4;
// задаем переменные для клиента:
char linebuf[80];
int charcount=0;
void setup() {
// подготавливаем реле-модуль:
pinMode(relay1, OUTPUT);
digitalWrite(relay1, HIGH);
pinMode(relay2, OUTPUT);
digitalWrite(relay2, HIGH);
// открываем последовательную коммуникацию на скорости 9600 бод:
Serial.begin(9600);
// запускаем Ethernet-коммуникацию и сервер:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at "); // "сервер на "
Serial.println(Ethernet.localIP());
}
// Показываем веб-страницу с кнопкой «вкл/выкл» для реле:
void dashboardPage(EthernetClient &client) {
client.println("<!DOCTYPE HTML><html><head>");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head><body>");
client.println("<h3>Arduino Web Server - <a href=\"/\">Refresh</a></h3>");
// генерируем кнопку для управления реле:
client.println("<h4>Relay 1 - State: " + relay1State + "</h4>");
// если реле выключено, показываем кнопку «вкл»:
if(relay1State == "Off"){
client.println("<a href=\"/relay1on\"><button>ON</button></a>");
}
// если реле включено, показываем кнопку «выкл»:
else if(relay1State == "On"){
client.println("<a href=\"/relay1off\"><button>OFF</button></a>");
}
// генерируем кнопку для управления реле:
client.println("<h4>Relay 2 - State: " + relay2State + "</h4>");
// если реле выключено, показываем кнопку «вкл»:
if(relay2State == "Off"){
client.println("<a href=\"/relay2on\"><button>ON</button></a>");
}
// если реле включено, показываем кнопку «выкл»:
else if(relay2State == "On"){
client.println("<a href=\"/relay2off\"><button>OFF</button></a>");
}
client.println("</body></html>");
}
void loop() {
// прослушиваем входящих клиентов:
EthernetClient client = server.available();
if (client) {
Serial.println("new client"); // "новый клиент"
memset(linebuf,0,sizeof(linebuf));
charcount=0;
// HTTP-запрос заканчивается пустой строкой:
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// считываем HTTP-запрос, символ за символом:
linebuf[charcount]=c;
if (charcount<sizeof(linebuf)-1) charcount++;
// если вы дошли до конца строки (т.е. если получили
// символ новой строки), это значит,
// что HTTP-запрос завершен, и вы можете отправить ответ:
if (c == '\n' && currentLineIsBlank) {
dashboardPage(client);
break;
}
if (c == '\n') {
if (strstr(linebuf,"GET /relay1off") > 0){
digitalWrite(relay1, HIGH);
relay1State = "Off";
}
else if (strstr(linebuf,"GET /relay1on") > 0){
digitalWrite(relay1, LOW);
relay1State = "On";
}
if (strstr(linebuf,"GET /relay2off") > 0){
digitalWrite(relay2, HIGH);
relay2State = "Off";
}
else if (strstr(linebuf,"GET /relay2on") > 0){
digitalWrite(relay2, LOW);
relay2State = "On";
}
// если получили символ новой строки...
currentLineIsBlank = true;
memset(linebuf,0,sizeof(linebuf));
charcount=0;
}
else if (c != '\r') {
// если получили какой-то другой символ...
currentLineIsBlank = false;
}
}
}
// даем веб-браузеру время на получение данных:
delay(1);
// закрываем соединение:
client.stop();
Serial.println("client disonnected"); // "Клиент отключен"
}
}
Красивое графическое оформление страницы вебсервера реализовано в этой статье. Используется флеш карта.