极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20808|回复: 5

带温度补偿的超声波测距仪

[复制链接]
发表于 2014-2-18 14:35:03 | 显示全部楼层 |阅读模式
    学了Arduino那么久,也没怎么做东西,看了大家做的超声波测距仪与温度计,想着把这两个合起来,做了个带温度补偿的超声波测距仪,还请大家多多指教。
    我的想法是从串口发送测距指令,通过SR-04测距,LM35测温,用温度算出音速,再根据音速算出距离,然后用1602显示出距离与温度,但是做出来后测出的距离不太准,有时差10多MM去,不知道是什么原因,还请大家指点指点,先谢谢了!

  成品图:







源代码:
/*
本程序用HC-SR04超声波测距模块进行测距,然后从1604 LCD显示屏上显示出来
1604接线说明:
RS  接  12
RW 接   11
E   接  10
D4  接  5
D5  接  4
D6  接  3
D7  接  2
A   接  9
VSS、K、V0(接1K电阻) 接 地
VDD  接  电源
SR04接线说明:
VCC  接 电源
GND  接 地
TRIG 接 7
ECHO 接 6
模拟口4为LM35的信号输入端口
如果从串口接收到1,则进行测距并在LCD屏显示距离。
*/
#include <LiquidCrystal.h>
unsigned int EchoPin=6;       //将Arduino 的 Pin6 连接至 HC-SR04 的Echo/RX
unsigned int TrigPin=7;       //将Arduino 的 Pin7 连接至 HC-SR04 的Trig/TX
unsigned long Time_Echo_us=0; //用于记录传感器返回的脉冲宽度
unsigned long Len_mm=0;      //用于存储距离值
int potPin=4;              //设置模拟口4为LM35的信号输入端口
float temperature=0;       //设置temperature为浮点变量
float val=0;                  //设置val为长整数变量
LiquidCrystal lcd(12,11,10,5,4,3,2);
int ak=9;
int col=0;
int row=0;
char brightness;
String comdata="";
void setup()
{
  Serial.begin(9600);
  pinMode(EchoPin,INPUT);  //设置EchoPin 为输入模式
  pinMode(TrigPin,OUTPUT); //设置TrigPin 为输出模式
  pinMode(ak,OUTPUT);
  lcd.begin(16,2);
  digitalWrite(ak,HIGH);
  lcd.cursor();
  lcd.blink();
}
void loop()
{
if(Serial.available()>0)
  {
   comdata="";
   brightness=Serial.read();
   comdata+=brightness;
   if(comdata=="1")
   {
    val=analogRead(potPin);               //val变量为从LM35信号口读取到的数值
    temperature = (val*5*100)/1023;       //把读取到的val转换为温度数值
     //通过Trig/Pin 发送脉冲,触发 HC-SR04 测距
    digitalWrite(TrigPin,LOW);
    delayMicroseconds(2);
    digitalWrite(TrigPin,HIGH); //开始通过 Trig/Pin 发送脉冲
    delayMicroseconds(50);       //设置脉冲宽度为 50us (>10us)
    digitalWrite(TrigPin,LOW);  //结束脉冲
    Time_Echo_us=pulseIn(EchoPin,HIGH);           //获取 HC-SR04 返回的脉冲宽度
    if((Time_Echo_us<60000)&&(Time_Echo_us>1)) //脉冲有效范围(1, 60000)
      {
       //Len_mm = (Time_Echo_us * Vmm/us) / 2 (mm) //根据返回脉冲宽度计算距离
       //V = 331×sqrt(1+temperature/273)/1000 (mm/us) //根据温度计算音速
       Len_mm=(Time_Echo_us*(331*sqrt(1+temperature/273)/1000))/2; //通过脉冲宽度计算距离
       lcd.clear();
       lcd.print("distance:");
       lcd.print(Len_mm);
       lcd.print("MM");
       lcd.setCursor(0,1);
       lcd.print(temperature);//显示温度
       lcd.print((char)223); //显示o符号
       lcd.print("C"); //显示字母C
       }
    else
      {
       lcd.clear();
       lcd.print("More than measuring range, please range again......");
      }
  delay(1000);
  }
}
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-2-18 15:15:20 | 显示全部楼层
学习了,
回复 支持 反对

使用道具 举报

发表于 2014-2-18 15:19:50 | 显示全部楼层
用尺子量好几个相同距离的障碍物,用带温度补偿和不带温度的对比过吗?是不是传感器有问题?
回复 支持 反对

使用道具 举报

发表于 2014-2-18 15:53:32 | 显示全部楼层
不用看了,你的理论完全正确,思维缜密。不过,可惜的是,咱那个阿度的板子电压本身就不怎么准,就算用了26课的基准电压源加了补偿,但是你的LM35也不一定真的准,另外超声波的模块也不一定就准。这么多不确定因素加在一起,只误差了10mm已经很不错了。要知道百得的超声波测距仪也差不多是这个误差量了,他还是商品呢。莱卡的测距仪差不多要500人刀一个,咱用50¥的成本和人家拼,真未必能达到到。
回复 支持 反对

使用道具 举报

发表于 2014-2-18 20:17:02 | 显示全部楼层
是不是传感器有问题?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 00:44:27 | 显示全部楼层
shihaipeng04 发表于 2014-2-18 15:53
不用看了,你的理论完全正确,思维缜密。不过,可惜的是,咱那个阿度的板子电压本身就不怎么准,就算用了26 ...

想来也是,元器件的误差加上电压的误差再加上用的是面包板电路连接也不稳定,测出来有误差也正常,谢谢指点。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 09:29 , Processed in 0.046695 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表