En ce moment c’est l’été et il fait très chaud, surtout lorsque sa chambre se situe sous les combles de la maison… Ainsi, pour récupérer la fraicheur de la nuit, je laisse le Velux (ou fenêtre de toit) ouvert. Mais du coup, le soleil déjà bien présent à 5h du matin me réveille et m’oblige a fermer le Velux.
D’où la question : Comment automatiser la fermeture du Velux lorsque le soleil se lève ?
La réponse : Avec un Arduino !
Avant d’en dire plus, une petite vidéo du résultat final :
Le principe est donc de détecter la lumière ambiante avec la photorésistance et de déclencher, à un certain seuil de luminosité, la fermeture du Velux.
Un switch principal permet d’activer/désactiver le système, un bouton poussoir de test permet d’actionner la fermeture sur commande et un bouton de détection de fin de course permet de détecter l’état du Velux (ouvert ou fermé). Ce dernier permet de ne pas enclencher le moteur dans le cas où le velux est déjà fermé.
Le matériel :
– un Arduino (duemilanove dans mon cas)
– un moteur (pour moi un servo car c’est le plus puissant que j’avais sous la main)
– une photorésistance
– un switch
– un bouton poussoir
– un bouton de détection de fin de course
– une ficelle ;)
Schéma de montage Arduino
Code source Arduino
#include <Servo.h> Servo myservo; const int boutonPoussoirTestPin = 2; // Pin du bouton poussoir de test const int boutonFinDeCoursePin = 3; // Pin du système de fin de course (velux ouvert ou fermé) const int systemeActifPin = 4; // Pin de marche arret du système int photoresistor = A2; // Pin analogique de la photoresistance int pos = 0; // Position servo boolean systemeActif = false; // Variable d'état du système boolean veluxOuvert = false; // Variable d'état du Velux boolean nuit = false; // Variable d'état du jour ou de la nuit void setup() { Serial.begin(9600); myservo.attach(9); // Servo banché au PIN 9 pinMode(boutonPoussoirTestPin, INPUT); pinMode(boutonFinDeCoursePin, INPUT); pinMode(systemeActifPin, INPUT); Serial.println("Start"); myservo.write(pos); // Initialise le servo à la position 0 } void loop(){ // DEBUG //Serial.println(analogRead(photoresistor)); //Serial.println(systemeActif, DEC); //Serial.println(veluxOuvert, DEC); //Serial.println(nuit, DEC); //Serial.println("-----"); //delay(1000); // Lecture du switch pour activer/désactiver le système if (digitalRead(systemeActifPin) == HIGH){ systemeActif = true; } else{ systemeActif = false; } // Lecture du bouton de test if (digitalRead(boutonPoussoirTestPin) == HIGH){ moteur(); } // Lecture de l'état du bouton de fin de course if (digitalRead(boutonFinDeCoursePin) == HIGH){ veluxOuvert = false; } else{ veluxOuvert = true; } // Il fait maintenant nuit if (analogRead(photoresistor) < 450) { // S'il fait jour et que la luminosité est inferieur à 450 alors il fait à nouveau nuit nuit = true; } // Il fait maintenant jour if (analogRead(photoresistor) > 770) { nuit = false; } // Le soleil vient de se lever if (systemeActif == true && veluxOuvert == true && nuit == true && analogRead(photoresistor) > 750){ // Si le systeme est actif et le velux ouvert et qu'il fait nuit moteur(); } } void moteur(){ for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees { // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(5); // waits 5ms for the servo to reach the position } delay(1000); for(pos = 180; pos >= 1; pos -= 1) // goes from 180 degrees to 0 degrees { myservo.write(pos); // tell servo to go to position in variable 'pos' delay(5); // waits 5ms for the servo to reach the position } delay(1000); } |
Conclusion
Le système fonctionne bien, cependant cela reste une solution provisoire. Mon objectif final est évidemment d’automatiser l’ouverture et la fermeture. Une simple ficelle ne sera pas suffisante, il me faudra un mécanisme d’ouverture. Je n’ai pas encore trop d’idée sur ce point, je continu mes recherches…
Cédric
juillet 5th, 2011 à 10:28