这次Arduino UNO开发板与US-100超声波测距模块实现测距,同时该模块自带温度测试功能。US-100超声波测距模块支持电平触发和串口触发两种模式。
【一】硬件连接:
US-100超声波测距模块:
硬件连接:
【二】电平触发模式:
原理:
采用IO触发测距,给至少10us的高电平信号;模块自动发送8个40KHz的方波,自动检测是否有信号返回;有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间;测试距离=(高电平时间*声速(340m/s))/2。
程序:
/*
Arduino UNO与US-100超声波模块测试
电平触发模式
*/
const int TrigPin = 2;
const int EchoPin = 3;
float cm;
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop()
{
digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
cm = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print("Distance:");
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(1000);
}
效果:
【三】串口触发模式:
原理:
使用串口触发模式时,当插上跳线帽时为UART(串口)模式只需要在Trig/TX管脚输入0X55(波特率9600),系统便启动对当前距离进行测量,然后将距离值通过Echo/RX 管脚输出测量输出的距离值共两个字节,第一个字节是距离的高8位(HDate),第二个字节为距离的低8(LData),单位为毫米。即距离值为 (HData*256 +LData)mm。测温时只需要在Trig/TX管脚输入0X50,系统便启动温度测量,然后将温度值通过Echo/RX 管脚输出,返回一个字节的TData,实际的温度值为TData-45。
程序:
/*
Arduino UNO与US-100超声波模块测试
串口触发模式,需要插上模块背面的跳线
*/
#include <SoftwareSerial.h>
// 串口
#define _baudrate 9600
#define _rxpin 3
#define _txpin 2
#define DBG_UART dbgSerial //调试打印串口
SoftwareSerial dbgSerial( _rxpin, _txpin ); // 软串口,调试打印
void setup()
{
DBG_UART.begin( _baudrate );
Serial.begin( _baudrate );
}
void loop()
{
unsigned int lenHigh = 0; // 高位
unsigned int lenLow = 0; // 低位
unsigned int dist_mm = 0; // 距离
unsigned int tdata = 0;
unsigned int temp = 0; // 温度
DBG_UART.flush(); // 清空串口接收缓冲区
DBG_UART.write(0x55); // 发送0x55,触发US-100 开始测距
delay(500); // 延时500 毫秒
// 当串口接收缓冲区中数据大于2字节
if(DBG_UART.available() >= 2)
{
lenHigh = DBG_UART.read(); // 距离的高字节
lenLow = DBG_UART.read(); // 距离的低字节
dist_mm = lenHigh*256 + lenLow; // 计算距离值
}
DBG_UART.flush(); // 清空串口接收缓冲区
DBG_UART.write(0x50); // 发送0x50,触发US-100 开始测温
delay(500); // 延时500 毫秒
// 当串口接收缓冲区中数据大于1字节
if(DBG_UART.available() >= 1)
{
tdata = DBG_UART.read(); // 温度字节
temp = tdata-45; // 计算温度值
}
// 有效的测距的结果在1mm 到 10m 之间
if((dist_mm > 1) && (dist_mm < 10000))
{
Serial.print("Distance is: ");// 输出结果至串口监视器
Serial.print(dist_mm, DEC);
Serial.print("mm ");
Serial.print("Temperature is: ");// 输出结果至串口监视器
Serial.print(temp, DEC);
Serial.println(".C");
}
delay(500); // 等待500ms
}
效果:
|