ENC28J60 Ethernet Shield позволяет подключить плату Arduino Nano v3.0 к сети.
Ведущий компонент – микросхемаENC28J60, которая поддерживает стеки TCP и UDP в IP-сети. Плата имеет стандартный разъем RJ-45 со встроенным линейным трансформатором, обеспечивающий гальваническую развязку модуля от кабеля TCPIP, и опцией PoE (Power over Ethernet) для получения питания от обычной витой пары 5 категории. На плате установлены 2 светодиода, свечение которых свидетельствует об обмене данными. Выведенные на плату ENC28J60 Ethernet_shield разъёмы типа "мама" с шагом 1 дюйм позволяют произвести подключение к ней платы Arduino Nano по модульному принципу, что значительно экономит место.
Плата ENC28J60 Ethernet_shield управляется и получает/передает данные по SPI интерфейсу. При этом используются следующие выводы Arduino Nano:
D10 – SS;
D11 – MOSI;
D12 – MISO;
D13 – SCK;
D2 – выход прерывания. При приеме пакета импульс на этот выход – сигнал для Arduino срочно обрабатывать пакет. Или, как минимум, принять во внимание, что надо получать данные.
Характеристики
Питание
напряжение 3,14 – 3,45 В;
ток, мА
максимальный 250;
номинальный 170;
Интегрированный MAC и 10 Base-T PHY;
Полный и полудуплекс;
Поддержка одного 10 Base-T порта с автоопределением полярности и коррекцией;
Автовыравнивание генерации контрольной суммы;
Автоотброс ошибочных пакетов;
Программируемая функция повтора передачи при ошибке;
Программируемые функции Padding и генерирование CRC;
Программируемая функция фильтрации ошибочных пакетов;
Тактовая частота SPI до 20 МГц.
Для работы с ENC28J60 Ethernet_shield рекомендуем использовать Arduino-библиотеку
UIPEthernet, которую можно
скачать из репозитория. В отличие от множества других библиотек для ENC28J60, эта библиотека является полной заменой стандартной (включенной в Arduino IDE) библиотеки
Ethernet.h. Библиотека обеспечивает полную поддержку постоянных (потоковых) TCP и UDP-соединений (клиент и сервер), ARP, ICMP, DHCP и DNS. Для ее использования заменяем строку
#include
на
#include
И используем вее функции стандартной библиотеки
Ethernet.h.
Использование
Плата ENC28J60 Ethernet_shield позволяет Arduino получить доступ в Интернет, что делает возможность создавать на основе связки Arduino+ ENC28J60 Ethernet_shield устройств, реализующих концепцию Internet of Things ("Интернет вещей"), согласно которой доступ к данным датчиков или управление исполнительными устройствами может быть обеспечено из любой точки мира.
Рассмотрим самый простой пример отправки данных с фоторезистора (аналоговый датчик освещенности) на один из облачных сервисов.
Сайт «Народный мониторинг»(
www.narodmon.ru)— проект по сбору и отображению на карте мира показаний температуры, давления, влажности и т.п. практически в реальном времени по фактическому их состоянию (а не на основе прогнозов) от различных датчиков среды, установленных как на улице для публичного доступа, так и в помещении для приватного, а также с веб-камер для частного или публичного доступа. Передавать показания датчиков на
narodmon.ruможно посредством протоколов TCP/UDP или HTTP GET/POST. Минимальный интервал передачи показаний датчика— 5 минут (если передавать чаще, то возможна блокировка).
Чтобы стать участником проекта, необходимо зарегистрироваться: заходим на сайт
www.narodmon.ru.
Для отображения показаний датчика (возьмем простейший датчик температуры LM335) на карте необходимо выполнить следующие действия:
Схема подключения датчика
И скетч отправки данных
#include
byte mac[] = { 0x94, 0xDE, 0x80, 0x3A, 0x90, 0xC9 }; //MAC-адресArduino
const unsigned long postingInterval = 600000; // интервал между отправками
// данных - 10 минут
// IP-адрес, назначаемый Ethernet shield:
byte ip[] = { 192, 168, 0, 119 };
// IP-адрес, dns сервера:
byte sdns[] = { 192, 168, 1, 1 };
// адрес шлюза:
byte gateway[] = { 192, 168, 0, 28 };
// маска:
byte subnet[] = { 255, 255, 255, 0 };
IPAddress server(94,19,113,221); // IP сервера
//IPAddress server(91,122,49,168); // IP сервера
EthernetClient client;
unsigned long lastConnectionTime = 0; // время последней передачи данных
boolean lastConnected = false; // состояние подключения
char replyBuffer[160];
void setup()
{
Serial.begin(9600);
// Ethernet connection:
Ethernet.begin(mac,ip,sdns,gateway,subnet);
// секунда для инициализации Ethernet
delay(1000);
//первое соединение через 15 секунд после запуска
lastConnectionTime = millis()-postingInterval+15000;
}
void loop()
{
//если не подключены, и прошло определенное время, то делаем замер,
//переподключаемся и отправляем данные
if (!client.connected() && (millis() - lastConnectionTime > postingInterval))
{
//формирование HTTP-запроса
memset(replyBuffer, 0, sizeof(replyBuffer));
strcpy(replyBuffer,"ID=");
//Конвертируем MAC-адрес
for (int k=0; k<6; k++)
{
int b1=mac[k]/16;
int b2=mac[k]%16;
char c1[2],c2[2];
if (b1>9) c1[0]=(char)(b1-10)+"A";
else c1[0] = (char)(b1) + "0";
if (b2>9) c2[0]=(char)(b2-10)+"A";
else c2[0] = (char)(b2) + "0";
c1[1]=" ";
c2[1]=" ";
strcat(replyBuffer,c1);
strcat(replyBuffer,c2);
}
strcat(replyBuffer,"&");
strcat(replyBuffer,"3351C4BA0200003B");
strcat(replyBuffer,"=");
char temp[3];
double tmpd=(analogRead(A0)5.0/1024)100-273.15;
int tmpi=int(tmpd);
itos(tmpi,temp);
strcat(replyBuffer,temp);
strcat(replyBuffer," ");
//отправляем запрос
httpRequest();
}
//храним последнее состояние подключения
lastConnected = client.connected();
}
// функция отправки запроса
void httpRequest() {
if (client.connect(server, 80))
{
// send the HTTP POST request:
client.println("POST http://narodmon.ru/post.php HTTP/1.0");
client.println("Host: narodmon.ru");
client.println("Content-Type: application/x-www-form-urlencoded");
client.print("Content-Length: ");
client.println(len(replyBuffer));
client.println();
client.println(replyBuffer);
client.println();
lastConnectionTime = millis();
}
else
{
client.stop();
}
}
// размер данных
int len(char buf)
{
int i=0;
do
{
i++;
} while (buf[i]!=" ");
return i;
}
// функция int to string
void itos(int n, char bufp[3]) //
{
char buf[3]={"0","0"," "};
int i = 1;
while (n > 0)
{
buf[i] = (n % 10)+48;
i--;
n /= 10;
}
for (i=0; i<3; i++)
bufp[i]=buf[i];
}
Для передачи данных на сайт «Народный мониторинг» мы используем резервный протокол передачи HTTP POST/GET на URL:
http://narodmon.ru/post.php.
При этом HTTP-заголовки для POST будут следующими:
POST http://narodmon.ru/post.php HTTP/1.0
Host: narodmon.ru
Content-Type: application/x-www-form-urlencoded
Content-Length: NN(кол-во байт в строке данных ниже)
ID=MAC&mac1=value1&...&macN=valueN[&time=UnixTime][&name=NAME][&lat=LAT][&lng=LNG]
Скетч запускает Ethernet-соединение, плата получает IP-адрес в Сети, один раз в 5 минут считываются данные с датчика температуры, формируется строка с данными для отправки на сервер «Народный мониторинг», и данные отправляются с использованием протокола HTTP POST.
Теперь авторизуемся на сайте, используя логин и пароль, выбираем команду меню
Датчики Мои Датчики Добавить устройствои вводим MAC-адреснашего устройства. Если данные уже были отправлены на сайт, устройство будет добавлено.
Затем выбираем тип данных для нашего датчика (температура), устанавливаем доступ к показаниям (
приватный), указываем название устройства и выполняем привязку к карте устройства мониторинга, указав полный адрес щелчком по строке с адресом. После чего выбираем опцию
показать на карте и в случае необходимости корректируем положение на карте с помощью плавающего меню
Через некоторое время мы можем посмотреть временной график изменения данных датчика на нашем устройстве. Для этого выбираем команду меню
Профиль Мои Датчикии значок графика для выбранного датчика.