From 828d3b928ee01e9bb4e458aa6ce9c1311abe0d92 Mon Sep 17 00:00:00 2001 From: Mihai Tudor Panu Date: Wed, 8 Apr 2015 16:02:59 -0700 Subject: [PATCH] tm1637: brand new working implementation Signed-off-by: Mihai Tudor Panu --- docs/images/tm1637.jpeg | Bin 0 -> 24423 bytes examples/c++/CMakeLists.txt | 3 + examples/c++/tm1637.cxx | 77 +++++++++++++ examples/javascript/tm1637.js | 66 +++++++++++ examples/python/tm1637.py | 54 +++++++++ src/tm1637/CMakeLists.txt | 5 + src/tm1637/jsupm_tm1637.i | 21 ++++ src/tm1637/pyupm_tm1637.i | 16 +++ src/tm1637/tm1637.cxx | 204 ++++++++++++++++++++++++++++++++++ src/tm1637/tm1637.h | 149 +++++++++++++++++++++++++ 10 files changed, 595 insertions(+) create mode 100644 docs/images/tm1637.jpeg create mode 100644 examples/c++/tm1637.cxx create mode 100644 examples/javascript/tm1637.js create mode 100644 examples/python/tm1637.py create mode 100644 src/tm1637/CMakeLists.txt create mode 100644 src/tm1637/jsupm_tm1637.i create mode 100644 src/tm1637/pyupm_tm1637.i create mode 100644 src/tm1637/tm1637.cxx create mode 100644 src/tm1637/tm1637.h diff --git a/docs/images/tm1637.jpeg b/docs/images/tm1637.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f3b4e719feb0abf284850efc35a16d364cf1327a GIT binary patch literal 24423 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ᒇ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 + * Copyright (c) 2015 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "tm1637.h" +#include +#include +#include +#include + +using namespace std; +using namespace upm; + +bool run = true; + +void sig_handler(int signo) +{ + if (signo == SIGINT) + run = false; +} + +int +main(int argc, char** argv) +{ + //! [Interesting] + bool point = true; + int timezone = -7; // Your UTC offset + time_t rawtime; + struct tm * gmt; + char myTime[4]; + + fprintf(stdout, "TM1637 Display Example\n"); + signal(SIGINT, sig_handler); + + TM1637 myDisplay = TM1637(0, 1); // TM1637 on pins 0 (clk) and 1 (dio) + myDisplay.write(0x39, 0x09, 0x09); // Start a box using 7-segment encoding + myDisplay.writeAt(3, ']'); // Finish box using writeAt function + sleep(3); // Wait 3 seconds + + while(run) + { + time(&rawtime); // Update raw time + gmt = gmtime(&rawtime); // Get current time + + // Format and store the time in 24 hour format + sprintf(myTime, "%2d%02d", (gmt->tm_hour + timezone + 24) % 24, gmt->tm_min); + + myDisplay.write(myTime); // Write to display as string + myDisplay.setColon(point ^= true); // Toggle the dots on the display + sleep(1); // Only update once every second + } + + //! [Interesting] + return 0; +} + + diff --git a/examples/javascript/tm1637.js b/examples/javascript/tm1637.js new file mode 100644 index 00000000..62200590 --- /dev/null +++ b/examples/javascript/tm1637.js @@ -0,0 +1,66 @@ +/* +* Author: Mihai Tudor Panu +* Copyright (c) 2015 Intel Corporation. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +// Some vars +var colon = true; +var interval; + +// Load display +var tm1637 = require('jsupm_tm1637'); + +// Instantiate on pins 0 (Clk) and 1 (Dio) +var display = new tm1637.TM1637(0, 1); + +// Get the current time +var now = new Date(); +console.log("System time: " + now.getHours() + ":" + ("0" + now.getMinutes()).slice(-2)); +console.log("Time zone can be changed by setting the TZ environment variable."); + +// Display and time update function +function update(){ + now = new Date(); + var time = now.getHours().toString() + ("0" + now.getMinutes().toString()).slice(-2); + display.writeString(time); + display.setColon(colon = !colon); +} + +// Start with a 7-segment encoded box on the display +display.write(0x39, 0x09, 0x09, 0x0f); + +// Start displaying the clock after 3 seconds +setTimeout(function(){ + // And update every second thereafter + interval = setInterval(update, 1000); +}, 3000) + +// Exit handler +process.on('SIGINT', function() +{ + clearInterval(interval); + display = null; + tm1637.cleanUp(); + tm1637 = null; + console.log("Interrupt received, exiting..."); + process.exit(0); +}); diff --git a/examples/python/tm1637.py b/examples/python/tm1637.py new file mode 100644 index 00000000..8c757444 --- /dev/null +++ b/examples/python/tm1637.py @@ -0,0 +1,54 @@ +# Author: Mihai Tudor Panu +# Copyright (c) 2014 Intel Corporation. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import time, signal +import pyupm_tm1637 as tm1637 + +# Register exit handler for normal Ctrl+C exit +def SIGINTHandler(signum, frame): + raise SystemExit +signal.signal(signal.SIGINT, SIGINTHandler) + +# Create a display object on pins 0 CLK and 1 DIO +display = tm1637.TM1637(0, 1) +dots = True + +# Get local time +myTime = time.localtime(time.time()) +print time.strftime("System time: %H:%M", myTime) +print ("You can adjust your time zone by setting the TZ environment variable.") + +# Draw a box for 3 seconds using 7-segment encoding +display.write(0x39, 0x09, 0x09, 0x0f) +time.sleep(3) + +# Loop indefinitely +while True: + # Update and display time + timeString = time.strftime("%H%M", time.localtime(time.time())) + display.write(timeString) + # Toggle colon + display.setColon(dots) + dots = not dots + + # Sleep for 1 s + time.sleep(1) diff --git a/src/tm1637/CMakeLists.txt b/src/tm1637/CMakeLists.txt new file mode 100644 index 00000000..6138d2e2 --- /dev/null +++ b/src/tm1637/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "tm1637") +set (libdescription "C++ API for the TM1637 7-segment display") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/tm1637/jsupm_tm1637.i b/src/tm1637/jsupm_tm1637.i new file mode 100644 index 00000000..91c9243c --- /dev/null +++ b/src/tm1637/jsupm_tm1637.i @@ -0,0 +1,21 @@ +%module jsupm_tm1637 +%include "../upm.i" +%include "../carrays_uint8_t.i" + +%varargs(4, int digit = 0) write; + +%rename("writeArray") write(uint8_t *digits); +%rename("writeString") write(std::string digits); + +%typemap(in) uint8_t * { + void *argp = 0 ; + int res = SWIG_ConvertPtr($input, &argp, SWIGTYPE_p_uint8Array, 0 | 0); + $1 = (uint8_t *)(argp); +} + +%{ + #include "tm1637.h" +%} + +%include "tm1637.h" + diff --git a/src/tm1637/pyupm_tm1637.i b/src/tm1637/pyupm_tm1637.i new file mode 100644 index 00000000..801adf1f --- /dev/null +++ b/src/tm1637/pyupm_tm1637.i @@ -0,0 +1,16 @@ +%module pyupm_tm1637 +%include "../upm.i" +%include "../carrays_uint8_t.i" + +%varargs(4, int digit = 0) write; + +%typemap(in) uint8_t * { + void *argp = 0 ; + int res = SWIG_ConvertPtr($input, &argp,SWIGTYPE_p_uint8Array, 0 | 0 ); + $1 = reinterpret_cast< uint8_t * >(argp); +} + +%{ + #include "tm1637.h" +%} +%include "tm1637.h" diff --git a/src/tm1637/tm1637.cxx b/src/tm1637/tm1637.cxx new file mode 100644 index 00000000..5b296f7a --- /dev/null +++ b/src/tm1637/tm1637.cxx @@ -0,0 +1,204 @@ +/* + * Author: Mihai Tudor Panu + * Copyright (c) 2015 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "tm1637.h" +#include + +const uint8_t m_brkt[2] = {0x39, 0x0f}; +const uint8_t m_nums[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, + 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; +const uint8_t m_char[26] = {0x77, 0x7c, 0x39, 0x5e, 0x79, + 0x71, 0x6f, 0x76, 0x30, 0x1e, + 0x00, 0x38, 0x00, 0x00, 0x5c, + 0x73, 0x67, 0x50, 0x5b, 0x78, + 0x3e, 0x1c, 0x00, 0x00, 0x6e, + 0x5b}; + +using namespace std; +using namespace upm; + +upm::TM1637::TM1637(int clk_pin, int dio_pin, int bright, M_FAST_GPIO mmio) { + + if((m_clk = mraa_gpio_init(clk_pin)) == NULL){ + cerr << "TM1637: failed to initialize CLK pin." << endl; + return; + } + + if((m_dio = mraa_gpio_init(dio_pin)) == NULL){ + cerr << "TM1637: failed to initialize DIO pin." << endl; + return; + } + + mraa_gpio_dir(m_clk, MRAA_GPIO_OUT); + mraa_gpio_dir(m_dio, MRAA_GPIO_OUT); + + // Let the resistors pull the lines high + mraa_gpio_mode(m_clk, MRAA_GPIO_PULLUP); + mraa_gpio_mode(m_dio, MRAA_GPIO_PULLUP); + + if(mmio){ + if(mraa_gpio_use_mmaped(m_clk, 1) != MRAA_SUCCESS || + mraa_gpio_use_mmaped(m_dio, 1) != MRAA_SUCCESS){ + cerr << "TM1637: failed to set memory mapped GPIO" << endl; + return; + } + } + + mraa_gpio_write(m_clk, 0); + mraa_gpio_write(m_dio, 0); + + for (int i = 0; i < M_DISPLAY_DIGITS; i++) { + m_digits[i] = 0x00; + } + setBrightness(bright); +} +upm::TM1637::~TM1637() { + for (int i = 0; i < M_DISPLAY_DIGITS; i++) { + m_digits[i] = 0x00; + } + update(); + + mraa_gpio_close(m_clk); + mraa_gpio_close(m_dio); +} +mraa_result_t upm::TM1637::write(uint8_t *digits) { + for (int i = 0; i < M_DISPLAY_DIGITS; i++) { + m_digits[i] = digits[i]; + } + update(); + return MRAA_SUCCESS; +} +mraa_result_t upm::TM1637::write(int d, ...) { + va_list args; + va_start(args, d); + m_digits[0] = (uint8_t)d; + + for (int i = 1; i < M_DISPLAY_DIGITS; i++) { + m_digits[i] = (uint8_t)va_arg(args, int); + d++; + } + va_end(args); + update(); + return MRAA_SUCCESS; +} +mraa_result_t upm::TM1637::writeAt(int index, char symbol) { + if(index < 0 || index >= M_DISPLAY_DIGITS){ + cerr << "TM1637: invalid index in " << __FUNCTION__ << endl; + return MRAA_ERROR_INVALID_PARAMETER; + } + m_digits[index] = encode(symbol); + update(); + return MRAA_SUCCESS; +} +mraa_result_t upm::TM1637::write(std::string digits) { + int len = digits.length(); + if( len > M_DISPLAY_DIGITS){ + len = M_DISPLAY_DIGITS; + } + for (int i = 0; i < len; i++) { + m_digits[i] = encode(digits[i]); + } + update(); + return MRAA_SUCCESS; +} +void upm::TM1637::setColon(bool value) { + if(value){ + m_digits[1] |= 0x80; + } + else{ + m_digits[1] &= 0x7f; + } + update(); +} +void upm::TM1637::setBrightness(int value) { + m_brightness = value & 0x07; + update(); +} +void upm::TM1637::i2c_start() { + mraa_gpio_write(m_clk, 1); + mraa_gpio_write(m_dio, 1); + mraa_gpio_write(m_dio, 0); +} +void upm::TM1637::i2c_stop() { + mraa_gpio_write(m_clk, 0); + mraa_gpio_write(m_dio, 0); + mraa_gpio_write(m_clk, 1); + mraa_gpio_write(m_dio, 1); +} +void upm::TM1637::i2c_writeByte(uint8_t value) { + for(uint8_t i = 0; i < 8; i++) + { + mraa_gpio_write(m_clk, 0); + if(value & 0x01) + mraa_gpio_write(m_dio, 1); + else + mraa_gpio_write(m_dio, 0); + value >>= 1; + mraa_gpio_write(m_clk, 1); + } + + // Ack clock without skew, TM1637 is fast enough + mraa_gpio_write(m_clk, 0); + mraa_gpio_write(m_clk, 1); + mraa_gpio_write(m_clk, 0); +} +void upm::TM1637::update() { + i2c_start(); + i2c_writeByte(TM1637_ADDR); + i2c_stop(); + + i2c_start(); + i2c_writeByte(TM1637_REG); + for (int i = 0; i < M_DISPLAY_DIGITS; i++) { + i2c_writeByte(m_digits[i]); + } + i2c_stop(); + + i2c_start(); + i2c_writeByte(TM1637_CMD | m_brightness); + i2c_stop(); +} +uint8_t upm::TM1637::encode(char c) { + if(c >= '0' && c <= '9') + return m_nums[(int)c - 48]; + if(c >= 'a' && c <= 'z') + return m_char[(int)c - 97]; + if(c >= 'A' && c <= 'Z') + return m_char[(int)c - 65]; + if(c == '[') + return m_brkt[0]; + if(c == ']') + return m_brkt[1]; + if(c == '(' || c == ')') + return m_brkt[(int)c - 40]; + if(c == '-') + return 0x40; + if(c == '_') + return 0x08; + if(c == '}') + return 0x70; + if(c == '{') + return 0x46; + return 0x00; +} diff --git a/src/tm1637/tm1637.h b/src/tm1637/tm1637.h new file mode 100644 index 00000000..97687ef6 --- /dev/null +++ b/src/tm1637/tm1637.h @@ -0,0 +1,149 @@ +/* + * Author: Mihai Tudor Panu + * Copyright (c) 2015 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include +#include +#include +#include + +#include + + +// TM1637 specific register addresses for writing all digits at a time +#define TM1637_ADDR 0x40 +#define TM1637_REG 0xC0 +#define TM1637_CMD 0x88 + +// Display specific values +#define M_DISPLAY_DIGITS 4 + +namespace upm +{ + +/** + * @brief TM1637 7-segment display library + * @defgroup tm1637 libupm-tm1637 + * @ingroup seeed gpio display + */ + +/** + * @library tm1637 + * @sensor tm1637 + * @comname TM1637 7-Segment Display + * @type display + * @man seeed + * @con gpio + * + * @brief C++ API for TM1637 (7-segment display) + * + * The TM1637 is a display controller for LED based 7-segment displays. + * It can be used to address and write data to multiple display digits. This + * driver is based on the Grove version of the TM1637 display which uses 4 + * digits thus making it ideal for clock displays, timers, counters or even + * score display in a two player arcade game. + * + * @image html tm1637.jpeg + * @snippet tm1637.cxx Interesting + */ + + class TM1637 + { + public: + /** + * Enum for memory mapped GPIO + */ + typedef enum { + NO = 0, + YES = 1 + } M_FAST_GPIO; + /** + * TM1637 constructor + * + * @param clk_pin the clock pin the sensor is connected to + * @param dio_pin the data pin the sensor is connected to + * @param bright initial brightness from 0 to 7 dark to bright (default 3) + * @param mmio fast memory mapped gpio writes, default is yes + */ + TM1637(int clk_pin, int dio_pin, int bright = 3, M_FAST_GPIO mmio = YES); + /** + * TM1637 destructor + */ + ~TM1637(); + /** + * Write digits to the display in 7 segment encoding + * + * @param digits an array of digits to send to the display + * @return 0 if the write was successful, error code otherwise + */ + mraa_result_t write(uint8_t *digits); + /** + * Write digits to the display in 7 segment encoding + * + * @param d list of multiple arguments to send to the display + * @return 0 if the write was successful, error code otherwise + */ + mraa_result_t write(int d, ...); + /** + * Write a symbol (digit or letter) to the display at a specified index + * + * @param index 0-based index of the digit to change from the left + * @param symbol the digit or letter to display + * @return 0 if the write was successful, error code otherwise + */ + mraa_result_t writeAt(int index, char symbol); + /** + * Write all the digits or letters to the display as a string + * + * @param digits a string of symbols to display + * @return 0 if the write was successful, error code otherwise + */ + mraa_result_t write(std::string digits); + /** + * Toggles the colon between digits on the display + * + * @param value pass true to turn on the colon, false to turn it off + */ + void setColon(bool value); + /** + * Use to control the brightness of the display + * + * @param value between 0 and 7, darkest to brightest + */ + void setBrightness(int value); + + private: + void i2c_start(); + void i2c_stop(); + void i2c_writeByte(uint8_t value); + void update(); + uint8_t encode(char c); + + mraa_gpio_context m_clk, m_dio; + std::string m_name; + uint8_t m_digits[4]; + uint8_t m_brightness; + }; +}