这一次我们使用ssd1306 驱动的I2C接口OLED显示雷达测距的数据.
原始的英文文件来源于
raspberrypi-pico/SSD1306_HCSR04 at main · stechiez/raspberrypi-pico · GitHub
在这个大神给出的驱动文件中,下载 ssd1306.py 保存在Pico的 /lib文件夹下, 然后下载 文件 SSD1306_HCSR04.py 到根目录下.
硬件连接: HC-SR04 的VCC-->VBUS(5V Out), Trig-->GPIO14, Echo-->GPIO13, GND-->GND
SSD1306 的 SCL-->GPIO3, SDA-->GPIO2, VCC-->Pin38(3V3 Out), GND-->GND
一定要注意 HC-SR04要5V驱动, 而OLED则只能连接3V3, 否则容易烧坏.
编写 HC-SR04 的驱动程序;
from machine import Pin
import utime
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import framebuf
import math
import utime
WIDTH = 128 # oled display width
HEIGHT = 64 # oled display height
sda=machine.Pin(4)
scl=machine.Pin(5)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)
# print(i2c.scan())
oled = SSD1306_I2C(128, 64, i2c)
oled.text("STechiezDIY !!!",5,5)
oled.text("Pico",5,15)
oled.text("HCSR04",5,25)
oled.text("SSD1306",5,35)
trigger = Pin(14, Pin.OUT)
echo = Pin(13, Pin.IN)
def get_distance():
trigger.low()
utime.sleep_us(2)
trigger.high()
utime.sleep_us(5)
trigger.low()
while echo.value() == 0:
signaloff = utime.ticks_us()
while echo.value() == 1:
signalon = utime.ticks_us()
timepassed = signalon - signaloff
distance = (timepassed * 0.0343) / 2
print("The distance from object is ",distance,"cm")
return distance
while True:
oled.fill(0)
ret_val = get_distance()
oled.text("Distance:",0,0)
oled.text(str(ret_val) + " cm",0,10)
oled.show()
utime.sleep(1)
其中
trigger = Pin(14, Pin.OUT)
echo = Pin(13, Pin.IN)
def get_distance():
trigger.low()
utime.sleep_us(2)
trigger.high()
utime.sleep_us(5)
trigger.low()
while echo.value() == 0:
signaloff = utime.ticks_us()
while echo.value() == 1:
signalon = utime.ticks_us()
timepassed = signalon - signaloff
distance = (timepassed * 0.0343) / 2
print("The distance from object is ",distance,"cm")
return distance
这里先定义引脚, 然后定义函数通过激发 HC-SR04 的发送端和接收端的信号时差计算距离.
遇到的问题: 不知道是因为硬件还是什么问题, 我的板子上用I2C0的两个引脚 GPIO0和GPIO1连接OLED时会显示不出来, 程序报错. 但是换成 I2C1的两个引脚GPIO2和GPIO3后正常显示.