état instable quand aucun contact

Bonsoir,

je voudrais savoir comment stabiliser les données récues quand aucun contact n'est fermé ?

j'ai activé le pullDOWN interne dans l'entrée 10 et pourtant ça bouge tout le temps .. Quand j'active le pull UP, il m'inverse les 0 par des 1...

voici le code :

//dans le setup ()
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    ....
    pinMode(9, OUTPUT);

    pinMode(10,INPUT);
    digitalWrite(1, LOW); //active la résistance interne de pull-up (évite la résistance suplémentaire)


//dans le loop()

      //pour e de 2 à  9
      digitalWrite(e, HIGH);
      res = digitalRead(e);
      Serial.print(res, DEC);
      digitalWrite(s, LOW);

Merci :)

En fait ce sont des résistances de pull up et non de pull down dans l'atmega :)

Il n'y a pas d'état pull up ou pull down, en entré, il y a un état pull up ou Z c'est a dire "fil en l'air". Du fait qu'il ne soit relié à rien, c'est n'imp :)

Donc il faut inverser la logique et mettre le commun à Vcc / +5

D.

Donc, il faut que je branche le commun sur la pin 2, et que je lise l'état entre les pin 10 et 17 ? avec le pullup activé sur ces broches ?

Je ne peux pas mettre le commun sur +5, puisqu'ensuite, j'ajouterai 7 autres pin "communes :( (de 3 à 9)

je fais une matrice de 8x8 contacts

vohu: Donc, il faut que je branche le commun sur la pin 2, et que je lise l'état entre les pin 10 et 17 ? avec le pullup activé sur ces broches ?

Je ne peux pas mettre le commun sur +5, puisqu'ensuite, j'ajouterai 7 autres pin "communes :( (de 3 à 9)

je fais une matrice de 8x8 contacts

Dans l'idée c'est ca, mais je ne vois pas sur ton schéma les pin 10 à 17. Pourquoi des diodes au fait ?

Pour ce type de montage, si c'est du scan que tu cherche à faire et que tu souhaite économiser les pins, tu peux utiliser deux 4051 :)

D.

Je l'ais pas mis parce que c'est la même chose 8 fois :$

Et vu que je faisais le test sur une seule entrée pour l'instant.

Bon, demain, j'inverse tout. j'espère que ça va marcher cette fois :$:$

Bon voilà... J'ai inversé.

Maintenant, le problème, c'est que lorsqu'il n'y a aucun contact fermé, il m'affiche "11111111", et quand j'en ferme un, j'ai bien le "01000000"

C'est très bizarre...

Etant donné qu'il n'y quasi aucune chance que les 8 soient actif en meme temps lors de l'utilisation, je vais bidouiller une ligne du genre si "11111111" alors "00000000" mais bon, c'est une bidouille :D

Ce sont des résistances de pull up donc la logique est inversé:

µC ----- switch ---- GND

