probléme de lecture d'un pin

voila mon programme (c’est le deuxième)
quand j’allume ma carte UNO rien ne se passe, ce qui est normal, puisque le programme attend un signal dans l’entrée 10 pour démarrer.
si j’envoi un signal; le programme s’exécute correctement
la carte
puis la carte son et un moteur
puis le moteur s’arrête
la ventouse s’arrête et la porte s’ouvre.
et le programme s’arrête.
chaque élément est commandé par une carte relais: donc trois relais

mon problème est que dés que je met un fil dans la borne 10 (relié à rien du tout) le programme démarre. je pensais quand dessous de 1volt la carte considérée que l’entrée était à zéro.
le probléme vient: de la carte??
du programme
ou du montage , j’ai essayé de rajouter une résistance de 220 ohm à la sortie avant de mettre le fil, dés que j’enfonce un coté de la résistance dans la pin 10 le programme démarre, j’ai éssaye avec un entrée analogique même pb
à l’aide

int pinMoteur = 4;
int pinSon = 6;
int pinVentouse =8;
boolean ouverturePorte;
int pinAction;
int val = 0;
void setup() {
 //initialisation des ports
 pinMoteur = 4;
 pinSon = 6;
 pinVentouse = 8;
 pinAction = 10;

 // état des ports
 pinMode(pinMoteur, OUTPUT);
 pinMode(pinSon, OUTPUT);
 pinMode(pinVentouse, OUTPUT);
 pinMode(pinAction, INPUT);
 //mise à zéro
 digitalWrite(pinSon, LOW);
 digitalWrite(pinMoteur, LOW);
 digitalWrite(pinVentouse, LOW);
 digitalWrite(pinAction, LOW);
 ouverturePorte = true;
}
void loop() {
   
     val = digitalRead(pinAction);
     if (val ==1)



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

 }

}

Et comme ça ?

void loop() {
  val = digitalRead(pinAction);
  if (val == 1) {  // <-- ajout d'une accolade
    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;
      }
    }
  } // <--- fermeture
}

bonjour,

bonjour, merci, code entre balise code </>

merci pour votre aide.

bon toujours pareil, j'ai essayé avec une autre carte et c'est pareil????

hello

merci de lire ceci et de corriger ton premier post

ok
excusez moi
cordialement

merci :slight_smile:

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);