probléme de lecture d'un pin

Est-ce que tu peux tester en utilisant une autre broche que la 10 ?

La broche 10 est reliée à la LED RX, va une résistance 10k. Peut-être est-elle plus sensible qu'une autre et que le fil que tu insères agit comme une antenne ?

veux tu tester ce code, attention il ne fonctionnera qu'une fois

const byte pinMoteur = 4;
const byte pinSon = 6;
const byte pinVentouse = 8;
boolean ouverturePorte;
const byte pinAction = 10;
int val = 0;
void setup()
{
  // état des ports
  pinMode(pinMoteur, OUTPUT);
  pinMode(pinSon, OUTPUT);
  pinMode(pinVentouse, OUTPUT);
  pinMode(pinAction, INPUT_PULLUP);//il faudra mettre ton fil sur GND pour ouvrir
  //mise à zéro
  digitalWrite(pinSon, LOW);
  digitalWrite(pinMoteur, LOW);
  digitalWrite(pinVentouse, LOW);
  ouverturePorte = true;
}
void loop()
{
  val = digitalRead(pinAction);
  if (val == LOW)
  {
    digitalWrite(pinSon, HIGH);
    delay(3000);
    digitalWrite(pinSon, HIGH);
    digitalWrite(pinMoteur, HIGH);
    delay(4000);
    digitalWrite(pinMoteur, LOW);
    digitalWrite(pinVentouse, HIGH);
    delay(3000);
    digitalWrite(pinSon, LOW);
    digitalWrite(pinMoteur, LOW);
    digitalWrite(pinVentouse, LOW);
  }
}

dfgh:
veux tu tester ce code, attention il ne fonctionnera qu'une fois

Pourquoi ? Il s'autodétruit après ?

Alors,
j'ai mis les sorties sur les pins 2, 4, 6 pour être sur la première série de pins
j'ai essayé l 'entré sur le 10, 11, 13, A2, A5
ah, quand je touche les soudures des pins (au dos de la carte) le programme démarre

deuxiéme essais
les sorties en 8, 10, 12
et l'entrée en 4
idem des que je mets un fil dans le 4 le programme demarre

j'y comprend rien???

J'ai simplifié et reproduit le montage, avec juste la pin 10 et la LED du nano pour montrer que le test est vérifié. Le code :

int pinAction = 10;
int val = 0;
boolean ouverturePorte = true;

void setup() {
  //initialisation des ports
  pinMode(pinAction, INPUT);
  digitalWrite(pinAction, LOW);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  delay (2000);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
  val = digitalRead(pinAction);
  if (val == 1)
  {
    if (ouverturePorte)
    {
      digitalWrite(LED_BUILTIN, HIGH);
      ouverturePorte = false;
    }
  }
}

La LED s'allume 2 secondes (c'est pour voir de quelle LED il s'agit) puis lorsque j'insère un fil métallique dans le trou de ma breadboard branché sur la broche 10, la LED s'allume.

Maintenant si je commente la ligne
  digitalWrite(pinAction, LOW);tout rentre dans l'ordre. Il ne doit pas aimer un digitalWrite sur un port déclaré en OUTPUT...

Voilà !

@ le sept
je me suis mal exprimé, je parlais du prg d'origine de notre ami
il initialise un boolean à true
puis dans la boucle, si la condition est confirmée, et si le boolean est true, il exécute sa fonction d'ouverture et passe le boolean à false .
la fois suivante, le boolean est false et il ne peut plus exécuter sa fonction d'ouverture
le code d'origine en simplifié

boolean ouverturePorte = true;
setup(){}
void loop() {

  val = digitalRead(pinAction);
  if (val == 1)
    if (ouverturePorte)
    {
      digitalWrite(pinSon, HIGH);
      delay(3000);
      //etc....
      ouverturePorte = false;
    }
}

bonjours à tous,
j'ai essayé toutes vos solutions et voila ce qui marche à la perfection, sachant que si le signal en entrée est continu (reste branché) le programme ne doit s'exécuter qu'une seule fois.
en fait c'est pour un jeux. les enfants doivent trouver 3 objets qui une fois posés sur le bon emplacement laisse passer le - (là le GND, sur mon premier essais c'était le +, mais c'est pas important) , pour déclencher: un son, un moteur qui fait bouger plein de petits trucs et enfin ouvre une porte. le programme ne doit pas redémarrer au début une fois exécuté, pour le remettre à zéro il faut faire un reset.
j'ai remis, dans le code proposé par "DFGH", la fonction ouverturePorte et .... TOUT MARCHE
Maintenant il faut que je digère ce code pour comprendre....

