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 ;)

Mécanisme de fermeture

Mécanisme de fermeture

Schéma de montage Arduino

Schéma de câblage

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…