Go Down

Topic: PIR and relay problem (Read 638 times) previous topic - next topic

ifugaopapercraft

I have a 5v relay set up in this configuration  http://arduino.sundh.com/wp-content/uploads/2011/10/transistor_TIP120_12V_g5LE-1.png The PIR sensor is working fine until the ground is joined (AR to relay breadboard). Then, the LED remains on and does not trip the relay. Oddly enough, this isn't always the case. Infrequently, it will work fine for a few minutes, then fail, regardless of the board (Uno, Pro Mini). Here is the sketch.

Code: [Select]
int calibrationTime = 30;       

//the time when the sensor outputs a low impulse
long unsigned int lowIn;         

//the amount of milliseconds the sensor has to be low
//before we assume all motion has stopped
long unsigned int pause = 5000; 

boolean lockLow = true;
boolean takeLowTime; 

int pirPin =8;    //the digital pin connected to the PIR sensor's output
int ledPin = 13;
int relayPin = 9;


/////////////////////////////
//SETUP
void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(relayPin,OUTPUT);
  digitalWrite(pirPin, HIGH);
  digitalWrite(relayPin,HIGH);

  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
  for(int i = 0; i < calibrationTime; i++){
    Serial.print(".");
    //delay(1000);
  }
  Serial.println(" done");
  Serial.println("SENSOR ACTIVE");
  delay(50);
}

////////////////////////////
//LOOP
void loop(){

  if(digitalRead(pirPin) == HIGH){
    digitalWrite(ledPin, HIGH);
    digitalWrite(relayPin,LOW);
    delay(2000);
    digitalWrite(ledPin,LOW);
    digitalWrite(relayPin,HIGH);
    //the led visualizes the sensors output pin state
    if(lockLow){ 
      //makes sure we wait for a transition to LOW before any further output is made:
      lockLow = false;           
      Serial.println("---");
      Serial.print("motion detected at ");
      Serial.print(millis()/1000);
      Serial.println(" sec");
      delay(50);
    }         
    takeLowTime = true;
  }

  if(digitalRead(pirPin) == LOW){       
    digitalWrite(ledPin, LOW);  //the led visualizes the sensors output pin state
    digitalWrite(relayPin,HIGH);
    if(takeLowTime){
      lowIn = millis();          //save the time of the transition from high to LOW
      takeLowTime = false;       //make sure this is only done at the start of a LOW phase
    }
    //if the sensor is low for more than the given pause,
    //we assume that no more motion is going to happen
    if(!lockLow && millis() - lowIn > pause){ 
      //makes sure this block of code is only executed again after
      //a new motion sequence has been detected
      lockLow = true;                       
      Serial.print("motion ended at ");      //output
      Serial.print((millis() - pause)/1000);
      Serial.println(" sec");
      delay(50);
    }
  }
}


Erdin

The 12V should only go to the relay, not to the mosfet (is it a mosfet ?).
A breadboard could have bad contacts.

ifugaopapercraft

Sorry, I don't quite understand.  Is the wire pictured from the middle pin of the tip120 joining the relay coil incorrect? 

Erdin

A TIP120 should not be connected that way.
I noticed this website, but it is wrong.
http://arduino.sundh.com/tag/tip120/
So please forget that.
I suggest to remove all wires and start again.

This is an example, you will need that resistor to the base.
http://bildr.org/2011/03/high-power-control-with-arduino-and-tip120/

This is the ABC guide. Card3 is with a transistor.
http://www.pighixxx.com/abc-arduino-basic-connections/

ifugaopapercraft

Thank you so much! I have been beating this monkey for days. The inexperienced can find great web resources most of the time but can't often distinguish good from bad. Also, the ABC link will be very helpful.

Go Up