【ESP32+MicroPython】单位数码管使用

devtools/2024/11/7 21:01:23/

在本教程中,我们将使用ESP32和MicroPython来驱动一个带小数点的单位数码管(7段显示器)。将详细讲解数码管的工作原理,并分步骤完成从基本的段位控制到完整的数字显示,最后封装成可重用的控制类。同时,本文将提供如何判断数码管是共阳极还是共阴极的方法,并为不同类型的数码管提供兼容代码。

数码管基础知识

数码管结构及显示原理

数码管通常包含7个段位(A-G)和一个小数点(DP)。不同的段位可以组合显示0-9的数字,或显示部分字母。数码管的两个主要分类是共阳极和共阴极:

  • 共阳极数码管:数码管的阳极引脚连接到电源,单个段位点亮时接地。
  • 共阴极数码管:数码管的阴极引脚接地,单个段位点亮时接电源。

判断数码管的类型

我们可以通过简单测试来判断数码管的类型。以下步骤有助于辨别:

  1. 准备电源:取一个3.3V或5V的电源。
  2. 连接任意段位引脚:将数码管的任一段位引脚连接到电源的正极。
  3. 测试公共引脚:依次将公共引脚(标记为COM或“+”“-”)接到电源的负极,观察数码管是否亮起。
    • 数码管亮起,则该数码管为共阳极
    • 若数码管未亮,再将公共引脚接到电源的正极,若此时数码管亮起,则该数码管为共阴极

硬件连接

在测试完成后,我们将数码管连接到ESP32上。以下是连接方案示例:

公共引脚的接法取决于数码管的类型:

  1. 共阳极数码管:公共引脚连接到电源(VCC,3.3V或5V)。这种类型的数码管需要通过给各段位的引脚提供低电平(即接地)来点亮段位。

  2. 共阴极数码管:公共引脚连接到地(GND)。这种类型的数码管需要通过给各段位的引脚提供高电平(即接电源)来点亮段位。

假设以下引脚分配:

  • A - GPIO 15
  • B - GPIO 2
  • C - GPIO 4
  • D - GPIO 16
  • E - GPIO 17
  • F - GPIO 5
  • G - GPIO 18
  • DP(小数点) - GPIO 19

数码管显示逻辑

数码管每个数字所需的段位亮灭状态如下表:

数字ABCDEFGDP
011111100
101100000
211011010
311110010
401100110
510110110
610111110
711100000
811111110
911110110

在代码中将使用该段位状态表来控制数码管显示。

MicroPython代码实现

初始化GPIO引脚

首先,为ESP32上连接的每个段位定义一个GPIO引脚,并初始化为输出模式。

python">from machine import Pin
import time# 定义数码管段位引脚(A-G 和 DP分别连接GPIO引脚)
pins = {'A': Pin(15, Pin.OUT),'B': Pin(2, Pin.OUT),'C': Pin(4, Pin.OUT),'D': Pin(16, Pin.OUT),'E': Pin(17, Pin.OUT),'F': Pin(5, Pin.OUT),'G': Pin(18, Pin.OUT),'DP': Pin(19, Pin.OUT)  # 小数点引脚
}# 判断数码管类型
is_common_anode = True  # 设置为 True 表示共阳极,False 表示共阴极

数字显示字典

根据数码管类型,调整段位的高低电平。例如,共阳极数码管需要低电平点亮,而共阴极数码管需要高电平点亮。

python"># 数字的段位组合,1 表示点亮,0 表示熄灭
segments = {'0': [1, 1, 1, 1, 1, 1, 0, 0],'1': [0, 1, 1, 0, 0, 0, 0, 0],'2': [1, 1, 0, 1, 1, 0, 1, 0],'3': [1, 1, 1, 1, 0, 0, 1, 0],'4': [0, 1, 1, 0, 0, 1, 1, 0],'5': [1, 0, 1, 1, 0, 1, 1, 0],'6': [1, 0, 1, 1, 1, 1, 1, 0],'7': [1, 1, 1, 0, 0, 0, 0, 0],'8': [1, 1, 1, 1, 1, 1, 1, 0],'9': [1, 1, 1, 1, 0, 1, 1, 0]
}# 根据数码管类型调整段位的电平状态
def get_segment_state(state):return not state if is_common_anode else state

定义显示函数

编写一个函数,接受一个数字字符,根据数码管类型设置各段位的电平状态。

