Site icon Renzo Mischianti

Integrating LAN8720 with ESP32 Using Core 3: Native Ethernet Protocol Support with SSL and Other Features

Spread the love

Integrating lan8720 with ESP32 Using Core 3

With the introduction of Core 3, the ESP32 supports native Ethernet protocols, bringing the same features available for Wi-Fi, including SSL, to wired connections. This article explores integrating the LAN8720 Ethernet module with the ESP32 using Core 3, following a similar structure to our previous guides on W5500 and LAN8720 with Core 2. We will cover the setup, configuration, and practical applications.

Introduction

The ESP32’s ability to handle both Wi-Fi and Ethernet connections makes it a versatile choice for IoT applications. With Core 3, the ESP32 can now natively support Ethernet protocols, simplifying the process of integrating modules like the LAN8720 for secure and efficient wired connections.

Hardware Requirements

To get started, you will need the following components:

lan8720 vs w5500

The W5500 and LAN8720 are both Ethernet controllers, but they serve different roles and have distinct features:

  1. W5500:
    • Manufacturer: Wiznet
    • Type: Full hardware TCP/IP stack Ethernet controller.
    • Main Features:
      • Integrated TCP/IP protocol stack which can handle TCP, UDP, IPv4, ICMP, ARP, IGMP, and PPPoE protocols.
      • Supports up to 8 simultaneous socket connections.
      • SPI (Serial Peripheral Interface) for communication with host controllers.
      • Internal 32Kbytes memory for TX/RX buffers.
      • Suitable for embedded applications due to its ease of integration and minimal host processor loading.
      • Typically used with microcontrollers like Arduino, STM32, etc.
  2. LAN8720:
    • Manufacturer: Microchip Technology (previously SMSC)
    • Type: Physical Layer Transceiver (PHY).
    • Main Features:
      • Operates at the physical layer of the OSI model.
      • Supports 10BASE-T and 100BASE-TX Ethernet standards.
      • It uses RMII (Reduced Media Independent Interface) to communicate with host controllers.
      • Lower power consumption.
      • Generally used in applications that require a separate MAC (Media Access Control) layer controller, often found in more complex systems like those with ARM processors.

Key Differences:

W5500 and the LAN8720 modules use different interfaces for communication, providing distinct advantages and use cases.

Here a selection of the most widespread Ethernet devices w5500 lite - w5500 - enc26j60 mini - enc26j60 - lan8720

Both modules are now supported natively by ESP32 Core 3, enabling Ethernet connectivity with features such as SSL/TLS for secure communication. But RMII interface was supported also in core 2, so you can’t find a lot of difference from the previous article about lan8720 but pay attention.

Wiring

By default, the CHIP device has this wiring.

Common Pin Assignments from the official documentation

Using ESP32 internal MAC

GPIORMII SignalNotes
GPIO21TX_ENEMAC_TX_EN
GPIO19TX0EMAC_TXD0
GPIO22TX1EMAC_TXD1
GPIO25RX0EMAC_RXD0
GPIO26RX1EMAC_RXD1
GPIO27CRS_DVEMAC_RX_DRV
GPIOFunctionNotes
GPIO0EMAC_TX_CLK/CLK_OUT1input/output
GPIO16EMAC_CLK_OUToutput
GPIO17EMAC_CLK_180output
GPIOSMI SignalNotes
GPIO23MDCOutput to PHY
GPIO18MDIOBidirectional

Wiring the prototyping board

Here my selection of esp32 ESP32 Dev Kit v1 - TTGO T-Display 1.14 ESP32 - NodeMCU V3 V2 ESP8266 Lolin32 - NodeMCU ESP-32S - WeMos Lolin32 - WeMos Lolin32 mini - ESP32-CAM programmer - ESP32-CAM bundle - ESP32-WROOM-32 - ESP32-S

Here my selection of esp32s3 ESP32 S3 Purlple AI-S3 - YD-ESP32-S3 - ESP32-S3-DevKitC-1 - ESP32-S3-DevKitC-1 - ESP32-S3 Board screen

Here is the wiring with an esp32 with 38 pins.

In our prototype board, we start the wiring with this configuration (the standard one)

esp32lan8720
3V3Vcc
GNDGND
GPIO18MDIO
GPIO19TXD0
GPIO21TXEN
GPIO22TXD1
GPIO23MDC
GPIO25RXD0
GPIO26RXD1
GPIO27CRS_DV
GPIO0nINT/RETCLM

