youthou 发表于 2014-11-27 20:29:15

新手一枚,做了一个超声波传感器结合红外遥控发射的装置,有些问题求解答

本帖最后由 youthou 于 2014-11-27 21:29 编辑

看了论坛里大神关于超声波和红外发射的帖子自己做了个小装置,基本功能实现了还有些小问题求教
实现功能:
1、超声波传感器感应相应距离;
2、在距离20cm以内,红外二极管发送信号A,同时接口8的发光二极管常亮;
3、在距离30cm以内,红外二极管发送信号B,同时接口8的发光二极管50ms闪烁;
4、在距离45cm以内,红外二极管发送信号C,同时接口8的发光二极管200ms闪烁;
5、在距离45cm以上,红外二极管发送信号D,同时接口8的发光二极管灭。

相应代码如下
#include <IRremote.h>

const int TrigPin = 2;
const int EchoPin = 4;
int led=8;
float cm;

IRsend irsend;

void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(led, OUTPUT);
}
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(cm);
Serial.print("cm");
Serial.println();
delay(100);
if (cm <=20)
{
    irsend.sendNEC(16767015, 32);
    digitalWrite(led,HIGH);
   
}
else

{
    if(cm<=30)
    {
      irsend.sendNEC(16771095, 32);
      digitalWrite(led,HIGH);
      delay(50);
      digitalWrite(led,LOW);
      delay(50);
    }
    else
    {
      if(cm<=45)
      {
      irsend.sendNEC(16773135, 32);
      digitalWrite(led,HIGH);
      delay(200);
      digitalWrite(led,LOW);
      delay(200);
      }
      else
      {
      irsend.sendNEC(16762935, 32);
      digitalWrite(led,LOW);
    }
}
}
}
运行后距离判断和红外发射基本正常,但有些小问题想求教下大神:
1、源代码中有距离检测的输出显示,希望增加红外发射信号码的输出显示怎么做?
2、在进行距离判断时间隔是100ms,红外信号的发射也是100ms发射一次,希望可以做到在对应判断距离范围内红外信号只发射一次怎么实现?(现在多次发射会导致信号接受后动作不断重复)
望大神不吝赐教感谢啦

jerrychen33 发表于 2014-11-28 10:03:16

本帖最后由 jerrychen33 于 2014-11-28 10:26 编辑

1.输出显示,可以用也用串口输出到串口接收端显示,或者增加一块LCD1602来显示。
2.可以加一个formalDistance变量记录上次测得的距离,如果本次测得的跟上次测得的不一样,就发射红外信号,否则不发送。看代码:#include <IRremote.h>

const int TrigPin = 2;
const int EchoPin = 4;
int led=8;
float cm;
float formalDistance;
IRsend irsend;

void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(led, OUTPUT);
}
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(cm);
Serial.print("cm");

Serial.println();
delay(100);
if(getDistanceRange(formalDistance)!=getDistanceRange(cm)){//比较距离对应的范围段,而不是比较实际距离
if (cm <=20)
{
    irsend.sendNEC(16767015, 32);
    digitalWrite(led,HIGH);

}
else

{
    if(cm<=30)
    {
      irsend.sendNEC(16771095, 32);
      digitalWrite(led,HIGH);
      delay(50);
      digitalWrite(led,LOW);
      delay(50);
    }
    else
    {
      if(cm<=45)
      {
      irsend.sendNEC(16773135, 32);
      digitalWrite(led,HIGH);
      delay(200);
      digitalWrite(led,LOW);
      delay(200);
      }
      else
      {
      irsend.sendNEC(16762935, 32);
      digitalWrite(led,LOW);
    }
}
}
}
formalDistance=cm;
}
int getDistanceRange(dis:int)//取得改距离对应的范围段
{
   if(dis<=20) return 1;
   else if(dis<=30) return 2;
   else if(dis<=45) return 3;
   else return 4;
}注:改动了一次,应该是比较距离对应的范围段,而不是比较实际距离
页: [1]
查看完整版本: 新手一枚,做了一个超声波传感器结合红外遥控发射的装置,有些问题求解答