Clavier 4x4 - PCF8574

Bonjour, je viens vous demandez de l'aide car je n'en peut plus de cette puce PCF8574. Peut importe le code je teste rien ne s'affiche dans la console quand appui sur le clavier.

Voila pour le câblage:

Je sais que le clavier fonctionne que je les testé en direct sans passé par la puce PCF8574 avec ce code:

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char key = keypad.getKey();
  
  if (key){
    Serial.println(key);
  }
}

Le code avec le module PCF8574:

#include <Wire.h>

#define PCF8574_ADDR 0x20

void setup() {
  Serial.begin(9600);
  Wire.begin();
}

void loop() {
  char key = getKey();
  
  if (key != 0) {
    Serial.println("Touche appuyée : " + String(key));
    delay(500); // Attendez un court instant pour éviter les rebonds
  }
}

char getKey() {
  Wire.requestFrom(PCF8574_ADDR, 1);

  if (Wire.available()) {
    byte val = Wire.read();
    
    for (int i = 0; i < 16; i++) {
      if ((val & (1 << i)) == 0) {
        return getChar(i);
      }
    }
  }
  return 0;
}

char getChar(int index) {
  // Vous pouvez personnaliser cette fonction pour attribuer des caractères aux différentes touches
  char keys[16] = {
    '1', '2', '3', 'A',
    '4', '5', '6', 'B',
    '7', '8', '9', 'C',
    '*', '0', '#', 'D'
  };
  
  return keys[index];
}

J'ai voulu voir ce qui sortait du module PCF8574 avec ce code:

#include <Wire.h>

#define PCF8574_ADDR 0x20

void setup() {
  Serial.begin(9600);
  Wire.begin();
}

void loop() {
  byte portState = readPCF8574();
  
  Serial.print("État du port PCF8574: ");
  Serial.println(portState, BIN);

  delay(1000); // Ajoutez un délai si nécessaire pour éviter une lecture trop fréquente
}

byte readPCF8574() {
  Wire.requestFrom(PCF8574_ADDR, 1);

  if (Wire.available()) {
    return Wire.read();
  }

  return 0;
}

La réponse: 11111111 que l'appui ou pas

Je comprend pas pourquoi sa donne rien

Merci par avance

avez vous lu la doc du PCF8574 ???
avez vous lu le code de la bibliothèque Keypad pour voir comment on lit une matrice de bouton?

(sinon allez voir GitHub - RobTillaart/I2CKeyPad: Arduino libray for 4x4 (or smaller) KeyPad connected to an I2C PCF8574)

Non je me suis servie de ce que j'ai trouvé sur différent site

l'informatique et l'électronique ce n'est pas de la magie... faut lire les docs...

sinon allez regarder GitHub - RobTillaart/I2CKeyPad: Arduino libray for 4x4 (or smaller) KeyPad connected to an I2C PCF8574

Sur la librairie, il y a pas exemple avec 4x4

il suffit de lire la doc du GitHub et utiliser

setKeyPadMode(I2C_KEYPAD_4x4);
char normal_keymap[19]  = "123A456B789C*0#DNF";

Oui je les lu et j'ai bien vue cette partie et je sais toujours pas quoi en faire

cet exemple est en 4x4

Oui sa marche, c'est quand même pas simple pour un simple clavier et une puce.

Merci de votre aide

est-ce que vous comprenez comment fonctionne ce genre de clavier à membrane et ce qu'il faut faire pour les lire ?

C'est ce genre de clavier que j'utilise.

C’est similaire, penchez vous sur la question. Vous verrez qu’il faut faire un peu de gymnastique pour lire la matrice et que ce n’est pas comme un simple bouton en INPUT_PULLUP

Oui je confirme, je me pence que le problème et je me fait un code perso pour comprendre.

Voila ce que sa donne sans la puce PCF8574.

int R1 = 2;
int R2 = 3;
int R3 = 4;
int R4 = 5;
int C1 = 6;
int C2 = 7;
int C3 = 8;
int C4 = 9;

const byte n_ligne = 4;
const byte n_colonne = 4;
char tableau[n_ligne][n_colonne] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte Pin_ligne[n_ligne] = {R1, R2, R3, R4};
byte Pin_colonne[n_colonne] = {C1, C2, C3, C4};

void setup()
{
  Serial.begin(9600);

  for (int i = 0; i < n_ligne; i++)
  {
    pinMode(Pin_ligne[i], INPUT_PULLUP);
  }

  for (int i = 0; i < n_colonne; i++)
  {
    pinMode(Pin_colonne[i], OUTPUT);
    digitalWrite(Pin_colonne[i], HIGH);
  }
}

void loop()
{
  for (int colonne = 0; colonne < n_colonne; colonne++)
  {
    digitalWrite(Pin_colonne[colonne], LOW);

    for (int ligne = 0; ligne < n_ligne; ligne++)
    {
      int button = digitalRead(Pin_ligne[ligne]);

      if (button == LOW)
      {
        Serial.print("Touche appuyée : ");
        Serial.println(tableau[ligne][colonne]);
        delay(800);
      }
    }
    digitalWrite(Pin_colonne[colonne], HIGH);
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.