| Ваш IP: 3.233.219.62 | Online(27) - гости: 9, боты: 18 | Загрузка сервера: 1.33 ::::::::::::

Веб-сервер на 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

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

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

Случайные статьи

  • Блоки переключателей

    На рисунке представлена схема блока переключателей с взаимным выключением. При нажатии на кнопку SB1 на выходах 2и 3 появится лог. единица, а на выходе 1 появится логический ноль. И соответственно при нажатии SB2 или SB3 на аналогичном выходе появится лог. ноль. Переключение сигналов происходит без дребезга. При одновременном нажатии 2-х …Подробнее...
  • Автомобильные часы на светодиодах

    Схема часов показана на рисунке, часы собраны на 3-х микросхемах D1-D3. Микросхема К174ИЕ18 — содержит генератор частоты 32768Гц(с внешним кварцем), 2-а делителя на 32768 (сек) и на 60 (мин), счетчик вырабатывающий коммутирующие импульсы для динамической индикации и формирователь звукового сигнала. Цепь кв. резонатора подключена к выводам 13 и 13 D1. …Подробнее...
  • Узел задержки включения громкоговорителей

    Узел задержки включения громкоговорителей

    Эта простая схема узла задержки включения громкоговорителей, позволяет в момент включения питания усилителя мощности ЗЧ избежать щелчков в АС. Время задержки включения 5с, но изменив номинал С2 можно увеличить или уменьшить время задержки включения громкоговорителей. Элементы C1 100 мкФ 50V C2 100 мкФ 500V VD1 1N4007 VD2 1N4148 VT1 BC547 …Подробнее...
  • Моностабильный режим таймера 555

    Моностабильный режим таймера 555

    Основные режимы работы таймера 555 — это моностабильный (одновибраторный) и астабильный (мультивибраторный). Соединение схемы для работы в моностабильном режиме показано на рис.1. В моностабильном режиме для схемы требуются времязадающий резистор, конденсатор и блокировочный конденсатор, соединенный с выводами управления в качестве внешних компонентов. Когда запускающий импульс поступает на вход запуска (вывод 2) …Подробнее...
  • EEPROM.put (Arduino)

    EEPROM.put (Arduino)

    EEPROM.put()  функция записывает данные любого стандартного типа или произвольную структуру в энергонезависимую память EEPROM, иначе говоря если размер данных превышает 1 байт, нужно использовать функцию EEPROM.put(). При записи данных в EEPROM размер которых превышает 1 байт, необходимо корректный расчет адресов по которым будет производится запись, для расчета адресов используется функция sizeof(). Для …Подробнее...