2014-11-14 88 views
-3

我試圖創建一個距離控制的LED,在一定的距離關閉。我正在使用arduino Leonardo和距離傳感器。在我插入電路板的那一刻,LED保持長久不變,並且在距離縮短時不會關閉。請你能告訴我需要改變什麼才能使其工作?距離控制LED

const int TrigPin = 2; 
const int EchoPin = 3; 
float cm; 
int ledPin = 12; //define ledPin12 is the output port of led’s level. 
int val = 0; //define original of val. 
void setup() 
{ 
    Serial.begin(9600); 
    pinMode(TrigPin, OUTPUT); 
    pinMode(EchoPin, INPUT); 
    pinMode(ledPin, OUTPUT); //set ledPin output 
} 
void loop() 
{ 
    digitalWrite(TrigPin, LOW); //Low-high-low level sent a short time pulse to TrigPin 
    delayMicroseconds(2); 
    digitalWrite(TrigPin, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(TrigPin, LOW); 
    cm = pulseIn(EchoPin, HIGH)/58.0; //Echo time converted into cm 
    cm = (int(cm * 100.0))/100.0; // retain two decimal places 
    Serial.print(cm); 
    Serial.print("cm"); 
    Serial.println(); 
    delay(1000); 

    val = analogRead(EchoPin); //get the value from sensor 
    if(val<=1) 
    { 
     //512=2.5V, if want the sensor be more sensitive, increase the number, or lese low the number. 
     digitalWrite(ledPin, HIGH); //when the value of val is less than 512(2.5V), light up led lamp 
    } 
    else 
    { 
     digitalWrite(ledPin, LOW); 
    } 
} 
+2

的StackOverflow是不是一個調試器。你得到什麼錯誤?你使用常量值測試了你的邏輯嗎?爲什麼評論似乎不符合代碼? – 2014-11-14 23:01:57

+0

它沒有給我任何錯誤,它只是沒有運作,因爲我會希望。 – 2014-11-14 23:14:20

+1

pulseIn()和analogRead()做什麼?快速連續調用同一引腳是否有效? cm打印的輸出是什麼? – 2014-11-14 23:22:02

回答

0

我猜測傳感器與SRF005類似。你應該在你的問題中包含這些細節。

觸發器看起來沒問題,但是在脈衝時間稍長一些的時候,比如說20 us,確保沒有什麼壞處。回聲的捕獲看起來是正確的,除了我發現的數據表說除以5.8,而不是58.0,並且返回值是一個無符號長整數,而不是浮點數。

但是,您不應該使用analogRead()回聲引腳。在那個點上它將是0。相反,你已經有了cm變量的距離。

(存在使用引腳的電壓來表示距離以及傳感器,但他們沒有觸發和回聲引腳。你實際使用的那種?)

void loop() 
{ 
    int cm = 0; 

    digitalWrite(TrigPin, LOW); //Low-high-low level sent a short time pulse to TrigPin 
    delayMicroseconds(2); 
    digitalWrite(TrigPin, HIGH); 
    delayMicroseconds(10); // <<<<<<<<<<<<<<<<<<<<<<<< Change to 20 
    digitalWrite(TrigPin, LOW); 
    cm = (int)(pulseIn(EchoPin, HIGH) * 10/58); //Echo time converted into cm <<<<<<<<< 5.8 ???? 
    Serial.print(cm); 
    Serial.print("cm"); 
    Serial.println(); 


    if(cm < 50) 
    { 
     digitalWrite(ledPin, HIGH); 
    } 
    else 
    { 
     digitalWrite(ledPin, LOW); 
    } 

    delay(1000); 
}