闲置了好久的一些散件,觉得还是用来干点什么比较好,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