Contador de 0 à 9 com Raspberry Pi Pico, Display de 7 segmentos e MicroPython

2021/03/15

Para este exemplo é necessário ter instalado a Thonny IDE e também são necessário o seguintes componentes de hardware:

Primeiramente vamos criar o arquivo seven_segment.py para definir o módulo seven_segment. Este módulo vai conter uma classe chamada Display, que representará um Display de 7 segmentos:

Arquivo seven_segment.py:

import machine

# Classe que representa um display de 7 segmentos
# pode ser configurado como anodo comum ou catodo comum
# por padrão é inicializado como catodo comum
class Display:

    # o construtor do diplay recebe os pinos correspondentes à cada segmento
    def __init__(self, a, b, c, d, e, f, g):
        self.common_cathode()
        self.a = machine.Pin(a, machine.Pin.OUT)
        self.b = machine.Pin(b, machine.Pin.OUT)
        self.c = machine.Pin(c, machine.Pin.OUT)
        self.d = machine.Pin(d, machine.Pin.OUT)
        self.e = machine.Pin(e, machine.Pin.OUT)
        self.f = machine.Pin(f, machine.Pin.OUT)
        self.g = machine.Pin(g, machine.Pin.OUT)

    # indica que o display é de catodo comum
    # no display de catodo cumum
    # o nivel lógico alto acende o segmento
    # o nivel lógico baixo apaga o segmento
    def common_cathode(self):
        self.on = 1
        self.off = 0

    # indica que o display é de anodo comum
    # no display de anoodo cumum
    # o nivel lógico baixo acende o segmento
    # o nivel lógico alto apaga o segmento
    def common_anode(self):
        self.on = 0
        self.off = 1
    
    # apresenta o número informado
    def show(self, digito):
        if digito == 0:
            self._state(self.on, self.on, self.on, self.on, self.on, self.on, self.off)
            return
        if digito == 1:
            self._state(self.off, self.on, self.on, self.off, self.off, self.off, self.off)
            return
        if digito == 2:
            self._state(self.on, self.on, self.off, self.on, self.on, self.off, self.on)
            return
        if digito == 3:
            self._state(self.on, self.on, self.on, self.on, self.off, self.off, self.on)
            return
        if digito == 4:
            self._state(self.off, self.on, self.on, self.off, self.off, self.on, self.on)
            return
        if digito == 5:
            self._state(self.on, self.off, self.on, self.on, self.off, self.on, self.on)
            return
        if digito == 6:
            self._state(self.on, self.off, self.on, self.on, self.on, self.on, self.on)
            return
        if digito == 7:
            self._state(self.on, self.on, self.on, self.off, self.off, self.off, self.off)
            return
        if digito == 8:
            self._state(self.on, self.on, self.on, self.on, self.on, self.on, self.on)
            return
        if digito == 9:
            self._state(self.on, self.on, self.on, self.on, self.off, self.on, self.on)
            return
        
    # altera o estado de ligado/desligado de cada um dos 7 segmentos
    def _state(self, a, b, c, d, e, f, g):
        self.a.value(a)
        self.b.value(b)
        self.c.value(c)
        self.d.value(d)
        self.e.value(e)
        self.f.value(f)
        self.g.value(g)

Na imagem a seguir encontra-se o esquema do circuito:

esquema-circuito.png

esquema-circuito.png

Com o circuito montado, vamos agora criar o arquivo main.py, que é o arquivo executado automaticamente quando o Raspberry Pi Pico é ligado.

Primeiro vamos importar a classe Display do módulo seven_segment e também os módulos machine e utime, dessa forma:

from seven_segment import Display
import machine
import utime

Agora vamos declarar uma variável display do tipo Display conectado aos pinos GPIO de 0 à 6 do Raspberry Pi Pico.

# display de 7 segmentos com anodo comum
# os segmentos estão conectados nos GPIOs de 0 à 6
display = Display(0, 1, 2, 3, 4, 5, 6)

# o display utilizado neste exemplo é de anodo comum
display.common_anode()

