[Non réglé] Automatisation de lampe avec compteur, décompteur, sens de passage

Bonjour tout le monde !!!

Je viens vers vous car j'ai le projet de réaliser un programme qui sache compter le nombre de personnes dans une pièce d'une maison grâçe au nombre d'entrées et sorties des personnes dans cette pièce et donc commander les lampes.

Pour connaitre le sens de passage il y aura deux capteurs au passage de porte de la pièce.

donc mon problème et que je ne trouve pas l'opérateur de comparaison qui me convient car je cherche un opérateur "puis" ou s'il n'existe vraiment pas il me faut un moyen de le faire, car pour connaitre le sens de passage d'une personne au passage de porte la personne passe devant le capteur A puis le capteur B et donc la lampe s’éteint ou s'allume selon si la personne sort ou rentre dans la pièce.

j'ai cherché pendant plusieurs heures sur différents tutos et internet en général mais je n'ai rien trouvé!!!

J'ai commencé a coder sur le logiciel de l'arduino, comme vous pouvez le voir sur le code ci-dessous à la place du "ET" qui est caractérisé "&&" il me faut un "PUIS" ou remodeler le code de façon à faire "PUIS".

Si quelqu'un a une solution je suis preneur, je tiens à signaler que je suis novice dans le codage j'ai commencé il y a 3-4 jours il y a surement plusieurs erreurs dans mon code "vos remarques sont les bienvenues" mais ce qui m’intéresse c'est de pouvoir faire ce "PUIS".

Merci de m'avoir lu et de vos réponses !

int lp_autres = 12;
int lp_couloir = 13;

int capteur_couloir = 0;
int capteur_autres = 0;



void setup() 
{
 
  Serial.begin(9600);
  Serial.println();
  Serial.println("demarrage du programme"); 

  pinMode(lp_autres, OUTPUT);
  pinMode(lp_couloir, OUTPUT);
    
  
  
 if (capteur_autres && capteur_couloir){ // if=si capteur_autres puis capteur_couloir
    
    digitalWrite(lp_couloir, HIGH);//lp couloir allumée
    digitalWrite(lp_autres, LOW); //lp autres éteinte
  
    int compteur_entree_couloir = 2;
    int compteur_sortie_autres = 2; 
   
    Serial.print("compteur_entree_couloir=");
    Serial.println(compteur_entree_couloir);
    compteur_entree_couloir++;
  
    Serial.print("compteur_sortie_autres=");
    Serial.println(compteur_sortie_autres);
    compteur_sortie_autres--;
  }
 else if (capteur_couloir && capteur_autres){ //sinon=else si=if capteur_couloir puis capteur_autres
   
    digitalWrite(lp_couloir, LOW); //lp couloir éteinte
    digitalWrite(lp_autres, HIGH); //lp autres allumée
  
    int compteur_entree_couloir = 2;
    int compteur_sortie_autres = 2;
   
    Serial.print("compteur_sortie_autres=");
    Serial.println(compteur_sortie_autres);
    compteur_sortie_autres++;
   
    Serial.print("compteur_entree_couloir=");
    Serial.println(compteur_entree_couloir);
    compteur_entree_couloir--;
 
 
 }
    
 }

void loop() 
{
  
}

Bonsoir
C’est pour un “exam” de fin d’année ? :grin:
Regarde du coté de l’encodage en quadrature , c’est exactement le meme probleme que la gestion d’un encodeur A/B

oulaa,

pour commencer, je ne vois pas ou tu déclares tes pin en "input" pour tes capteurs, ensuite pour "cpater" un sens de passage il te faut minimum 2 capteurs de passage par piece a gerer, ensuite, la partie active de ton programme, celle qui va tester tes conditions doit se trouver dans le loop, la le tiens est vide.

pour finir, je pense que tu n'es pas obligé de passer par l'encodage a quadrature et qu'avec une gestion intelligente de "if" et d'une tempo ça devrais le faire, dans l'idée je ferai " si capteur 1 est actionné et le capteur 2 dans les X millisecondes, alors NombreDePersonnes = NombreDePersonnes + 1" et "si capteur 2 est actionné et le capteur 1 dans les X millisecondes, alors NombreDePersonnes = NombreDePersonnes - 1"

bon c'est juste dans l'idée de ce que moi je ferai, aprés je n'ai pas de code exacte en tête.

et si je change d'avis après avoir passé le capteur 1 parce que je croise gaston qui vient dans le sens contraire et qui a déjà passé le capteur 2, et qui me dit "viens on va boire un coup" et que je ressors en même temps que lui ?

J-M-L:
et si je change d'avis après avoir passé le capteur 1 parce que je croise gaston qui vient dans le sens contraire et qui a déjà passé le capteur 2, et qui me dit "viens on va boire un coup" et que je ressors en même temps que lui ?

je les accompagnent !!!!

je suppose que dans ce projet ne sont pas inclus ce type d'événements.

artouste2 : non ce n’est pas pour un examen de fin d’année mais pour un projet de construction qui se concrétise

You have exceeded the number of posts you can make in a 5 minutes period. Please try again later.

il y a un problème pour vous répondre mes message n’apparaissent pas entièrement !!! puis un message d'erreur apparaît quant je re-poste un nouveau message !!!!!

ikari:
artouste2 : non ce n'est pas pour un examen de fin d'année mais pour un projet de construction qui se concrétise