But with this version and China lan8720 board you can get a problem, rondomically you get a message like this.

mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:13260
load:0x40080400,len:3028
entry 0x400805e4
ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download 
ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download 

Sometimes, it works, and other times, it doesn’t. This is because you attach GPIO0 to the Crystal Oscillator. When the Oscillator is HIGH, GPIO0 puts your ESP32 in boot mode; if you are lucky and the Oscillator is LOW, you boot normally.

To fix this problem, you must solder a wire from the enable pin of the oscillator to the NC (Not connected) pin and wire like so.

esp32lan8720 patched
3V3Vcc
GNDGND
GPIO18MDIO
GPIO19TXD0
GPIO21TXEN
GPIO22TXD1
GPIO23MDC
GPIO25RXD0
GPIO26RXD1
GPIO27CRS_DV
GPIO0nINT/RETCLM
GPIO17NC
// I²C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110)
#define ETH_PHY_ADDR 1 						// DEFAULT VALUE IS 0 YOU CAN OMIT IT
// Type of the Ethernet PHY (LAN8720 or TLK110)
#define ETH_PHY_TYPE ETH_PHY_LAN8720 		// DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_PHY_POWER 17					// DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C clock signal for the Ethernet PHY
#define ETH_PHY_MDC 23 						// DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C IO signal for the Ethernet PHY
#define ETH_PHY_MDIO 18 					// DEFAULT VALUE YOU CAN OMIT IT
// External clock from crystal oscillator
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN 	// DEFAULT VALUE YOU CAN OMIT IT

// Fixed value for RMI
//#define ETH_RMII_TX_EN  21
//#define ETH_RMII_TX0    19
//#define ETH_RMII_TX1    22
//#define ETH_RMII_RX0    25
//#define ETH_RMII_RX1_EN 26
//#define ETH_RMII_CRS_DV 27

Here is the patch on my device.

Configuring the Ethernet Settings

Configure the Ethernet settings in your sketch.

  ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_MDC, ETH_PHY_MDIO, ETH_PHY_POWER, ETH_CLK_MODE);

Or you can put the define before the ETH.h include.

Use the Network onEvent function to know when we are ready to make a request.

  Network.onEvent(onEvent);

You must create a function to manage the connection event or to monitor all states of the network.

void onEvent(arduino_event_id_t event, arduino_event_info_t info)
{
  switch (event) {
    case ARDUINO_EVENT_ETH_START:
      Serial.println("ETH Started");
      //set eth hostname here
      ETH.setHostname("esp32-eth0");
      break;
    case ARDUINO_EVENT_ETH_CONNECTED:
      Serial.println("ETH Connected");
      break;
    case ARDUINO_EVENT_ETH_GOT_IP:
      Serial.printf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif));
      Serial.println(ETH);
      eth_connected = true;
      break;
    case ARDUINO_EVENT_ETH_LOST_IP:
      Serial.println("ETH Lost IP");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_DISCONNECTED:
      Serial.println("ETH Disconnected");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_STOP:
      Serial.println("ETH Stopped");
      eth_connected = false;
      break;
    default:
      break;
  }
}

After the connection, we will be ready to do the operations.

Simple HTTP request

First of all, we’ll try to make a simple HTTP request. I chose an online service created to test this kind of request to do this test.

I’m going to use a simple service given from httpbin.org, and you can use the same REST API in HTTP and HTTPS.

Remember that HTTP works on port 80 and HTTPS on 443, so to query the endpoint on the 443 port, you must validate a certificate.

Then, we try to connect and request an endpoint in GET.

// Test client connection
void testClient(const char * host, uint16_t port)
{
  Serial.print("\nconnecting to ");
  Serial.println(host);

  NetworkClient client;

  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }
  client.println("GET /get HTTP/1.1");
  client.println("Host: httpbin.org");
  client.println("Connection: close");
  client.println();

  while (client.connected() && !client.available());
  while (client.available()) {
    Serial.write(client.read());
  }

  Serial.println("closing connection\n");
  client.stop();
}

Remember to make the request after the module handshake is completed.

void loop()
{
  if (eth_connected) {
    testClient("httpbin.org", 80);
  }
  delay(10000);
}

And finally, the complete sketch.

