Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //deodonoid democode
- //stadin hesalaiset
- #include <Servo.h>
- Servo myservo; //creates a servo object
- int pos = 0; //variable to store servo position
- //amount of time we give the sensor to calibrate(10-60 secs according to the datasheet)
- int calibrationTime = 10;
- //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 pir = 13; //digital pin connected to the PIR's output
- int pirPos = 12; //connects to the PIR's 5V pin
- int count=0;
- void setup(){
- myservo.attach(4); //attaches servo to pin 4
- Serial.begin(9600); //begins serial communication
- pinMode(pir, INPUT);
- pinMode(pirPos, OUTPUT);
- digitalWrite(pirPos, HIGH);
- //time for calibration
- Serial.println("calibrating sensor ");
- for(int i = 0; i < calibrationTime; i++){
- Serial.print(calibrationTime - i);
- Serial.print("-");
- delay(1000);
- }
- Serial.println();
- Serial.println("done");
- //this waits until the PIR's output is low before ending setup
- while (digitalRead(pir) == HIGH) {
- delay(500);
- }
- Serial.print("SENSOR ACTIVE");
- }
- void loop(){
- if(digitalRead(pir) == HIGH && count==0){ //if the PIR output is HIGH, turn servo
- /*turns servo from 0 to 180 degrees and back
- it does this by increasing the variable "pos" by 1 every 5 milliseconds until it hits 180
- and setting the servo's position in degrees to "pos" every 5 milliseconds
- it then does it in reverse to have it go back
- if you want to change the amount of degrees the servo turns, change the number 180 to the number of degrees you want it to turn
- **/
- count++;
- for(pos = 100; pos <180 ; pos += 1) //goes from 0 to 180 degrees
- { //in steps of one degree
- myservo.write(pos); //tells servo to go to position in variable "pos"
- delay(5); //waits for the servo to reach the position
- }
- for(pos = 180; pos>=100; pos-=1) //goes from 180 to 0 degrees
- {
- myservo.write(pos); //to make the servo go faster, decrease the time in delays for
- delay(5); //to make it go slower, increase the number.
- }
- if(lockLow){
- //makes sure we wait for a transition to LOW before further output is made
- lockLow = false;
- Serial.print("Motion detected!");
- delay(50);
- }
- takeLowTime = true;
- }
- if(digitalRead(pir) == LOW){
- if(takeLowTime){
- lowIn = millis(); //this will 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 can assume the motion has stopped
- 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!"); //output
- delay(100);
- count--;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement