一、目的

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

二、环境

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

接线方法:

三、tm1637数码管驱动

"""
MicroPython TM1637 quad 7-segment LED display driver
https://github.com/mcauser/micropython-tm1637
MIT License
Copyright (c) 2016 Mike Causer
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.
"""from micropython import const
from machine import Pin
from time import sleep_us, sleep_msTM1637_CMD1 = const(64)  # 0x40 data command
TM1637_CMD2 = const(192) # 0xC0 address command
TM1637_CMD3 = const(128) # 0x80 display control command
TM1637_DSP_ON = const(8) # 0x08 display on
TM1637_DELAY = const(10) # 10us delay between clk/dio pulses
TM1637_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 Pin
import 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 Simulatorhttps://wokwi.com/projects/339373435833549395        这个是树莓派的Pico开发板的例子,大家可以学习一下。

六、购买

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

https://item.taobao.com/item.htm?spm=a1z09.2.0.0.51c12e8d1eMPbI&id=656314122804&_u=4p01rch019dhttps://item.taobao.com/item.htm?spm=a1z09.2.0.0.51c12e8d1eMPbI&id=656314122804&_u=4p01rch019d

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

  1. MLX90640开发笔记(一)概述及开发资料准备

    现在自己在做红外成像仪的越来越多了,两年前有个井下机电设备运行状态的科研项目,当时使用了AMG8833(8*8像素).前段时间因为公司生产电路板测试需要,打算买一台红外成像仪测量电路板发热是否正常,商 ...

  2. 【正点原子FPGA连载】第三十一章RTC实时时钟数码管显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  3. 物联网开发笔记(23)- 使用Micropython开发ESP32开发板之控制4位数码管

    上一节我们讲解了如何控制单个数码管,这一节我们来一起学一下如何控制4位数码管. 一.目的 使用MicroPython开发ESP32控制4位数码管 二.环境 ESP32+数码管+Thonny IDE+电 ...

  4. 物联网开发笔记(9)- 使用Wokwi仿真MicroPython on ESP32开发板实现温度和湿度检测并使用屏幕显示

    一.测试环境 我们同样使用在Wokwi网站上选择Micropython with ESP32进行仿真,来进行温度和湿度的检测. ESP32官方技术参考手册: https://www.espressif ...

  5. 基于MicroPython的ESP32开发

    很久前入手了一块ESP32 DEVKIT V1,当时基于C_SDK开发.最近想搞下MicroPython,就又把这块板子找出来了. 一.先下载支持MicroPython的ESP32固件 去MicroP ...

  6. Android开发笔记(七十一)区分开发模式和上线模式

    为什么要区分两种模式 许多开发者(包括博主在内)都是闷骚的程序员,为了开发调试方便,常常在代码里加上日志,还经常在页面上各种弹窗提示.这固然有利于发现bug.提高软件质量,但过多的调试信息往往容易泄露 ...

  7. 【Visual C++】游戏开发笔记三十一 回归季 游戏开发资料整理打包下载 专栏行文思路整理

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  8. 【STM32 .Net MF开发板学习-25】LED数码管显示

    在单片机系统中,LED数码管的应用是很常见的,不过对我们偏软件开发的人来说,要想研究LED还得储备一定的知识才能进行近一步的工作.不过采用.NET Micro Framework系统,我们马上就可以站 ...

  9. Modbus协议栈开发笔记之六:Modbus RTU Master开发

    这一节我们来封装最后一种应用(Modbus RTU Master应用),RTU主站的开发与TCP客户端的开发是一致的.同样的我们也不是做具体的应用,而是实现RTU主站的基本功能.我们将RTU主站的功能 ...

最新文章

  1. i7 7700hq安装Linux,黑苹果安装火影金刚4K VULCAN JinGang GTX i7-7700HQ 独显驱动 Hackintosh...
  2. python 多进程multiprocessing进程池pool tensorflow-yolov3 报错 MemoryError
  3. python tkinter控件_如何实现python tkinter控件随窗口变化?
  4. C语言打印字符串的所有排列组合(附完整源码)
  5. 20155202《网络对抗》Exp9 web安全基础实践
  6. [SHOI2008]cactus仙人掌图
  7. 10 个在线正则表达式测试网站。
  8. LeetCode 660. 移除 9(9进制)
  9. 温故而知新 C++ 类型转换
  10. 《高级无线网络—4G技术》——2.3 正交频分复用
  11. 《位置大数据隐私管理》—— 1.5 典型的位置隐私保护技术
  12. vuecli3 引入全局scss变量_利用scss公共库实现样式和业务组件解耦, 快速提高开发效率!...
  13. word中a3转a4排版打印
  14. matlab新建数据字典及如何导入
  15. SpringBoot解决跨域请求的OPTIONS问题
  16. [EXCEL] 宏的录制、调用和删除
  17. HTML设置字体大小自适应屏幕与echarts图表颜色根据数据大小实时刷新图表颜色
  18. myeclipse快速查找并快速定位
  19. 甜品店如何用大数据进行选址要素采集
  20. ognl.NoSuchPropertyException(没有对应属性异常)

热门文章

  1. 迅雷亮相1024程序员节,区块链创新技术破解监管和隐私保护两难困境
  2. BS 476-7 常做的产品有哪些?纤维板适用这个标准吗?
  3. 解决 Mathematica 无法启动的问题
  4. 【Python实现】解析Drugbank文件中的XML
  5. USB 2.0 协议中J、K、SE0状态的定义
  6. 【水文模型】05 参数不确定性分析方法
  7. addr2line工具的作用
  8. 天玑720能升级鸿蒙吗,天玑720相当于骁龙多少?
  9. Matplotlib NumPy笔记
  10. mysql tdsql_TDSQL