| Ваш IP: 18.204.227.117 | Online(23) - гости: 16, боты: 7 | Загрузка сервера: 0.38 ::::::::::::


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

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

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

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

  • Как работает микрофон

    Как работает микрофон

    В этом выпуске: что такое микрофон, принцип действия микрофона, как работает микрофон.Подробнее...
  • Низковольтный двухканальный усилитель мощности звуковой частоты КР174УН31

    Низковольтный двухканальный усилитель мощности звуковой частоты КР174УН31

    Микросхема КР174УН31 предназначена для применения в качестве оконечного каскада усиления звукового сигнала, подаваемого с микросхемы непосредственно на громкоговорители (сопротивление более 8 Ом), в малогабаритной аппаратуре (радиоприемниках, плейерах, беспроводных телефонах). Параметры микросхемы представлены в табл.1. Микросхема выпускается в 8-выводном корпусе DIP (типа 2101.8-1). Чертеж дан на рис.1. Типовые схемы включения — …Подробнее...
  • Простой преобразователь однополярного напряжения в 2-х полярное

    В маломощных уст-вах для питания например ОУ необходимо двух полярное напряжение питания, но имеется только один источник напряжения, например батарея КРОНА, что бы решить эту проблему можно применить простой преобразователь показанный на рисунке. В схеме использован таймер NE555 который работает как генератор импульсов с частотой 100Гц, на выходе генератора стоят …Подробнее...
  • Входной делитель для частотомера

    Входной делитель для частотомера

    Данная приставка позволяет расширить диапазон частотомера до 100-300МГц при верхнем пределе частотомера в 10-30МГц, то есть приставка представляет собой ВЧ делитель частоты на 10. Входное сопротивление приставки 75 Ом, чувствительность по входу 0,5В. VD1 VD2 совместно с R1 представляют собой ограничитель входного напряжения. Далее следует ВЧ дифференциальный усилитель на D1.1, …Подробнее...
  • Термостабилизатор для аквариума

    Несмотря на простоту предложенная схема обеспечивает высокую точность поддержания температуры и экономичность, при выключенном нагревателе уст-во потребляет не более чем 1,5Вт. Датчиком температуры является терморезистор RK1 с отрицательным ТКС. При снижении температуры воды на выводе 6 DA1 появиться напряжение низкого уровня относительно минуса питания (катод VS1). В цепи базы VT1 …Подробнее...