Веб-сервер на ENC28J60 (Arduino)

ENC28J60 представляет собой модуль который подключается к плате Arduino с помощью SPI интерфейса, тактовая частота ISP интерфейса может достигать 20 МГц. Для подключения к сети TCP/IP используется разъём RJ-45. Модуль гальванически развязан с ним.

Характеристики модуля ENC28J60:

  • Совместимость с Ethernet сетями 10/100/1000 Base-T. Скорость передачи данных 10 мбит/сек, реализация TCP/IP стека.
  • Интерфейс связи с микроконтроллером – SPI, частота до 20 мГц.
  • Напряжение питания 3,1 – 3,6 В. Типовое 3,3 В.
  • Ток потребления от источника питания 3,3 В:
    • при передачи данных до 180 мА;
    • в активном состоянии, без передачи данных 120 мА;
    • в режиме ожидания не более 2 мА.
  • Модуль обеспечивает гальваническую развязку от линии связи.
  • Выводы интерфейса модуля совместимы с 5 вольтовым сигналам.

Так как ток потребления модуля может достигать 180 мА, то необходим отдельный стабилизированный источник питания 3,3 В с максимальным нагрузки не менее 250 мА.

Подключение модуля ENC28J60 к плате Arduino Nano (Uno):

Плата Arduino Модуль ENC28J60
D12 SO
D11 SI
D13 SCK
D10 CS
RES RST
Внешний источник питания 3,3 В VCC
GND GND

Веб-сервер на ENC28J60 позволяет создавать страницу HTML на которой будут выводится например информация об подключенных к плате Arduino датчиков. Сам модуль ENC28J60 при помощи сетевого кабеля подключается к маршрутизатору (роутер) или напрямую к сетевой карте ПК.

Далее последует несколько примеров скетчей которые позволяют просто вывести текст на веб страницу, подключить датчик температуры и выводить результат измерений и создать простой терморегулятор.


Вывод теста на страницу HTML

#include <EtherCard.h> // EtherCard-master.zip
 
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 10,42,0,100 };
 
byte Ethernet::buffer[1000];
BufferFiller bfill;
 
static word homePage() {
  bfill = ether.tcpOffset();
  bfill.emit_p(PSTR(
"<html><head><meta charset='UTF-8'>"
"<h1>Привет МИР!!!</h>"
"</html> "
  ));
  return bfill.position();
}
 
void setup () {
  Serial.begin(9600);
  ether.begin(sizeof Ethernet::buffer, mymac, 10);
  ether.staticSetup(myip);
}
 
void loop () {
 
  word pos = ether.packetLoop(ether.packetReceive());
  if (pos){ 
  ether.httpServerReply(homePage());   
}}

Для просмотра содержимого страницы Вы должны ввести в адресную строку браузера IP адрес сервера на ENC28J60. Он должен заранее прописан в скетче:

static byte myip[] = { 10,42,0,100 };

Если Вы подключили ENC28J60 к роутеру, то Вы должны использовать IP адрес внутренней сети. Например роутер имеет адрес 192.168.0.1 , то Вы можете выбрать любой не занятый IP адрес сети (к примеру 192.168.0.100).

У меня указан немного другой адрес, так как я подключил ENC28J60 напрямую к сетевой карте ПК, то моя сеть состоит всего из двух устройств (ПК и ENC28J60) и выбрал IP соответствующий именно этой сети.

В качестве МАС адреса можете использовать любые цифры (в шестнадцатеричной системе), главное чтобы он не совпадал с MAC адресами уст-в имеющихся в сети.


Термометр на DS18B20

В следующим примере будем использовать цифровой датчик температуры DS18B20. Датчик будет измерять температуру и его показания будут выводится на HTML страницу.

#include <EtherCard.h>          // EtherCard-master.zip
#include <OneWire.h>            //https://github.com/PaulStoffregen/OneWire/archive/master.zip
#include <DallasTemperature.h>  // http://rcl-radio.ru/wp-content/uploads/2018/07/DallasTemperature.zip
 
