极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11032|回复: 1

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

[复制链接]
发表于 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的发光二极管灭。

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

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

  6. IRsend irsend;

  7. void setup()
  8. {
  9. Serial.begin(9600);
  10. pinMode(TrigPin, OUTPUT);
  11. pinMode(EchoPin, INPUT);
  12. pinMode(led, OUTPUT);
  13. }
  14. void loop()
  15. {
  16. digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
  17. delayMicroseconds(2);
  18. digitalWrite(TrigPin, HIGH);
  19. delayMicroseconds(10);
  20. digitalWrite(TrigPin, LOW);

  21. cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
  22. cm = (int(cm * 100.0)) / 100.0; //保留两位小数
  23. Serial.print(cm);
  24. Serial.print("cm");
  25. Serial.println();
  26. delay(100);
  27. if (cm <=20)
  28.   {
  29.     irsend.sendNEC(16767015, 32);
  30.     digitalWrite(led,HIGH);
  31.    
  32.   }
  33.   else

  34.   {
  35.     if(cm<=30)
  36.     {
  37.       irsend.sendNEC(16771095, 32);
  38.       digitalWrite(led,HIGH);
  39.       delay(50);
  40.       digitalWrite(led,LOW);
  41.       delay(50);
  42.     }
  43.     else
  44.     {
  45.       if(cm<=45)
  46.       {
  47.         irsend.sendNEC(16773135, 32);
  48.         digitalWrite(led,HIGH);
  49.         delay(200);
  50.         digitalWrite(led,LOW);
  51.         delay(200);
  52.       }
  53.       else
  54.       {
  55.         irsend.sendNEC(16762935, 32);
  56.         digitalWrite(led,LOW);
  57.     }
  58.   }
  59. }
  60. }
复制代码

运行后距离判断和红外发射基本正常,但有些小问题想求教下大神:
1、源代码中有距离检测的输出显示,希望增加红外发射信号码的输出显示怎么做?
2、在进行距离判断时间隔是100ms,红外信号的发射也是100ms发射一次,希望可以做到在对应判断距离范围内红外信号只发射一次怎么实现?(现在多次发射会导致信号接受后动作不断重复)
望大神不吝赐教感谢啦
回复

使用道具 举报

发表于 2014-11-28 10:03:16 | 显示全部楼层
本帖最后由 jerrychen33 于 2014-11-28 10:26 编辑

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

  2. const int TrigPin = 2;
  3. const int EchoPin = 4;
  4. int led=8;
  5. float cm;
  6. float formalDistance;
  7. IRsend irsend;

  8. void setup()
  9. {
  10. Serial.begin(9600);
  11. pinMode(TrigPin, OUTPUT);
  12. pinMode(EchoPin, INPUT);
  13. pinMode(led, OUTPUT);
  14. }
  15. void loop()
  16. {
  17. digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
  18. delayMicroseconds(2);
  19. digitalWrite(TrigPin, HIGH);
  20. delayMicroseconds(10);
  21. digitalWrite(TrigPin, LOW);

  22. cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
  23. cm = (int(cm * 100.0)) / 100.0; //保留两位小数
  24. Serial.print(cm);
  25. Serial.print("cm");

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

  33.   }
  34.   else

  35.   {
  36.     if(cm<=30)
  37.     {
  38.       irsend.sendNEC(16771095, 32);
  39.       digitalWrite(led,HIGH);
  40.       delay(50);
  41.       digitalWrite(led,LOW);
  42.       delay(50);
  43.     }
  44.     else
  45.     {
  46.       if(cm<=45)
  47.       {
  48.         irsend.sendNEC(16773135, 32);
  49.         digitalWrite(led,HIGH);
  50.         delay(200);
  51.         digitalWrite(led,LOW);
  52.         delay(200);
  53.       }
  54.       else
  55.       {
  56.         irsend.sendNEC(16762935, 32);
  57.         digitalWrite(led,LOW);
  58.     }
  59.   }
  60. }
  61. }
  62. formalDistance=cm;
  63. }
  64. int getDistanceRange(dis:int)//取得改距离对应的范围段
  65. {
  66.    if(dis<=20) return 1;
  67.    else if(dis<=30) return 2;
  68.    else if(dis<=45) return 3;
  69.    else return 4;
  70. }
复制代码
注:改动了一次,应该是比较距离对应的范围段,而不是比较实际距离
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 14:09 , Processed in 0.036805 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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