From 9e67714d20be71ef7ff5bc805df0705a62d4c6e1 Mon Sep 17 00:00:00 2001
From: Khoi Hoang <57012152+khoih-prog@users.noreply.github.com>
Date: Mon, 19 Apr 2021 04:07:53 -0400
Subject: [PATCH] Major Releases v1.3.0
### Major Releases v1.3.0
1. Add **LittleFS and SPIFFS** support to new **ESP32-S2** boards (**Arduino ESP32C3_DEV**). Check [HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE](#howto-install-esp32-core-for-esp32-s2-saola-ai-thinker-esp-12k-and-esp32-c3-boards-into-arduino-ide).
2. Add **EEPROM and SPIFFS** support to new **ESP32-C3** boards (**Arduino ESP32C3_DEV**). Check [HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE](#howto-install-esp32-core-for-esp32-s2-saola-ai-thinker-esp-12k-and-esp32-c3-boards-into-arduino-ide).
3. Fix SSL issue with Blynk Cloud Server
4. Update examples
---
README.md | 339 +++++++++++++++---
.../AM2315_ESP32_SSL/AM2315_ESP32_SSL.ino | 4 +-
examples/AM2315_ESP32_SSL/defines.h | 31 +-
examples/AM2315_ESP8266/AM2315_ESP8266.ino | 4 +-
.../Blynk_WM_Template/Blynk_WM_Template.ino | 37 +-
examples/DHT11ESP32/DHT11ESP32.ino | 6 +-
examples/DHT11ESP32/defines.h | 31 +-
examples/DHT11ESP32_SSL/DHT11ESP32_SSL.ino | 6 +-
examples/DHT11ESP32_SSL/defines.h | 31 +-
examples/DHT11ESP8266/DHT11ESP8266.ino | 6 +-
.../DHT11ESP8266_Debug/DHT11ESP8266_Debug.ino | 6 +-
.../DHT11ESP8266_SSL/DHT11ESP8266_SSL.ino | 6 +-
examples/ESP32WM_Config/ESP32WM_Config.ino | 6 +-
examples/ESP32WM_Config/defines.h | 32 +-
.../ESP32WM_ForcedConfig.ino | 6 +-
examples/ESP32WM_ForcedConfig/defines.h | 31 +-
.../ESP32WM_MRD_Config/ESP32WM_MRD_Config.ino | 10 +-
examples/ESP32WM_MRD_Config/defines.h | 31 +-
.../ESP32WM_MRD_ForcedConfig.ino | 6 +-
examples/ESP32WM_MRD_ForcedConfig/defines.h | 32 +-
.../ESP8266WM_Config/ESP8266WM_Config.ino | 6 +-
examples/ESP8266WM_Config/defines.h | 28 +-
.../ESP8266WM_ForcedConfig.ino | 6 +-
.../ESP8266WM_MRD_Config.ino | 6 +-
.../ESP8266WM_MRD_ForcedConfig.ino | 7 +-
pics/Blynk_ESP32_C3_Support.png | Bin 0 -> 99560 bytes
src/BlynkSimpleEsp32_SSL_WM.h | 14 +-
src/BlynkSimpleEsp32_WM.h | 6 +-
src/BlynkSimpleEsp8266_SSL_WM.h | 23 +-
src/BlynkSimpleEsp8266_WM.h | 6 +-
30 files changed, 623 insertions(+), 140 deletions(-)
create mode 100644 pics/Blynk_ESP32_C3_Support.png
diff --git a/README.md b/README.md
index f9f28dc..fa2ddb4 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,7 @@
* [Features](#features)
* [Currently supported Boards](#currently-supported-boards)
* [Changelog](#changelog)
+ * [Major Releases v1.3.0](#major-releases-v130)
* [Major Releases v1.2.0](#major-releases-v120)
* [Releases v1.1.3](#releases-v113)
* [Releases v1.1.2](#releases-v112)
@@ -34,21 +35,23 @@
* [Installation](#installation)
* [I) For Arduino IDE](#i-for-arduino-ide)
* [II) For VS Code & PlatformIO:](#ii-for-vs-code--platformio)
-* [HOWTO Install esp32-s2 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) boards into Arduino IDE)](#howto-install-esp32-s2-core-for-esp32-s2-saola-ai-thinker-esp-12k-boards-into-arduino-ide)
+* [HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE](#howto-install-esp32-core-for-esp32-s2-saola-ai-thinker-esp-12k-and-esp32-c3-boards-into-arduino-ide)
* [1. Save the original esp32 core](#1-save-the-original-esp32-core)
- * [2. Download esp32-s2 core](#2-download-esp32-s2-core)
- * [2.1 Download zip](#21-download-zip)
- * [2.2 Unzip](#22-unzip)
- * [2.3 Update esp32-s2 core directories](#23-update-esp32-s2-core-directories)
- * [3. Download tools](#3-download-tools)
+ * [2. Install esp32 core v1.0.6](#2-install-esp32-core-v106)
+ * [2.1 Install esp32 core](#21-install-esp32-core)
+ * [2.2 Download latest zip with esp32-s2 support](#22-download-latest-zip-with-esp32-s2-support)
+ * [2.3 Unzip](#23-unzip)
+ * [2.3 Update esp32 core directories](#24-update-esp32-core-directories)
+ * [3. Download tools for ESP32-S2](#3-download-tools-for-esp32-s2)
* [3.1 Download Toolchain for Xtensa (ESP32-S2) based on GCC](#31-download-toolchain-for-xtensa-esp32-s2-based-on-gcc)
* [3.2 Download esptool](#32-download-esptool)
* [3.3 Unzip](#33-unzip)
* [4. Update tools](#4-update-tools)
* [4.1 Update Toolchain](#41-update-toolchain)
* [4.2 Update esptool](#42-update-esptool)
- * [5. esp32-s2 WebServer Library Patch](#5-esp32-s2-webserver-library-patch)
-* [Note for Platform IO using ESP32 LittleFS](#note-for-platform-io-using-esp32-littlefs)
+ * [5. Download tools for ESP32-C3](#5-download-tools-for-esp32-c3)
+ * [6. esp32-s2 WebServer Library Patch](#6-esp32-s2-webserver-library-patch)
+* [Note for Platform IO using ESP32 LittleFS](#note-for-platform-io-using-esp32-littlefs)
* [HOWTO Use analogRead() with ESP32 running WiFi and/or BlueTooth (BT/BLE)](#howto-use-analogread-with-esp32-running-wifi-andor-bluetooth-btble)
* [1. ESP32 has 2 ADCs, named ADC1 and ADC2](#1--esp32-has-2-adcs-named-adc1-and-adc2)
* [2. ESP32 ADCs functions](#2-esp32-adcs-functions)
@@ -106,6 +109,8 @@
* [6. ESP8266WM_MRD_ForcedConfig using persistent ConfigPortal virtual button](#6-esp8266wm_mrd_forcedconfig-using-persistent-configportal-virtual-button)
* [6.1. Start normally then press persistent ConfigPortal virtual button](#61-start-normally-then-press-persistent-configportal-virtual-button)
* [6.2. Enter persistent ConfigPortal](#62-enter-persistent-configportal)
+ * [7. ESP8266WM_MRD_ForcedConfig using LITTLEFS with SSL on ESP8266_NODEMCU](#7-esp8266wm_mrd_forcedconfig-using-littlefs-with-ssl-on-esp8266_nodemcu)
+ * [8. ESP32WM_MRD_Config using LITTLEFS with SSL on ESP32S2_DEV](#8-esp32wm_mrd_config-using-littlefs-with-ssl-on-esp32s2_dev)
* [Debug](#debug)
* [Troubleshooting](#troubleshooting)
* [Releases](#releases)
@@ -183,6 +188,13 @@ This [**BlynkESP32_BT_WF** library](https://github.com/khoih-prog/BlynkESP32_BT_
## Changelog
+### Major Releases v1.3.0
+
+1. Add **LittleFS and SPIFFS** support to new **ESP32-S2** boards (**Arduino ESP32C3_DEV**). Check [HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE](#howto-install-esp32-core-for-esp32-s2-saola-ai-thinker-esp-12k-and-esp32-c3-boards-into-arduino-ide).
+2. Add **EEPROM and SPIFFS** support to new **ESP32-C3** boards (**Arduino ESP32C3_DEV**). Check [HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE](#howto-install-esp32-core-for-esp32-s2-saola-ai-thinker-esp-12k-and-esp32-c3-boards-into-arduino-ide).
+3. Fix SSL issue with Blynk Cloud Server
+4. Update examples
+
### Major Releases v1.2.0
1. Configurable **Customs HTML Headers**, including Customs Style, Customs Head Elements, CORS Header.
@@ -264,12 +276,12 @@ Thanks to [Thor Johnson](https://github.com/thorathome) to test, suggest and enc
1. [`Arduino IDE 1.8.13+`](https://www.arduino.cc/en/Main/Software)
2. [`Blynk library 0.6.1+`](https://github.com/blynkkk/blynk-library/releases). [![Latest release](https://img.shields.io/github/release/blynkkk/blynk-library.svg)](https://github.com/blynkkk/blynk-library/releases/latest/)
-3. [`ESP32 Core 1.0.5+`](https://github.com/espressif/arduino-esp32) for ESP32-based boards. [![Latest release](https://img.shields.io/github/release/espressif/arduino-esp32.svg)](https://github.com/espressif/arduino-esp32/releases/latest/)
-4. [`ESP32S2 Core 1.0.5+`](https://github.com/espressif/arduino-esp32/tree/esp32s2) for ESP32S2-based boards.
+3. [`ESP32 Core 1.0.6+`](https://github.com/espressif/arduino-esp32) for ESP32-based boards. [![Latest release](https://img.shields.io/github/release/espressif/arduino-esp32.svg)](https://github.com/espressif/arduino-esp32/releases/latest/)
+4. [`ESP32-S2/C3 Core 1.0.6+`](https://github.com/espressif/arduino-esp32) for ESP32-S2/C3-based boards. Must follow [HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE](#howto-install-esp32-core-for-esp32-s2-saola-ai-thinker-esp-12k-and-esp32-c3-boards-into-arduino-ide).
5. [`ESP8266 Core 2.7.4+`](https://github.com/esp8266/Arduino) for ESP8266-based boards. [![Latest release](https://img.shields.io/github/release/esp8266/Arduino.svg)](https://github.com/esp8266/Arduino/releases/latest/). To use ESP8266 core 2.7.1+ for LittleFS.
6. [`ESP_DoubleResetDetector library 1.1.1+`](https://github.com/khoih-prog/ESP_DoubleResetDetector) to use DRD feature. To install, check [![arduino-library-badge](https://www.ardu-badge.com/badge/ESP_DoubleResetDetector.svg?)](https://www.ardu-badge.com/ESP_DoubleResetDetector).
7. [`ESP_MultiResetDetector library 1.1.1+`](https://github.com/khoih-prog/ESP_MultiResetDetector) to use MRD feature. To install, check [![arduino-library-badge](https://www.ardu-badge.com/badge/ESP_MultiResetDetector.svg?)](https://www.ardu-badge.com/ESP_MultiResetDetector).
-8. [`LittleFS_esp32 v1.0.5+`](https://github.com/lorol/LITTLEFS) for ESP32-based boards using LittleFS. To install, check [![arduino-library-badge](https://www.ardu-badge.com/badge/LittleFS_esp32.svg?)](https://www.ardu-badge.com/LittleFS_esp32).
+8. [`LittleFS_esp32 v1.0.6+`](https://github.com/lorol/LITTLEFS) for ESP32-based boards using LittleFS. To install, check [![arduino-library-badge](https://www.ardu-badge.com/badge/LittleFS_esp32.svg?)](https://www.ardu-badge.com/LittleFS_esp32).
---
@@ -318,7 +330,7 @@ Thanks to [Thor Johnson](https://github.com/thorathome) to test, suggest and enc
---
---
-## HOWTO Install esp32-s2 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) boards into Arduino IDE
+## HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE
These are instructions demonstrating the steps to install esp32-s2 core on Ubuntu machines. For Windows or other OS'es, just follow the the similar principles and steps.
@@ -336,27 +348,32 @@ First, copy the whole original esp32 core to another safe place. Then delete all
---
-### 2. Download esp32-s2 core
-#### 2.1 Download zip
+### 2. Install esp32 core v1.0.6
+
+#### 2.1 Install esp32 core
+
+Just use Arduino IDE Board Manager to install [ESP32 Arduino Release 1.0.6 based on ESP-IDF v3.3.5](https://github.com/espressif/arduino-esp32/releases/tag/1.0.6). This official v1.06 core doesn't have esp32-s2/s3 support. You have to download and use the latest master branch.
-Download [**esp32-s2 core**](https://github.com/espressif/arduino-esp32/tree/esp32s2) in the `zip` format:
-`arduino-esp32-esp32s2.zip`
+#### 2.2 Download latest zip with esp32-s2 support
-#### 2.2 Unzip
+As of **April 16th 2021**, the **esp32-s2/c3** board support has been included in master branch of esp32 core. Download [**esp32 core, master branch**](https://github.com/espressif/arduino-esp32) in the zip format.
+
+#### 2.3 Unzip
-#### 2.3 Update esp32-s2 core directories
+#### 2.4 Update esp32 core directories
+
+Copy all subdirectories of esp32 core into `/home/your_account/.arduino15/packages/esp32/hardware/esp32/1.0.6`
-Copy all subdirectories of esp32-s2 core into `/home/your_account/.arduino15/packages/esp32/hardware/esp32/1.0.4`
---
-### 3 Download tools
+### 3 Download tools for ESP32-S2
#### 3.1 Download Toolchain for Xtensa (ESP32-S2) based on GCC
@@ -389,7 +406,7 @@ Download [esptool](https://github.com/espressif/esptool/releases) int the `zip`
#### 4.1 Update Toolchain
-Copy whole `xtensa-esp32s2-elf` directory into `/home/your_account/.arduino15/packages/esp32/hardware/esp32/1.0.4/tools`
+Copy whole `xtensa-esp32s2-elf` directory into `/home/your_account/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools`
#### 4.2 Update esptool
@@ -397,7 +414,7 @@ Copy whole `xtensa-esp32s2-elf` directory into `/home/your_account/.arduino15/pa
Rename `esptool-3.0` directory to `esptool`
-Copy whole `esptool` directory into `/home/your_account/.arduino15/packages/esp32/hardware/esp32/1.0.4/tools`
+Copy whole `esptool` directory into `/home/your_account/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools`
@@ -405,7 +422,32 @@ Copy whole `esptool` directory into `/home/your_account/.arduino15/packages/esp3
-### 5. esp32-s2 WebServer Library Patch
+### 5 Download tools for ESP32-C3
+
+Download [**esp32-c3 Toolchain**](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/api-guides/tools/idf-tools.html#riscv32-esp-elf) corresponding to your environment (linux-amd64, win64, etc.).
+
+For example`riscv32-esp-elf-gcc8_4_0-crosstool-ng-1.24.0-123-g64eb9ff-linux-amd64.tar.gz`, then un-archive.
+
+Then using the similar steps as in
+
+* [3. Download tools for ESP32-S2](#3-download-tools-for-esp32-s2)
+ * [3.1 Download Toolchain for Xtensa (ESP32-S2) based on GCC](#31-download-toolchain-for-xtensa-esp32-s2-based-on-gcc)
+ * [3.2 Download esptool](#32-download-esptool)
+ * [3.3 Unzip](#33-unzip)
+* [4. Update tools](#4-update-tools)
+ * [4.1 Update Toolchain](#41-update-toolchain)
+ * [4.2 Update esptool](#42-update-esptool)
+
+then copy whole `riscv32-esp-elf` directory into `/home/your_account/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools`
+
+
+
+
+
+
+### 6. esp32-s2 WebServer Library Patch
+
+#### Necessary only for esp32 core v1.0.6-
If you haven't installed a new version with [WebServer.handleClient delay PR #4350](https://github.com/espressif/arduino-esp32/pull/4350) or haven't applied the above mentioned PR, you have to use the following patch.
@@ -420,13 +462,17 @@ Supposing the esp32-s2 version is 1.0.4, these files `WebServer.h/cpp` must be c
---
-That's it. You're now ready to compile and test for ESP32-S2 now
+That's it. You're now ready to compile and test for **ESP32-S2 and ESP32-C3** now
---
---
### Note for Platform IO using ESP32 LittleFS
+#### Necessary only for esp32 core v1.0.6-
+
+From esp32 core v1.0.6+, [`LittleFS_esp32 v1.0.6`](https://github.com/lorol/LITTLEFS) has been included and this step is not necessary anymore.
+
In Platform IO, to fix the error when using [`LittleFS_esp32 v1.0`](https://github.com/lorol/LITTLEFS) for ESP32-based boards with ESP32 core v1.0.4- (ESP-IDF v3.2-), uncomment the following line
from
@@ -932,7 +978,7 @@ Then click **Save**. The system will auto-restart. You will see the board's buil
#include "dynamicParams.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
@@ -1184,13 +1230,34 @@ void loop()
#### 2. File [defines.h](examples/ESP32WM_MRD_ForcedConfig/defines.h)
```cpp
+/*
+ // To add something similar to this for ESP32-C3
+ #if CONFIG_IDF_TARGET_ESP32
+ const int8_t esp32_adc2gpio[20] = {36, 37, 38, 39, 32, 33, 34, 35, -1, -1, 4, 0, 2, 15, 13, 12, 14, 27, 25, 26};
+ #elif CONFIG_IDF_TARGET_ESP32S2
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #elif CONFIG_IDF_TARGET_ESP32C3
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #endif
+ */
+
#ifndef defines_h
#define defines_h
-#ifndef ESP32
+#if !( defined(ESP32) )
#error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
+#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \
+ ARDUINO_METRO_ESP32S2 || ARDUINO_MAGTAG29_ESP32S2 || ARDUINO_FUNHOUSE_ESP32S2 || \
+ ARDUINO_ADAFRUIT_FEATHER_ESP32S2_NOPSRAM )
+ #define BOARD_TYPE "ESP32-S2"
+#elif ( ARDUINO_ESP32C3_DEV )
+ // https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-gpio.c
+ #warning ESP32-C3 boards not fully supported yet. Only SPIFFS and EEPROM OK. Tempo esp32_adc2gpio to be replaced
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #define BOARD_TYPE "ESP32-C3"
+#else
+ #define BOARD_TYPE "ESP32"
#endif
-
#define BLYNK_PRINT Serial
#define BLYNK_WM_DEBUG 3
@@ -1235,11 +1302,10 @@ void loop()
// (USE_LITTLEFS == false) and (USE_SPIFFS == true) => using SPIFFS for configuration data in WiFiManager
// Those above #define's must be placed before #include
-#if ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_PROS2 || ARDUINO_MICROS2 )
- // Currently, ESP32-S2 only supporting EEPROM. Will fix to support LittleFS and SPIFFS
+#if ( ARDUINO_ESP32C3_DEV )
+ // Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
#define USE_LITTLEFS false
- #define USE_SPIFFS false
- #warning ESP32-S2 only support supporting EEPROM now.
+ #define USE_SPIFFS true
#else
#define USE_LITTLEFS true
#define USE_SPIFFS false
@@ -1462,7 +1528,7 @@ The following is the sample terminal output when running example [ESP8266WM_MRD_
```
Starting ESP8266WM_MRD_Config using LittleFS with SSL on ESP8266_NODEMCU
-Blynk_WM SSL for ESP8266 v1.2.0
+Blynk_WM SSL for ESP8266 v1.3.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFD0002
multiResetDetectorFlag = 0xFFFD0002
@@ -1542,7 +1608,7 @@ BBBBBB
```
Starting ESP8266WM_MRD_Config using LittleFS with SSL on ESP8266_NODEMCU
-Blynk_WM SSL for ESP8266 v1.2.0
+Blynk_WM SSL for ESP8266 v1.3.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFC0003
multiResetDetectorFlag = 0xFFFC0003
@@ -1604,7 +1670,7 @@ The following is the sample terminal output when running example [DHT11ESP8266_S
```
Starting DHT11ESP8266_SSL using LittleFS with SSL on ESP8266_NODEMCU
-Blynk_WM SSL for ESP8266 v1.2.0
+Blynk_WM SSL for ESP8266 v1.3.0
ESP_DoubleResetDetector v1.1.1
[293] Hostname=ESP8266-DHT11-SSL
[316] LoadCfgFile
@@ -1662,7 +1728,7 @@ The following is the sample terminal output when running example [ESP32WM_MRD_Co
```
Starting ESP32WM_MRD_Config using LITTLEFS without SSL on ESP32_DEV
-Blynk_WM for ESP32 v1.2.0
+Blynk_WM for ESP32 v1.3.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -1739,7 +1805,7 @@ BBBBBB
```
Starting ESP32WM_MRD_Config using LITTLEFS without SSL on ESP32_DEV
-Blynk_WM for ESP32 v1.2.0
+Blynk_WM for ESP32 v1.3.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFC0003
multiResetDetectorFlag = 0xFFFC0003
@@ -1797,7 +1863,7 @@ ets Jun 8 2016 00:22:57
```
Starting ESP32WM_MRD_Config using LITTLEFS without SSL on ESP32_DEV
-Blynk_WM for ESP32 v1.2.0
+Blynk_WM for ESP32 v1.3.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -1921,7 +1987,7 @@ The following is the sample terminal output when running example [DHT11ESP8266_S
```
Starting DHT11ESP32_SSL using LITTLEFS with SSL on ESP32_DEV
-Blynk_WM SSL for ESP32 v1.2.0
+Blynk_WM SSL for ESP32 v1.3.0
ESP_DoubleResetDetector v1.1.1
[346] Hostname=ESP32-DHT11-SSL
[385] LoadCfgFile
@@ -1985,7 +2051,7 @@ Blynk.resetAndEnterConfigPortal();
```
Starting ESP8266WM_MRD_ForcedConfig using LittleFS without SSL on ESP8266_NODEMCU
-Blynk_WM for ESP8266 v1.2.0
+Blynk_WM for ESP8266 v1.3.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -2071,7 +2137,7 @@ Non-Persistent CP will be removed after first reset, even you didn't enter the C
```
Starting ESP8266WM_MRD_ForcedConfig using LittleFS without SSL on ESP8266_NODEMCU
-Blynk_WM for ESP8266 v1.2.0
+Blynk_WM for ESP8266 v1.3.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -2153,7 +2219,7 @@ Blynk.resetAndEnterConfigPortalPersistent();
```
Starting ESP8266WM_MRD_ForcedConfig using LittleFS without SSL on ESP8266_NODEMCU
-Blynk_WM for ESP8266 v1.2.0
+Blynk_WM for ESP8266 v1.3.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -2240,7 +2306,7 @@ Persistent CP will remain after resets. The only way to get rid of Config Portal
```
Starting ESP8266WM_MRD_ForcedConfig using LittleFS without SSL on ESP8266_NODEMCU
-Blynk_WM for ESP8266 v1.2.0
+Blynk_WM for ESP8266 v1.3.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -2300,6 +2366,182 @@ Saving config file OK
```
+---
+
+### 7. ESP8266WM_MRD_ForcedConfig using LITTLEFS with SSL on ESP8266_NODEMCU
+
+The following is the sample terminal output when running example [ESP8266WM_MRD_ForcedConfig](examples/ESP8266WM_MRD_ForcedConfig) on **ESP8266_NODEMCU**. Please note that this fix the SSL issue with Blynk Cloud Server.
+
+```
+Starting ESP8266WM_MRD_ForcedConfig using LittleFS with SSL on ESP8266_NODEMCU
+Blynk_WM SSL for ESP8266 v1.3.0
+ESP_MultiResetDetector v1.1.1
+[267] Set CustomsStyle to :
+[289] Set CustomsHeadElement to :
+[296] Set CORS Header to : Your Access-Control-Allow-Origin
+LittleFS Flag read = 0xFFFE0001
+multiResetDetectorFlag = 0xFFFE0001
+lowerBytes = 0x0001, upperBytes = 0x0001
+No multiResetDetected, number of times = 1
+LittleFS Flag read = 0xFFFE0001
+Saving config file...
+Saving config file OK
+[339] Hostname=8266-Master-Controller
+[361] LoadCfgFile
+[361] OK
+[361] ======= Start Stored Config Data =======
+[361] Hdr=SSL_ESP8266,BrdName=ESP8266
+[361] SSID=HueNet1,PW=12345678
+[363] SSID1=HueNet2,PW1=12345678
+[366] Server=blynk-cloud.com,Token=token1
+[372] Server1=blynk-cloud.com,Token1=token2
+[378] Port=9443
+[379] ======= End Config Data =======
+[383] CCSum=0x2fa3,RCSum=0x2fa3
+[390] LoadCredFile
+[391] CrR:pdata=default-mqtt-server,len=34
+[391] CrR:pdata=1883,len=6
+[393] CrR:pdata=default-mqtt-username,len=34
+[397] CrR:pdata=default-mqtt-password,len=34
+[401] CrR:pdata=default-mqtt-SubTopic,len=34
+[405] CrR:pdata=default-mqtt-PubTopic,len=34
+[409] OK
+[410] CrCCsum=0x29a6,CrRCsum=0x29a6
+[413] Valid Stored Dynamic Data
+[416] Hdr=SSL_ESP8266,BrdName=ESP8266
+[420] SSID=HueNet1,PW=12345678
+[423] SSID1=HueNet2,PW1=12345678
+[425] Server=blynk-cloud.com,Token=token1
+[431] Server1=blynk-cloud.com,Token1=token2
+[438] Port=9443
+[439] ======= End Config Data =======
+[442] Check if isForcedCP
+[450] LoadCPFile
+[450] OK
+[450] bg: noConfigPortal = true
+[450] Connecting MultiWifi...
+[6667] WiFi connected after time: 1
+[6667] SSID: HueNet1, RSSI = -46
+[6667] Channel: 2, IP address: 192.168.2.92
+[6668] bg: WiFi OK. Try Blynk
+[6669]
+ ___ __ __
+ / _ )/ /_ _____ / /__
+ / _ / / // / _ \/ '_/
+ /____/_/\_, /_//_/_/\_\
+ /___/ v0.6.1 on NodeMCU
+
+[22695] NTP time: Mon Apr 19 06:36:31 2021
+[22695] BlynkArduinoClient.connect: Connecting to blynk-cloud.com:9443
+[23153] Ready (ping: 1ms).
+[23245] Connected to Blynk Server = blynk-cloud.com, Token = token1
+[23245] bg: WiFi+Blynk OK
+
+Blynk ESP8266 using LittleFS connected.
+Board Name : ESP8266
+Stop multiResetDetecting
+Saving config file...
+Saving config file OK
+B
+Your stored Credentials :
+MQTT Server = default-mqtt-server
+Port = 1883
+MQTT UserName = default-mqtt-username
+MQTT PWD = default-mqtt-password
+Subs Topics = default-mqtt-SubTopic
+Pubs Topics = default-mqtt-PubTopic
+BBBB
+```
+
+---
+
+### 8. ESP32WM_MRD_Config using LITTLEFS with SSL on ESP32S2_DEV
+
+The following is the sample terminal output when running example [ESP32WM_MRD_Config](examples/ESP32WM_MRD_Config) on **ESP8266_NODEMCU**. Please note that this fix the SSL issue with Blynk Cloud Server and runs on new **ESP32-S2 using LittleFS** using esp32 core v1.0.6+ (not official release v1.0.6, but master release as of 2021/04/19).
+
+
+```
+Starting ESP32WM_MRD_Config using LITTLEFS with SSL on ESP32S2_DEV
+Blynk_WM SSL for ESP32 v1.3.0
+ESP_MultiResetDetector v1.1.1
+[134394] Set CustomsStyle to :
+[134417] Set CustomsHeadElement to :
+[134424] Set CORS Header to : Your Access-Control-Allow-Origin
+LittleFS Flag read = 0xFFFE0001
+multiResetDetectorFlag = 0xFFFE0001
+lowerBytes = 0x0001, upperBytes = 0x0001
+No multiResetDetected, number of times = 1
+LittleFS Flag read = 0xFFFE0001
+Saving config file...
+Saving config file OK
+[134657] Hostname=ESP32-Master-Controller
+[134695] LoadCfgFile
+[134700] OK
+[134700] ======= Start Stored Config Data =======
+[134700] Hdr=SSL_ESP32,BrdName=ESP8266
+[134700] SSID=HueNet1,PW=12345678
+[134701] SSID1=HueNet2,PW1=12345678
+[134704] Server=account.duckdns.org,Token=token1
+[134710] Server1=account.duckdns.org,Token1=token2
+[134717] Port=9443
+[134719] ======= End Config Data =======
+[134722] CCSum=0x33eb,RCSum=0x33eb
+[134738] LoadCredFile
+[134742] CrR:pdata=default-mqtt-server,len=34
+[134743] CrR:pdata=1883,len=6
+[134743] CrR:pdata=default-mqtt-username,len=34
+[134743] CrR:pdata=default-mqtt-password,len=34
+[134747] CrR:pdata=default-mqtt-SubTopic,len=34
+[134751] CrR:pdata=default-mqtt-PubTopic,len=34
+[134755] OK
+[134756] CrCCsum=0x29a6,CrRCsum=0x29a6
+[134760] Valid Stored Dynamic Data
+[134763] Hdr=SSL_ESP32,BrdName=ESP8266
+[134766] SSID=HueNet1,PW=12345678
+[134769] SSID1=HueNet2,PW1=12345678
+[134773] Server=account.duckdns.org,Token=token1
+[134779] Server1=account.duckdns.org,Token1=token2
+[134786] Port=9443
+[134787] ======= End Config Data =======
+[134791] Check if isForcedCP
+[134806] LoadCPFile
+[134811] OK
+[134811] bg: noConfigPortal = true
+[134811] Connecting MultiWifi...
+[144534] WiFi connected after time: 1
+[144534] SSID: HueNet1, RSSI = -38
+[144534] Channel: 2, IP address: 192.168.2.157
+[144535] bg: WiFi OK. Try Blynk
+[144536]
+ ___ __ __
+ / _ )/ /_ _____ / /__
+ / _ / / // / _ \/ '_/
+ /____/_/\_, /_//_/_/\_\
+ /___/ v0.6.1 on ESP32
+
+[145549] NTP time: Mon Apr 19 05:11:59 2021
+[145549] BlynkArduinoClient.connect: Connecting to account.duckdns.org:9443
+[146810] Certificate OK
+[146826] Ready (ping: 15ms).
+[146895] Connected to Blynk Server = account.duckdns.org, Token = token1
+[146895] bg: WiFi+Blynk OK
+
+Blynk ESP32 using LittleFS connected
+Board Name : ESP8266
+Stop multiResetDetecting
+Saving config file...
+Saving config file OK
+B
+Your stored Credentials :
+MQTT Server = default-mqtt-server
+Port = 1883
+MQTT UserName = default-mqtt-username
+MQTT PWD = default-mqtt-password
+Subs Topics = default-mqtt-SubTopic
+Pubs Topics = default-mqtt-PubTopic
+```
+
+
---
---
@@ -2338,6 +2580,13 @@ Sometimes, the library will only work if you update the board core to the latest
## Releases
+### Major Releases v1.3.0
+
+1. Add **LittleFS and SPIFFS** support to new **ESP32-S2** boards (**Arduino ESP32C3_DEV**). Check [HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE](#howto-install-esp32-core-for-esp32-s2-saola-ai-thinker-esp-12k-and-esp32-c3-boards-into-arduino-ide).
+2. Add **EEPROM and SPIFFS** support to new **ESP32-C3** boards (**Arduino ESP32C3_DEV**). Check [HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE](#howto-install-esp32-core-for-esp32-s2-saola-ai-thinker-esp-12k-and-esp32-c3-boards-into-arduino-ide).
+3. Fix SSL issue with Blynk Cloud Server
+4. Update examples
+
### Major Releases v1.2.0
1. Configurable **Customs HTML Headers**, including Customs Style, Customs Head Elements, CORS Header.
@@ -2518,14 +2767,16 @@ Submit issues to: [Blynk_WM issues](https://github.com/khoih-prog/Blynk_WM/issue
18. Configurable Config Portal Title
19. Re-structure all examples to separate Credentials / Defines / Dynamic Params / Code so that you can change Credentials / Dynamic Params quickly for each device.
20. Add **LittleFS** support to ESP8266 as SPIFFS deprecated since **ESP8266 core 2.7.1.**
-21. Add **LittleFS** support to ESP32 using [LITTLEFS](https://github.com/lorol/LITTLEFS) Library.\
+21. Add **LittleFS** support to ESP32 using [LITTLEFS](https://github.com/lorol/LITTLEFS) Library.
22. Add support to MultiDetectDetector and MRD-related examples
23. Clean-up all compiler warnings possible.
24. Add Table of Contents
25. Add Version String
26. Add functions to control Config Portal from software or Virtual Switches.
-27. Add support to **ESP32-S2 (ESP32-S2 Saola, AI-Thinker ESP-12K, etc.) using EEPROM**
+27. Add support to **ESP32-S2 (ESP32-S2 Saola, AI-Thinker ESP-12K, etc.) using EEPROM, LittleFS and SPIFFS**
28. Configurable **Customs HTML Headers**, including Customs Style, Customs Head Elements, CORS Header
+29. Add support to **ESP32-C3 using EEPROM and SPIFFS**
+30. Fix SSL issue with Blynk Cloud Server by using SSL in unsecured mode.
---
---
diff --git a/examples/AM2315_ESP32_SSL/AM2315_ESP32_SSL.ino b/examples/AM2315_ESP32_SSL/AM2315_ESP32_SSL.ino
index 6da6c12..f2c34f7 100644
--- a/examples/AM2315_ESP32_SSL/AM2315_ESP32_SSL.ino
+++ b/examples/AM2315_ESP32_SSL/AM2315_ESP32_SSL.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,6 +33,8 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
diff --git a/examples/AM2315_ESP32_SSL/defines.h b/examples/AM2315_ESP32_SSL/defines.h
index 3587522..979f9c7 100644
--- a/examples/AM2315_ESP32_SSL/defines.h
+++ b/examples/AM2315_ESP32_SSL/defines.h
@@ -9,11 +9,33 @@
Licensed under MIT license
*****************************************************************************************************************************/
+/*
+ // To add something similar to this for ESP32-C3
+ #if CONFIG_IDF_TARGET_ESP32
+ const int8_t esp32_adc2gpio[20] = {36, 37, 38, 39, 32, 33, 34, 35, -1, -1, 4, 0, 2, 15, 13, 12, 14, 27, 25, 26};
+ #elif CONFIG_IDF_TARGET_ESP32S2
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #elif CONFIG_IDF_TARGET_ESP32C3
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #endif
+ */
+
#ifndef defines_h
#define defines_h
-#ifndef ESP32
+#if !( defined(ESP32) )
#error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
+#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \
+ ARDUINO_METRO_ESP32S2 || ARDUINO_MAGTAG29_ESP32S2 || ARDUINO_FUNHOUSE_ESP32S2 || \
+ ARDUINO_ADAFRUIT_FEATHER_ESP32S2_NOPSRAM )
+ #define BOARD_TYPE "ESP32-S2"
+#elif ( ARDUINO_ESP32C3_DEV )
+ // https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-gpio.c
+ #warning ESP32-C3 boards not fully supported yet. Only SPIFFS and EEPROM OK. Tempo esp32_adc2gpio to be replaced
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #define BOARD_TYPE "ESP32-C3"
+#else
+ #define BOARD_TYPE "ESP32"
#endif
#define BLYNK_PRINT Serial
@@ -28,11 +50,10 @@
// (USE_LITTLEFS == false) and (USE_SPIFFS == true) => using SPIFFS for configuration data in WiFiManager
// Those above #define's must be placed before #include
-#if ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_PROS2 || ARDUINO_MICROS2 )
- // Currently, ESP32-S2 only supporting EEPROM. Will fix to support LittleFS and SPIFFS
+#if ( ARDUINO_ESP32C3_DEV )
+ // Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
#define USE_LITTLEFS false
- #define USE_SPIFFS false
- #warning ESP32-S2 only support supporting EEPROM now.
+ #define USE_SPIFFS true
#else
#define USE_LITTLEFS true
#define USE_SPIFFS false
diff --git a/examples/AM2315_ESP8266/AM2315_ESP8266.ino b/examples/AM2315_ESP8266/AM2315_ESP8266.ino
index a6d6dcf..f7a5cb3 100644
--- a/examples/AM2315_ESP8266/AM2315_ESP8266.ino
+++ b/examples/AM2315_ESP8266/AM2315_ESP8266.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,6 +33,8 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
diff --git a/examples/Blynk_WM_Template/Blynk_WM_Template.ino b/examples/Blynk_WM_Template/Blynk_WM_Template.ino
index aa72cd8..c18e628 100644
--- a/examples/Blynk_WM_Template/Blynk_WM_Template.ino
+++ b/examples/Blynk_WM_Template/Blynk_WM_Template.ino
@@ -8,7 +8,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -34,6 +34,8 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
// Sketch uses Arduino IDE-selected ESP32 and ESP8266 to select compile choices
@@ -86,6 +88,32 @@
* the BlynkSimpleEsp... and ...WiFiManager libraries, the ESP32 and ESP8266.
*/
+/*
+ // To add something similar to this for ESP32-C3
+ #if CONFIG_IDF_TARGET_ESP32
+ const int8_t esp32_adc2gpio[20] = {36, 37, 38, 39, 32, 33, 34, 35, -1, -1, 4, 0, 2, 15, 13, 12, 14, 27, 25, 26};
+ #elif CONFIG_IDF_TARGET_ESP32S2
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #elif CONFIG_IDF_TARGET_ESP32C3
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #endif
+ */
+
+#if !( defined(ESP32) || defined(ESP8266) )
+ #error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
+#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \
+ ARDUINO_METRO_ESP32S2 || ARDUINO_MAGTAG29_ESP32S2 || ARDUINO_FUNHOUSE_ESP32S2 || \
+ ARDUINO_ADAFRUIT_FEATHER_ESP32S2_NOPSRAM )
+ #define BOARD_TYPE "ESP32-S2"
+#elif ( ARDUINO_ESP32C3_DEV )
+ // https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-gpio.c
+ #warning ESP32-C3 boards not fully supported yet. Only SPIFFS and EEPROM OK. Tempo esp32_adc2gpio to be replaced
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #define BOARD_TYPE "ESP32-C3"
+#else
+ #define BOARD_TYPE "ESP32"
+#endif
+
#define SERIAL_SPEED 230400
#define SKETCH_NAME "Blynk_WM_Template"
@@ -176,11 +204,10 @@
// (USE_LITTLEFS == false) and (USE_SPIFFS == true) => using SPIFFS for configuration data in WiFiManager
// Those above #define's must be placed before #include
- #if ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_PROS2 || ARDUINO_MICROS2 )
- // Currently, ESP32-S2 only supporting EEPROM. Will fix to support LittleFS and SPIFFS
+ #if ( ARDUINO_ESP32C3_DEV )
+ // Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
#define USE_LITTLEFS false
- #define USE_SPIFFS false
- #warning ESP32-S2 only support supporting EEPROM now.
+ #define USE_SPIFFS true
#else
#define USE_LITTLEFS true
#define USE_SPIFFS false
diff --git a/examples/DHT11ESP32/DHT11ESP32.ino b/examples/DHT11ESP32/DHT11ESP32.ino
index 2482aeb..af59c23 100644
--- a/examples/DHT11ESP32/DHT11ESP32.ino
+++ b/examples/DHT11ESP32/DHT11ESP32.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,12 +33,14 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/DHT11ESP32/defines.h b/examples/DHT11ESP32/defines.h
index f8d0759..669d026 100644
--- a/examples/DHT11ESP32/defines.h
+++ b/examples/DHT11ESP32/defines.h
@@ -9,11 +9,33 @@
Licensed under MIT license
*****************************************************************************************************************************/
+/*
+ // To add something similar to this for ESP32-C3
+ #if CONFIG_IDF_TARGET_ESP32
+ const int8_t esp32_adc2gpio[20] = {36, 37, 38, 39, 32, 33, 34, 35, -1, -1, 4, 0, 2, 15, 13, 12, 14, 27, 25, 26};
+ #elif CONFIG_IDF_TARGET_ESP32S2
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #elif CONFIG_IDF_TARGET_ESP32C3
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #endif
+ */
+
#ifndef defines_h
#define defines_h
-#ifndef ESP32
+#if !( defined(ESP32) )
#error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
+#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \
+ ARDUINO_METRO_ESP32S2 || ARDUINO_MAGTAG29_ESP32S2 || ARDUINO_FUNHOUSE_ESP32S2 || \
+ ARDUINO_ADAFRUIT_FEATHER_ESP32S2_NOPSRAM )
+ #define BOARD_TYPE "ESP32-S2"
+#elif ( ARDUINO_ESP32C3_DEV )
+ // https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-gpio.c
+ #warning ESP32-C3 boards not fully supported yet. Only SPIFFS and EEPROM OK. Tempo esp32_adc2gpio to be replaced
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #define BOARD_TYPE "ESP32-C3"
+#else
+ #define BOARD_TYPE "ESP32"
#endif
#define BLYNK_PRINT Serial
@@ -28,11 +50,10 @@
// (USE_LITTLEFS == false) and (USE_SPIFFS == true) => using SPIFFS for configuration data in WiFiManager
// Those above #define's must be placed before #include
-#if ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_PROS2 || ARDUINO_MICROS2 )
- // Currently, ESP32-S2 only supporting EEPROM. Will fix to support LittleFS and SPIFFS
+#if ( ARDUINO_ESP32C3_DEV )
+ // Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
#define USE_LITTLEFS false
- #define USE_SPIFFS false
- #warning ESP32-S2 only support supporting EEPROM now.
+ #define USE_SPIFFS true
#else
#define USE_LITTLEFS true
#define USE_SPIFFS false
diff --git a/examples/DHT11ESP32_SSL/DHT11ESP32_SSL.ino b/examples/DHT11ESP32_SSL/DHT11ESP32_SSL.ino
index 83f6b2b..39eebbc 100644
--- a/examples/DHT11ESP32_SSL/DHT11ESP32_SSL.ino
+++ b/examples/DHT11ESP32_SSL/DHT11ESP32_SSL.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,12 +33,14 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/DHT11ESP32_SSL/defines.h b/examples/DHT11ESP32_SSL/defines.h
index bdb983e..c3e0cb2 100644
--- a/examples/DHT11ESP32_SSL/defines.h
+++ b/examples/DHT11ESP32_SSL/defines.h
@@ -9,11 +9,33 @@
Licensed under MIT license
*****************************************************************************************************************************/
+/*
+ // To add something similar to this for ESP32-C3
+ #if CONFIG_IDF_TARGET_ESP32
+ const int8_t esp32_adc2gpio[20] = {36, 37, 38, 39, 32, 33, 34, 35, -1, -1, 4, 0, 2, 15, 13, 12, 14, 27, 25, 26};
+ #elif CONFIG_IDF_TARGET_ESP32S2
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #elif CONFIG_IDF_TARGET_ESP32C3
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #endif
+ */
+
#ifndef defines_h
#define defines_h
-#ifndef ESP32
+#if !( defined(ESP32) )
#error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
+#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \
+ ARDUINO_METRO_ESP32S2 || ARDUINO_MAGTAG29_ESP32S2 || ARDUINO_FUNHOUSE_ESP32S2 || \
+ ARDUINO_ADAFRUIT_FEATHER_ESP32S2_NOPSRAM )
+ #define BOARD_TYPE "ESP32-S2"
+#elif ( ARDUINO_ESP32C3_DEV )
+ // https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-gpio.c
+ #warning ESP32-C3 boards not fully supported yet. Only SPIFFS and EEPROM OK. Tempo esp32_adc2gpio to be replaced
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #define BOARD_TYPE "ESP32-C3"
+#else
+ #define BOARD_TYPE "ESP32"
#endif
#define BLYNK_PRINT Serial
@@ -28,11 +50,10 @@
// (USE_LITTLEFS == false) and (USE_SPIFFS == true) => using SPIFFS for configuration data in WiFiManager
// Those above #define's must be placed before #include
-#if ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_PROS2 || ARDUINO_MICROS2 )
- // Currently, ESP32-S2 only supporting EEPROM. Will fix to support LittleFS and SPIFFS
+#if ( ARDUINO_ESP32C3_DEV )
+ // Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
#define USE_LITTLEFS false
- #define USE_SPIFFS false
- #warning ESP32-S2 only support supporting EEPROM now.
+ #define USE_SPIFFS true
#else
#define USE_LITTLEFS true
#define USE_SPIFFS false
diff --git a/examples/DHT11ESP8266/DHT11ESP8266.ino b/examples/DHT11ESP8266/DHT11ESP8266.ino
index 16ac6a7..4964659 100644
--- a/examples/DHT11ESP8266/DHT11ESP8266.ino
+++ b/examples/DHT11ESP8266/DHT11ESP8266.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,12 +33,14 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/DHT11ESP8266_Debug/DHT11ESP8266_Debug.ino b/examples/DHT11ESP8266_Debug/DHT11ESP8266_Debug.ino
index 3d27da7..d92a75e 100644
--- a/examples/DHT11ESP8266_Debug/DHT11ESP8266_Debug.ino
+++ b/examples/DHT11ESP8266_Debug/DHT11ESP8266_Debug.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,11 +33,13 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/DHT11ESP8266_SSL/DHT11ESP8266_SSL.ino b/examples/DHT11ESP8266_SSL/DHT11ESP8266_SSL.ino
index 318efec..e419b37 100644
--- a/examples/DHT11ESP8266_SSL/DHT11ESP8266_SSL.ino
+++ b/examples/DHT11ESP8266_SSL/DHT11ESP8266_SSL.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,12 +33,14 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/ESP32WM_Config/ESP32WM_Config.ino b/examples/ESP32WM_Config/ESP32WM_Config.ino
index b1552de..3114764 100644
--- a/examples/ESP32WM_Config/ESP32WM_Config.ino
+++ b/examples/ESP32WM_Config/ESP32WM_Config.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,6 +33,8 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
@@ -40,7 +42,7 @@
#include "dynamicParams.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/ESP32WM_Config/defines.h b/examples/ESP32WM_Config/defines.h
index 28fdd30..a16e62b 100644
--- a/examples/ESP32WM_Config/defines.h
+++ b/examples/ESP32WM_Config/defines.h
@@ -9,11 +9,33 @@
Licensed under MIT license
*****************************************************************************************************************************/
+/*
+ // To add something similar to this for ESP32-C3
+ #if CONFIG_IDF_TARGET_ESP32
+ const int8_t esp32_adc2gpio[20] = {36, 37, 38, 39, 32, 33, 34, 35, -1, -1, 4, 0, 2, 15, 13, 12, 14, 27, 25, 26};
+ #elif CONFIG_IDF_TARGET_ESP32S2
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #elif CONFIG_IDF_TARGET_ESP32C3
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #endif
+ */
+
#ifndef defines_h
#define defines_h
-#ifndef ESP32
+#if !( defined(ESP32) )
#error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
+#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \
+ ARDUINO_METRO_ESP32S2 || ARDUINO_MAGTAG29_ESP32S2 || ARDUINO_FUNHOUSE_ESP32S2 || \
+ ARDUINO_ADAFRUIT_FEATHER_ESP32S2_NOPSRAM )
+ #define BOARD_TYPE "ESP32-S2"
+#elif ( ARDUINO_ESP32C3_DEV )
+ // https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-gpio.c
+ #warning ESP32-C3 boards not fully supported yet. Only SPIFFS and EEPROM OK. Tempo esp32_adc2gpio to be replaced
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #define BOARD_TYPE "ESP32-C3"
+#else
+ #define BOARD_TYPE "ESP32"
#endif
#define BLYNK_PRINT Serial
@@ -25,17 +47,15 @@
// (USE_LITTLEFS == false) and (USE_SPIFFS == true) => using SPIFFS for configuration data in WiFiManager
// Those above #define's must be placed before #include
-#if ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_PROS2 || ARDUINO_MICROS2 )
- // Currently, ESP32-S2 only supporting EEPROM. Will fix to support LittleFS and SPIFFS
+#if ( ARDUINO_ESP32C3_DEV )
+ // Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
#define USE_LITTLEFS false
- #define USE_SPIFFS false
- #warning ESP32-S2 only support supporting EEPROM now.
+ #define USE_SPIFFS true
#else
#define USE_LITTLEFS true
#define USE_SPIFFS false
#endif
-
#if !( USE_SPIFFS || USE_LITTLEFS)
// EEPROM_SIZE must be <= 2048 and >= CONFIG_DATA_SIZE (currently 172 bytes)
#define EEPROM_SIZE (2 * 1024)
diff --git a/examples/ESP32WM_ForcedConfig/ESP32WM_ForcedConfig.ino b/examples/ESP32WM_ForcedConfig/ESP32WM_ForcedConfig.ino
index 7a1abce..04b16fd 100644
--- a/examples/ESP32WM_ForcedConfig/ESP32WM_ForcedConfig.ino
+++ b/examples/ESP32WM_ForcedConfig/ESP32WM_ForcedConfig.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,6 +33,8 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
@@ -40,7 +42,7 @@
#include "dynamicParams.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/ESP32WM_ForcedConfig/defines.h b/examples/ESP32WM_ForcedConfig/defines.h
index ad67495..7910f7a 100644
--- a/examples/ESP32WM_ForcedConfig/defines.h
+++ b/examples/ESP32WM_ForcedConfig/defines.h
@@ -9,11 +9,33 @@
Licensed under MIT license
*****************************************************************************************************************************/
+/*
+ // To add something similar to this for ESP32-C3
+ #if CONFIG_IDF_TARGET_ESP32
+ const int8_t esp32_adc2gpio[20] = {36, 37, 38, 39, 32, 33, 34, 35, -1, -1, 4, 0, 2, 15, 13, 12, 14, 27, 25, 26};
+ #elif CONFIG_IDF_TARGET_ESP32S2
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #elif CONFIG_IDF_TARGET_ESP32C3
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #endif
+ */
+
#ifndef defines_h
#define defines_h
-#ifndef ESP32
+#if !( defined(ESP32) )
#error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
+#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \
+ ARDUINO_METRO_ESP32S2 || ARDUINO_MAGTAG29_ESP32S2 || ARDUINO_FUNHOUSE_ESP32S2 || \
+ ARDUINO_ADAFRUIT_FEATHER_ESP32S2_NOPSRAM )
+ #define BOARD_TYPE "ESP32-S2"
+#elif ( ARDUINO_ESP32C3_DEV )
+ // https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-gpio.c
+ #warning ESP32-C3 boards not fully supported yet. Only SPIFFS and EEPROM OK. Tempo esp32_adc2gpio to be replaced
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #define BOARD_TYPE "ESP32-C3"
+#else
+ #define BOARD_TYPE "ESP32"
#endif
#define BLYNK_PRINT Serial
@@ -26,11 +48,10 @@
// (USE_LITTLEFS == false) and (USE_SPIFFS == true) => using SPIFFS for configuration data in WiFiManager
// Those above #define's must be placed before #include
-#if ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_PROS2 || ARDUINO_MICROS2 )
- // Currently, ESP32-S2 only supporting EEPROM. Will fix to support LittleFS and SPIFFS
+#if ( ARDUINO_ESP32C3_DEV )
+ // Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
#define USE_LITTLEFS false
- #define USE_SPIFFS false
- #warning ESP32-S2 only support supporting EEPROM now.
+ #define USE_SPIFFS true
#else
#define USE_LITTLEFS true
#define USE_SPIFFS false
diff --git a/examples/ESP32WM_MRD_Config/ESP32WM_MRD_Config.ino b/examples/ESP32WM_MRD_Config/ESP32WM_MRD_Config.ino
index 3fedf8b..5ce3565 100644
--- a/examples/ESP32WM_MRD_Config/ESP32WM_MRD_Config.ino
+++ b/examples/ESP32WM_MRD_Config/ESP32WM_MRD_Config.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,6 +33,8 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
@@ -40,7 +42,7 @@
#include "dynamicParams.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
@@ -126,7 +128,11 @@ void setup()
Serial.begin(115200);
while (!Serial);
+#if ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_PROS2 || ARDUINO_MICROS2 )
+ delay(2000);
+#else
delay(200);
+#endif
#if (USE_LITTLEFS)
Serial.print(F("\nStarting ESP32WM_MRD_Config using LITTLEFS"));
diff --git a/examples/ESP32WM_MRD_Config/defines.h b/examples/ESP32WM_MRD_Config/defines.h
index 0ccc5db..cb5bf06 100644
--- a/examples/ESP32WM_MRD_Config/defines.h
+++ b/examples/ESP32WM_MRD_Config/defines.h
@@ -9,11 +9,33 @@
Licensed under MIT license
********************************************************************************************************************************/
+/*
+ // To add something similar to this for ESP32-C3
+ #if CONFIG_IDF_TARGET_ESP32
+ const int8_t esp32_adc2gpio[20] = {36, 37, 38, 39, 32, 33, 34, 35, -1, -1, 4, 0, 2, 15, 13, 12, 14, 27, 25, 26};
+ #elif CONFIG_IDF_TARGET_ESP32S2
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #elif CONFIG_IDF_TARGET_ESP32C3
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #endif
+ */
+
#ifndef defines_h
#define defines_h
-#ifndef ESP32
+#if !( defined(ESP32) )
#error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
+#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \
+ ARDUINO_METRO_ESP32S2 || ARDUINO_MAGTAG29_ESP32S2 || ARDUINO_FUNHOUSE_ESP32S2 || \
+ ARDUINO_ADAFRUIT_FEATHER_ESP32S2_NOPSRAM )
+ #define BOARD_TYPE "ESP32-S2"
+#elif ( ARDUINO_ESP32C3_DEV )
+ // https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-gpio.c
+ #warning ESP32-C3 boards not fully supported yet. Only SPIFFS and EEPROM OK. Tempo esp32_adc2gpio to be replaced
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #define BOARD_TYPE "ESP32-C3"
+#else
+ #define BOARD_TYPE "ESP32"
#endif
#define BLYNK_PRINT Serial
@@ -60,11 +82,10 @@
// (USE_LITTLEFS == false) and (USE_SPIFFS == true) => using SPIFFS for configuration data in WiFiManager
// Those above #define's must be placed before #include
-#if ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_PROS2 || ARDUINO_MICROS2 )
- // Currently, ESP32-S2 only supporting EEPROM. Will fix to support LittleFS and SPIFFS
+#if ( ARDUINO_ESP32C3_DEV )
+ // Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
#define USE_LITTLEFS false
- #define USE_SPIFFS false
- #warning ESP32-S2 only support supporting EEPROM now.
+ #define USE_SPIFFS true
#else
#define USE_LITTLEFS true
#define USE_SPIFFS false
diff --git a/examples/ESP32WM_MRD_ForcedConfig/ESP32WM_MRD_ForcedConfig.ino b/examples/ESP32WM_MRD_ForcedConfig/ESP32WM_MRD_ForcedConfig.ino
index 2b8a28d..13a7d85 100644
--- a/examples/ESP32WM_MRD_ForcedConfig/ESP32WM_MRD_ForcedConfig.ino
+++ b/examples/ESP32WM_MRD_ForcedConfig/ESP32WM_MRD_ForcedConfig.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,6 +33,8 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
@@ -40,7 +42,7 @@
#include "dynamicParams.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/ESP32WM_MRD_ForcedConfig/defines.h b/examples/ESP32WM_MRD_ForcedConfig/defines.h
index 0ccc5db..bfa21a8 100644
--- a/examples/ESP32WM_MRD_ForcedConfig/defines.h
+++ b/examples/ESP32WM_MRD_ForcedConfig/defines.h
@@ -9,13 +9,34 @@
Licensed under MIT license
********************************************************************************************************************************/
+/*
+ // To add something similar to this for ESP32-C3
+ #if CONFIG_IDF_TARGET_ESP32
+ const int8_t esp32_adc2gpio[20] = {36, 37, 38, 39, 32, 33, 34, 35, -1, -1, 4, 0, 2, 15, 13, 12, 14, 27, 25, 26};
+ #elif CONFIG_IDF_TARGET_ESP32S2
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #elif CONFIG_IDF_TARGET_ESP32C3
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #endif
+ */
+
#ifndef defines_h
#define defines_h
-#ifndef ESP32
+#if !( defined(ESP32) )
#error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
+#elif ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_ESP32S2_THING_PLUS || ARDUINO_MICROS2 || \
+ ARDUINO_METRO_ESP32S2 || ARDUINO_MAGTAG29_ESP32S2 || ARDUINO_FUNHOUSE_ESP32S2 || \
+ ARDUINO_ADAFRUIT_FEATHER_ESP32S2_NOPSRAM )
+ #define BOARD_TYPE "ESP32-S2"
+#elif ( ARDUINO_ESP32C3_DEV )
+ // https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-gpio.c
+ #warning ESP32-C3 boards not fully supported yet. Only SPIFFS and EEPROM OK. Tempo esp32_adc2gpio to be replaced
+ const int8_t esp32_adc2gpio[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+ #define BOARD_TYPE "ESP32-C3"
+#else
+ #define BOARD_TYPE "ESP32"
#endif
-
#define BLYNK_PRINT Serial
#define BLYNK_WM_DEBUG 3
@@ -60,11 +81,10 @@
// (USE_LITTLEFS == false) and (USE_SPIFFS == true) => using SPIFFS for configuration data in WiFiManager
// Those above #define's must be placed before #include
-#if ( ARDUINO_ESP32S2_DEV || ARDUINO_FEATHERS2 || ARDUINO_PROS2 || ARDUINO_MICROS2 )
- // Currently, ESP32-S2 only supporting EEPROM. Will fix to support LittleFS and SPIFFS
+#if ( ARDUINO_ESP32C3_DEV )
+ // Currently, ESP32-C3 only supporting SPIFFS and EEPROM. Will fix to support LittleFS
#define USE_LITTLEFS false
- #define USE_SPIFFS false
- #warning ESP32-S2 only support supporting EEPROM now.
+ #define USE_SPIFFS true
#else
#define USE_LITTLEFS true
#define USE_SPIFFS false
diff --git a/examples/ESP8266WM_Config/ESP8266WM_Config.ino b/examples/ESP8266WM_Config/ESP8266WM_Config.ino
index 4761ff6..f3b65b9 100644
--- a/examples/ESP8266WM_Config/ESP8266WM_Config.ino
+++ b/examples/ESP8266WM_Config/ESP8266WM_Config.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,6 +33,8 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
@@ -40,7 +42,7 @@
#include "dynamicParams.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/ESP8266WM_Config/defines.h b/examples/ESP8266WM_Config/defines.h
index 809d478..3827e85 100644
--- a/examples/ESP8266WM_Config/defines.h
+++ b/examples/ESP8266WM_Config/defines.h
@@ -13,7 +13,7 @@
#define defines_h
#ifndef ESP8266
- #error This code is intended to run on the ESP8266 platform! Please check your Tools->Board setting.
+#error This code is intended to run on the ESP8266 platform! Please check your Tools->Board setting.
#endif
#define BLYNK_PRINT Serial
@@ -32,22 +32,22 @@
#define USE_SPIFFS false
#if USE_LITTLEFS
- //LittleFS has higher priority
- #define CurrentFileFS "LittleFS"
- #ifdef USE_SPIFFS
- #undef USE_SPIFFS
- #endif
- #define USE_SPIFFS false
+//LittleFS has higher priority
+#define CurrentFileFS "LittleFS"
+#ifdef USE_SPIFFS
+#undef USE_SPIFFS
+#endif
+#define USE_SPIFFS false
#elif USE_SPIFFS
- #define CurrentFileFS "SPIFFS"
+#define CurrentFileFS "SPIFFS"
#endif
#if !( USE_LITTLEFS || USE_SPIFFS)
- // EEPROM_SIZE must be <= 4096 and >= CONFIG_DATA_SIZE (currently 172 bytes)
- #define EEPROM_SIZE (4 * 1024)
- // EEPROM_START + CONFIG_DATA_SIZE must be <= EEPROM_SIZE
- #define EEPROM_START 768
+// EEPROM_SIZE must be <= 4096 and >= CONFIG_DATA_SIZE (currently 172 bytes)
+#define EEPROM_SIZE (4 * 1024)
+// EEPROM_START + CONFIG_DATA_SIZE must be <= EEPROM_SIZE
+#define EEPROM_START 768
#endif
/////////////////////////////////////////////
@@ -75,9 +75,9 @@
#define USE_SSL false
#if USE_SSL
- #include
+#include
#else
- #include
+#include
#endif
#define PIN_LED 2 // Pin D4 mapped to pin GPIO2/TXD1 of ESP8266, NodeMCU and WeMoS, control on-board LED
diff --git a/examples/ESP8266WM_ForcedConfig/ESP8266WM_ForcedConfig.ino b/examples/ESP8266WM_ForcedConfig/ESP8266WM_ForcedConfig.ino
index fda1a3f..9da7c62 100644
--- a/examples/ESP8266WM_ForcedConfig/ESP8266WM_ForcedConfig.ino
+++ b/examples/ESP8266WM_ForcedConfig/ESP8266WM_ForcedConfig.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,6 +33,8 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
*****************************************************************************************************************************/
#include "defines.h"
@@ -40,7 +42,7 @@
#include "dynamicParams.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/ESP8266WM_MRD_Config/ESP8266WM_MRD_Config.ino b/examples/ESP8266WM_MRD_Config/ESP8266WM_MRD_Config.ino
index ec0c172..3d07a9c 100644
--- a/examples/ESP8266WM_MRD_Config/ESP8266WM_MRD_Config.ino
+++ b/examples/ESP8266WM_MRD_Config/ESP8266WM_MRD_Config.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.2.0
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -33,6 +33,8 @@
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
********************************************************************************************************************************/
#include "defines.h"
@@ -40,7 +42,7 @@
#include "dynamicParams.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/examples/ESP8266WM_MRD_ForcedConfig/ESP8266WM_MRD_ForcedConfig.ino b/examples/ESP8266WM_MRD_ForcedConfig/ESP8266WM_MRD_ForcedConfig.ino
index 7abd1e1..4d7a0c5 100644
--- a/examples/ESP8266WM_MRD_ForcedConfig/ESP8266WM_MRD_ForcedConfig.ino
+++ b/examples/ESP8266WM_MRD_ForcedConfig/ESP8266WM_MRD_ForcedConfig.ino
@@ -7,7 +7,7 @@
Forked from Blynk library v0.6.1 https://github.com/blynkkk/blynk-library/releases
Built by Khoi Hoang https://github.com/khoih-prog/Blynk_WM
Licensed under MIT license
- Version: 1.1.3
+ Version: 1.3.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -32,6 +32,9 @@
1.1.1 K Hoang 16/01/2021 Add functions to control Config Portal from software or Virtual Switches
1.1.2 K Hoang 28/01/2021 Fix Config Portal and Dynamic Params bugs
1.1.3 K Hoang 31/01/2021 To permit autoreset after timeout if DRD/MRD or non-persistent forced-CP
+ 1.2.0 K Hoang 24/02/2021 Add customs HTML header feature and support to ESP32-S2.
+ 1.3.0 K Hoang 19/04/2021 Add LittleFS and SPIFFS support to ESP32-S2. Add support to ESP32-C3 without LittleFS
+ Fix SSL issue with Blynk Cloud Server
********************************************************************************************************************************/
#include "defines.h"
@@ -39,7 +42,7 @@
#include "dynamicParams.h"
#include
-#include
+#include // https://github.com/adafruit/DHT-sensor-library
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
diff --git a/pics/Blynk_ESP32_C3_Support.png b/pics/Blynk_ESP32_C3_Support.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8d1b2264859fd5e41b0a8921eb520feeff2ce5b
GIT binary patch
literal 99560
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