# 作业23-在shell控制台、OLED屏上同时显示超声波测距SR04的信息
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from time import sleep_us, ticks_us
# ------------------ 硬件初始化 ------------------
# HC-SR04超声波传感器
trigger = Pin(12, Pin.OUT) # 触发引脚(GPIO12)
echo = Pin(14, Pin.IN) # 回声引脚(GPIO14)
# OLED屏幕(I2C接口)
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = SSD1306_I2C(128, 64, i2c)
# ------------------ 功能函数 ------------------
def get_distance():
"""获取超声波传感器测量的距离(厘米)"""
# 触发脉冲
trigger.value(0)
sleep_us(2)
trigger.value(1)
sleep_us(10)
trigger.value(0)
# 测量回声时间
while echo.value() == 0:
pulse_start = ticks_us()
while echo.value() == 1:
pulse_end = ticks_us()
# 计算距离(厘米)
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 0.034 / 2 # 声速340m/s,转换为厘米
return distance
def display_oled(distance):
"""在OLED显示距离数据"""
oled.fill(0)
oled.text("Distance:", 0, 0)
oled.text(f"{distance:.1f} cm", 0, 20)
oled.show()
def loop():
"""主循环:同时输出到Shell和OLED"""
while True:
distance = get_distance()
# 1. 输出到Shell控制台
print(f"Distance: {distance:.1f} cm")
# 2. 显示到OLED屏
display_oled(distance)
sleep_us(500000) # 500ms测量间隔
# ------------------ 程序入口 ------------------
if __name__ == '__main__':
loop()