物联网开发笔记(95)- Micropython ESP32开发之超声波测距模块HC-SR04

一、目的

        这一节我们学习如何使用乐鑫的ESP32开发板连接超声波测距模块HC-SR04,并使用串口SPI控制ILI9341 液晶屏,显示出来。

二、环境

        ESP32(固件:esp32-20220618-v1.19.1.bin) + Thonny(V4.0.1) + 超声波测距模块HC-SR04 + ILI9341 液晶屏模块 + 几根杜邦线 + Win10 64位商业版

        ILI9341屏幕的接线方法,请查看上篇文章:物联网开发笔记(94)

物联网开发笔记(94)- 使用Micropython开发ESP32开发板之获取天气数据并用ILI9341屏幕显示_魔都飘雪的博客-CSDN博客使用Micropython开发ESP32开发板之获取网络天气数据并用ILI9341屏幕显示https://blog.csdn.net/zhusongziye/article/details/129698257?spm=1001.2014.3001.5501        超声波测距模块接线方法:

三、示例代码1

        我们接着使用前面几课我们用的ILI9341显示屏,然后来把超声波测量的距离显示在屏幕上。这里的库和字体请从前面文章中获取。

物联网开发笔记(91)- 使用Micropython开发ESP32开发板之通过串口SPI控制ILI9341 液晶屏显示文字_spi驱动ili9341_魔都飘雪的博客-CSDN博客

from machine import Pin,SPI,PWM
from ili9341 import Display,color565
from xglcd_font import XglcdFont
import time

# 超声波测距模块
trig = Pin(33,Pin.OUT)  # Trig_RX_SCL_I/O
echo = Pin(32,Pin.IN,Pin.PULL_UP)  # Echo_Tx_SDA

# 调节显示亮度,初始亮度为400
blk = PWM(Pin(2),duty = (400),freq = (1000))
 
# 创建SPI对象
spi = SPI(2, baudrate=40000000, polarity=0, phase=0, bits=8, firstbit=0, sck=Pin(18), mosi=Pin(23), miso=Pin(19))
# 创建屏幕对象
tft = Display(spi,cs=Pin(5,Pin.OUT),dc=Pin(26,Pin.OUT),rst=Pin(27,Pin.OUT),width=240,height=320,rotation=180)
# 字库
font9x11 = XglcdFont("font/ArcadePix9x11.c",9,11)
font12x24 = XglcdFont("font/Unispace12x24.c",12,24)

def HCSR04(trig,echo,mode):
    trig.value(0)  # 先通过GPIO把MCU触发信号信号拉低2us
    time.sleep_us(2)
    
    trig.value(1)  # 再通过GPIO把MCU触发信号信号拉高10us,触发模块测距
    time.sleep_us(10)
    trig.value(0)  # 再通过GPIO把MCU触发信号信号拉低
    
    while echo.value() == 0:
        high = time.ticks_us()  # time.ticks_us返回不断递增的微秒计数器
        #print("high: ", high)
    while echo.value() == 1:
        low  = time.ticks_us()
        #print("low: ", low)
    print("high - low: ", high - low)  # 此处加打印多了会影响测距
    
    distance = 0
    if mode:
        # 计算方法1
        distance = (low - high) / 58 # us
    else:
        # 计算方法2 - 根据Echo管脚高电平的持续时间计算距离值
        distance = ((low - high) * 0.0340) / 2 # 声速 
    
    time.sleep(0.2) # 两次测量时间不能低于200ms
    
    if distance > 400:
        distance = 0  # 有效距离2 - 400cm
    
    return number

def main():
    blk.duty(800) # 设置屏幕背光
    while True:
        distance = HCSR04(trig,echo,1)  # 听过HCSR04函数返回距离值
        # 将距离显示在屏幕上,精度小数点后2位
        tft.draw_text(0,0,"distance: %.2f cm%s"%(number,'  '),font12x24,color565(0,255,0),color565(0,0,0))


if __name__ == "__main__":
    main()

显示效果:

 四、示例代码2

不使用屏幕显示

import time

class HCSRX(object):
    
    def __init__(self,trig,echo):
        
        self.trig = trig
        self.echo = echo
     #mode 模式选择mode = 0:声速 mode = 1:厘米 
    def Gethcsr(self,mode):
        
        #触发信号
        self.trig.value(0)
        time.sleep_us(2)
        
        self.trig.value(1)
        time.sleep_us(10)
        self.trig.value(0)
        
        #检测回响信号
        number = 0
        while self.echo.value() == 0:
            pass
            high = time.ticks_us()
        
        while self.echo.value() == 1:
            pass
            low  = time.ticks_us()
        
        if mode:
            number = (low - high) / 58  # cm
        else:
            number = ((low - high) * 0.0340)/2  # 声速340/10000=0.0340
        
        time.sleep(0.1)#两次测量时间要间隔50ms以上
        if number > 400:number = 0
        
        return number


