Problème code maison intelligente

Bonjour,
J’ai un projet pour mon école à finir, c’est une maison en domotique. Nous avons pris les fonctions suivante :

  • Si on appuie sur 1 : On peut géré les led et la luminosité de la maison
  • Si on appuie sur 2 : On peut ouvrir ou fermer les volets.
  • Si on appuie sur 3 : La maison est géré toutes seules. S’il fait nuit il les lumières s’allume et les volet se ferme. S’il fait jour les lumières s’éteignent et les volets s’ouvrent.

Voici le code :

#include <Stepper.h>
#include "IRremote.h"


/*-----( Declare Constants )-----*/
int receiver = 7; // pin 1 of IR receiver to Arduino digital pin 11
// RECEPTEUR

#define LDB_Touche_0 0xE12430CF
#define LDB_Touche_1 0xFF30CF
#define LDB_Touche_2 0xFF18E7
#define LDB_Touche_3 0xFF7A85
#define LDB_Touche_4 0xFF10EF
#define LDB_Touche_5 0xFF38C7
#define LDB_Touche_6 0xFF5AA5
#define LDB_Touche_7 0xFF42BD
#define LDB_Touche_8 0xFF4AB5
#define LDB_Touche_9 0xFF52AD
#define LDB_Touche_Volume_Up 0xFF906F
#define LDB_Touche_Volume_Down 0xFFA857
#define LDB_Touche_Power 0xFFA25D
#define LDB_Touche_Play 0xFFC23D
char appuyer = 'FFC23D';

// Moteur constante 
#define IN1  8
#define IN2  9
#define IN3  10
#define IN4  11

int Steps = 0;
boolean Direction = true;
unsigned long last_time;
unsigned long currentMillis ;
int steps_left=4095;
long time;
int moteur_position = 0; // Donne la variable de la position du moteur

// Capteur Photosensible
int LDR = 0; // the cell and 10K pulldown are connected to a0
int photocellReading; // the analog reading from the analog resistor divider
int base;
int lumiere = 100; // luminosité
int k = 0;
 
// Led 
int ledPin =6;      // the number of the LED pin
int Led_allumer = 0; // Si la valeur est 1 = Allumer / Si la valeur est 0 éteinds
int ledlevel = 0;

// Variable servant a choisir le mode
int prog_led = 0;
int prog_domo = 0;


// Variabe pour le capteur de mouvement
#define trigPin 13
#define echoPin 12


/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'
/*-----( Declare Variables )-----*/


void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);
  Serial.println("IR Receiver Raw Data + Button Decode Test");
  irrecv.enableIRIn(); // Start the receiver
  
  //declare the motor pins as outputs
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
 // pinMode(trigPin, OUTPUT);
//  pinMode(echoPin, INPUT);
  
  //LED
  pinMode(ledPin, OUTPUT); 
  
  // Capteur photosensible
  base = analogRead(LDR);

}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  if (irrecv.decode(&results)) // have we received an IR signal?

  {
  //Serial.println(results.value, HEX); 
    translateIR(); 
    irrecv.resume(); // receive the next value
  }  
}/* --(end main loop )-- */

/*-----( Declare User-written Functions )-----*/
void translateIR() // takes action based on IR code received

// describing Car MP3 IR codes 