/*
 This sketch shows how to use lan8720 with esp32 core 3 with minimal/standard configuration

 by Renzo Mischianti <mischianti.org>
 */
#include <ETH.h>

// I²C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110)
#define ETH_PHY_ADDR 1 						// DEFAULT VALUE IS 0 YOU CAN OMIT IT
// Type of the Ethernet PHY (LAN8720 or TLK110)
#define ETH_PHY_TYPE ETH_PHY_LAN8720 		// DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_PHY_POWER 17					// DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C clock signal for the Ethernet PHY
#define ETH_PHY_MDC 23 						// DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C IO signal for the Ethernet PHY
#define ETH_PHY_MDIO 18 					// DEFAULT VALUE YOU CAN OMIT IT
// External clock from crystal oscillator
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN 	// DEFAULT VALUE YOU CAN OMIT IT

// Fixed value for RMI
//#define ETH_RMII_TX_EN  21
//#define ETH_RMII_TX0    19
//#define ETH_RMII_TX1    22
//#define ETH_RMII_RX0    25
//#define ETH_RMII_RX1_EN 26
//#define ETH_RMII_CRS_DV 27


static bool eth_connected = false;

// Ethernet event handler
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
{
  switch (event) {
    case ARDUINO_EVENT_ETH_START:
      Serial.println("ETH Started");
      // Set Ethernet hostname here
      ETH.setHostname("esp32-eth0");
      break;
    case ARDUINO_EVENT_ETH_CONNECTED:
      Serial.println("ETH Connected");
      break;
    case ARDUINO_EVENT_ETH_GOT_IP:
      Serial.printf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif));
      Serial.println(ETH);
      eth_connected = true;
      break;
    case ARDUINO_EVENT_ETH_LOST_IP:
      Serial.println("ETH Lost IP");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_DISCONNECTED:
      Serial.println("ETH Disconnected");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_STOP:
      Serial.println("ETH Stopped");
      eth_connected = false;
      break;
    default:
      break;
  }
}

// Test client connection
void testClient(const char * host, uint16_t port)
{
  Serial.print("\nconnecting to ");
  Serial.println(host);

  NetworkClient client;
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }
  client.println("GET /get HTTP/1.1");
  client.println("Host: httpbin.org");
  client.println("Connection: close");
  client.println();

  while (client.connected() && !client.available());
  while (client.available()) {
    Serial.write(client.read());
  }

  Serial.println("closing connection\n");
  client.stop();
}

void setup()
{
  Serial.begin(115200);
  Network.onEvent(onEvent);

//  ETH.begin();
  ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_MDC, ETH_PHY_MDIO, ETH_PHY_POWER, ETH_CLK_MODE);
}

void loop()
{
  if (eth_connected) {
    testClient("httpbin.org", 80);
  }
  delay(10000);
}

The result is this.

ETH Started
ETH Connected
ETH Got IP: 'eth0'
*eth0: <UP,100M,FULL_DUPLEX,AUTO,ADDR:0x1> (DHCPC,GARP,IP_MOD)
      ether B8:D6:1A:68:E5:7F
      inet 192.168.1.146 netmask 255.255.255.0 broadcast 192.168.1.255
      gateway 192.168.1.1 dns 192.168.1.10


connecting to httpbin.org
HTTP/1.1 200 OK
Date: Mon, 22 Jul 2024 13:15:13 GMT
Content-Type: application/json
Content-Length: 199
Connection: close
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
 
{
  "args": {}, 
  "headers": {
    "Host": "httpbin.org", 
    "X-Amzn-Trace-Id": "Root=1-669e5b60-3756730c76c74b21622ca9c0"
  }, 
  "origin": "84.221.199.122", 
  "url": "http://httpbin.org/get"
}
closing connection

HTTPS request

Now, if we change the endpoint to port 443, we will request a secure server with SSL encryption.

// Test client connection
void testClient(const char * host, uint16_t port)
{
  Serial.print("\nconnecting to ");
  Serial.println(host);

  NetworkClientSecure client;
  client.setInsecure();

  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }
  client.println("GET /get HTTP/1.1");
  client.println("Host: httpbin.org");
  client.println("Connection: close");
  client.println();

  while (client.connected() && !client.available());
  while (client.available()) {
    Serial.write(client.read());
  }

  Serial.println("closing connection\n");
  client.stop();
}

