- Why do we need this Ethernet_Manager_STM32 library
- Changelog
- Prerequisites
- Installation
- Packages' Patches
- Libraries' Patches
- HOWTO Fix
Multiple Definitions
Linker Error - Configuration Notes
- How to use default Credentials and have them pre-loaded onto Config Portal
- How to use
- Important Notes for using Dynamic Parameters' ids
- HOWTO use STM32F4 with LAN8720
- Examples
- So, how it works?
- Example MQTT_ThingStream_Ethernet_STM32
- Debug Terminal Output Samples
- 1. Ethernet_STM32 on STM32F7 NUCLEO_F767ZI with LAN8742A Ethernet using STM32Ethernet Library
- 2. Ethernet_STM32 on STM32F7 NUCLEO_F767ZI with W5500 Ethernet using Ethernet_Generic Library
- 3. MQTT_ThingStream_Ethernet_STM32 on STM32F7 NUCLEO_F767ZI with ENC28J60 Ethernet using EthernetENC Library
- 4. Ethernet_STM32 on STM32F7 NUCLEO_F767ZI with W5x00 Ethernet using Ethernet_Generic Library
- 5. MQTT_ThingStream_Ethernet_STM32 on STM32F7 NUCLEO_F767ZI with LAN8742A Ethernet using STM32Ethernet Library
- 6. MQTT_ThingStream_Ethernet_STM32_LAN8720 on STM32F4 BLACK_F407VE with LAN8720 Ethernet using STM32Ethernet Library
- Debug
- Troubleshooting
- Issues
- TO DO
- DONE
- Contributions and Thanks
- Contributing
- License
- Copyright
Why do we need this Ethernet_Manager_STM32 library
- This is the new library, adding to the current WiFiManager/Ethernet_Manager sets of libraries. It's designed to help you eliminate
hardcoding
your Credentials in STM32F/L/H/G/WB/MP1 boards using Ethernet shields (W5100, W5200, W5500, ENC28J60, LAN8720, built-in LAN8742A Ethernet). It's currently not supporting SSL. Will support soon. - You can update Credentials any time you need to change via Configure Portal. Data are saved in configurable locations in EEPROM.
- DoubleDetectDetector feature to force Config Portal when double reset is detected within predetermined time, default 10s.
- Configurable Config Portal Title to be either BoardName or default undistinguishable names.
- Examples are redesigned to separate Credentials / Defines / Dynamic Params / Code so that you can change Credentials / Dynamic Params quickly for each device. Example MQTT_ThingStream_Ethernet_STM32 will demonstrate how to use the dynamic parameters, entered via Config Portal, to connect to ThingStream MQTT Server at
mqtt.thingstream.io
.
New recent features:
- DoubleDetectDetector feature to force Config Portal when double reset is detected within predetermined time, default 10s.
- Configurable Config Portal Title to be either BoardName or default undistinguishable names.
- Examples are redesigned to separate Credentials / Defines / Dynamic Params / Code so that you can change Credentials / Dynamic Params quickly for each device
- STM32 boards with built-in Ethernet LAN8742A such as :
- Nucleo-144 (F429ZI, F767ZI)
- Discovery (STM32F746G-DISCOVERY)
- All STM32 boards (STM32F/L/H/G/WB/MP1) with 32K+ Flash, with Built-in Ethernet
- See EthernetWebServer_STM32 Support and Test Results
- STM32F/L/H/G/WB/MP1 boards (with 32+K Flash) running W5x00 or ENC28J60 shields)
- Nucleo-144
- Nucleo-64
- Discovery
- Generic STM32F0, STM32F1, STM32F2, STM32F3, STM32F4, STM32F7 (with 64+K Flash): x8 and up
- STM32L0, STM32L1, STM32L4
- STM32G0, STM32G4
- STM32H7
- STM32WB
- STM32MP1
- LoRa boards
- 3-D printer boards
- Generic Flight Controllers
- Midatronics boards
- STM32 boards using Ethernet LAN8720 such as :
- Nucleo-144 (F429ZI, NUCLEO_F746NG, NUCLEO_F746ZG, NUCLEO_F756ZG)
- Discovery (DISCO_F746NG)
- STM32F4 boards (BLACK_F407VE, BLACK_F407VG, BLACK_F407ZE, BLACK_F407ZG, BLACK_F407VE_Mini, DIYMORE_F407VGT, FK407M1)
- Built-in Ethernet LAN8742A using
STM32Ethernet library
- W5x00 using
Ethernet_Generic
library - ENC28J60 using
EthernetENC
orUIPEthernet
library - LAN8720 using
STM32Ethernet
andLwIP
libraries.
These boards are not supported:
- Some Nucleo-32 (small Flash/memory)
- Eval (no Serial, just need to redefine in sketch, library and UIPEthernet)
- Generic STM32F0 (small Flash/memory)
- Generic STM32F1 (with 64-K Flash): C6
- Generic STM32F3 : no HardwareSPI.h
- Electronics Speed Controllers (small Flash/memory)
Arduino IDE 1.8.19+
for Arduino.Arduino Core for STM32 v2.3.0+
for STM32 boards.EthernetWebServer_STM32 library v1.5.0+
. To install. checkFlashStorage_STM32 library v1.2.0+
for STM32 boards other than STM32F1. To install. checkFlashStorage_STM32F1 library v1.1.0+
for STM32F1 boards with 64KB+ Flash (STM32F1C8, STM32F1CB, etc.). To install. checkFunctional-Vlpp library v1.0.2+
to use server's lambda function. To install. checkDoubleResetDetector_Generic library v1.8.1+
. To install. check .- For LAN8720 or built-in LAN8742A Ethernet:
STM32Ethernet library v1.3.0+
for built-in LAN8742A Ethernet on (Nucleo-144, Discovery).LwIP library v2.1.2+
for built-in LAN8742A Ethernet on (Nucleo-144, Discovery).
- For W5x00 Ethernet:
Ethernet_Generic library v2.7.1+
for W5100, W5200 and W5500/WIZ550io/WIZ850io/USR-ES1 with Wiznet W5500 chip.
- For ENC28J60 Ethernet:
EthernetENC library v2.0.3+
for ENC28J60. . New and BetterUIPEthernet library v2.0.12+
for ENC28J60.
The suggested way to install is to:
The best way is to use Arduino Library Manager
. Search for Ethernet_Manager_STM32
, then select / install the latest version. You can also use this link for more detailed instructions.
- Navigate to Ethernet_Manager_STM32 page.
- Download the latest release
Ethernet_Manager_STM32-main.zip
. - Extract the zip file to
Ethernet_Manager_STM32-main
directory - Copy the whole
Ethernet_Manager_STM32-main
folder to Arduino libraries' directory such as~/Arduino/libraries/
.
- Install VS Code
- Install PlatformIO
- Install Ethernet_Manager_STM32 library by using Library Manager. Search for Ethernet_Manager_STM32 in Platform.io Author's Libraries
- Use included platformio.ini file from examples to ensure that all dependent libraries will installed automatically. Please visit documentation for the other options and examples at Project Configuration File
To use LAN8720 on some STM32 boards
- Nucleo-144 (F429ZI, NUCLEO_F746NG, NUCLEO_F746ZG, NUCLEO_F756ZG)
- Discovery (DISCO_F746NG)
- STM32F4 boards (BLACK_F407VE, BLACK_F407VG, BLACK_F407ZE, BLACK_F407ZG, BLACK_F407VE_Mini, DIYMORE_F407VGT, FK407M1)
you have to copy the files stm32f4xx_hal_conf_default.h and stm32f7xx_hal_conf_default.h into STM32 stm32 directory (~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system) to overwrite the old files.
Supposing the STM32 stm32 core version is 2.2.0. These files must be copied into the directory:
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h
for STM32F4.~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h
for Nucleo-144 STM32F7.
Whenever a new version is installed, remember to copy this file into the new version directory. For example, new version is x.yy.zz, these files must be copied into the corresponding directory:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.h
- `~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F7xx/stm32f7xx_hal_conf_default.h
To use Serial1 on some STM32 boards without Serial1 definition (Nucleo-144 NUCLEO_F767ZI, Nucleo-64 NUCLEO_L053R8, etc.) boards, you have to copy the files STM32 variant.h into STM32 stm32 directory (~/.arduino15/packages/STM32/hardware/stm32/2.3.0). You have to modify the files corresponding to your boards, this is just an illustration how to do.
Supposing the STM32 stm32 core version is 2.3.0. These files must be copied into the directory:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/STM32F7xx/F765Z(G-I)T_F767Z(G-I)T_F777ZIT/NUCLEO_F767ZI/variant.h
for Nucleo-144 NUCLEO_F767ZI.~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/STM32L0xx/L052R(6-8)T_L053R(6-8)T_L063R8T/NUCLEO_L053R8/variant.h
for Nucleo-64 NUCLEO_L053R8.
Whenever a new version is installed, remember to copy this file into the new version directory. For example, new version is x.yy.zz, these files must be copied into the corresponding directory:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/variants/STM32F7xx/F765Z(G-I)T_F767Z(G-I)T_F777ZIT/NUCLEO_F767ZI/variant.h
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/variants/STM32L0xx/L052R(6-8)T_L053R(6-8)T_L063R8T/NUCLEO_L053R8/variant.h
If your application requires 2K+ HTML page, the current Ethernet library
must be modified if you are using W5200/W5500 Ethernet shields. W5100 is not supported for 2K+ buffer. If you use boards requiring different CS/SS pin for W5x00 Ethernet shield, for example ESP32, ESP8266, nRF52, etc., you also have to modify the following libraries to be able to specify the CS/SS pin correctly.
To fix Ethernet library
, just copy these following files into the Ethernet library
directory to overwrite the old files:
To fix EthernetLarge library
, just copy these following files into the EthernetLarge library
directory to overwrite the old files:
To fix Ethernet2 library
, just copy these following files into the Ethernet2 library
directory to overwrite the old files:
To add UDP Multicast support, necessary for the UPnP_Generic library:
- To fix
Ethernet3 library
, just copy these following files into theEthernet3 library
directory to overwrite the old files:
To be able to compile and run on nRF52 boards with ENC28J60 using UIPEthernet library, you have to copy these following files into the UIPEthernet utility
directory to overwrite the old files:
The current library implementation, using xyz-Impl.h
instead of standard xyz.cpp
, possibly creates certain Multiple Definitions
Linker error in certain use cases.
You can use
#include <Ethernet_Manager_STM32.hpp> //https://github.com/khoih-prog/Ethernet_Manager_STM32
in many files. But be sure to use the following #include <NTPClient_Generic.h>
in just 1 .h
, .cpp
or .ino
file, which must not be included in any other file, to avoid Multiple Definitions
Linker Error
// To be included only in main(), .ino with setup() to avoid `Multiple Definitions` Linker Error
#include <Ethernet_Manager_STM32.h> //https://github.com/khoih-prog/Ethernet_Manager_STM32
Check multiFileProject for a demo how to avoid multiple-definitions
linker error for multiple-file project
- Standard W5x00 Ethernet_Generic Library
Standard W5x00 using Ethernet_Generic library is used by default, in the sketch, just be sure to comment out or leave these #defines to be false :
// Only one if the following to be true
#define USE_BUILTIN_ETHERNET false
#define USE_ETHERNET_GENERIC false
#define USE_ETHERNET_ENC false
#define USE_UIP_ETHERNET false
#define USE_CUSTOM_ETHERNET false
// Only one if the following to be true
#define USE_BUILTIN_ETHERNET true
#define USE_ETHERNET_GENERIC false
#define USE_ETHERNET_ENC false
#define USE_UIP_ETHERNET false
#define USE_CUSTOM_ETHERNET false
#define USING_LAN8720 true
// Only one if the following to be true
#define USE_BUILTIN_ETHERNET true
#define USE_ETHERNET_GENERIC false
#define USE_ETHERNET_ENC false
#define USE_UIP_ETHERNET false
#define USE_CUSTOM_ETHERNET false
// Only one if the following to be true
#define USE_BUILTIN_ETHERNET true
#define USE_ETHERNET_GENERIC false
#define USE_ETHERNET_ENC false
#define USE_UIP_ETHERNET false
#define USE_CUSTOM_ETHERNET false
// Only one if the following to be true
#define USE_BUILTIN_ETHERNET false
#define USE_ETHERNET_GENERIC false
#define USE_ETHERNET_ENC true
#define USE_UIP_ETHERNET false
#define USE_CUSTOM_ETHERNET false
// Only one if the following to be true
#define USE_BUILTIN_ETHERNET false
#define USE_ETHERNET_GENERIC false
#define USE_ETHERNET_ENC false
#define USE_UIP_ETHERNET true
#define USE_CUSTOM_ETHERNET false
- To use another Ethernet library For example, Ethernet_XYZ library uses Ethernet_XYZ.h
// Only one if the following to be true
#define USE_BUILTIN_ETHERNET false
#define USE_ETHERNET_GENERIC false
#define USE_ETHERNET_ENC false
#define USE_UIP_ETHERNET false
#define USE_CUSTOM_ETHERNET true
....
#elif USE_CUSTOM_ETHERNET
//#include "Ethernet_XYZ.h"
#include "EthernetLarge.h"
#warning Using Custom Ethernet library. You must include a library and initialize.
#define SHIELD_TYPE "Custom Ethernet & Ethernet_XYZ Library"
#else
#define USE_ETHERNET_GENERIC true
#include "Ethernet_Generic.h"
#warning Using Ethernet_Generic lib
#define SHIELD_TYPE "W5x00 & Ethernet_Generic Library"
#endif
...
#include <Ethernet_Manager_STM32.h>
- The Ethernet_Shield_W5200, EtherCard, EtherSia libraries are not supported. Don't use unless you know how to modify those libraries.
- Requests to support for any future custom Ethernet library will be ignored. Use at your own risk.
The default CS/SS pin is 10 for all boards.
If the default pin is not correct, the easiest way is to change is to select the CS/SS pin (e.g. 22) to use as follows:
// To override the default CS/SS pin. Don't use unless you know exactly which pin to use
#define USE_THIS_SS_PIN 22
- For Ethernet_Generic library only, simply use as follows to have large buffer similar to EthernetLarge library
#define ETHERNET_LARGE_BUFFERS
- For Ethernet3 library only, use as follows
// Use MAX_SOCK_NUM = 4 for 4K, 2 for 8K, 1 for 16K RX/TX buffer
#ifndef ETHERNET3_MAX_SOCK_NUM
#define ETHERNET3_MAX_SOCK_NUM 4
#endif
Ethernet.setCsPin (USE_THIS_SS_PIN);
Ethernet.init (ETHERNET3_MAX_SOCK_NUM);
See this example and modify as necessary
- To load Default Credentials
bool LOAD_DEFAULT_CONFIG_DATA = true;
- To use system default to load "blank" when there is no valid Credentials
bool LOAD_DEFAULT_CONFIG_DATA = false;
- Example of Default Credentials
/// Start Default Config Data //////////////////
/*
typedef struct Configuration
{
char header [16];
char static_IP [16];
char board_name [24];
int checkSum;
} Ethernet_Configuration;
*/
#define TO_LOAD_DEFAULT_CONFIG_DATA true
#if TO_LOAD_DEFAULT_CONFIG_DATA
bool LOAD_DEFAULT_CONFIG_DATA = false;
Ethernet_Configuration defaultConfig =
{
//char header[16], dummy, not used
#if USE_SSL
"Eth_SSL",
#else
"Eth_NonSSL",
#endif
// char static_IP [16];
//"192.168.2.230",
// Use dynamic DHCP IP
"",
//char board_name [24];
"STM32-Ethernet",
// terminate the list
//int checkSum, dummy, not used
0
/////////// End Default Config Data /////////////
};
#else
bool LOAD_DEFAULT_CONFIG_DATA = false;
Ethernet_Configuration defaultConfig;
#endif // TO_LOAD_DEFAULT_CONFIG_DATA
/////////// End Default Config Data /////////////
- Include in your sketch
// Must be before #include <Ethernet_Manager.h>
#include <Ethernet_Manager.h>
Ethernet_Manager ethernet_manager;
- To add custom parameters, just add
#ifndef dynamicParams_h
#define dynamicParams_h
#include "defines.h"
// USE_DYNAMIC_PARAMETERS defined in defined.h
/////////////// Start dynamic Credentials ///////////////
/**************************************
#define MAX_ID_LEN 5
#define MAX_DISPLAY_NAME_LEN 16
typedef struct
{
char id [MAX_ID_LEN + 1];
char displayName [MAX_DISPLAY_NAME_LEN + 1];
char *pdata;
uint8_t maxlen;
} MenuItem;
**************************************/
#if USE_DYNAMIC_PARAMETERS
#define MAX_MQTT_SERVER_LEN 34
char MQTT_Server [MAX_MQTT_SERVER_LEN + 1] = "default-mqtt-server";
#define MAX_MQTT_PORT_LEN 6
char MQTT_Port [MAX_MQTT_PORT_LEN + 1] = "1883";
#define MAX_MQTT_USERNAME_LEN 34
char MQTT_UserName [MAX_MQTT_USERNAME_LEN + 1] = "default-mqtt-username";
#define MAX_MQTT_PW_LEN 34
char MQTT_PW [MAX_MQTT_PW_LEN + 1] = "default-mqtt-password";
#define MAX_MQTT_SUBS_TOPIC_LEN 34
char MQTT_SubsTopic [MAX_MQTT_SUBS_TOPIC_LEN + 1] = "default-mqtt-SubTopic";
#define MAX_MQTT_PUB_TOPIC_LEN 34
char MQTT_PubTopic [MAX_MQTT_PUB_TOPIC_LEN + 1] = "default-mqtt-PubTopic";
MenuItem myMenuItems [] =
{
{ "mqtt", "MQTT Server", MQTT_Server, MAX_MQTT_SERVER_LEN },
{ "mqpt", "Port", MQTT_Port, MAX_MQTT_PORT_LEN },
{ "user", "MQTT UserName", MQTT_UserName, MAX_MQTT_USERNAME_LEN },
{ "mqpw", "MQTT PWD", MQTT_PW, MAX_MQTT_PW_LEN },
{ "subs", "Subs Topics", MQTT_SubsTopic, MAX_MQTT_SUBS_TOPIC_LEN },
{ "pubs", "Pubs Topics", MQTT_PubTopic, MAX_MQTT_PUB_TOPIC_LEN },
};
uint16_t NUM_MENU_ITEMS = sizeof(myMenuItems) / sizeof(MenuItem); //MenuItemSize;
#else
MenuItem myMenuItems [] = {};
uint16_t NUM_MENU_ITEMS = 0;
#endif
/////// // End dynamic Credentials ///////////
#endif //dynamicParams_h
- If you don't need to add dynamic parameters, use the following in sketch
#define USE_DYNAMIC_PARAMETERS false
- When you want to open a config portal, just add
ethernet_manager.begin();
const char NewCustomsStyle[] /*PROGMEM*/ = "<style>div,input{padding:5px;font-size:1em;}input{width:95%;}body{text-align: center;}\
button{background-color:blue;color:white;line-height:2.4rem;font-size:1.2rem;width:100%;}fieldset{border-radius:0.3rem;margin:0px;}</style>";
...
ethernet_manager.setCustomsStyle(NewCustomsStyle);
ethernet_manager.setCustomsHeadElement("<style>html{filter: invert(10%);}</style>");
ethernet_manager.setCORSHeader("Your Access-Control-Allow-Origin");
- These ids (such as "mqtt" in example) must be unique.
Please be noted that the following reserved names are already used in library:
"ip" for Static IP Address
"nm" for Board Name
This is the Wiring for STM32F4 (BLACK_F407VE, etc.) using LAN8720
LAN8720 PHY | <---> | STM32F4 |
---|---|---|
TX1 | <---> | PB_13 |
TX_EN | <---> | PB_11 |
TX0 | <---> | PB_12 |
RX0 | <---> | PC_4 |
RX1 | <---> | PC_5 |
nINT/RETCLK | <---> | PA_1 |
CRS | <---> | PA_7 |
MDIO | <---> | PA_2 |
MDC | <---> | PC_1 |
GND | <---> | GND |
VCC | <---> | +3.3V |
Connect as follows. To program, use STM32CubeProgrammer or Arduino IDE with
- U(S)ART Support: "Enabled (generic Serial)"
- Upload Method : "STM32CubeProgrammer (SWD)"
STLink | <---> | STM32F4 |
---|---|---|
SWCLK | <---> | SWCLK |
SWDIO | <---> | SWDIO |
RST | <---> | NRST |
GND | <---> | GND |
5v | <---> | 5V |
Connect FDTI (USB to Serial) as follows:
FDTI | <---> | STM32F4 |
---|---|---|
RX | <---> | TX=PA_9 |
TX | <---> | RX=PA_10 |
GND | <---> | GND |
- AM2315_Ethernet_STM32
- DHT11_Ethernet_STM32
- Ethernet_STM32
- MQTT_ThingStream_Ethernet_STM32
- AM2315_Ethernet_STM32_LAN8720
- DHT11_Ethernet_STM32_LAN8720
- Ethernet_STM32_LAN8720
- MQTT_ThingStream_Ethernet_STM32_LAN8720
- multiFileProject New
If no valid config data are stored in EEPROM, it will switch to Configuration Mode
. Connect to access point at the IP address displayed on Terminal or Router's DHCP server as in the following picture:
After you connected to, for example, 192.168.2.86
, the Browser will display the following picture:
Enter your credentials (Blynk Servers/Tokens and Port). If you prefer static IP, input it (for example 192.168.2.222
) in the corresponding field. Otherwise, just leave it blank
or nothing
to use auto IP assigned by DHCP server.
Then click Save
. After the board auto-restarted, you will see if it's connected to your Blynk server successfully as in the following picture:
This Ethernet_Manager_STM32.run()
is not a blocking call, so you can use it for critical functions requiring in loop().
In operation, if Ethernet or connection is lost, Ethernet_Manager_STM32.run()
will try reconnecting automatically. Therefore, Ethernet_Manager_STM32.run()
must be called in the loop()
function.
void loop()
{
Ethernet_Manager_STM32.run();
...
}
Example MQTT_ThingStream_Ethernet_STM32
2. File defines.h
Ethernet_Manager_STM32/examples/MQTT_ThingStream_Ethernet_STM32/defines.h
Lines 12 to 141 in 3495515
3. File Credentials.h
4. File dynamicParams.h
This is the terminal output of an STM32F7 Nucleo-144 NUCLEO_F767ZI board with LAN8742A Ethernet & STM32Ethernet Library, running Ethernet_STM32 example.
Start Ethernet_STM32 on NUCLEO_F767ZI
Ethernet Shield type : LAN8742A Ethernet & STM32Ethernet Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] ======== USE_BUILTIN_ETHERNET ========
(Emulated-)EEPROM size = 16384, start = 0
[ETM] ======= Start Default Config Data =======
[ETM] Header= , BoardName=
[ETM] StaticIP=
[ETM] Header= STM32 , BoardName= blank
[ETM] StaticIP= blank
[ETM] CCSum=0x 569 ,RCSum=0x 0
[ETM] Start connectEthernet using DHCP
[ETM] MAC:FE-9C-FB-DB-DD-BA
[ETM] Dynamic IP OK, connected
[ETM] IP: 192.168.2.242
[ETM] begin:Stay in CfgPortal: No CfgDat
Connected! IP address: 192.168.2.242
H
Your stored Credentials :
MQTT Server = blank
Port = blank
MQTT UserName = blank
MQTT PWD = blank
Subs Topics = blank
Pubs Topics = blank
HHHHHH[ETM] h:Updating EEPROM. Please wait for reset
[ETM] h:Rst
H
Start Ethernet_STM32 on NUCLEO_F767ZI
Ethernet Shield type : LAN8742A Ethernet & STM32Ethernet Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] ======== USE_BUILTIN_ETHERNET ========
(Emulated-)EEPROM size = 16384, start = 0
[ETM] ======= Start Default Config Data =======
[ETM] Header= , BoardName=
[ETM] StaticIP=
[ETM] Header= STM32 , BoardName= STM32_ETM
[ETM] StaticIP= 192.168.2.241
[ETM] CCSum=0x 685 ,RCSum=0x 685
[ETM] Header= STM32 , BoardName= STM32_ETM
[ETM] StaticIP= 192.168.2.241
[ETM] Start connectEthernet using Static IP = 192.168.2.241
[ETM] MAC:FE-9F-F8-EF-ED-BA
[ETM] IP: 192.168.2.241
[ETM] begin:Ethernet Connected.
Connected! IP address: 192.168.2.241
Your stored Credentials :
MQTT Server = mqtt_server
Port = 1883
MQTT UserName = mqtt_user
MQTT PWD = mqtt_pass
Subs Topics = mqtt_sub
Pubs Topics = mqtt_pub
HHHHHHHHHH HHHHHHHHHH HHHHHH
This is the terminal output of STM32F7 Nucleo-144 NUCLEO_F767ZI board with W5500 Ethernet shield using Ethernet_Generic Library, running Ethernet_STM32 example demonstrating doubleResetDetect feature.
Start Ethernet_STM32 on NUCLEO_F767ZI
Ethernet Shield type : W5x00 using Ethernet_Generic Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] =========================
[ETM] Default SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
[ETM] Board :NUCLEO_F767ZI, setCsPin:10
[ETM] =========================
[ETM] Currently Used SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
(Emulated-)EEPROM size = 16384, start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] ======= Start Default Config Data =======
[ETM] Header= Eth_NonSSL , BoardName= STM32-Ethernet
[ETM] StaticIP=
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.222
[ETM] CCSum=0x 8ab ,RCSum=0x 8ab
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.222
[ETM] Start connectEthernet using Static IP = 192.168.2.222
[ETM] MAC:FE-98-FE-DE-D9-BA
Start Ethernet_STM32 on NUCLEO_F767ZI
Ethernet Shield type : W5x00 using Ethernet_Generic Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] =========================
[ETM] Default SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
[ETM] Board :NUCLEO_F767ZI, setCsPin:10
[ETM] =========================
[ETM] Currently Used SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
(Emulated-)EEPROM size = 16384, start = 0
Flag read = 0xd0d01234
doubleResetDetected
ClearFlag write = 0xd0d04321
[ETM] =====================
[ETM] DRD. Run ConfigPortal
[ETM] =====================
[ETM] ======= Start Default Config Data =======
[ETM] Header= Eth_NonSSL , BoardName= STM32-Ethernet
[ETM] StaticIP=
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.222
[ETM] CCSum=0x 8ab ,RCSum=0x 8ab
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.222
[ETM] Start connectEthernet using Static IP = 192.168.2.222
[ETM] MAC:FE-9A-FD-D6-D9-BA
W5100 init, using SS_PIN_DEFAULT = 10, new ss_pin = 10, W5100Class::ss_pin = 10
W5100::init: W5500, SSIZE =4096
[ETM] IP: 192.168.2.222
[ETM] begin:Stay in CfgPortal: DRD
Connected! IP address: 192.168.2.222
Ethernet type is W5500
Your stored Credentials :
MQTT Server = mqtt_server
Port = 1883
MQTT UserName = mqtt_user
MQTT PWD = mqtt_pass
Subs Topics = mqtt_sub
Pubs Topics = mqtt_pub
H[ETM] h:Updating EEPROM. Please wait for reset
[ETM] h:Rst
H
Start Ethernet_STM32 on NUCLEO_F767ZI
Ethernet Shield type : W5x00 using Ethernet_Generic Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] =========================
[ETM] Default SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
[ETM] Board :NUCLEO_F767ZI, setCsPin:10
[ETM] =========================
[ETM] Currently Used SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
(Emulated-)EEPROM size = 16384, start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] ======= Start Default Config Data =======
[ETM] Header= Eth_NonSSL , BoardName= STM32-Ethernet
[ETM] StaticIP=
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.222
[ETM] CCSum=0x 8ab ,RCSum=0x 8ab
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.222
[ETM] Start connectEthernet using Static IP = 192.168.2.222
[ETM] MAC:FE-98-FE-DE-DC-BA
W5100 init, using SS_PIN_DEFAULT = 10, new ss_pin = 10, W5100Class::ss_pin = 10
W5100::init: W5500, SSIZE =4096
[ETM] IP: 192.168.2.222
[ETM] begin:Ethernet Connected.
Connected! IP address: 192.168.2.222
Ethernet type is W5500
Your stored Credentials :
MQTT Server = mqtt_server
Port = 1883
MQTT UserName = mqtt_user
MQTT PWD = mqtt_pass
Subs Topics = mqtt_sub
Pubs Topics = mqtt_pub
Stop doubleResetDetecting
ClearFlag write = 0xd0d04321
HH
3. MQTT_ThingStream_Ethernet_STM32 on STM32F7 NUCLEO_F767ZI with ENC28J60 Ethernet using EthernetENC Library
This is the terminal output of STM32F7 Nucleo-144 NUCLEO_F767ZI board with ENC28J60 using EthernetENC Library, running complex MQTT_ThingStream_Ethernet_STM32 example to demonstrate how to use dynamic parameters, entered via Config Portal, to connect to ThingStream MQTT Server.
Start MQTT_ThingStream_Ethernet_STM32 on NUCLEO_F767ZI
Ethernet Shield type : ENC28J60 using EthernetENC Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] =========================
[ETM] Default SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
[ETM] Board :NUCLEO_F767ZI, setCsPin:10
[ETM] =========================
[ETM] Currently Used SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
(Emulated-)EEPROM size = 16384, start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] ======= Start Default Config Data =======
[ETM] Header= Eth_NonSSL , BoardName= STM32-Ethernet
[ETM] StaticIP=
[ETM] Header= STM32 , BoardName= F767ZI_ThingStream
[ETM] StaticIP= 192.168.2.222
[ETM] CCSum=0x a38 ,RCSum=0x a38
[ETM] Invalid Stored Dynamic Data. Ignored
[ETM] Start connectEthernet using DHCP
[ETM] MAC:FE-9F-F8-DD-D8-8D
[ETM] Dynamic IP OK, connected
[ETM] IP: 192.168.2.74
[ETM] begin:Stay in CfgPortal: No CfgDat
Connected! IP address: 192.168.2.74
***************************************
esp32-sniffer/12345678/ble
***************************************
Stop doubleResetDetecting
ClearFlag write = 0xd0d04321
[ETM] h:Updating EEPROM. Please wait for reset
[ETM] h:Rst
Start MQTT_ThingStream_Ethernet_STM32 on NUCLEO_F767ZI
Ethernet Shield type : ENC28J60 using EthernetENC Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] =========================
[ETM] Default SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
[ETM] Board :NUCLEO_F767ZI, setCsPin:10
[ETM] =========================
[ETM] Currently Used SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
(Emulated-)EEPROM size = 16384, start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] ======= Start Default Config Data =======
[ETM] Header= Eth_NonSSL , BoardName= STM32-Ethernet
[ETM] StaticIP=
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.222
[ETM] CCSum=0x 8ab ,RCSum=0x 8ab
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.222
[ETM] Start connectEthernet using Static IP = 192.168.2.222
[ETM] MAC:FE-99-FC-DA-DF-BA
[ETM] IP: 192.168.2.222
[ETM] begin:Ethernet Connected.
Connected! IP address: 192.168.2.222
***************************************
esp32-sniffer/12345678/ble
***************************************
Attempting MQTT connection to mqtt.thingstream.io
...connected
Published connection message successfully!
Subscribed to: esp32-sniffer/12345678/ble
Your stored Credentials :
MQTT Server = mqtt.thingstream.io
Port = 1883
MQTT UserName = *******
MQTT PWD = *******
Client ID = *********
HStop doubleResetDetecting
ClearFlag write = 0xd0d04321
MQTT Message Send : esp32-sniffer/12345678/ble => Hello from MQTT_ThingStream on NUCLEO_F767ZI with ENC28J60 using EthernetENC Library
HMQTT Message receive [esp32-sniffer/12345678/ble] Hello from MQTT_ThingStream on NUCLEO_F767ZI with ENC28J60 using EthernetENC Library
HHHH
This is the terminal output of STM32F7 Nucleo-144 NUCLEO_F767ZI board with W5x00 using Ethernet_Generic Library, running Ethernet_STM32 example to demonstrate the link status operation.
Start Ethernet_STM32 on NUCLEO_F767ZI
Ethernet Shield type : W5x00 using Ethernet_Generic Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] =========================
[ETM] Default SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
[ETM] Board :NUCLEO_F767ZI, setCsPin:10
[ETM] =========================
[ETM] Currently Used SPI pinout:
[ETM] MOSI:11
[ETM] MISO:12
[ETM] SCK:13
[ETM] SS:10
[ETM] =========================
(Emulated-)EEPROM size = 16384, start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] ======= Start Default Config Data =======
[ETM] Header= Eth_NonSSL , BoardName= STM32-Ethernet
[ETM] StaticIP=
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.222
[ETM] CCSum=0x 8ab ,RCSum=0x 8ab
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.222
[ETM] Start connectEthernet using Static IP = 192.168.2.222
[ETM] MAC:FE-98-FF-D6-D9-BA
W5100 init, using SS_PIN_DEFAULT = 10, new ss_pin = 10, W5100Class::ss_pin = 10
W5100::init: W5500, SSIZE =8192
[ETM] IP: 192.168.2.222
[ETM] begin:Ethernet Connected.
Connected! IP address: 192.168.2.222
Ethernet type is W5500
Your stored Credentials :
MQTT Server = mqtt_server
Port = 1883
MQTT UserName = mqtt_user
MQTT PWD = mqtt_pass
Subs Topics = mqtt_sub
Pubs Topics = mqtt_pub
Stop doubleResetDetecting
ClearFlag write = 0xd0d04321
HHFFHHH **<==== Check connection report by removing Ethernet Cable**
5. MQTT_ThingStream_Ethernet_STM32 on STM32F7 NUCLEO_F767ZI with LAN8742A Ethernet using STM32Ethernet Library
This is the terminal output of STM32F7 Nucleo-144 NUCLEO_F767ZI board with LAN8742A using STM32Ethernet Library, running complex MQTT_ThingStream_Ethernet_STM32 example to demonstrate how to use dynamic parameters, entered via Config Portal, to connect to ThingStream MQTT Server.
Start MQTT_ThingStream_Ethernet_STM32 on NUCLEO_F767ZI
Ethernet Shield type : LAN8742A Ethernet & STM32Ethernet Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] ======== USE_BUILTIN_ETHERNET ========
(Emulated-)EEPROM size = 16384, start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] ======= Start Default Config Data =======
[ETM] Header= Eth_NonSSL , BoardName= STM32-Ethernet
[ETM] StaticIP=
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.188
[ETM] CCSum=0x 8b6 ,RCSum=0x 8b6
[ETM] Invalid Stored Dynamic Data. Ignored
[ETM] Start connectEthernet using DHCP
[ETM] MAC:FE-9A-F4-DC-DE-88
[ETM] Dynamic IP OK, connected
[ETM] IP: 192.168.2.69
[ETM] begin:Stay in CfgPortal: No CfgDat
Connected! IP address: 192.168.2.69
***************************************
esp32-sniffer/12345678/ble
***************************************
Stop doubleResetDetecting
ClearFlag write = 0xd0d04321
[ETM] h:Updating EEPROM. Please wait for reset
[ETM] h:Rst
Start MQTT_ThingStream_Ethernet_STM32 on NUCLEO_F767ZI
Ethernet Shield type : LAN8742A Ethernet & STM32Ethernet Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] ======== USE_BUILTIN_ETHERNET ========
(Emulated-)EEPROM size = 16384, start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] ======= Start Default Config Data =======
[ETM] Header= Eth_NonSSL , BoardName= STM32-Ethernet
[ETM] StaticIP=
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.188
[ETM] CCSum=0x 8b6 ,RCSum=0x 8b6
[ETM] Header= STM32 , BoardName= STM32-Ethernet
[ETM] StaticIP= 192.168.2.188
[ETM] Start connectEthernet using Static IP = 192.168.2.188
[ETM] MAC:FE-99-FF-DF-DB-BA
[ETM] IP: 192.168.2.188
[ETM] begin:Ethernet Connected.
Connected! IP address: 192.168.2.188
***************************************
esp32-sniffer/12345678/ble
***************************************
Stop doubleResetDetecting
ClearFlag write = 0xd0d04321
Attempting MQTT connection to mqtt.thingstream.io
...connected
Published connection message successfully!
Subscribed to: esp32-sniffer/12345678/ble
H
Your stored Credentials :
MQTT Server = mqtt.thingstream.io
Port = 1883
MQTT UserName = mqtt_user_name
MQTT PWD = mqtt_password
Client ID = mqtt_clientID
MQTT Message Send : esp32-sniffer/12345678/ble => Hello from MQTT_ThingStream on NUCLEO_F767ZI with LAN8742A Ethernet & STM32Ethernet Library
MQTT Message receive [esp32-sniffer/12345678/ble] Hello from MQTT_ThingStream on NUCLEO_F767ZI with LAN8742A Ethernet & STM32Ethernet Library
HH
MQTT Message Send : esp32-sniffer/12345678/ble => Hello from MQTT_ThingStream on NUCLEO_F767ZI with LAN8742A Ethernet & STM32Ethernet Library
MQTT Message receive [esp32-sniffer/12345678/ble] Hello from MQTT_ThingStream on NUCLEO_F767ZI with LAN8742A Ethernet & STM32Ethernet Library
HH
MQTT Message Send : esp32-sniffer/12345678/ble => Hello from MQTT_ThingStream on NUCLEO_F767ZI with LAN8742A Ethernet & STM32Ethernet Library
MQTT Message receive [esp32-sniffer/12345678/ble] Hello from MQTT_ThingStream on NUCLEO_F767ZI with LAN8742A Ethernet & STM32Ethernet Library
HH
6. MQTT_ThingStream_Ethernet_STM32_LAN8720 on STM32F4 BLACK_F407VE with LAN8720 Ethernet using STM32Ethernet Library
This is the terminal output of STM32F4 BLACK_F407VE with LAN8720 Ethernet using STM32Ethernet Library, running complex MQTT_ThingStream_Ethernet_STM32_LAN8720 example to demonstrate how to use dynamic parameters, entered via Config Portal, to connect to ThingStream MQTT Server.
Start MQTT_ThingStream_Ethernet_STM32_LAN8720 on BLACK_F407VE
Ethernet Shield type : LAN8720 Ethernet & STM32Ethernet Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] ======== USE_BUILTIN_ETHERNET ========
(Emulated-)EEPROM size = 16384, start = 0
Flag read = 0xd0d01234
doubleResetDetected
ClearFlag write = 0xd0d04321
[ETM] =====================
[ETM] DRD. Run ConfigPortal
[ETM] =====================
[ETM] EEPROMsz:4096
[ETM] EEPROM Length():16384
[ETM] CCSum=0x77e,RCSum=0x77e
[ETM] ChkCrR:CrCCsum=0x215e,CrRCsum=0x215e
[ETM] CrCCSum=215e,CrRCSum=215e
[ETM] Valid Stored Dynamic Data
[ETM] ======= Start Stored Config Data =======
[ETM] Header=STM32, BoardName=STM32-Ethernet
[ETM] StaticIP=
[ETM] Start connectEthernet using DHCP
[ETM] MAC:FE-98-FD-D6-DB-BA
[ETM] Dynamic IP OK, connected
[ETM] IP:192.168.2.149
[ETM] bg: isForcedConfigPortal = false
[ETM] bg:Stay forever in CP:DRD/MRD
Connected! IP address: 192.168.2.149
***************************************
esp32-sniffer/12345678/ble
***************************************
[ETM] h:Updating EEPROM. Please wait for reset
[ETM] SaveEEPROM,Sz=16384,DataSz=248,WCSum=0x8a9
[ETM] CrCCSum=0x2785
[ETM] h:Rst
Start MQTT_ThingStream_Ethernet_STM32_LAN8720 on BLACK_F407VE
Ethernet Shield type : LAN8720 Ethernet & STM32Ethernet Library
Ethernet_Manager_STM32 v1.3.2
DoubleResetDetector_Generic v1.8.1
[ETM] ======== USE_BUILTIN_ETHERNET ========
(Emulated-)EEPROM size = 16384, start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] EEPROMsz:4096
[ETM] EEPROM Length():16384
[ETM] CCSum=0x8a9,RCSum=0x8a9
[ETM] ChkCrR:CrCCsum=0x2785,CrRCsum=0x2785
[ETM] CrCCSum=2785,CrRCSum=2785
[ETM] Valid Stored Dynamic Data
[ETM] ======= Start Stored Config Data =======
[ETM] Header=STM32, BoardName=STM32-Ethernet
[ETM] StaticIP=192.168.2.220
[ETM] Start connectEthernet using Static IP =192.168.2.220
[ETM] MAC:FE-98-FD-D6-DF-BA
[ETM] IP:192.168.2.220
[ETM] begin:Ethernet Connected.
Connected! IP address: 192.168.2.220
***************************************
esp32-sniffer/12345678/ble
***************************************
Your stored Credentials :
MQTT Server = mqtt.thingstream.io
Port = 1883
MQTT UserName = user_name
MQTT PWD = password
Client ID = device:12345678-1234-1234-1234-123456789abc
Attempting MQTT connection to mqtt.thingstream.io
...connected
Published connection message successfully!
Subscribed to: esp32-sniffer/12345678/ble
HStop doubleResetDetecting
ClearFlag write = 0xd0d04321
MQTT Message Send : esp32-sniffer/12345678/ble => Hello from MQTT_ThingStream on BLACK_F407VE with LAN8720 Ethernet & STM32Ethernet Library
H
MQTT Message receive [esp32-sniffer/12345678/ble] Hello from MQTT_ThingStream on BLACK_F407VE with LAN8720 Ethernet & STM32Ethernet Library
Debug is enabled by default on Serial.
You can also change the debugging level from 0 to 4
/* Comment this out to disable prints and save space */
#define ETHERNET_MANAGER_STM32_DEBUG_PORT Serial
// Debug Level from 0 to 4
#define _ETHERNET_WEBSERVER_LOGLEVEL_ 0
#define _ETHERNET_MANAGER_STM32_LOGLEVEL_ 2
#define DRD_GENERIC_DEBUG true
If you get compilation errors, more often than not, you may need to install a newer version of the core for Arduino boards.
Sometimes, the library will only work if you update the board core to the latest version because I am using newly added functions.
Submit issues to: Ethernet_Manager_STM32 issues
- Same features for other boards with new Ethernet shields.
- Add SSL/TLS feature.
- Bug Searching and Killing
- Support more non-compatible Ethernet Libraries such as Ethernet_Shield_W5200, EtherCard, EtherSia.
- Permit EEPROM size and location configurable to avoid conflict with others.
- More flexible to configure reconnection timeout.
- For fresh config data, don't need to wait for connecting timeout before entering config portal.
- If the config data not entered completely (Serves, HardwarePort and Blynk tokens), entering config portal
- Change Synch XMLHttpRequest to Async
- Reduce memory usage.
- Support ENC28J60 as well as W5100/W5200/W5500 Ethernet shields
- Add checksums
- Support STM32F/L/H/G/WB/MP1 boards
- Easy-to-use Dynamic Parameters without the necessity to write complicated ArduinoJSon functions
- Permit to input special chars such as % and # into data fields.
- DoubleDetectDetector to force Config Portal when double reset is detected within predetermined time, default 10s.
- Configurable Config Portal Title
- Re-structure all examples to separate Credentials / Defines / Dynamic Params / Code so that you can change Credentials / Dynamic Params quickly for each device.
- Add support to new
EthernetENC library
for ENC28J60. - Add Table of Contents and Version String
- Configurable Customs HTML Headers, including Customs Style, Customs Head Elements, CORS Header
- Add support to Ethernet LAN8720 using STM32Ethernet library, for boards such as Nucleo-144 (F429ZI, NUCLEO_F746NG, NUCLEO_F746ZG, NUCLEO_F756ZG), Discovery (DISCO_F746NG) and STM32F4 boards (BLACK_F407VE, BLACK_F407VG, BLACK_F407ZE, BLACK_F407ZG, BLACK_F407VE_Mini, DIYMORE_F407VGT, FK407M1)
- Use new Ethernet_Generic library as default for W5x00.
- Add example multiFileProject to demo how to avoid
multiple-definitions
linker error for multiple-file project
- Thanks to Miguel Alexandre Wisintainer for initiating, inspriring, working with, developing, debugging and testing.
⭐️ Miguel Wisintainer |
If you want to contribute to this project:
- Report bugs and errors
- Ask for enhancements
- Create issues and pull requests
- Tell other people about this library
- The library is licensed under MIT
Copyright (c) 2020- Khoi Hoang