{

  switch(results.value)

  {
    //POUR ALLUMER LA LED ET géré Luminosité
    case LDB_Touche_1:  
    Serial.println(" 1             "); 
    prog_led = 1;
    while (prog_led == 1)
      {
          if (irrecv.decode(&results)) {
           if(results.value == LDB_Touche_Volume_Up && ledlevel <255) 
          {
            ledlevel += 51; //luminosité led ++
             Serial.println("Luminosite ++"); 
          }
           if(results.value == LDB_Touche_Volume_Down && ledlevel >0) 
          {
            ledlevel -= 51; //luminosité led --
             Serial.println("Luminosite --"); 
          }
          analogWrite(6, ledlevel);
          Serial.println("Allume");
          Led_allumer = 1;
           delay(100);                  // attend une seconde
          if (results.value == LDB_Touche_Power)
          {
             prog_led == 0; 
             Serial.println("Eteindre");
             break;
          }
         irrecv.resume(); // Receive the next value
      }
      }
        delay(100);                  // attend une seconde
    break;
    
    case LDB_Touche_2:  // Fonction ouverture fermeture volet
    Serial.println(" 2          "); 
    // Boucle pour le moteur 
    while(steps_left>0)
    {
        currentMillis = micros();
        if(currentMillis-last_time>=1000)
        {
          stepper(1); 
          time=time+micros()-last_time;
          last_time=micros();
          steps_left--;
        }
    }
    Serial.println(time);
    Serial.println("Wait...!");
    delay(2000);
       Direction=!Direction;
    steps_left=1364;
    break;
    
    
// Fonction Maison domotique
  case LDB_Touche_3:  
    {  
       prog_domo = 1;
      while (prog_domo == 1)
      {
        int j = analogRead(LDR); // valeur de la luminosité
        
        if (j != k)
        {
   
        if (j < 700)
        {
            digitalWrite(ledPin, HIGH);
             moteur_position = 0;
            if (moteur_position == 0) // Si le volet est ouvert
           {
            // Boucle pour le moteur 
            while(steps_left>0)
            {
                currentMillis = micros();
                if(currentMillis-last_time>=1000)
                {
                  stepper(1); 
                  time=time+micros()-last_time;
                  last_time=micros();
                  steps_left--;
                }
            }
            delay(2000);
               Direction=!Direction;
            steps_left=1364;
           }
           k = j;
          
        }
        else if (j > 699)
        {
          digitalWrite(ledPin, LOW);
           Serial.println("Lumiere eteinte");
           moteur_position = 1;
           // Boucle pour le moteur 
           if (moteur_position == 1) // Si le volet est fermé
           {
              while(steps_left>0)
              {
                  currentMillis = micros();
                  if(currentMillis-last_time>=1000)
                  {
                    stepper(1); 
                    time=time+micros()-last_time;
                    last_time=micros();
                    steps_left--;
                  }
              }
              delay(2000);
                 Direction=!Direction;
              steps_left=4095;
           }
          
        }
        }
        else
        {
          delay(100); 
        }
      }
    }
    break;
    
  default: 
    Serial.println(" other button   ");

  }

  delay(500);


} //END translateIR
////////////////////////////////////////////////////////////////////////
/// Function suppl.

void stepper(int xw){
  for (int x=0;x<xw;x++){
switch(Steps){
   case 0:
     digitalWrite(IN1, LOW); 
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, HIGH);
   break; 
   case 1:
     digitalWrite(IN1, LOW); 
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, HIGH);
     digitalWrite(IN4, HIGH);
   break; 
   case 2:
     digitalWrite(IN1, LOW); 
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, HIGH);
     digitalWrite(IN4, LOW);
   break; 
   case 3:
     digitalWrite(IN1, LOW); 
     digitalWrite(IN2, HIGH);
     digitalWrite(IN3, HIGH);
     digitalWrite(IN4, LOW);
   break; 
   case 4:
     digitalWrite(IN1, LOW); 
     digitalWrite(IN2, HIGH);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, LOW);
   break; 
   case 5:
     digitalWrite(IN1, HIGH); 
     digitalWrite(IN2, HIGH);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, LOW);
   break; 
     case 6:
     digitalWrite(IN1, HIGH); 
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, LOW);
   break; 
   case 7:
     digitalWrite(IN1, HIGH); 
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, HIGH);
   break; 
   default:
     digitalWrite(IN1, LOW); 
     digitalWrite(IN2, LOW);
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, LOW);
   break; 
   }
  SetDirection();
  }
 } 
 
  void SetDirection(){
  if(Direction==1){ Steps++;}
  if(Direction==0){ Steps--; }
  if(Steps>7){Steps=0;}
  if(Steps<0){Steps=7; }
  }


