Many people, me including, are using Arduino, Teensy, etc. boards with ESP8266 AT-Command shields, which present many problems and limitations, such as small 2K AT-command buffer size, slow speed, unreliability, etc.
The introduction of new and much more powerful dual-cored ESP32-based WiFi/BT/BLE Modules/Shields (such as U-Blox WiFiNINA, W101, W102), has been well received and already implemented and used in Nano-33-IoT, Nano-33-BLE, etc.
However, the library support is still not as complete as that of ESP8266/ESP32.
That’s why we, so far, still haven’t got libraries similar to ESP8266WebServer, WiFiManager for Arduino, Teensy, etc. using this U-Blox WiFiNINA modules/shields.
This is the reason for me to finish this new WiFiWebServer Library. The WiFiNINAManager and BlynkWM_WiFiNINA for boards such as Nano-33-IoT, SAMD21, SAMD51, Teensy, STM32, etc. will be in the to-do list.
This is simple yet complete WebServer library for AVR, Teensy, SAM DUE, SAMD, STM32, etc.
boards running WiFi modules/shields (WiFiNINA U-Blox W101, W102, etc.). The functions are similar and compatible to ESP8266/ESP32 WebServer libraries to make life much easier to port sketches from ESP8266/ESP32.
The library currently supports these boards
- SAM DUE
- SAMD21 (ZERO, MKR, Nano-33-IoT, M0, M0 Pro, AdaFruit CIRCUITPLAYGROUND_EXPRESS, etc.)
- SAMD51 (Adafruit M4 : Metro, Grand Central, ItsyBitsy, Feather Express, Trellis, Metro AirLift lite, MONSTER M4SK Express, Hallowing Express, etc. )
- Teensy (4.0, 3.6, 3.5, 3,2, 3.1, 3.0, LC)
- STM32F1, STM32F2, STM32F4, STM32F7
The library supports
- WiFi Client, STA and AP mode
- TCP Server and Client
- UDP Server and Client
- HTTP Server and Client
- HTTP GET and POST requests, provides argument parsing, handles one client at a time.
Library is based on and modified from:
The WiFiWebServer class found in WiFiWebServer.h
header, is a simple web server that knows how to handle HTTP requests such as GET and POST and can only support one simultaneous client.
There are 14 examples:
- HelloServer
- HelloServer2
- AdvancedWebServer
- HttpBasicAuth
- PostServer
- SimpleAuthentication
- ConnectWPA
- ScanNetworks
- UdpNTPClient
- WiFiUdpNtpClient
- UdpSendReceive
- WebClient
- WebClientRepeating
- WebServer
This is the HelloServer
#define DEBUG_WIFI_WEBSERVER_PORT Serial
#define USE_WIFI_NINA true
#if ( defined(ARDUINO_SAM_DUE) || defined(ARDUINO_SAMD_ZERO) || defined(ARDUINO_SAMD_MKR1000) || defined(ARDUINO_SAMD_MKRWIFI1010) \
|| defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_SAMD_MKRFox1200) || defined(ARDUINO_SAMD_MKRWAN1300) || defined(ARDUINO_SAMD_MKRWAN1310) \
|| defined(ARDUINO_SAMD_MKRGSM1400) || defined(ARDUINO_SAMD_MKRNB1500) || defined(ARDUINO_SAMD_MKRVIDOR4000) || defined(__SAMD21G18A__) \
|| defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS) || defined(__SAM3X8E__) || defined(__CPU_ARC__) )
#if defined(WIFI_USE_SAMD)
#undef WIFI_USE_SAMD
#endif
#define WIFI_USE_SAMD true
#endif
#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) )
#if defined(WIFI_USE_STM32)
#undef WIFI_USE_STM32
#endif
#define WIFI_USE_STM32 true
#endif
#ifdef CORE_TEENSY
#if defined(__IMXRT1062__)
#define BOARD_TYPE "TEENSY 4.0"
#elif ( defined(__MKL26Z64__) || defined(ARDUINO_ARCH_AVR) )
#define BOARD_TYPE "TEENSY LC or 2.0"
#else
#define BOARD_TYPE "TEENSY 3.X"
#endif
#elif defined(WIFI_USE_SAMD)
#if defined(ARDUINO_SAMD_ZERO)
#define BOARD_TYPE "SAMD Zero"
#elif defined(ARDUINO_SAMD_MKR1000)
#define BOARD_TYPE "SAMD MKR1000"
#elif defined(ARDUINO_SAMD_MKRWIFI1010)
#define BOARD_TYPE "SAMD MKRWIFI1010"
#elif defined(ARDUINO_SAMD_NANO_33_IOT)
#define BOARD_TYPE "SAMD NANO_33_IOT"
#elif defined(ARDUINO_SAMD_MKRFox1200)
#define BOARD_TYPE "SAMD MKRFox1200"
#elif ( defined(ARDUINO_SAMD_MKRWAN1300) || defined(ARDUINO_SAMD_MKRWAN1310) )
#define BOARD_TYPE "SAMD MKRWAN13X0"
#elif defined(ARDUINO_SAMD_MKRGSM1400)
#define BOARD_TYPE "SAMD MKRGSM1400"
#elif defined(ARDUINO_SAMD_MKRNB1500)
#define BOARD_TYPE "SAMD MKRNB1500"
#elif defined(ARDUINO_SAMD_MKRVIDOR4000)
#define BOARD_TYPE "SAMD MKRVIDOR4000"
#elif defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS)
#define BOARD_TYPE "SAMD ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS"
#elif ( defined(__SAM3X8E__) || (__SAM3X8E__) || (__CPU_ARC__) )
#define BOARD_TYPE "SAMD Board"
#else
#define BOARD_TYPE "SAMD Unknown"
#endif
#elif defined(WIFI_USE_STM32)
#if defined(STM32F0)
#define BOARD_TYPE "STM32F0"
#elif defined(STM32F1)
#define BOARD_TYPE "STM32F1"
#elif defined(STM32F2)
#define BOARD_TYPE "STM32F2"
#elif defined(STM32F3)
#define BOARD_TYPE "STM32F3"
#elif defined(STM32F4)
#define BOARD_TYPE "STM32F4"
#elif defined(STM32F7)
#define BOARD_TYPE "STM32F7"
#else
#warning STM32 unknown board selected
#define BOARD_TYPE "STM32 Unknown"
#endif
#else
#define BOARD_TYPE "AVR Mega"
#endif
#include <WiFiWebServer.h>
char ssid[] = "****"; // your network SSID (name)
char pass[] = "****"; // your network password
int status = WL_IDLE_STATUS; // the Wifi radio's status
int reqCount = 0; // number of requests received
WiFiWebServer server(80);
const int led = 13;
void handleRoot()
{
server.send(200, "text/plain", "Hello from WiFiNINA_WebServer!");
}
void handleNotFound()
{
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++)
{
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, 0);
}
void setup(void)
{
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial);
Serial.println("\nStarting HelloServer on " + String(BOARD_TYPE));
// check for the presence of the shield
if (WiFi.status() == WL_NO_MODULE)
{
Serial.println(F("WiFi shield not present"));
// don't continue
while (true);
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION)
{
Serial.println("Please upgrade the firmware");
}
// attempt to connect to WiFi network
while ( status != WL_CONNECTED)
{
Serial.print(F("Connecting to WPA SSID: "));
Serial.println(ssid);
// Connect to WPA/WPA2 network
status = WiFi.begin(ssid, pass);
}
server.begin();
server.on("/", handleRoot);
server.on("/inline", []()
{
server.send(200, "text/plain", "This works as well");
});
server.onNotFound(handleNotFound);
//server.begin();
Serial.print(F("HTTP server started @ "));
Serial.println(WiFi.localIP());
}
void loop(void)
{
server.handleClient();
}
and the WebBrowser screen when running AdvancedWebServer