所以我在arduino的3.3v引脚上运行PIR,arduino的gnd引脚,然后进入input 9。我调整了我的代码到网站,但它仍然不能工作。我希望继电器在PIR较低时打开,然后在PIR较高时关闭。我还需要PIR在注册另一个输入之前等待至少5秒。
#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
}
}
}
发布于 2015-04-03 19:58:34
当事情不像我期望的那样工作时,我总是先看一下线路。编写一些简单的测试代码,除了打印PIR的信号引脚的状态之外,什么也不做。它会在你期望的时候涨得很高吗?它会在你预期的时候走低吗?如果不是这样,那么您就有了连接问题。在考虑其他编程之前,先弄清楚这一点。
至于wiring...you,在你的描述中没有提到上拉电阻-大多数PIR模块(至少是我工作过的那些模块)在其信号引脚上需要一个上拉电阻,以便在没有信号时将输出拉高。也许你有一个,只是没有提到它,但如果没有,那么这可能是你的问题-没有上拉电阻,你的输出是浮动的,你的设备将不会像你期望的那样工作。也就是说,大多数Arduino板(你没有说你使用的是哪一个)在数字引脚上有内部上拉,但你必须通过执行以下操作来启用它们:
pinMode(pin, INPUT);
digitalWrite(pin, HIGH); 您在setup()例程中将信号引脚设置为低电平,这会关闭内部上拉电阻。将其更改为高以打开它,这样就可以避免添加外部电阻。
另外,你确定你的PIR模块运行在3.3V电压下吗?有些需要5V。请查看它的数据表以确定。
https://stackoverflow.com/questions/29422674
复制相似问题