概述
超声波测距是通过发射超声波,并计算传感器收到回声的时间差,从而得出传感器到目标物体距离的一种方法。 ME007YS是一款防水的超声波测距模块,有效测量距离4.5米,可直接兼容3.3V或者5V控制设备,例如Arduino,树莓派等。ME007YS平均工作电流仅8mA,绝大部分控制器IO端口便可以为ME007YS模块提供工作电流。
它采用封闭式收发一体式超声波探头,具有一定的防尘防水能力,能够在潮湿、恶劣的测量环境中工作。外形小巧,质量轻盈,这为你的安装也带来了便利。预留2.54间距-4P接口,采用UART通信方式,能够适应更多系统架构的二次开发与应用。 ME007YS防水超声波传感器各项参数都经过我们长时间严格的实验测定和优化,具有一流的测距响应速度、稳定性、灵敏度及低功耗。如果您的产品或设计对超声波传感器性能有着近乎苛刻的要求,那么ME007YS绝对是您的最佳选择。
技术参数

- 工作电压:3.3~5V
- 平均电流:<8mA
- 峰值电流:≤50mA
- 盲区距离:0-28cm
- 平面物体量程:28-450cm
- 输出方式:UART串口
- 工作周期:100ms
- 探头中心频率:40K±1.0K
- 工作温度:-15~60℃
- 存储温度:-25~80℃
- 工作湿度:≤80%
- 存储湿度:≤90%
- 感应角度:44°
- 防水等级:IP67
功能特点
- 防护等级高
- 抗干扰强
- 数据输出稳定可靠
- 功耗低
- 响应时间快
- 抗静电强
- 工作温度宽
- 测量精度高
- 体积小,安装便捷
安装尺寸

接口定义

引脚说明
| 引脚编号 | 名称 | 功能描述 | 
|---|---|---|
| 1 | VCC | 电源输入引脚 | 
| 2 | GND | 电源接地引脚 | 
| 3 | RX | 功能引脚 | 
| 4 | TX | UART 输出引脚 | 
UART输出说明
UART通信说明
当触发输入引线“RX”悬空或者输入高电平时,模块按照处理值输出,数据更稳定,响应时间为100-300ms;当输入低电平时模块按照实时值输出,响应时间为100ms。
注:若串口无法正常显示,上电前需将RX接入低电平,并保持
| UART | 数据位 | 停止位 | 奇偶校验 | 波特率 | 
|---|---|---|---|---|
| TTL电平 | 8 | 1 | 无 | 9600bps | 
UART输出格式
| 帧数据 | 说明 | 字节 | 
|---|---|---|
| 帧头 | 固定为0xFF | 1字节 | 
| DATA_H | 距离数据高8位 | 1字节 | 
| DATA_L | 距离数据低8位 | 1字节 | 
| SUM | 通讯校验和 | 1字节 | 
UART输出举例
| 帧头 | DATA_H | DATA_L | SUM | 
|---|---|---|---|
| 0xFF | 0x07 | 0xA1 | 0xA7 | 
注:校验和只保留累加数值的低8位;
SUM	=(帧头+ Data_H+ Data_L)&0x00FF
	=(0XFF + 0X07 + 0XA1)&0x00FF
	=0XA7;
距离值=Data_H\*256+ Data_L=0X07A1;
转换成十进制等于1953;
表示当前测量的距离值为1953毫米
Arduino平台应用
准备工作
- Arduino UNO
- UNO IO传感器扩展板
- ME007YS波传感器
- 4P连接线一根
软件
- Arduino IDE 版本1.6.8 点击下载Arduino IDE
Arduino连接图

