Raspberry Pi Pico com microPython: blinkWithoutDelay

Hoje vamos implementar uma função interessante no Raspberry Pi Pico com microPython: blinkWithoutDelay. Essa função elimina a necessidade de utilizar time.sleep() que deixa o programa parado esperando.

A ideia é utilizar a função time.ticks_us() que fornece o tempo atual em microssegundos. Ficamos contando até que tempo suficiente se passe entre o tempo atual (currentTime) e o tempo capturado anteriormente (oldTime).

No código abaixo o valor 1000000 significa 1 milhão de microssegundos, ou 1 segundo. Eu faço um led.toggle() (ligar o desligado e desligar o ligado) em um LED externo e no LED onboard a cada segundo. No restante do tempo o programa fica livre para fazer o que mais precisar.

from machine import Pin
import time

led = machine.Pin(18, machine.Pin.OUT)
onboard = machine.Pin(25, machine.Pin.OUT)
oldTime = 0
currentTime = 0
led.off()
onboard.off()

while True:
    
     currentTime = time.ticks_us()
     
     if(currentTime - oldTime > 1000000):
         oldTime = currentTime
         led.toggle()
         onboard.toggle()

Abaixo um gif do código em funcionamento. Veja que o LED externo tem um resistor de 1k Ohm em série.

Piscar led sem time.sleep()
Piscar led sem time.sleep()

Agora um exemplo alternando os dois LEDs.

from machine import Pin
import time

led = machine.Pin(18, machine.Pin.OUT)
onboard = machine.Pin(25, machine.Pin.OUT)
oldTime = 0
currentTime = 0
led.off()
onboard.off()

while True:
    
     currentTime = time.ticks_us()
     
     if(currentTime - oldTime > 1000000):
         oldTime = currentTime
         
         if(led.value() == True):
             onboard.on()
             led.off()
         else:
             onboard.off()
             led.on()

Quer colocar mais tarefas no mesmo programa? veja o código abaixo, onde eu coloco cada um dos dois LEDs em uma tarefa diferente, neste caso um tempo diferente.

Um LED pisca a cada 1 segundo e o outro a cada 250 milissegundos.

from machine import Pin
import time

led = machine.Pin(18, machine.Pin.OUT)
onboard = machine.Pin(25, machine.Pin.OUT)
oldTime = 0
oldTime2 = 0
currentTime = 0
led.off()
onboard.off()

while True:
    
     currentTime = time.ticks_us()
     
     if(currentTime - oldTime > 1000000):
         oldTime = currentTime
         
         onboard.toggle()
             
     if(currentTime - oldTime2 > 250000):
         oldTime2 = currentTime
        
         led.toggle()

Efetivamente estamos executando mais de uma tarefa (piscar dois LEDs em tempos diferentes) sem ocupar o tempo do processador com time.sleep(). Tem um pouco mais sobre manipulação de IOs aqui.

Não pegou o básico sobre microPython com Raspberry Pi Pico? leia este artigo.

Um comentário a “Raspberry Pi Pico com microPython: blinkWithoutDelay”

  1. […] eu estava apenas rodando um blink (pisca) de dois LEDs deste artigo, nada de mais. Aí o pessoal dos comentários do link acima comentou de utilizar o watchdog para […]

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *