Go Down

Topic: Bonjour, je réalise une chatière aux normes BBC besoin d aide pour arduino (Read 3992 times) previous topic - next topic

michel5650

Bonjour, je réalise une chatière aux normes BBC
Besoin de votre aide pour programme  Arduino uno je suis loin de connaitre toutes les astuces malgré mes recherches sur Google
J'ai quelque difficultés  avec mon prog avec mon Arduino  aussi je vous le présente déjà pour le déverminer
Et me dire ce qui ne va  pas si l'on peut faire plus simple
il fonctionne mais parfois il saute des étapes
Merci par avance

michel5650

 // Chatiere version 9 tc
 int verin1A = 7;      // pin 1A (Input 1A) carte moteur (L293D MR001)
 int verin1B = 8;      // pin 1B  (Input 1B) carte moteur (L293D MR001)
 int verinE1 = 9;      // pin E1 (Enable E1) carte moteur (L293D MR001)

 int led1 = 10;        // Sortie 10 Led JAUNE interieur indique le chat est dehors
 int led2 = 11;        // sortie 11 Led VERTE interieur indique que la porte est ouverte
 int led3 = 12;        // sortie 12 Led ROUGE interieur indique une detection exterieur
 int led4 = 13;        // sortie 13 Led ROUGE exterieur indique que le echat est a l interieur
 int arduino2e14 = 14;
 int arduino2e15 = 15;
 int arduino2e16 = 16;
 int arduino2s17 = 17;
 int arduino2s18 = 18;
 int arduino2s19 = 19;
 
 int cellule1 =0;       // Variable pour memoriser que le chat est passé devant la cellule interieur1
 int cellule2 =0;       // Variable pour memoriser que le chat est passé devant la cellule interieur2
 int cellules =0;
 int dehors  =0;       // Variable pour memoriser que le chat est sorti et la porte est refermé
 int presence1 =0;     // Variable detecteur de presence
 int presence2 =0;     // Variable detecteur de presence
 int celluleporte=0;
 int telecommandeouvre=0;
 int telecommandeferme=0;
 
 const int celluleI1 = 0;   //cellule photoelectrique interieur1 de sortie chat
 const int celluleI2 = 2;   //cellule photoelectrique interieur2 de sortie chat
 const int celluleE3 = 3;   //cellule photoelectrique exterieur 
 const int telecommande  = 4;      //entrée Télécommande
 const int detectpresence1  = 5;   //detecteur de presence 1 infra rouge placé a l exterieur
 const int detectpresence2  = 6;   //detecteur de presence 2 infra rouge placé a l exterieur

 void setup() {
  // definir les broches en  sortie
  pinMode(led1, OUTPUT);       // Sortie 10 Led JAUNE interieur
  pinMode(led2, OUTPUT);       // Sortie 11 Led VERTE interieur
  pinMode(led3, OUTPUT);       // Sortie 12 Led ROUGE interieur
  pinMode(led4, OUTPUT);       // Sortie 13 Led ROUGE exterieur
  pinMode(verin1A, OUTPUT);    // sortie 7  carte verin led rouge de la carte
  pinMode(verin1B, OUTPUT);    // sortie 8  carte verin led verte de la carte
  pinMode(verinE1, OUTPUT);    // sortie 9  carte verin
  pinMode(arduino2s17, OUTPUT);    // Arduino 2 pour sortie info utilisé par  arduino 2
  pinMode(arduino2s18, OUTPUT);    // Arduino 2 pour sortie info utilisé par  arduino 2
  pinMode(arduino2s19, OUTPUT);    // Arduino 2 pour sortie info utilisé par  arduino 2
 
  // definir les broches en  entrées
  pinMode(celluleI1, INPUT);     // entrée 0 cellule 1 photoelectrique interieur de sortie
  pinMode(celluleI2, INPUT);     // entrée 1 cellule 2 photoelectrique interieur de sortie
  pinMode(celluleE3, INPUT);     // entrée 2 cellule 3 photoelectrique  placé a l exterieur
  pinMode(telecommande, INPUT);  // entrée 3  Télécommande
  pinMode(detectpresence1, INPUT);  // entré 4 detecteur de presence 1 infra rouge placé a l exterieur
  pinMode(detectpresence2, INPUT);  // entré 5 detecteur de presence 2 infra rouge placé a l exterieur
  pinMode(arduino2e14, INPUT);    // Arduino 2 pour entrée info venant de arduino 2
  pinMode(arduino2e15, INPUT);    // Arduino 2 pour entrée info venant de arduino 2
  pinMode(arduino2e16, INPUT);    // Arduino 2 pour entrée info venant de arduino 2
 
  digitalWrite(celluleI1,HIGH);    //Broche 0 Mettre la broche 0 a 1 pour une detection a 0
  digitalWrite(celluleI2,HIGH);    //Broche 1 Mettre la broche 1 a 1 pour une detection a 0
  digitalWrite(celluleE3,HIGH);    //Broche 2 Mettre la broche 2 a 1 pour une detection a 0
  digitalWrite(telecommande,HIGH); //Broche 3 Mettre la broche 3 a 1 pour une detection a 0
 
  digitalWrite(verinE1,HIGH);      //Broche 9  Enable a 1 comme ca le verin fonctionne
 }

  void loop() {
 //////////////////////////////////Detecte que le chat veut sortir ////////////////////////////////////   
 if (digitalRead(celluleI1)==LOW && digitalRead(led1)==LOW && dehors == 0){  //entrée 0 detection que le chat est passé devant la cellule 1 photo electrique
   cellule1=1;    // Met la variable a 1 pour memorisé le passage du chat devant la premiere cellule
   ouverture ();  // ouvre la porte
   } 
                                 //Detecte et memorise que le  chat passe devant la deuxieme cellule
  if (digitalRead(celluleI2)==LOW && dehors == 0) {  //entrée 2 detection que le chat est passé devant la deuxieme cellule
   cellule2=1;   // Met la variable a 1 pour memoriser le passage du chat
  }
 
   if (cellule1==1 && cellule2==1 && dehors == 0) {  //
     cellules=1;              // met la variable a 1 pour memoriser le passage devant les 2 cellules
    digitalWrite(led1, HIGH); // Allume la led JAUNE pour memoriser la passage du chat
   } 
  if (digitalRead(celluleE3)==LOW && dehors == 0) {  //
     celluleporte=1;       // met la variable a 1  memoriser la porte ouverte
    }
  // Fermetute de la porte par les detecteurs de presences apres que le chat soit sorti
  if ( cellules==1 && celluleporte==1 && dehors == 0)  {   
  if ( digitalRead(detectpresence1)==HIGH || digitalRead(detectpresence2)==HIGH ) {
    presence1 =1; // memorise que le chat est dans le champ des detecteurs de presence
    digitalWrite(led2, HIGH);  // Alume la led VERTE interieur pour montrer la detection de presence
     }}
  if (cellules== 1 && presence1 ==1 && dehors == 0) {  //ferme la porte
   fermeture ();
   presence1 =0;
   dehors = 1;
    delay(40000 );
    dehors = 1;
    celluleporte=0;
    digitalWrite(led3, HIGH); // Alume la led rouge
    digitalWrite(led2, LOW);  // éteint la led VERTE interieur
    digitalWrite(led4, LOW);  // éteint la led ROUGE exterieur
     cellule1 =0;
     cellule2 =0;
     cellules=0;
     presence1 =0;
     celluleporte=0;
  }
  digitalWrite(led2, LOW);  // etteint la led VERTE interieur qui indique une presence

 // ******************** le chat est dehors prepare toi pour lui ouvrir **************************************** //
 if (dehors == 1 && presence2==0 && dehors == 1 ) {     
 if (digitalRead(detectpresence1)==HIGH || digitalRead(detectpresence2)==HIGH) {
    digitalWrite(led2, HIGH);  // Alume la led VERTE interieur pour montrer la detection de presence
    ouverture ();  // ouvre la porte
    presence2=1;   //Memorise la detection de presence
    } }
  if (digitalRead(celluleI2)==LOW && dehors == 1) {  //entrée 2 detection que le chat est passé devant la deuxieme cellule
      cellule2 =1;   // Met la variable a 1 pour memoriser le passage du chat 
      }
   if (digitalRead(celluleI1)==LOW && dehors == 1  && presence2 ==1 && cellule2 ==1) {
    fermeture ();  // C est sur le chat est rentré il est passé devant les 2 cellules je ferme la porte
    delay(15000 ); //
    dehors=0;
    presence2=0;
    cellule1=0;
    cellule2=0;
    cellules=0;
    celluleporte=0;
    digitalWrite(led1, LOW);  // Eteint la led JAUNE
    digitalWrite(led2, LOW);  // Eteint la led Verte
    digitalWrite(led3, LOW);  // Eteint la led ROUGE
    digitalWrite(led4, HIGH); // Allume la led ROUGE exterieur
   }
 ///////////////////////////////// TELECOMMANDE force l ouverture ou la fermeture /////
     
 if (digitalRead(telecommande)==LOW && telecommandeouvre==0) {
    telecommandeouvre=1;
    ouverture ();  // ouvre la porte
    dehors=0;
    presence1 =0;
    presence2=0;
    cellule1=0;
    cellule2=0;
    cellules=0;
    celluleporte=0;
    digitalWrite(led1, LOW);  // Eteint la led JAUNE
    digitalWrite(led2, LOW);  // Eteint la led Verte
    digitalWrite(led3, LOW);  // Eteint la led ROUGE
    digitalWrite(led4, LOW);  // Allume la led ROUGE exterieur
    delay (5000);
    } 
  if (digitalRead(telecommande)==LOW && telecommandeouvre==1) {
    telecommandeouvre=0;
    fermeture ();             // Ferme la porte
    dehors=0;
    presence2=0;
    presence1 =0;
    cellule1=0;
    cellule2=0;
    cellules=0;
    digitalWrite(led1, LOW);  // Eteint la led JAUNE
    digitalWrite(led2, LOW);  // Eteint la led Verte
    digitalWrite(led3, LOW);  // Eteint la led ROUGE
    digitalWrite(led4, LOW);  // Allume la led ROUGE exterieur
    delay (5000);
   }
   }
 //////////////////////////////les fonctions ///////////////////////////////////
 
  void ouverture (){
  digitalWrite(verin1A, LOW);   // sortie 7 arduino = led rouge carte moteur
  digitalWrite(verin1B, HIGH);  // sortie 8 arduino = led verte carte moteur
   }
   
   void fermeture (){
  digitalWrite(verin1A, HIGH);   // sortie 7 arduino = led rouge carte moteur
  digitalWrite(verin1B, LOW);    // sortie 8 arduino = led verte carte moteur
   }

jfs

C'est quoi la norme BBC ? 

Barbecue ?  :smiley-mr-green:

Edite ton message et mets ton code entre les balises "code".
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

zoroastre

Bonjour,

Peux-tu nous dire quelles sont les étapes qui "sautent" ?

A priori, il est possible que certaines étapes ne se fassent pas correctement parce que les capteurs changent rapidement d'état.

C'est le cas par exemple des détecteurs de mouvement (PIR) qui peuvent réagir brusquement et plusieurs fois en quelques millisecondes. Ils passent donc de 1 à 0 par séquence et il suffit qu'au moment où ton programme analyse cette partie le détecteur soit à LOW pour que ta condition ne se réalise pas.

Pour corriger ces anomalies, je te conseille de passer par des variables mémoires qui enregistreront le changement d'état et que tu pourras réinitialiser au moment opportun.

Tu peux aussi t'inspirer de l'exemple Debounce fournit par l'IDE Arduino.

C'est pour l'instant ce qui me saute aux yeux.

@+

Zoroastre.
Gné! ;)

michel5650

Bonjour et merci pour la  réponse
La norme BBC est une maison basse consommation souvent une double flux qui donc maîtrise l air qui rentre dans la maison et récupère l énergie de l air vicié qui sort
les chatières du commerce ne sont pas étanche d ou le projet

Les détecteurs de présence utilise déjà une variable
le système est loin d être parfait exemple
le chat pointe sont nez devant la cellule la porte s ouvre mais il décide de ne pas sortir la porte reste ouverte
si je rajoute un delay pour fermer la porte après 30 secondes  le System s arrête le temps du delay
si entre temps le chat est passé il sera donc pas vu
il faudrait une temporisation avec le millis mais je sais pas faire
j envisage une autre platine Arduino uno qui gère les delay ?

Bonne journée
 


antoconde

tu peut utiliser les interruptions, avec un timer par exemple. Comme ça ton programme ne reste pas bloquée ;)
http://playground.arduino.cc/Code/Timer

zoroastre

Re.

.../...
Les détecteurs de présence utilise déjà une variable
.../...
Ce n'est pas ce que je lis dans ton programme. Tu fais régulièrement appel à des digitalRead() dans tes conditions alors que l'idéal serait de sauvegarder l'état du capteur pour pouvoir ensuite travailler avec sans risquer des bagotements/perturbations.

Code: [Select]
if ( digitalRead(detectpresence1)==HIGH || digitalRead(detectpresence2)==HIGH ) { (...) }
Code: [Select]
if (digitalRead(celluleI1)==LOW && digitalRead(led1)==LOW && dehors == 0){ (...) }
Code: [Select]
if (digitalRead(celluleI1) ...
Etc.

Tu n'as aucune garantie que ces capteurs restent constamment à l'état voulu au moment où tu les testes dans ton programme.

@+

Zoroastre.
Gné! ;)

michel5650

