Підключення W5500 до ESЗ32, отримання точного часу по NTP та веб сервер з виводом інформації про ESP на сторінку.
WIZnet W5500 – це вбудований Ethernet-контролер з підключенням TCP/IP, 10/100 Ethernet MAC і PHY. Cтек TCP/IP підтримує TCP, UDP, IPv4, ICMP, ARP, IGMP і PPPoE. Підтримка роботи з декількома сокетами одночасно. Інтерфес підключення SPI.
Підключення W5500 до ESP32
ESP32 | W5500 |
---|---|
GPIO18 | SCK |
GPIO19 | MISO |
GPIO23 | MOSI |
GPIO5 | CS |
ENABLE | RST |
5V | 5V |
GND | GND |
В даному прикладі будем використовувати NTPClient для отримання точного часу мережі. NTP сервіс точного часу.
Код програми
Приклад з DHCP.
#include <Arduino.h>
#include <SPI.h>
#include <Ethernet.h>
#include <NTPClient.h>
#define ETHERNET_CS_PIN 5
uint8_t mac_ethernet[6] = {'\0'};
const long utcOffsetInSeconds = 7200 + 3600; // UTC +2 літній час +1
EthernetUDP ethClient;
NTPClient timeClient(ethClient, "pool.ntp.org", utcOffsetInSeconds);
void ethernet_mac(uint8_t *_mac)
{
uint8_t mac_this[6];
if (esp_base_mac_addr_get(mac_this) != ESP_OK)
{
esp_efuse_mac_get_default(mac_this);
for (int i = 0; i < 6; i++)
{
_mac[i] = mac_this[i];
if (i == 5)
{
_mac[i] = mac_this[i] + 1;
}
}
}
}
void setup()
{
Serial.begin(115200);
ethernet_mac(mac_ethernet);
Ethernet.init(ETHERNET_CS_PIN);
Ethernet.begin(mac_ethernet, 1000, 1000);
Serial.println(Ethernet.localIP());
timeClient.begin();
}
void print_time()
{
if (!timeClient.update())
{
Serial.println("Error get time !");
return;
}
Serial.print(timeClient.getHours());
Serial.print(":");
Serial.print(timeClient.getMinutes());
Serial.print(":");
Serial.println(timeClient.getSeconds());
}
void loop()
{
static unsigned int timer = 0;
if ((millis() - timer) > 1000)
{
timer = millis();
print_time();
}
Ethernet.maintain();
}
Код програми з статичною IP адресою
IP адресу та шлюз (gateway) задйте свої.
#include <Arduino.h>
#include <SPI.h>
#include <Ethernet.h>
#include <NTPClient.h>
#define ETHERNET_CS_PIN 5
uint8_t mac_ethernet[6] = {'\0'};
IPAddress ip(192, 168, 1, 18);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(8, 8, 8, 8);
const long utcOffsetInSeconds = 7200 + 3600; // UTC +2 літній час +1
EthernetUDP ethClient;
NTPClient timeClient(ethClient, "pool.ntp.org", utcOffsetInSeconds);
void ethernet_mac(uint8_t *_mac)
{
uint8_t mac_this[6];
if (esp_base_mac_addr_get(mac_this) != ESP_OK)
{
esp_efuse_mac_get_default(mac_this);
for (int i = 0; i < 6; i++)
{
_mac[i] = mac_this[i];
if (i == 5)
{
_mac[i] = mac_this[i] + 1;
}
}
}
}
void setup()
{
Serial.begin(115200);
ethernet_mac(mac_ethernet);
Ethernet.init(ETHERNET_CS_PIN);
Ethernet.begin(mac_ethernet, ip, dns, gateway, subnet);
Serial.println(Ethernet.localIP());
timeClient.begin();
}
void print_time()
{
if (!timeClient.update())
{
Serial.println("Error get time !");
return;
}
Serial.print(timeClient.getHours());
Serial.print(":");
Serial.print(timeClient.getMinutes());
Serial.print(":");
Serial.println(timeClient.getSeconds());
}
void loop()
{
static unsigned int timer = 0;
if ((millis() - timer) > 1000)
{
timer = millis();
print_time();
}
}
Даний код отримує точний час по NTP протоколу та виводить його у термінал серійного порту.
Наступний приклад створює веб сервер та виводить на сторінку час та інформацію про ESP.
#include <>