bonjour
regarde pour adapter ce code à ton projet
Je pars sur le principe du sas , j'ai commenté rapidement

int encoder0PinA = 2; // capteur entree SAS
 int encoder0PinB = 3; // capteur  sortie SAS
 int encoder0Pos = 0; // NB de personne presentes dans la salle et le sas
 int encoder0PinALast = LOW;
 int n = LOW;

 void setup() { 
   pinMode (encoder0PinA,INPUT_PULLUP);
   pinMode (encoder0PinB,INPUT_PULLUP);
   Serial.begin (115200);
 } 

 void loop() { 
   n = digitalRead(encoder0PinA);
   if ((encoder0PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder0PinB) == LOW) {
       encoder0Pos--;
     } else {
       encoder0Pos++;
     }
     Serial.print (encoder0Pos);
     Serial.print ("/");
   } 
   encoder0PinALast = n;
 }
Merci pour cette aide précieuse artouste2, j'ai repris le code que tu m'as proposé ça fonctionne comme je le souhaite il y a juste une chose c'est que je n'arrive pas à gérer plus de deux pièces du coup je vais acheter un arduino pour chaque pièce. Je mets le code ci-dessous si quelqu'un veut le réutiliser.

 
const int capteurs_piece1 = 4; // capteurs piece1
 const int capteurs_piece2 = 5; // capteurs piece2

 unsigned int NB_de_personne_piece1 = 0; // NB de personne presentes dans la piece1
 unsigned int NB_de_personne_piece2 = 0; // NB de personne presentes dans la piece2
 unsigned int NB_de_personne_piece3 = 0; // NB de personne presentes dans la piece3

 int encoder0PinALast = LOW;
 int n = LOW;

 const int lampe_piece1 =12; // led_bleu = pin 12
 const int lampe_piece2 =13; // led_arduino = pin 13 
 const int lampe_piece3 =11; // led_arduino = pin 11 
 
 void setup() { 
   pinMode (capteurs_piece1,INPUT_PULLUP); 
   pinMode (capteurs_piece2,INPUT_PULLUP);  
 
   Serial.begin (115200);
 } 

 void loop() { 
  
     //n = digitalRead(capteur1_porte_A) || digitalRead(capteur2_porte_A); // LOW = capteur_A OU capteur_B
       n = digitalRead(capteurs_piece1) || digitalRead(capteurs_piece2);
  
     if ((encoder0PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(capteurs_piece1) == LOW) {
     NB_de_personne_piece1--;
     NB_de_personne_piece2++; //|| NB_de_personne_piece3++;
     } else {
     NB_de_personne_piece1++;
     NB_de_personne_piece2--;//|| NB_de_personne_piece3--;
     } 
     Serial.print (NB_de_personne_piece1);
     Serial.println (" personne dans la piece1");
     
     Serial.print (NB_de_personne_piece2);
     Serial.println (" personne dans la piece2"); }
   
     encoder0PinALast = n;


     if (NB_de_personne_piece1==0){   // si = a 0 
     digitalWrite(lampe_piece2, LOW);  //led_arduino_eteinte
     }
     else if (NB_de_personne_piece1>0){ //si superieur a 0
     digitalWrite(lampe_piece2, HIGH);  // led arduino allumer
     }

     if (NB_de_personne_piece2==0){ // si = a 0 
     digitalWrite(lampe_piece1, LOW); // led_bleu_eteinte
     }
     else if (NB_de_personne_piece2>0){ //si superieur a 0
     digitalWrite(lampe_piece1, HIGH); // led bleu allumer
     } 
     }

ikari:
… j’ai repris le code que tu m’as proposé ça fonctionne comme je le souhaite il y a juste une chose c’est que je n’arrive pas à gérer plus de deux pièces du coup je vais acheter un arduino pour chaque pièce. Je mets le code ci-dessous si quelqu’un veut le réutiliser.

Bonsoir
Il est possible de gerer plusieurs encodeurs/pieces avec le meme principe
inspire toi du code que j’ai utilisé pour gerer plusieurs encodeurs en polling

// TEST 5 encodeurs A/B gestion en polling , sans lib
// NB les encodeurs sont cablés à GND tirage par INPUT_PULLUP

byte encPinA[] = {2, 4, 6, 8, 10} ; // definition des pins encodeurs canal A
byte encPinB[] = {3, 5, 7, 9, 11} ; // definition des pins encodeurs canal B
int encPos[5]  ; // encPos[x] contient les valeurs compteurs
byte encOld[5]  ;
byte encAct[5] ;
byte rescanpot[] = {0, 0, 0, 0, 0} ;
byte nbenc = 5; // nb encodeurs

byte i;

void setup() {

  for ( i = 0; i < nbenc; i++) {
    pinMode (encPinA[i], INPUT_PULLUP);
    pinMode (encPinB[i], INPUT_PULLUP);
  }

}

void loop() {

  for ( i = 0; i < nbenc; i++) {
    encAct[i] = digitalRead(encPinA[i]);
    if ((encOld[i] == LOW) && (encAct[i] == HIGH)) {
      if (digitalRead(encPinB[i]) == LOW) {
        encPos[i]--; // -1 dans le compteur encPos[x]

      } else {
        encPos[i]++; // +1 dans le compteur encPos[x]

      }
    }

    encOld[i] = encAct[i];
    if ( encPos[i] != rescanpot[i]) {


    }

    rescanpot[i] = encPos[i];
  }
}