OneWire oneWire(A0);
DallasTemperature t(&oneWire);
 
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 10,42,0,100 };
 
byte Ethernet::buffer[1000];
float temp;
int temp0,temp1;
BufferFiller bfill;
String line;
 
static word homePage() {
  bfill = ether.tcpOffset();
  bfill.emit_p(PSTR(
"<html><head><meta charset='UTF-8'>"
"<meta http-equiv='refresh' content='10'/>"// обновление страницы каждые 10 секунд
"<h1>Температура: $D.$D &#176;C</h1>"
"</html> "
  ),temp0,temp1);
  return bfill.position();
}
 
void setup () {
  Serial.begin(9600);
  ether.begin(sizeof Ethernet::buffer, mymac, 10);
  ether.staticSetup(myip);
  t.begin(); 
  t.setResolution(11);
}
 
void loop () {
  t.requestTemperatures();
  temp = t.getTempCByIndex(0);
  temp0 = int(temp);
  temp1 = (temp-temp0)*100;
 
  word pos = ether.packetLoop(ether.packetReceive());
  if (pos){  // check if valid tcp data is received 
  ether.httpServerReply(homePage());   
}}


Терморегулятор DS18B20

Следующий пример позволяет реализовать терморегулятор с управлением через HTML страницу. Вы можете задать температуру регулирования, при достижении которой изменяется логическое состояние выхода D2 Arduino. Так же установленная температура регулирования заносится в энергонезависимую память.

#include <EtherCard.h>         // EtherCard-master.zip 
#include <OneWire.h>           //https://github.com/PaulStoffregen/OneWire/archive/master.zip 
#include <DallasTemperature.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/DallasTemperature.zip
#include <EEPROM.h>
OneWire oneWire(A0);
DallasTemperature t(&oneWire);
 
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 10,42,0,100 };
 
byte Ethernet::buffer[800];
float temp;
int reg,temp0,temp1,a,w;
const byte gis = 1; // гистерезис 1 градус
BufferFiller bfill;
String line;
 
static word homePage() {
  bfill = ether.tcpOffset();
  bfill.emit_p(PSTR(
"<html><head><meta charset='UTF-8'>"
"<meta http-equiv='refresh' content='10'/>"
"<style>.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}</style></head>"
 
"<br><TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='10'>"
"<td><center><big><b>Терморегулятор DS18B20</b></big></td><tr><td><center>"
"Температура: <b>$D.$D </b>&#176;C"
"</td><tr><td align='center'>Установка температуры регулирования (0...125&#176;C)"
"<form action='' method='GET'>"
"<br><input type='text' name='reg' autocomplete='off' size='1'></input>  "
"<button>Подтвердить</button></form></td><tr>"
"<td><center>Температура регулировки: <b>$D &#176;C</b></td>"
"</table>"
"</center></body></html> "
  ),temp0,temp1,reg);
  return bfill.position();
}
 
void setup () {
  Serial.begin(9600);
  pinMode(2, OUTPUT); // D2 управление реле нагревательного элемента
  ether.begin(sizeof Ethernet::buffer, mymac, 10);
  ether.staticSetup(myip);
  reg = EEPROM.read(0);
  t.begin(); 
  t.setResolution(9);
}
 
void loop () {
  t.requestTemperatures();
  temp = t.getTempCByIndex(0);
  temp0 = int(temp);
  temp1 = (temp-temp0)*100;
  if(reg >= temp + gis){digitalWrite(2,HIGH);} 
  if(reg <= temp - gis){digitalWrite(2,LOW);} 
 
  word pos = ether.packetLoop(ether.packetReceive());
  if (pos){  // check if valid tcp data is received
    char *data = (char *) Ethernet::buffer + pos;
 
  line = data;a = line.indexOf("?reg=");if(a>0){reg = line.substring(a+5, a+8).toInt();w=1;
  if(reg<0){reg=0;}if(reg>125){reg=125;}}
 
  ether.httpServerReply(homePage());   
 
 if(w==1){w=0;EEPROM.update(0,reg);}
}}

Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=949#p949

Добавить комментарий

Войти с помощью: