Difficultés d'intégration code I2C_KEYPAD au code d'un système d'alarme

Bonjour à tous je sollicite votre aide pour un problème d’intégration de code d’un KEYPAD raccordé en I2C sur un système d’alarme Arduino qui fonctionne sans l’intégration de ce code. Je tiens absolument à l’intégrer pour un problème de fil. En effet suite à l’I2C je passerai de 16 fils à 8 fils. Sachez aussi que le code I2C du keypad fonctionne j’ai simplement repris quelques lignes de l’exemple de la librairie et j’ai testé c’est OK.
Le code est en attaché.
Le message d’erreur vient de la ligne 372 “switch (keypad.getState()){” mais aussi certainement des lignes:

-78 Keypad_I2C customkeypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR);

-79 :// old declaration ==> Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
Sur la ligne 79 c’est le code d’origine avant intégration et tout fonctionnait.

Merci d’avance pour votre aide.

Alarmmamaison_defaut_I2Ckeypad-forum.h (17 KB)

Il suffit de renommer ton instance customKeypad en keypad.

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

@+

Merci j’ai fait le test du sketch sans matériel et je n’ai plus d’erreur ce soir je teste avec matériel.
A bientôt pour le suivi.

suspense ...

Malheureusement ça ne fonctionne pas, j'introduis des chiffres qui sont vu pcq je vois des étoiles sur l'afficheur. Dans ce cas c'est 4x1 mais quand je valide avec la touche # rien... Je pense que l'erreur vient du fait que le code d'origine c'est:

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

et le nouveau code:

Keypad_I2C keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR);

ne sont pas concordant dans le code d'origine il répète Keypad keypad une fois avec K majuscule et une fois avec minuscule pour terminer une égalité et une majuscule du K. Je pense que cela a toute son importance mais comment convertir cela correctement pour l'I2C?? merci pour votre aide.

Lorsqu'on utilise une bibliothèque, les fonctions sont regroupées dans une classe. Cette classe a une fonction spécifique qui est appelée constructeur utilisée pour créer une instance de la classe (et passer les paramètres si nécessaire) Le constructeur porte le même nom que la classe, ici Keypad_I2C

Pour utiliser la bibliothèque il faut créer une instance : Appel à la classe suivi du nom de l'instance, ici keypad, un signe = et ensuite l'appel au constructeur.

Ce qui donne comme l'a indiqué hbachetti :

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

Merci mais ça ne fonctionne pas quelque chose m'échappe? Bien sûr plus aucune erreur mais en pratique dès que le code est installé et Arduino MEGA lancé j'ai déjà une étoile qui apparait ensuite quand je tape le code je ne sais rien valider avec la touche #. Merci pour votre aide

Tu as remplacé :

Keypad_I2C keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR);

par :

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

?

Probablement une question de mapping des touches.

Je ne comprends pas : dans ton topic précédent tu avais réussi à faire fonctionner ce clavier. Pourquoi ne repars-tu pas du même code ?

// le mapping de ton topic précédent :
char hexaKeys[ROWS][COLS] = {
  {'1','4','7','*'},
  {'2','5','8','0'},
  {'3','6','9','#'},
  {'A','B','C','D'}
};

// l'actuel :
char keys[ROWS][COLS] = { // ici j'ai enleve le hexa de keys
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

// ce qui est très différent

Dans ta fonction keypadEvent essaie d'afficher le code touche dans la console avec Serial.println()

    case PRESSED:
        Serial.print("touche appuyée: ");
        Serial.println(eKey);
        ....

@+

Bonjour voilà j’ai placé le code tel qu’il fonctionne dans mon test keypad I2C qui fonctionne.
Si je place cette déclaration Keypad_I2C keypad = Keypad_I2C( makeKeymap(Keys), rowPins, colPins, ROWS, COLS, I2CADDR );
J’ai aussi placé:
case PRESSED:
Serial.print("touche appuyée: ");
Serial.println(eKey);

Je n’ai pas de message d’erreur et au démarrage la console affiche "SIM900 ready…touche appuyée: 1
" puis si je tape une touche du clavier rien ne s’affiche dans la console et aucune étoile sur le LCD.

Même résultat si je choisi cette déclaration Keypad_I2C keypad( makeKeymap(Keys), rowPins, colPins, ROWS, COLS, I2CADDR);

Et enfin j’ai constaté que si je bouge mon boitier contenant LCD et keypad il m’affiche des touches enfoncées et sur la console et sur le LCD. J’ai probablement des mauvais contacts bizarre j’ai placé de nouveaux fils et c’est pareille. Par contre si je rentre l’ancien code sans I2Ckeypad tout fonctionne correctement??? Je rame ;).
J’ai joins le code sans I2Ckeypad fonctionnant et l’autre avec I2Ckeypad ne fonctionnant pas.
Merci pour votre aide

Alarmmamaison_OK_millis.h (16.7 KB)

Alarmmamaison_OK_millis_I2Ckeypad-forum.h (16.6 KB)

La question était :

Je ne comprends pas : dans ton topic précédent tu avais réussi à faire fonctionner ce clavier.

Oui ou non ?

Teste d'abord ton clavier en I2C avec le sketch d'exemple de la bibliothèque CustomKeypad_I2C

|328x500

1 à 4 sont les lignes 5 à 8 sont les colonnes

Le tout doit être raccordé au PCF8574 dans l'ordre 1 à 8 sur P0 à P7

Respecte ton mapping d'origine :

char keys[ROWS][COLS] = { 
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

Les déclarations pour le constructeur seront :

byte rowPins[ROWS] = {0, 1, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6, 7}; //connect to the column pinouts of the keypad

Merci pour le petit rappel de Jeanbondyork sur le brochage du keypad ce n’est pas la première fois que j’en utilise un, mais une erreur est toujours possible, j’ai donc recontrôlé et tout est correct

Oui j’avais réussi à faire fonctionner mon clavier en utilisant simplement le code test de la librairie #include <Keypad_I2C.h> MAIS pour un fonctionnement correct j’avais du modifier l’ordre des touches pcq par exemple quand j’appuyais sur 1 j’avais 0 Mais quand j’ai terminé mes modifications tout fonctionnait correctement.

Je suis donc reparti de là comme vous me l’avez judicieusement suggéré Hbachetti d’où mon post précédent (l’avant dernier).
Bien sûr j’ai à nouveau testé le code test de la librairie Keypad_I2C.h (customkeypadI2C) avec l’ordre des touches modifié et ça fonctionne sans modification de câblage en passant de mon code d’alarme au code test.

Ma surprise vient du fait que quand je rentre le code sans I2C tout fonctionne correctement . C’est pour ça que j’ai placé en attaché les 2 codes avec et sans I2C dans mon avant dernier post.
Je dois faire une précision que j’ai mentionné tout au début de ce topic je suis sous Arduino MEGA et pas UNO. Il y a peut être l’une ou l’autre spécificité de code différent d’un module à l’autre? Mais personnellement je n’ai rien trouvé sur le net.

Merci pour votre aide.

OK. Sur la MEGA L'I2C est sur 20 (SDA) et 21 (SCL). J'ai sous les yeux un montage avec des modules INA226 câblé ainsi et cela fonctionne.

@+

Merci déjà un soucis en moins :)

Tu avais laissé SDA et SCL sur A4 A5 comme sur une NANO ou UNO ? Et sinon, ça roule maintenant ?

Merci de venir au nouvelle hbachetti non ça ne fonctionne pas j’ai encore fait pas mal de recherche et d’essais mais hélas sans succès.

Sur ma carte MEGA il y a déjà une connexion SDA et SCL donc pas de raccordement A4 et A5.

Pour faire court je joins 2 fichiers un (code fonctionne) et un (code keypad fonctionne pas). les 2 fichiers ont été injecté tel quel sur la même carte MEGA avec les mêmes raccordements.

je ne sais plus ce qu’il faut faire.

Et le LCD fonctionne dans les 2 fichiers

Merci d’avance pour votre aide.

code fonctionne.h (1.82 KB)

code keypad fonctionne pas .h (17.2 KB)

A toute fin utile avec le code Keypad_I2C  keypad = Keypad_I2C( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR ); Sur la console serie j'ai: SIM900 ready...[u]touche appuyée: 1[/u]

J'ai bien une étoile affichée sur le LCD comme si j'avais bien appuyé sur la touche 1 alors que je n'ai appuyé sur aucune touche.

Mais si j'appuie ensuite sur une touche rien ne se passe?? Merci pour votre aide

Salut.

J'ai lu ce code avec un peu plus d'attention. Quelque chose me choque :

const int led = 44;
const int ledPin = 44;

Un peu dommage d'utiliser la pin 44 pour une LED car elle est réservée à l'I2C (SDA). Voir ICI.

Il va falloir choisir une autre broche pour cette LED.

@+

Merci par acquis de conscience j’ai placé ledPin sur 52 mais ça ne change rien.

J’ai toujours la même chose sur la console:

SIM900 ready…touche appuyée: 1

Et puis si j’appuie sur une touche rien ne se passe.

Par ailleurs ma carte à bien des bornes SCA et SCL dédiées, j’ai joins une photo de ma carte à ce message. Donc en principe pas de soucis pour utiliser la pin 44 à autre chose. Et pas de soucis avec le LCD qui est lui aussi en I2C

Merci pour votre aide.

Ma_Carte_Mega.JPG