From 3754088a44989190dcbfc98ba1a5910e3d091c36 Mon Sep 17 00:00:00 2001
From: srg74 <28492985+srg74@users.noreply.github.com>
Date: Thu, 1 Jul 2021 06:05:02 -0400
Subject: [PATCH] Updated [env] for Universal Wemos Shield board (#2049)
* Added support for H803FW controller
* Create usermod_bme280.cpp
* Create usermod_bme280.cpp
* Added BME280 sensor
* Update readme.md
* Update usermod_bme280.cpp
* Update platformio.ini
* Update for lightweight sensor
* Added travis build badge
* Update readme.md
* Update readme.md
* Update .gitignore
* Changed ldscript for a file system
* Update NpbWrapper.h
* Update .gitignore
* Delete wled-ci.yml
* Added usermod for ST7789 display
Functionality tested with ESP32. Works with main WLED and @blazoncek fork.
* fixes
* Update .gitignore
* Firmware updates!!!
Updated official @Aircoookie firmware to v0.12.0-b4 build 2103290 and developer @blazoncek firmware to latest v0.12.0-b3 build 2103282.
* Updated platformio.ini for Universal Wemos Shield board
---
platformio.ini | 17 +-
readme.md | 1 -
usermods/ST7789_display/README.md | 72 ++++
usermods/ST7789_display/ST7789_display.h | 350 ++++++++++++++++++
.../ST7789_display/Setup_ST7789_Display.h | 39 ++
.../ST7789_display/images/ST7789_Guide.jpg | Bin 0 -> 179304 bytes
6 files changed, 475 insertions(+), 4 deletions(-)
create mode 100644 usermods/ST7789_display/README.md
create mode 100644 usermods/ST7789_display/ST7789_display.h
create mode 100644 usermods/ST7789_display/Setup_ST7789_Display.h
create mode 100644 usermods/ST7789_display/images/ST7789_Guide.jpg
diff --git a/platformio.ini b/platformio.ini
index 7b50f693..5002cc89 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -417,11 +417,21 @@ lib_ignore =
[env:wemos_shield_esp32]
board = esp32dev
platform = espressif32@3.2
-upload_port = /dev/cu.SLAB_USBtoUART
-monitor_port = /dev/cu.SLAB_USBtoUART
upload_speed = 460800
build_unflags = ${common.build_unflags}
-build_flags = ${common.build_flags_esp32} -D LEDPIN=16 -D RLYPIN=19 -D BTNPIN=17
+build_flags = ${common.build_flags_esp32}
+ -D LEDPIN=16
+ -D RLYPIN=19
+ -D BTNPIN=17
+ -D UWLED_USE_MY_CONFIG
+; -D USERMOD_DALLASTEMPERATURE
+; -D USERMOD_DALLASTEMPERATURE_CELCIUS
+; -D USERMOD_FOUR_LINE_DISPLAY
+; -D TEMPERATURE_PIN=21
+lib_deps = ${env.lib_deps}
+; OneWire@~2.3.5
+; milesburton/DallasTemperature@^3.9.0
+; U8g2@~2.27.2
lib_ignore =
ESPAsyncTCP
ESPAsyncUDP
@@ -511,3 +521,4 @@ monitor_filters = esp32_exception_decoder
lib_ignore =
ESPAsyncTCP
ESPAsyncUDP
+
\ No newline at end of file
diff --git a/readme.md b/readme.md
index 9cee21f3..c3f5987e 100644
--- a/readme.md
+++ b/readme.md
@@ -9,7 +9,6 @@
-
# Welcome to my project WLED! ✨
A fast and feature-rich implementation of an ESP8266/ESP32 webserver to control NeoPixel (WS2812B, WS2811, SK6812) LEDs or also SPI based chipsets like the WS2801 and APA102!
diff --git a/usermods/ST7789_display/README.md b/usermods/ST7789_display/README.md
new file mode 100644
index 00000000..653fdd75
--- /dev/null
+++ b/usermods/ST7789_display/README.md
@@ -0,0 +1,72 @@
+# ST7789 TFT IPS Color display 240x240pxwith ESP32 boards
+
+This usermod allow to use 240x240 display to display following:
+
+* Network SSID;
+* IP address;
+* Brightness;
+* Chosen effect;
+* Chosen palette;
+* Estimated current in mA;
+
+## Hardware
+
+***
+![Hardware](images/ST7789_guide.jpg)
+
+## Library used
+
+[Bodmer/TFT_eSPI](https://github.com/Bodmer/TFT_eSPI)
+
+## Setup
+
+***
+
+### Platformio.ini changes
+
+In the `platformio.ini` file, uncomment the `TFT_eSPI` line within the [common] section, under `lib_deps`:
+
+```ini
+# platformio.ini
+...
+[common]
+...
+lib_deps =
+ ...
+ #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line
+ #TFT_eSPI
+...
+```
+
+Also, while in the `platformio.ini` file, you must change the environment setup to build for just the esp32dev platform as follows:
+
+Add lines to section:
+
+```ini
+default_envs = esp32dev
+build_flags = ${common.build_flags_esp32}
+ -D USERMOD_ST7789_DISPLAY
+
+```
+
+Save the `platformio.ini` file. Once this is saved, the required library files should be automatically downloaded for modifications in a later step.
+
+### TFT_eSPI Library Adjustments
+
+We need to modify a file in the `TFT_eSPI` library. If you followed the directions to modify and save the `platformio.ini` file above, the `User_Setup_Select.h` file can be found in the `/.pio/libdeps/esp32dev/TFT_eSPI` folder.
+
+Modify the `User_Setup_Select.h` file as follows:
+
+* Comment out the following line (which is the 'default' setup file):
+
+```ini
+//#include // Default setup is root library folder
+```
+
+* Add following line:
+
+```ini
+#include // Setup file for ESP32 ST7789V SPI bus TFT
+```
+
+* Copy file `"Setup_ST7789_Display.h"` from usermod folder to `/.pio/libdeps/esp32dev/TFT_eSPI/User_Setups`
diff --git a/usermods/ST7789_display/ST7789_display.h b/usermods/ST7789_display/ST7789_display.h
new file mode 100644
index 00000000..bd501d08
--- /dev/null
+++ b/usermods/ST7789_display/ST7789_display.h
@@ -0,0 +1,350 @@
+// Credits to @mrVanboy, @gwaland and my dearest friend @westward
+// Also for @spiff72 for usermod TTGO-T-Display
+// 210217
+#pragma once
+
+#include "wled.h"
+#include
+#include
+
+#define USERMOD_ST7789_DISPLAY 97
+
+#ifndef TFT_DISPOFF
+#define TFT_DISPOFF 0x28
+#endif
+
+#ifndef TFT_SLPIN
+#define TFT_SLPIN 0x10
+#endif
+
+#define TFT_MOSI 21
+#define TFT_SCLK 22
+#define TFT_DC 18
+#define TFT_RST 5
+#define TFT_BL 26 // Display backlight control pin
+
+TFT_eSPI tft = TFT_eSPI(240, 240); // Invoke custom library
+
+// How often we are redrawing screen
+#define USER_LOOP_REFRESH_RATE_MS 1000
+
+
+//class name. Use something descriptive and leave the ": public Usermod" part :)
+class St7789DisplayUsermod : public Usermod {
+ private:
+ //Private class members. You can declare variables and functions only accessible to your usermod here
+ unsigned long lastTime = 0;
+
+ bool displayTurnedOff = false;
+ long lastRedraw = 0;
+ // needRedraw marks if redraw is required to prevent often redrawing.
+ bool needRedraw = true;
+ // Next variables hold the previous known values to determine if redraw is required.
+ String knownSsid = "";
+ IPAddress knownIp;
+ uint8_t knownBrightness = 0;
+ uint8_t knownMode = 0;
+ uint8_t knownPalette = 0;
+ uint8_t tftcharwidth = 19; // Number of chars that fit on screen with text size set to 2
+ long lastUpdate = 0;
+
+ public:
+ //Functions called by WLED
+
+ /*
+ * setup() is called once at boot. WiFi is not yet connected at this point.
+ * You can use it to initialize variables, sensors or similar.
+ */
+ void setup()
+ {
+ tft.init();
+ tft.setRotation(0); //Rotation here is set up for the text to be readable with the port on the left. Use 1 to flip.
+ tft.fillScreen(TFT_BLACK);
+ tft.setTextColor(TFT_RED);
+ tft.setCursor(60, 100);
+ tft.setTextDatum(MC_DATUM);
+ tft.setTextSize(2);
+ tft.print("Loading...");
+ if (TFT_BL > 0)
+ { // TFT_BL has been set in the TFT_eSPI library
+ pinMode(TFT_BL, OUTPUT); // Set backlight pin to output mode
+ digitalWrite(TFT_BL, HIGH); // Turn backlight on.
+ }
+ }
+
+ /*
+ * connected() is called every time the WiFi is (re)connected
+ * Use it to initialize network interfaces
+ */
+ void connected() {
+ //Serial.println("Connected to WiFi!");
+ }
+
+ /*
+ * loop() is called continuously. Here you can check for events, read sensors, etc.
+ *
+ * Tips:
+ * 1. You can use "if (WLED_CONNECTED)" to check for a successful network connection.
+ * Additionally, "if (WLED_MQTT_CONNECTED)" is available to check for a connection to an MQTT broker.
+ *
+ * 2. Try to avoid using the delay() function. NEVER use delays longer than 10 milliseconds.
+ * Instead, use a timer check as shown here.
+ */
+ void loop() {
+// Check if we time interval for redrawing passes.
+ if (millis() - lastUpdate < USER_LOOP_REFRESH_RATE_MS)
+ {
+ return;
+ }
+ lastUpdate = millis();
+
+// Turn off display after 5 minutes with no change.
+ if(!displayTurnedOff && millis() - lastRedraw > 5*60*1000)
+ {
+ digitalWrite(TFT_BL, LOW); // Turn backlight off.
+ displayTurnedOff = true;
+ }
+
+// Check if values which are shown on display changed from the last time.
+ if (((apActive) ? String(apSSID) : WiFi.SSID()) != knownSsid)
+ {
+ needRedraw = true;
+ }
+ else if (knownIp != (apActive ? IPAddress(4, 3, 2, 1) : WiFi.localIP()))
+ {
+ needRedraw = true;
+ }
+ else if (knownBrightness != bri)
+ {
+ needRedraw = true;
+ }
+ else if (knownMode != strip.getMode())
+ {
+ needRedraw = true;
+ }
+ else if (knownPalette != strip.getSegment(0).palette)
+ {
+ needRedraw = true;
+ }
+
+ if (!needRedraw)
+ {
+ return;
+ }
+ needRedraw = false;
+
+ if (displayTurnedOff)
+ {
+ digitalWrite(TFT_BL, TFT_BACKLIGHT_ON); // Turn backlight on.
+ displayTurnedOff = false;
+ }
+ lastRedraw = millis();
+
+// Update last known values.
+ #if defined(ESP8266)
+ knownSsid = apActive ? WiFi.softAPSSID() : WiFi.SSID();
+ #else
+ knownSsid = WiFi.SSID();
+ #endif
+ knownIp = apActive ? IPAddress(4, 3, 2, 1) : WiFi.localIP();
+ knownBrightness = bri;
+ knownMode = strip.getMode();
+ knownPalette = strip.getSegment(0).palette;
+
+ tft.fillScreen(TFT_BLACK);
+ tft.setTextSize(2);
+// First row with Wifi name
+ tft.setTextColor(TFT_SILVER);
+ tft.setCursor(3, 40);
+ tft.print(knownSsid.substring(0, tftcharwidth > 1 ? tftcharwidth - 1 : 0));
+// Print `~` char to indicate that SSID is longer, than our dicplay
+ if (knownSsid.length() > tftcharwidth)
+ tft.print("~");
+
+// Second row with AP IP and Password or IP
+ tft.setTextColor(TFT_GREEN);
+ tft.setTextSize(2);
+ tft.setCursor(3, 64);
+// Print AP IP and password in AP mode or knownIP if AP not active.
+
+ if (apActive)
+ {
+ tft.setTextColor(TFT_YELLOW);
+ tft.print("AP IP: ");
+ tft.print(knownIp);
+ tft.setCursor(3,86);
+ tft.setTextColor(TFT_YELLOW);
+ tft.print("AP Pass:");
+ tft.print(apPass);
+ }
+ else
+ {
+ tft.setTextColor(TFT_GREEN);
+ tft.print("IP: ");
+ tft.print(knownIp);
+ tft.setCursor(3,86);
+ //tft.print("Signal Strength: ");
+ //tft.print(i.wifi.signal);
+ tft.setTextColor(TFT_WHITE);
+ tft.print("Bri: ");
+ tft.print(((float(bri)/255)*100),0);
+ tft.print("%");
+ }
+
+// Third row with mode name
+ tft.setCursor(3, 108);
+ uint8_t qComma = 0;
+ bool insideQuotes = false;
+ uint8_t printedChars = 0;
+ char singleJsonSymbol;
+// Find the mode name in JSON
+ for (size_t i = 0; i < strlen_P(JSON_mode_names); i++)
+ {
+ singleJsonSymbol = pgm_read_byte_near(JSON_mode_names + i);
+ switch (singleJsonSymbol)
+ {
+ case '"':
+ insideQuotes = !insideQuotes;
+ break;
+ case '[':
+ case ']':
+ break;
+ case ',':
+ qComma++;
+ default:
+ if (!insideQuotes || (qComma != knownMode))
+ break;
+ tft.setTextColor(TFT_MAGENTA);
+ tft.print(singleJsonSymbol);
+ printedChars++;
+ }
+ if ((qComma > knownMode) || (printedChars > tftcharwidth - 1))
+ break;
+ }
+// Fourth row with palette name
+ tft.setTextColor(TFT_YELLOW);
+ tft.setCursor(3, 130);
+ qComma = 0;
+ insideQuotes = false;
+ printedChars = 0;
+// Looking for palette name in JSON.
+ for (size_t i = 0; i < strlen_P(JSON_palette_names); i++)
+ {
+ singleJsonSymbol = pgm_read_byte_near(JSON_palette_names + i);
+ switch (singleJsonSymbol)
+ {
+ case '"':
+ insideQuotes = !insideQuotes;
+ break;
+ case '[':
+ case ']':
+ break;
+ case ',':
+ qComma++;
+ default:
+ if (!insideQuotes || (qComma != knownPalette))
+ break;
+ tft.print(singleJsonSymbol);
+ printedChars++;
+ }
+// The following is modified from the code from the u8g2/u8g8 based code (knownPalette was knownMode)
+ if ((qComma > knownPalette) || (printedChars > tftcharwidth - 1))
+ break;
+ }
+// Fifth row with estimated mA usage
+ tft.setTextColor(TFT_SILVER);
+ tft.setCursor(3, 152);
+// Print estimated milliamp usage (must specify the LED type in LED prefs for this to be a reasonable estimate).
+ tft.print("Current: ");
+ tft.print(strip.currentMilliamps);
+ tft.print("mA");
+ }
+ /*
+ * addToJsonInfo() can be used to add custom entries to the /json/info part of the JSON API.
+ * Creating an "u" object allows you to add custom key/value pairs to the Info section of the WLED web UI.
+ * Below it is shown how this could be used for e.g. a light sensor
+ */
+ /*
+ void addToJsonInfo(JsonObject& root)
+ {
+ int reading = 20;
+ //this code adds "u":{"Light":[20," lux"]} to the info object
+ JsonObject user = root["u"];
+ if (user.isNull()) user = root.createNestedObject("u");
+
+ JsonArray lightArr = user.createNestedArray("Light"); //name
+ lightArr.add(reading); //value
+ lightArr.add(" lux"); //unit
+ }
+ */
+
+
+ /*
+ * addToJsonState() can be used to add custom entries to the /json/state part of the JSON API (state object).
+ * Values in the state object may be modified by connected clients
+ */
+ void addToJsonState(JsonObject& root)
+ {
+ //root["user0"] = userVar0;
+ }
+
+
+ /*
+ * readFromJsonState() can be used to receive data clients send to the /json/state part of the JSON API (state object).
+ * Values in the state object may be modified by connected clients
+ */
+ void readFromJsonState(JsonObject& root)
+ {
+ userVar0 = root["user0"] | userVar0; //if "user0" key exists in JSON, update, else keep old value
+ //if (root["bri"] == 255) Serial.println(F("Don't burn down your garage!"));
+ }
+
+
+ /*
+ * addToConfig() can be used to add custom persistent settings to the cfg.json file in the "um" (usermod) object.
+ * It will be called by WLED when settings are actually saved (for example, LED settings are saved)
+ * If you want to force saving the current state, use serializeConfig() in your loop().
+ *
+ * CAUTION: serializeConfig() will initiate a filesystem write operation.
+ * It might cause the LEDs to stutter and will cause flash wear if called too often.
+ * Use it sparingly and always in the loop, never in network callbacks!
+ *
+ * addToConfig() will also not yet add your setting to one of the settings pages automatically.
+ * To make that work you still have to add the setting to the HTML, xml.cpp and set.cpp manually.
+ *
+ * I highly recommend checking out the basics of ArduinoJson serialization and deserialization in order to use custom settings!
+ */
+ void addToConfig(JsonObject& root)
+ {
+ JsonObject top = root.createNestedObject("exampleUsermod");
+ top["great"] = userVar0; //save this var persistently whenever settings are saved
+ }
+
+
+ /*
+ * readFromConfig() can be used to read back the custom settings you added with addToConfig().
+ * This is called by WLED when settings are loaded (currently this only happens once immediately after boot)
+ *
+ * readFromConfig() is called BEFORE setup(). This means you can use your persistent values in setup() (e.g. pin assignments, buffer sizes),
+ * but also that if you want to write persistent values to a dynamic buffer, you'd need to allocate it here instead of in setup.
+ * If you don't know what that is, don't fret. It most likely doesn't affect your use case :)
+ */
+ void readFromConfig(JsonObject& root)
+ {
+ JsonObject top = root["top"];
+ userVar0 = top["great"] | 42; //The value right of the pipe "|" is the default value in case your setting was not present in cfg.json (e.g. first boot)
+ }
+
+
+ /*
+ * getId() allows you to optionally give your V2 usermod an unique ID (please define it in const.h!).
+ * This could be used in the future for the system to determine whether your usermod is installed.
+ */
+ uint16_t getId()
+ {
+ return USERMOD_ST7789_DISPLAY;
+ }
+
+ //More methods can be added in the future, this example will then be extended.
+ //Your usermod will remain compatible as it does not need to implement all methods from the Usermod base class!
+};
\ No newline at end of file
diff --git a/usermods/ST7789_display/Setup_ST7789_Display.h b/usermods/ST7789_display/Setup_ST7789_Display.h
new file mode 100644
index 00000000..26d5c17f
--- /dev/null
+++ b/usermods/ST7789_display/Setup_ST7789_Display.h
@@ -0,0 +1,39 @@
+// Setup for the ESP32 board with 1.5" 240x240 display
+
+// See SetupX_Template.h for all options available
+
+#define ST7789_DRIVER
+#define TFT_SDA_READ // Display has a bidirectionsl SDA pin
+
+#define TFT_WIDTH 240
+#define TFT_HEIGHT 240
+
+#define CGRAM_OFFSET // Library will add offsets required
+
+//#define TFT_MISO -1
+
+#define TFT_MOSI 21
+#define TFT_SCLK 22
+//#define TFT_CS 5
+#define TFT_DC 18
+#define TFT_RST 5
+
+#define TFT_BL 26 // Display backlight control pin
+
+#define TFT_BACKLIGHT_ON HIGH // HIGH or LOW are options
+
+#define LOAD_GLCD
+#define LOAD_FONT2
+#define LOAD_FONT4
+#define LOAD_FONT6
+#define LOAD_FONT7
+#define LOAD_FONT8
+#define LOAD_GFXFF
+
+//#define SMOOTH_FONT
+
+//#define SPI_FREQUENCY 27000000
+ #define SPI_FREQUENCY 40000000 // Maximum for ILI9341
+
+
+#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V
\ No newline at end of file
diff --git a/usermods/ST7789_display/images/ST7789_Guide.jpg b/usermods/ST7789_display/images/ST7789_Guide.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..80fee4202b9e840d45fdfc08ec76a28c6216d894
GIT binary patch
literal 179304
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%0A)2PelpRe#0Q-OP->nDf6H5wx-kg%)l
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