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

Сетевой модуль W5500 представляет собой Ethernet-контроллер на базе чипа W5500 (производства компании WIZnet). Для подключения к сети TCP/IP используется разъём RJ-45. Используя данный модуль Вы сможете передавать данные как по локальной сети, так и по сети интернет. В модуле установлен стабилизатор на 3,3 В, что позволяет его записывать от напряжения 5 В, соответственно  модуль может работать при питании 3,3 В.

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

  • Напряжение питания: 3,3 или 5 В постоянного тока.
  • Ток потребляемый модулем: до 185 мА (при Vcc = 3,3 В).
  • Интерфейс: SPI (MODE 3).
  • Количество независимых сетевых подключений: до 8.
  • Сетевые протоколы: TCP/IP: TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE.
  • Сетевые интерфейсы: 10BaseT/100BaseTX Ethernet PHY embedded.
  • Размер внутреннего буфера TX/RX: 32 Kbyte.
  • Светодиодная индикация режимов работы: (Full/Half duplex, Link, Speed, Active).
  • Рабочая температура 0…70 °C.

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

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

Плата Arduino UNO Модуль W5500
3.3V 3.3V
D12 MISO
D11 MOSI
D10 SCS
D13 SCLK
GND GND
RST RES
D2 INT

Для нормальной загрузки  скетча Вам понадобится библиотека — ethernet2.zip

#include <SPI.h>
#include <Ethernet2.h>
 
  byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  IPAddress ip(10,42,0,100);
  EthernetServer server(80);
 
void setup() { 
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP: ");
  Serial.println(Ethernet.localIP());
}
 
 
void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean ok = true;
 
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
 
        if (c == '\n' && ok) {
 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 5"); // время обновления страницы 
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><meta charset='UTF-8'>");
 
          client.println("<h1>Привет МИР!!!</h1>");
 
          client.println("</html>");
 
          break;
        }
        if (c == '\n'){ok = true;}else if(c != '\r'){ok = false;}
      }
    }
 
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}

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

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

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

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

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


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

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

Дополнительные библиотеки:

#include <SPI.h>
#include <Ethernet2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
  OneWire oneWire(A0);
  DallasTemperature t(&oneWire);
 
  byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  IPAddress ip(10,42,0,100);
  EthernetServer server(80);
 
void setup() { 
  Serial.begin(9600);
  t.begin(); 
  t.setResolution(12);// 12 bit 18b20
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP: ");
  Serial.println(Ethernet.localIP());
}
 
 
void loop() {
  t.requestTemperatures();
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean ok = true;
 
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
 
        if (c == '\n' && ok) {
 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 5"); // время обновления страницы 
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><meta charset='UTF-8'>");
 
          client.println("<h1>Температура: ");
          client.println(t.getTempCByIndex(0));
          client.println(" &#176;C</h1>");
          client.println("</html>");
 
          break;
        }
        if (c == '\n'){ok = true;}else if(c != '\r'){ok = false;}
      }
    }
 
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}

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

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

#include <SPI.h>
#include <Ethernet2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
  OneWire oneWire(A0);
  DallasTemperature t(&oneWire);
 
  byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  IPAddress ip(10,42,0,100);
  EthernetServer server(80);
 
  float temp;
  int reg,w,flag;
  String readString = String(30);
  const byte gis = 1; // гистерезис 1 градус
 
void setup() { 
  Serial.begin(9600);
  t.begin(); 
  t.setResolution(12);// 12 bit 18b20
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP: ");
  pinMode(3, OUTPUT); // D3 управление реле нагревательного элемента
  reg = EEPROM.read(0);
}
 
 
void loop() {
  t.requestTemperatures();
  temp = t.getTempCByIndex(0);
  if(reg >= (int)temp + gis){digitalWrite(3,HIGH);flag=1;} 
  if(reg <= (int)temp - gis){digitalWrite(3,LOW);flag=0;} 
 
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
 
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
 
        if (readString.length() < 30){readString.concat(c);}//Serial.print(c);
 
        if (c == '\n') {
        int a;
        a = readString.indexOf("?temp=");if(a>0){reg = readString.substring(a+6, a+9).toInt();w=1;
        if(reg<0){reg=0;}if(reg>125){reg=125;}}
 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 10"); // время обновления страницы 
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><meta charset='UTF-8'>");
          client.println("<style>.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}</style>"
          "<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>");
          client.println("<h1>Температура: ");
          client.println(temp);
          client.println(" &#176;C</h1>"
          "</td><tr><td align='center'>Установка температуры регулирования (0...125&#176;C)"); 
          client.println("<form action='' method='GET'>"
          "<br><input type='text' name='temp' autocomplete='off' size='1'></input>  "
          "<button>Подтвердить</button></form></td><tr>");
 
          client.println("<td><center>Температура регулировки: <b>");
          client.println(reg);
          client.println("&#176;C</b><br>");
 
          if(flag==1){client.print("ON");}
          if(flag==0){client.print("OFF");}
 
          client.println("</td></table></center>");
          client.println("</html>");
          readString="";
          break; 
        }
      }
    }
     if(w==1){w=0;EEPROM.update(0,reg);}
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}

Управление реле

В следующем примере показана возможность управления реле при помощи HTML страницы. При нажатии на кнопки меняется логическое состояние цифрового выхода D3 Arduino .

#include <SPI.h>
#include <Ethernet2.h>
 
  byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  IPAddress ip(10,42,0,100);
  EthernetServer server(80);
 
  String readString = String(30);
 
void setup() { 
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP: ");
  Serial.println(Ethernet.localIP());
  pinMode(3,OUTPUT);
}
 
 
void loop() {
 
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
 
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
 
        if (readString.length() < 30){readString.concat(c);}Serial.print(c);
 
        if (c == '\n') {
 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 5"); // время обновления страницы 
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><meta charset='UTF-8'>");
 
          client.println("<h1>Реле: ");
 
        if(readString.indexOf("p=1") >=0){client.println("ON");digitalWrite(3,HIGH);}
        else if(readString.indexOf("p=0") >=0){client.println("OFF");digitalWrite(3,LOW);}
        else{client.println("OFF");digitalWrite(3,LOW);}
 
          client.println("<h1>");
          client.print("<input type=button value='ON' onmousedown=location.href='/?p=1'> ");
          client.println(" <input type=button value='OFF' onmousedown=location.href='/?p=0'><br/><br/>");
 
          client.println("</html>");
          readString="";
 
          break;
 
        }
      }
    }
 
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}

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

Comments

  1. А что делать с двумя клиентами?
    1) Первый выставляет уставку 25 при температуре 28.
    2) Второй выставляет уставку 30 при температуре 28.
    В результате реле щёлкает при каждом обновлении.
    По идее должна установится последняя температура, то есть 30 и первый должен это увидеть.

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

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