python">def display_digit(digit, dp=False):"""显示一个数字,并控制小数点"""if digit not in segments:print("无效数字")returnsegment_states = segments[digit]# 设置每个段位的状态for i, (seg, pin) in enumerate(pins.items()):state = segment_states[i] if i < 7 else dp  # dp 为小数点控制pin.value(get_segment_state(state))

测试显示功能

依次循环显示0-9,并带小数点。

python">while True:for digit in '0123456789':display_digit(digit, dp=True)  # 小数点显示time.sleep(1)display_digit(digit, dp=False) # 小数点熄灭time.sleep(0.5)

面向对象封装

将数码管显示功能封装为一个类,使其更具可复用性。

python">class SevenSegmentDisplay:def __init__(self, pin_map, is_common_anode=True):self.segments = {key: Pin(pin, Pin.OUT) for key, pin in pin_map.items()}self.is_common_anode = is_common_anodeself.numbers = {'0': [1, 1, 1, 1, 1, 1, 0, 0],'1': [0, 1, 1, 0, 0, 0, 0, 0],'2': [1, 1, 0, 1, 1, 0, 1, 0],'3': [1, 1, 1, 1, 0, 0, 1, 0],'4': [0, 1, 1, 0, 0, 1, 1, 0],'5': [1, 0, 1, 1, 0, 1, 1, 0],'6': [1, 0, 1, 1, 1, 1, 1, 0],'7': [1, 1, 1, 0, 0, 0, 0, 0],'8': [1, 1, 1, 1, 1, 1, 1, 0],'9': [1, 1, 1, 1, 0, 1, 1, 0]}def display(self, digit, dp=False):if digit not in self.numbers:print("Invalid digit")returnfor i, (seg, pin) in enumerate(self.segments.items()):state = self.numbers[digit][i] if i < 7 else dppin.value(not state if self.is_common_anode else state)

使用方式:

python">display = SevenSegmentDisplay(pins, is_common_anode=True)
while True:for digit in '0123456789':display.display(digit, dp=True)time.sleep(1)

总结

通过本教程,我们深入学习了单位数码管的控制原理,掌握了使用ESP32和MicroPython驱动数码管的完整流程。从判断数码管类型到封装类实现数码管显示,这一系列操作将为你提供坚实的硬件控制基础。


http://www.ppmy.cn/devtools/131694.html

相关文章

第一章 Linux安装 -- 安装Debian 12操作系统(四)

文章目录 2.3.4 安装Debian 12操作系统 2.3.4 安装Debian 12操作系统 虚拟机的创建参照前面2.3.1.3节里的步骤创建&#xff0c;这里不再详述。 下面就开始安装Debian 12系统了&#xff0c;单击“开启此虚拟机”&#xff0c;如图1-161虚拟机主界面。 图1-161 虚拟机主界面 弹…

微服务架构面试内容整理-微服务架构的定义及优势

微服务架构是一种软件架构风格,它将应用程序构建为一组小的、独立的服务,每个服务围绕特定的业务功能进行开发和部署。每个微服务都可以独立运行、独立部署,并通过轻量级的通信机制(如 HTTP/REST、gRPC 或消息队列)进行交互。 微服务架构的优势: 1. 独立性: 每个微服务…

【Linux】网络相关的命令

目录 ① ip addr show ② ip route show ③ iptables -nvL ④ ping -I enx00e04c6666c0 192.168.1.100 ⑤ ip route get 192.168.1.100 ⑥ sudo ip addr add dev enx00e04c6666c0 192.168.1.101/24 ⑦ ifconfig ⑧ netstat ⑨ traceroute ⑩ nslookup ① ip addr sho…

java 中List 的使用

List集合是Collection接口的子接口&#xff0c;其下有两个实现类分别为ArrayList和 LinkedList List是一个接口&#xff0c;不能用new创建对象&#xff0c;需要用 ArrayList类 和 LinkedList类 来创建 特点 有序&#xff1a;存储元素的顺序和取出元素的顺序一致可以重复&…

C#:强大而优雅的编程语言

在当今的软件开发领域&#xff0c;C#作为一种广泛应用的编程语言&#xff0c;以其强大的功能、优雅的语法和丰富的生态系统&#xff0c;受到了众多开发者的喜爱。本文将深入探讨 C#的各个方面&#xff0c;展示它的魅力和优势。 一、C#的历史与发展 C#是由微软公司开发的一种面…

elastic search查找字段的方法

一,比如:elastic search 查找id为“ien9292voewew”的方法 此id为主键id,意思就是唯一id,在ES中是_id, 在 Elasticsearch 中,如果你想要查找特定 ID 的文档,可以使用 _get API。以下是如何通过 RESTful 请求或使用 Python 客户端来查找 ID 为 ien9292voewew 的文档的方…

牛客网最新Java高频面试题汇总(2024最新含答案)

作为一名优秀的程序员&#xff0c;技术面试都是不可避免的一个环节&#xff0c;一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 如果你参加过一些大厂面试&#xff0c;肯定会遇到一些这样的问题&#xff1a; 1、看你项目都用的框架&#xff0c;熟悉…

Docker-- cgroups资源控制实战

上一篇&#xff1a;容器化和虚拟化 什么是cgroups&#xff1f; cgroups是Linux内核中的一项功能&#xff0c;最初由Google的工程师提出&#xff0c;后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内&#xff0c;从而为系统…