Модуль мини-веб-сервера ENC28J60 Ethernet для Arduino Nano v3.0
2018-11-09
Все статьи →
ENC28J60 Ethernet Shield позволяет подключить плату Arduino Nano v3.0 к сети. Ведущий компонент – микросхема ENC28J60, которая поддерживает стеки TCP и UDP в IP-сети. Плата имеет стандартный разъем RJ-45 со встроенным линейным трансформатором, обеспечивающий гальваническую развязку модуля от кабеля TCP\IP, и опцией 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) на карте необходимо выполнить следующие действия:
-
Подключить устройство мониторинга (в нашем случае Arduino) к источнику питания и к сети Интернет (с помощью платы Ethernet shield).
-
Настроить передачу показаний на сайт narodmon.ru с интервалом 5–15 минут (напомню, если чаще, то возможна блокировка).
Схема подключения датчика
И скетч отправки данных
#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]='\0';
c2[1]='\0';
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,'\0');
//отправляем запрос
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]!='\0');
return i;
}
// функция int to string
void itos(int n, char bufp[3]) //
{
char buf[3]={'0','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\r\n
Host: narodmon.ru\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: NN(кол-во байт в строке данных ниже)\r\n
\r\n
ID=MAC&mac1=value1&...&macN=valueN[&time=UnixTime][&name=NAME][&lat=LAT][&lng=LNG]
Скетч запускает Ethernet-соединение, плата получает IP-адрес в Сети, один раз в 5 минут считываются данные с датчика температуры, формируется строка с данными для отправки на сервер «Народный мониторинг», и данные отправляются с использованием протокола HTTP POST.
Теперь авторизуемся на сайте, используя логин и пароль, выбираем команду меню Датчики | Мои Датчики | Добавить устройство и вводим MAC-адрес нашего устройства. Если данные уже были отправлены на сайт, устройство будет добавлено.
Затем выбираем тип данных для нашего датчика (температура), устанавливаем доступ к показаниям (приватный), указываем название устройства и выполняем привязку к карте устройства мониторинга, указав полный адрес щелчком по строке с адресом. После чего выбираем опцию показать на карте и в случае необходимости корректируем положение на карте с помощью плавающего меню
Через некоторое время мы можем посмотреть временной график изменения данных датчика на нашем устройстве. Для этого выбираем команду меню Профиль | Мои Датчики и значок графика для выбранного датчика.
Перепечатано с сайта www.arduino-kit.ru
Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.