Étape 9: logiciel
J’ai utilisé un steack "signifie" (mongodb, express.js, js angulaire et nœud js) de tout mettre en œuvre dans le logiciel.
Vous pouvez trouver le courant (vraiment, vraiment alpha) source code sur github
Il y a plusieurs raisons pourquoi j’ai essayé cette combinaison :
- J’ai voulu essayer dans un véritable projet
- C’est la même langue dans frontend/backend/db
- JavaScript est assez bon pour prototypage rapide
Concepts :
Un projet intégré comme ça, nous avons le problème des ressources partagées (son et lumière dans notre cas). Si seulement un seul processus peut accéder à la ressource à un moment donné, comme nous avons plusieurs modes de fonctionnement (lumière, lumière d’ambiance, alarme, mode audiobook), ces services pourraient bloquer mutuellement. Alors pour garder tout simple, j’ai décidé d’une stratégie très simple : quand un processus veut accéder à une ressource, un autre processus éventuellement en cours d’exécution est arrêté, alors que la ressource peut être utilisée à nouveau par le nouveau processus. Dans notre cas, c’est peut-être aussi une des meilleures solutions : aucun des processus n’a vraiment besoin d’une ressource + la seule fois où est déclenchée l’alarme : l’alarme doit toujours obtenir la ressource quand il commence, aussi quand quelque chose est en cours d’exécution. Tous les autres procédés sont utilisateur déclenché (et nous n’avons qu’un seul utilisateur), alors nous voulons probablement le processus de réclamer la ressource.
Interfaçage de la LED : pwm avec Pi-blaster
Habituellement le raspberry Pi a seulement 1 ou 2 ports pwm. Pour ce projet cependant, j’ai dû au moins 4 d'entre eux alors j’ai utilisé le projet pi-blaster pour piloter plusieurs ports avec pwm. J’ai eu le problème de scintillement lors de gradation des LED, donc j’ai dû passer à une version antérieure qui n’a pas le problème. En outre, j’ai dû changer les sources pour utiliser le mode pcm par défaut, sinon pi-blaster utilise le module de sons pour produire pwm qui se traduit par vraiment dégoûtant de bruit sur les haut-parleurs. Par ailleurs j’ai dû ajuster les ports : Port 21 a été renommé en 27 dans la dernière version de Pi framboise.
Exploitation forestière
Comme expliqué dans l’intro, j’ai décidé de vous connecter toutes les valeurs du capteur mongodb pour visualiser plus tard et les analyser. Il y a une puce de la grande bibliothèque d’interfaçage avec le mcp3008 pour nœud. Les entrées de journal peuvent être interrogées avec une api REST. Sur l’interface j’ai utilisé le flot, une bibliothèque jquery pour tracer des graphiques.
Enregistrement des accéléromètres a été un peu plus difficile, parce que je voulais essentiellement vous connecter « Is there motion » pas « quel est le sens de la motion ». C’est pourquoi j’ai continuellement connecté la différence absolue entre 2 mesures et construit une moyenne mobile sur 100 échantillons (1 goûter chaque milliseconde) menant à 10 mesures par seconde. Lorsque la moyenne est supérieure à un certain threashold (empiriquement déterminée) un événement est déclenché, afin que le planificateur de l’alarme et d’autres modules peuvent poser des gestes selon. Comme l’échantillon fréquence de mouvement est assez élevé, que je me connecte uniquement des valeurs lorsqu’ils changent d’une certaine quantité de la dernière valeur enregistrée. sinon ce serait trop d’e/s pour la framboise tout ralentissement (plus il serait prendre une éternité pour afficher les données).
Alarmes
Alarmes sont également stockés dans mongodb et la bibliothèque de noeud-cron est utilisée pour démarrer les. Ils peuvent être modifiés via une api REST. Sur le serveur frontal, j’ai utilisé un Sélecteur de dégradé et un sélecteur de son pour configurer la soleil-la lumière et les sons d’ambiance.
Pour avoir un aperçu de la couleur actuellement sélectionnée sans trop de retard, j’ai ajouté le support de prise afin de garantir une communication rapide lors de la cueillette des valeurs chromatiques. Lorsque vous modifiez le gradient de la lumière, la couleur sélectionnée est toujours présenté en avant-première sur le weggup. Le gradient de Sono/light peut également être visualisée complètement et tous les sons peuvent être joués séparément. Le volume de chaque son peut être réglé séparément, aussi bien si elle doit être répétée ou non.
Les fichiers audio sont lues dans un certain répertoire sur la Pi framboise, qui est également partagé via samba.
Pour se rendre compte de la fonctionnalité de cycle de sommeil, le planificateur alarme écoute l’événement de mouvement de l’enregistreur et vérifie si le prochain feu de phase de sommeil se trouve dans un certain délai entre le moment de réveil et un temps défini auparavant de replanifier l’alarme. Le principal problème est de prévoir le prochain feu de phase de sommeil. Pour le moment, j’utilise une durée constante de 3 heures par cycle de sommeil. Lorsque j’ai auront recueilli des données de mouvement plus j’ajuster en conséquence ou trouver une autre méthode pour prédire la prochaine phase de sommeil léger (selon les données recueillies).
Jouer un son
Pour lire son processus mplayer fraient en arrière-plan en mode esclave, afin qu’ils peuvent être facilement commandés par nœud. Je vais peut-être changer à un autre joueur, comme la configuration matérielle requise, et donc les délais sont assez élevés avec mplayer.
L’interface simple bouton
Lorsque vous appuyez sur le dessus du boîtier, il obtient appuie sur le bouton interne. Cet événement provoque le weggup allumer la lumière vive, agissant comme une lampe. Lorsque vous appuyez sur le bouton, lorsque quelque chose est en marche, ce processus s’arrête immédiatement. C'est-à-dire le bouton agit comme un « shut off tout ce qui est en cours d’exécution » commutateur, et quand rien ne fonctionne, il agit comme un interrupteur « s’allume ».
Autres modules de :
Tous les modules peuvent être démarrés et arrêtés depuis une interface web. La configuration de tous les paramètres peut également être contrôlée là. J’ai mis en place un simple gestionnaire de paramètres communs à tous les modules, donc je peux facilement ajouter de nouveaux (quand je trouve quelque temps, je vais créer des pages de paramètres personnalisés pour tous les modules, qui sont plus confortables à utiliser).
- Livre audio : le module audiobook lit un fichier après l’autre dans un certain répertoire. Après 10 Minutes de lecture, il semble baisser le volume de 50 %. Lorsque l’auditeur se déplace dans le lit, et un événement de mouvement est déclenché, le volume se présente et poursuit un autre 10 minutes. Quand l’auditeur s’est endormi, aucun événement de mouvement ne se déclenche et le livre audio s’arrête de jouer. La position de la dernière fois de la requête est stockée afin que la lecture commence à un point où l’auditeur était certainement éveillé.
- Moodlight : il change de couleur tous les 10 ± rand(5) secondes, décoloration de la couleur à la couleur, la luminosité totale peut être configurée (le vecteur de couleur est normalisé pour avoir approximativement la même luminosité tout le temps).
- lumière : allume la lumière avec une couleur configurable. Ce module est lancé lorsque vous appuyez sur le dessus de l’enceinte.