经过仔细分析发现,问题出在spi的设置上,通过修改后,hcsr04就可以正常运行了。顺便又对代码进行了优化,让代码可以更加有效的运行:
- 调整了缓冲区大小,留出更多空间给其他功能;
- 优化了spi初始化功能,不需要每次测量都重新初始化
- 优化了缓冲区,不需要每次测量都重新设置缓冲区
- 优化了SCK引脚定义,避免了设置一个多余的SCK引脚(这一点对麦昆尤其重要)
代码: 全选
from microbit import spi, pin1, pin2
length=200
class HCSR04:
def __init__(self, tpin=pin1, epin=pin2):
spi.init(baudrate=125000, sclk=tpin, mosi=tpin, miso=epin)
self.r = bytearray(length)
def distance(self):
pre = 0
post = 0
k = -1
self.r[0] = 255
spi.write_readinto(self.r, self.r)
# find first non zero value
try:
i, value = next((ind, v) for ind, v in enumerate(self.r) if v)
except StopIteration:
i = -1
if i > 0:
pre = bin(value).count("1")
try:
k, value = next((ind, v)
for ind, v in enumerate(self.r[i:length - 2]) if self.r[i + ind + 1] == 0)
post = bin(value).count("1") if k else 0
k = k + i
except StopIteration:
i = -1
dist= -1 if i < 0 else round(((pre + (k - i) * 8. + post) * 8 * 0.172) / 2)
return dist