Stap 3: Code
Dit om code te schrijven, ik in principe gecombineerd code ik vond voor een PIR sensor (http://playground.arduino.cc/Code/PIRsense) en de code voor een servo (http://arduino.cc/en/Tutorial/Sweep), en vervolgens wijzigingen aangebracht waar ik dacht dat het zou de verbetering van de code.
Code:
/ * Deze code veegt een servo van 0 graden tot 180 wanneer de PIR sensor detecteert de beweging.
Speciale dank gaat uit naar de auteur van de PIR sensor code, wiens code enorm geholpen
bij het maken van deze code en de Instructable.
Auteur van PIR sensor code: Kristian Gohlke / krigoo (_) gmail (_) com / http://krx.at
**/
#include < Servo.h >
Servo myservo; maakt een servo-object
maximaal acht servo-objecten kan worden gemaakt
int pos = 0; variabele servo positie opslaan
bedrag van tijd geven we de sensor kalibreren (10-60 sec volgens het gegevensblad)
int calibrationTime = 30;
het tijdstip wanneer de sensor een lage impuls uitgangen
lang unsigned int lowIn;
het aantal milliseconden de sensor is laag
voordat we aannemen dat alle beweging is gestopt
lang unsigned int pauze = 5000;
Boole lockLow = waar;
Booleaanse takeLowTime;
int pirPin = 12; digitale pin aangesloten op de PIR van uitgang
int pirPos = 13; wordt aangesloten op de PIR van 5V pin
VOID Setup {}
myservo.attach(4); servo hecht aan pin 4
Serial.begin(9600); seriële communicatie begint
pinMode (pirPin, INPUT);
pinMode (pirPos, OUTPUT);
digitalWrite (pirPos, hoge);
de tijd van de sensor om te kalibreren
Serial.println ("kalibreren sensor");
for (int i = 0; ik < calibrationTime; i ++) {}
Serial.Print(calibrationTime-i);
Serial.Print("-");
delay(1000);
}
Serial.println();
Serial.println("Done");
terwijl het maken van dit Instructable, had ik wat problemen met de PIR van output
gaan HIGH onmiddellijk na het kalibreren
Dit wacht totdat de PIR van uitvoer laag is voordat setup eindigend
terwijl (digitalRead(pirPin) == HIGH) {}
delay(500);
Serial.Print(".");
}
Serial.Print ("SENSOR actief");
}
void loop {}
if(digitalRead(pirPin) == HIGH) {//if de PIR uitgang is hoog, beurt servo
/ * servo van 0 tot 180 graden en terug draait
het doet dit door het verhogen van de variabele 'pos' door 1 elke 5 milliseconden totdat het hits 180
en het instellen van de servo's positie in graden naar "pos" elke 5 milliseconden
het doet het dan in omgekeerde richting te laten terugkeren
voor meer informatie over dit, google "for-lussen"
Als de hoeveelheid graden wilt wijzigen de servo bochten, het aantal wijzigen 180 aan het aantal graden die u wilt om te schakelen
**/
voor (pos = 0; pos < 180; pos += 1) //goes van 0 tot 180 graden
{//in stappen van één graad
myservo.write(POS); servo naar positie in de variabele 'pos' vertelt
delay(5); wacht tot de servo te bereiken de positie
}
voor (pos = 180; pos > = 1; pos-= 1) //goes van 180 tot 0 graden
{
myservo.write(POS); om de servo sneller gaan, het verminderen van de tijd in vertragingen voor
delay(5); om het langzamer gaan, door het getal te verhogen.
}
if(lockLow) {}
zorgt ervoor dat we wachten op een overgang naar lage voordat verdere uitvoer plaatsvindt
lockLow = false;
Serial.println("---");
Serial.Print ("bewegingsdetectie op");
Serial.Print(Millis()/1000);
Serial.println ("sec");
delay(50);
}
takeLowTime = true;
}
if(digitalRead(pirPin) == LOW) {}
if(takeLowTime) {}
lowIn = millis(); opslaan van het tijdstip van de overgang van hoog naar laag
takeLowTime = false; Zorg ervoor dat dit gebeurt alleen bij het begin van een lage fase
}
de sensor wordt laag voor meer dan het bepaalde pauze,
We kunnen aannemen dat de motie is gestopt
Als (! lockLow & & millis() - lowIn > onderbreken) {}
maakt zeker dit blok code wordt alleen uitgevoerd na opnieuw
een nieuwe reeks van beweging is gedetecteerd
lockLow = true;
Serial.Print ("motion eindigde op"); uitgang
Serial.Print((Millis() - onderbreken) / 1000);
Serial.println ("sec");
delay(50);
}
}
}