WC Project
Après un moment d’abscence je reviens avec un nouveau projet!
Quelle est l’idée générale? Et bien il m’est venu à l’esprit qu’en soirée, le seul moment où l’on peut être tranquille, c’est aux toilettes. J’ai donc imaginé un sorte de boîte de nuit qui se déclencherait dès que quelqu’un essaierai d’y aller (c’est à dire musique + néons + strobo)… (Quelle idée!). En fait l’application n’est pas des plus intéressantes, mais c’est plutôt la façon de faire qui l’est. De plus, ça peut être marrant une fois finie =)
Matériel:
De quoi avons nous besoin? Et bien nous sommes dans la section raspberry pi, c’est donc un premier élément de réponse. Ensuite nous avons besoin de:
– Néon à lumière noire
– Stroboscope
– Capteur à effet hall (réglable par potentiomètre si possible)
– Carte 2 relais minimum
– Aimants à fort champ magnétique
Pour l’instant, je n’ai que le capteur à effet hall. Ce dernier est en fait une résistance sensible au champ magnétique. On pourra donc le mettre près d’une porte, ajouter des aimants “super puissance” sur le battant, et donc détecter l’état de la porte (ouverte / fermée). Il est conseillé d’en prendre un avec potentiomètre, pour régler le seuil (le capteur renvoie 0 ou 1 en fonction du seuil), c’est donc plus facile à utiliser.
Détecter l’état de la porte
Voici la partie que j’ai déjà effectué. Ca attendra pour la suivante vu que je n’ai pas encore tout le matériel. Pour effectuer tout cela, je me suis aidé de deux tutos écris par idleman (que je remercie au passage pour la clarté de ses articles):
Raspberry PI ~ 13 : Détecter l’ouverture des portes et fenêtres
http://blog.idleman.fr/raspberry-pi-07-allumerteindre-une-vraie-lampe-ou-faire-de-la-domotique-pour-pas-cher/
Le branchement du capteur à effet hall:
J’ai ensuite écrit un petit programme en C qui va gérer tout ça. Il faut savoir que le RPI ne doit pas simplement envoyer son + éclairage lorsque la porte est ouverte, mais aussi lorsque l’on est à l’intérieur de la pièce porte fermée. En gros:
0 = état d'origine (porte femée) 1 = porte ouverte = lancement musique (entrée) 2 = porte fermée = musiqe en cours... 3 = porte ouverte = musique (sortie) 4 = porte fermée = fin musique (plus personne -> remise à zéro)
Le soft va créer un processus à chaque lancement du son + éclairage (processus fls). Le père enverra un SIGKILL (arrêt du processus) à son fils dès la sortie du bonhome.
Le code:
#include#include #include #include #include #include #include #include #include #include #include #include /* Programme permettant de détecter l'ouverture d'une porte: Tant que la personne est à l'intérieur d'une pièce, alors jouer musique + allumer éclairage Pour compiler: g++ -o OpenSensor OpenSensor.cpp -lwiringPi By Valou */ #define LIGHT_1 2; #define LIGHT_2 7; using namespace std; //Numero de pin du capteur a effet hall int pin = 0; int main() { //Si wiringPi n'est pas présente, on arrete le programme if(wiringPiSetup() == -1) { cerr << "Librairie WiringPi introuvable...nPensez à lier la librarie..." << endl; exit(1); } cout << "nn=============== WC_Project ===============nn" << endl; //Commande à envoyer au systeme des detection d'une ouverture string command = "mpg123 --random /home/pi/Music/*"; string stopCommand = "killall mpg123"; /* Etat de la porte: 0 = etat d'origine (porte femee) 1 = porte ouverte -> lancement musique (entree) 2 = porte fermée -> musiqe 3 = porte ouverte -> musique (sortie) 4 = porte fermée -> fin musique (plus personne -> remise à zero) */ int state = 0; //Processus pour fork pid_t idp; //Etat du pin à t-1 int pinState = 0; //Pin en mode lecture pinMode(pin, INPUT); //Calibration: cout << "Veuillez fermer la porte pour calibrer le capteur..." << endl; sleep(5); cout << "Calibration effectuée!n" << endl; //Boucle principale contenant l'action à effectuer lors d'une ouverture //Actualisation toutes les 500 ms while(1) { //Si changement if(digitalRead(pin) == (1 - pinState)) { pinState = digitalRead(pin); switch(state) { case 0: { cout << "Ouverture detectee! Lancement musique...n" << endl; state++; //Activation des luminaires pinMode(LIGHT_1, OUTPUT); pinMode(LIGHT_2, OUTPUT); //Création d'un fils pour lancer la musique if ((idp = fork()) == -1) { cerr << "Erreur lors du fork..." << endl; exit(2); } else if(idp == 0) // Si le fils est en run { system(command.c_str()); exit(-1); } break; } case 1: { cout << "nFermeture détecte! Musique en cour (entree)..." << endl; state++; break; } case 2: { cout << "Ouverture porte! Musique en cours (sortie)..." << endl; state++; break; } case 3: { cout << "Fermeture porte! Fin musique (sortie définitive)..." << endl; state = 0; //Desactivation des luminaires pinMode(LIGHT_1, INPUT); pinMode(LIGHT_2, INPUT); system(stopCommand.c_str()); wait(); //Dézombification du fils break; } } sleep(1); } delay(500); } return 0; }
Info:
- Il vous faudra la librairie wiringPi qui sert à utiliser les ports GPIO. Pour l'installer:https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/
- Pour lire un MP3 en ligne de commande (utilisation de mpg123):
http://www.framboise314.fr/ca-va-faire-du-bruit-chez-les-framboise314-comment-configurer-le-son-sur-le-raspberry-pi/
Ajout d'un néon + strombo:
C'est ici qu'intervient la carte relais. Notre petit RPI ne peut envoyer que du 5V ou 3.3V. Pour des luminaires, ce n'est pas assez. Comment faire? Eh bien on branche d'un côté les luminaires sur le secteur, et de l'autre on les commandes avec le RPI qui agira sur la carte relais (celle-ci servant d'interrupteur). En gros: RPI (allumer lampes) --> Carte relais (Fermer le circuit 220V) --> Lampes allumées
[EDIT] Projet presque terminé! Tout fonctionne, aussi le code a été mis à jour! Cependant voici quelques commentaires:
- Je ne sais pas pourquoi, mais pour allumer un relais, je passe le pin correspondant en mode OUTPUT et en INPUT pour l'éteindre... au lieu d'écrire 1 ou 0 (que ce soit en C, python ou en bash avec gpio). Si quelqu'un peut m'expliquer le pourquoi du comment, il est le bienvenue!
- Pour une utilisation en toute sécurité, il est conseillé d'utiliser une alimentation externe pour le relais (alimenté en 5V).
Bien, il me semble avoir oublié un dernier détail: comment utiliser un relais? Eh bien voici une photo d'un des deux branchement luminaire / relais:
Chaque relais correspondant à un pin du Raspberry Pi, il suffit de l'ouvrir ou de le fermer (ou plutôt de le passer en position NO / NC) en utilisant la méthode ci-dessus.
Voici une photo générale de mon montage (bien dégueu au passage):
Il ne reste plus qu'à brancher les prises et à mettre tout ça dans un boitier correctement! Une petite vidéo de démonstration (elle aussi bien dégueue, j'en posterai une de meilleure qualité tantôt)..
Voili voilou! Hésitez pas à poser des questions si quelque chose vous échappe, ou si vous voulez de plus amples explications =)
Ben j’ai rien compris mais ça a l.air bien …
Hahaa je ferai une vidéo quand tout sera finie (donc je sais pas trop quand…) pour donner une idée du résultat =P