Ardu? No!Les boutons ≫ Une touche est appuyée (matrice triangulaire triple)?

Une touche est appuyée
(matrice triangulaire triple)?

La problématique est presque la même que pour la matrice triangulaire simple, pour y gagner, il vaut mieux que les broches soient sur le même port. Pour la matrice triple, l'algorithme de lecture est plus compliqué que pour la matrice simple car il faut lire dans les deux sens, mais pour savoir si un bouton est appuyé ou non, cela change peu. Ce sera donc plus intéressant que pour la matrice simple.

Dans la suite je supposerait donc que la matrice triangulaire est branchée sur les 6 bits libres du port D (broches 2 à 7 correspondant au port PD2 à PD7).

Test si un bouton est appuyé ou non

On va donc mettre une des 6 broches à LOW et lire le mot. Ce mot lu contiendra les deux bits de la liaison série ainsi qu'un 0 correspondant à la sortie que l'on a mis à LOW. Si les autres bits sont à 1, on ne voit pas de boutons appuyé. Le plus simple est de mettre alors les 3 bits qui nous gênent à 1, ainsi si le nouveau mot est à 0b11111111, aucun bouton correspondant n'est appuyé. On fera 6 fois cela pour les 6 broches. Dans le cas de la matrice simple, on avait des doubles lectures que l'on ignorait, ici, la lecture se fait ainsi dans les deux sens. Une petite différence, avec la matrice simple, on n'avait pas besoin de répéter la boucle pour la dernière broche, car il n'y avait pas de boutons non testé. Ici, il faudra répéter la boucle une fois de plus pour mettre le LOW sur toutes les broches.

Voici ce que cela peut donner:

// Matrice triangulaire, 45 boutons sont branchés, 3 entre chaque paire de broches, l'un sans diodes, les deux autres avec:
// (2,3), (2,4), (2,5), (2,6), (2,7), (3,4), (3,5), (3,6), (3,7), (4,5), (4,6), (4,7), (5,6), (5,7) et (6,7)

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
  for (byte broche=2; broche <=7; broche++) pinMode(broche, INPUT_PULLUP); // Repos, toutes les broches en INPUT_PULLUP
}

byte ligne; // Celle que l'on va passer à LOW
void loop()
{
  for (ligne=2; ligne <=7; ligne++) // Pour touts les lignes y compris la dernière
  {
    digitalWrite(ligne, LOW); // Passage de la ligne en sortie à LOW
    pinMode(ligne, OUTPUT);
    if (((PIND | 0b00000011) | (1 << ligne)) != 0b11111111) break; // Arrêt si on a un bouton appuyé
    pinMode(ligne, INPUT_PULLUP); // Retour au repos de la ligne
 }
  if (ligne <= 7) // Un bouton est appuyé
  {
    pinMode(ligne, INPUT_PULLUP); // Retour au repos de la ligne
    Serial.println("Un bouton est appuyé");
  }
  else Serial.println(); // Suppression du message car aucun bouton n'est appuyé
  delay(100); // Pas trop souvent
}