Le µC ayant la résistance de pullup activé: - si le switch (à supposer que c'est un Normalement Ouvert) n'est pas activé, la pin est plus proche de 5v donc 1 (via la résistance de pull up) - si le switch est fermé, est alors plus proche du 0v donc 0.

Donc tu devrais avoir 11111111 si rien n'est activé et 11011111 si le 3ème l'est.

Le comportement erratique me fait dire que tu n'a pas activé la résistance de pull up interne :)

D.

bbs:

vohu: Donc, il faut que je branche le commun sur la pin 2, et que je lise l'état entre les pin 10 et 17 ? avec le pullup activé sur ces broches ?

Je ne peux pas mettre le commun sur +5, puisqu'ensuite, j'ajouterai 7 autres pin "communes :( (de 3 à 9)

je fais une matrice de 8x8 contacts

Dans l'idée c'est ca, mais je ne vois pas sur ton schéma les pin 10 à 17. Pourquoi des diodes au fait ?

Pour ce type de montage, si c'est du scan que tu cherche à faire et que tu souhaite économiser les pins, tu peux utiliser deux 4051 :)

D.

Je pense qu'il y a mal donne. Le commun c'est la broche 10 elle doit être en sortie Tu mets les broches 2 à 9 en entrée avec des pullup

Pour lire le clavier tu mets un 0 sur la ligne 10 et tu regardes l'état des touches sur 2 à 9

Pour les autres sections de clavier 11 à 17 tu fais la même chose. Il faut appliquer le 0 sur chacun des communs un seul à la fois.

Les diodes, elles permettent de ne pas être perturbé par les touches des autres octaves qui seraient appuyées au même moment. Tu peux donc avoir un clavier polyphonique.

voilà le code (le pull-up est bien activé)

je ne comprends pas la série de 1 avec les broches 2 et 7 reliées.

je devrais avoir 01000000000000000000000000000000 au lieu de 01000000111111111111111111111111

sortie :

configuration Serie : 6
configuration Serie : 7
configuration Serie : 8
configuration Serie : 9
configuration Serie : 10
configuration Serie : 11
configuration Serie : 12
configuration Serie : 13
configuration Entree : 2
configuration Entree : 3
configuration Entree : 4
configuration Entree : 5

nbr entrees : 4
nbr series : 8
debut series : 6
Nombre touches : 32
01000000111111111111111111111111

nbr entrees : 4
nbr series : 8
debut series : 6
Nombre touches : 32
01000000111111111111111111111111

nbr entrees : 4
nbr series : 8
debut series : 6
Nombre touches : 32
01000000111111111111111111111111

#include <string.h>
#include <stdlib.h>  //atoi()
//Constantes
#define NBR_ENTREE       4
#define DEBUT_ENTREE     2
#define FIN_ENTREE       (DEBUT_ENTREE + NBR_ENTREE) -1
#define NBR_SERIES       8
#define DEBUT_SERIES     FIN_ENTREE + 1
#define FIN_SERIES       (DEBUT_SERIES + NBR_SERIES) -1 
#define NBR_TOUCHES      NBR_ENTREE*NBR_SERIES

void setup() {
  int i = 0;
  Serial.begin(115200);
  // init sorties (séries)
  for (i=DEBUT_SERIES; i<=FIN_SERIES; i++)
  {
    Serial.print("configuration Serie : ");
    Serial.println(i, DEC);

    pinMode(i, OUTPUT);
    //digitalWrite(i, LOW);
  }
  // init entrées
  for (i=DEBUT_ENTREE; i<=FIN_ENTREE; i++)
  {
    Serial.print("configuration Entree : ");
    Serial.println(i, DEC);
    pinMode(i,INPUT);
    digitalWrite(i, HIGH); //active la résistance interne de pull-up (évite la résistance suplémentaire)
  }
  delay(500);
}


void loop(){

  int nEtat[NBR_TOUCHES] = {0};
  int oEtat[NBR_TOUCHES] = {0};
  
  Serial.print("\nnbr entrees : ");
  Serial.print(NBR_ENTREE, DEC);
  Serial.print("\nnbr series : ");
  Serial.print(NBR_SERIES, DEC);
  Serial.print("\ndebut series : ");
  Serial.print(DEBUT_SERIES , DEC);
  Serial.print("\nNombre touches : ");
  Serial.println(NBR_TOUCHES , DEC);

  lireEtat(nEtat, DEBUT_ENTREE , FIN_ENTREE , DEBUT_SERIES , FIN_SERIES);
  afficherEtat(nEtat, NBR_TOUCHES);
  delay(1000);
}


void lireEtat( int *etat, int eD, int  eF, int sD, int sF )
{
  int s = 0;
  int e = 0;
  int res = 0;
  int i = 0; //compte bits
  
  for (e=eD; e<=eF; e++)
  {
    for(s=sD; s<=sF; s++)
    {
      digitalWrite(s, HIGH);
      res = digitalRead(e);
      digitalWrite(s, LOW);
      etat[i] = res;
      i++;
    }
  }
  delay(100);
}


void afficherEtat( int *etat, int nbrMax)
{
  
  for (int i = 0; i <nbrMax; i++)
  {
    Serial.print(etat[i], DEC);
    //delay(200);
  }
    Serial.println("");
}

Ce que tu appelle séries c'est les sorties ?

Vu que les entrées par defaut devraient être à +5 grace au pull up, ne faut il pas que les sorties soient à +5 excepté celle que tu scan ?

Dans le setup, je pense que tu devrais digitalWrite(i, HIGH); et inverser les HIGH/LOW dans lireEtat.

Je peux aussi me gourer hein :)

D.

OKKKKK, avec ta solution BBS, j'ai bien quelque chose de cohérant..;

Je me retrouve bien avec le bon résultat, mai inversé.

J'ai plus qu'à inverser les 0 et les 1 dans mon tableau