If you don’t set insecure mode, you can’t connect and receive a message like this.

ETH Started
ETH Connected
ETH Got IP: 'eth0'
*eth0: <UP,100M,FULL_DUPLEX,AUTO,ADDR:0x1> (DHCPC,GARP,IP_MOD)
      ether B8:D6:1A:68:E5:7F
      inet 192.168.1.146 netmask 255.255.255.0 broadcast 192.168.1.255
      gateway 192.168.1.1 dns 192.168.1.10


connecting to httpbin.org
connection failed

And use the 433 port.

void loop()
{
  if (eth_connected) {
    testClient("httpbin.org", 443);
  }
  delay(10000);
}

Here is the complete sketch.

/*
 This sketch shows how to use lan8720 with esp32 core 3 with minimal/standard configuration
 In this example we are going to use https with insecure setting.

 by Renzo Mischianti <mischianti.org>
 */
#include <ETH.h>
#include <NetworkClientSecure.h>

// I²C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110)
#define ETH_PHY_ADDR 1 						// DEFAULT VALUE IS 0 YOU CAN OMIT IT
// Type of the Ethernet PHY (LAN8720 or TLK110)
#define ETH_PHY_TYPE ETH_PHY_LAN8720 		// DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_PHY_POWER 17					// DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C clock signal for the Ethernet PHY
#define ETH_PHY_MDC 23 						// DEFAULT VALUE YOU CAN OMIT IT
// Pin# of the I²C IO signal for the Ethernet PHY
#define ETH_PHY_MDIO 18 					// DEFAULT VALUE YOU CAN OMIT IT
// External clock from crystal oscillator
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN 	// DEFAULT VALUE YOU CAN OMIT IT

// Fixed value for RMI
//#define ETH_RMII_TX_EN  21
//#define ETH_RMII_TX0    19
//#define ETH_RMII_TX1    22
//#define ETH_RMII_RX0    25
//#define ETH_RMII_RX1_EN 26
//#define ETH_RMII_CRS_DV 27


static bool eth_connected = false;

// Ethernet event handler
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
{
  switch (event) {
    case ARDUINO_EVENT_ETH_START:
      Serial.println("ETH Started");
      // Set Ethernet hostname here
      ETH.setHostname("esp32-eth0");
      break;
    case ARDUINO_EVENT_ETH_CONNECTED:
      Serial.println("ETH Connected");
      break;
    case ARDUINO_EVENT_ETH_GOT_IP:
      Serial.printf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif));
      Serial.println(ETH);
      eth_connected = true;
      break;
    case ARDUINO_EVENT_ETH_LOST_IP:
      Serial.println("ETH Lost IP");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_DISCONNECTED:
      Serial.println("ETH Disconnected");
      eth_connected = false;
      break;
    case ARDUINO_EVENT_ETH_STOP:
      Serial.println("ETH Stopped");
      eth_connected = false;
      break;
    default:
      break;
  }
}

// Test client connection
void testClient(const char * host, uint16_t port)
{
  Serial.print("\nconnecting to ");
  Serial.println(host);

  NetworkClientSecure client;
  client.setInsecure();

  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }
  client.println("GET /get HTTP/1.1");
  client.println("Host: httpbin.org");
  client.println("Connection: close");
  client.println();

  while (client.connected() && !client.available());
  while (client.available()) {
    Serial.write(client.read());
  }

  Serial.println("closing connection\n");
  client.stop();
}

void setup()
{
  Serial.begin(115200);
  Network.onEvent(onEvent);

//  ETH.begin();
  ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_MDC, ETH_PHY_MDIO, ETH_PHY_POWER, ETH_CLK_MODE);
}

void loop()
{
  if (eth_connected) {
    testClient("httpbin.org", 443);
  }
  delay(10000);
}

Now, when we execute the sketch, we obtain this output.

ETH Started
ETH Connected
ETH Got IP: 'eth0'
*eth0: <UP,100M,FULL_DUPLEX,AUTO,ADDR:0x1> (DHCPC,GARP,IP_MOD)
      ether B8:D6:1A:68:E5:7F
      inet 192.168.1.146 netmask 255.255.255.0 broadcast 192.168.1.255
      gateway 192.168.1.1 dns 192.168.1.10


