Arduino 备忘录 1 --- 超声波控制RGB LED
今天Arduino UNO R3的版子到了。超喜欢啊。准备吧学习笔记一一发在这里。希望坛友们提出意见建议,共同进步!
刚做了一个小玩意,通过超声波模块返回的数据,输出PWM来控制一个RGB LED。
用手掌挡在超声波探头前方来回移动距离,距离探头越近LED越亮,越远越按,直到熄灭。
原理图特别简单,就不上了。
超声波模块里: Trig接2,Echo 接 3。
RGB LED 因为是共阴的,所以第二根脚,也就是最长的那根上330欧姆电阻接地。其他三根按顺序红绿蓝接9 10 11口。
这里用到了新的超声波模块库,也就是NewPing这个库,据说准一点。我随之一起传上来。
#include <NewPing.h>
#define TRIGGER_PIN2
#define ECHO_PIN 3
#define MAX_DISTANCE 350
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
float MaxCm;
float reCm;
int led4 = 11;
int led3 = 10;
int led1 = 9;
void setup() {
//Serial.begin(9600); 串口调试蒙蔽了,影响速度。
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(led4, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led1, OUTPUT);
analogReference(DEFAULT);
}
void rgb(char r,char g,char b)
{
analogWrite(led1,r);
analogWrite(led3,g);
analogWrite(led4,b);
}
void loop() {
unsigned char t=0;
reCm=0;
MaxCm=0;
for (int i=0;i<10;i++)
{
float uS = sonar.ping();
reCm=uS/US_ROUNDTRIP_CM;
if (reCm>0)
{
MaxCm=reCm;
}
delay(2);
}
// Serial.print(MaxCm);
// Serial.print("cm");
//Serial.println();
t=255-MaxCm*10+10;
rgb(0,0,t) ; //控制PWM输出蓝色光,也可以改红绿,或者自己配颜色。rgb(t-x,t-x,t-x) 随自己喜欢。
}
现在问题是即使阻挡探头的物体移动比较慢,超声波得出的数据也会有很大跳动,导致LED一闪一闪的。
有待解决。 需要使用滤波算法去除传感器噪声干扰 我寫一個不用函式庫的:#define TrigPin 12
#define EchoPin 13
float EchoTime()
{
digitalWrite( TrigPin, LOW );
delayMicroseconds( 2 );
digitalWrite( TrigPin, HIGH );
delayMicroseconds( 10 );
digitalWrite( TrigPin, LOW );
return pulseIn( EchoPin, HIGH );
}
void setup()
{
pinMode( TrigPin, OUTPUT );
pinMode( EchoPin, INPUT );
Serial.begin( 9600 );
}
void loop() {
float duration, cm;
duration = EchoTime();
cm = 0.0346*(duration/ 2);
Serial.print(cm);
Serial.print( " cm " );
Serial.print(duration );
Serial.println( "us" );
delay( 100 );
}使用函式庫的:#include <Ultrasonic.h>
#define TRIGGER_PIN12
#define ECHO_PIN 13
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
void setup()
{
Serial.begin(9600);
}
void loop()
{
float cmMsec, inMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); // 計算距離,單位: 公分
inMsec = ultrasonic.convert(microsec, Ultrasonic::IN); // 計算距離,單位: 英吋
Serial.print("uS: ");
Serial.print(microsec);
Serial.print(", CM: ");
Serial.print(cmMsec);
Serial.print(", IN: ");
Serial.println(inMsec);
delay(100);
}
兩種寫法供大家參考 NewPing.h库可以上传下吗?
页:
[1]