/* ( THE END ) */

J’utilise une télécommande pour savoir les entrés utilisateurs.
Mais je bloque absolument sur la partie 3 de tous géré seul.
De pouvoir rester dans le programme. Savoir si le volet et déjà ouvert de le fermer.
Voilà si une âme charitable pourrait bien m’aider,

cordialement,
Tchoune

Salut,

Pour rester dans ton programme, tu peux passer par une variable intermédiaire d'état au lieu d'écouter directement la télécommande. C'est trés logique compte tenu de ce que tu cherches à faire puisque tu désires répéter une séquence tant qu'une autre n'est pas sélectionnée.

Donc tu conserves le switch avec les commandes, sauf que tu ne donnes plus directement les actions à fournir, tu modifies au contraire une variable qui sera reprise de la même manière plus tard.

Tu peux aussi séparer les séquences de ta boucle principale pour plus de lisibilité.

//J'écoute la télécommande dans le loop
switch(results.value)

  {
    case LDB_Touche_1: task = 0; break;
    case LDB_Touche_1: task = 1; break;
    case LDB_Touche_1: task = 2; break;
}

switch (task) {
    case 0: prog_1; break;
    case 1: prog_2; break;
etc...

// fin du loop

void prog_1()
{
// le contenu de la 1ere séquence
}
etc...

En ce qui concerne la gestion des volets roulant, c'est un dilemne que je n'ai jamais résolu. Les volets roulants électriques s'arrêtent en position basse ou haute grace à des butées mécaniques. Ton projet suppose que tu ajoutes à ces butées mécaniques un contrôle électrique de positionnement qui peut être géré par divers capteurs de position, des contacts, distance-mètre, etc. A toi de choisir la technologie. Personnellement j'ai des enfants et je me suis toujours demandé ce qui se passerai si un des mes monstres se coinçait le bras ou la tête dans un volet roulant automatisé. Je suppose que le couple moteur ne peut faire de mal à un enfant, mais en dehors de cette considération, il est extrêmement difficile dans cette optique de considérer la gestion des anomalies qui peuvent parfois arriver pour diverses raisons : blocage mécanique, volet déjà dans la position demandé (risque électrique), etc.

Bon courage,

Zoroastre.

Bonsoir,

Il y a a bien longtemps, j’ai eu des cours d’algorithmie par un prof bedonnant et moustachu …

Pas super trippant, mais finalement bien utile !

L’idée est de, bien avant d’écrire la moindre ligne de code … de réfléchir, de faire bouillir ses neurones, et d’écrire en langage clair ce que l’on veut qui se passe (en gros et vite fait, à toi de compléter):

  • Init :
  • Statut=0 → Statut : 1,2,3 comme décrit
  • ?
  • Boucle
  • Recoit une commande ?
  • Si oui → changement de valeur du statut / stocke code commande
  • Statut=1 ?
  • Gère les led et la luminosité f° du code (…)
  • Statut=2 ?
    -Ouvre ou ferme les volets (…)
  • Statut=3 ?
  • Luminosité < mini ?
  • Allumer les lumières
  • Fermer les volets
  • Luminosité > mini +x ? (hysteresis)
  • Eteindre les lumières
  • Ouvrir les volets
  • (Nb : ne pas mettre le capteur de lumière à l’intérieur … ;D )

(Autre nb : je n’ai pas lu ou voulu lire ton code)

Cela fait un moment que j’écris ce qu’on appelle des spécifications pour des programmeurs, qui réalisent ce que j’ai décrit (je ne me considère pas comme un programmeur, mais comme un bricoleur)

Plus ta spécification sera précise et juste, plus ton programme sera facile à écrire et à déboguer

Prends le temps de te poser et de réfléchir, ce n’est pas du temps perdu, bien au contraire !

Bon courage

Jacques