这次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
- }
效果:
|