13年8个月前IP:未同步
518881
3楼
/*这里分享我的代码
在Arduino Mega 2560上测试通过
由于该超声波模块工作电流很小,所以尝试用Arduino的GPIO供电,测试没问题,好处是可以直接把模块插Arduino板上而不需要转接杜邦线。
使用时候注意更改自己板上插模块的PowerPin,GroundPin,TrigPin和EchoPin,还有室内温度。
Upload完成后点右上角Serial Monitor就可以看到快速刷新的串口距离数据。修改REFRESH 20为其他数字得到不同刷新率,单位ms
我有另外一个版本是用DS18B20获取温度再补偿的并输出在12864LCD上,由于本贴讨论超声波,所以固定温度,串口输出结果。*/

#define REFRESH 20 //设置REFRESH表示20
int TrigPin=51;  //声明整型变量TrigPin为51
int EchoPin=49;  //声明整型变量EchoPin为49
int PowerPin=53; //声明整型变量PowerPin为53
int GroundPin=47; //声明整型变量GroundPin为49
long time,temp; //声明长整型变量time(存储8个脉冲时间),temp室内温度
double distance; //声明双精度浮点变量,存储距离数据

void setup(){
  pinMode(PowerPin,OUTPUT); //设置PowerPin为输出模式,用来给超声波模块提供VCC,作为电源+
  pinMode(GroundPin,OUTPUT); //设置GroundPin为输出模式,用来超声波模块提供GND,作为电源-
  digitalWrite(PowerPin,HIGH); //初始化PowerPin,使得电压为5V,作为电源+
  digitalWrite(GroundPin,LOW); //初始化GroundPin,使得电压为0V,作为电源-
  pinMode(TrigPin,OUTPUT);  //设置TrigPin为输出模式,用来触发模块发射超声波
  pinMode(EchoPin,INPUT);  //设置EchoPin为输入模式,用来接受脉冲时长
  temp=20; //初始化室内温度为20摄氏度
  Serial.begin(9600); //初始化串口输出,波特率为9600
}

void loop(){
  digitalWrite(TrigPin,HIGH); //设置TrigPin为高电平
  delayMicroseconds(50); //等待50us
  digitalWrite(TrigPin,LOW); //设置TrigPin为低电平,以上3步在TrigPin上输出50us的脉冲,触发模块工作
  time=pulseIn(EchoPin,HIGH,10000); //在EchoPin上等待高电平脉冲,超过10ms没有收到就继续运行,收到就返回脉冲长度并赋值给time
  distance=(331.3+(0.606*temp))*(time)/20000; //通过time和temp计算距离,注意8个脉冲,超声波来回
  Serial.print(distance); //通过串口输出距离
  Serial.println(); //通过串口输出换行符
  delay(REFRESH); //等待REFRESH时间后继续运行loop()
  }
+1
科创币
novakon
2013/04/23
这是教程贴,如果要插楼,务必补上对程序的说明。没有注释的程序网上是很多的。
+1
科创币
novakon
2013/04/23
已经补上,赞扬
评论
文号 / 518881

千古风流
名片发私信
学术分 1
总主题 70 帖总回复 1816 楼拥有证书:进士 专家 学者 机友 笔友
注册于 2009/06/23 17:27:21最后登录 2026/10/28 11:32:52
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:0

个人简介

Harvard Physics

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的