700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 物联网开发笔记(75)- 使用Micropython开发ESP32开发板之控制tm1637时钟数码管显示

物联网开发笔记(75)- 使用Micropython开发ESP32开发板之控制tm1637时钟数码管显示

时间:2024-06-05 00:00:58

相关推荐

物联网开发笔记(75)- 使用Micropython开发ESP32开发板之控制tm1637时钟数码管显示

一、目的

这一节我们学习如何使用我们的ESP32开发板来控制4位tm1637时钟数码管显示。

二、环境

ESP32 + 4位tm1637时钟数码管(wokwi仿真也可) + Thonny IDE + 几根杜邦线 + Win10

接线方法:

三、tm1637数码管驱动

"""MicroPython TM1637 quad 7-segment LED display driver/mcauser/micropython-tm1637MIT LicenseCopyright (c) Mike CauserPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, 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 THESOFTWARE."""from micropython import constfrom machine import Pinfrom time import sleep_us, sleep_msTM1637_CMD1 = const(64) # 0x40 data commandTM1637_CMD2 = const(192) # 0xC0 address commandTM1637_CMD3 = const(128) # 0x80 display control commandTM1637_DSP_ON = const(8) # 0x08 display onTM1637_DELAY = const(10) # 10us delay between clk/dio pulsesTM1637_MSB = const(128) # msb is the decimal point or the colon depending on your display# 0-9, a-z, blank, dash, star_SEGMENTS = bytearray(b'\x3F\x06\x5B\x4F\x66\x6D\x7D\x07\x7F\x6F\x77\x7C\x39\x5E\x79\x71\x3D\x76\x06\x1E\x76\x38\x55\x54\x3F\x73\x67\x50\x6D\x78\x3E\x1C\x2A\x76\x6E\x5B\x00\x40\x63')class TM1637(object):"""Library for quad 7-segment LED modules based on the TM1637 LED driver."""def __init__(self, clk, dio, brightness=7):self.clk = clkself.dio = dioif not 0 <= brightness <= 7:raise ValueError("Brightness out of range")self._brightness = brightnessself.clk.init(Pin.OUT, value=0)self.dio.init(Pin.OUT, value=0)sleep_us(TM1637_DELAY)self._write_data_cmd()self._write_dsp_ctrl()def _start(self):self.dio(0)sleep_us(TM1637_DELAY)self.clk(0)sleep_us(TM1637_DELAY)def _stop(self):self.dio(0)sleep_us(TM1637_DELAY)self.clk(1)sleep_us(TM1637_DELAY)self.dio(1)def _write_data_cmd(self):# automatic address increment, normal modeself._start()self._write_byte(TM1637_CMD1)self._stop()def _write_dsp_ctrl(self):# display on, set brightnessself._start()self._write_byte(TM1637_CMD3 | TM1637_DSP_ON | self._brightness)self._stop()def _write_byte(self, b):for i in range(8):self.dio((b >> i) & 1)sleep_us(TM1637_DELAY)self.clk(1)sleep_us(TM1637_DELAY)self.clk(0)sleep_us(TM1637_DELAY)self.clk(0)sleep_us(TM1637_DELAY)self.clk(1)sleep_us(TM1637_DELAY)self.clk(0)sleep_us(TM1637_DELAY)def brightness(self, val=None):"""Set the display brightness 0-7."""# brightness 0 = 1/16th pulse width# brightness 7 = 14/16th pulse widthif val is None:return self._brightnessif not 0 <= val <= 7:raise ValueError("Brightness out of range")self._brightness = valself._write_data_cmd()self._write_dsp_ctrl()def write(self, segments, pos=0):"""Display up to 6 segments moving right from a given position.The MSB in the 2nd segment controls the colon between the 2ndand 3rd segments."""if not 0 <= pos <= 5:raise ValueError("Position out of range")self._write_data_cmd()self._start()self._write_byte(TM1637_CMD2 | pos)for seg in segments:self._write_byte(seg)self._stop()self._write_dsp_ctrl()def encode_digit(self, digit):"""Convert a character 0-9, a-f to a segment."""return _SEGMENTS[digit & 0x0f]def encode_string(self, string):"""Convert an up to 4 character length string containing 0-9, a-z,space, dash, star to an array of segments, matching the length of thesource string."""segments = bytearray(len(string))for i in range(len(string)):segments[i] = self.encode_char(string[i])return segmentsdef encode_char(self, char):"""Convert a character 0-9, a-z, space, dash or star to a segment."""o = ord(char)if o == 32:return _SEGMENTS[36] # spaceif o == 42:return _SEGMENTS[38] # star/degreesif o == 45:return _SEGMENTS[37] # dashif o >= 65 and o <= 90:return _SEGMENTS[o-55] # uppercase A-Zif o >= 97 and o <= 122:return _SEGMENTS[o-87] # lowercase a-zif o >= 48 and o <= 57:return _SEGMENTS[o-48] # 0-9raise ValueError("Character out of range: {:d} '{:s}'".format(o, chr(o)))def hex(self, val):"""Display a hex value 0x0000 through 0xffff, right aligned."""string = '{:04x}'.format(val & 0xffff)self.write(self.encode_string(string))def number(self, num):"""Display a numeric value -999 through 9999, right aligned."""# limit to range -999 to 9999num = max(-999, min(num, 9999))string = '{0: >4d}'.format(num)self.write(self.encode_string(string))def numbers(self, num1, num2, colon=True):"""Display two numeric values -9 through 99, with leading zerosand separated by a colon."""num1 = max(-9, min(num1, 99))num2 = max(-9, min(num2, 99))segments = self.encode_string('{0:0>2d}{1:0>2d}'.format(num1, num2))if colon:segments[1] |= 0x80 # colon onself.write(segments)def temperature(self, num):if num < -9:self.show('lo') # lowelif num > 99:self.show('hi') # highelse:string = '{0: >2d}'.format(num)self.write(self.encode_string(string))self.write([_SEGMENTS[38], _SEGMENTS[12]], 2) # degrees Cdef show(self, string, colon=False):segments = self.encode_string(string)if len(segments) > 1 and colon:segments[1] |= 128self.write(segments[:4])def scroll(self, string, delay=250):segments = string if isinstance(string, list) else self.encode_string(string)data = [0] * 8data[4:0] = list(segments)for i in range(len(segments) + 5):self.write(data[0+i:4+i])sleep_ms(delay)class TM1637Decimal(TM1637):"""Library for quad 7-segment LED modules based on the TM1637 LED driver.This class is meant to be used with decimal display modules (modulesthat have a decimal point after each 7-segment LED)."""def encode_string(self, string):"""Convert a string to LED segments.Convert an up to 4 character length string containing 0-9, a-z,space, dash, star and '.' to an array of segments, matching the length ofthe source string."""segments = bytearray(len(string.replace('.','')))j = 0for i in range(len(string)):if string[i] == '.' and j > 0:segments[j-1] |= TM1637_MSBcontinuesegments[j] = self.encode_char(string[i])j += 1return segments

四、示例代码

from machine import Pinimport tm1637smg = tm1637.TM1637(clk=Pin(18),dio=Pin(19))def main():smg.show(" ") # 四个空格,清屏#smg.hex(10) #十六进制A#smg.number(1234) # 显示数字,范围0-9999#smg.numbers(11,56,1) # 时间显示,传递2个数值,最后一位1是点亮0是灭#smg.temperature(22) #温度显示#smg.show("2 9") # 输入空格则不显示,可用于清屏#smg.show("{} ".format(8))#smg.show(" %.2d"%6) #显示06smg.scroll("0123 4567 89") #向左滚动显示if __name__=="__main__":main()

演示效果,大家自行去实验吧,太多无法一一列举。

五、仿真案例

PicoTM1637 - Wokwi Arduino and ESP32 Simulator/projects/339373435833549395 这个是树莓派的Pico开发板的例子,大家可以学习一下。

六、购买

4位tm1637时钟数码管,某宝链接如下:

/item.htm?spm=a1z09.2.0.0.51c12e8d1eMPbI&id=656314122804&_u=4p01rch019d/item.htm?spm=a1z09.2.0.0.51c12e8d1eMPbI&id=656314122804&_u=4p01rch019d

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。