Bonjour, je réalise une chatière aux normes BBC besoin d aide pour arduino

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

chatiere_9__tc.ino (8.57 KB)

// 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
}

C'est quoi la norme BBC ?

Barbecue ? :grin:

Edite ton message et mets ton code entre les balises "code".

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.

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

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

Re.

michel5650:
.../...
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.

if ( digitalRead(detectpresence1)==HIGH || digitalRead(detectpresence2)==HIGH ) { (...) }
if (digitalRead(celluleI1)==LOW && digitalRead(led1)==LOW && dehors == 0){ (...) }
 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.

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?

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.

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.

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 : Arduino Playground - PIRsense

@+

Zoroastre.

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

Yep!

Tu peux directement insérer ton code entre les balises
[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.

Ok merci pour renseignement voila mon code

mon code passe pas directement il est en fichier joint

chatiere_11_tc.ino (10.1 KB)

zoroastre:
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]

:smiling_imp:

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"...

Arf!

Merci Bricoleau. Je sus mais j'eu oublié :smiley:

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