Paso 9: Software
Usé un steack "significa" (mongodb, express.js, js angular y nodo js) para implementar todo en software.
Usted puede encontrar la corriente (realmente, realmente alfa) fuente código en github
Hay varias razones por qué probé esta combinación:
- Quería probar en un proyecto real
- Es el mismo idioma en frontend/backend/db
- JavaScript es bastante bueno en prototipado rápido
Conceptos:
En un proyecto integrado como este tenemos el problema de los recursos compartidos (sonido y luz en nuestro caso). Tan sólo un proceso puede tener acceso al recurso en un momento dado, ya que tenemos varios modos de funcionamiento (luz, luz del humor, alarma, modo de audiolibro), podrían bloquear esos servicios mutuamente. Para mantener todo simple me decidí por una estrategia muy fácil: cuando un proceso quiere acceder a un recurso, otro proceso posiblemente ejecutando se detenga, para que el recurso puede ser utilizado otra vez por el nuevo proceso. En nuestro caso, esto es posiblemente también una de las mejores soluciones: ninguno de los procesos realmente necesita un recurso + la única vez que proceso disparada es la alarma: la alarma siempre debe recibir el recurso, cuando se inicia, también cuando la cosa está funcionando. Otros procesos usuario activada (y sólo tenemos un usuario), por lo que probablemente el proceso para reclamar los recursos.
Conexión de los LEDs: pwm con Pi-blaster
La frambuesa Pi sólo tienen generalmente 1 o 2 puertos pwm. Para este proyecto sin embargo, necesitaba por lo menos 4 de ellos por lo que utiliza el proyecto pi-blaster para conducir varios puertos con pwm. Tuve el problema de parpadeo mientras dimmer LED, así que tuve que cambiar a una versión anterior que no tiene el problema. Además tuve que cambiar las fuentes para utilizar el pcm-modo por defecto, tendrian pi-blaster utiliza el módulo de sonido para producir pwm que realmente asqueroso ruido en los altavoces. Además tuve que ajustar los puertos de: puerto 21 fue retitulado a 27 en la última versión de Pi frambuesa.
Registro
Como se explica en la introducción he decidido conectarse todos los valores del sensor en mongodb para verlas más tarde y analizarlos. Hay un gran biblioteca para interactuar con el mcp3008 chip para nodo. Las entradas del registro se pueden consultar con una api REST. En el frontend usé flot, una librería de jquery para trazar gráficos.
Registro de los acelerómetros fue un poco más difícil, porque básicamente quería entrar hay movimiento"no"Cuál es la dirección del movimiento". Por lo tanto, continuamente registran la diferencia absoluta entre 2 mediciones y construido un desplazamiento promedio más de 100 muestras (1 muestra cada milisegundo) a 10 mediciones por segundo. Cuando la media excede un cierto threashold (empíricamente determinada) se desencadena un evento, para que el programador de alarmas y otros módulos pueden actuar según. Como muestra la frecuencia de movimiento es bastante alto, que sólo de registrar valores cuando cambio de una cantidad determinada desde el último valor guardado. tendrian sería demasiado entrada-salida para la frambuesa todo retraso (más que llevaría para siempre para mostrar los datos).
Alarmas
Alarmas son también almacenadas en mongodb y la biblioteca de nodo-cron se utiliza para el inicio. Puede ser editados mediante una api REST. En el front-end usé un selector de degradado y un selector de sonido para configurar la luz del sol y los sonidos del estado de ánimo.
Para tener una vista previa del color seleccionado sin demasiada demora, añadí soporte socket para garantizar una comunicación rápida al escoger valores de color. al editar el gradiente de la luz, el color seleccionado es siempre obtener una vista previa en el weggup. El gradiente de luz/sonido también puede ser completamente vista previa y todos los sonidos se pueden reproducir por separado. El volumen de cada sonido puede ser ajustada por separado, así si se debe repetir o no.
Los archivos de sonido se leen de un cierto directorio en la frambuesa Pi, que es también compartido por samba.
Para realizar la funcionalidad del ciclo de sueño el programador alarma escucha el evento de movimiento de la bitácora y comprueba si la luz próxima fase de sueño se encuentra en un cierto plazo entre tiempo de despertador y un tiempo definido con anterioridad a reprogramar la alarma. El problema principal es predecir el siguiente semáforo durmiendo fase. Actualmente utilizo una duración constante de 3 horas por ciclo del sueño. Cuando habrá se reunieron datos de movimiento más que ajustarlo en consecuencia o encontrar otro método de predicción de la próxima fase de sueño ligero (dependiendo de los datos recogidos).
Reproducir sonido
Para reproducir sonido mplayer procesos se generó en el fondo en modo de esclavo, por lo que se pueden controlar fácilmente desde nodo. Posiblemente se cambie a otro jugador, como requerimientos de hardware, y por lo tanto, los retrasos son bastante altos con mplayer.
La interfaz de botón
Al pulsar la parte superior de la caja, consigue presiona el botón interno. Este evento causa la weggup encender la luz, actuando como una lámpara. Al presionar el botón, mientras se está ejecutando nada, este proceso se detiene de inmediato. Es decir, el botón actúa como un "cierre todo lo que se está ejecutando" cambia, y cuando nada se ejecuta, actúa como un interruptor de "luces".
Otros módulos:
Todos los módulos pueden ser iniciados y detenidos desde una interfaz web. La configuración de todos los parámetros puede controlarse también allí. He implementado un simple administrador de configuración común para todos los módulos, por lo que puedo añadir nuevos fácilmente (cuando encuentro algún tiempo, crearé páginas de configuración para todos los módulos, que son más cómodos de utilizar).
- Audiolibro: el módulo de audiolibro Lee un archivo tras otro de un cierto directorio. Después de 10 minutos de lectura baja el volumen en un 50%. Cuando el oyente se mueve en la cama y se desencadena un evento de movimiento, el volumen aparece y sigue otro 10 minutos. Cuando el oyente ha dormido no disparará ningún caso movimiento y el audiolibro para jugar. La posición de la última vez que movimiento se almacena para que la reproducción comience en un punto donde el oyente era ciertamente despierto.
- moodlight: cambia su color cada 10 segundos rand(5) desvanecimiento de color a color, la luminosidad total puede ser configurada (el vector de color está normalizado para tener aproximadamente el mismo brillo todo el tiempo).
- luz: se enciende la luz con un color configurable. Este módulo se inicia al pulsar en la parte superior del recinto.