From 94bbe56f0524a17d61d6c688f63a1ad81c1c34b3 Mon Sep 17 00:00:00 2001 From: Khoi Hoang <57012152+khoih-prog@users.noreply.github.com> Date: Thu, 19 Jan 2023 01:12:19 -0500 Subject: [PATCH] v1.5.0 for WizNet `WizFi360` ### Releases v1.5.0 1. Add support to WizNet `WizFi360`, such as `WIZNET_WIZFI360_EVB_PICO` using `arduino-pico` core 2. Modify examples to Enable `IP MUX` --- CONTRIBUTING.md | 12 +- changelog.md | 6 + examples/ConnectWiFi/ConnectWiFi.ino | 259 +---------- examples/ConnectWiFi/defines.h | 420 ++++++++++++++++++ examples/HTTPGET/HTTPGET.ino | 286 +----------- examples/HTTPGET/defines.h | 419 +++++++++++++++++ .../TCPClientMultiple/TCPClientMultiple.ino | 259 +---------- examples/TCPClientMultiple/defines.h | 420 ++++++++++++++++++ examples/TCPClientSingle/TCPClientSingle.ino | 275 +----------- examples/TCPClientSingle/defines.h | 420 ++++++++++++++++++ examples/TCPServer/TCPServer.ino | 261 +---------- examples/TCPServer/defines.h | 420 ++++++++++++++++++ .../UDPClientMultiple/UDPClientMultiple.ino | 259 +---------- examples/UDPClientMultiple/defines.h | 420 ++++++++++++++++++ examples/UDPClientSingle/UDPClientSingle.ino | 282 +----------- examples/UDPClientSingle/defines.h | 420 ++++++++++++++++++ library.json | 6 +- library.properties | 4 +- pics/WIZNET_WIZFI360_EVB_PICO.png | Bin 0 -> 251819 bytes pics/wizfi360-pa.png | Bin 0 -> 799550 bytes platformio/platformio.ini | 26 +- 21 files changed, 3064 insertions(+), 1810 deletions(-) create mode 100644 examples/ConnectWiFi/defines.h create mode 100644 examples/HTTPGET/defines.h create mode 100644 examples/TCPClientMultiple/defines.h create mode 100644 examples/TCPClientSingle/defines.h create mode 100644 examples/TCPServer/defines.h create mode 100644 examples/UDPClientMultiple/defines.h create mode 100644 examples/UDPClientSingle/defines.h create mode 100644 pics/WIZNET_WIZFI360_EVB_PICO.png create mode 100644 pics/wizfi360-pa.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e198806..645cf28 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,26 +10,32 @@ However, before reporting a bug please check through the following: If you don't find anything, please [open a new issue](https://github.com/khoih-prog/ESP_AT_Lib/issues/new). +--- + ### How to submit a bug report Please ensure to specify the following: * Arduino IDE version (e.g. 1.8.19) or Platform.io version -* Board Core Version (e.g. Arduino SAMDUE core v1.6.12, STM32 core v2.3.0, etc.) +* Board Core Version (e.g. Arduino SAMDUE core v1.6.12, ESP32 core v2.0.6, ESP8266 core v3.1.1, ArduinoCore-mbed v3.5.4, etc.) * Contextual information (e.g. what you were trying to achieve) * Simplest possible steps to reproduce * Anything that might be relevant in your opinion, such as: * Operating system (Windows, Ubuntu, etc.) and the output of `uname -a` * Network configuration +Please be educated, civilized and constructive as you've always been. Disrespective posts against [GitHub Code of Conduct](https://docs.github.com/en/site-policy/github-terms/github-event-code-of-conduct) will be ignored and deleted. + +--- ### Example ``` Arduino IDE version: 1.8.19 -Arduino STM32 Core v2.3.0 +RASPBERRY_PI_PICO board +ArduinoCore-mbed v3.5.4 OS: Ubuntu 20.04 LTS -Linux xy-Inspiron-3593 5.15.0-53-generic #59~20.04.1-Ubuntu SMP Thu Oct 20 15:10:22 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux +Linux xy-Inspiron-3593 5.15.0-58-generic #64~20.04.1-Ubuntu SMP Fri Jan 6 16:42:31 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux Context: I encountered a crash while using this library diff --git a/changelog.md b/changelog.md index cd5ef70..a6595d2 100644 --- a/changelog.md +++ b/changelog.md @@ -17,6 +17,7 @@ ## Table of Contents * [Changelog](#changelog) + * [Releases v1.5.0](#releases-v150) * [Releases v1.4.1](#releases-v141) * [Releases v1.4.0](#releases-v140) * [Releases v1.3.0](#releases-v130) @@ -29,6 +30,11 @@ ### Changelog +### Releases v1.5.0 + +1. Add support to WizNet `WizFi360`, such as `WIZNET_WIZFI360_EVB_PICO` using `arduino-pico` core +2. Modify examples to Enable `IP MUX` + ### Releases v1.4.1 1. Update `platform.ini` and `library.json` to use original `khoih-prog` instead of `khoih.prog` after PIO fix diff --git a/examples/ConnectWiFi/ConnectWiFi.ino b/examples/ConnectWiFi/ConnectWiFi.ino index a71754f..e29f11f 100644 --- a/examples/ConnectWiFi/ConnectWiFi.ino +++ b/examples/ConnectWiFi/ConnectWiFi.ino @@ -1,8 +1,8 @@ /**************************************************************************************************************************** HTTPGET.ino - For ESP8266/ESP32-AT-command running shields + For WizFi360/ESP8266/ESP32-AT-command running shields - ESP_AT_Lib is a wrapper library for the ESP8266/ESP32 AT-command shields + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib @@ -28,267 +28,20 @@ THE SOFTWARE. *****************************************************************************************************************************/ -/* Comment this out to disable prints and save space */ -#define ESP_AT_DEBUG_OUTPUT Serial - -#define _ESP_AT_LOGLEVEL_ 4 - -// Uncomment to use ESP32-AT commands -//#define USE_ESP32_AT true - -#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ - defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ - defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ - defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) ) -#if defined(ESP_AT_USE_NRF528XX) - #undef ESP_AT_USE_NRF528XX -#endif -#define ESP_AT_USE_NRF528XX true -#endif - -#if ( 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(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) || defined(__SAMD51G19A__) ) -#if defined(ESP_AT_USE_SAMD) - #undef ESP_AT_USE_SAMD -#endif -#define ESP_AT_USE_SAMD true -#endif - -#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) - #if defined(ESP_AT_USE_AVR) - #undef ESP_AT_USE_AVR - #endif - #define ESP_AT_USE_AVR true -#endif - -#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) - #if defined(ESP_AT_USE_SAM_DUE) - #undef ESP_AT_USE_SAM_DUE - #endif - #define ESP_AT_USE_SAM_DUE true -#endif - -#if ( defined(CORE_TEENSY) && !( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) ) - #if defined(ESP_AT_USE_TEENSY) - #undef ESP_AT_USE_TEENSY - #endif - #define ESP_AT_USE_TEENSY true -#endif - -#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) ) - #if defined(ESP_AT_USE_STM32) - #undef ESP_AT_USE_STM32 - #endif - #define ESP_AT_USE_STM32 true -#endif - -#if (ESP_AT_USE_NRF528XX) - -#if defined(NRF52840_FEATHER) - #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" -#elif defined(NRF52832_FEATHER) - #define BOARD_TYPE "NRF52832_FEATHER" -#elif defined(NRF52840_FEATHER_SENSE) - #define BOARD_TYPE "NRF52840_FEATHER_SENSE" -#elif defined(NRF52840_ITSYBITSY) - #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" -#elif defined(NRF52840_CIRCUITPLAY) - #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" -#elif defined(NRF52840_CLUE) - #define BOARD_TYPE "NRF52840_CLUE" -#elif defined(NRF52840_METRO) - #define BOARD_TYPE "NRF52840_METRO_EXPRESS" -#elif defined(NRF52840_PCA10056) - #define BOARD_TYPE "NORDIC_NRF52840DK" -#elif defined(NINA_B302_ublox) - #define BOARD_TYPE "NINA_B302_ublox" -#elif defined(NINA_B112_ublox) - #define BOARD_TYPE "NINA_B112_ublox" -#elif defined(PARTICLE_XENON) - #define BOARD_TYPE "PARTICLE_XENON" -#elif defined(MDBT50Q_RX) - #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" -#elif defined(ARDUINO_NRF52_ADAFRUIT) - #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" -#else - #define BOARD_TYPE "nRF52 Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_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(__SAMD21G18A__) - #define BOARD_TYPE "SAMD21G18A" -#elif defined(__SAMD51G19A__) - #define BOARD_TYPE "SAMD51G19" -#elif defined(__SAMD51J19A__) - #define BOARD_TYPE "SAMD51J19A" -#elif defined(__SAMD51J20A__) - #define BOARD_TYPE "SAMD51J20A" -#elif defined(__SAMD51__) - #define BOARD_TYPE "SAMD51" -#else - #define BOARD_TYPE "SAMD Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_USE_SAM_DUE) -#if ( defined(ARDUINO_SAM_DUE) || (__SAM3X8E__) ) - #define BOARD_TYPE "SAM DUE" -#else - #define BOARD_TYPE "SAM Unknown" -#endif - -#define EspSerial Serial1 - -#elif ( defined(CORE_TEENSY) ) -// For Teensy 4.0 -#if defined(__IMXRT1062__) - // For Teensy 4.1/4.0 - #if defined(ARDUINO_TEENSY41) - #define BOARD_TYPE "TEENSY 4.1" - // Use true for NativeEthernet Library, false if using other Ethernet libraries - #define USE_NATIVE_ETHERNET true - #elif defined(ARDUINO_TEENSY40) - #define BOARD_TYPE "TEENSY 4.0" - #else - #define BOARD_TYPE "TEENSY 4.x" - #endif -#elif defined(__MK66FX1M0__) - #define BOARD_TYPE "Teensy 3.6" -#elif defined(__MK64FX512__) - #define BOARD_TYPE "Teensy 3.5" -#elif defined(__MK20DX256__) - #define BOARD_TYPE "Teensy 3.2/3.1" -#elif defined(__MK20DX128__) - #define BOARD_TYPE "Teensy 3.0" -#elif ( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) - #error "Teensy LC, 2.0++ and 2.0 not supported" -#else - #define BOARD_TYPE "Teensy Unknown" -#endif - -#define EspSerial Serial1 - -#elif ESP_AT_USE_STM32 - -#if defined(STM32F0) - #define BOARD_TYPE "STM32F0" - #error Board STM32F0 not supported -#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 - -// For STM32, you have to declare and enable coreresponding Serial Port somewhere else before using it -#define EspSerial Serial1 - -#elif defined(BOARD_SIPEED_MAIX_DUINO) - -#warning SIPEED_MAIX_DUINO board selected -#define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" - -#define EspSerial Serial1 - -#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ - defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) - -#warning RASPBERRY_PI_PICO board selected - -#if defined(ARDUINO_ARCH_MBED) - - #if defined(BOARD_NAME) - #undef BOARD_NAME - #endif - - #if defined(ARDUINO_RASPBERRY_PI_PICO) - #define BOARD_TYPE "MBED RASPBERRY_PI_PICO" - #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) - #define BOARD_TYPE "MBED DAFRUIT_FEATHER_RP2040" - #elif defined(ARDUINO_GENERIC_RP2040) - #define BOARD_TYPE "MBED GENERIC_RP2040" - #elif defined(ARDUINO_NANO_RP2040_CONNECT) - #define BOARD_NAME "MBED NANO_RP2040_CONNECT" - #else - #define BOARD_TYPE "MBED Unknown RP2040" - #endif -#else - #define BOARD_TYPE "RASPBERRY_PI_PICO" -#endif - -#define EspSerial Serial1 - -#elif (ESP_AT_USE_AVR) - -#if defined(ARDUINO_AVR_MEGA2560) - #define BOARD_TYPE "AVR Mega2560" -#elif defined(ARDUINO_AVR_MEGA) - #define BOARD_TYPE "AVR Mega" -#else - #define BOARD_TYPE "AVR ADK" -#endif - -// For Mega, use Serial1 or Serial3 -#define EspSerial Serial3 - -#else -#error Unknown or unsupported Board. Please check your Tools->Board setting. - -#endif //ESP_AT_USE_NRF528XX - -#ifndef BOARD_NAME - #define BOARD_NAME BOARD_TYPE -#endif +#include "defines.h" #include "ESP_AT_Lib.h" -#define SSID "SSID" -#define PASSWORD "password" - // Your board <-> ESP_AT baud rate: #define ESP_AT_BAUD 115200 ESP8266 wifi(&EspSerial); -void setup(void) +void setup() { Serial.begin(115200); - while (!Serial); + while (!Serial && millis() < 5000); delay(1000); @@ -330,6 +83,6 @@ void setup(void) Serial.println("Done"); } -void loop(void) +void loop() { } diff --git a/examples/ConnectWiFi/defines.h b/examples/ConnectWiFi/defines.h new file mode 100644 index 0000000..5e4d828 --- /dev/null +++ b/examples/ConnectWiFi/defines.h @@ -0,0 +1,420 @@ +/**************************************************************************************************************************** + defines.h + For WizFi360/ESP8266/ESP32-AT-command running shields + + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields + + Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases + Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib + Licensed under MIT license + *****************************************************************************************************************************/ + +#ifndef defines_h +#define defines_h + +//#define HTTP_UPLOAD_BUFLEN 4096 + +#define DEBUG_ESP8266_AT_WEBSERVER_PORT Serial + +// Debug Level from 0 to 4 +#define _ESP_AT_LIB_LOGLEVEL_ 1 + +#define USING_WIZFI360 true + +#if (USING_WIZFI360) || defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #define USE_ESP32_AT true +#else + // Uncomment to use ESP32-AT commands + //#define USE_ESP32_AT true +#endif + +#if USE_ESP32_AT + #warning Using ESP32-AT WiFi and ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP32-AT & ESP8266_AT_WebServer Library" +#else + #warning Using ESP8266-AT WiFi with ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP8266-AT & ESP8266_AT_WebServer Library" +#endif + +#if ( 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(__SAMD21E18A__) || defined(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) \ + || defined(__SAMD51G19A__) || defined(__SAMD51P19A__) || defined(__SAMD21G18A__) ) + + #define MULTIPLY_FACTOR 2 + + #if defined(ESP8266_AT_USE_SAMD) + #undef ESP8266_AT_USE_SAMD + #endif + #define ESP8266_AT_USE_SAMD true + +#endif + +#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ + defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ + defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ + defined(NRF52840_LED_GLASSES) || defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) || \ + defined(ARDUINO_Seeed_XIAO_nRF52840) || defined(ARDUINO_Seeed_XIAO_nRF52840_Sense) || \ + defined(ARDUINO_SEEED_XIAO_NRF52840) || defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) ) + + #define MULTIPLY_FACTOR 4 + + #if defined(ESP8266_AT_USE_NRF528XX) + #undef ESP8266_AT_USE_NRF528XX + #endif + #define ESP8266_AT_USE_NRF528XX true + +#endif + +#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) + #if defined(ESP8266_AT_USE_SAM_DUE) + #undef ESP8266_AT_USE_SAM_DUE + #endif + #define ESP8266_AT_USE_SAM_DUE true +#endif + +#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) || \ + defined(STM32L0) || defined(STM32L1) || defined(STM32L4) || defined(STM32H7) ||defined(STM32G0) || defined(STM32G4) || \ + defined(STM32WB) || defined(STM32MP1) ) + #if defined(ESP8266_AT_USE_STM32) + #undef ESP8266_AT_USE_STM32 + #endif + #define ESP8266_AT_USE_STM32 true +#endif + +#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) + #if defined(ESP_AT_USE_AVR) + #undef ESP_AT_USE_AVR + #endif + #define ESP_AT_USE_AVR true +#endif + +#ifdef CORE_TEENSY + // For Teensy 4.1/4.0 + //#define EspSerial Serial1 //Serial1, Pin RX1 : 0, TX1 : 1 + #define EspSerial Serial2 //Serial2, Pin RX2 : 7, TX2 : 8 + //#define EspSerial Serial3 //Serial3, Pin RX3 : 15, TX3 : 14 + //#define EspSerial Serial4 //Serial4, Pin RX4 : 16, TX4 : 17 + + #if defined(__IMXRT1062__) + // For Teensy 4.1/4.0 + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_TEENSY41) + #define BOARD_TYPE "TEENSY 4.1" + // Use true for NativeEthernet Library, false if using other Ethernet libraries + #define USE_NATIVE_ETHERNET true + #elif defined(ARDUINO_TEENSY40) + #define BOARD_TYPE "TEENSY 4.0" + #else + #define BOARD_TYPE "TEENSY 4.x" + #endif + #elif defined(__MK66FX1M0__) + #define BOARD_TYPE "Teensy 3.6" + #elif defined(__MK64FX512__) + #define BOARD_TYPE "Teensy 3.5" + #elif defined(__MKL26Z64__) + #define BOARD_TYPE "Teensy LC" + #elif defined(__MK20DX256__) + #define BOARD_TYPE "Teensy 3.2" // and Teensy 3.1 (obsolete) + #elif defined(__MK20DX128__) + #define BOARD_TYPE "Teensy 3.0" + #elif defined(__AVR_AT90USB1286__) + #error Teensy 2.0++ not supported yet + #elif defined(__AVR_ATmega32U4__) + #error Teensy 2.0 not supported yet + #else + // For Other Boards + #define BOARD_TYPE "Unknown Teensy Board" + #endif + +#elif defined(ESP8266_AT_USE_SAMD) + // For SAMD + #define EspSerial Serial1 + + #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(ADAFRUIT_FEATHER_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_FEATHER_M0_EXPRESS" + #elif defined(ADAFRUIT_METRO_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_METRO_M0_EXPRESS" + #elif defined(ADAFRUIT_CIRCUITPLAYGROUND_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_CIRCUITPLAYGROUND_M0" + #elif defined(ADAFRUIT_GEMMA_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_GEMMA_M0" + #elif defined(ADAFRUIT_TRINKET_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_TRINKET_M0" + #elif defined(ADAFRUIT_ITSYBITSY_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_ITSYBITSY_M0" + #elif defined(ARDUINO_SAMD_HALLOWING_M0) + #define BOARD_TYPE "SAMD21 ARDUINO_SAMD_HALLOWING_M0" + #elif defined(ADAFRUIT_METRO_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_EXPRESS" + #elif defined(ADAFRUIT_GRAND_CENTRAL_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_GRAND_CENTRAL_M4" + #elif defined(ADAFRUIT_FEATHER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_FEATHER_M4_EXPRESS" + #elif defined(ADAFRUIT_ITSYBITSY_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_ITSYBITSY_M4_EXPRESS" + #elif defined(ADAFRUIT_TRELLIS_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_TRELLIS_M4_EXPRESS" + #elif defined(ADAFRUIT_PYPORTAL) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL" + #elif defined(ADAFRUIT_PYPORTAL_M4_TITANO) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL_M4_TITANO" + #elif defined(ADAFRUIT_PYBADGE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_M4_EXPRESS" + #elif defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_AIRLIFT_LITE" + #elif defined(ADAFRUIT_PYGAMER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_M4_EXPRESS" + #elif defined(ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS" + #elif defined(ADAFRUIT_PYBADGE_AIRLIFT_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_AIRLIFT_M4" + #elif defined(ADAFRUIT_MONSTER_M4SK_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_MONSTER_M4SK_EXPRESS" + #elif defined(ADAFRUIT_HALLOWING_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_HALLOWING_M4_EXPRESS" + #elif defined(SEEED_WIO_TERMINAL) + #define BOARD_TYPE "SAMD SEEED_WIO_TERMINAL" + #elif defined(SEEED_FEMTO_M0) + #define BOARD_TYPE "SAMD SEEED_FEMTO_M0" + #elif defined(SEEED_XIAO_M0) + #define BOARD_TYPE "SAMD SEEED_XIAO_M0" + #elif defined(Wio_Lite_MG126) + #define BOARD_TYPE "SAMD SEEED Wio_Lite_MG126" + #elif defined(WIO_GPS_BOARD) + #define BOARD_TYPE "SAMD SEEED WIO_GPS_BOARD" + #elif defined(SEEEDUINO_ZERO) + #define BOARD_TYPE "SAMD SEEEDUINO_ZERO" + #elif defined(SEEEDUINO_LORAWAN) + #define BOARD_TYPE "SAMD SEEEDUINO_LORAWAN" + #elif defined(SEEED_GROVE_UI_WIRELESS) + #define BOARD_TYPE "SAMD SEEED_GROVE_UI_WIRELESS" + #elif defined(__SAMD21E18A__) + #define BOARD_TYPE "SAMD21E18A" + #elif defined(__SAMD21G18A__) + #define BOARD_TYPE "SAMD21G18A" + #elif defined(__SAMD51G19A__) + #define BOARD_TYPE "SAMD51G19A" + #elif defined(__SAMD51J19A__) + #define BOARD_TYPE "SAMD51J19A" + #elif defined(__SAMD51J20A__) + #define BOARD_TYPE "SAMD51J20A" + #elif defined(__SAM3X8E__) + #define BOARD_TYPE "SAM3X8E" + #elif defined(__CPU_ARC__) + #define BOARD_TYPE "CPU_ARC" + #elif defined(__SAMD51__) + #define BOARD_TYPE "SAMD51" + #else + #define BOARD_TYPE "SAMD Unknown" + #endif + +#elif (ESP8266_AT_USE_NRF528XX) + + #if defined(NRF52840_FEATHER) + #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" + #elif defined(NRF52832_FEATHER) + #define BOARD_TYPE "NRF52832_FEATHER" + #elif defined(NRF52840_FEATHER_SENSE) + #define BOARD_TYPE "NRF52840_FEATHER_SENSE" + #elif defined(NRF52840_ITSYBITSY) + #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" + #elif defined(NRF52840_CIRCUITPLAY) + #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" + #elif defined(NRF52840_CLUE) + #define BOARD_TYPE "NRF52840_CLUE" + #elif defined(NRF52840_METRO) + #define BOARD_TYPE "NRF52840_METRO_EXPRESS" + #elif defined(NRF52840_PCA10056) + #define BOARD_TYPE "NORDIC_NRF52840DK" + #elif defined(NINA_B302_ublox) + #define BOARD_TYPE "NINA_B302_ublox" + #elif defined(NINA_B112_ublox) + #define BOARD_TYPE "NINA_B112_ublox" + #elif defined(PARTICLE_XENON) + #define BOARD_TYPE "PARTICLE_XENON" + #elif defined(MDBT50Q_RX) + #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" + #elif defined(ARDUINO_NRF52_ADAFRUIT) + #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" + #else + #define BOARD_TYPE "nRF52 Unknown" + #endif + + #define EspSerial Serial1 + +#elif defined(ESP8266_AT_USE_SAM_DUE) + // For SAM DUE + #define EspSerial Serial1 + #define BOARD_TYPE "SAM DUE" + +#elif defined(ESP8266_AT_USE_STM32) + // For STM32 + #warning EspSerial using SERIAL_PORT_HARDWARE, can be Serial or Serial1. See your board variant.h + #define EspSerial SERIAL_PORT_HARDWARE //Serial1 + + #if defined(STM32F0) + #warning STM32F0 board selected + #define BOARD_TYPE "STM32F0" + #elif defined(STM32F1) + #warning STM32F1 board selected + #define BOARD_TYPE "STM32F1" + #elif defined(STM32F2) + #warning STM32F2 board selected + #define BOARD_TYPE "STM32F2" + #elif defined(STM32F3) + #warning STM32F3 board selected + #define BOARD_TYPE "STM32F3" + #elif defined(STM32F4) + #warning STM32F4 board selected + #define BOARD_TYPE "STM32F4" + #elif defined(STM32F7) + + #if defined(ARDUINO_NUCLEO_F767ZI) + #warning Nucleo-144 NUCLEO_F767ZI board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); + #else + + #warning STM32F7 board selected + #define BOARD_TYPE "STM32F7" + + #endif + + #elif defined(STM32L0) + #if defined(ARDUINO_NUCLEO_L053R8) + #warning Nucleo-64 NUCLEO_L053R8 board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); // (PA3, PA2); + #else + + #warning STM32L0 board selected + #define BOARD_TYPE "STM32L0" + + #endif + + #elif defined(STM32L1) + #warning STM32L1 board selected + #define BOARD_TYPE "STM32L1" + #elif defined(STM32L4) + #warning STM32L4 board selected + #define BOARD_TYPE "STM32L4" + #elif defined(STM32H7) + #warning STM32H7 board selected + #define BOARD_TYPE "STM32H7" + #elif defined(STM32G0) + #warning STM32G0 board selected + #define BOARD_TYPE "STM32G0" + #elif defined(STM32G4) + #warning STM32G4 board selected + #define BOARD_TYPE "STM32G4" + #elif defined(STM32WB) + #warning STM32WB board selected + #define BOARD_TYPE "STM32WB" + #elif defined(STM32MP1) + #warning STM32MP1 board selected + #define BOARD_TYPE "STM32MP1" + #else + #warning STM32 unknown board selected + #define BOARD_TYPE "STM32 Unknown" + + #endif + +#elif defined(BOARD_SIPEED_MAIX_DUINO) + + #warning SIPEED_MAIX_DUINO board selected + #define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" + + #define EspSerial Serial1 + +#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + + #warning RASPBERRY_PI_PICO board selected + + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_ARCH_MBED) + + #warning Using ARDUINO_ARCH_MBED + + #if ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + // Only undef known BOARD_NAME to use better one + #undef BOARD_NAME + #endif + + #if defined(ARDUINO_RASPBERRY_PI_PICO) + #define BOARD_NAME "MBED RASPBERRY_PI_PICO" + #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) + #define BOARD_NAME "MBED ADAFRUIT_FEATHER_RP2040" + #elif defined(ARDUINO_GENERIC_RP2040) + #define BOARD_NAME "MBED GENERIC_RP2040" + #elif defined(ARDUINO_NANO_RP2040_CONNECT) + #define BOARD_NAME "MBED NANO_RP2040_CONNECT" + #else + // Use default BOARD_NAME if exists + #if !defined(BOARD_NAME) + #define BOARD_NAME "MBED Unknown RP2040" + #endif + #endif + + #endif + + #if defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #warning WIZNET_WIZFI360_EVB_PICO + #define EspSerial Serial2 + #else + #define EspSerial Serial1 + #endif + +#elif (ESP_AT_USE_AVR) + + #if defined(ARDUINO_AVR_MEGA2560) + #define BOARD_TYPE "AVR Mega2560" + #elif defined(ARDUINO_AVR_MEGA) + #define BOARD_TYPE "AVR Mega" + #else + #define BOARD_TYPE "AVR ADK" + #endif + + // For Mega, use Serial1 or Serial3 + #define EspSerial Serial3 + +#else + #error Unknown or unsupported Board. Please check your Tools->Board setting. +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME BOARD_TYPE +#endif + +//////////////////////////////////////////// + +#define SSID "SSID" +#define PASSWORD "password" + + +#endif //defines_h diff --git a/examples/HTTPGET/HTTPGET.ino b/examples/HTTPGET/HTTPGET.ino index b6cb121..a008af7 100644 --- a/examples/HTTPGET/HTTPGET.ino +++ b/examples/HTTPGET/HTTPGET.ino @@ -1,8 +1,8 @@ /**************************************************************************************************************************** HTTPGET.ino - For ESP8266/ESP32-AT-command running shields + For WizFi360/ESP8266/ESP32-AT-command running shields - ESP_AT_Lib is a wrapper library for the ESP8266/ESP32 AT-command shields + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib @@ -28,258 +28,12 @@ THE SOFTWARE. *****************************************************************************************************************************/ -/* Comment this out to disable prints and save space */ -#define ESP_AT_DEBUG_OUTPUT Serial - -#define _ESP_AT_LOGLEVEL_ 4 - -// Uncomment to use ESP32-AT commands -//#define USE_ESP32_AT true - -#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ - defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ - defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ - defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) ) -#if defined(ESP_AT_USE_NRF528XX) - #undef ESP_AT_USE_NRF528XX -#endif -#define ESP_AT_USE_NRF528XX true -#endif - -#if ( 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(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) || defined(__SAMD51G19A__) ) -#if defined(ESP_AT_USE_SAMD) - #undef ESP_AT_USE_SAMD -#endif -#define ESP_AT_USE_SAMD true -#endif - -#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) - #if defined(ESP_AT_USE_AVR) - #undef ESP_AT_USE_AVR - #endif - #define ESP_AT_USE_AVR true -#endif - -#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) - #if defined(ESP_AT_USE_SAM_DUE) - #undef ESP_AT_USE_SAM_DUE - #endif - #define ESP_AT_USE_SAM_DUE true -#endif - -#if ( defined(CORE_TEENSY) && !( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) ) - #if defined(ESP_AT_USE_TEENSY) - #undef ESP_AT_USE_TEENSY - #endif - #define ESP_AT_USE_TEENSY true -#endif - -#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) ) - #if defined(ESP_AT_USE_STM32) - #undef ESP_AT_USE_STM32 - #endif - #define ESP_AT_USE_STM32 true -#endif - -#if (ESP_AT_USE_NRF528XX) - -#if defined(NRF52840_FEATHER) - #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" -#elif defined(NRF52832_FEATHER) - #define BOARD_TYPE "NRF52832_FEATHER" -#elif defined(NRF52840_FEATHER_SENSE) - #define BOARD_TYPE "NRF52840_FEATHER_SENSE" -#elif defined(NRF52840_ITSYBITSY) - #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" -#elif defined(NRF52840_CIRCUITPLAY) - #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" -#elif defined(NRF52840_CLUE) - #define BOARD_TYPE "NRF52840_CLUE" -#elif defined(NRF52840_METRO) - #define BOARD_TYPE "NRF52840_METRO_EXPRESS" -#elif defined(NRF52840_PCA10056) - #define BOARD_TYPE "NORDIC_NRF52840DK" -#elif defined(NINA_B302_ublox) - #define BOARD_TYPE "NINA_B302_ublox" -#elif defined(NINA_B112_ublox) - #define BOARD_TYPE "NINA_B112_ublox" -#elif defined(PARTICLE_XENON) - #define BOARD_TYPE "PARTICLE_XENON" -#elif defined(MDBT50Q_RX) - #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" -#elif defined(ARDUINO_NRF52_ADAFRUIT) - #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" -#else - #define BOARD_TYPE "nRF52 Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_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(__SAMD21G18A__) - #define BOARD_TYPE "SAMD21G18A" -#elif defined(__SAMD51G19A__) - #define BOARD_TYPE "SAMD51G19" -#elif defined(__SAMD51J19A__) - #define BOARD_TYPE "SAMD51J19A" -#elif defined(__SAMD51J20A__) - #define BOARD_TYPE "SAMD51J20A" -#elif defined(__SAMD51__) - #define BOARD_TYPE "SAMD51" -#else - #define BOARD_TYPE "SAMD Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_USE_SAM_DUE) -#if ( defined(ARDUINO_SAM_DUE) || (__SAM3X8E__) ) - #define BOARD_TYPE "SAM DUE" -#else - #define BOARD_TYPE "SAM Unknown" -#endif - -#define EspSerial Serial1 - -#elif ( defined(CORE_TEENSY) ) -// For Teensy 4.0 -#if defined(__IMXRT1062__) - // For Teensy 4.1/4.0 - #if defined(ARDUINO_TEENSY41) - #define BOARD_TYPE "TEENSY 4.1" - // Use true for NativeEthernet Library, false if using other Ethernet libraries - #define USE_NATIVE_ETHERNET true - #elif defined(ARDUINO_TEENSY40) - #define BOARD_TYPE "TEENSY 4.0" - #else - #define BOARD_TYPE "TEENSY 4.x" - #endif -#elif defined(__MK66FX1M0__) - #define BOARD_TYPE "Teensy 3.6" -#elif defined(__MK64FX512__) - #define BOARD_TYPE "Teensy 3.5" -#elif defined(__MK20DX256__) - #define BOARD_TYPE "Teensy 3.2/3.1" -#elif defined(__MK20DX128__) - #define BOARD_TYPE "Teensy 3.0" -#elif ( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) - #error "Teensy LC, 2.0++ and 2.0 not supported" -#else - #define BOARD_TYPE "Teensy Unknown" -#endif - -#define EspSerial Serial1 - -#elif ESP_AT_USE_STM32 - -#if defined(STM32F0) - #define BOARD_TYPE "STM32F0" - #error Board STM32F0 not supported -#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 - -// For STM32, you have to declare and enable coreresponding Serial Port somewhere else before using it -#define EspSerial Serial1 - -#elif defined(BOARD_SIPEED_MAIX_DUINO) - -#warning SIPEED_MAIX_DUINO board selected -#define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" - -#define EspSerial Serial1 - -#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ - defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) - -#warning RASPBERRY_PI_PICO board selected - -#if defined(ARDUINO_ARCH_MBED) - - #if defined(BOARD_NAME) - #undef BOARD_NAME - #endif - - #if defined(ARDUINO_RASPBERRY_PI_PICO) - #define BOARD_TYPE "MBED RASPBERRY_PI_PICO" - #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) - #define BOARD_TYPE "MBED DAFRUIT_FEATHER_RP2040" - #elif defined(ARDUINO_GENERIC_RP2040) - #define BOARD_TYPE "MBED GENERIC_RP2040" - #elif defined(ARDUINO_NANO_RP2040_CONNECT) - #define BOARD_NAME "MBED NANO_RP2040_CONNECT" - #else - #define BOARD_TYPE "MBED Unknown RP2040" - #endif -#else - #define BOARD_TYPE "RASPBERRY_PI_PICO" -#endif - -#define EspSerial Serial1 - -#elif (ESP_AT_USE_AVR) - -#if defined(ARDUINO_AVR_MEGA2560) - #define BOARD_TYPE "AVR Mega2560" -#elif defined(ARDUINO_AVR_MEGA) - #define BOARD_TYPE "AVR Mega" -#else - #define BOARD_TYPE "AVR ADK" -#endif - -// For Mega, use Serial1 or Serial3 -#define EspSerial Serial3 - -#else -#error Unknown or unsupported Board. Please check your Tools->Board setting. - -#endif //ESP_AT_USE_NRF528XX - -#ifndef BOARD_NAME - #define BOARD_NAME BOARD_TYPE -#endif +#include "defines.h" #include "ESP_AT_Lib.h" -#define SSID "SSID" -#define PASSWORD "password" - -#define HOST_NAME "arduino.cc" //"www.yahoo.com" +//#define HOST_NAME "arduino.tips" //"www.yahoo.com" +#define HOST_NAME "www.yahoo.com" #define HOST_PORT (80) // Your board <-> ESP_AT baud rate: @@ -287,11 +41,11 @@ ESP8266 wifi(&EspSerial); -void setup(void) +void setup() { Serial.begin(115200); - while (!Serial); + while (!Serial && millis() < 5000); delay(1000); @@ -331,15 +85,15 @@ void setup(void) Serial.println("Connect to WiFi failed"); } - Serial.print("disableMUX "); - - if (wifi.disableMUX()) + Serial.print("enableMUX "); + + if (wifi.enableMUX()) { - Serial.println("OK"); + Serial.println("enableMUX OK"); } else { - Serial.println("failed"); + Serial.println("enableMUX failed"); } Serial.println("Done"); @@ -347,11 +101,13 @@ void setup(void) uint8_t buffer[2048] = {0}; -void loop(void) +void loop() { + static uint8_t mux_id = 0; + Serial.print("Create TCP "); - if (wifi.createTCP(HOST_NAME, HOST_PORT)) + if (wifi.createTCP(mux_id, HOST_NAME, HOST_PORT)) { Serial.println("OK"); } @@ -360,12 +116,12 @@ void loop(void) Serial.println("failed"); } - //char hello[] = "GET / HTTP/1.1\r\nHost: www.yahoo.com\r\nConnection: close\r\n\r\n"; - char hello[] = "GET /asciilogo.txt HTTP/1.1\r\nHost: arduino.cc\r\nConnection: close\r\n\r\n"; + char hello[] = "GET / HTTP/1.1\r\nHost: www.yahoo.com\r\nConnection: close\r\n\r\n"; + //char hello[] = "GET /asciilogo.txt HTTP/1.1\r\nHost: arduino.tips\r\nConnection: close\r\n\r\n"; - wifi.send((const uint8_t*)hello, strlen(hello)); + wifi.send(mux_id, (const uint8_t*)hello, strlen(hello)); - uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000); + uint32_t len = wifi.recv(mux_id, buffer, sizeof(buffer), 10000); if (len > 0) { @@ -379,7 +135,7 @@ void loop(void) Serial.println("\n============================================================"); } - if (wifi.releaseTCP()) + if (wifi.releaseTCP(mux_id)) { Serial.println("Release TCP OK"); } diff --git a/examples/HTTPGET/defines.h b/examples/HTTPGET/defines.h new file mode 100644 index 0000000..5a09263 --- /dev/null +++ b/examples/HTTPGET/defines.h @@ -0,0 +1,419 @@ +/**************************************************************************************************************************** + defines.h + For WizFi360/ESP8266/ESP32-AT-command running shields + + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields + + Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases + Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib + Licensed under MIT license + *****************************************************************************************************************************/ + +#ifndef defines_h +#define defines_h + +//#define HTTP_UPLOAD_BUFLEN 4096 + +#define DEBUG_ESP8266_AT_WEBSERVER_PORT Serial + +// Debug Level from 0 to 4 +#define _ESP_AT_LIB_LOGLEVEL_ 1 + +#define USING_WIZFI360 true + +#if (USING_WIZFI360) || defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #define USE_ESP32_AT true +#else + // Uncomment to use ESP32-AT commands + //#define USE_ESP32_AT true +#endif + +#if USE_ESP32_AT + #warning Using ESP32-AT WiFi and ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP32-AT & ESP8266_AT_WebServer Library" +#else + #warning Using ESP8266-AT WiFi with ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP8266-AT & ESP8266_AT_WebServer Library" +#endif + +#if ( 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(__SAMD21E18A__) || defined(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) \ + || defined(__SAMD51G19A__) || defined(__SAMD51P19A__) || defined(__SAMD21G18A__) ) + + #define MULTIPLY_FACTOR 2 + + #if defined(ESP8266_AT_USE_SAMD) + #undef ESP8266_AT_USE_SAMD + #endif + #define ESP8266_AT_USE_SAMD true + +#endif + +#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ + defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ + defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ + defined(NRF52840_LED_GLASSES) || defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) || \ + defined(ARDUINO_Seeed_XIAO_nRF52840) || defined(ARDUINO_Seeed_XIAO_nRF52840_Sense) || \ + defined(ARDUINO_SEEED_XIAO_NRF52840) || defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) ) + + #define MULTIPLY_FACTOR 4 + + #if defined(ESP8266_AT_USE_NRF528XX) + #undef ESP8266_AT_USE_NRF528XX + #endif + #define ESP8266_AT_USE_NRF528XX true + +#endif + +#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) + #if defined(ESP8266_AT_USE_SAM_DUE) + #undef ESP8266_AT_USE_SAM_DUE + #endif + #define ESP8266_AT_USE_SAM_DUE true +#endif + +#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) || \ + defined(STM32L0) || defined(STM32L1) || defined(STM32L4) || defined(STM32H7) ||defined(STM32G0) || defined(STM32G4) || \ + defined(STM32WB) || defined(STM32MP1) ) + #if defined(ESP8266_AT_USE_STM32) + #undef ESP8266_AT_USE_STM32 + #endif + #define ESP8266_AT_USE_STM32 true +#endif + +#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) + #if defined(ESP_AT_USE_AVR) + #undef ESP_AT_USE_AVR + #endif + #define ESP_AT_USE_AVR true +#endif + +#ifdef CORE_TEENSY + // For Teensy 4.1/4.0 + //#define EspSerial Serial1 //Serial1, Pin RX1 : 0, TX1 : 1 + #define EspSerial Serial2 //Serial2, Pin RX2 : 7, TX2 : 8 + //#define EspSerial Serial3 //Serial3, Pin RX3 : 15, TX3 : 14 + //#define EspSerial Serial4 //Serial4, Pin RX4 : 16, TX4 : 17 + + #if defined(__IMXRT1062__) + // For Teensy 4.1/4.0 + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_TEENSY41) + #define BOARD_TYPE "TEENSY 4.1" + // Use true for NativeEthernet Library, false if using other Ethernet libraries + #define USE_NATIVE_ETHERNET true + #elif defined(ARDUINO_TEENSY40) + #define BOARD_TYPE "TEENSY 4.0" + #else + #define BOARD_TYPE "TEENSY 4.x" + #endif + #elif defined(__MK66FX1M0__) + #define BOARD_TYPE "Teensy 3.6" + #elif defined(__MK64FX512__) + #define BOARD_TYPE "Teensy 3.5" + #elif defined(__MKL26Z64__) + #define BOARD_TYPE "Teensy LC" + #elif defined(__MK20DX256__) + #define BOARD_TYPE "Teensy 3.2" // and Teensy 3.1 (obsolete) + #elif defined(__MK20DX128__) + #define BOARD_TYPE "Teensy 3.0" + #elif defined(__AVR_AT90USB1286__) + #error Teensy 2.0++ not supported yet + #elif defined(__AVR_ATmega32U4__) + #error Teensy 2.0 not supported yet + #else + // For Other Boards + #define BOARD_TYPE "Unknown Teensy Board" + #endif + +#elif defined(ESP8266_AT_USE_SAMD) + // For SAMD + #define EspSerial Serial1 + + #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(ADAFRUIT_FEATHER_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_FEATHER_M0_EXPRESS" + #elif defined(ADAFRUIT_METRO_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_METRO_M0_EXPRESS" + #elif defined(ADAFRUIT_CIRCUITPLAYGROUND_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_CIRCUITPLAYGROUND_M0" + #elif defined(ADAFRUIT_GEMMA_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_GEMMA_M0" + #elif defined(ADAFRUIT_TRINKET_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_TRINKET_M0" + #elif defined(ADAFRUIT_ITSYBITSY_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_ITSYBITSY_M0" + #elif defined(ARDUINO_SAMD_HALLOWING_M0) + #define BOARD_TYPE "SAMD21 ARDUINO_SAMD_HALLOWING_M0" + #elif defined(ADAFRUIT_METRO_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_EXPRESS" + #elif defined(ADAFRUIT_GRAND_CENTRAL_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_GRAND_CENTRAL_M4" + #elif defined(ADAFRUIT_FEATHER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_FEATHER_M4_EXPRESS" + #elif defined(ADAFRUIT_ITSYBITSY_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_ITSYBITSY_M4_EXPRESS" + #elif defined(ADAFRUIT_TRELLIS_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_TRELLIS_M4_EXPRESS" + #elif defined(ADAFRUIT_PYPORTAL) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL" + #elif defined(ADAFRUIT_PYPORTAL_M4_TITANO) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL_M4_TITANO" + #elif defined(ADAFRUIT_PYBADGE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_M4_EXPRESS" + #elif defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_AIRLIFT_LITE" + #elif defined(ADAFRUIT_PYGAMER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_M4_EXPRESS" + #elif defined(ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS" + #elif defined(ADAFRUIT_PYBADGE_AIRLIFT_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_AIRLIFT_M4" + #elif defined(ADAFRUIT_MONSTER_M4SK_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_MONSTER_M4SK_EXPRESS" + #elif defined(ADAFRUIT_HALLOWING_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_HALLOWING_M4_EXPRESS" + #elif defined(SEEED_WIO_TERMINAL) + #define BOARD_TYPE "SAMD SEEED_WIO_TERMINAL" + #elif defined(SEEED_FEMTO_M0) + #define BOARD_TYPE "SAMD SEEED_FEMTO_M0" + #elif defined(SEEED_XIAO_M0) + #define BOARD_TYPE "SAMD SEEED_XIAO_M0" + #elif defined(Wio_Lite_MG126) + #define BOARD_TYPE "SAMD SEEED Wio_Lite_MG126" + #elif defined(WIO_GPS_BOARD) + #define BOARD_TYPE "SAMD SEEED WIO_GPS_BOARD" + #elif defined(SEEEDUINO_ZERO) + #define BOARD_TYPE "SAMD SEEEDUINO_ZERO" + #elif defined(SEEEDUINO_LORAWAN) + #define BOARD_TYPE "SAMD SEEEDUINO_LORAWAN" + #elif defined(SEEED_GROVE_UI_WIRELESS) + #define BOARD_TYPE "SAMD SEEED_GROVE_UI_WIRELESS" + #elif defined(__SAMD21E18A__) + #define BOARD_TYPE "SAMD21E18A" + #elif defined(__SAMD21G18A__) + #define BOARD_TYPE "SAMD21G18A" + #elif defined(__SAMD51G19A__) + #define BOARD_TYPE "SAMD51G19A" + #elif defined(__SAMD51J19A__) + #define BOARD_TYPE "SAMD51J19A" + #elif defined(__SAMD51J20A__) + #define BOARD_TYPE "SAMD51J20A" + #elif defined(__SAM3X8E__) + #define BOARD_TYPE "SAM3X8E" + #elif defined(__CPU_ARC__) + #define BOARD_TYPE "CPU_ARC" + #elif defined(__SAMD51__) + #define BOARD_TYPE "SAMD51" + #else + #define BOARD_TYPE "SAMD Unknown" + #endif + +#elif (ESP8266_AT_USE_NRF528XX) + + #if defined(NRF52840_FEATHER) + #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" + #elif defined(NRF52832_FEATHER) + #define BOARD_TYPE "NRF52832_FEATHER" + #elif defined(NRF52840_FEATHER_SENSE) + #define BOARD_TYPE "NRF52840_FEATHER_SENSE" + #elif defined(NRF52840_ITSYBITSY) + #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" + #elif defined(NRF52840_CIRCUITPLAY) + #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" + #elif defined(NRF52840_CLUE) + #define BOARD_TYPE "NRF52840_CLUE" + #elif defined(NRF52840_METRO) + #define BOARD_TYPE "NRF52840_METRO_EXPRESS" + #elif defined(NRF52840_PCA10056) + #define BOARD_TYPE "NORDIC_NRF52840DK" + #elif defined(NINA_B302_ublox) + #define BOARD_TYPE "NINA_B302_ublox" + #elif defined(NINA_B112_ublox) + #define BOARD_TYPE "NINA_B112_ublox" + #elif defined(PARTICLE_XENON) + #define BOARD_TYPE "PARTICLE_XENON" + #elif defined(MDBT50Q_RX) + #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" + #elif defined(ARDUINO_NRF52_ADAFRUIT) + #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" + #else + #define BOARD_TYPE "nRF52 Unknown" + #endif + + #define EspSerial Serial1 + +#elif defined(ESP8266_AT_USE_SAM_DUE) + // For SAM DUE + #define EspSerial Serial1 + #define BOARD_TYPE "SAM DUE" + +#elif defined(ESP8266_AT_USE_STM32) + // For STM32 + #warning EspSerial using SERIAL_PORT_HARDWARE, can be Serial or Serial1. See your board variant.h + #define EspSerial SERIAL_PORT_HARDWARE //Serial1 + + #if defined(STM32F0) + #warning STM32F0 board selected + #define BOARD_TYPE "STM32F0" + #elif defined(STM32F1) + #warning STM32F1 board selected + #define BOARD_TYPE "STM32F1" + #elif defined(STM32F2) + #warning STM32F2 board selected + #define BOARD_TYPE "STM32F2" + #elif defined(STM32F3) + #warning STM32F3 board selected + #define BOARD_TYPE "STM32F3" + #elif defined(STM32F4) + #warning STM32F4 board selected + #define BOARD_TYPE "STM32F4" + #elif defined(STM32F7) + + #if defined(ARDUINO_NUCLEO_F767ZI) + #warning Nucleo-144 NUCLEO_F767ZI board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); + #else + + #warning STM32F7 board selected + #define BOARD_TYPE "STM32F7" + + #endif + + #elif defined(STM32L0) + #if defined(ARDUINO_NUCLEO_L053R8) + #warning Nucleo-64 NUCLEO_L053R8 board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); // (PA3, PA2); + #else + + #warning STM32L0 board selected + #define BOARD_TYPE "STM32L0" + + #endif + + #elif defined(STM32L1) + #warning STM32L1 board selected + #define BOARD_TYPE "STM32L1" + #elif defined(STM32L4) + #warning STM32L4 board selected + #define BOARD_TYPE "STM32L4" + #elif defined(STM32H7) + #warning STM32H7 board selected + #define BOARD_TYPE "STM32H7" + #elif defined(STM32G0) + #warning STM32G0 board selected + #define BOARD_TYPE "STM32G0" + #elif defined(STM32G4) + #warning STM32G4 board selected + #define BOARD_TYPE "STM32G4" + #elif defined(STM32WB) + #warning STM32WB board selected + #define BOARD_TYPE "STM32WB" + #elif defined(STM32MP1) + #warning STM32MP1 board selected + #define BOARD_TYPE "STM32MP1" + #else + #warning STM32 unknown board selected + #define BOARD_TYPE "STM32 Unknown" + + #endif + +#elif defined(BOARD_SIPEED_MAIX_DUINO) + + #warning SIPEED_MAIX_DUINO board selected + #define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" + + #define EspSerial Serial1 + +#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + + #warning RASPBERRY_PI_PICO board selected + + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_ARCH_MBED) + + #warning Using ARDUINO_ARCH_MBED + + #if ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + // Only undef known BOARD_NAME to use better one + #undef BOARD_NAME + #endif + + #if defined(ARDUINO_RASPBERRY_PI_PICO) + #define BOARD_NAME "MBED RASPBERRY_PI_PICO" + #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) + #define BOARD_NAME "MBED ADAFRUIT_FEATHER_RP2040" + #elif defined(ARDUINO_GENERIC_RP2040) + #define BOARD_NAME "MBED GENERIC_RP2040" + #elif defined(ARDUINO_NANO_RP2040_CONNECT) + #define BOARD_NAME "MBED NANO_RP2040_CONNECT" + #else + // Use default BOARD_NAME if exists + #if !defined(BOARD_NAME) + #define BOARD_NAME "MBED Unknown RP2040" + #endif + #endif + + #endif + + #if defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #warning WIZNET_WIZFI360_EVB_PICO + #define EspSerial Serial2 + #else + #define EspSerial Serial1 + #endif + +#elif (ESP_AT_USE_AVR) + + #if defined(ARDUINO_AVR_MEGA2560) + #define BOARD_TYPE "AVR Mega2560" + #elif defined(ARDUINO_AVR_MEGA) + #define BOARD_TYPE "AVR Mega" + #else + #define BOARD_TYPE "AVR ADK" + #endif + + // For Mega, use Serial1 or Serial3 + #define EspSerial Serial3 + +#else + #error Unknown or unsupported Board. Please check your Tools->Board setting. +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME BOARD_TYPE +#endif + +//////////////////////////////////////////// + +#define SSID "SSID" +#define PASSWORD "password" + +#endif //defines_h diff --git a/examples/TCPClientMultiple/TCPClientMultiple.ino b/examples/TCPClientMultiple/TCPClientMultiple.ino index 448c661..8a25b81 100644 --- a/examples/TCPClientMultiple/TCPClientMultiple.ino +++ b/examples/TCPClientMultiple/TCPClientMultiple.ino @@ -1,8 +1,8 @@ /**************************************************************************************************************************** TCPClientMultiple.ino - For ESP8266/ESP32-AT-command running shields + For WizFi360/ESP8266/ESP32-AT-command running shields - ESP_AT_Lib is a wrapper library for the ESP8266/ESP32 AT-command shields + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib @@ -28,257 +28,10 @@ THE SOFTWARE. *****************************************************************************************************************************/ -/* Comment this out to disable prints and save space */ -#define ESP_AT_DEBUG_OUTPUT Serial - -#define _ESP_AT_LOGLEVEL_ 4 - -// Uncomment to use ESP32-AT commands -//#define USE_ESP32_AT true - -#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ - defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ - defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ - defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) ) -#if defined(ESP_AT_USE_NRF528XX) - #undef ESP_AT_USE_NRF528XX -#endif -#define ESP_AT_USE_NRF528XX true -#endif - -#if ( 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(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) || defined(__SAMD51G19A__) ) -#if defined(ESP_AT_USE_SAMD) - #undef ESP_AT_USE_SAMD -#endif -#define ESP_AT_USE_SAMD true -#endif - -#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) - #if defined(ESP_AT_USE_AVR) - #undef ESP_AT_USE_AVR - #endif - #define ESP_AT_USE_AVR true -#endif - -#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) - #if defined(ESP_AT_USE_SAM_DUE) - #undef ESP_AT_USE_SAM_DUE - #endif - #define ESP_AT_USE_SAM_DUE true -#endif - -#if ( defined(CORE_TEENSY) && !( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) ) - #if defined(ESP_AT_USE_TEENSY) - #undef ESP_AT_USE_TEENSY - #endif - #define ESP_AT_USE_TEENSY true -#endif - -#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) ) - #if defined(ESP_AT_USE_STM32) - #undef ESP_AT_USE_STM32 - #endif - #define ESP_AT_USE_STM32 true -#endif - -#if (ESP_AT_USE_NRF528XX) - -#if defined(NRF52840_FEATHER) - #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" -#elif defined(NRF52832_FEATHER) - #define BOARD_TYPE "NRF52832_FEATHER" -#elif defined(NRF52840_FEATHER_SENSE) - #define BOARD_TYPE "NRF52840_FEATHER_SENSE" -#elif defined(NRF52840_ITSYBITSY) - #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" -#elif defined(NRF52840_CIRCUITPLAY) - #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" -#elif defined(NRF52840_CLUE) - #define BOARD_TYPE "NRF52840_CLUE" -#elif defined(NRF52840_METRO) - #define BOARD_TYPE "NRF52840_METRO_EXPRESS" -#elif defined(NRF52840_PCA10056) - #define BOARD_TYPE "NORDIC_NRF52840DK" -#elif defined(NINA_B302_ublox) - #define BOARD_TYPE "NINA_B302_ublox" -#elif defined(NINA_B112_ublox) - #define BOARD_TYPE "NINA_B112_ublox" -#elif defined(PARTICLE_XENON) - #define BOARD_TYPE "PARTICLE_XENON" -#elif defined(MDBT50Q_RX) - #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" -#elif defined(ARDUINO_NRF52_ADAFRUIT) - #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" -#else - #define BOARD_TYPE "nRF52 Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_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(__SAMD21G18A__) - #define BOARD_TYPE "SAMD21G18A" -#elif defined(__SAMD51G19A__) - #define BOARD_TYPE "SAMD51G19" -#elif defined(__SAMD51J19A__) - #define BOARD_TYPE "SAMD51J19A" -#elif defined(__SAMD51J20A__) - #define BOARD_TYPE "SAMD51J20A" -#elif defined(__SAMD51__) - #define BOARD_TYPE "SAMD51" -#else - #define BOARD_TYPE "SAMD Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_USE_SAM_DUE) -#if ( defined(ARDUINO_SAM_DUE) || (__SAM3X8E__) ) - #define BOARD_TYPE "SAM DUE" -#else - #define BOARD_TYPE "SAM Unknown" -#endif - -#define EspSerial Serial1 - -#elif ( defined(CORE_TEENSY) ) -// For Teensy 4.0 -#if defined(__IMXRT1062__) - // For Teensy 4.1/4.0 - #if defined(ARDUINO_TEENSY41) - #define BOARD_TYPE "TEENSY 4.1" - // Use true for NativeEthernet Library, false if using other Ethernet libraries - #define USE_NATIVE_ETHERNET true - #elif defined(ARDUINO_TEENSY40) - #define BOARD_TYPE "TEENSY 4.0" - #else - #define BOARD_TYPE "TEENSY 4.x" - #endif -#elif defined(__MK66FX1M0__) - #define BOARD_TYPE "Teensy 3.6" -#elif defined(__MK64FX512__) - #define BOARD_TYPE "Teensy 3.5" -#elif defined(__MK20DX256__) - #define BOARD_TYPE "Teensy 3.2/3.1" -#elif defined(__MK20DX128__) - #define BOARD_TYPE "Teensy 3.0" -#elif ( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) - #error "Teensy LC, 2.0++ and 2.0 not supported" -#else - #define BOARD_TYPE "Teensy Unknown" -#endif - -#define EspSerial Serial1 - -#elif ESP_AT_USE_STM32 - -#if defined(STM32F0) - #define BOARD_TYPE "STM32F0" - #error Board STM32F0 not supported -#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 - -// For STM32, you have to declare and enable coreresponding Serial Port somewhere else before using it -#define EspSerial Serial1 - -#elif defined(BOARD_SIPEED_MAIX_DUINO) - -#warning SIPEED_MAIX_DUINO board selected -#define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" - -#define EspSerial Serial1 - -#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ - defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) - -#warning RASPBERRY_PI_PICO board selected - -#if defined(ARDUINO_ARCH_MBED) - - #if defined(BOARD_NAME) - #undef BOARD_NAME - #endif - - #if defined(ARDUINO_RASPBERRY_PI_PICO) - #define BOARD_TYPE "MBED RASPBERRY_PI_PICO" - #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) - #define BOARD_TYPE "MBED DAFRUIT_FEATHER_RP2040" - #elif defined(ARDUINO_GENERIC_RP2040) - #define BOARD_TYPE "MBED GENERIC_RP2040" - #elif defined(ARDUINO_NANO_RP2040_CONNECT) - #define BOARD_NAME "MBED NANO_RP2040_CONNECT" - #else - #define BOARD_TYPE "MBED Unknown RP2040" - #endif -#else - #define BOARD_TYPE "RASPBERRY_PI_PICO" -#endif - -#define EspSerial Serial1 - -#elif (ESP_AT_USE_AVR) - -#if defined(ARDUINO_AVR_MEGA2560) - #define BOARD_TYPE "AVR Mega2560" -#elif defined(ARDUINO_AVR_MEGA) - #define BOARD_TYPE "AVR Mega" -#else - #define BOARD_TYPE "AVR ADK" -#endif - -// For Mega, use Serial1 or Serial3 -#define EspSerial Serial3 - -#else -#error Unknown or unsupported Board. Please check your Tools->Board setting. - -#endif //ESP_AT_USE_NRF528XX - -#ifndef BOARD_NAME - #define BOARD_NAME BOARD_TYPE -#endif +#include "defines.h" #include "ESP_AT_Lib.h" -#define SSID "SSID" -#define PASSWORD "password" - #define HOST_NAME "www.yahoo.com" #define HOST_PORT (80) @@ -287,11 +40,11 @@ ESP8266 wifi(&EspSerial); // Your board <-> ESP_AT baud rate: #define ESP_AT_BAUD 115200 -void setup(void) +void setup() { Serial.begin(115200); - while (!Serial); + while (!Serial && millis() < 5000); delay(1000); @@ -345,7 +98,7 @@ void setup(void) Serial.println("Done"); } -void loop(void) +void loop() { uint8_t buffer[128] = {0}; static uint8_t mux_id = 0; diff --git a/examples/TCPClientMultiple/defines.h b/examples/TCPClientMultiple/defines.h new file mode 100644 index 0000000..5e4d828 --- /dev/null +++ b/examples/TCPClientMultiple/defines.h @@ -0,0 +1,420 @@ +/**************************************************************************************************************************** + defines.h + For WizFi360/ESP8266/ESP32-AT-command running shields + + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields + + Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases + Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib + Licensed under MIT license + *****************************************************************************************************************************/ + +#ifndef defines_h +#define defines_h + +//#define HTTP_UPLOAD_BUFLEN 4096 + +#define DEBUG_ESP8266_AT_WEBSERVER_PORT Serial + +// Debug Level from 0 to 4 +#define _ESP_AT_LIB_LOGLEVEL_ 1 + +#define USING_WIZFI360 true + +#if (USING_WIZFI360) || defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #define USE_ESP32_AT true +#else + // Uncomment to use ESP32-AT commands + //#define USE_ESP32_AT true +#endif + +#if USE_ESP32_AT + #warning Using ESP32-AT WiFi and ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP32-AT & ESP8266_AT_WebServer Library" +#else + #warning Using ESP8266-AT WiFi with ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP8266-AT & ESP8266_AT_WebServer Library" +#endif + +#if ( 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(__SAMD21E18A__) || defined(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) \ + || defined(__SAMD51G19A__) || defined(__SAMD51P19A__) || defined(__SAMD21G18A__) ) + + #define MULTIPLY_FACTOR 2 + + #if defined(ESP8266_AT_USE_SAMD) + #undef ESP8266_AT_USE_SAMD + #endif + #define ESP8266_AT_USE_SAMD true + +#endif + +#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ + defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ + defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ + defined(NRF52840_LED_GLASSES) || defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) || \ + defined(ARDUINO_Seeed_XIAO_nRF52840) || defined(ARDUINO_Seeed_XIAO_nRF52840_Sense) || \ + defined(ARDUINO_SEEED_XIAO_NRF52840) || defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) ) + + #define MULTIPLY_FACTOR 4 + + #if defined(ESP8266_AT_USE_NRF528XX) + #undef ESP8266_AT_USE_NRF528XX + #endif + #define ESP8266_AT_USE_NRF528XX true + +#endif + +#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) + #if defined(ESP8266_AT_USE_SAM_DUE) + #undef ESP8266_AT_USE_SAM_DUE + #endif + #define ESP8266_AT_USE_SAM_DUE true +#endif + +#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) || \ + defined(STM32L0) || defined(STM32L1) || defined(STM32L4) || defined(STM32H7) ||defined(STM32G0) || defined(STM32G4) || \ + defined(STM32WB) || defined(STM32MP1) ) + #if defined(ESP8266_AT_USE_STM32) + #undef ESP8266_AT_USE_STM32 + #endif + #define ESP8266_AT_USE_STM32 true +#endif + +#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) + #if defined(ESP_AT_USE_AVR) + #undef ESP_AT_USE_AVR + #endif + #define ESP_AT_USE_AVR true +#endif + +#ifdef CORE_TEENSY + // For Teensy 4.1/4.0 + //#define EspSerial Serial1 //Serial1, Pin RX1 : 0, TX1 : 1 + #define EspSerial Serial2 //Serial2, Pin RX2 : 7, TX2 : 8 + //#define EspSerial Serial3 //Serial3, Pin RX3 : 15, TX3 : 14 + //#define EspSerial Serial4 //Serial4, Pin RX4 : 16, TX4 : 17 + + #if defined(__IMXRT1062__) + // For Teensy 4.1/4.0 + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_TEENSY41) + #define BOARD_TYPE "TEENSY 4.1" + // Use true for NativeEthernet Library, false if using other Ethernet libraries + #define USE_NATIVE_ETHERNET true + #elif defined(ARDUINO_TEENSY40) + #define BOARD_TYPE "TEENSY 4.0" + #else + #define BOARD_TYPE "TEENSY 4.x" + #endif + #elif defined(__MK66FX1M0__) + #define BOARD_TYPE "Teensy 3.6" + #elif defined(__MK64FX512__) + #define BOARD_TYPE "Teensy 3.5" + #elif defined(__MKL26Z64__) + #define BOARD_TYPE "Teensy LC" + #elif defined(__MK20DX256__) + #define BOARD_TYPE "Teensy 3.2" // and Teensy 3.1 (obsolete) + #elif defined(__MK20DX128__) + #define BOARD_TYPE "Teensy 3.0" + #elif defined(__AVR_AT90USB1286__) + #error Teensy 2.0++ not supported yet + #elif defined(__AVR_ATmega32U4__) + #error Teensy 2.0 not supported yet + #else + // For Other Boards + #define BOARD_TYPE "Unknown Teensy Board" + #endif + +#elif defined(ESP8266_AT_USE_SAMD) + // For SAMD + #define EspSerial Serial1 + + #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(ADAFRUIT_FEATHER_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_FEATHER_M0_EXPRESS" + #elif defined(ADAFRUIT_METRO_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_METRO_M0_EXPRESS" + #elif defined(ADAFRUIT_CIRCUITPLAYGROUND_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_CIRCUITPLAYGROUND_M0" + #elif defined(ADAFRUIT_GEMMA_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_GEMMA_M0" + #elif defined(ADAFRUIT_TRINKET_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_TRINKET_M0" + #elif defined(ADAFRUIT_ITSYBITSY_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_ITSYBITSY_M0" + #elif defined(ARDUINO_SAMD_HALLOWING_M0) + #define BOARD_TYPE "SAMD21 ARDUINO_SAMD_HALLOWING_M0" + #elif defined(ADAFRUIT_METRO_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_EXPRESS" + #elif defined(ADAFRUIT_GRAND_CENTRAL_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_GRAND_CENTRAL_M4" + #elif defined(ADAFRUIT_FEATHER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_FEATHER_M4_EXPRESS" + #elif defined(ADAFRUIT_ITSYBITSY_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_ITSYBITSY_M4_EXPRESS" + #elif defined(ADAFRUIT_TRELLIS_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_TRELLIS_M4_EXPRESS" + #elif defined(ADAFRUIT_PYPORTAL) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL" + #elif defined(ADAFRUIT_PYPORTAL_M4_TITANO) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL_M4_TITANO" + #elif defined(ADAFRUIT_PYBADGE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_M4_EXPRESS" + #elif defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_AIRLIFT_LITE" + #elif defined(ADAFRUIT_PYGAMER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_M4_EXPRESS" + #elif defined(ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS" + #elif defined(ADAFRUIT_PYBADGE_AIRLIFT_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_AIRLIFT_M4" + #elif defined(ADAFRUIT_MONSTER_M4SK_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_MONSTER_M4SK_EXPRESS" + #elif defined(ADAFRUIT_HALLOWING_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_HALLOWING_M4_EXPRESS" + #elif defined(SEEED_WIO_TERMINAL) + #define BOARD_TYPE "SAMD SEEED_WIO_TERMINAL" + #elif defined(SEEED_FEMTO_M0) + #define BOARD_TYPE "SAMD SEEED_FEMTO_M0" + #elif defined(SEEED_XIAO_M0) + #define BOARD_TYPE "SAMD SEEED_XIAO_M0" + #elif defined(Wio_Lite_MG126) + #define BOARD_TYPE "SAMD SEEED Wio_Lite_MG126" + #elif defined(WIO_GPS_BOARD) + #define BOARD_TYPE "SAMD SEEED WIO_GPS_BOARD" + #elif defined(SEEEDUINO_ZERO) + #define BOARD_TYPE "SAMD SEEEDUINO_ZERO" + #elif defined(SEEEDUINO_LORAWAN) + #define BOARD_TYPE "SAMD SEEEDUINO_LORAWAN" + #elif defined(SEEED_GROVE_UI_WIRELESS) + #define BOARD_TYPE "SAMD SEEED_GROVE_UI_WIRELESS" + #elif defined(__SAMD21E18A__) + #define BOARD_TYPE "SAMD21E18A" + #elif defined(__SAMD21G18A__) + #define BOARD_TYPE "SAMD21G18A" + #elif defined(__SAMD51G19A__) + #define BOARD_TYPE "SAMD51G19A" + #elif defined(__SAMD51J19A__) + #define BOARD_TYPE "SAMD51J19A" + #elif defined(__SAMD51J20A__) + #define BOARD_TYPE "SAMD51J20A" + #elif defined(__SAM3X8E__) + #define BOARD_TYPE "SAM3X8E" + #elif defined(__CPU_ARC__) + #define BOARD_TYPE "CPU_ARC" + #elif defined(__SAMD51__) + #define BOARD_TYPE "SAMD51" + #else + #define BOARD_TYPE "SAMD Unknown" + #endif + +#elif (ESP8266_AT_USE_NRF528XX) + + #if defined(NRF52840_FEATHER) + #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" + #elif defined(NRF52832_FEATHER) + #define BOARD_TYPE "NRF52832_FEATHER" + #elif defined(NRF52840_FEATHER_SENSE) + #define BOARD_TYPE "NRF52840_FEATHER_SENSE" + #elif defined(NRF52840_ITSYBITSY) + #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" + #elif defined(NRF52840_CIRCUITPLAY) + #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" + #elif defined(NRF52840_CLUE) + #define BOARD_TYPE "NRF52840_CLUE" + #elif defined(NRF52840_METRO) + #define BOARD_TYPE "NRF52840_METRO_EXPRESS" + #elif defined(NRF52840_PCA10056) + #define BOARD_TYPE "NORDIC_NRF52840DK" + #elif defined(NINA_B302_ublox) + #define BOARD_TYPE "NINA_B302_ublox" + #elif defined(NINA_B112_ublox) + #define BOARD_TYPE "NINA_B112_ublox" + #elif defined(PARTICLE_XENON) + #define BOARD_TYPE "PARTICLE_XENON" + #elif defined(MDBT50Q_RX) + #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" + #elif defined(ARDUINO_NRF52_ADAFRUIT) + #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" + #else + #define BOARD_TYPE "nRF52 Unknown" + #endif + + #define EspSerial Serial1 + +#elif defined(ESP8266_AT_USE_SAM_DUE) + // For SAM DUE + #define EspSerial Serial1 + #define BOARD_TYPE "SAM DUE" + +#elif defined(ESP8266_AT_USE_STM32) + // For STM32 + #warning EspSerial using SERIAL_PORT_HARDWARE, can be Serial or Serial1. See your board variant.h + #define EspSerial SERIAL_PORT_HARDWARE //Serial1 + + #if defined(STM32F0) + #warning STM32F0 board selected + #define BOARD_TYPE "STM32F0" + #elif defined(STM32F1) + #warning STM32F1 board selected + #define BOARD_TYPE "STM32F1" + #elif defined(STM32F2) + #warning STM32F2 board selected + #define BOARD_TYPE "STM32F2" + #elif defined(STM32F3) + #warning STM32F3 board selected + #define BOARD_TYPE "STM32F3" + #elif defined(STM32F4) + #warning STM32F4 board selected + #define BOARD_TYPE "STM32F4" + #elif defined(STM32F7) + + #if defined(ARDUINO_NUCLEO_F767ZI) + #warning Nucleo-144 NUCLEO_F767ZI board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); + #else + + #warning STM32F7 board selected + #define BOARD_TYPE "STM32F7" + + #endif + + #elif defined(STM32L0) + #if defined(ARDUINO_NUCLEO_L053R8) + #warning Nucleo-64 NUCLEO_L053R8 board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); // (PA3, PA2); + #else + + #warning STM32L0 board selected + #define BOARD_TYPE "STM32L0" + + #endif + + #elif defined(STM32L1) + #warning STM32L1 board selected + #define BOARD_TYPE "STM32L1" + #elif defined(STM32L4) + #warning STM32L4 board selected + #define BOARD_TYPE "STM32L4" + #elif defined(STM32H7) + #warning STM32H7 board selected + #define BOARD_TYPE "STM32H7" + #elif defined(STM32G0) + #warning STM32G0 board selected + #define BOARD_TYPE "STM32G0" + #elif defined(STM32G4) + #warning STM32G4 board selected + #define BOARD_TYPE "STM32G4" + #elif defined(STM32WB) + #warning STM32WB board selected + #define BOARD_TYPE "STM32WB" + #elif defined(STM32MP1) + #warning STM32MP1 board selected + #define BOARD_TYPE "STM32MP1" + #else + #warning STM32 unknown board selected + #define BOARD_TYPE "STM32 Unknown" + + #endif + +#elif defined(BOARD_SIPEED_MAIX_DUINO) + + #warning SIPEED_MAIX_DUINO board selected + #define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" + + #define EspSerial Serial1 + +#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + + #warning RASPBERRY_PI_PICO board selected + + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_ARCH_MBED) + + #warning Using ARDUINO_ARCH_MBED + + #if ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + // Only undef known BOARD_NAME to use better one + #undef BOARD_NAME + #endif + + #if defined(ARDUINO_RASPBERRY_PI_PICO) + #define BOARD_NAME "MBED RASPBERRY_PI_PICO" + #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) + #define BOARD_NAME "MBED ADAFRUIT_FEATHER_RP2040" + #elif defined(ARDUINO_GENERIC_RP2040) + #define BOARD_NAME "MBED GENERIC_RP2040" + #elif defined(ARDUINO_NANO_RP2040_CONNECT) + #define BOARD_NAME "MBED NANO_RP2040_CONNECT" + #else + // Use default BOARD_NAME if exists + #if !defined(BOARD_NAME) + #define BOARD_NAME "MBED Unknown RP2040" + #endif + #endif + + #endif + + #if defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #warning WIZNET_WIZFI360_EVB_PICO + #define EspSerial Serial2 + #else + #define EspSerial Serial1 + #endif + +#elif (ESP_AT_USE_AVR) + + #if defined(ARDUINO_AVR_MEGA2560) + #define BOARD_TYPE "AVR Mega2560" + #elif defined(ARDUINO_AVR_MEGA) + #define BOARD_TYPE "AVR Mega" + #else + #define BOARD_TYPE "AVR ADK" + #endif + + // For Mega, use Serial1 or Serial3 + #define EspSerial Serial3 + +#else + #error Unknown or unsupported Board. Please check your Tools->Board setting. +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME BOARD_TYPE +#endif + +//////////////////////////////////////////// + +#define SSID "SSID" +#define PASSWORD "password" + + +#endif //defines_h diff --git a/examples/TCPClientSingle/TCPClientSingle.ino b/examples/TCPClientSingle/TCPClientSingle.ino index d0739bd..8a68fd7 100644 --- a/examples/TCPClientSingle/TCPClientSingle.ino +++ b/examples/TCPClientSingle/TCPClientSingle.ino @@ -1,8 +1,8 @@ /**************************************************************************************************************************** TCPClientSingle.ino - For ESP8266/ESP32-AT-command running shields + For WizFi360/ESP8266/ESP32-AT-command running shields - ESP_AT_Lib is a wrapper library for the ESP8266/ESP32 AT-command shields + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib @@ -28,257 +28,10 @@ THE SOFTWARE. *****************************************************************************************************************************/ -/* Comment this out to disable prints and save space */ -#define ESP_AT_DEBUG_OUTPUT Serial - -#define _ESP_AT_LOGLEVEL_ 4 - -// Uncomment to use ESP32-AT commands -//#define USE_ESP32_AT true - -#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ - defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ - defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ - defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) ) -#if defined(ESP_AT_USE_NRF528XX) - #undef ESP_AT_USE_NRF528XX -#endif -#define ESP_AT_USE_NRF528XX true -#endif - -#if ( 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(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) || defined(__SAMD51G19A__) ) -#if defined(ESP_AT_USE_SAMD) - #undef ESP_AT_USE_SAMD -#endif -#define ESP_AT_USE_SAMD true -#endif - -#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) - #if defined(ESP_AT_USE_AVR) - #undef ESP_AT_USE_AVR - #endif - #define ESP_AT_USE_AVR true -#endif - -#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) - #if defined(ESP_AT_USE_SAM_DUE) - #undef ESP_AT_USE_SAM_DUE - #endif - #define ESP_AT_USE_SAM_DUE true -#endif - -#if ( defined(CORE_TEENSY) && !( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) ) - #if defined(ESP_AT_USE_TEENSY) - #undef ESP_AT_USE_TEENSY - #endif - #define ESP_AT_USE_TEENSY true -#endif - -#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) ) - #if defined(ESP_AT_USE_STM32) - #undef ESP_AT_USE_STM32 - #endif - #define ESP_AT_USE_STM32 true -#endif - -#if (ESP_AT_USE_NRF528XX) - -#if defined(NRF52840_FEATHER) - #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" -#elif defined(NRF52832_FEATHER) - #define BOARD_TYPE "NRF52832_FEATHER" -#elif defined(NRF52840_FEATHER_SENSE) - #define BOARD_TYPE "NRF52840_FEATHER_SENSE" -#elif defined(NRF52840_ITSYBITSY) - #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" -#elif defined(NRF52840_CIRCUITPLAY) - #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" -#elif defined(NRF52840_CLUE) - #define BOARD_TYPE "NRF52840_CLUE" -#elif defined(NRF52840_METRO) - #define BOARD_TYPE "NRF52840_METRO_EXPRESS" -#elif defined(NRF52840_PCA10056) - #define BOARD_TYPE "NORDIC_NRF52840DK" -#elif defined(NINA_B302_ublox) - #define BOARD_TYPE "NINA_B302_ublox" -#elif defined(NINA_B112_ublox) - #define BOARD_TYPE "NINA_B112_ublox" -#elif defined(PARTICLE_XENON) - #define BOARD_TYPE "PARTICLE_XENON" -#elif defined(MDBT50Q_RX) - #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" -#elif defined(ARDUINO_NRF52_ADAFRUIT) - #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" -#else - #define BOARD_TYPE "nRF52 Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_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(__SAMD21G18A__) - #define BOARD_TYPE "SAMD21G18A" -#elif defined(__SAMD51G19A__) - #define BOARD_TYPE "SAMD51G19" -#elif defined(__SAMD51J19A__) - #define BOARD_TYPE "SAMD51J19A" -#elif defined(__SAMD51J20A__) - #define BOARD_TYPE "SAMD51J20A" -#elif defined(__SAMD51__) - #define BOARD_TYPE "SAMD51" -#else - #define BOARD_TYPE "SAMD Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_USE_SAM_DUE) -#if ( defined(ARDUINO_SAM_DUE) || (__SAM3X8E__) ) - #define BOARD_TYPE "SAM DUE" -#else - #define BOARD_TYPE "SAM Unknown" -#endif - -#define EspSerial Serial1 - -#elif ( defined(CORE_TEENSY) ) -// For Teensy 4.0 -#if defined(__IMXRT1062__) - // For Teensy 4.1/4.0 - #if defined(ARDUINO_TEENSY41) - #define BOARD_TYPE "TEENSY 4.1" - // Use true for NativeEthernet Library, false if using other Ethernet libraries - #define USE_NATIVE_ETHERNET true - #elif defined(ARDUINO_TEENSY40) - #define BOARD_TYPE "TEENSY 4.0" - #else - #define BOARD_TYPE "TEENSY 4.x" - #endif -#elif defined(__MK66FX1M0__) - #define BOARD_TYPE "Teensy 3.6" -#elif defined(__MK64FX512__) - #define BOARD_TYPE "Teensy 3.5" -#elif defined(__MK20DX256__) - #define BOARD_TYPE "Teensy 3.2/3.1" -#elif defined(__MK20DX128__) - #define BOARD_TYPE "Teensy 3.0" -#elif ( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) - #error "Teensy LC, 2.0++ and 2.0 not supported" -#else - #define BOARD_TYPE "Teensy Unknown" -#endif - -#define EspSerial Serial1 - -#elif ESP_AT_USE_STM32 - -#if defined(STM32F0) - #define BOARD_TYPE "STM32F0" - #error Board STM32F0 not supported -#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 - -// For STM32, you have to declare and enable coreresponding Serial Port somewhere else before using it -#define EspSerial Serial1 - -#elif defined(BOARD_SIPEED_MAIX_DUINO) - -#warning SIPEED_MAIX_DUINO board selected -#define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" - -#define EspSerial Serial1 - -#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ - defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) - -#warning RASPBERRY_PI_PICO board selected - -#if defined(ARDUINO_ARCH_MBED) - - #if defined(BOARD_NAME) - #undef BOARD_NAME - #endif - - #if defined(ARDUINO_RASPBERRY_PI_PICO) - #define BOARD_TYPE "MBED RASPBERRY_PI_PICO" - #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) - #define BOARD_TYPE "MBED DAFRUIT_FEATHER_RP2040" - #elif defined(ARDUINO_GENERIC_RP2040) - #define BOARD_TYPE "MBED GENERIC_RP2040" - #elif defined(ARDUINO_NANO_RP2040_CONNECT) - #define BOARD_NAME "MBED NANO_RP2040_CONNECT" - #else - #define BOARD_TYPE "MBED Unknown RP2040" - #endif -#else - #define BOARD_TYPE "RASPBERRY_PI_PICO" -#endif - -#define EspSerial Serial1 - -#elif (ESP_AT_USE_AVR) - -#if defined(ARDUINO_AVR_MEGA2560) - #define BOARD_TYPE "AVR Mega2560" -#elif defined(ARDUINO_AVR_MEGA) - #define BOARD_TYPE "AVR Mega" -#else - #define BOARD_TYPE "AVR ADK" -#endif - -// For Mega, use Serial1 or Serial3 -#define EspSerial Serial3 - -#else -#error Unknown or unsupported Board. Please check your Tools->Board setting. - -#endif //ESP_AT_USE_NRF528XX - -#ifndef BOARD_NAME - #define BOARD_NAME BOARD_TYPE -#endif +#include "defines.h" #include "ESP_AT_Lib.h" -#define SSID "SSID" -#define PASSWORD "password" - #define HOST_NAME "www.yahoo.com" #define HOST_PORT (80) @@ -291,7 +44,7 @@ void setup(void) { Serial.begin(115200); - while (!Serial); + while (!Serial && millis() < 5000); #if defined(BOARD_NAME) Serial.println("\nStart TCPClientSingle on " + String(BOARD_NAME)); @@ -329,9 +82,9 @@ void setup(void) Serial.println("Connect to WiFi failed"); } - Serial.print("disableMUX "); - - if (wifi.disableMUX()) + Serial.print("enableMUX "); + + if (wifi.enableMUX()) { Serial.println("OK"); } @@ -339,17 +92,19 @@ void setup(void) { Serial.println("failed"); } - + Serial.println("Done"); } -void loop(void) +void loop() { uint8_t buffer[128] = {0}; + static uint8_t mux_id = 0; + Serial.print("Create TCP "); - if (wifi.createTCP(HOST_NAME, HOST_PORT)) + if (wifi.createTCP(mux_id, HOST_NAME, HOST_PORT)) { Serial.println("OK"); } @@ -360,7 +115,7 @@ void loop(void) char hello[] = "Hello, this is client!"; - if (wifi.send((const uint8_t*)hello, strlen(hello))) + if (wifi.send(mux_id, (const uint8_t*)hello, strlen(hello))) { Serial.println("Send OK"); } @@ -369,7 +124,7 @@ void loop(void) Serial.println("Send failed"); } - uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000); + uint32_t len = wifi.recv(mux_id, buffer, sizeof(buffer), 10000); if (len > 0) { @@ -385,7 +140,7 @@ void loop(void) Serial.print("Release TCP "); - if (wifi.releaseTCP()) + if (wifi.releaseTCP(mux_id)) { Serial.println("OK"); } diff --git a/examples/TCPClientSingle/defines.h b/examples/TCPClientSingle/defines.h new file mode 100644 index 0000000..5e4d828 --- /dev/null +++ b/examples/TCPClientSingle/defines.h @@ -0,0 +1,420 @@ +/**************************************************************************************************************************** + defines.h + For WizFi360/ESP8266/ESP32-AT-command running shields + + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields + + Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases + Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib + Licensed under MIT license + *****************************************************************************************************************************/ + +#ifndef defines_h +#define defines_h + +//#define HTTP_UPLOAD_BUFLEN 4096 + +#define DEBUG_ESP8266_AT_WEBSERVER_PORT Serial + +// Debug Level from 0 to 4 +#define _ESP_AT_LIB_LOGLEVEL_ 1 + +#define USING_WIZFI360 true + +#if (USING_WIZFI360) || defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #define USE_ESP32_AT true +#else + // Uncomment to use ESP32-AT commands + //#define USE_ESP32_AT true +#endif + +#if USE_ESP32_AT + #warning Using ESP32-AT WiFi and ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP32-AT & ESP8266_AT_WebServer Library" +#else + #warning Using ESP8266-AT WiFi with ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP8266-AT & ESP8266_AT_WebServer Library" +#endif + +#if ( 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(__SAMD21E18A__) || defined(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) \ + || defined(__SAMD51G19A__) || defined(__SAMD51P19A__) || defined(__SAMD21G18A__) ) + + #define MULTIPLY_FACTOR 2 + + #if defined(ESP8266_AT_USE_SAMD) + #undef ESP8266_AT_USE_SAMD + #endif + #define ESP8266_AT_USE_SAMD true + +#endif + +#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ + defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ + defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ + defined(NRF52840_LED_GLASSES) || defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) || \ + defined(ARDUINO_Seeed_XIAO_nRF52840) || defined(ARDUINO_Seeed_XIAO_nRF52840_Sense) || \ + defined(ARDUINO_SEEED_XIAO_NRF52840) || defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) ) + + #define MULTIPLY_FACTOR 4 + + #if defined(ESP8266_AT_USE_NRF528XX) + #undef ESP8266_AT_USE_NRF528XX + #endif + #define ESP8266_AT_USE_NRF528XX true + +#endif + +#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) + #if defined(ESP8266_AT_USE_SAM_DUE) + #undef ESP8266_AT_USE_SAM_DUE + #endif + #define ESP8266_AT_USE_SAM_DUE true +#endif + +#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) || \ + defined(STM32L0) || defined(STM32L1) || defined(STM32L4) || defined(STM32H7) ||defined(STM32G0) || defined(STM32G4) || \ + defined(STM32WB) || defined(STM32MP1) ) + #if defined(ESP8266_AT_USE_STM32) + #undef ESP8266_AT_USE_STM32 + #endif + #define ESP8266_AT_USE_STM32 true +#endif + +#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) + #if defined(ESP_AT_USE_AVR) + #undef ESP_AT_USE_AVR + #endif + #define ESP_AT_USE_AVR true +#endif + +#ifdef CORE_TEENSY + // For Teensy 4.1/4.0 + //#define EspSerial Serial1 //Serial1, Pin RX1 : 0, TX1 : 1 + #define EspSerial Serial2 //Serial2, Pin RX2 : 7, TX2 : 8 + //#define EspSerial Serial3 //Serial3, Pin RX3 : 15, TX3 : 14 + //#define EspSerial Serial4 //Serial4, Pin RX4 : 16, TX4 : 17 + + #if defined(__IMXRT1062__) + // For Teensy 4.1/4.0 + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_TEENSY41) + #define BOARD_TYPE "TEENSY 4.1" + // Use true for NativeEthernet Library, false if using other Ethernet libraries + #define USE_NATIVE_ETHERNET true + #elif defined(ARDUINO_TEENSY40) + #define BOARD_TYPE "TEENSY 4.0" + #else + #define BOARD_TYPE "TEENSY 4.x" + #endif + #elif defined(__MK66FX1M0__) + #define BOARD_TYPE "Teensy 3.6" + #elif defined(__MK64FX512__) + #define BOARD_TYPE "Teensy 3.5" + #elif defined(__MKL26Z64__) + #define BOARD_TYPE "Teensy LC" + #elif defined(__MK20DX256__) + #define BOARD_TYPE "Teensy 3.2" // and Teensy 3.1 (obsolete) + #elif defined(__MK20DX128__) + #define BOARD_TYPE "Teensy 3.0" + #elif defined(__AVR_AT90USB1286__) + #error Teensy 2.0++ not supported yet + #elif defined(__AVR_ATmega32U4__) + #error Teensy 2.0 not supported yet + #else + // For Other Boards + #define BOARD_TYPE "Unknown Teensy Board" + #endif + +#elif defined(ESP8266_AT_USE_SAMD) + // For SAMD + #define EspSerial Serial1 + + #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(ADAFRUIT_FEATHER_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_FEATHER_M0_EXPRESS" + #elif defined(ADAFRUIT_METRO_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_METRO_M0_EXPRESS" + #elif defined(ADAFRUIT_CIRCUITPLAYGROUND_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_CIRCUITPLAYGROUND_M0" + #elif defined(ADAFRUIT_GEMMA_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_GEMMA_M0" + #elif defined(ADAFRUIT_TRINKET_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_TRINKET_M0" + #elif defined(ADAFRUIT_ITSYBITSY_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_ITSYBITSY_M0" + #elif defined(ARDUINO_SAMD_HALLOWING_M0) + #define BOARD_TYPE "SAMD21 ARDUINO_SAMD_HALLOWING_M0" + #elif defined(ADAFRUIT_METRO_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_EXPRESS" + #elif defined(ADAFRUIT_GRAND_CENTRAL_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_GRAND_CENTRAL_M4" + #elif defined(ADAFRUIT_FEATHER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_FEATHER_M4_EXPRESS" + #elif defined(ADAFRUIT_ITSYBITSY_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_ITSYBITSY_M4_EXPRESS" + #elif defined(ADAFRUIT_TRELLIS_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_TRELLIS_M4_EXPRESS" + #elif defined(ADAFRUIT_PYPORTAL) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL" + #elif defined(ADAFRUIT_PYPORTAL_M4_TITANO) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL_M4_TITANO" + #elif defined(ADAFRUIT_PYBADGE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_M4_EXPRESS" + #elif defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_AIRLIFT_LITE" + #elif defined(ADAFRUIT_PYGAMER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_M4_EXPRESS" + #elif defined(ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS" + #elif defined(ADAFRUIT_PYBADGE_AIRLIFT_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_AIRLIFT_M4" + #elif defined(ADAFRUIT_MONSTER_M4SK_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_MONSTER_M4SK_EXPRESS" + #elif defined(ADAFRUIT_HALLOWING_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_HALLOWING_M4_EXPRESS" + #elif defined(SEEED_WIO_TERMINAL) + #define BOARD_TYPE "SAMD SEEED_WIO_TERMINAL" + #elif defined(SEEED_FEMTO_M0) + #define BOARD_TYPE "SAMD SEEED_FEMTO_M0" + #elif defined(SEEED_XIAO_M0) + #define BOARD_TYPE "SAMD SEEED_XIAO_M0" + #elif defined(Wio_Lite_MG126) + #define BOARD_TYPE "SAMD SEEED Wio_Lite_MG126" + #elif defined(WIO_GPS_BOARD) + #define BOARD_TYPE "SAMD SEEED WIO_GPS_BOARD" + #elif defined(SEEEDUINO_ZERO) + #define BOARD_TYPE "SAMD SEEEDUINO_ZERO" + #elif defined(SEEEDUINO_LORAWAN) + #define BOARD_TYPE "SAMD SEEEDUINO_LORAWAN" + #elif defined(SEEED_GROVE_UI_WIRELESS) + #define BOARD_TYPE "SAMD SEEED_GROVE_UI_WIRELESS" + #elif defined(__SAMD21E18A__) + #define BOARD_TYPE "SAMD21E18A" + #elif defined(__SAMD21G18A__) + #define BOARD_TYPE "SAMD21G18A" + #elif defined(__SAMD51G19A__) + #define BOARD_TYPE "SAMD51G19A" + #elif defined(__SAMD51J19A__) + #define BOARD_TYPE "SAMD51J19A" + #elif defined(__SAMD51J20A__) + #define BOARD_TYPE "SAMD51J20A" + #elif defined(__SAM3X8E__) + #define BOARD_TYPE "SAM3X8E" + #elif defined(__CPU_ARC__) + #define BOARD_TYPE "CPU_ARC" + #elif defined(__SAMD51__) + #define BOARD_TYPE "SAMD51" + #else + #define BOARD_TYPE "SAMD Unknown" + #endif + +#elif (ESP8266_AT_USE_NRF528XX) + + #if defined(NRF52840_FEATHER) + #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" + #elif defined(NRF52832_FEATHER) + #define BOARD_TYPE "NRF52832_FEATHER" + #elif defined(NRF52840_FEATHER_SENSE) + #define BOARD_TYPE "NRF52840_FEATHER_SENSE" + #elif defined(NRF52840_ITSYBITSY) + #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" + #elif defined(NRF52840_CIRCUITPLAY) + #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" + #elif defined(NRF52840_CLUE) + #define BOARD_TYPE "NRF52840_CLUE" + #elif defined(NRF52840_METRO) + #define BOARD_TYPE "NRF52840_METRO_EXPRESS" + #elif defined(NRF52840_PCA10056) + #define BOARD_TYPE "NORDIC_NRF52840DK" + #elif defined(NINA_B302_ublox) + #define BOARD_TYPE "NINA_B302_ublox" + #elif defined(NINA_B112_ublox) + #define BOARD_TYPE "NINA_B112_ublox" + #elif defined(PARTICLE_XENON) + #define BOARD_TYPE "PARTICLE_XENON" + #elif defined(MDBT50Q_RX) + #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" + #elif defined(ARDUINO_NRF52_ADAFRUIT) + #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" + #else + #define BOARD_TYPE "nRF52 Unknown" + #endif + + #define EspSerial Serial1 + +#elif defined(ESP8266_AT_USE_SAM_DUE) + // For SAM DUE + #define EspSerial Serial1 + #define BOARD_TYPE "SAM DUE" + +#elif defined(ESP8266_AT_USE_STM32) + // For STM32 + #warning EspSerial using SERIAL_PORT_HARDWARE, can be Serial or Serial1. See your board variant.h + #define EspSerial SERIAL_PORT_HARDWARE //Serial1 + + #if defined(STM32F0) + #warning STM32F0 board selected + #define BOARD_TYPE "STM32F0" + #elif defined(STM32F1) + #warning STM32F1 board selected + #define BOARD_TYPE "STM32F1" + #elif defined(STM32F2) + #warning STM32F2 board selected + #define BOARD_TYPE "STM32F2" + #elif defined(STM32F3) + #warning STM32F3 board selected + #define BOARD_TYPE "STM32F3" + #elif defined(STM32F4) + #warning STM32F4 board selected + #define BOARD_TYPE "STM32F4" + #elif defined(STM32F7) + + #if defined(ARDUINO_NUCLEO_F767ZI) + #warning Nucleo-144 NUCLEO_F767ZI board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); + #else + + #warning STM32F7 board selected + #define BOARD_TYPE "STM32F7" + + #endif + + #elif defined(STM32L0) + #if defined(ARDUINO_NUCLEO_L053R8) + #warning Nucleo-64 NUCLEO_L053R8 board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); // (PA3, PA2); + #else + + #warning STM32L0 board selected + #define BOARD_TYPE "STM32L0" + + #endif + + #elif defined(STM32L1) + #warning STM32L1 board selected + #define BOARD_TYPE "STM32L1" + #elif defined(STM32L4) + #warning STM32L4 board selected + #define BOARD_TYPE "STM32L4" + #elif defined(STM32H7) + #warning STM32H7 board selected + #define BOARD_TYPE "STM32H7" + #elif defined(STM32G0) + #warning STM32G0 board selected + #define BOARD_TYPE "STM32G0" + #elif defined(STM32G4) + #warning STM32G4 board selected + #define BOARD_TYPE "STM32G4" + #elif defined(STM32WB) + #warning STM32WB board selected + #define BOARD_TYPE "STM32WB" + #elif defined(STM32MP1) + #warning STM32MP1 board selected + #define BOARD_TYPE "STM32MP1" + #else + #warning STM32 unknown board selected + #define BOARD_TYPE "STM32 Unknown" + + #endif + +#elif defined(BOARD_SIPEED_MAIX_DUINO) + + #warning SIPEED_MAIX_DUINO board selected + #define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" + + #define EspSerial Serial1 + +#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + + #warning RASPBERRY_PI_PICO board selected + + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_ARCH_MBED) + + #warning Using ARDUINO_ARCH_MBED + + #if ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + // Only undef known BOARD_NAME to use better one + #undef BOARD_NAME + #endif + + #if defined(ARDUINO_RASPBERRY_PI_PICO) + #define BOARD_NAME "MBED RASPBERRY_PI_PICO" + #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) + #define BOARD_NAME "MBED ADAFRUIT_FEATHER_RP2040" + #elif defined(ARDUINO_GENERIC_RP2040) + #define BOARD_NAME "MBED GENERIC_RP2040" + #elif defined(ARDUINO_NANO_RP2040_CONNECT) + #define BOARD_NAME "MBED NANO_RP2040_CONNECT" + #else + // Use default BOARD_NAME if exists + #if !defined(BOARD_NAME) + #define BOARD_NAME "MBED Unknown RP2040" + #endif + #endif + + #endif + + #if defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #warning WIZNET_WIZFI360_EVB_PICO + #define EspSerial Serial2 + #else + #define EspSerial Serial1 + #endif + +#elif (ESP_AT_USE_AVR) + + #if defined(ARDUINO_AVR_MEGA2560) + #define BOARD_TYPE "AVR Mega2560" + #elif defined(ARDUINO_AVR_MEGA) + #define BOARD_TYPE "AVR Mega" + #else + #define BOARD_TYPE "AVR ADK" + #endif + + // For Mega, use Serial1 or Serial3 + #define EspSerial Serial3 + +#else + #error Unknown or unsupported Board. Please check your Tools->Board setting. +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME BOARD_TYPE +#endif + +//////////////////////////////////////////// + +#define SSID "SSID" +#define PASSWORD "password" + + +#endif //defines_h diff --git a/examples/TCPServer/TCPServer.ino b/examples/TCPServer/TCPServer.ino index 12c6dda..81591a4 100644 --- a/examples/TCPServer/TCPServer.ino +++ b/examples/TCPServer/TCPServer.ino @@ -1,13 +1,13 @@ /**************************************************************************************************************************** TCPServer.ino - For ESP8266/ESP32-AT-command running shields + For WizFi360/ESP8266/ESP32-AT-command running shields - ESP_AT_Lib is a wrapper library for the ESP8266/ESP32 AT-command shields + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib Licensed under MIT license - + @example TCPServer.ino @brief The TCPServer demo of library WeeESP8266. @author Wu Pengfei @@ -28,267 +28,20 @@ THE SOFTWARE. *****************************************************************************************************************************/ -/* Comment this out to disable prints and save space */ -#define ESP_AT_DEBUG_OUTPUT Serial - -#define _ESP_AT_LOGLEVEL_ 4 - -// Uncomment to use ESP32-AT commands -//#define USE_ESP32_AT true - -#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ - defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ - defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ - defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) ) -#if defined(ESP_AT_USE_NRF528XX) - #undef ESP_AT_USE_NRF528XX -#endif -#define ESP_AT_USE_NRF528XX true -#endif - -#if ( 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(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) || defined(__SAMD51G19A__) ) -#if defined(ESP_AT_USE_SAMD) - #undef ESP_AT_USE_SAMD -#endif -#define ESP_AT_USE_SAMD true -#endif - -#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) - #if defined(ESP_AT_USE_AVR) - #undef ESP_AT_USE_AVR - #endif - #define ESP_AT_USE_AVR true -#endif - -#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) - #if defined(ESP_AT_USE_SAM_DUE) - #undef ESP_AT_USE_SAM_DUE - #endif - #define ESP_AT_USE_SAM_DUE true -#endif - -#if ( defined(CORE_TEENSY) && !( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) ) - #if defined(ESP_AT_USE_TEENSY) - #undef ESP_AT_USE_TEENSY - #endif - #define ESP_AT_USE_TEENSY true -#endif - -#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) ) - #if defined(ESP_AT_USE_STM32) - #undef ESP_AT_USE_STM32 - #endif - #define ESP_AT_USE_STM32 true -#endif - -#if (ESP_AT_USE_NRF528XX) - -#if defined(NRF52840_FEATHER) - #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" -#elif defined(NRF52832_FEATHER) - #define BOARD_TYPE "NRF52832_FEATHER" -#elif defined(NRF52840_FEATHER_SENSE) - #define BOARD_TYPE "NRF52840_FEATHER_SENSE" -#elif defined(NRF52840_ITSYBITSY) - #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" -#elif defined(NRF52840_CIRCUITPLAY) - #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" -#elif defined(NRF52840_CLUE) - #define BOARD_TYPE "NRF52840_CLUE" -#elif defined(NRF52840_METRO) - #define BOARD_TYPE "NRF52840_METRO_EXPRESS" -#elif defined(NRF52840_PCA10056) - #define BOARD_TYPE "NORDIC_NRF52840DK" -#elif defined(NINA_B302_ublox) - #define BOARD_TYPE "NINA_B302_ublox" -#elif defined(NINA_B112_ublox) - #define BOARD_TYPE "NINA_B112_ublox" -#elif defined(PARTICLE_XENON) - #define BOARD_TYPE "PARTICLE_XENON" -#elif defined(MDBT50Q_RX) - #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" -#elif defined(ARDUINO_NRF52_ADAFRUIT) - #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" -#else - #define BOARD_TYPE "nRF52 Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_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(__SAMD21G18A__) - #define BOARD_TYPE "SAMD21G18A" -#elif defined(__SAMD51G19A__) - #define BOARD_TYPE "SAMD51G19" -#elif defined(__SAMD51J19A__) - #define BOARD_TYPE "SAMD51J19A" -#elif defined(__SAMD51J20A__) - #define BOARD_TYPE "SAMD51J20A" -#elif defined(__SAMD51__) - #define BOARD_TYPE "SAMD51" -#else - #define BOARD_TYPE "SAMD Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_USE_SAM_DUE) -#if ( defined(ARDUINO_SAM_DUE) || (__SAM3X8E__) ) - #define BOARD_TYPE "SAM DUE" -#else - #define BOARD_TYPE "SAM Unknown" -#endif - -#define EspSerial Serial1 - -#elif ( defined(CORE_TEENSY) ) -// For Teensy 4.0 -#if defined(__IMXRT1062__) - // For Teensy 4.1/4.0 - #if defined(ARDUINO_TEENSY41) - #define BOARD_TYPE "TEENSY 4.1" - // Use true for NativeEthernet Library, false if using other Ethernet libraries - #define USE_NATIVE_ETHERNET true - #elif defined(ARDUINO_TEENSY40) - #define BOARD_TYPE "TEENSY 4.0" - #else - #define BOARD_TYPE "TEENSY 4.x" - #endif -#elif defined(__MK66FX1M0__) - #define BOARD_TYPE "Teensy 3.6" -#elif defined(__MK64FX512__) - #define BOARD_TYPE "Teensy 3.5" -#elif defined(__MK20DX256__) - #define BOARD_TYPE "Teensy 3.2/3.1" -#elif defined(__MK20DX128__) - #define BOARD_TYPE "Teensy 3.0" -#elif ( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) - #error "Teensy LC, 2.0++ and 2.0 not supported" -#else - #define BOARD_TYPE "Teensy Unknown" -#endif - -#define EspSerial Serial1 - -#elif ESP_AT_USE_STM32 - -#if defined(STM32F0) - #define BOARD_TYPE "STM32F0" - #error Board STM32F0 not supported -#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 - -// For STM32, you have to declare and enable coreresponding Serial Port somewhere else before using it -#define EspSerial Serial1 - -#elif defined(BOARD_SIPEED_MAIX_DUINO) - -#warning SIPEED_MAIX_DUINO board selected -#define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" - -#define EspSerial Serial1 - -#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ - defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) - -#warning RASPBERRY_PI_PICO board selected - -#if defined(ARDUINO_ARCH_MBED) - - #if defined(BOARD_NAME) - #undef BOARD_NAME - #endif - - #if defined(ARDUINO_RASPBERRY_PI_PICO) - #define BOARD_TYPE "MBED RASPBERRY_PI_PICO" - #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) - #define BOARD_TYPE "MBED DAFRUIT_FEATHER_RP2040" - #elif defined(ARDUINO_GENERIC_RP2040) - #define BOARD_TYPE "MBED GENERIC_RP2040" - #elif defined(ARDUINO_NANO_RP2040_CONNECT) - #define BOARD_NAME "MBED NANO_RP2040_CONNECT" - #else - #define BOARD_TYPE "MBED Unknown RP2040" - #endif -#else - #define BOARD_TYPE "RASPBERRY_PI_PICO" -#endif - -#define EspSerial Serial1 - -#elif (ESP_AT_USE_AVR) - -#if defined(ARDUINO_AVR_MEGA2560) - #define BOARD_TYPE "AVR Mega2560" -#elif defined(ARDUINO_AVR_MEGA) - #define BOARD_TYPE "AVR Mega" -#else - #define BOARD_TYPE "AVR ADK" -#endif - -// For Mega, use Serial1 or Serial3 -#define EspSerial Serial3 - -#else -#error Unknown or unsupported Board. Please check your Tools->Board setting. - -#endif //ESP_AT_USE_NRF528XX - -#ifndef BOARD_NAME - #define BOARD_NAME BOARD_TYPE -#endif +#include "defines.h" #include "ESP_AT_Lib.h" -#define SSID "SSID" -#define PASSWORD "password" - ESP8266 wifi(&EspSerial); // Your board <-> ESP_AT baud rate: #define ESP_AT_BAUD 115200 -void setup(void) +void setup() { Serial.begin(115200); - while (!Serial); + while (!Serial && millis() < 5000); delay(1000); @@ -354,7 +107,7 @@ void setup(void) Serial.println("Done"); } -void loop(void) +void loop() { uint8_t buffer[128] = {0}; uint8_t mux_id; diff --git a/examples/TCPServer/defines.h b/examples/TCPServer/defines.h new file mode 100644 index 0000000..5e4d828 --- /dev/null +++ b/examples/TCPServer/defines.h @@ -0,0 +1,420 @@ +/**************************************************************************************************************************** + defines.h + For WizFi360/ESP8266/ESP32-AT-command running shields + + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields + + Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases + Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib + Licensed under MIT license + *****************************************************************************************************************************/ + +#ifndef defines_h +#define defines_h + +//#define HTTP_UPLOAD_BUFLEN 4096 + +#define DEBUG_ESP8266_AT_WEBSERVER_PORT Serial + +// Debug Level from 0 to 4 +#define _ESP_AT_LIB_LOGLEVEL_ 1 + +#define USING_WIZFI360 true + +#if (USING_WIZFI360) || defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #define USE_ESP32_AT true +#else + // Uncomment to use ESP32-AT commands + //#define USE_ESP32_AT true +#endif + +#if USE_ESP32_AT + #warning Using ESP32-AT WiFi and ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP32-AT & ESP8266_AT_WebServer Library" +#else + #warning Using ESP8266-AT WiFi with ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP8266-AT & ESP8266_AT_WebServer Library" +#endif + +#if ( 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(__SAMD21E18A__) || defined(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) \ + || defined(__SAMD51G19A__) || defined(__SAMD51P19A__) || defined(__SAMD21G18A__) ) + + #define MULTIPLY_FACTOR 2 + + #if defined(ESP8266_AT_USE_SAMD) + #undef ESP8266_AT_USE_SAMD + #endif + #define ESP8266_AT_USE_SAMD true + +#endif + +#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ + defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ + defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ + defined(NRF52840_LED_GLASSES) || defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) || \ + defined(ARDUINO_Seeed_XIAO_nRF52840) || defined(ARDUINO_Seeed_XIAO_nRF52840_Sense) || \ + defined(ARDUINO_SEEED_XIAO_NRF52840) || defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) ) + + #define MULTIPLY_FACTOR 4 + + #if defined(ESP8266_AT_USE_NRF528XX) + #undef ESP8266_AT_USE_NRF528XX + #endif + #define ESP8266_AT_USE_NRF528XX true + +#endif + +#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) + #if defined(ESP8266_AT_USE_SAM_DUE) + #undef ESP8266_AT_USE_SAM_DUE + #endif + #define ESP8266_AT_USE_SAM_DUE true +#endif + +#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) || \ + defined(STM32L0) || defined(STM32L1) || defined(STM32L4) || defined(STM32H7) ||defined(STM32G0) || defined(STM32G4) || \ + defined(STM32WB) || defined(STM32MP1) ) + #if defined(ESP8266_AT_USE_STM32) + #undef ESP8266_AT_USE_STM32 + #endif + #define ESP8266_AT_USE_STM32 true +#endif + +#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) + #if defined(ESP_AT_USE_AVR) + #undef ESP_AT_USE_AVR + #endif + #define ESP_AT_USE_AVR true +#endif + +#ifdef CORE_TEENSY + // For Teensy 4.1/4.0 + //#define EspSerial Serial1 //Serial1, Pin RX1 : 0, TX1 : 1 + #define EspSerial Serial2 //Serial2, Pin RX2 : 7, TX2 : 8 + //#define EspSerial Serial3 //Serial3, Pin RX3 : 15, TX3 : 14 + //#define EspSerial Serial4 //Serial4, Pin RX4 : 16, TX4 : 17 + + #if defined(__IMXRT1062__) + // For Teensy 4.1/4.0 + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_TEENSY41) + #define BOARD_TYPE "TEENSY 4.1" + // Use true for NativeEthernet Library, false if using other Ethernet libraries + #define USE_NATIVE_ETHERNET true + #elif defined(ARDUINO_TEENSY40) + #define BOARD_TYPE "TEENSY 4.0" + #else + #define BOARD_TYPE "TEENSY 4.x" + #endif + #elif defined(__MK66FX1M0__) + #define BOARD_TYPE "Teensy 3.6" + #elif defined(__MK64FX512__) + #define BOARD_TYPE "Teensy 3.5" + #elif defined(__MKL26Z64__) + #define BOARD_TYPE "Teensy LC" + #elif defined(__MK20DX256__) + #define BOARD_TYPE "Teensy 3.2" // and Teensy 3.1 (obsolete) + #elif defined(__MK20DX128__) + #define BOARD_TYPE "Teensy 3.0" + #elif defined(__AVR_AT90USB1286__) + #error Teensy 2.0++ not supported yet + #elif defined(__AVR_ATmega32U4__) + #error Teensy 2.0 not supported yet + #else + // For Other Boards + #define BOARD_TYPE "Unknown Teensy Board" + #endif + +#elif defined(ESP8266_AT_USE_SAMD) + // For SAMD + #define EspSerial Serial1 + + #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(ADAFRUIT_FEATHER_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_FEATHER_M0_EXPRESS" + #elif defined(ADAFRUIT_METRO_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_METRO_M0_EXPRESS" + #elif defined(ADAFRUIT_CIRCUITPLAYGROUND_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_CIRCUITPLAYGROUND_M0" + #elif defined(ADAFRUIT_GEMMA_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_GEMMA_M0" + #elif defined(ADAFRUIT_TRINKET_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_TRINKET_M0" + #elif defined(ADAFRUIT_ITSYBITSY_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_ITSYBITSY_M0" + #elif defined(ARDUINO_SAMD_HALLOWING_M0) + #define BOARD_TYPE "SAMD21 ARDUINO_SAMD_HALLOWING_M0" + #elif defined(ADAFRUIT_METRO_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_EXPRESS" + #elif defined(ADAFRUIT_GRAND_CENTRAL_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_GRAND_CENTRAL_M4" + #elif defined(ADAFRUIT_FEATHER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_FEATHER_M4_EXPRESS" + #elif defined(ADAFRUIT_ITSYBITSY_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_ITSYBITSY_M4_EXPRESS" + #elif defined(ADAFRUIT_TRELLIS_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_TRELLIS_M4_EXPRESS" + #elif defined(ADAFRUIT_PYPORTAL) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL" + #elif defined(ADAFRUIT_PYPORTAL_M4_TITANO) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL_M4_TITANO" + #elif defined(ADAFRUIT_PYBADGE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_M4_EXPRESS" + #elif defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_AIRLIFT_LITE" + #elif defined(ADAFRUIT_PYGAMER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_M4_EXPRESS" + #elif defined(ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS" + #elif defined(ADAFRUIT_PYBADGE_AIRLIFT_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_AIRLIFT_M4" + #elif defined(ADAFRUIT_MONSTER_M4SK_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_MONSTER_M4SK_EXPRESS" + #elif defined(ADAFRUIT_HALLOWING_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_HALLOWING_M4_EXPRESS" + #elif defined(SEEED_WIO_TERMINAL) + #define BOARD_TYPE "SAMD SEEED_WIO_TERMINAL" + #elif defined(SEEED_FEMTO_M0) + #define BOARD_TYPE "SAMD SEEED_FEMTO_M0" + #elif defined(SEEED_XIAO_M0) + #define BOARD_TYPE "SAMD SEEED_XIAO_M0" + #elif defined(Wio_Lite_MG126) + #define BOARD_TYPE "SAMD SEEED Wio_Lite_MG126" + #elif defined(WIO_GPS_BOARD) + #define BOARD_TYPE "SAMD SEEED WIO_GPS_BOARD" + #elif defined(SEEEDUINO_ZERO) + #define BOARD_TYPE "SAMD SEEEDUINO_ZERO" + #elif defined(SEEEDUINO_LORAWAN) + #define BOARD_TYPE "SAMD SEEEDUINO_LORAWAN" + #elif defined(SEEED_GROVE_UI_WIRELESS) + #define BOARD_TYPE "SAMD SEEED_GROVE_UI_WIRELESS" + #elif defined(__SAMD21E18A__) + #define BOARD_TYPE "SAMD21E18A" + #elif defined(__SAMD21G18A__) + #define BOARD_TYPE "SAMD21G18A" + #elif defined(__SAMD51G19A__) + #define BOARD_TYPE "SAMD51G19A" + #elif defined(__SAMD51J19A__) + #define BOARD_TYPE "SAMD51J19A" + #elif defined(__SAMD51J20A__) + #define BOARD_TYPE "SAMD51J20A" + #elif defined(__SAM3X8E__) + #define BOARD_TYPE "SAM3X8E" + #elif defined(__CPU_ARC__) + #define BOARD_TYPE "CPU_ARC" + #elif defined(__SAMD51__) + #define BOARD_TYPE "SAMD51" + #else + #define BOARD_TYPE "SAMD Unknown" + #endif + +#elif (ESP8266_AT_USE_NRF528XX) + + #if defined(NRF52840_FEATHER) + #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" + #elif defined(NRF52832_FEATHER) + #define BOARD_TYPE "NRF52832_FEATHER" + #elif defined(NRF52840_FEATHER_SENSE) + #define BOARD_TYPE "NRF52840_FEATHER_SENSE" + #elif defined(NRF52840_ITSYBITSY) + #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" + #elif defined(NRF52840_CIRCUITPLAY) + #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" + #elif defined(NRF52840_CLUE) + #define BOARD_TYPE "NRF52840_CLUE" + #elif defined(NRF52840_METRO) + #define BOARD_TYPE "NRF52840_METRO_EXPRESS" + #elif defined(NRF52840_PCA10056) + #define BOARD_TYPE "NORDIC_NRF52840DK" + #elif defined(NINA_B302_ublox) + #define BOARD_TYPE "NINA_B302_ublox" + #elif defined(NINA_B112_ublox) + #define BOARD_TYPE "NINA_B112_ublox" + #elif defined(PARTICLE_XENON) + #define BOARD_TYPE "PARTICLE_XENON" + #elif defined(MDBT50Q_RX) + #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" + #elif defined(ARDUINO_NRF52_ADAFRUIT) + #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" + #else + #define BOARD_TYPE "nRF52 Unknown" + #endif + + #define EspSerial Serial1 + +#elif defined(ESP8266_AT_USE_SAM_DUE) + // For SAM DUE + #define EspSerial Serial1 + #define BOARD_TYPE "SAM DUE" + +#elif defined(ESP8266_AT_USE_STM32) + // For STM32 + #warning EspSerial using SERIAL_PORT_HARDWARE, can be Serial or Serial1. See your board variant.h + #define EspSerial SERIAL_PORT_HARDWARE //Serial1 + + #if defined(STM32F0) + #warning STM32F0 board selected + #define BOARD_TYPE "STM32F0" + #elif defined(STM32F1) + #warning STM32F1 board selected + #define BOARD_TYPE "STM32F1" + #elif defined(STM32F2) + #warning STM32F2 board selected + #define BOARD_TYPE "STM32F2" + #elif defined(STM32F3) + #warning STM32F3 board selected + #define BOARD_TYPE "STM32F3" + #elif defined(STM32F4) + #warning STM32F4 board selected + #define BOARD_TYPE "STM32F4" + #elif defined(STM32F7) + + #if defined(ARDUINO_NUCLEO_F767ZI) + #warning Nucleo-144 NUCLEO_F767ZI board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); + #else + + #warning STM32F7 board selected + #define BOARD_TYPE "STM32F7" + + #endif + + #elif defined(STM32L0) + #if defined(ARDUINO_NUCLEO_L053R8) + #warning Nucleo-64 NUCLEO_L053R8 board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); // (PA3, PA2); + #else + + #warning STM32L0 board selected + #define BOARD_TYPE "STM32L0" + + #endif + + #elif defined(STM32L1) + #warning STM32L1 board selected + #define BOARD_TYPE "STM32L1" + #elif defined(STM32L4) + #warning STM32L4 board selected + #define BOARD_TYPE "STM32L4" + #elif defined(STM32H7) + #warning STM32H7 board selected + #define BOARD_TYPE "STM32H7" + #elif defined(STM32G0) + #warning STM32G0 board selected + #define BOARD_TYPE "STM32G0" + #elif defined(STM32G4) + #warning STM32G4 board selected + #define BOARD_TYPE "STM32G4" + #elif defined(STM32WB) + #warning STM32WB board selected + #define BOARD_TYPE "STM32WB" + #elif defined(STM32MP1) + #warning STM32MP1 board selected + #define BOARD_TYPE "STM32MP1" + #else + #warning STM32 unknown board selected + #define BOARD_TYPE "STM32 Unknown" + + #endif + +#elif defined(BOARD_SIPEED_MAIX_DUINO) + + #warning SIPEED_MAIX_DUINO board selected + #define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" + + #define EspSerial Serial1 + +#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + + #warning RASPBERRY_PI_PICO board selected + + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_ARCH_MBED) + + #warning Using ARDUINO_ARCH_MBED + + #if ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + // Only undef known BOARD_NAME to use better one + #undef BOARD_NAME + #endif + + #if defined(ARDUINO_RASPBERRY_PI_PICO) + #define BOARD_NAME "MBED RASPBERRY_PI_PICO" + #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) + #define BOARD_NAME "MBED ADAFRUIT_FEATHER_RP2040" + #elif defined(ARDUINO_GENERIC_RP2040) + #define BOARD_NAME "MBED GENERIC_RP2040" + #elif defined(ARDUINO_NANO_RP2040_CONNECT) + #define BOARD_NAME "MBED NANO_RP2040_CONNECT" + #else + // Use default BOARD_NAME if exists + #if !defined(BOARD_NAME) + #define BOARD_NAME "MBED Unknown RP2040" + #endif + #endif + + #endif + + #if defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #warning WIZNET_WIZFI360_EVB_PICO + #define EspSerial Serial2 + #else + #define EspSerial Serial1 + #endif + +#elif (ESP_AT_USE_AVR) + + #if defined(ARDUINO_AVR_MEGA2560) + #define BOARD_TYPE "AVR Mega2560" + #elif defined(ARDUINO_AVR_MEGA) + #define BOARD_TYPE "AVR Mega" + #else + #define BOARD_TYPE "AVR ADK" + #endif + + // For Mega, use Serial1 or Serial3 + #define EspSerial Serial3 + +#else + #error Unknown or unsupported Board. Please check your Tools->Board setting. +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME BOARD_TYPE +#endif + +//////////////////////////////////////////// + +#define SSID "SSID" +#define PASSWORD "password" + + +#endif //defines_h diff --git a/examples/UDPClientMultiple/UDPClientMultiple.ino b/examples/UDPClientMultiple/UDPClientMultiple.ino index e9956e1..a60959d 100644 --- a/examples/UDPClientMultiple/UDPClientMultiple.ino +++ b/examples/UDPClientMultiple/UDPClientMultiple.ino @@ -1,8 +1,8 @@ /**************************************************************************************************************************** UDPClientMultiple.ino - For ESP8266/ESP32-AT-command running shields + For WizFi360/ESP8266/ESP32-AT-command running shields - ESP_AT_Lib is a wrapper library for the ESP8266/ESP32 AT-command shields + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib @@ -28,257 +28,10 @@ THE SOFTWARE. *****************************************************************************************************************************/ -/* Comment this out to disable prints and save space */ -#define ESP_AT_DEBUG_OUTPUT Serial - -#define _ESP_AT_LOGLEVEL_ 4 - -// Uncomment to use ESP32-AT commands -//#define USE_ESP32_AT true - -#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ - defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ - defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ - defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) ) -#if defined(ESP_AT_USE_NRF528XX) - #undef ESP_AT_USE_NRF528XX -#endif -#define ESP_AT_USE_NRF528XX true -#endif - -#if ( 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(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) || defined(__SAMD51G19A__) ) -#if defined(ESP_AT_USE_SAMD) - #undef ESP_AT_USE_SAMD -#endif -#define ESP_AT_USE_SAMD true -#endif - -#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) - #if defined(ESP_AT_USE_AVR) - #undef ESP_AT_USE_AVR - #endif - #define ESP_AT_USE_AVR true -#endif - -#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) - #if defined(ESP_AT_USE_SAM_DUE) - #undef ESP_AT_USE_SAM_DUE - #endif - #define ESP_AT_USE_SAM_DUE true -#endif - -#if ( defined(CORE_TEENSY) && !( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) ) - #if defined(ESP_AT_USE_TEENSY) - #undef ESP_AT_USE_TEENSY - #endif - #define ESP_AT_USE_TEENSY true -#endif - -#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) ) - #if defined(ESP_AT_USE_STM32) - #undef ESP_AT_USE_STM32 - #endif - #define ESP_AT_USE_STM32 true -#endif - -#if (ESP_AT_USE_NRF528XX) - -#if defined(NRF52840_FEATHER) - #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" -#elif defined(NRF52832_FEATHER) - #define BOARD_TYPE "NRF52832_FEATHER" -#elif defined(NRF52840_FEATHER_SENSE) - #define BOARD_TYPE "NRF52840_FEATHER_SENSE" -#elif defined(NRF52840_ITSYBITSY) - #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" -#elif defined(NRF52840_CIRCUITPLAY) - #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" -#elif defined(NRF52840_CLUE) - #define BOARD_TYPE "NRF52840_CLUE" -#elif defined(NRF52840_METRO) - #define BOARD_TYPE "NRF52840_METRO_EXPRESS" -#elif defined(NRF52840_PCA10056) - #define BOARD_TYPE "NORDIC_NRF52840DK" -#elif defined(NINA_B302_ublox) - #define BOARD_TYPE "NINA_B302_ublox" -#elif defined(NINA_B112_ublox) - #define BOARD_TYPE "NINA_B112_ublox" -#elif defined(PARTICLE_XENON) - #define BOARD_TYPE "PARTICLE_XENON" -#elif defined(MDBT50Q_RX) - #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" -#elif defined(ARDUINO_NRF52_ADAFRUIT) - #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" -#else - #define BOARD_TYPE "nRF52 Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_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(__SAMD21G18A__) - #define BOARD_TYPE "SAMD21G18A" -#elif defined(__SAMD51G19A__) - #define BOARD_TYPE "SAMD51G19" -#elif defined(__SAMD51J19A__) - #define BOARD_TYPE "SAMD51J19A" -#elif defined(__SAMD51J20A__) - #define BOARD_TYPE "SAMD51J20A" -#elif defined(__SAMD51__) - #define BOARD_TYPE "SAMD51" -#else - #define BOARD_TYPE "SAMD Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_USE_SAM_DUE) -#if ( defined(ARDUINO_SAM_DUE) || (__SAM3X8E__) ) - #define BOARD_TYPE "SAM DUE" -#else - #define BOARD_TYPE "SAM Unknown" -#endif - -#define EspSerial Serial1 - -#elif ( defined(CORE_TEENSY) ) -// For Teensy 4.0 -#if defined(__IMXRT1062__) - // For Teensy 4.1/4.0 - #if defined(ARDUINO_TEENSY41) - #define BOARD_TYPE "TEENSY 4.1" - // Use true for NativeEthernet Library, false if using other Ethernet libraries - #define USE_NATIVE_ETHERNET true - #elif defined(ARDUINO_TEENSY40) - #define BOARD_TYPE "TEENSY 4.0" - #else - #define BOARD_TYPE "TEENSY 4.x" - #endif -#elif defined(__MK66FX1M0__) - #define BOARD_TYPE "Teensy 3.6" -#elif defined(__MK64FX512__) - #define BOARD_TYPE "Teensy 3.5" -#elif defined(__MK20DX256__) - #define BOARD_TYPE "Teensy 3.2/3.1" -#elif defined(__MK20DX128__) - #define BOARD_TYPE "Teensy 3.0" -#elif ( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) - #error "Teensy LC, 2.0++ and 2.0 not supported" -#else - #define BOARD_TYPE "Teensy Unknown" -#endif - -#define EspSerial Serial1 - -#elif ESP_AT_USE_STM32 - -#if defined(STM32F0) - #define BOARD_TYPE "STM32F0" - #error Board STM32F0 not supported -#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 - -// For STM32, you have to declare and enable coreresponding Serial Port somewhere else before using it -#define EspSerial Serial1 - -#elif defined(BOARD_SIPEED_MAIX_DUINO) - -#warning SIPEED_MAIX_DUINO board selected -#define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" - -#define EspSerial Serial1 - -#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ - defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) - -#warning RASPBERRY_PI_PICO board selected - -#if defined(ARDUINO_ARCH_MBED) - - #if defined(BOARD_NAME) - #undef BOARD_NAME - #endif - - #if defined(ARDUINO_RASPBERRY_PI_PICO) - #define BOARD_TYPE "MBED RASPBERRY_PI_PICO" - #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) - #define BOARD_TYPE "MBED DAFRUIT_FEATHER_RP2040" - #elif defined(ARDUINO_GENERIC_RP2040) - #define BOARD_TYPE "MBED GENERIC_RP2040" - #elif defined(ARDUINO_NANO_RP2040_CONNECT) - #define BOARD_NAME "MBED NANO_RP2040_CONNECT" - #else - #define BOARD_TYPE "MBED Unknown RP2040" - #endif -#else - #define BOARD_TYPE "RASPBERRY_PI_PICO" -#endif - -#define EspSerial Serial1 - -#elif (ESP_AT_USE_AVR) - -#if defined(ARDUINO_AVR_MEGA2560) - #define BOARD_TYPE "AVR Mega2560" -#elif defined(ARDUINO_AVR_MEGA) - #define BOARD_TYPE "AVR Mega" -#else - #define BOARD_TYPE "AVR ADK" -#endif - -// For Mega, use Serial1 or Serial3 -#define EspSerial Serial3 - -#else -#error Unknown or unsupported Board. Please check your Tools->Board setting. - -#endif //ESP_AT_USE_NRF528XX - -#ifndef BOARD_NAME - #define BOARD_NAME BOARD_TYPE -#endif +#include "defines.h" #include "ESP_AT_Lib.h" -#define SSID "SSID" -#define PASSWORD "password" - //#define HOST_NAME "www.yahoo.com" #define HOST_NAME "192.168.2.30" #define HOST_PORT (5416) @@ -288,11 +41,11 @@ ESP8266 wifi(&EspSerial); // Your board <-> ESP_AT baud rate: #define ESP_AT_BAUD 115200 -void setup(void) +void setup() { Serial.begin(115200); - while (!Serial); + while (!Serial && millis() < 5000); #if defined(BOARD_NAME) Serial.println("\nStart UDPClientMultiple on " + String(BOARD_NAME)); @@ -338,7 +91,7 @@ void setup(void) Serial.println("Done"); } -void loop(void) +void loop() { uint8_t buffer[128] = {0}; static uint8_t mux_id = 0; diff --git a/examples/UDPClientMultiple/defines.h b/examples/UDPClientMultiple/defines.h new file mode 100644 index 0000000..5e4d828 --- /dev/null +++ b/examples/UDPClientMultiple/defines.h @@ -0,0 +1,420 @@ +/**************************************************************************************************************************** + defines.h + For WizFi360/ESP8266/ESP32-AT-command running shields + + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields + + Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases + Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib + Licensed under MIT license + *****************************************************************************************************************************/ + +#ifndef defines_h +#define defines_h + +//#define HTTP_UPLOAD_BUFLEN 4096 + +#define DEBUG_ESP8266_AT_WEBSERVER_PORT Serial + +// Debug Level from 0 to 4 +#define _ESP_AT_LIB_LOGLEVEL_ 1 + +#define USING_WIZFI360 true + +#if (USING_WIZFI360) || defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #define USE_ESP32_AT true +#else + // Uncomment to use ESP32-AT commands + //#define USE_ESP32_AT true +#endif + +#if USE_ESP32_AT + #warning Using ESP32-AT WiFi and ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP32-AT & ESP8266_AT_WebServer Library" +#else + #warning Using ESP8266-AT WiFi with ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP8266-AT & ESP8266_AT_WebServer Library" +#endif + +#if ( 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(__SAMD21E18A__) || defined(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) \ + || defined(__SAMD51G19A__) || defined(__SAMD51P19A__) || defined(__SAMD21G18A__) ) + + #define MULTIPLY_FACTOR 2 + + #if defined(ESP8266_AT_USE_SAMD) + #undef ESP8266_AT_USE_SAMD + #endif + #define ESP8266_AT_USE_SAMD true + +#endif + +#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ + defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ + defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ + defined(NRF52840_LED_GLASSES) || defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) || \ + defined(ARDUINO_Seeed_XIAO_nRF52840) || defined(ARDUINO_Seeed_XIAO_nRF52840_Sense) || \ + defined(ARDUINO_SEEED_XIAO_NRF52840) || defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) ) + + #define MULTIPLY_FACTOR 4 + + #if defined(ESP8266_AT_USE_NRF528XX) + #undef ESP8266_AT_USE_NRF528XX + #endif + #define ESP8266_AT_USE_NRF528XX true + +#endif + +#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) + #if defined(ESP8266_AT_USE_SAM_DUE) + #undef ESP8266_AT_USE_SAM_DUE + #endif + #define ESP8266_AT_USE_SAM_DUE true +#endif + +#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) || \ + defined(STM32L0) || defined(STM32L1) || defined(STM32L4) || defined(STM32H7) ||defined(STM32G0) || defined(STM32G4) || \ + defined(STM32WB) || defined(STM32MP1) ) + #if defined(ESP8266_AT_USE_STM32) + #undef ESP8266_AT_USE_STM32 + #endif + #define ESP8266_AT_USE_STM32 true +#endif + +#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) + #if defined(ESP_AT_USE_AVR) + #undef ESP_AT_USE_AVR + #endif + #define ESP_AT_USE_AVR true +#endif + +#ifdef CORE_TEENSY + // For Teensy 4.1/4.0 + //#define EspSerial Serial1 //Serial1, Pin RX1 : 0, TX1 : 1 + #define EspSerial Serial2 //Serial2, Pin RX2 : 7, TX2 : 8 + //#define EspSerial Serial3 //Serial3, Pin RX3 : 15, TX3 : 14 + //#define EspSerial Serial4 //Serial4, Pin RX4 : 16, TX4 : 17 + + #if defined(__IMXRT1062__) + // For Teensy 4.1/4.0 + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_TEENSY41) + #define BOARD_TYPE "TEENSY 4.1" + // Use true for NativeEthernet Library, false if using other Ethernet libraries + #define USE_NATIVE_ETHERNET true + #elif defined(ARDUINO_TEENSY40) + #define BOARD_TYPE "TEENSY 4.0" + #else + #define BOARD_TYPE "TEENSY 4.x" + #endif + #elif defined(__MK66FX1M0__) + #define BOARD_TYPE "Teensy 3.6" + #elif defined(__MK64FX512__) + #define BOARD_TYPE "Teensy 3.5" + #elif defined(__MKL26Z64__) + #define BOARD_TYPE "Teensy LC" + #elif defined(__MK20DX256__) + #define BOARD_TYPE "Teensy 3.2" // and Teensy 3.1 (obsolete) + #elif defined(__MK20DX128__) + #define BOARD_TYPE "Teensy 3.0" + #elif defined(__AVR_AT90USB1286__) + #error Teensy 2.0++ not supported yet + #elif defined(__AVR_ATmega32U4__) + #error Teensy 2.0 not supported yet + #else + // For Other Boards + #define BOARD_TYPE "Unknown Teensy Board" + #endif + +#elif defined(ESP8266_AT_USE_SAMD) + // For SAMD + #define EspSerial Serial1 + + #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(ADAFRUIT_FEATHER_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_FEATHER_M0_EXPRESS" + #elif defined(ADAFRUIT_METRO_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_METRO_M0_EXPRESS" + #elif defined(ADAFRUIT_CIRCUITPLAYGROUND_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_CIRCUITPLAYGROUND_M0" + #elif defined(ADAFRUIT_GEMMA_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_GEMMA_M0" + #elif defined(ADAFRUIT_TRINKET_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_TRINKET_M0" + #elif defined(ADAFRUIT_ITSYBITSY_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_ITSYBITSY_M0" + #elif defined(ARDUINO_SAMD_HALLOWING_M0) + #define BOARD_TYPE "SAMD21 ARDUINO_SAMD_HALLOWING_M0" + #elif defined(ADAFRUIT_METRO_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_EXPRESS" + #elif defined(ADAFRUIT_GRAND_CENTRAL_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_GRAND_CENTRAL_M4" + #elif defined(ADAFRUIT_FEATHER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_FEATHER_M4_EXPRESS" + #elif defined(ADAFRUIT_ITSYBITSY_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_ITSYBITSY_M4_EXPRESS" + #elif defined(ADAFRUIT_TRELLIS_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_TRELLIS_M4_EXPRESS" + #elif defined(ADAFRUIT_PYPORTAL) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL" + #elif defined(ADAFRUIT_PYPORTAL_M4_TITANO) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL_M4_TITANO" + #elif defined(ADAFRUIT_PYBADGE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_M4_EXPRESS" + #elif defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_AIRLIFT_LITE" + #elif defined(ADAFRUIT_PYGAMER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_M4_EXPRESS" + #elif defined(ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS" + #elif defined(ADAFRUIT_PYBADGE_AIRLIFT_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_AIRLIFT_M4" + #elif defined(ADAFRUIT_MONSTER_M4SK_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_MONSTER_M4SK_EXPRESS" + #elif defined(ADAFRUIT_HALLOWING_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_HALLOWING_M4_EXPRESS" + #elif defined(SEEED_WIO_TERMINAL) + #define BOARD_TYPE "SAMD SEEED_WIO_TERMINAL" + #elif defined(SEEED_FEMTO_M0) + #define BOARD_TYPE "SAMD SEEED_FEMTO_M0" + #elif defined(SEEED_XIAO_M0) + #define BOARD_TYPE "SAMD SEEED_XIAO_M0" + #elif defined(Wio_Lite_MG126) + #define BOARD_TYPE "SAMD SEEED Wio_Lite_MG126" + #elif defined(WIO_GPS_BOARD) + #define BOARD_TYPE "SAMD SEEED WIO_GPS_BOARD" + #elif defined(SEEEDUINO_ZERO) + #define BOARD_TYPE "SAMD SEEEDUINO_ZERO" + #elif defined(SEEEDUINO_LORAWAN) + #define BOARD_TYPE "SAMD SEEEDUINO_LORAWAN" + #elif defined(SEEED_GROVE_UI_WIRELESS) + #define BOARD_TYPE "SAMD SEEED_GROVE_UI_WIRELESS" + #elif defined(__SAMD21E18A__) + #define BOARD_TYPE "SAMD21E18A" + #elif defined(__SAMD21G18A__) + #define BOARD_TYPE "SAMD21G18A" + #elif defined(__SAMD51G19A__) + #define BOARD_TYPE "SAMD51G19A" + #elif defined(__SAMD51J19A__) + #define BOARD_TYPE "SAMD51J19A" + #elif defined(__SAMD51J20A__) + #define BOARD_TYPE "SAMD51J20A" + #elif defined(__SAM3X8E__) + #define BOARD_TYPE "SAM3X8E" + #elif defined(__CPU_ARC__) + #define BOARD_TYPE "CPU_ARC" + #elif defined(__SAMD51__) + #define BOARD_TYPE "SAMD51" + #else + #define BOARD_TYPE "SAMD Unknown" + #endif + +#elif (ESP8266_AT_USE_NRF528XX) + + #if defined(NRF52840_FEATHER) + #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" + #elif defined(NRF52832_FEATHER) + #define BOARD_TYPE "NRF52832_FEATHER" + #elif defined(NRF52840_FEATHER_SENSE) + #define BOARD_TYPE "NRF52840_FEATHER_SENSE" + #elif defined(NRF52840_ITSYBITSY) + #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" + #elif defined(NRF52840_CIRCUITPLAY) + #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" + #elif defined(NRF52840_CLUE) + #define BOARD_TYPE "NRF52840_CLUE" + #elif defined(NRF52840_METRO) + #define BOARD_TYPE "NRF52840_METRO_EXPRESS" + #elif defined(NRF52840_PCA10056) + #define BOARD_TYPE "NORDIC_NRF52840DK" + #elif defined(NINA_B302_ublox) + #define BOARD_TYPE "NINA_B302_ublox" + #elif defined(NINA_B112_ublox) + #define BOARD_TYPE "NINA_B112_ublox" + #elif defined(PARTICLE_XENON) + #define BOARD_TYPE "PARTICLE_XENON" + #elif defined(MDBT50Q_RX) + #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" + #elif defined(ARDUINO_NRF52_ADAFRUIT) + #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" + #else + #define BOARD_TYPE "nRF52 Unknown" + #endif + + #define EspSerial Serial1 + +#elif defined(ESP8266_AT_USE_SAM_DUE) + // For SAM DUE + #define EspSerial Serial1 + #define BOARD_TYPE "SAM DUE" + +#elif defined(ESP8266_AT_USE_STM32) + // For STM32 + #warning EspSerial using SERIAL_PORT_HARDWARE, can be Serial or Serial1. See your board variant.h + #define EspSerial SERIAL_PORT_HARDWARE //Serial1 + + #if defined(STM32F0) + #warning STM32F0 board selected + #define BOARD_TYPE "STM32F0" + #elif defined(STM32F1) + #warning STM32F1 board selected + #define BOARD_TYPE "STM32F1" + #elif defined(STM32F2) + #warning STM32F2 board selected + #define BOARD_TYPE "STM32F2" + #elif defined(STM32F3) + #warning STM32F3 board selected + #define BOARD_TYPE "STM32F3" + #elif defined(STM32F4) + #warning STM32F4 board selected + #define BOARD_TYPE "STM32F4" + #elif defined(STM32F7) + + #if defined(ARDUINO_NUCLEO_F767ZI) + #warning Nucleo-144 NUCLEO_F767ZI board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); + #else + + #warning STM32F7 board selected + #define BOARD_TYPE "STM32F7" + + #endif + + #elif defined(STM32L0) + #if defined(ARDUINO_NUCLEO_L053R8) + #warning Nucleo-64 NUCLEO_L053R8 board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); // (PA3, PA2); + #else + + #warning STM32L0 board selected + #define BOARD_TYPE "STM32L0" + + #endif + + #elif defined(STM32L1) + #warning STM32L1 board selected + #define BOARD_TYPE "STM32L1" + #elif defined(STM32L4) + #warning STM32L4 board selected + #define BOARD_TYPE "STM32L4" + #elif defined(STM32H7) + #warning STM32H7 board selected + #define BOARD_TYPE "STM32H7" + #elif defined(STM32G0) + #warning STM32G0 board selected + #define BOARD_TYPE "STM32G0" + #elif defined(STM32G4) + #warning STM32G4 board selected + #define BOARD_TYPE "STM32G4" + #elif defined(STM32WB) + #warning STM32WB board selected + #define BOARD_TYPE "STM32WB" + #elif defined(STM32MP1) + #warning STM32MP1 board selected + #define BOARD_TYPE "STM32MP1" + #else + #warning STM32 unknown board selected + #define BOARD_TYPE "STM32 Unknown" + + #endif + +#elif defined(BOARD_SIPEED_MAIX_DUINO) + + #warning SIPEED_MAIX_DUINO board selected + #define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" + + #define EspSerial Serial1 + +#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + + #warning RASPBERRY_PI_PICO board selected + + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_ARCH_MBED) + + #warning Using ARDUINO_ARCH_MBED + + #if ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + // Only undef known BOARD_NAME to use better one + #undef BOARD_NAME + #endif + + #if defined(ARDUINO_RASPBERRY_PI_PICO) + #define BOARD_NAME "MBED RASPBERRY_PI_PICO" + #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) + #define BOARD_NAME "MBED ADAFRUIT_FEATHER_RP2040" + #elif defined(ARDUINO_GENERIC_RP2040) + #define BOARD_NAME "MBED GENERIC_RP2040" + #elif defined(ARDUINO_NANO_RP2040_CONNECT) + #define BOARD_NAME "MBED NANO_RP2040_CONNECT" + #else + // Use default BOARD_NAME if exists + #if !defined(BOARD_NAME) + #define BOARD_NAME "MBED Unknown RP2040" + #endif + #endif + + #endif + + #if defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #warning WIZNET_WIZFI360_EVB_PICO + #define EspSerial Serial2 + #else + #define EspSerial Serial1 + #endif + +#elif (ESP_AT_USE_AVR) + + #if defined(ARDUINO_AVR_MEGA2560) + #define BOARD_TYPE "AVR Mega2560" + #elif defined(ARDUINO_AVR_MEGA) + #define BOARD_TYPE "AVR Mega" + #else + #define BOARD_TYPE "AVR ADK" + #endif + + // For Mega, use Serial1 or Serial3 + #define EspSerial Serial3 + +#else + #error Unknown or unsupported Board. Please check your Tools->Board setting. +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME BOARD_TYPE +#endif + +//////////////////////////////////////////// + +#define SSID "SSID" +#define PASSWORD "password" + + +#endif //defines_h diff --git a/examples/UDPClientSingle/UDPClientSingle.ino b/examples/UDPClientSingle/UDPClientSingle.ino index 5c77d57..54d520a 100644 --- a/examples/UDPClientSingle/UDPClientSingle.ino +++ b/examples/UDPClientSingle/UDPClientSingle.ino @@ -1,8 +1,8 @@ /**************************************************************************************************************************** UDPClientSingle.ino - For ESP8266/ESP32-AT-command running shields + For WizFi360/ESP8266/ESP32-AT-command running shields - ESP_AT_Lib is a wrapper library for the ESP8266/ESP32 AT-command shields + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib @@ -28,259 +28,12 @@ THE SOFTWARE. *****************************************************************************************************************************/ -/* Comment this out to disable prints and save space */ -#define ESP_AT_DEBUG_OUTPUT Serial - -#define _ESP_AT_LOGLEVEL_ 4 - -// Uncomment to use ESP32-AT commands -//#define USE_ESP32_AT true - -#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ - defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ - defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ - defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) ) -#if defined(ESP_AT_USE_NRF528XX) - #undef ESP_AT_USE_NRF528XX -#endif -#define ESP_AT_USE_NRF528XX true -#endif - -#if ( 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(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) || defined(__SAMD51G19A__) ) -#if defined(ESP_AT_USE_SAMD) - #undef ESP_AT_USE_SAMD -#endif -#define ESP_AT_USE_SAMD true -#endif - -#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) - #if defined(ESP_AT_USE_AVR) - #undef ESP_AT_USE_AVR - #endif - #define ESP_AT_USE_AVR true -#endif - -#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) - #if defined(ESP_AT_USE_SAM_DUE) - #undef ESP_AT_USE_SAM_DUE - #endif - #define ESP_AT_USE_SAM_DUE true -#endif - -#if ( defined(CORE_TEENSY) && !( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) ) - #if defined(ESP_AT_USE_TEENSY) - #undef ESP_AT_USE_TEENSY - #endif - #define ESP_AT_USE_TEENSY true -#endif - -#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) ) - #if defined(ESP_AT_USE_STM32) - #undef ESP_AT_USE_STM32 - #endif - #define ESP_AT_USE_STM32 true -#endif - -#if (ESP_AT_USE_NRF528XX) - -#if defined(NRF52840_FEATHER) - #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" -#elif defined(NRF52832_FEATHER) - #define BOARD_TYPE "NRF52832_FEATHER" -#elif defined(NRF52840_FEATHER_SENSE) - #define BOARD_TYPE "NRF52840_FEATHER_SENSE" -#elif defined(NRF52840_ITSYBITSY) - #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" -#elif defined(NRF52840_CIRCUITPLAY) - #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" -#elif defined(NRF52840_CLUE) - #define BOARD_TYPE "NRF52840_CLUE" -#elif defined(NRF52840_METRO) - #define BOARD_TYPE "NRF52840_METRO_EXPRESS" -#elif defined(NRF52840_PCA10056) - #define BOARD_TYPE "NORDIC_NRF52840DK" -#elif defined(NINA_B302_ublox) - #define BOARD_TYPE "NINA_B302_ublox" -#elif defined(NINA_B112_ublox) - #define BOARD_TYPE "NINA_B112_ublox" -#elif defined(PARTICLE_XENON) - #define BOARD_TYPE "PARTICLE_XENON" -#elif defined(MDBT50Q_RX) - #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" -#elif defined(ARDUINO_NRF52_ADAFRUIT) - #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" -#else - #define BOARD_TYPE "nRF52 Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_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(__SAMD21G18A__) - #define BOARD_TYPE "SAMD21G18A" -#elif defined(__SAMD51G19A__) - #define BOARD_TYPE "SAMD51G19" -#elif defined(__SAMD51J19A__) - #define BOARD_TYPE "SAMD51J19A" -#elif defined(__SAMD51J20A__) - #define BOARD_TYPE "SAMD51J20A" -#elif defined(__SAMD51__) - #define BOARD_TYPE "SAMD51" -#else - #define BOARD_TYPE "SAMD Unknown" -#endif - -#define EspSerial Serial1 - -#elif defined(ESP_AT_USE_SAM_DUE) -#if ( defined(ARDUINO_SAM_DUE) || (__SAM3X8E__) ) - #define BOARD_TYPE "SAM DUE" -#else - #define BOARD_TYPE "SAM Unknown" -#endif - -#define EspSerial Serial1 - -#elif ( defined(CORE_TEENSY) ) -// For Teensy 4.0 -#if defined(__IMXRT1062__) - // For Teensy 4.1/4.0 - #if defined(ARDUINO_TEENSY41) - #define BOARD_TYPE "TEENSY 4.1" - // Use true for NativeEthernet Library, false if using other Ethernet libraries - #define USE_NATIVE_ETHERNET true - #elif defined(ARDUINO_TEENSY40) - #define BOARD_TYPE "TEENSY 4.0" - #else - #define BOARD_TYPE "TEENSY 4.x" - #endif -#elif defined(__MK66FX1M0__) - #define BOARD_TYPE "Teensy 3.6" -#elif defined(__MK64FX512__) - #define BOARD_TYPE "Teensy 3.5" -#elif defined(__MK20DX256__) - #define BOARD_TYPE "Teensy 3.2/3.1" -#elif defined(__MK20DX128__) - #define BOARD_TYPE "Teensy 3.0" -#elif ( defined(__MKL26Z64__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U4__) ) - #error "Teensy LC, 2.0++ and 2.0 not supported" -#else - #define BOARD_TYPE "Teensy Unknown" -#endif - -#define EspSerial Serial1 - -#elif ESP_AT_USE_STM32 - -#if defined(STM32F0) - #define BOARD_TYPE "STM32F0" - #error Board STM32F0 not supported -#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 - -// For STM32, you have to declare and enable coreresponding Serial Port somewhere else before using it -#define EspSerial Serial1 - -#elif defined(BOARD_SIPEED_MAIX_DUINO) - -#warning SIPEED_MAIX_DUINO board selected -#define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" - -#define EspSerial Serial1 - -#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ - defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) - -#warning RASPBERRY_PI_PICO board selected - -#if defined(ARDUINO_ARCH_MBED) - - #if defined(BOARD_NAME) - #undef BOARD_NAME - #endif - - #if defined(ARDUINO_RASPBERRY_PI_PICO) - #define BOARD_TYPE "MBED RASPBERRY_PI_PICO" - #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) - #define BOARD_TYPE "MBED DAFRUIT_FEATHER_RP2040" - #elif defined(ARDUINO_GENERIC_RP2040) - #define BOARD_TYPE "MBED GENERIC_RP2040" - #elif defined(ARDUINO_NANO_RP2040_CONNECT) - #define BOARD_NAME "MBED NANO_RP2040_CONNECT" - #else - #define BOARD_TYPE "MBED Unknown RP2040" - #endif -#else - #define BOARD_TYPE "RASPBERRY_PI_PICO" -#endif - -#define EspSerial Serial1 - -#elif (ESP_AT_USE_AVR) - -#if defined(ARDUINO_AVR_MEGA2560) - #define BOARD_TYPE "AVR Mega2560" -#elif defined(ARDUINO_AVR_MEGA) - #define BOARD_TYPE "AVR Mega" -#else - #define BOARD_TYPE "AVR ADK" -#endif - -// For Mega, use Serial1 or Serial3 -#define EspSerial Serial3 - -#else -#error Unknown or unsupported Board. Please check your Tools->Board setting. - -#endif //ESP_AT_USE_NRF528XX - -#ifndef BOARD_NAME - #define BOARD_NAME BOARD_TYPE -#endif +#include "defines.h" #include "ESP_AT_Lib.h" -#define SSID "SSID" -#define PASSWORD "password" - -//#define HOST_NAME "www.yahoo.com" -#define HOST_NAME "192.168.2.30" +#define HOST_NAME "www.yahoo.com" +//#define HOST_NAME "192.168.2.30" #define HOST_PORT (5416) ESP8266 wifi(&EspSerial); @@ -288,11 +41,11 @@ ESP8266 wifi(&EspSerial); // Your board <-> ESP_AT baud rate: #define ESP_AT_BAUD 115200 -void setup(void) +void setup() { Serial.begin(115200); - while (!Serial); + while (!Serial && millis() < 5000); #if defined(BOARD_NAME) Serial.println("\nStart UDPClientSingle on " + String(BOARD_NAME)); @@ -326,25 +79,28 @@ void setup(void) Serial.println("Connect to WiFi failed"); } - if (wifi.disableMUX()) + Serial.print("enableMUX "); + + if (wifi.enableMUX()) { - Serial.println("disableMUX OK"); + Serial.println("enableMUX OK"); } else { - Serial.println("disableMUX failed"); + Serial.println("enableMUX failed"); } - + Serial.println("Done"); } -void loop(void) +void loop() { uint8_t buffer[128] = {0}; + static uint8_t mux_id = 0; Serial.print("Register UDP "); - if (wifi.registerUDP(HOST_NAME, HOST_PORT)) + if (wifi.registerUDP(mux_id, HOST_NAME, HOST_PORT)) { Serial.println("OK"); } @@ -355,7 +111,7 @@ void loop(void) char hello[] = "Hello, this is client!"; - if (wifi.send((const uint8_t*) hello, strlen(hello))) + if (wifi.send(mux_id, (const uint8_t*) hello, strlen(hello))) { Serial.println("Send OK"); } @@ -364,7 +120,7 @@ void loop(void) Serial.println("Send failed"); } - uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000); + uint32_t len = wifi.recv(mux_id, buffer, sizeof(buffer), 10000); if (len > 0) { @@ -380,7 +136,7 @@ void loop(void) Serial.print("Unregister UDP "); - if (wifi.unregisterUDP()) + if (wifi.unregisterUDP(mux_id)) { Serial.println("OK"); } diff --git a/examples/UDPClientSingle/defines.h b/examples/UDPClientSingle/defines.h new file mode 100644 index 0000000..5e4d828 --- /dev/null +++ b/examples/UDPClientSingle/defines.h @@ -0,0 +1,420 @@ +/**************************************************************************************************************************** + defines.h + For WizFi360/ESP8266/ESP32-AT-command running shields + + ESP_AT_Lib is a wrapper library for the WizFi360/ESP8266/ESP32 AT-command shields + + Based on and modified from ESP8266 https://github.com/esp8266/Arduino/releases + Built by Khoi Hoang https://github.com/khoih-prog/ESP_AT_Lib + Licensed under MIT license + *****************************************************************************************************************************/ + +#ifndef defines_h +#define defines_h + +//#define HTTP_UPLOAD_BUFLEN 4096 + +#define DEBUG_ESP8266_AT_WEBSERVER_PORT Serial + +// Debug Level from 0 to 4 +#define _ESP_AT_LIB_LOGLEVEL_ 1 + +#define USING_WIZFI360 true + +#if (USING_WIZFI360) || defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #define USE_ESP32_AT true +#else + // Uncomment to use ESP32-AT commands + //#define USE_ESP32_AT true +#endif + +#if USE_ESP32_AT + #warning Using ESP32-AT WiFi and ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP32-AT & ESP8266_AT_WebServer Library" +#else + #warning Using ESP8266-AT WiFi with ESP8266_AT_WebServer Library + #define SHIELD_TYPE "ESP8266-AT & ESP8266_AT_WebServer Library" +#endif + +#if ( 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(__SAMD21E18A__) || defined(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) \ + || defined(__SAMD51G19A__) || defined(__SAMD51P19A__) || defined(__SAMD21G18A__) ) + + #define MULTIPLY_FACTOR 2 + + #if defined(ESP8266_AT_USE_SAMD) + #undef ESP8266_AT_USE_SAMD + #endif + #define ESP8266_AT_USE_SAMD true + +#endif + +#if (defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \ + defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || \ + defined(NRF52840_CLUE) || defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || \ + defined(NRF52840_LED_GLASSES) || defined(MDBT50Q_RX) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) || \ + defined(ARDUINO_Seeed_XIAO_nRF52840) || defined(ARDUINO_Seeed_XIAO_nRF52840_Sense) || \ + defined(ARDUINO_SEEED_XIAO_NRF52840) || defined(ARDUINO_SEEED_XIAO_NRF52840_SENSE) ) + + #define MULTIPLY_FACTOR 4 + + #if defined(ESP8266_AT_USE_NRF528XX) + #undef ESP8266_AT_USE_NRF528XX + #endif + #define ESP8266_AT_USE_NRF528XX true + +#endif + +#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) ) + #if defined(ESP8266_AT_USE_SAM_DUE) + #undef ESP8266_AT_USE_SAM_DUE + #endif + #define ESP8266_AT_USE_SAM_DUE true +#endif + +#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) ||defined(STM32F4) || defined(STM32F7) || \ + defined(STM32L0) || defined(STM32L1) || defined(STM32L4) || defined(STM32H7) ||defined(STM32G0) || defined(STM32G4) || \ + defined(STM32WB) || defined(STM32MP1) ) + #if defined(ESP8266_AT_USE_STM32) + #undef ESP8266_AT_USE_STM32 + #endif + #define ESP8266_AT_USE_STM32 true +#endif + +#if ( defined(ARDUINO_AVR_ADK) || defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560) ) + #if defined(ESP_AT_USE_AVR) + #undef ESP_AT_USE_AVR + #endif + #define ESP_AT_USE_AVR true +#endif + +#ifdef CORE_TEENSY + // For Teensy 4.1/4.0 + //#define EspSerial Serial1 //Serial1, Pin RX1 : 0, TX1 : 1 + #define EspSerial Serial2 //Serial2, Pin RX2 : 7, TX2 : 8 + //#define EspSerial Serial3 //Serial3, Pin RX3 : 15, TX3 : 14 + //#define EspSerial Serial4 //Serial4, Pin RX4 : 16, TX4 : 17 + + #if defined(__IMXRT1062__) + // For Teensy 4.1/4.0 + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_TEENSY41) + #define BOARD_TYPE "TEENSY 4.1" + // Use true for NativeEthernet Library, false if using other Ethernet libraries + #define USE_NATIVE_ETHERNET true + #elif defined(ARDUINO_TEENSY40) + #define BOARD_TYPE "TEENSY 4.0" + #else + #define BOARD_TYPE "TEENSY 4.x" + #endif + #elif defined(__MK66FX1M0__) + #define BOARD_TYPE "Teensy 3.6" + #elif defined(__MK64FX512__) + #define BOARD_TYPE "Teensy 3.5" + #elif defined(__MKL26Z64__) + #define BOARD_TYPE "Teensy LC" + #elif defined(__MK20DX256__) + #define BOARD_TYPE "Teensy 3.2" // and Teensy 3.1 (obsolete) + #elif defined(__MK20DX128__) + #define BOARD_TYPE "Teensy 3.0" + #elif defined(__AVR_AT90USB1286__) + #error Teensy 2.0++ not supported yet + #elif defined(__AVR_ATmega32U4__) + #error Teensy 2.0 not supported yet + #else + // For Other Boards + #define BOARD_TYPE "Unknown Teensy Board" + #endif + +#elif defined(ESP8266_AT_USE_SAMD) + // For SAMD + #define EspSerial Serial1 + + #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(ADAFRUIT_FEATHER_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_FEATHER_M0_EXPRESS" + #elif defined(ADAFRUIT_METRO_M0_EXPRESS) + #define BOARD_TYPE "SAMD21 ADAFRUIT_METRO_M0_EXPRESS" + #elif defined(ADAFRUIT_CIRCUITPLAYGROUND_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_CIRCUITPLAYGROUND_M0" + #elif defined(ADAFRUIT_GEMMA_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_GEMMA_M0" + #elif defined(ADAFRUIT_TRINKET_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_TRINKET_M0" + #elif defined(ADAFRUIT_ITSYBITSY_M0) + #define BOARD_TYPE "SAMD21 ADAFRUIT_ITSYBITSY_M0" + #elif defined(ARDUINO_SAMD_HALLOWING_M0) + #define BOARD_TYPE "SAMD21 ARDUINO_SAMD_HALLOWING_M0" + #elif defined(ADAFRUIT_METRO_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_EXPRESS" + #elif defined(ADAFRUIT_GRAND_CENTRAL_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_GRAND_CENTRAL_M4" + #elif defined(ADAFRUIT_FEATHER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_FEATHER_M4_EXPRESS" + #elif defined(ADAFRUIT_ITSYBITSY_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_ITSYBITSY_M4_EXPRESS" + #elif defined(ADAFRUIT_TRELLIS_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_TRELLIS_M4_EXPRESS" + #elif defined(ADAFRUIT_PYPORTAL) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL" + #elif defined(ADAFRUIT_PYPORTAL_M4_TITANO) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYPORTAL_M4_TITANO" + #elif defined(ADAFRUIT_PYBADGE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_M4_EXPRESS" + #elif defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) + #define BOARD_TYPE "SAMD51 ADAFRUIT_METRO_M4_AIRLIFT_LITE" + #elif defined(ADAFRUIT_PYGAMER_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_M4_EXPRESS" + #elif defined(ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS" + #elif defined(ADAFRUIT_PYBADGE_AIRLIFT_M4) + #define BOARD_TYPE "SAMD51 ADAFRUIT_PYBADGE_AIRLIFT_M4" + #elif defined(ADAFRUIT_MONSTER_M4SK_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_MONSTER_M4SK_EXPRESS" + #elif defined(ADAFRUIT_HALLOWING_M4_EXPRESS) + #define BOARD_TYPE "SAMD51 ADAFRUIT_HALLOWING_M4_EXPRESS" + #elif defined(SEEED_WIO_TERMINAL) + #define BOARD_TYPE "SAMD SEEED_WIO_TERMINAL" + #elif defined(SEEED_FEMTO_M0) + #define BOARD_TYPE "SAMD SEEED_FEMTO_M0" + #elif defined(SEEED_XIAO_M0) + #define BOARD_TYPE "SAMD SEEED_XIAO_M0" + #elif defined(Wio_Lite_MG126) + #define BOARD_TYPE "SAMD SEEED Wio_Lite_MG126" + #elif defined(WIO_GPS_BOARD) + #define BOARD_TYPE "SAMD SEEED WIO_GPS_BOARD" + #elif defined(SEEEDUINO_ZERO) + #define BOARD_TYPE "SAMD SEEEDUINO_ZERO" + #elif defined(SEEEDUINO_LORAWAN) + #define BOARD_TYPE "SAMD SEEEDUINO_LORAWAN" + #elif defined(SEEED_GROVE_UI_WIRELESS) + #define BOARD_TYPE "SAMD SEEED_GROVE_UI_WIRELESS" + #elif defined(__SAMD21E18A__) + #define BOARD_TYPE "SAMD21E18A" + #elif defined(__SAMD21G18A__) + #define BOARD_TYPE "SAMD21G18A" + #elif defined(__SAMD51G19A__) + #define BOARD_TYPE "SAMD51G19A" + #elif defined(__SAMD51J19A__) + #define BOARD_TYPE "SAMD51J19A" + #elif defined(__SAMD51J20A__) + #define BOARD_TYPE "SAMD51J20A" + #elif defined(__SAM3X8E__) + #define BOARD_TYPE "SAM3X8E" + #elif defined(__CPU_ARC__) + #define BOARD_TYPE "CPU_ARC" + #elif defined(__SAMD51__) + #define BOARD_TYPE "SAMD51" + #else + #define BOARD_TYPE "SAMD Unknown" + #endif + +#elif (ESP8266_AT_USE_NRF528XX) + + #if defined(NRF52840_FEATHER) + #define BOARD_TYPE "NRF52840_FEATHER_EXPRESS" + #elif defined(NRF52832_FEATHER) + #define BOARD_TYPE "NRF52832_FEATHER" + #elif defined(NRF52840_FEATHER_SENSE) + #define BOARD_TYPE "NRF52840_FEATHER_SENSE" + #elif defined(NRF52840_ITSYBITSY) + #define BOARD_TYPE "NRF52840_ITSYBITSY_EXPRESS" + #elif defined(NRF52840_CIRCUITPLAY) + #define BOARD_TYPE "NRF52840_CIRCUIT_PLAYGROUND" + #elif defined(NRF52840_CLUE) + #define BOARD_TYPE "NRF52840_CLUE" + #elif defined(NRF52840_METRO) + #define BOARD_TYPE "NRF52840_METRO_EXPRESS" + #elif defined(NRF52840_PCA10056) + #define BOARD_TYPE "NORDIC_NRF52840DK" + #elif defined(NINA_B302_ublox) + #define BOARD_TYPE "NINA_B302_ublox" + #elif defined(NINA_B112_ublox) + #define BOARD_TYPE "NINA_B112_ublox" + #elif defined(PARTICLE_XENON) + #define BOARD_TYPE "PARTICLE_XENON" + #elif defined(MDBT50Q_RX) + #define BOARD_TYPE "RAYTAC_MDBT50Q_RX" + #elif defined(ARDUINO_NRF52_ADAFRUIT) + #define BOARD_TYPE "ARDUINO_NRF52_ADAFRUIT" + #else + #define BOARD_TYPE "nRF52 Unknown" + #endif + + #define EspSerial Serial1 + +#elif defined(ESP8266_AT_USE_SAM_DUE) + // For SAM DUE + #define EspSerial Serial1 + #define BOARD_TYPE "SAM DUE" + +#elif defined(ESP8266_AT_USE_STM32) + // For STM32 + #warning EspSerial using SERIAL_PORT_HARDWARE, can be Serial or Serial1. See your board variant.h + #define EspSerial SERIAL_PORT_HARDWARE //Serial1 + + #if defined(STM32F0) + #warning STM32F0 board selected + #define BOARD_TYPE "STM32F0" + #elif defined(STM32F1) + #warning STM32F1 board selected + #define BOARD_TYPE "STM32F1" + #elif defined(STM32F2) + #warning STM32F2 board selected + #define BOARD_TYPE "STM32F2" + #elif defined(STM32F3) + #warning STM32F3 board selected + #define BOARD_TYPE "STM32F3" + #elif defined(STM32F4) + #warning STM32F4 board selected + #define BOARD_TYPE "STM32F4" + #elif defined(STM32F7) + + #if defined(ARDUINO_NUCLEO_F767ZI) + #warning Nucleo-144 NUCLEO_F767ZI board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); + #else + + #warning STM32F7 board selected + #define BOARD_TYPE "STM32F7" + + #endif + + #elif defined(STM32L0) + #if defined(ARDUINO_NUCLEO_L053R8) + #warning Nucleo-64 NUCLEO_L053R8 board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX + // RX TX + HardwareSerial Serial1(D0, D1); // (PA3, PA2); + #else + + #warning STM32L0 board selected + #define BOARD_TYPE "STM32L0" + + #endif + + #elif defined(STM32L1) + #warning STM32L1 board selected + #define BOARD_TYPE "STM32L1" + #elif defined(STM32L4) + #warning STM32L4 board selected + #define BOARD_TYPE "STM32L4" + #elif defined(STM32H7) + #warning STM32H7 board selected + #define BOARD_TYPE "STM32H7" + #elif defined(STM32G0) + #warning STM32G0 board selected + #define BOARD_TYPE "STM32G0" + #elif defined(STM32G4) + #warning STM32G4 board selected + #define BOARD_TYPE "STM32G4" + #elif defined(STM32WB) + #warning STM32WB board selected + #define BOARD_TYPE "STM32WB" + #elif defined(STM32MP1) + #warning STM32MP1 board selected + #define BOARD_TYPE "STM32MP1" + #else + #warning STM32 unknown board selected + #define BOARD_TYPE "STM32 Unknown" + + #endif + +#elif defined(BOARD_SIPEED_MAIX_DUINO) + + #warning SIPEED_MAIX_DUINO board selected + #define BOARD_TYPE "BOARD_SIPEED_MAIX_DUINO" + + #define EspSerial Serial1 + +#elif ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + + #warning RASPBERRY_PI_PICO board selected + + #define MULTIPLY_FACTOR 6 + + #if defined(ARDUINO_ARCH_MBED) + + #warning Using ARDUINO_ARCH_MBED + + #if ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_RASPBERRY_PI_PICO) || \ + defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) ) + // Only undef known BOARD_NAME to use better one + #undef BOARD_NAME + #endif + + #if defined(ARDUINO_RASPBERRY_PI_PICO) + #define BOARD_NAME "MBED RASPBERRY_PI_PICO" + #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) + #define BOARD_NAME "MBED ADAFRUIT_FEATHER_RP2040" + #elif defined(ARDUINO_GENERIC_RP2040) + #define BOARD_NAME "MBED GENERIC_RP2040" + #elif defined(ARDUINO_NANO_RP2040_CONNECT) + #define BOARD_NAME "MBED NANO_RP2040_CONNECT" + #else + // Use default BOARD_NAME if exists + #if !defined(BOARD_NAME) + #define BOARD_NAME "MBED Unknown RP2040" + #endif + #endif + + #endif + + #if defined(ARDUINO_WIZNET_WIZFI360_EVB_PICO) + #warning WIZNET_WIZFI360_EVB_PICO + #define EspSerial Serial2 + #else + #define EspSerial Serial1 + #endif + +#elif (ESP_AT_USE_AVR) + + #if defined(ARDUINO_AVR_MEGA2560) + #define BOARD_TYPE "AVR Mega2560" + #elif defined(ARDUINO_AVR_MEGA) + #define BOARD_TYPE "AVR Mega" + #else + #define BOARD_TYPE "AVR ADK" + #endif + + // For Mega, use Serial1 or Serial3 + #define EspSerial Serial3 + +#else + #error Unknown or unsupported Board. Please check your Tools->Board setting. +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME BOARD_TYPE +#endif + +//////////////////////////////////////////// + +#define SSID "SSID" +#define PASSWORD "password" + + +#endif //defines_h diff --git a/library.json b/library.json index 4ec7960..9dce929 100644 --- a/library.json +++ b/library.json @@ -1,8 +1,8 @@ { "name": "ESP_AT_Lib", - "version": "1.4.1", - "keywords": "wifi, WebServer, AT-command, wifi-shield, ESP8266, ESP32, Teensy, AVR, SAM DUE, SAMD21, SAMD51, STM32, nRF52, ESP8266-AT, ESP32-AT, rpi-pico, rp2040, raspberry-pi-pico, nano-rp2040-connect, mbed", - "description": "Simple ESP8266/ESP32-AT-command wrapper library for AVR, Teensy, SAM DUE, SAMD21, SAMD51, STM32, nRF52, SIPEED_MAIX_DUINO and RP2040-based (Nano_RP2040_Connect, RASPBERRY_PI_PICO, etc.) boards using ESP8266/ESP32 AT-command shields", + "version": "1.5.0", + "keywords": "wifi, WebServer, AT-command, wifi-shield, ESP8266, ESP32, Teensy, AVR, SAM DUE, SAMD21, SAMD51, STM32, nRF52, ESP8266-AT, ESP32-AT, WizFi360, rpi-pico, rp2040, raspberry-pi-pico, nano-rp2040-connect, mbed", + "description": "Simple WizFi360/ESP8266/ESP32-AT-command wrapper library for AVR, Teensy, SAM DUE, SAMD21, SAMD51, STM32, nRF52, SIPEED_MAIX_DUINO and RP2040-based (Nano_RP2040_Connect, RASPBERRY_PI_PICO, etc.) boards using WizFi360/ESP8266/ESP32 AT-command shields", "authors": { "name": "Khoi Hoang", diff --git a/library.properties b/library.properties index 7bc3f25..a8c8f85 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ name=ESP_AT_Lib -version=1.4.1 +version=1.5.0 maintainer=Khoi Hoang license=MIT maintainer=Khoi Hoang -sentence=An ESP8266/ESP32-AT library for Arduino providing an easy-to-use way to control ESP8266-AT/ESP32-AT WiFi shields using AT-commands. For AVR, Teensy, SAM DUE, SAMD21, SAMD51, STM32, nRF52, SIPEED_MAIX_DUINO and RP2040-based (Nano_RP2040_Connect, RASPBERRY_PI_PICO, etc.) boards using ESP8266/ESP32 AT-command shields. +sentence=An ESP8266/ESP32-AT library for Arduino providing an easy-to-use way to control WizFi360/ESP8266-AT/ESP32-AT WiFi shields using AT-commands. For AVR, Teensy, SAM DUE, SAMD21, SAMD51, STM32, nRF52, SIPEED_MAIX_DUINO and RP2040-based (Nano_RP2040_Connect, RASPBERRY_PI_PICO, etc.) boards using WizFi360/ESP8266/ESP32 AT-command shields. paragraph=The library supports HTTP GET and POST requests, provides argument parsing, handles one client at a time. category=Communication url=https://github.com/khoih-prog/ESP_AT_Lib diff --git a/pics/WIZNET_WIZFI360_EVB_PICO.png b/pics/WIZNET_WIZFI360_EVB_PICO.png new file mode 100644 index 0000000000000000000000000000000000000000..61aecec4528dfc3301d10684aa05c11a116c0c7d GIT binary patch literal 251819 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