sinon le branchement est assez simple
3 relais alimentés par la carte, et piloté par les pins 4, 6, 8, chaque relais active une fonction.
le pin 10 est relié au GND en passant par des interrupteurs ILS qui se ferment quand on pose les objets dessus (ils sont pourvus d'un aimant), ce qui démarre le programme.

j'espère que c'est clair????

Merci à tous,
BON, à la rentrée je m'inscris au FABLAB qui est pas loin de chez moi pour prendre des cours d'ARDINIO.

encore un grand MERCI

const byte pinMoteur = 4;
const byte pinSon = 6;
const byte pinVentouse = 8;
boolean ouverturePorte;
const byte pinAction = 10;
int val = 0;
void setup()
{
  // état des ports
  pinMode(pinMoteur, OUTPUT);
  pinMode(pinSon, OUTPUT);
  pinMode(pinVentouse, OUTPUT);
  pinMode(pinAction, INPUT_PULLUP);//il faudra mettre ton fil sur GND pour ouvrir
  //mise à zéro
  digitalWrite(pinSon, LOW);
  digitalWrite(pinMoteur, LOW);
  digitalWrite(pinVentouse, LOW);
  ouverturePorte = true;
}
void loop()
{
  val = digitalRead(pinAction);
  if (val == LOW)
  {
    if (ouverturePorte)
    {
    digitalWrite(pinSon, HIGH);
    delay(3000);
    digitalWrite(pinSon, HIGH);
    digitalWrite(pinMoteur, HIGH);
    delay(4000);
    digitalWrite(pinMoteur, LOW);
    digitalWrite(pinVentouse, HIGH);
    delay(3000);
    digitalWrite(pinSon, LOW);
    digitalWrite(pinMoteur, LOW);
    digitalWrite(pinVentouse, LOW);
    {
      ouverturePorte = false;
    }
  }
}
}

bonjour,
j’essaie de comprendre quel est l'effet de la déclaration const byte des pins 4,6,8,10 ???? par rapport à la déclaration en variable, sur le comportement de la carte. (pour rappel, le fait de mettre un fil non connecté sur le pin 10, déclenché le programme).

cela veut dire que l'on a des constantes qui peuvent prendre une valeur de 0 à 255 au lieu d'avoir des variables et donc qui ne changent pas de valeur, elles sont déclarées en sortie pour les 3 premières et en entrée pour la 4ème.

OU c'est le fait de mettre un PULLUP qui change la sensibilité d'entrée qui attend une tension négative au lieu d'une tension positive, qui permet de supprimer le problème????

belle journée

ton fil en l'air se comporte comme une antenne, un capteur.
en principe, sur un circuit intégré, on ne laisse pas une entrée "en l'air", si non connectée, on lui fixe un potentiel, soit la masse soit VCC. cela évite des surprises, des comportements non prévus.

c'est l'effet que tu obtiens en mettant les pullup en service. tes résistances de pullup mettent l'entrée à VCC

j'essaie de comprendre quel est l'effet de la déclaration const byte des pins 4,6,8,10 ???? par rapport à la déclaration en variable,

Ces petits détails sans importance apparente sont importants avec une machine qui n'a que très peu de place mémoire.
Une variable est stockée dans la RAM qui n'est pas bien grande. En plus avec le compilateur avr-gcc un integer occupe 2 octets ce qui est du gâchis quand un microcontrôleur ne dispose pas de plus de 255 pins.

Le fait de déclarer en byte (soit 1 octet en français) fait déjà une première optimisation.
Ensuite si le compilateur sait que le contenu ne changera pas (mot clé "const") il se livrera de lui même a des optimisations comme ne pas utiliser la ram pour la variable qui ne varie pas mais la flash.
Un compilateur est quelque chose de plus complexe qu'un simple moteur qui transforme du code en langage machine, on parle beaucoup en ce moment d'intelligence artificielle cela en est un exemple.

Des fois on ne veux pas que le compilateur optimise, le mot clé qui interdit au compilateur de se livrer à des optimisations est "volatil".

merci pour ces explications qui me permettent d'avancer
bonne journée.

bonsoir
excusez moi si je profite, mais un qui sais, vaux mieux que mille qui cherchent,
voilà je continue mon apprentissage sur des pb qui me semble simple, mai qui une fois devant la page blanche sont plus compliqué.
alors on a 6 cellules photo électrique sans retard, quand on met la main devant, elles s’enclenchent et quand on enlève la main elles s'éteignent.
donc 6 pin déclarées
et 1 pinRelais
quand on en cache 3 des cellules (123) et que les 3 autres sont libres le signal dans la PIN 8 doit allumer le relais, et uniquement dans ce cas.
toutes les autres combinaisons ne doivent pas, en aucun cas, allumer le relais.
voila mon code, qui marche, mais sans fiabilité.
doit je employer une autre condition que if et Else

const byte inputPin1 = 2;               // entrées pour cellules
const byte inputPin2 = 3;
const byte inputPin3 = 4;
const byte inputPin4 = 5;
const byte inputPin5 = 6;
const byte inputPin6 = 7;
int relayPin = 8;
// commençons avec aucun mouvement detecté
//etat du relais
boolean val1 = 0;                    // variable pour lire l'état des broches
boolean val2 = 0;
boolean val3 = 0;
boolean val4 = 0;
boolean val5 = 0;
boolean val6 = 0;
                     

void setup() {

  pinMode(relayPin, OUTPUT);  //declare l epin relais en sortie
  pinMode(inputPin1, INPUT);     // declare les pins des cranes en entrée
  pinMode(inputPin2, INPUT);
  pinMode(inputPin3, INPUT);
  pinMode(inputPin4, INPUT);
  pinMode(inputPin5, INPUT);
  pinMode(inputPin6, INPUT);

}

void loop() {
  val1 = digitalRead(inputPin1);  // lire l'état des broches
  val2 = digitalRead(inputPin2);
  val3 = digitalRead(inputPin3);
  val4 = digitalRead(inputPin4);
  val5 = digitalRead(inputPin5);
  val6 = digitalRead(inputPin6);

  digitalWrite (relayPin, LOW);

  if (val1 == true && val2 == true && val3== true && val4== false && val5 == false && val6 == false)
 
      
      
     { digitalWrite (relayPin, HIGH); }
     
        else

        {

          digitalWrite (relayPin, LOW);

merci d'avance pour vos conseils qui me permettent d'avancer

Les variables val1 à val6 valent 0 ou 1 selon qu'elles sont LOW ou HIGH : tu peux le vérifier en les affichant sur la console. Même si les puristes n'aiment pas ça, tu peux faire des calculs avec.

Pour tester si 3 cellules sont masquées, n'importe lesquelles, tu peux faire

byte test = val1+val2+val3+val4+val5+val6;
if (test == 3) {  actions à faire }

Pour tester si seules les 1 à 3 sont cachées :

byte test1 = val1+val2+val3;
byte test2 = val4+val5+val6;
if (test1 == 3 && test2 == 0) digitalWrite(8,HIGH);

Merci je vais essayer çà.

mon premier programme ressemblait à çà et qui a marché jusqu’à la déclaration de 4 conditions "if" successives et au delà j'ai un message d'erreur???

Warning: suggest explicit braces to avoid ambigous 'else' [wparentheses] if (val5 == 0)
j'ai pas compris, mais cela vient il sans doute du nombre important de if successifs?

const byte inputPin1 = 2;               // entrées 
const byte inputPin2 = 3;
const byte inputPin3 = 4;
const byte inputPin4 = 5;
const byte inputPin5 = 6;
const byte inputPin6 = 7;
const byte relayPin = 8;
// commençons avec aucun mouvement detecté
//etat du relais
boolean val1 = 0;                    // variable pour lire l'état des broches
boolean val2 = 0;
boolean val3 = 0;
boolean val4 = 0;
boolean val5 = 0;
boolean val6 = 0;


void setup() {
       // declare LED as en sortie
  pinMode(relayPin, OUTPUT);  //declare l epin relais en sortie
  pinMode(inputPin1, INPUT);     // declare les pins des cranes en entrée
  pinMode(inputPin2, INPUT);
  pinMode(inputPin3, INPUT);
  pinMode(inputPin4, INPUT);
  pinMode(inputPin5, INPUT);
  pinMode(inputPin6, INPUT);


}

void loop() {
  val1 = digitalRead(inputPin1);  // lire l'état des broches
  val2 = digitalRead(inputPin2);
  val3 = digitalRead(inputPin3);
  val4 = digitalRead(inputPin4);
  val5 = digitalRead(inputPin5);
  val6 = digitalRead(inputPin6);

  digitalWrite (relayPin, LOW);

  if (val1 == 1 )
    if (val2 == 1)
      if (val3 == 1)
        if (val4 == 0)
          if (val5 == 0)
            if (val6 == 0)

           { digitalWrite (relayPin, HIGH);}

            
            
            else
            
            {

              digitalWrite (relayPin, LOW);
            }



}

merci LESEPT
tout à l'air de fonctionner normalement
c'est un bon apprentissage, j'avais pas pensé faire le système des tests, je vais approfondir cela ....
encore merci

C'est un warning, pas une erreur : ça n’empêche pas la compilation ni l'exécution. Le compilateur te demande de mettre des accolades dans tes if pour éviter toute ambiguïté. Le plus simple est de tester ce que je te propose, qui n'est pas ambigu. Le compilateur devrait apprécier... :slight_smile:

EDIT : on s'est croisé...

Tu peux encore simplifier le programme comme suit :

if (val1+val2+val3 == 3 && val4+val5+val6 == 0) digitalWrite(8,HIGH);

pour améliorer mon programme je voulais pouvoir le lancer à partir d'un bouton initialiser sur un autre pin
le 11,
j'ai essayé de mettre deux conditions dans le if , soit le pin 10 reçoit un signal, soit j'appuie sur un bouton qui est branché sur le pin 11 pour lancer le programme.
j'ai essayé plien de trucs mais rein ne fonctionne.
soit le programme se lance quand le signal arrive sur le pin 10 mais rien ne se pas si j'envois du 5v sur le 11
soit le programme demarre tout seul.

voila mon programme avec la condition OU

const byte pinLumier = 4;
const byte pinSon = 6;
const byte pinVentouse = 8;
boolean ouverturePorte;
const byte pinAction = 10;
const byte pinBouton = 11;
int val = 0;
int val1 = 0;
void setup()
{
  // état des ports
  pinMode(pinLumier, OUTPUT);
  pinMode(pinSon, OUTPUT);
  pinMode(pinVentouse, OUTPUT);
  pinMode(pinAction, INPUT_PULLUP);// fil sur GND pour ouvrir
  //mise à zéro
  digitalWrite(pinSon, LOW);
  digitalWrite(pinLumier, LOW);
  digitalWrite(pinVentouse, LOW);
  ouverturePorte = true;
}
void loop()
{
  val = digitalRead(pinAction);
   val1 = digitalRead(pinBouton); 
  if (val == LOW || val1 == HIGH)
  {
    if (ouverturePorte)
    {
      digitalWrite(pinSon, HIGH);
      delay(5000);
      digitalWrite(pinVentouse, HIGH);
      delay (2500);
      digitalWrite(pinLumier, HIGH);
      delay(30000);
      digitalWrite(pinSon, LOW);
      digitalWrite(pinLumier, LOW);
      digitalWrite(pinVentouse, LOW);
      {
        ouverturePorte = false;
      }
    }
  }
}

hello
ton prg ci joint avec des commentaires
il est perturbé par les rebonds sur 10 ou 11
il manquait un pinMode
et ta mise à false du flag ouvertureporte n'autorise qu'un seul mouvement de la porte.
après ce mouvement, il faudra razer le prg pour que le flag soit à nouveau initialisé à true

:slight_smile: j'ai oublié ton prg

const byte pinLumier = 4;
const byte pinSon = 6;
const byte pinVentouse = 8;
boolean ouverturePorte;
const byte pinAction = 10;
const byte pinBouton = 11;//init si ==high donc cablé a l'inverse de pinAction
int val = 0;
int val1 = 0;
void setup()
{
  // état des ports
  pinMode(pinLumier, OUTPUT);
  pinMode(pinSon, OUTPUT);
  pinMode(pinVentouse, OUTPUT);
  pinMode(pinAction, INPUT_PULLUP);// fil sur GND pour ouvrir (validé par contact avec GND)
  pinMode(pinBouton, INPUT);//il manquait cette déclaration   (validé par contact avec VCC)
  //mise à zéro
  digitalWrite(pinSon, LOW);
  digitalWrite(pinLumier, LOW);
  digitalWrite(pinVentouse, LOW);
  ouverturePorte = true;
}
void loop()
{
    val = digitalRead(pinAction);// 10 inputpullup
   val1 = digitalRead(pinBouton);// 11 init input
   delay(200);//on laisse le temps aux rebonds de disparaitre
  if (val == LOW || val1 == HIGH)
  {
    if (ouverturePorte)//le flag ne sera true qu'une seule fois
    {
      digitalWrite(pinSon, HIGH);
      delay(5000);
      digitalWrite(pinVentouse, HIGH);
      delay (2500);
      digitalWrite(pinLumier, HIGH);
      delay(30000);
      digitalWrite(pinSon, LOW);
      digitalWrite(pinLumier, LOW);
      digitalWrite(pinVentouse, LOW);
      {//accolade inutile ou mal placée
        ouverturePorte = false;//ici, tu interdit à la porte de bouger une deuxième fois
      }//accolade inutile ou mal placée
    }
  }
}

merci pour ton aide,
je me suis aperçu après avoir posté que j'avais oublié la ligne sur le pin 11,
pour la porte je ne veut effectivement qu'elle ne s'ouvre qu'un fois, pour la relancer je met un autre bouton sur le reset de la carte avec le GND... je ne sais pas si c'est très académique mais ça marche?
par contre dés que je téléverse le programme il se lance toujours tout sans avoir reçu de signal,idem quand je fais un reset.