|
|
发表于 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;
- }
复制代码 注:改动了一次,应该是比较距离对应的范围段,而不是比较实际距离 |
|