Go Down

Topic: probléme de lecture d'un pin  (Read 800 times) previous topic - next topic

Alcar

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

dfgh

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

68tjs

#17
Jun 11, 2018, 02:18 pm Last Edit: Jun 11, 2018, 02:20 pm by 68tjs
Quote
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".

Alcar

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

Alcar

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
Code: [Select]


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



lesept

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
Code: [Select]
byte test = val1+val2+val3+val4+val5+val6;
if (test == 3) {  actions à faire }


Pour tester si seules les 1 à 3 sont cachées :
Code: [Select]
byte test1 = val1+val2+val3;
byte test2 = val4+val5+val6;
if (test1 == 3 && test2 == 0) digitalWrite(8,HIGH);
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Alcar

#21
Jun 14, 2018, 10:54 am Last Edit: Jun 14, 2018, 10:55 am by Alcar
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?



Code: [Select]


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



}

Alcar

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

lesept

#23
Jun 14, 2018, 12:11 pm Last Edit: Jun 14, 2018, 12:13 pm by lesept
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... :)

EDIT : on s'est croisé...

Tu peux encore simplifier le programme comme suit :
Code: [Select]
if (val1+val2+val3 == 3 && val4+val5+val6 == 0) digitalWrite(8,HIGH);
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Alcar

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
Code: [Select]
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;
      }
    }
  }
}

 

dfgh

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

dfgh

 :) j'ai oublié ton prg
Code: [Select]
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
    }
  }
}

Alcar

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.


dfgh


Alcar

pour le moment je fait avec un fil que je connecte au GND pour le 10 et un autre fil que je connecte 5v pour le 11
même quand les fils ne sont pas branche sur la carte, le programme se lance.

Go Up