#例程

from machine import Pin
from hcsrx import HCSRX
import time

trig = Pin(33,Pin.OUT)
echo = Pin(32,Pin.IN,Pin.PULL_UP)

def main():
    
    while True:
    
        hcsr = HCSRX(trig,echo)
        print("%.2f"%hcsr.Gethcsr(0))

if __name__ == "__main__":
    main()
    

示例效果:

 五、示例代码3

将测量方法写成库函数,然后在函数中调用

hcsrx.py

import time

class HCSRX(object):
    
    def __init__(self,trig,echo):
        
        self.trig = trig
        self.echo = echo
     #mode 模式选择mode = 0:声速 mode = 1:厘米 
    def Gethcsr(self,mode):
        
        #触发信号
        self.trig.value(0)
        time.sleep_us(2)
        
        self.trig.value(1)
        time.sleep_us(10)
        self.trig.value(0)
        
        #检测回响信号
        number = 0
        while self.echo.value() == 0:
            pass
            high = time.ticks_us()
        
        while self.echo.value() == 1:
            pass
            low  = time.ticks_us()
        
        if mode:
            number = (low - high) / 58  # cm
        else:
            number = ((low - high) * 0.0340)/2  # 声速340/10000=0.0340
        
        time.sleep(0.1)#两次测量时间要间隔50ms以上
        if number > 400:number = 0
        
        return number

示例:

from machine import Pin
from hcsrx import HCSRX
import time

trig = Pin(33,Pin.OUT)
echo = Pin(32,Pin.IN,Pin.PULL_UP)

def main(): 
    while True:
        hcsr = HCSRX(trig,echo)
        print("%.2f"%hcsr.Gethcsr(0))


if __name__ == "__main__":
    main()
    

测量效果:

 

六、测量时序图

 

七、HC-SR04超声波测距模块购买

1,低精度不带晶振

https://item.taobao.com/item.htm?spm=a1z09.2.0.0.6ea92e8dbo8yfk&id=539341488645&_u=mp01rch2149icon-default.png?t=N176https://item.taobao.com/item.htm?spm=a1z09.2.0.0.6ea92e8dbo8yfk&id=539341488645&_u=mp01rch2149        

         

 

2,高精度带晶振

https://item.taobao.com/item.htm?spm=a1z09.2.0.0.6ea92e8dbo8yfk&id=606445673789&_u=mp01rch7a63icon-default.png?t=N176https://item.taobao.com/item.htm?spm=a1z09.2.0.0.6ea92e8dbo8yfk&id=606445673789&_u=mp01rch7a63

             

         

       

 

很高兴回答你的问题,让我们开始吧! 首先,我们需要准备以下材料: - Arduino UNO开发板 - US-100超声波测距模块 - 杜邦线若干 然后,我们将US-100超声波测距模块与Arduino UNO开发板连接,具体连接方式如下: - 将US-100超声波测距模块的VCC引脚连接到Arduino UNO开发板的5V引脚。 - 将US-100超声波测距模块的GND引脚连接到Arduino UNO开发板的GND引脚。 - 将US-100超声波测距模块的Trig引脚连接到Arduino UNO开发板的数字引脚13。 - 将US-100超声波测距模块的Echo引脚连接到Arduino UNO开发板的数字引脚12。 连接完成后,我们就可以开始编写代码了。由于US-100超声波测距模块支持串口模式,因此我们可以通过串口读取测距数据。以下是示例代码: ```c++ void setup() { Serial.begin(9600); // 初始化串口 pinMode(13, OUTPUT); // 设置Trig引脚为输出模式 pinMode(12, INPUT); // 设置Echo引脚为输入模式 } void loop() { digitalWrite(13, LOW); // 发送一个10us的低电平脉冲 delayMicroseconds(10); digitalWrite(13, HIGH); delayMicroseconds(10); digitalWrite(13, LOW); float distance = pulseIn(12, HIGH) / 58.0; // 读取并计算测距数据 Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); delay(1000); // 等待1秒钟 } ``` 上述代码中,我们使用digitalWrite函数发送一个10us的低电平脉冲,触发US-100超声波测距模块开始测距。然后使用pulseIn函数读取Echo引脚上的高电平持续时间,根据声音在空气中传播的速度计算出距离。最后使用Serial.print函数将测距数据输出到串口,供外部读取。 通过上述代码,我们可以实现在Arduino平台上使用US-100超声波测距模块的串口模式测距。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔都飘雪

您的1毛奖励是我创作的源源动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值