Bonsoir Zoroastre. d abord merci de m aider , je dois mal m y prendre
ce qui est fait :

  if ( digitalRead(detectpresence1)==HIGH || digitalRead(detectpresence2)==HIGH ) {
    presence1 =1; // memorise que le chat est dans le champ des detecteurs de presence

 presence1  est la variable je me sert de if mémoriser l info qui vient de un des 2 détecteurs de présence
 
comment j aurais du faire?

 

zoroastre

Yep!

Mon hypothèse est la suivante : tes capteurs de présence ne renvoie pas les infos au bon moment.

J'ai donc sorti un détecteur de présence (potar au mini) que j'ai relié à mon Atmega328, broche digitale 12. Je choisis d'incrémenter une variable counter pour comptabiliser le nombre de détection positive.

Code: [Select]

const byte PIR = 12;

unsigned long timer_1 = 0;

int counter = 0;

byte presence;

void setup()
{
  pinMode(PIR, INPUT);
  Serial.begin(9600);
  delay(100);
}

void loop()
{
  presence = digitalRead(PIR);
  
  //delay(10);
  
  if (presence == 1) { counter++; }  
  
  if (millis() - timer_1 > 1000) { Serial.print(presence); Serial.print(" | "); Serial.println(counter);  timer_1 = millis(); }
  
}



Dans mon cas, la variable counter lors d'une détection saute carrément des dizaines d'unité (à chaque cycle en fait) alors que l'on désire obtenir une incrémentation de +1 à chaque coup. Ce n'est pas le cas. En plus, la variable presence est souvent à zéro alors qu'elle devrait être plus régulièrement à 1. La synergie n'est pas parfaite.

Code: [Select]

0 | 0
0 | 0
1 | 56
0 | 79
0 | 111
0 | 111
1 | 124
1 | 173
0 | 214
0 | 214
0 | 214
0 | 214
0 | 214
1 | 246
0 | 277
0 | 277
0 | 277
0 | 309
0 | 309
...


L'ajout d'un delay() après la mesure permet de stabiliser le compteur (mesures ci-dessus) mais c'est loin d'être parfait.

Il serait interéssant que tu testes tes capteurs de cette manière. On s'attend naturellement à avoir une mesure stable, mais ce n'est pas forcément le cas. Chose que j'ai pu remarquer avec mes détecteurs de présence. J'en ai commandé d'autres d'ailleurs.

Le code que je propose est abérrant au fond, il montre simplement qu'il peut y avoir une différence entre la mesure instantanée et le sortie voulue.

Ton programme est plutôt cohérent sinon. Et je peux être aussi à côté de la plaque (je ne connais pas ton matos).

Toutefois, je t'enjoins à étudier ce lien : http://playground.arduino.cc/Code/PIRsense

@+

Zoroastre.
Gné! ;)

michel5650

Bonjour j utilise ce  capteur infrarouge C7288 il fournit un 5v pendant 0.5 seconde une détection franche aucun réglage sur la platine
j ai pas fait le teste que tu dit, le syteme est en place après quelque correction et rajouté une tempo avec la fonction millis en cas ou le chat déclenche un capteur et décide de ne pas passer
la fin de la tempo ferme la porte et revient a l étape précédente
je vous envois le code mais je sais pas faire avec la fonction fenêtre sur ce forum  afin que le code soit pas mélangé au message
michel5650

zoroastre

Yep!

Tu peux directement insérer ton code entre les balises
Code: [Select]
[code] [/code]

ou le distribuer en fichier joint.

[EDIT]
J'évoque principalement les détecteurs PIR car il est courant d'ajouter à ces capteurs une résistance de pull-up (10K) entre le signal de sortie et le +5v.

La raison est que le signal est dit "collecteur ouvert", c'est comme si la broche était relié à rien lorsqu'il n'y a pas de signal. Avec ce montage, quand un objet est détecté, la broche est relié à la masse. Le fil avec la resistance lorsqu'il n'y a pas de détection transmet +5v (HIGH) sur la pin digitale.

L'avantage de cette manière de procéder est que l'on évite les flottements de valeurs et les bascules parfois rapides HIGH/LOW sur la broche digitale.



Après, on peut trucher d'un point de vue logiciel mais il faudra forcément passer par une prise en compte des bascules et la seule possibilité est d'augmenter les delais entre les mesures.


@+

Zoroastre.
Gné! ;)

michel5650

Ok merci pour renseignement voila mon code

mon code passe pas directement  il est en fichier joint

bricoleau

Yep!
Tu peux directement insérer ton code entre les balises
Tu veux probablement dire qu'il faut insérer ton code entre une balise [code] et une balise [/code]

:smiley-twist:

Bon d'accord, j'ai quand même cherché un moment pour trouver comment on affiche un [code] dans un post sans qu'il soit interprété. Soluce en cliquant sur "Quote"...

zoroastre

Gné! ;)

michel5650

Le capteur de présence IR

http://www.gotronic.fr/art-capteur-infrarouge-c7288-11553.htm

Ce capteur  est très sensible il détecte le chat a 10 mètres je vais masqué un peu la lentille de Fresnel  pour diminuer la sensibilisée, 3 mètres serai bien c est une chatte peureuse trop près quand la porte s ouvre elle a peur, au début j avais un simple capteur cellule photo mais impossible il ne s approchait pas du system
Comment insérer une photo ici?
Bonne journée a tous

Go Up