Em seguida vamos declarar uma variável led_azul, que corresponde ao LED que conectamos na GPIO 16 do Raspberry Pi Pico.

# LED azul conectado na GPIO 16
led_azul = machine.Pin(16, machine.Pin.OUT)

Também vamos declarar uma variável led_verde, que corresponde ao LED onboard do Raspberry Pi Pico, esse LED é acessível através do GPIO 25.

# LED onboard do Raspberry Pi Pico
led_verde = machine.Pin(25, machine.Pin.OUT)

Até o momento já temos o código necessário para acessar o Display de 7 segmentos, um LED externo e o LED onboard.

Antes de escrever o loop infinito que vai incrementar/decrementar o digito e acender/apagar os LEDs, vamos primeiramente criar duas variáveis, numero e incremento e uma função proximoNumero().

Essa função será responsável por controlar se o próximo numero é crescente ou decrescente.

O contador vai iniciar em 0, vai incrementando até 9.

Quando chegar em 9, ele vai decrementando até 0.

# variável que vai determinar se incrementa 1 ou decrementa 1
incremento = 1

# número a ser apresentado no display
numero = 0

# função para obter o próximo número
def proximoNumero():
    global numero
    global incremento
    numero += incremento
    if (numero == 9): # quando chegar em 9, conta de 9 à 0
        incremento = -1
    if (numero == 0): # quando chegar em 0, conta de 0 à 9
        incremento = 1

Agora podemos escrever o loop infinito do nosso contador, conforme abaixo:

# loop infinito do programa
while True:
    led_verde.value(1)   # acende o LED onboard
    led_azul.value(0)    # apaga o LED azul
    display.show(numero) # apresenta o número atual
    utime.sleep(1)       # aguarda 1 segundo
    proximoNumero()      # incrementa ou decrementa o número atual
    
    led_verde.value(0)   # apaga o LED onboard
    led_azul.value(1)    # acende o LED azul
    display.show(numero) # apresenta o número atual
    utime.sleep(1)       # aguarda 1 segundo
    proximoNumero()      # incrementa ou decrementa o número atual

O conteúdo completo do main.py ficará dessa forma:

Arquivo main.py:

from seven_segment import Display
import machine
import utime

# display de 7 segmentos com anodo comum
# os segmentos estão conectados nos GPIOs de 0 à 6
display = Display(0, 1, 2, 3, 4, 5, 6)
display.common_anode()

# LED azul conectado na GPIO 16
led_azul = machine.Pin(16, machine.Pin.OUT)

# LED onboard do Raspberry Pi Pico
led_verde = machine.Pin(25, machine.Pin.OUT)

# variável que vai determinar se incrementa +1 ou -1
incremento = 1

# número a ser apresentado no display
numero = 0

# função para obter o próximo número
def proximoNumero():
    global numero
    global incremento
    numero += incremento
    if (numero == 9): # quando chegar em 9, conta de 9 à 0
        incremento = -1
    if (numero == 0): # quando chegar em 0, conta de 0 à 9
        incremento = 1

# loop infinito do programa
while True:
    led_verde.value(1)   # acende o LED onboard
    led_azul.value(0)    # apaga o LED azul
    display.show(numero) # apresenta o número atual
    utime.sleep(1)       # aguarda 1 segundo
    proximoNumero()      # incrementa ou decrementa o número atual
    
    led_verde.value(0)   # apaga o LED onboard
    led_azul.value(1)    # acende o LED azul
    display.show(numero) # apresenta o número atual
    utime.sleep(1)       # aguarda 1 segundo
    proximoNumero()      # incrementa ou decrementa o número atual

Utilizando o Thonny IDE, salve os arquivos seven_segment.py e main.py no Raspberry Pi Pico. Em seguida pressione o botão Play para iniciar a execução.

Abaixo uma imagem da execução do circuito montado em um protoboard:

montagem-circuito.png

montagem-circuito.png

O fonte completo deste exemplo está disponível em meu GitHub.