Paso 3: código
Para escribir este código, básicamente combiné código encontrado para un sensor PIR (http://playground.arduino.cc/Code/PIRsense) y un código para un servo (http://arduino.cc/en/Tutorial/Sweep) y luego hizo cambios allí donde pensé que podría mejorar el código.
Código:
/ * Este código barre un servo de 0 grados a 180 cuando el sensor PIR detecta el movimiento.
Especial agradecimiento para el autor del código de sensor PIR, cuyo código ayudado muchísimo
en la elaboración de este código y el Instructable.
autor del código de sensor PIR: Kristian Gohlke / gmail krigoo (_) (_) com / http://krx.at
**/
#include < Servo.h >
Servo myservo; crea un objeto servo
se puede crear un máximo de ocho objetos de servo
int pos = 0; variable para almacenar la posición del servo
cantidad de tiempo da el sensor a calibrar (10 a 60 segundos según la hoja de datos)
int calibrationTime = 30;
el momento cuando el sensor produce un impulso de baja
tiempo unsigned int lowIn;
la cantidad de milisegundos que el sensor tiene que ser bajo
antes de asumir todo el movimiento se ha detenido
pausa larga unsigned int = 5000;
Boolean lockLow = true;
takeLowTime Boolean;
pirPin INT = 12; pin digital conectado a la salida del PIR
pirPos int = 13; se conecta al pin de 5V de PIR
void setup() {}
myservo.Attach(4); se fija el servo al pin 4
Serial.Begin(9600); comienza comunicación serial
pinMode (pirPin, entrada);
pinMode (pirPos, salida);
digitalWrite (pirPos, HIGH);
darle tiempo al sensor a calibrar
Serial.println ("calibración sensor");
para (int i = 0; i < calibrationTime; i ++) {}
Serial.Print(calibrationTime-i);
Serial.Print("-");
Delay(1000);
}
Serial.println();
Serial.println("Done");
al hacer este Instructable, tuve algunos problemas con salida de PIR
va alta inmediatamente después de la calibración
Esto espera hasta que la salida del PIR es baja antes de terminar la instalación
mientras que (digitalRead(pirPin) == HIGH) {}
Delay(500);
Serial.Print(".");
}
Serial.Print ("SENSOR activo");
}
void loop() {}
if(digitalRead(pirPin) == HIGH) {//if PIR de salida es alta, servo de vuelta
/ * convierte servo de 0 a 180 grados y la espalda
lo hace al aumentar la variable "pos" por 1 cada 5 milisegundos hasta 180
y ajuste de posición del servo en grados de "pos" cada 5 milisegundos
luego lo hace en sentido contrario para volver
para aprender más sobre esto, google "lazos"
para cambiar la cantidad de grados el servo gira, cambiar el número 180 en el número de grados que desea girar a la
**/
para (pos = 0; pos < 180; pos += 1) //goes de 0 a 180 grados
{//in pasos de un grado
myservo.Write(POS); dice el servo a la posición en la variable "pos"
Delay(5); espera a que el servo a la posición
}
para (pos = 180; pos > = 1; pos-= 1) //goes de 180 a 0 grados
{
myservo.Write(POS); para hacer que el servo ir más rápido, reducir el tiempo de demoras para
Delay(5); para hacer que vaya más lento, aumentar el número.
}
{if(lockLow)}
se asegura de que esperamos una transición a la baja antes de la salida más
lockLow = false;
Serial.println("---");
Serial.Print ("movimiento detectado en");
Serial.Print(Millis()/1000);
Serial.println ("sec");
Delay(50);
}
takeLowTime = true;
}
if(digitalRead(pirPin) == LOW) {}
{if(takeLowTime)}
lowIn = millis(); ahorrar el tiempo de la transición de alto a bajo
takeLowTime = false; Asegúrese de que esto sólo se hace en el inicio de una fase
}
Si el sensor está bajo más de la pausa dada,
podemos suponer que el movimiento se ha detenido
Si (! lockLow & & millis() - lowIn > pausa) {}
hace que este bloque de código es sólo se ejecuta después de
se ha detectado una nueva secuencia de movimiento
lockLow = true;
Serial.Print ("movimiento terminada en"); salida
Serial.Print((Millis() - pausa) / 1000);
Serial.println ("sec");
Delay(50);
}
}
}