connecting to httpbin.org
HTTP/1.1 200 OK
Date: Mon, 22 Jul 2024 13:22:07 GMT
Content-Type: application/json
Content-Length: 200
Connection: close
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
 
{
  "args": {}, 
  "headers": {
    "Host": "httpbin.org", 
    "X-Amzn-Trace-Id": "Root=1-669e5cff-79adceda5a489dfc30f72b4c"
  }, 
  "origin": "84.221.199.122", 
  "url": "https://httpbin.org/get"
}
ÿclosing connection

Retrieve certificate

As you can see, for the test, I use the insecure mode

  NetworkClientSecure client;
  client.setInsecure();

Bat, the right thing to do is to retrieve the Certification Authority certificate to validate the host.

So, on the httpbin page, click on the site’s settings.

Then, you must select the connection information.

Now click on the certificate.

And finally, select the line at the top of the list (the root certificate).

Export the certificate and open the file, copy the content and put all in a char array variable.

const char* rootCA= R""""(-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
rqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----)"""";

Now, we can set the Certification Authority certificate. To do the check, we must validate the server httpbin to the NetworkClientSecure.

  NetworkClientSecure client;
  client.setCACert(rootCA);

Conclusion

Integrating the W5500 Ethernet module with the ESP32 using Core 3 expands the capabilities of your IoT projects by providing robust and secure wired network connectivity. With the native support for Ethernet protocols, SSL/TLS, and other features, you can leverage the full potential of the ESP32 for diverse applications.

  1. ESP32: pinout, specs and Arduino IDE configuration
  2. ESP32: integrated SPIFFS Filesystem
  3. ESP32: manage multiple Serial and logging
  4. ESP32 practical power saving
    1. ESP32 practical power saving: manage WiFi and CPU
    2. ESP32 practical power saving: modem and light sleep
    3. ESP32 practical power saving: deep sleep and hibernation
    4. ESP32 practical power saving: preserve data, timer and touch wake up
    5. ESP32 practical power saving: external and ULP wake up
    6. ESP32 practical power saving: UART and GPIO wake up
  5. ESP32: integrated LittleFS FileSystem
  6. ESP32: integrated FFat (Fat/exFAT) FileSystem
  7. ESP32-wroom-32
    1. ESP32-wroom-32: flash, pinout, specs and IDE configuration
  8. ESP32-CAM
    1. ESP32-CAM: pinout, specs and Arduino IDE configuration
    2. ESP32-CAM: upgrade CamerWebServer with flash features
  9. ESP32: use ethernet w5500 with plain (HTTP) and SSL (HTTPS)
  10. ESP32: use ethernet enc28j60 with plain (HTTP) and SSL (HTTPS)
  11. How to use SD card with esp32
  12. esp32 and esp8266: FAT filesystem on external SPI flash memory
  1. Firmware and OTA update management
    1. Firmware management
      1. ESP32: flash compiled firmware (.bin)
      2. ESP32: flash compiled firmware and filesystem (.bin) with GUI tools
    2. OTA update with Arduino IDE
      1. ESP32 OTA update with Arduino IDE: filesystem, firmware, and password
    3. OTA update with Web Browser
      1. ESP32 OTA update with Web Browser: firmware, filesystem, and authentication
      2. ESP32 OTA update with Web Browser: upload in HTTPS (SSL/TLS) with self-signed certificate
      3. ESP32 OTA update with Web Browser: custom web interface
    4. Self OTA uptate from HTTP server
      1. ESP32 self OTA update firmware from the server
      2. ESP32 self OTA update firmware from the server with version check
      3. ESP32 self-OTA update in HTTPS (SSL/TLS) with trusted self-signed certificate
    5. Non-standard Firmware update
      1. ESP32 firmware and filesystem update from SD card
      2. ESP32 firmware and filesystem update with FTP client
  1. Integrating LAN8720 with ESP32 for Ethernet Connectivity with plain (HTTP) and SSL (HTTPS)
  2. Connecting the EByte E70 to ESP32 c3/s3 devices and a simple sketch example
  3. ESP32-C3: pinout, specs and Arduino IDE configuration
  4. Integrating W5500 with ESP32 Using Core 3: Native Ethernet Protocol Support with SSL and Other Features
  5. Integrating LAN8720 with ESP32 Using Core 3: Native Ethernet Protocol Support with SSL and Other Features

Spread the love
Exit mobile version