diff --git a/lib/lib_display/TM1637TinyDisplay/LICENSE b/lib/lib_display/TM1637TinyDisplay/LICENSE
new file mode 100644
index 000000000..6600f1c98
--- /dev/null
+++ b/lib/lib_display/TM1637TinyDisplay/LICENSE
@@ -0,0 +1,165 @@
+GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/lib/lib_display/TM1637TinyDisplay/README.md b/lib/lib_display/TM1637TinyDisplay/README.md
new file mode 100644
index 000000000..f146f7f05
--- /dev/null
+++ b/lib/lib_display/TM1637TinyDisplay/README.md
@@ -0,0 +1,136 @@
+# TM1637 Tiny Display #
+[](https://www.ardu-badge.com/TM1637TinyDisplay)
+[](https://travis-ci.org/github/jasonacox/TM1637TinyDisplay)
+
+Arduino Library for the TM1637 Based LED Display Module
+
+## Description
+This is an Arduino library for 4-digit 7-segment display modules based on the TM1637 chip.
+Connect the TM1637 display CLK and DIO pins to your Arduino GPIO pins, include this library, initialize TM1637TinyDisplay and call easy to use functions like showNumber(), showString(), showLevel() and showAnimation(). Display will scroll text for larger strings. Functions support screen splitting for easy number + text formatting. Library also runs well on tiny controllers including the ATtiny85.
+
+## Hardware
+
+
+Display modules based on the TM1637 chip are available from [HiLetgo](https://www.amazon.com/gp/product/B01DKISMXK/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1), [DX](https://dx.com/p/0-36-led-4-digit-display-module-for-arduino-black-blue-works-with-official-arduino-boards-254978) and [SeeedStudio](https://www.digikey.com/products/en?keywords=tm1637).
+
+
+
+The display has four connectors:
+* CLK - Clock - attach to any GPIO output
+* DIO - Data - attach to any GPIO output
+* VCC - Power 5v
+* GND - Ground
+
+Power Note: Steady clean power is important for circuit stability. If you are seeing display artifacts during high frequency updates or animation sequences, you may be experiencing power fluctuations that are impacting signal timing and communication with the TM1637. This is especially true with standalone microprocessor applications that lack any power conditioning (e.g. ATtiny85). A polarized 100uF electrolytic capacitor inserted across VCC and GND can help smooth out the spikes.
+
+Decimals and Colons: Some TM1637 displays come equipped with a middle colon LED (as shown above) as used in digital clocks but with no decimal points. Some displays come with decimal point LEDS for each digit. Some come with both but often the decimal point LEDs are not connected. These extra LEDs are activated by setting the upper bit (0x80) for the digit next to the dot. This library will handle setting that for you via the showNumber() function when you specify floating point numbers or via the showNumberDec() function where you can set the decimal point manually.
+
+## Installation
+This library is available via the Arduino IDE. Install this library via `Tools`, `Manage Libraries`, search for "TM1637TinyDisplay" and click `Install`.
+
+Alternatively, you can install this manually by cloning this repo into your Arduino library folder (e.g. `~/Documents/Arduino/libraries`).
+
+## Usage
+The library provides a single class named TM1637TinyDisplay with the following functions:
+
+* `showNumber` - Display an integer and floating point numbers (positive or negative)
+* `showNumberDec` - Display a number with ability to manually set decimal points or colon
+* `showNumberHex` - Display a number in hexadecimal format and set decimal point or colon
+* `showString` - Display a ASCII string of text with optional scrolling for long strings
+* `showLevel` - Use display LEDs to simulate a level indicator (vertical or horizontal)
+* `showAnimation` - Display a sequence of frames to render an animation
+* `setSegments` - Directly set the value of the LED segments in each digit
+* `setBrightness` - Sets the brightness of the display
+* `setScrolldelay` - Sets the speed for text scrolling
+
+PROGMEM functions: Large string or animation data can be left in Flash instead of being loaded in to SRAM to save memory.
+
+* `showAnimation_P` - Display a sequence of frames to render an animation (in PROGMEM)
+* `showString_P` - Display a ASCII string of text with optional scrolling for long strings (in PROGMEM)
+
+## Example Code
+```cpp
+#include
+#include
+
+// Define Digital Pins
+#define CLK 1
+#define DIO 2
+
+// Initialize TM1637TinyDisplay
+TM1637TinyDisplay display(CLK, DIO);
+
+void setup() {
+ display.setBrightness(0x0f);
+}
+
+void loop() {
+ // Say Hello
+ display.showString("HELLO");
+ delay(500);
+
+ // Clear Screen
+ display.clear();
+
+ // We can count!
+ for (int x = -100; x <= 100; x++) {
+ display.showNumber(x);
+ }
+
+ // Level indicator
+ for (int x = 0; x <= 100; x = x + 10) {
+ display.showLevel(x, false);
+ delay(20);
+ }
+ for (int x = 100; x >= 0; x = x - 10) {
+ display.showLevel(x, false);
+ delay(20);
+ }
+
+ // Split screen for temperature
+ display.showString("\xB0", 1, 3); // Degree Mark, length=1, position=3 (right)
+ for (int x = -90; x < 200; x++) {
+ display.showNumber(x, false, 3, 0); // Number, length=3, position=0 (left)
+ delay(10);
+ }
+
+ // The end
+ display.showString("End");
+ delay(1000);
+}
+```
+
+Refer to [TM1637TinyDisplay.h](TM1637TinyDisplay.h) for information on available functions. See also [Examples](examples) for more demonstration.
+
+## Animation and Animator Tool
+The showAnimation() function projects a sequence of frames (patterns) onto the display. This works by defining the animation sequence through a multi-dimensional array of patterns.
+
+You can use the included javascript based interactive [7-Segment LED Animator Tool](https://jasonacox.github.io/TM1637TinyDisplay/examples/7-segment-animator.html) to help build your animation. The source code is in the [Examples](examples) folder. This tool will let you set up the LED sequences you want, save each frame and copy the final code (a static array) directly into your sketch to use for the `showAnimation(data, frames, timing)` function. Here is an example:
+
+```cpp
+// Data from Animator Tool
+const uint8_t ANIMATION[12][4] = {
+ { 0x08, 0x00, 0x00, 0x00 }, // Frame 0
+ { 0x00, 0x08, 0x00, 0x00 }, // Frame 1
+ { 0x00, 0x00, 0x08, 0x00 }, // Frame 2
+ { 0x00, 0x00, 0x00, 0x08 }, // Frame 3
+ { 0x00, 0x00, 0x00, 0x04 }, // Frame 4
+ { 0x00, 0x00, 0x00, 0x02 }, // Frame 5
+ { 0x00, 0x00, 0x00, 0x01 }, // Frame 6
+ { 0x00, 0x00, 0x01, 0x00 }, // Frame 7
+ { 0x00, 0x01, 0x00, 0x00 }, // Frame 8
+ { 0x01, 0x00, 0x00, 0x00 }, // Frame 9
+ { 0x20, 0x00, 0x00, 0x00 }, // Frame 10
+ { 0x10, 0x00, 0x00, 0x00 } // Frame 11
+};
+
+ // Display Animation sequence
+ display.showAnimation(ANIMATION, FRAMES(ANIMATION), TIME_MS(50));
+
+```
+
+## References and Credit
+* This library is based on the great work by Avishay Orpaz - https://github.com/avishorp/TM1637
+* SevenSegmentTM1637 Arduino Library by Bram Harmsen - https://github.com/bremme/arduino-tm1637
+* Arduino - https://playground.arduino.cc/Main/TM1637/
+
diff --git a/lib/lib_display/TM1637TinyDisplay/RELEASE.md b/lib/lib_display/TM1637TinyDisplay/RELEASE.md
new file mode 100644
index 000000000..e7702fb8a
--- /dev/null
+++ b/lib/lib_display/TM1637TinyDisplay/RELEASE.md
@@ -0,0 +1,20 @@
+# Release Notes for TM1637TinyDisplay
+
+## v1.0.0
+- Initial Release.
+
+## v1.1.0
+- Added interactive [Animator Tool](https://jasonacox.github.io/TM1637TinyDisplay/examples/7-segment-animator.html) to create frame data for the showAnimation() function.
+- Added demo sketch to showcase functions and animation features.
+
+## v1.1.1
+- Added yield() call to example Demo sketch for esp8266 watchdog timer.
+
+## v1.2.0
+- Added floating number support to showNumber() for TM1637 displays with decimal points.
+
+## v1.3.0
+- Converted global digitToSegment[] and asciiToSegment[] lookup tables to PROGMEM space to save RAM.
+- Fixed comparison between signed and unsigned integer expressions warning #5
+- Saves ~1.5kB in the ATtiny85 example by using showNumber() instead of sprintf() #6
+- Fixed implicit case fallthrough and signed/unsigned comparison warnings #7
\ No newline at end of file
diff --git a/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp b/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp
new file mode 100644
index 000000000..f9810cd22
--- /dev/null
+++ b/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp
@@ -0,0 +1,603 @@
+// TM1637 Tiny Display
+// Arduino tiny library for TM1637 LED Display
+//
+// Author: Jason A. Cox - @jasonacox - https://github.com/jasonacox
+// Date: 27 June 2020
+//
+// Based on TM1637Display library at https://github.com/avishorp/TM1637
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+extern "C" {
+ #include
+ #include
+ #include
+}
+
+#include
+#include
+
+#define TM1637_I2C_COMM1 0x40
+#define TM1637_I2C_COMM2 0xC0
+#define TM1637_I2C_COMM3 0x80
+
+//
+// A
+// ---
+// F | | B
+// -G-
+// E | | C
+// ---
+// D
+const uint8_t digitToSegment[] PROGMEM = {
+ // XGFEDCBA
+ 0b00111111, // 0
+ 0b00000110, // 1
+ 0b01011011, // 2
+ 0b01001111, // 3
+ 0b01100110, // 4
+ 0b01101101, // 5
+ 0b01111101, // 6
+ 0b00000111, // 7
+ 0b01111111, // 8
+ 0b01101111, // 9
+ 0b01110111, // A
+ 0b01111100, // b
+ 0b00111001, // C
+ 0b01011110, // d
+ 0b01111001, // E
+ 0b01110001 // F
+ };
+
+// ASCII Map - Index 0 starts at ASCII 32
+const uint8_t asciiToSegment[] PROGMEM = {
+ 0b00000000, // 032 (Space)
+ 0b00110000, // 033 !
+ 0b00100010, // 034 "
+ 0b01000001, // 035 #
+ 0b01101101, // 036 $
+ 0b01010010, // 037 %
+ 0b01111100, // 038 &
+ 0b00100000, // 039 '
+ 0b00111001, // 040 (
+ 0b00001111, // 041 )
+ 0b00100001, // 042 *
+ 0b01110000, // 043 +
+ 0b00001000, // 044 ,
+ 0b01000000, // 045 -
+ 0b00001000, // 046 .
+ 0b01010010, // 047 /
+ 0b00111111, // 048 0
+ 0b00000110, // 049 1
+ 0b01011011, // 050 2
+ 0b01001111, // 051 3
+ 0b01100110, // 052 4
+ 0b01101101, // 053 5
+ 0b01111101, // 054 6
+ 0b00000111, // 055 7
+ 0b01111111, // 056 8
+ 0b01101111, // 057 9
+ 0b01001000, // 058 :
+ 0b01001000, // 059 ;
+ 0b00111001, // 060 <
+ 0b01001000, // 061 =
+ 0b00001111, // 062 >
+ 0b01010011, // 063 ?
+ 0b01011111, // 064 @
+ 0b01110111, // 065 A
+ 0b01111100, // 066 B
+ 0b00111001, // 067 C
+ 0b01011110, // 068 D
+ 0b01111001, // 069 E
+ 0b01110001, // 070 F
+ 0b00111101, // 071 G
+ 0b01110110, // 072 H
+ 0b00000110, // 073 I
+ 0b00011110, // 074 J
+ 0b01110110, // 075 K
+ 0b00111000, // 076 L
+ 0b00010101, // 077 M
+ 0b00110111, // 078 N
+ 0b00111111, // 079 O
+ 0b01110011, // 080 P
+ 0b01100111, // 081 Q
+ 0b00110001, // 082 R
+ 0b01101101, // 083 S
+ 0b01111000, // 084 T
+ 0b00111110, // 085 U
+ 0b00011100, // 086 V
+ 0b00101010, // 087 W
+ 0b01110110, // 088 X
+ 0b01101110, // 089 Y
+ 0b01011011, // 090 Z
+ 0b00111001, // 091 [
+ 0b01100100, // 092 (backslash)
+ 0b00001111, // 093 ]
+ 0b00100011, // 094 ^
+ 0b00001000, // 095 _
+ 0b00100000, // 096 `
+ 0b01110111, // 097 a
+ 0b01111100, // 098 b
+ 0b01011000, // 099 c
+ 0b01011110, // 100 d
+ 0b01111001, // 101 e
+ 0b01110001, // 102 f
+ 0b01101111, // 103 g
+ 0b01110100, // 104 h
+ 0b00000100, // 105 i
+ 0b00011110, // 106 j
+ 0b01110110, // 107 k
+ 0b00011000, // 108 l
+ 0b00010101, // 109 m
+ 0b01010100, // 110 n
+ 0b01011100, // 111 o
+ 0b01110011, // 112 p
+ 0b01100111, // 113 q
+ 0b01010000, // 114 r
+ 0b01101101, // 115 s
+ 0b01111000, // 116 t
+ 0b00011100, // 117 u
+ 0b00011100, // 118 v
+ 0b00101010, // 119 w
+ 0b01110110, // 120 x
+ 0b01101110, // 121 y
+ 0b01011011, // 122 z
+ 0b00111001, // 123 {
+ 0b00110000, // 124 |
+ 0b00001111, // 125 }
+ 0b01000000, // 126 ~
+ 0b00000000 // 127
+};
+
+static const uint8_t minusSegments = 0b01000000;
+static const uint8_t degreeSegments = 0b01100011;
+
+TM1637TinyDisplay::TM1637TinyDisplay(uint8_t pinClk, uint8_t pinDIO, unsigned int bitDelay, unsigned int scrollDelay)
+{
+ // Copy the pin numbers
+ m_pinClk = pinClk;
+ m_pinDIO = pinDIO;
+ m_bitDelay = bitDelay;
+ m_scrollDelay = scrollDelay;
+
+ // Set the pin direction and default value.
+ // Both pins are set as inputs, allowing the pull-up resistors to pull them up
+ pinMode(m_pinClk, INPUT);
+ pinMode(m_pinDIO,INPUT);
+ digitalWrite(m_pinClk, LOW);
+ digitalWrite(m_pinDIO, LOW);
+}
+
+void TM1637TinyDisplay::setBrightness(uint8_t brightness, bool on)
+{
+ m_brightness = (brightness & 0x07) | (on? 0x08 : 0x00);
+}
+
+void TM1637TinyDisplay::setScrolldelay(unsigned int scrollDelay)
+{
+ m_scrollDelay = scrollDelay;
+}
+
+void TM1637TinyDisplay::setSegments(const uint8_t segments[], uint8_t length, uint8_t pos)
+{
+ // Write COMM1
+ start();
+ writeByte(TM1637_I2C_COMM1);
+ stop();
+
+ // Write COMM2 + first digit address
+ start();
+ writeByte(TM1637_I2C_COMM2 + (pos & 0x03));
+
+ // Write the data bytes
+ for (uint8_t k=0; k < length; k++)
+ writeByte(segments[k]);
+
+ stop();
+
+ // Write COMM3 + brightness
+ start();
+ writeByte(TM1637_I2C_COMM3 + (m_brightness & 0x0f));
+ stop();
+}
+
+void TM1637TinyDisplay::clear()
+{
+ uint8_t data[] = { 0, 0, 0, 0 };
+ setSegments(data);
+}
+
+void TM1637TinyDisplay::showNumber(int num, bool leading_zero, uint8_t length, uint8_t pos)
+{
+ showNumberDec(num, 0, leading_zero, length, pos);
+}
+
+void TM1637TinyDisplay::showNumber(double num, uint8_t decimal_length, uint8_t length, uint8_t pos)
+{
+ int num_len = 0;
+ int inum = abs((int)num);
+ int decimal_places = 0;
+ double value = 0.0;
+ bool negative = false;
+ bool leading_zero = false;
+ uint8_t digits[4] = {0,0,0,0}; // output array to render
+
+ // determine length of whole number part of num
+ while(inum != 0) {
+ inum = inum / 10;
+ num_len++;
+ }
+ if(num < 0) {
+ num_len++; // make space for negative
+ negative = true;
+ }
+ if(abs(num)<1) {
+ num_len++; // make space for 0. prefix
+ leading_zero = true;
+ }
+ // make sure we can display number otherwise show overflow
+ if(num_len > length) {
+ showString("----", length, pos); // overflow symbol
+ return;
+ }
+ // how many decimal places can we show?
+ decimal_places = length - num_len;
+ if(decimal_places > decimal_length) {
+ decimal_places = decimal_length;
+ }
+ // construct whole number representation of num
+ value = num;
+ for(int x=0; x < decimal_places; x++) {
+ value = value * 10.00;
+ }
+ if(num>0) value = value + 0.5; // round up
+ if(num<0) value = value - 0.5; // round down
+ inum = abs((int)value);
+
+ // render display array
+ if (inum == 0 && !leading_zero) {
+ digits[length-1] = encodeDigit(0);
+ }
+ else {
+ int decimal_pos = length - 1 - decimal_places + pos;
+ for(int i = length-1; i >= 0; --i) {
+ uint8_t digit = inum % 10;
+
+ if (digit == 0 && inum == 0 &&
+ (leading_zero == false || (i < decimal_pos))
+ )
+ // Blank out any leading zeros except for 0.x case
+ digits[i] = 0;
+ else
+ digits[i] = encodeDigit(digit);
+ if(i == decimal_pos && decimal_length > 0) {
+ digits[i] += 0b10000000; // add decimal point
+ }
+ inum /= 10;
+ }
+ }
+ // add negative sign for negative number
+ if(negative) {
+ digits[pos] = minusSegments;
+ }
+ setSegments(digits, length, pos);
+}
+
+void TM1637TinyDisplay::showNumberDec(int num, uint8_t dots, bool leading_zero,
+ uint8_t length, uint8_t pos)
+{
+ showNumberBaseEx(num < 0? -10 : 10, num < 0? -num : num, dots, leading_zero, length, pos);
+}
+
+void TM1637TinyDisplay::showNumberHex(uint16_t num, uint8_t dots, bool leading_zero,
+ uint8_t length, uint8_t pos)
+{
+ showNumberBaseEx(16, num, dots, leading_zero, length, pos);
+}
+
+void TM1637TinyDisplay::showNumberBaseEx(int8_t base, uint16_t num, uint8_t dots, bool leading_zero,
+ uint8_t length, uint8_t pos)
+{
+ bool negative = false;
+ if (base < 0) {
+ base = -base;
+ negative = true;
+ }
+
+ uint8_t digits[4];
+
+ if (num == 0 && !leading_zero) {
+ // Singular case - take care separately
+ for(uint8_t i = 0; i < (length-1); i++) {
+ digits[i] = 0;
+ }
+ digits[length-1] = encodeDigit(0);
+ }
+ else {
+ for(int i = length-1; i >= 0; --i) {
+ uint8_t digit = num % base;
+
+ if (digit == 0 && num == 0 && leading_zero == false)
+ // Leading zero is blank
+ digits[i] = 0;
+ else
+ digits[i] = encodeDigit(digit);
+
+ if (digit == 0 && num == 0 && negative) {
+ digits[i] = minusSegments;
+ negative = false;
+ }
+
+ num /= base;
+ }
+ }
+ if(dots != 0) {
+ showDots(dots, digits);
+ }
+ setSegments(digits, length, pos);
+}
+
+void TM1637TinyDisplay::showString(const char s[], uint8_t length, uint8_t pos)
+{
+ uint8_t digits[4] = {0,0,0,0};
+
+ if (strlen(s) <= 4) {
+ switch (strlen(s)) {
+ case 4:
+ digits[3] = encodeASCII(s[3]);
+ // fall through
+ case 3:
+ digits[2] = encodeASCII(s[2]);
+ // fall through
+ case 2:
+ digits[1] = encodeASCII(s[1]);
+ // fall through
+ case 1:
+ digits[0] = encodeASCII(s[0]);
+ // fall through
+ case 0:
+ setSegments(digits, length, pos);
+ }
+ }
+ if (strlen(s) > 4) {
+ // Scroll text on display if too long
+ for (int x = 0; x < 3; x++) { // Scroll message on
+ digits[0] = digits[1];
+ digits[1] = digits[2];
+ digits[2] = digits[3];
+ digits[3] = encodeASCII(s[x]);
+ setSegments(digits, length, pos);
+ delay(m_scrollDelay);
+ }
+ for (size_t x = 3; x < strlen(s); x++) { // Scroll through string
+ digits[0] = encodeASCII(s[x - 3]);
+ digits[1] = encodeASCII(s[x - 2]);
+ digits[2] = encodeASCII(s[x - 1]);
+ digits[3] = encodeASCII(s[x]);
+ setSegments(digits, length, pos);
+ delay(m_scrollDelay);
+ }
+ for (int x = 0; x < 4; x++) { // Scroll message off
+ digits[0] = digits[1];
+ digits[1] = digits[2];
+ digits[2] = digits[3];
+ digits[3] = 0;
+ setSegments(digits, length, pos);
+ delay(m_scrollDelay);
+ }
+ }
+}
+
+void TM1637TinyDisplay::showString_P(const char s[], uint8_t length, uint8_t pos)
+{
+ uint8_t digits[4] = {0,0,0,0};
+
+ if (strlen_P(s) <= 4) {
+ switch (strlen_P(s)) {
+ case 4:
+ digits[3] = encodeASCII(pgm_read_byte(&s[3]));
+ // fall through
+ case 3:
+ digits[2] = encodeASCII(pgm_read_byte(&s[2]));
+ // fall through
+ case 2:
+ digits[1] = encodeASCII(pgm_read_byte(&s[1]));
+ // fall through
+ case 1:
+ digits[0] = encodeASCII(pgm_read_byte(&s[0]));
+ // fall through
+ case 0:
+ setSegments(digits, length, pos);
+ }
+ }
+ else {
+ // Scroll text on display if too long
+ for (int x = 0; x < 3; x++) { // Scroll message on
+ digits[0] = digits[1];
+ digits[1] = digits[2];
+ digits[2] = digits[3];
+ digits[3] = encodeASCII(pgm_read_byte(&s[x]));
+ setSegments(digits, length, pos);
+ delay(m_scrollDelay);
+ }
+ for (size_t x = 3; x < strlen_P(s); x++) { // Scroll through string
+ digits[0] = encodeASCII(pgm_read_byte(&s[x - 3]));
+ digits[1] = encodeASCII(pgm_read_byte(&s[x - 2]));
+ digits[2] = encodeASCII(pgm_read_byte(&s[x - 1]));
+ digits[3] = encodeASCII(pgm_read_byte(&s[x]));
+ setSegments(digits, length, pos);
+ delay(m_scrollDelay);
+ }
+ for (int x = 0; x < 4; x++) { // Scroll message off
+ digits[0] = digits[1];
+ digits[1] = digits[2];
+ digits[2] = digits[3];
+ digits[3] = 0;
+ setSegments(digits, length, pos);
+ delay(m_scrollDelay);
+ }
+ }
+}
+
+void TM1637TinyDisplay::showLevel(unsigned int level, bool horizontal)
+{
+ uint8_t digits[4] = {0,0,0,0};
+ uint8_t digit = 0b00000000;
+
+ if(level>100) level=100;
+
+ if(horizontal) {
+ // Must fit within 3 bars
+ int bars = (int)((level*3)/100.0);
+ if(bars == 0 && level > 0) bars = 1; // Only level=0 turns off display
+ switch(bars) {
+ case 1:
+ digit = 0b00001000;
+ break;
+ case 2:
+ digit = 0b01001000;
+ break;
+ case 3:
+ digit = 0b01001001;
+ break;
+ default: // Keep at zero
+ break;
+ }
+ for(int x = 0; x < 4; x++) {
+ digits[x] = digit;
+ }
+ }
+ else {
+ // Must fit within 8 bars
+ int bars = (int)((level*8)/100.0);
+ if(bars == 0 && level > 0) bars = 1;
+ for(int x = 0; x<4; x++) { // for each digit
+ int left = bars-(x*2);
+ if(left > 1) digits[x] = 0b00110110;
+ if(left == 1) digits[x] = 0b00110000;
+ }
+ }
+ setSegments(digits);
+}
+
+void TM1637TinyDisplay::showAnimation(const uint8_t data[][4], unsigned int frames, unsigned int ms)
+{
+ // Animation sequence
+ for (unsigned int x = 0; x < frames; x++) {
+ setSegments(data[x]);
+ delay(ms);
+ }
+}
+
+void TM1637TinyDisplay::showAnimation_P(const uint8_t data[][4], unsigned int frames, unsigned int ms)
+{
+ // Animation sequence for data stored in PROGMEM flash memory
+ uint8_t digits[4] = {0,0,0,0};
+ for (unsigned int x = 0; x < frames; x++) {
+ for(unsigned int a = 0; a < 4; a++) {
+ digits[a] = pgm_read_byte(&(data[x][a]));
+ }
+ setSegments(digits);
+ delay(ms);
+ }
+}
+
+void TM1637TinyDisplay::bitDelay()
+{
+ delayMicroseconds(m_bitDelay);
+}
+
+void TM1637TinyDisplay::start()
+{
+ pinMode(m_pinDIO, OUTPUT);
+ bitDelay();
+}
+
+void TM1637TinyDisplay::stop()
+{
+ pinMode(m_pinDIO, OUTPUT);
+ bitDelay();
+ pinMode(m_pinClk, INPUT);
+ bitDelay();
+ pinMode(m_pinDIO, INPUT);
+ bitDelay();
+}
+
+bool TM1637TinyDisplay::writeByte(uint8_t b)
+{
+ uint8_t data = b;
+
+ // 8 Data Bits
+ for(uint8_t i = 0; i < 8; i++) {
+ // CLK low
+ pinMode(m_pinClk, OUTPUT);
+ bitDelay();
+
+ // Set data bit
+ if (data & 0x01)
+ pinMode(m_pinDIO, INPUT);
+ else
+ pinMode(m_pinDIO, OUTPUT);
+
+ bitDelay();
+
+ // CLK high
+ pinMode(m_pinClk, INPUT);
+ bitDelay();
+ data = data >> 1;
+ }
+
+ // Wait for acknowledge
+ // CLK to zero
+ pinMode(m_pinClk, OUTPUT);
+ pinMode(m_pinDIO, INPUT);
+ bitDelay();
+
+ // CLK to high
+ pinMode(m_pinClk, INPUT);
+ bitDelay();
+ uint8_t ack = digitalRead(m_pinDIO);
+ if (ack == 0)
+ pinMode(m_pinDIO, OUTPUT);
+
+ bitDelay();
+ pinMode(m_pinClk, OUTPUT);
+ bitDelay();
+
+ return ack;
+}
+
+void TM1637TinyDisplay::showDots(uint8_t dots, uint8_t* digits)
+{
+ for(int i = 0; i < 4; ++i)
+ {
+ digits[i] |= (dots & 0x80);
+ dots <<= 1;
+ }
+}
+
+uint8_t TM1637TinyDisplay::encodeDigit(uint8_t digit)
+{
+ // return digitToSegment[digit & 0x0f] using PROGMEM
+ return pgm_read_byte(digitToSegment + (digit & 0x0f));
+}
+
+uint8_t TM1637TinyDisplay::encodeASCII(uint8_t chr)
+{
+ if(chr == 176) return degreeSegments; // Degree mark
+ if(chr > 127 || chr < 32) return 0; // Blank
+ // return asciiToSegment[chr - 32] using PROGMEM
+ return pgm_read_byte(asciiToSegment + (chr - 32));
+}
diff --git a/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h b/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h
new file mode 100644
index 000000000..211f1f269
--- /dev/null
+++ b/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h
@@ -0,0 +1,316 @@
+// TM1637 Tiny Display
+// Arduino tiny library for TM1637 LED Display
+//
+// Author: Jason A. Cox - @jasonacox - https://github.com/jasonacox
+// Date: 27 June 2020
+//
+// Based on TM1637Display library at https://github.com/avishorp/TM1637
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+#ifndef __TM1637TINYDISPLAY__
+#define __TM1637TINYDISPLAY__
+
+// Include PROGMEM Support
+#include
+#ifdef __AVR__
+#include
+#elif defined(ESP8266) || defined(ESP32)
+#include
+#else
+#define pgm_read_byte(addr) \
+ (*(const unsigned char *)(addr)) // workaround for non-AVR
+#endif
+
+#define SEG_A 0b00000001
+#define SEG_B 0b00000010
+#define SEG_C 0b00000100
+#define SEG_D 0b00001000
+#define SEG_E 0b00010000
+#define SEG_F 0b00100000
+#define SEG_G 0b01000000
+#define SEG_DP 0b10000000
+
+#define BRIGHT_LOW 0x00
+#define BRIGHT_0 0x00
+#define BRIGHT_1 0x01
+#define BRIGHT_2 0x02
+#define BRIGHT_3 0x03
+#define BRIGHT_4 0x04
+#define BRIGHT_5 0x05
+#define BRIGHT_6 0x06
+#define BRIGHT_7 0x07
+#define BRIGHT_HIGH 0x0f
+
+#define ON 1
+#define OFF 0
+
+#define DEFAULT_BIT_DELAY 100
+#define DEFAULT_SCROLL_DELAY 100
+
+#define FRAMES(a) sizeof(a)/4
+#define TIME_MS(t) t
+#define TIME_S(t) t*1000
+
+class TM1637TinyDisplay {
+
+public:
+ //! Initialize a TM1637TinyDisplay object, setting the clock and
+ //! data pins.
+ //!
+ //! @param pinClk - The number of the digital pin connected to the clock pin of the module
+ //! @param pinDIO - The number of the digital pin connected to the DIO pin of the module
+ //! @param bitDelay - The delay, in microseconds, between bit transition on the serial
+ //! bus connected to the display
+ TM1637TinyDisplay(uint8_t pinClk, uint8_t pinDIO, unsigned int bitDelay = DEFAULT_BIT_DELAY, unsigned int scrollDelay = DEFAULT_SCROLL_DELAY);
+
+ //! Sets the brightness of the display.
+ //!
+ //! The setting takes effect when a command is given to change the data being
+ //! displayed.
+ //!
+ //! @param brightness A number from 0 (lowest brightness) to 7 (highest brightness)
+ //! @param on Turn display on or off
+ void setBrightness(uint8_t brightness, bool on = true);
+
+ //! Sets the delay used to scroll string text (in ms).
+ //!
+ //! The setting takes effect when a showString() command send an argument with over
+ //! four characters.
+ //!
+ //! @param scrollDelay A number in milliseconds (default is 200)
+ void setScrolldelay(unsigned int scrollDelay = 200);
+
+ //! Display arbitrary data on the module
+ //!
+ //! This function receives raw segment values as input and displays them. The segment data
+ //! is given as a byte array, each byte corresponding to a single digit. Within each byte,
+ //! bit 0 is segment A, bit 1 is segment B etc.
+ //! The function may either set the entire display or any desirable part on its own. The first
+ //! digit is given by the @ref pos argument with 0 being the leftmost digit. The @ref length
+ //! argument is the number of digits to be set. Other digits are not affected.
+ //!
+ //! @param segments An array of size @ref length containing the raw segment values
+ //! @param length The number of digits to be modified
+ //! @param pos The position from which to start the modification (0 - leftmost, 3 - rightmost)
+ void setSegments(const uint8_t segments[], uint8_t length = 4, uint8_t pos = 0);
+
+ //! Clear the display
+ void clear();
+
+ //! Display a decimal number
+ //!
+ //! Display the given argument as a decimal number.
+ //!
+ //! @param num The number to be shown
+ //! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are
+ //! blank. NOTE: leading zero is not supported with negative numbers.
+ //! @param length The number of digits to set. The user must ensure that the number to be shown
+ //! fits to the number of digits requested (for example, if two digits are to be displayed,
+ //! the number must be between 0 to 99)
+ //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost)
+ void showNumber(int num, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0);
+
+ //! Display a decimal number with floating point
+ //!
+ //! Display the given argument as a decimal number. Decimal point will only show up on displays
+ //! that support decimal point.
+ //!
+ //! @param num The number to be shown
+ //! @param decimal_length Format to show only this number of digits after the decimal point.
+ //! NOTE: Anything over 4 will do best fit.
+ //! @param length The number of digits to set. The user must ensure that the number to be shown
+ //! fits to the number of digits requested (for example, if two digits are to be displayed,
+ //! the number must be between 0 to 99)
+ //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost)
+ void showNumber(double num, uint8_t decimal_length = 4, uint8_t length = 4, uint8_t pos = 0);
+
+ //! Display a decimal number, with dot control
+ //!
+ //! Display the given argument as a decimal number. The dots between the digits (or colon)
+ //! can be individually controlled.
+ //!
+ //! @param num The number to be shown
+ //! @param dots Dot/Colon enable. The argument is a bitmask, with each bit corresponding to a dot
+ //! between the digits (or colon mark, as implemented by each module). i.e.
+ //! For displays with dots between each digit:
+ //! * 0.000 (0b10000000)
+ //! * 00.00 (0b01000000)
+ //! * 000.0 (0b00100000)
+ //! * 0000. (0b00010000)
+ //! * 0.0.0.0 (0b11100000)
+ //! For displays with just a colon:
+ //! * 00:00 (0b01000000)
+ //! For displays with dots and colons colon:
+ //! * 0.0:0.0 (0b11100000)
+ //! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are
+ //! blank. NOTE: leading zero is not supported with negative numbers.
+ //! @param length The number of digits to set. The user must ensure that the number to be shown
+ //! fits to the number of digits requested (for example, if two digits are to be displayed,
+ //! the number must be between 0 to 99)
+ //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost)
+ void showNumberDec(int num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0);
+
+ //! Display a hexadecimal number, with dot control
+ //!
+ //! Display the given argument as a hexadecimal number. The dots between the digits (or colon)
+ //! can be individually controlled.
+ //!
+ //! @param num The number to be shown
+ //! @param dots Dot/Colon enable. The argument is a bitmask, with each bit corresponding to a dot
+ //! between the digits (or colon mark, as implemented by each module). i.e.
+ //! For displays with dots between each digit:
+ //! * 0.000 (0b10000000)
+ //! * 00.00 (0b01000000)
+ //! * 000.0 (0b00100000)
+ //! * 0000. (0b00010000)
+ //! * 0.0.0.0 (0b11100000)
+ //! For displays with just a colon:
+ //! * 00:00 (0b01000000)
+ //! For displays with dots and colons colon:
+ //! * 0.0:0.0 (0b11100000)
+ //! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are
+ //! blank
+ //! @param length The number of digits to set. The user must ensure that the number to be shown
+ //! fits to the number of digits requested (for example, if two digits are to be displayed,
+ //! the number must be between 0 to 99)
+ //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost)
+ void showNumberHex(uint16_t num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0);
+
+ //! Translate a single digit into 7 segment code
+ //!
+ //! The method accepts a number between 0 - 15 and converts it to the
+ //! code required to display the number on a 7 segment display.
+ //! Numbers between 10-15 are converted to hexadecimal digits (A-F)
+ //!
+ //! @param digit A number between 0 to 15
+ //! @return A code representing the 7 segment image of the digit (LSB - segment A;
+ //! bit 6 - segment G; bit 7 - always zero)
+ uint8_t encodeDigit(uint8_t digit);
+
+ //! Display a string
+ //!
+ //! Display the given string and if more than 4 characters, will scroll message on display
+ //!
+ //! @param s The string to be shown
+ //! @param scrollDelay The delay, in microseconds to wait before scrolling to next frame
+ //! @param length The number of digits to set.
+ //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost)
+ //! The _P function is for reading PROGMEM read-only flash memory space instead of RAM
+ void showString(const char s[], uint8_t length = 4, uint8_t pos = 0);
+
+ //! Display a string (PROGMEM space)
+ //!
+ //! Display the given string and if more than 4 characters, will scroll message on display
+ //! This function is for reading PROGMEM read-only flash memory space instead of RAM
+ //!
+ //! @param s The string to be shown
+ //! @param scrollDelay The delay, in microseconds to wait before scrolling to next frame
+ //! @param length The number of digits to set.
+ //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost)
+ //! The _P function is for reading PROGMEM read-only flash memory space instead of RAM
+ void showString_P(const char s[], uint8_t length = 4, uint8_t pos = 0);
+
+ //! Display a Level Indicator (both orientations)
+ //!
+ //! Illumiate LEDs to provide a visual indicator of level (horizontal or vertical orientation)
+ //!
+ //! @param level A value between 0 and 100 (representing percentage)
+ //! @param horizontal Boolean (true/false) where true = horizontal, false = vertical
+ void showLevel(unsigned int level = 100, bool horizontal = true);
+
+ //! Display a sequence of raw LED segment data to create an animation
+ //!
+ //! Play thorugh an array of raw LED segment data to create a moving pattern.
+ //!
+ //! const uint8_t Example[2][4] =
+ //! {
+ //! { // frame 1
+ //! 0b00001000, // digit 1
+ //! 0b00000000, // digit 2
+ //! 0b00000000, // digit 3
+ //! 0b00000000 // digit 4
+ //! },
+ //! { // frame 2
+ //! 0b00000000, // digit 1
+ //! 0b00001000, // digit 2
+ //! 0b00000000, // digit 3
+ //! 0b00000000 // digit 4
+ //! }
+ //! }
+ //! @param data A multi-dimensional array containing the LED segment - data[frames][4]
+ //! @param frames Number of frames in the sequence to animate
+ //! @param ms Time to delay between each frame
+ //! The _P function is for reading PROGMEM read-only flash memory space instead of RAM
+ void showAnimation(const uint8_t data[][4], unsigned int frames = 0, unsigned int ms = 10);
+
+ //! Display a sequence of raw LED segment data to create an animation (PROGMEM)
+ //!
+ //! Play thorugh an array of raw LED segment data to create a moving pattern.
+ //! This function is for reading PROGMEM read-only flash memory space instead of RAM
+ //!
+ //! const uint8_t Example[2][4] =
+ //! {
+ //! { // frame 1
+ //! 0b00001000, // digit 1
+ //! 0b00000000, // digit 2
+ //! 0b00000000, // digit 3
+ //! 0b00000000 // digit 4
+ //! },
+ //! { // frame 2
+ //! 0b00000000, // digit 1
+ //! 0b00001000, // digit 2
+ //! 0b00000000, // digit 3
+ //! 0b00000000 // digit 4
+ //! }
+ //! }
+ //! @param data A multi-dimensional array containing the LED segment - data[frames][4]
+ //! @param frames Number of frames in the sequence to animate
+ //! @param ms Time to delay between each frame
+ void showAnimation_P(const uint8_t data[][4], unsigned int frames = 0, unsigned int ms = 10);
+
+ //! Translate a single ASCII character into 7 segment code
+ //!
+ //! The method accepts a number between 0 - 255 and converts it to the
+ //! code required to display the number on a 7 segment display.
+ //! ASCII Characters between 0-32 and 128-255 are blank.
+ //!
+ //! @param chr A character ASCII value
+ //! @return A code representing the 7 segment image of the digit (LSB - segment A;
+ //! bit 6 - segment G; bit 7 - always zero)
+ uint8_t encodeASCII(uint8_t chr);
+
+protected:
+ void bitDelay();
+
+ void start();
+
+ void stop();
+
+ bool writeByte(uint8_t b);
+
+ void showDots(uint8_t dots, uint8_t* digits);
+
+ void showNumberBaseEx(int8_t base, uint16_t num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0);
+
+private:
+ uint8_t m_pinClk;
+ uint8_t m_pinDIO;
+ uint8_t m_brightness;
+ unsigned int m_bitDelay;
+ unsigned int m_scrollDelay;
+};
+
+#endif // __TM1637TINYDISPLAY__
diff --git a/lib/lib_display/TM1637TinyDisplay/_config.yml b/lib/lib_display/TM1637TinyDisplay/_config.yml
new file mode 100644
index 000000000..c4192631f
--- /dev/null
+++ b/lib/lib_display/TM1637TinyDisplay/_config.yml
@@ -0,0 +1 @@
+theme: jekyll-theme-cayman
\ No newline at end of file
diff --git a/lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html b/lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html
new file mode 100644
index 000000000..7f7858901
--- /dev/null
+++ b/lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html
@@ -0,0 +1,638 @@
+
+
+
+
+
+
+
+
+
7-Segment LED Display Animator
+
+
+
+
+
+
+
+
+
+
+
Digit 1
+
HEX
+
BIN
+
+
+
Digit 2
+
HEX
+
BIN
+
+
+
Digit 3
+
HEX
+
BIN
+
+
+
Digit 4
+
HEX
+
BIN
+
+
+
+
+ |
+
+
+
+
+
+
+
+
Instructions: Click segments above to toggle LED state and
+ click "Save" to record frame. Data for the
+ animation will be generated below. Click the "Copy Code" button and paste
+ the data definition into your sketch. See Arduino library
+ TM1637TinyDisplay.
+