From 50cd6a5fdb6dd14ba2e306a1b76b18cad8db1d73 Mon Sep 17 00:00:00 2001 From: rob tillaart Date: Fri, 7 Oct 2022 11:32:52 +0200 Subject: [PATCH] 0.3.4 TM1637_RT --- libraries/TM1637_RT/.arduino-ci.yml | 18 ++- libraries/TM1637_RT/CHANGELOG.md | 7 + libraries/TM1637_RT/README.md | 20 ++- libraries/TM1637_RT/TM1637.cpp | 139 +++++++----------- libraries/TM1637_RT/TM1637.h | 8 +- .../examples/TM1637_custom/TM1637_custom.ino | 93 ++++++++++++ .../examples/TM1637_pchar/TM1637_pchar.ino | 44 ++++++ libraries/TM1637_RT/keywords.txt | 2 +- libraries/TM1637_RT/library.json | 2 +- libraries/TM1637_RT/library.properties | 2 +- 10 files changed, 239 insertions(+), 96 deletions(-) create mode 100644 libraries/TM1637_RT/examples/TM1637_custom/TM1637_custom.ino create mode 100644 libraries/TM1637_RT/examples/TM1637_pchar/TM1637_pchar.ino diff --git a/libraries/TM1637_RT/.arduino-ci.yml b/libraries/TM1637_RT/.arduino-ci.yml index e7cb4633..25980972 100644 --- a/libraries/TM1637_RT/.arduino-ci.yml +++ b/libraries/TM1637_RT/.arduino-ci.yml @@ -1,3 +1,18 @@ +platforms: + rpipico: + board: rp2040:rp2040:rpipico + package: rp2040:rp2040 + gcc: + features: + defines: + - ARDUINO_ARCH_RP2040 + warnings: + flags: + +packages: + rp2040:rp2040: + url: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json + compile: # Choosing to run compilation tests on 2 different Arduino platforms platforms: @@ -8,4 +23,5 @@ compile: - m4 - esp32 # - esp8266 - # - mega2560 \ No newline at end of file + # - mega2560 + - rpipico diff --git a/libraries/TM1637_RT/CHANGELOG.md b/libraries/TM1637_RT/CHANGELOG.md index 8db05841..a0ede7ac 100644 --- a/libraries/TM1637_RT/CHANGELOG.md +++ b/libraries/TM1637_RT/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [0.3.4] - 2022-10-07 + +- added CHANGELOG.md +- added **void displayPChar(char \* data)** thanks to radionerd +- added **uint8_t asciiTo7Segment (char c)** thanks to radionerd +- updated documentation + ## [0.3.3] - 2022-09-24 - added CHANGELOG.md diff --git a/libraries/TM1637_RT/README.md b/libraries/TM1637_RT/README.md index bd2c63c6..93feccea 100644 --- a/libraries/TM1637_RT/README.md +++ b/libraries/TM1637_RT/README.md @@ -24,6 +24,7 @@ ESP32 is supported since 0.2.0 see https://github.com/RobTillaart/TM1637_RT/pull - **TM1637()** constructor - **void begin(uint8_t clockPin, uint8_t dataPin, uint8_t digits = 6)** set up the connection of the pins to the display. As the display is only tested with a 6 digit display, this is used as the default of the digits parameter. +- **void displayPChar(char \*buff)** display the buffer. Experimental - Tested on STM32 and Arduino Nano - **void displayRaw(uint8_t \* data, uint8_t pointPos)** low level write function. - **void displayInt(long value)** idem - **void displayFloat(float value)** idem @@ -34,17 +35,23 @@ As the display is only tested with a 6 digit display, this is used as the defaul - **uint8_t keyscan(void)** scans the keyboard once and return result. The keyscan() function cannot detect multiple keys. -**displayRaw()** can display multiple decimal points, by setting the high bit (0x80) in each character for which you wish to have a decimal lit. Or you can use the pointPos argument to light just one decimal at that position. +**displayRaw()** can display multiple decimal points, by setting the high bit (0x80) +in each character for which you wish to have a decimal lit. +Or you can use the pointPos argument to light just one decimal at that position. **displayRaw()** can display some of the alphabet as follows: - space (blank) is 0x10 - '-' (minus) is 0x11 - a-f are coded as 0x0a-0x0f - g-z are coded as 0x12-0x25. Characters that cannot be represented in 7 segments render as blank. - So "hello " is coded as 0x13, 0x0e, 0x17, 0x17, 0x1a, 0x10 + +**void displayPChar(char \*buff)** Attempts to display every ascii character 0x30 to 0x5F. +See example TM1637_custom.ino to insert your own 7 segment patterns. +Also displayed are ' ' , '.' and '-' . Decimal points may also be displayed by setting the character sign bit. -See routine **ascii_to_7segment()** in the example TM1637_keyscan_cooked.ino. It presents a more convenient interface for displaying text messages on the display. +See routine **ascii_to_7segment()** in the example TM1637_keyscan_cooked.ino. +It presents a more convenient interface for displaying text messages on the display. Routine **button_poll()** in the same example shows one way of polling and de-bouncing button presses. @@ -159,12 +166,13 @@ See examples ### 0.4.0 - remove obsolete **init()** from code +- investigate if code can be optimized + - performance measurement + ### other -- testing platforms. -- investigate if code can be optimized - - performance measurement +- testing other platforms. - **keyScan()** camelCase ? diff --git a/libraries/TM1637_RT/TM1637.cpp b/libraries/TM1637_RT/TM1637.cpp index 2f623ed2..f8b9ff37 100644 --- a/libraries/TM1637_RT/TM1637.cpp +++ b/libraries/TM1637_RT/TM1637.cpp @@ -2,7 +2,7 @@ // FILE: TM1637.cpp // AUTHOR: Rob Tillaart // DATE: 2019-10-28 -// VERSION: 0.3.3 +// VERSION: 0.3.4 // PURPOSE: TM1637 library for Arduino // URL: https://github.com/RobTillaart/TM1637_RT @@ -202,6 +202,29 @@ void TM1637::setDigitOrder(uint8_t a, uint8_t b, } +// Set sign bit on any char to display decimal point +void TM1637::displayPChar( char * data ) +{ + start(); + writeByte(TM1637_ADDR_AUTO); + stop(); + + start(); + writeByte(TM1637_CMD_SET_ADDR); + + for (int d = _digits-1; d >=0 ; d--) + { + uint8_t i = _digitOrder[d]; + writeByte( asciiTo7Segment(data[i]) ); + } + stop(); + + start(); + writeByte(TM1637_CMD_DISPLAY | _brightness); + stop(); +} + + void TM1637::displayRaw(uint8_t * data, uint8_t pointPos) { uint8_t b = 0; @@ -240,89 +263,6 @@ void TM1637::displayRaw(uint8_t * data, uint8_t pointPos) } - -/* previous version -void TM1637::displayRaw(uint8_t * data, uint8_t pointPos) -{ - uint8_t b = 0, dp = 0; - - start(); - writeByte(TM1637_ADDR_AUTO); - stop(); - - // for debugging new displays... - // for (int i = 0; i< 6; i++) - // { - // Serial.print(data[i]); - // Serial.print("\t"); - // } - // Serial.println(); - - start(); - writeByte(TM1637_CMD_SET_ADDR); - - // TODO: how to encode display digit order in a generic way? - // 2nd array? (packed in nybbles?) - // 6 digits == 2x3 display - // [3,4,5,0,1,2] - if (_digits == 6) - { - - for (uint8_t i = 3; i < 6 ; i++) - { - dp = data[i] & 0x80; - data[i] &= 0x7f; - if(data[i] <= 17) { - b = seg[data[i]]; - } - else if(data[i] <= 37) { - b = alpha_seg[data[i]-18]; - } - if (i == pointPos || dp) b |= 0x80; - writeByte(b); - } - for (uint8_t i = 0; i < 3 ; i++) - { - dp = data[i] & 0x80; - data[i] &= 0x7f; - if(data[i] <= 17) { - b = seg[data[i]]; - } - else if(data[i] <= 37) { - b = alpha_seg[data[i]-18]; - } - if (i == pointPos || dp) b |= 0x80; - writeByte(b); - } - } - // 4 digit clock version. => : is the point at digit 2 - // [3,2,1,0] - if (_digits == 4) - { - for (uint8_t j = 0; j < 4 ; j++) - { - uint8_t i = 3 - j; - dp = data[i] & 0x80; // repeating block till writeByte() - data[i] &= 0x7f; - if(data[i] <= 17) { - b = seg[data[i]]; - } - else if(data[i] <= 37) { - b = alpha_seg[data[i]-18]; - } - if (i == pointPos || dp) b |= 0x80; - writeByte(b); - } - } - stop(); - - start(); - writeByte(TM1637_CMD_DISPLAY | _brightness); - stop(); -} -*/ - - ////////////////////////////////////////////////////// // // PRIVATE @@ -434,5 +374,36 @@ void TM1637::nanoDelay(uint16_t n) } +uint8_t TM1637::asciiTo7Segment ( char c ) +{ + /* + -01- + 20 | | 02 + -40- + 10 | | 04 + -08- .80 + */ + // 7+1 Segment patterns for ASCII 0x30-0x5F + const uint8_t asciiToSegments[] = { + 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, // 0123 4567 + 0x7f,0x6f,0x09,0x89, 0x58,0x48,0x4c,0xD3, // 89:; <=>? + 0x5f,0x77,0x7c,0x39, 0x5E,0x79,0x71,0x3d, // @ABC DEFG + 0x76,0x06,0x0E,0x75, 0x38,0x37,0x54,0x5c, // HIJK LMNO + 0x73,0x67,0x50,0x6D, 0x78,0x3E,0x1C,0x9c, // PQRS TUVW + 0x76,0x6E,0x5B,0x39, 0x52,0x0F,0x23,0x08 // XYZ[ /]^_ + }; + + uint8_t segments = c & 0x80; + c &= 0x7f; + if ( c >= 0x60 ) c -= 0x20 ; // a-z -> A-Z + if ( c == '.' ) segments = 0x80; // decimal point only + if ( c == '-' ) segments |= 0x40; // minus sign + if ( ( c >= 0x30 ) && ( c <= 0x5F ) ) { + segments |= asciiToSegments[ c - 0x30 ]; + } + return segments; +} + + // -- END OF FILE -- diff --git a/libraries/TM1637_RT/TM1637.h b/libraries/TM1637_RT/TM1637.h index 2d65a986..6aaf73fe 100644 --- a/libraries/TM1637_RT/TM1637.h +++ b/libraries/TM1637_RT/TM1637.h @@ -3,7 +3,7 @@ // FILE: TM1637.h // AUTHOR: Rob Tillaart // DATE: 2019-10-28 -// VERSION: 0.3.3 +// VERSION: 0.3.4 // PUPROSE: TM1637 library for Arduino // URL: https://github.com/RobTillaart/TM1637_RT @@ -13,7 +13,7 @@ #include "Arduino.h" -#define TM1637_LIB_VERSION (F("0.3.3")) +#define TM1637_LIB_VERSION (F("0.3.4")) class TM1637 @@ -24,6 +24,7 @@ public: // replaces init() void begin(uint8_t clockPin, uint8_t dataPin, uint8_t digits = 6); + void displayPChar( char * buff ); void displayRaw(uint8_t * data, uint8_t pointPos); void displayInt(long value); void displayFloat(float value); @@ -64,6 +65,9 @@ private: void writeSync(uint8_t pin, uint8_t val); void nanoDelay(uint16_t n); + + // Override in your own derived class for custom character translation + virtual uint8_t asciiTo7Segment ( char c ) ; }; diff --git a/libraries/TM1637_RT/examples/TM1637_custom/TM1637_custom.ino b/libraries/TM1637_RT/examples/TM1637_custom/TM1637_custom.ino new file mode 100644 index 00000000..d72039da --- /dev/null +++ b/libraries/TM1637_RT/examples/TM1637_custom/TM1637_custom.ino @@ -0,0 +1,93 @@ +// +// FILE: TM1637_custom.ino +// AUTHOR: Richard Jones +// VERSION: 0.1.0 +// PURPOSE: demo TM1637 library +// DATE: 3 October 2022 +// URL: https://github.com/radionerd + +// Demonstration of how to display char *buff and override the TM1637 library asciiTo7Segment virtual function +// to create a custom 7 segment character set. +// The letter 'A' becomes swapped with @ in this trivial example +// Status: Experimental. Tested on STM32F103C8T6 Blue Pill and Arduino Nano only + +#include "TM1637.h" + +const int DISPLAY_DIGITS_6 = 6; + +// This example shows how to override the TM1637_RT library 7 segment patterns and copy the display output +// to the serial port overriding and adding to the library methods. +// myTM1637 inherits from library class TM1637 and overrides the library asciiTo7Segment() method. +// The derived class displayPChar() method also copies the display output to the serial port. + +class myTM1637 : TM1637 { + public: + void setBrightness(uint8_t b) { TM1637::setBrightness(b);}; + + void begin(uint8_t clockPin, uint8_t dataPin, uint8_t digits = 6) {TM1637::begin(clockPin,dataPin,digits);}; + + void displayPChar( char * data ) { + TM1637::displayPChar( &data[0] ); // Call the base class + Serial.println(data); // Copy display output to the serial port + }; + + uint8_t asciiTo7Segment ( char c ) { // Override library ascii to 7 segment conversion + + // -01- + // 20 | | 02 + // -40- + // 10 | | 04 + // -08- .80 + + //7+1 Segment patterns for ASCII 0x30-0x5F + const uint8_t asciiTo8Segment[] = { + 0x00,0x86,0x22,0x7f, 0x6d,0x52,0x7d,0x02, // !"# $%&' + 0x39,0x0f,0x7f,0x46, 0x80,0x40,0x80,0x52, // ()*+ ,-./ + 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, // 0123 4567 + 0x7f,0x6f,0x09,0x89, 0x58,0x48,0x4c,0xD3, // 89:; <=>? + 0x77,0x5f,0x7c,0x39, 0x5E,0x79,0x71,0x3d, // @aBC DEFG NB: @ <-> A in this derived class + 0x74,0x06,0x0E,0x75, 0x38,0x37,0x54,0x5c, // HIJK LMNO + 0x73,0x67,0x50,0x6D, 0x78,0x3E,0x1C,0x9c, // PQRS TUVW + 0x76,0x6E,0x5B,0x39, 0x52,0x0F,0x23,0x08 // XYZ[ /]^_ + }; + + uint8_t segments = c &0x80; + c &= 0x7f; + if ( c >= 0x60 ) c -= 0x20 ; // a-z -> A-Z + if ( ( c >= 0x20 ) && ( c <= 0x5F ) ) { + segments |= asciiTo8Segment[c-0x20]; + } + return segments; + } +}; + +myTM1637 myTM; + +void setup() +{ + Serial.begin(115200); + delay(1000); + Serial.println(__FILE__); + + // set clockpin, datapin to your own board pin names + // e.g. myTM.begin(PB8, PB9 , DISPLAY_DIGITS_6 ); + myTM.begin( 14, 15 , DISPLAY_DIGITS_6 ); // clockpin, datapin, and digits + + myTM.setBrightness(2); + +} + + +void loop() +{ + char buff[20]; + static int seconds; + // Show A and @ swapped over on custom character set + // Compare the 7 segment display with the text shown on the serial monitor + sprintf(buff,"@-A%3d", seconds++%100 ); + myTM.displayPChar(buff); // send buffer to display and serial port + delay(1000); +} + + +// -- END OF FILE -- diff --git a/libraries/TM1637_RT/examples/TM1637_pchar/TM1637_pchar.ino b/libraries/TM1637_RT/examples/TM1637_pchar/TM1637_pchar.ino new file mode 100644 index 00000000..f940fec9 --- /dev/null +++ b/libraries/TM1637_RT/examples/TM1637_pchar/TM1637_pchar.ino @@ -0,0 +1,44 @@ +// +// FILE: TM1637_pchar.ino +// AUTHOR: Richard Jones +// VERSION: 0.1.0 +// PURPOSE: demo TM1637 library +// DATE: 4 October 2022 +// URL: https://github.com/radionerd + +// Demonstration of how to display char *buff +// Status: Experimental. Tested on STM32F103C8T6 Blue Pill and Arduino Nano only + +#include "TM1637.h" + +const int DISPLAY_DIGITS_6 = 6; + +TM1637 TM; + +void setup() +{ + Serial.begin(115200); + delay(1000); + Serial.println(__FILE__); + + // set clockpin, datapin to your own board pin names + // e.g. myTM.begin(PB8, PB9 , DISPLAY_DIGITS_6 ); + TM.begin( 14, 15 , DISPLAY_DIGITS_6 ); // clockpin, datapin, and digits + + TM.setBrightness(2); + +} + + +void loop() +{ + char buff[20]; + static int seconds; + sprintf(buff,"Sec=%02x", seconds++&0xFF ); + TM.displayPChar(buff); // send buffer to display + Serial.println(buff); // and serial port. + delay(1000); +} + + +// -- END OF FILE -- diff --git a/libraries/TM1637_RT/keywords.txt b/libraries/TM1637_RT/keywords.txt index ef130973..67df0c0a 100644 --- a/libraries/TM1637_RT/keywords.txt +++ b/libraries/TM1637_RT/keywords.txt @@ -8,7 +8,7 @@ TM1637 KEYWORD1 # Methods and Functions (KEYWORD2) begin KEYWORD2 - +displayPChar KEYWORD2 displayRaw KEYWORD2 displayInt KEYWORD2 displayFloat KEYWORD2 diff --git a/libraries/TM1637_RT/library.json b/libraries/TM1637_RT/library.json index 3167419a..f9a4e78a 100644 --- a/libraries/TM1637_RT/library.json +++ b/libraries/TM1637_RT/library.json @@ -15,7 +15,7 @@ "type": "git", "url": "https://github.com/RobTillaart/TM1637_RT" }, - "version": "0.3.3", + "version": "0.3.4", "license": "MIT", "frameworks": "arduino", "platforms": "*", diff --git a/libraries/TM1637_RT/library.properties b/libraries/TM1637_RT/library.properties index 0713539d..e18f5759 100644 --- a/libraries/TM1637_RT/library.properties +++ b/libraries/TM1637_RT/library.properties @@ -1,5 +1,5 @@ name=TM1637_RT -version=0.3.3 +version=0.3.4 author=Rob Tillaart maintainer=Rob Tillaart sentence=TM1637 Library for Arduino.