PROJET AUTOBLOG


Le Geek Café

Archivé

source: Le Geek Café

⇐ retour index

Domotique : Commander l'éclairage d'une pièce

vendredi 26 juillet 2013 à 10:21
N’avez-vous jamais rêvé de concevoir par vous-même un système qui vous permettrait de gérer l’éclairage dans chacune des pièces de votre maison ? Eh bien, au nom du Do it yourself (aussi connu sous le nom DIY), je vais vous montrer comment réaliser un tel montage en utilisant une Arduino, ce fameux circuit imprimé libre et open source qui a rendu l’électronique accessible à presque tout le monde de nos jours.

Objectif de notre montage

A terme, le système devra être capable de détecter l’intensité de la lumière ambiante (inutile d’allumer la lumière de votre table de nuit en plein jour), de différencier une entrée d’une personne de sa sortie, de compter le nombre de personnes présentes dans la pièce à un moment donné, de gérer l’éclairage en conséquence et bien sûr d’être désactivable pour ne pas gêner l’utilisateur à terme.

Cependant, dans notre exemple, au lieu de raccorder notre montage directement au secteur, ce qui devrait en principe être le cas, j’utiliserai plutôt une simple LED ce qui sera à mon avis beaucoup moins dangereux.

Liste du matériel nécessaire

Avant de commencer quoi que ce soit, il est important que vous vous procuriez les éléments nécessaires au montage :

Etape 1 : le montage

Voici donc maintenant un schéma réalisé à l'aide du logiciel du montage qu’il vous faudra réaliser pour notre futur système :

image

Nous avons bien ici 2 photodiodes légèrement écartées qui recevront chacune le rayon d’un pointeur laser ainsi qu’une troisième servant à mesurer l’illumination globale. A droite, on trouve 2 LED : celle de gauche permettra d’indiquer si le système est activé et celle de droite de droite simulera la « lampe ». Enfin, au milieu, on trouve un bouton poussoir pour activer et désactiver le système (on aurait pu utiliser un véritable interrupteur ici).

Etape 2 : le programme

Il s’agit maintenant de créer le programme permettant de faire fonctionner ce montage. Ni une ni deux, je vous donne mon propre code commenté :

Code : c
  1. #define BUTTON_INTERRUPTEUR 9 //bouton poussoir pour activer/désactiver le système
  2. #define LED_INTERRUPTEUR 8 //LED affichant l'état de l'interrupteur
  3. #define LED_LAMPE 7 //LED servant de lampe
  4. #define LDR_IN 0 //photodiode détectant l'entrée dans la pièce
  5. #define LDR_OUT 1 //photodiode détectant la sortie de la pièce
  6. #define LDR_AMBIANT 2 //photodiode détectant l'illumination ambiante
  7.  
  8. int allume = 1;
  9. int jour = 0;
  10. int lampe_allume = 0;
  11. int ldr_in_position = 0; //permet de savoir quelle photodiode a été déclenchée en première
  12. int ldr_out_position = 0; //permet de savoir quelle photodiode a été déclenchée en première
  13. int number_person = 0;
  14.  
  15. int buttonEtatCourant;
  16. long time = 0; // temps écoule entre 2 appuis sur le bouton
  17. long delaiChangement = 200; // temps minimum entre 2 appuis
  18.  
  19. void setup() //fonction d'initialisation de la carte
  20. {
  21. pinMode(LED_INTERRUPTEUR, OUTPUT);
  22. pinMode(LED_LAMPE, OUTPUT);
  23. }
  24.  
  25. void loop()
  26. {
  27. getButton();
  28. getDayNight();
  29. displayLedInterrupteur();
  30.  
  31. if(jour == 0 && allume == 1) //on exécute le reste du script que si il fait nuit
  32. {
  33. detectPassage();
  34. displayLedLamp();
  35. }
  36. }
  37.  
  38. void getButton()
  39. {
  40. buttonEtatCourant = digitalRead(BUTTON_INTERRUPTEUR); //on lit l'état du bouton poussoir
  41.  
  42. if (buttonEtatCourant == HIGH && millis() - time > delaiChangement) {
  43. if(allume == 0)
  44. allume = 1; //on dit alors que le système est activé
  45. else
  46. allume = 0; //on dit alors que le système est éteint
  47. time = millis();
  48. }
  49. }
  50.  
  51. void getDayNight()
  52. {
  53. if(analogRead(LDR_AMBIANT) > 800) //la lumière dans la pièce est forte
  54. {
  55. if(lampe_allume == 0) //si la lampe est allumé, alors on dit que il fait forcément nuit
  56. {
  57. jour = 0;
  58. }
  59. else
  60. {
  61. jour = 1;
  62. }
  63. }
  64. else //la mumière est faible, il fait forcément nuit
  65. {
  66. jour = 0;
  67. }
  68. }
  69.  
  70. void displayLedInterrupteur()
  71. {
  72. if(allume == 1)
  73. {
  74. analogWrite(LED_INTERRUPTEUR, HIGH);
  75. }
  76. }
  77.  
  78. void detectPassage()
  79. {
  80. if(analogRead(LDR_IN) < 500) //on vient de passer devant le capteur d'entre
  81. {
  82. if(ldr_out_position == 0) //le capteur extérieur a été le premier déclenché, la personne entre
  83. {
  84. ldr_in_position = 1;
  85. }
  86. else if(ldr_out_position == 1) //le capteur extérieur a été déclenché en 2ème, la personne sort
  87. {
  88. ldr_in_position = 2;
  89. }
  90. }
  91.  
  92. if(analogRead(LDR_OUT) < 500) //on vient de passer devant le capteur de sortie
  93. {
  94. if(ldr_in_position == 0) //le capteur intérieur a été le premier déclenché, la personne sort
  95. {
  96. ldr_out_position = 1;
  97. }
  98. else if(ldr_in_position == 1) //le capteur intérieur a été déclenché en 2ème, la personne entre
  99. {
  100. ldr_out_position = 2;
  101. }
  102. }
  103.  
  104. if(ldr_in_position == 1 && ldr_out_position == 2) //la personne sort
  105. {
  106. number_person --;
  107.  
  108. if(number_person < 0)
  109. number_person = 0;
  110. }
  111. else if(ldr_in_position == 2 && ldr_out_position == 1) //la personne entre
  112. {
  113. number_person ++;
  114. }
  115.  
  116. if(number_person == 0)
  117. {
  118. lampe_allume = 0;
  119. }
  120. else
  121. {
  122. lampe_allume = 1;
  123. }
  124.  
  125. if(ldr_in_position > 0 && ldr_out_position >0)// on remet à 0 après un passage
  126. {
  127. ldr_in_position = 0;
  128. ldr_out_position = 0;
  129. }
  130. }
  131.  
  132. void displayLedLamp()
  133. {
  134. if(lampe_allume == 1)
  135. analogWrite(LED_LAMPE, HIGH);
  136. else
  137. analogWrite(LED_LAMPE, LOW);
  138. }

Je pense que le code est assez simple à comprendre. De plus, j'ai pris soin de bien commenter toutes les parties importantes. Néanmoins, si vous ne comprenez pas une partie du programme, n'hésitez pas à mon contacter.

Conclusion

Et voilà, vous possédez maintenant un petit système permettant d’automatiser l’éclairage d’une pièce basé sur l’utilisation de pointeurs laser et de photodiodes.
Une alternative à l’utilisation de laser aurait été de mettre en place des récepteurs à ultrason à la place des photodiodes. En effet, en fonction du retard entre l’émission de l’onde et sa réception, on aurait facilement pu détecter le passage d’une personne.

Sources :