Paso 3: codificación
Al principio parecía simple lógica: si es oscuro y hay movimiento - encienda el aparato (lámpara en mi caso), si no lo apaga. Espera a n segundos y vuelva a comprobar.
Pero como estuve probando y agregando nuevos modos a mi dispositivo, ninguno de los arriba mencionado trabajado que simple.
Si no se puede utilizar (oscuro == true & & movimiento == verdadero) entonces {encender} else {Apagar}; Delay (n);
¿porque obtendrá desagradables retroacción: oscuro? ¿-sí, movimiento? -sí y luego encienda; esperar; ¿Dark? ¿-no (porque sólo hemos encendido las luces), movimiento? -sí y luego apagarlo; ¿Dark? -sí... Así con esta lógica que obtendrá constante centelleo.
Esa es la razón por la cual en el procedimiento light_on() primero comprobamos si es oscuro y luego ir en bucle, encender luz y constantemente comprobando si existe movimiento. No comprobar estas dos condiciones simultáneamente.
En cuanto a la demora del comando (n), que se detiene la ejecución de números milisegundos, nosotros no podemos usarlo porque durante la demora, si pulsas los botones de modo permanente o manual, Arduino no lo notará, porque duerme. Es por eso que utilizamos en el mismo bucle, que controles de movimiento en light_on () procedimiento, función millis() y asignar su valor a la variable "ahora". Millis() devuelve el número de milisegundos que pasado desde Arduino estaba activada. Esta manera somos capaces de salir del bucle cuando ahora + delay_time > millis().
Por lo tanto, todas las condiciones para salir del lazo en light_on() procedimiento:
- no hay ningún movimiento;
- delay_time ha pasado desde la última vez que se detecta movimiento;
- modo de dispositivo fue cambiado pulsando uno de los botones.
Otros comentarios que he incluido en el código sí mismo.
Hice dos clases: fotocélula y pir.
Para botón contra rebotes uso biblioteca Bounce2 que se puede descargar desde aquí. Descargar biblioteca y desempaquete su contenido en ~/Documents/Arduino/libraries (en un Mac) o My Documents\Arduino\libraries (en una máquina Windows).
Photocell.h
PIR.h
Eso es todo el código que usted necesita. Ahora usted puede subir a su Arduino y prueba, si todo funciona como debería, antes de ocuparse de alta tensión y montaje caso para su dispositivo.
También os adjunto los archivos con los códigos. En mi máquina todo compila sin problemas.