闲置了好久的一些散件,觉得还是用来干点什么比较好,so,就做了这么一个超声波测距的东西。
硬件:Arduino UNO一块
HC-SR04超声波测距模块一个
IIC1602显示模块一个
UNO固定板一块
连接:
超声波:VCC — 5v
Trig — D5
Echo — D4
GND — GND
IIC1602:VCC — VCC
GND — GND
SDA — SDA
SCL — SCL
首先检测自己的1602地址,打开串口,设置波特率9600,写入以下代码:
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}
之后就能看到地址了,我的是0x3F。
然后写入以下代码:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x3F,16,2);//设置I2C驱动板的地址,楼主的是0x3F,请根据上一步获得的写入,不然不会再LCD上显示信息
int inputPin=4; // 定义超声波信号接收接口
int outputPin=5; // 定义超声波信号发出接口
int ledpin=13;
void setup()
{
Serial.begin(9600);
pinMode(ledpin,OUTPUT);
pinMode(inputPin, INPUT);
pinMode(outputPin, OUTPUT);
}
void loop()
{
lcd.init();
digitalWrite(outputPin, LOW); // 使发出发出超声波信号接口低电平2ms
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); // 使发出发出超声波信号接口高电平10ms,这里是至少10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 保持发出超声波信号接口低电平
float distance = pulseIn(inputPin, HIGH); // 读出脉冲时间
distance= 1.3+distance/58; // 将脉冲时间转化为距离(加上底座高度单位:厘米)
Serial.print(distance);
Serial.println("cm");//向串口监视器中输出距离信息
lcd.backlight();
lcd.setCursor(0,0);//光标从这里开始
lcd.print("Distance is");
lcd.setCursor(0,1);//换行后显示距离
lcd.print(distance);
lcd.println("cm");//在LCD上输出距离信息
delay(100);//刷新时间100ms,也就是0.1s
}
到这就可以了。
注意:1.第一步获取的地址如果不同,要修改第二部分的代码里面相应的部分。
2.1602的对比度在板子后面有蓝色的旋钮可以调节。
3.IDE版本超过1.6的话,IIC的库可能不正常,导致1602只能显示第一个字符,这里提供下我用的库,我的IDE版本是1.8.3。下载:LiquidCrystal_I2C1602V1.rar
最后成品图:
http://www.arduino.cn/thread-21927-1-1.html