示例代码
/*
       @File  : DFRobot_Distance_ME007YS.ino
       @Brief : This example use ME007YS ultrasonic sensor to measure distance
                With initialization completed, We can get distance value
       @Copyright [DFRobot](http://www.dfrobot.com),2016
                  GUN Lesser General Pulic License
       @version V1.0
       @data  2019-8-28
*/
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 10); // RX, TX
unsigned char data[4] = {};
float distance;
void setup()
{
  Serial.begin(57600);
  mySerial.begin(9600);
}
void loop()
{
  do {
    for (int i = 0; i < 4; i++)
    {
      data[i] = mySerial.read();
    }
  } while (mySerial.read() == 0xff);
  mySerial.flush();
  if (data[0] == 0xff)
  {
    int sum;
    sum = (data[0] + data[1] + data[2]) & 0x00FF;
    if (sum == data[3])
    {
      distance = (data[1] << 8) + data[2];
      if (distance > 280)
      {
        Serial.print("distance=");
        Serial.print(distance / 10);
        Serial.println("cm");
      } else
      {
        Serial.println("Below the lower limit");
      }
    } else Serial.println("ERROR");
  }
  delay(500);
}
ESP32平台应用
ESP32连接图
示例代码
以下程序需要自己在Arduino IDE上搭建ESP32开发环境方能使用
#include <HardwareSerial.h>
HardwareSerial mySerial(1);
unsigned char data[4] = {};
float distance;
void setup()
{
  mySerial.begin(9600, SERIAL_8N1, 0, 4);
  Serial.begin(115200);
}
void loop()
{
  do {
    for (int i = 0; i < 4; i++)
    {
      data[i] = mySerial.read();
    }
  } while (mySerial.read() == 0xff);
  mySerial.flush();
  if (data[0] == 0xff)
  {
    int sum;
    sum = (data[0] + data[1] + data[2]) & 0x00FF;
    if (sum == data[3])
    {
      distance = (data[1] << 8) + data[2];
      if (distance > 280)
      {
        Serial.print("distance=");
        Serial.print(distance / 10);
        Serial.println("cm");
      } else
      {
        Serial.println("Below the lower limit");
      }
    } else Serial.println("ERROR");
  }
  delay(500);
}
Raspberry Pi平台应用
准备工作
- 树莓派4B
- 树莓派 IO扩展板
- ME007YS超声波传感器
- 4P连接线一根
Raspberry Pi连接图

示例代码
下载超声波库文件
# -*- coding:utf-8 -*-
'''
  # demo_get_distance.py
  #
  # Connect board with raspberryPi.
  # Run this demo.
  #
  # Connect ME007YS to UART
  # get the distance value
  #
  # Copyright   [DFRobot](http://www.dfrobot.com), 2016
  # Copyright   GNU Lesser General Public License
  #
  # version  V1.0
  # date  2019-8-31
'''
import time
from DFRobot_RaspberryPi_A02YYUW import DFRobot_A02_Distance as Board
board = Board()
def print_distance(dis):
    if board.last_operate_status == board.STA_OK:
        print("Distance %d mm" % dis)
    elif board.last_operate_status == board.STA_ERR_CHECKSUM:
        print("ERROR")
    elif board.last_operate_status == board.STA_ERR_SERIAL:
        print("Serial open failed!")
    elif board.last_operate_status == board.STA_ERR_CHECK_OUT_LIMIT:
        print("Above the upper limit: %d" % dis)
    elif board.last_operate_status == board.STA_ERR_CHECK_LOW_LIMIT:
        print("Below the lower limit: %d" % dis)
    elif board.last_operate_status == board.STA_ERR_DATA:
        print("No data!")
if __name__ == "__main__":
    dis_min = 0  # Minimum ranging threshold: 0mm
    dis_max = 4500  # Highest ranging threshold: 4500mm
    board.set_dis_range(dis_min, dis_max)
    while True:
        distance = board.getDistance()
        print_distance(distance)
        time.sleep(0.3)  # Delay time < 0.6s
注:从树莓派3开始,树莓派有2个串口,默认被映射到板载蓝牙串口,需要通过设置将串口重新映射到GPIO的串口上
树莓派串口映射教程.pdf