Arduino是一款便捷灵活、方便上手的开源电子原型平台。如果玩过51或者stm32的同学肯定会认为arduino是一款非常非常简单的开发入门单片机。非常适合没有系统学过编程和电气知识的人群作为单片机入门的一个法宝,可以说是能够0基础上手。
arduino不同于51或者stm32,它可以完全不需要了解其内部硬件结构和寄存器设置,仅仅知道它的端口作用即可,可以不懂硬件知识,只要会简单的C语言,就可用Arduino 单片机编写程序。
比如51单片机要设置一个寄存器要设置好多管脚,但是arduino全都给我们包装好了,我们只要知道端口作用即可,往往51单片机要写几十行甚至上百行的代码,arduino一句语句就搞定了。
但是正是arduino的简便性,内部硬件结构和寄存器设置都不需要自己来设置,大大限制了它的能力。也注定了它的功能和效率是和其他单片机没办法比的。 很多工程师不喜欢arduino,因为它简单,很多功能都不能达到最优化。
个人认为:arduino适合没有单片机基础的人用于学习51,stm32之前的入门和兴趣培养是非常非常好的一个平台,也是对于一些非本专业的人士自己DIY一些创意电子产品的最佳选择!!!
言归正传,今天来分享一个arduino超声波测距的做法:
材料:arduino板子一块,1602显示屏,超声波模块(我用的是HC-SRO4),面包板,杜邦线若干........................
1.arduino
2.超声波模块
3.1602显示屏
采用IO触发测距,给至少10us的高电平信号;模块自动发送8个40KHz的方波,自动检测是否有信号返回;
有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间;
测试距离=(高电平时间*声速(340m/s))/2。
接线图:
我们先讲超声波测距,
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); // delayMicroseconds在更小的时间内延时准确
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);
}
pulseIn函数用于读取引脚脉冲的时间长度,脉冲可以是HIGH或LOW。如果是HIGH,函数将先等引脚变为高电平,然后开始计时,一直到变为低电平为止。
返回脉冲持续的时间长短, 单位为ms。如果超时还没有读到的话, 将返回0。 pulseIn()单位为微秒,声速344m/s,所以距离cm=344*100/1000000*pulseIn()/2约等于pulseIn()/58.0
将结果打印到窗口上效果会更明显。
接下来讲1602液晶屏显示:
接线图:
脚位连接说明:以上图为例,是从左到右第一脚开始数起:
1 Vss 接地 (0V)
2 Vdd 电源 (+5V)
3 Vo或与Vee - 对比度调整(0-5V), 可接一颗1K的电阻或接一个5K的电位器
4 RS Register Select: 参数:{1: D0 – D7 设置为1时当作资料解释 0: D0 – D7 设置为0时当作指令解释}
5 R/W Read/Write mode: 参数:{1: 从LCD读取资料 0: 写资料到LCD(一般情况下很少从LCD读取资料,把这个脚接地可省I/O脚位)}
6 E Enable
7 D0 Bit 0 LSB
8 D1 Bit 1
9 D2 Bit 2
10 D3 Bit 3
11 D4 Bit 4
12 D5 Bit 5
13 D6 Bit 6
14 D7 Bit 7 MSB
15 A+ 背光(串联一个1K的电阻接地或串联一个5K的电位器调整背光)
16 K- 背光(GND)
由于这里的两条背光现接到了2,3管脚,占用了刚刚的超声波管脚,所以我们等下把两个合起来的时候,把超声波的两个管脚接到8,9,脚
代码:
#include <LiquidCrystal.h> LiquidCrystal lcd(12,11,5,4,3,2); //定义脚位 void setup() { lcd.begin(16,2); //设置LCD显示的数目。16 X 2:16格2行。 lcd.print("hello,world!"); //将hello,world!显示在LCD上 } void loop() { lcd.setCursor(0,1); //将闪烁的光标设置到column 0, line 1 (注释:从0开始数起,line 0是显示第一行,line 1是第二行。) lcd.print(millis()/1000); //开机后屏幕现实以秒几时的时间 }
这样就可以实现1602显示的功能了。
最后把他们合起来:
这么短的代码能够实现这些功能也就arduino了
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //定义脚位 const int TrigPin = 8; const int EchoPin = 9; float cm; void setup() { Serial.begin(9600); pinMode(TrigPin, OUTPUT); pinMode(EchoPin, INPUT); lcd.begin(16, 2); //设置LCD显示的数目。16 X 2:16格2行。 lcd.print("yuan pei!"); //将hello,world!显示在LCD上 } 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); lcd.setCursor(0, 1); //将闪烁的光标设置到column 0, line 1 (注释:从0开始数起,line 0是显示第一行,line 1是第二行。) lcd.print("Dis:"); lcd.setCursor(5, 1); lcd.print(cm); lcd.setCursor(11, 1); lcd.print("cm"); }