2015-04-02 39 views
0

於是我運行PIR關閉的Arduino,Arduino的GND腳的3.3V針,然後進入輸入9.我調整我的代碼的網站,但它仍然不起作用。當PIR低時,我想讓繼電器打開,然後用PIR關閉高電平。我還需要PIR在註冊另一個輸入之前等待至少5秒鐘。使用PIR激活繼電器模塊電磁

#define RELAY_ON 1 
 
#define RELAY_OFF 0 
 

 
#define Relay_1 2 // Arduino Digital I/O pin number 
 
#define Relay_2 3 
 
#define Relay_3 4 
 
#define Relay_4 5 
 
#define Relay_5 6 
 
#define Relay_6 7 
 

 

 
/*-----(Declare Variables)-----*/ 
 
int waittime; // Delay between changes 
 

 
int state = LOW;    // by default, no motion detected 
 
int val = 0;     // variable to store the sensor status (value) 
 
int pirPin = 9; //the digital pin connected to the PIR sensor's output 
 

 

 

 
void setup() /****** SETUP: RUNS ONCE ******/ 
 
{ 
 
    waittime = 1000; 
 
    pinMode(pirPin, INPUT);  // initialize sensor as an input 
 
    Serial.begin(9600);  // initialize serial 
 
    
 
//-------(Initialize Pins so relays are active at reset)---- 
 
    digitalWrite(Relay_1, RELAY_ON); 
 
    digitalWrite(Relay_2, RELAY_ON); 
 
    digitalWrite(Relay_3, RELAY_ON); 
 
    digitalWrite(Relay_4, RELAY_ON); 
 
    digitalWrite(Relay_5, RELAY_ON); 
 
    digitalWrite(Relay_6, RELAY_ON); 
 
//---(THEN set pins as outputs)---- 
 

 
    digitalWrite(pirPin, LOW); 
 
    pinMode(Relay_1, OUTPUT); 
 
    pinMode(Relay_2, OUTPUT); 
 
    pinMode(Relay_3, OUTPUT); 
 
    pinMode(Relay_4, OUTPUT);  
 
    pinMode(Relay_5, OUTPUT); 
 
    pinMode(Relay_6, OUTPUT); 
 
    delay(4000); //Check that all relays are active at Reset 
 
    
 
}//--(end setup)--- 
 

 

 
void loop() /****** LOOP: RUNS CONSTANTLY ******/ 
 
{ 
 

 
val = digitalRead(pirPin); // read sensor value 
 
if (val == HIGH) {   // check if the sensor is HIGH 
 
//---(Turn all 8 relays ON in pairs)--- 
 

 
    digitalWrite(Relay_1, RELAY_OFF);// set the Relay OFF 
 
    digitalWrite(Relay_2, RELAY_OFF);// set the Relay OFF 
 
    delay(waittime);    // wait for a second 
 
    
 
    digitalWrite(Relay_3, RELAY_OFF);// set the Relay OFF 
 
    digitalWrite(Relay_4, RELAY_OFF);// set the Relay OFF 
 
    delay(waittime); 
 
    
 
    digitalWrite(Relay_5, RELAY_OFF);// set the Relay OFF 
 
    digitalWrite(Relay_6, RELAY_OFF);// set the Relay OFF 
 
    delay(5000);    // wait see all relays ON 
 
    
 
    if (state == LOW) { 
 
     Serial.println("Motion detected!"); 
 
     state = HIGH;  // update variable state to HIGH 
 
    } 
 
    } 
 

 
    else { 
 
    
 
//---(Turn all 8 relays OFF in pairs)--- 
 

 
    digitalWrite(Relay_1, RELAY_ON);// set the Relay ON 
 
    digitalWrite(Relay_2, RELAY_ON);// set the Relay ON 
 
    delay(waittime); 
 
    
 
    digitalWrite(Relay_3, RELAY_ON);// set the Relay ON 
 
    digitalWrite(Relay_4, RELAY_ON);// set the Relay ON 
 
    delay(waittime); 
 
    
 
    digitalWrite(Relay_5, RELAY_ON);// set the Relay ON 
 
    digitalWrite(Relay_6, RELAY_ON);// set the Relay ON 
 
    delay(10000);    // wait see all relays OFF 
 
    
 
    
 
     
 
     
 
if (state == HIGH){ 
 
     Serial.println("Motion stopped!"); 
 
     state = LOW;  // update variable state to LOW 
 
     } 
 
    } 
 
    }

回答

0

當事情不工作,我希望他們,我總是看第一接線方式。寫一些簡單的測試代碼,它只會打印PI​​R信號引腳的狀態。當你期望它會變高嗎?當你期望的時候它會變低嗎?如果沒有,你有接線問題。在你思考剩下的編程之前,先理清它。

至於接線......你沒有在你的描述提上拉電阻 - 最PIR模塊(至少我使用過的那些)要求其信號引腳上的上拉電阻當沒有信號時拉高輸出。也許你有一個,只是沒有提到它,但如果沒有的話那可能是因爲您的問題 - 沒有一個上拉電阻,你的輸出是浮動的,你的設備將無法正常工作,你期望它的方式。也就是說,大多數的Arduino板(你不說你使用的是哪一個)對數字引腳內部上拉,但你必須這樣做,使他們:

pinMode(pin, INPUT);  
digitalWrite(pin, HIGH); 

你設置你的信號引腳LOW在您的設置()函數,即關閉了內部上拉電阻。將其改爲HIGH將其打開,然後可以避免添加外部電阻。

另外,你確定你的PIR模塊上運行的3.3V?有些需要5V。檢查其數據表以確保。