/*
______ _ _///_ _ _ _
/ _ \ (_) | ___| | | | (_)
| [_| |__ ___ ___ _ ___ _ __ | |__ | | ___ ___| |_ _ __ ___ _ __ _ ___ _ _ ___
| ___/ _ \| __|| __| |/ _ \| '_ \_____| __|| |/ _ \/ _| _| '__/ \| '_ \| |/ \| | | |/ _ \
| | | ( ) |__ ||__ | | ( ) | | | |____| |__ | | __/| (_| |_| | | (_) | | | | | (_) | |_| | __/
\__| \__,_|___||___|_|\___/|_| [_| \____/|_|\___|\____\__\_| \___/|_| |_|_|\__ |\__,_|\___|
| |
ProgName : PCF8574T_AZ_TPDNum_7btn_Touche.ino \_|
Description : Programme permettant de lire les entrées P0 à P7 d'un expander PCF8574T_AZ,
en utilisant la librairie Wire (native sous "Arduino IDE")
Affiche
- la valeur de P0 à P7,
- la valeur lue
- le nome de la touche appuyée
https://passionelectronique.fr/tutorial-pcf8574/
adaptée à ESP32 avec affichage sur OLED SSD1306 (128x64)
MCU : ESP32 DEVKIT V1
Status :
*/
#include <Wire.h>
#include "Oled.h"
// definition du nom du sketch
#define ProgName "ESP32_PCF8574_AZ_TPDNum_7btn_Touche_2_Oled.ino"
// Touch Pad
#define adresseDeLaPucePCF8574_AZ 0x26 // Adresse I2C du module PCF8574_AZ TPD (attention, cela varie suivant la configuration des broches A2/A1/A0 de cette puce)
// ========================
// Initialisation programme
// ========================
void setup() {
// Initialisation de la liaison série (arduino nano -> PC)
Serial.begin(9600);
delay(100);
// initialise OLED
init_OLED();
// affiche le nom du sketch sur Serial Moniteur
Serial.println(ProgName);
Serial.println("\n");
// affiche le nom du sketch sur OLED
// Display FileName
display.setTextSize(1);
display.setCursor(0, 0);
display.print(ProgName);
display.display();
delay(2000);
Serial.println(F("========================================================="));
Serial.println(F("Exemple 1 (tuto PCF8574) : lecture des ENTREES P0 à P7, "));
Serial.println(F(" en utilisant la librairie Wire"));
Serial.println(F("========================================================="));
Serial.println("");
// Initialisation du contrôleur I2C arduino
Wire.begin();
// Test si la puce PCF 8574 répond bien (dans ce cas, elle renverra la valeur "0" en "endTransmission", si c'est le cas)
Wire.beginTransmission(adresseDeLaPucePCF8574_AZ);
if (Wire.endTransmission() != 0) {
Serial.print(F("Le PCF8574 ne répond pas à l'adresse 0x"));
Serial.println(adresseDeLaPucePCF8574_AZ, HEX);
Serial.println(F("Arrêt du programme."));
while (1)
;
}
// Passage des toutes les E/S du PCF8574 en "entrée"
// ... à noter que les 3 lignes suivantes ne sont pas indispensables, car c'est le mode de démarrage par défaut du PCF8574
Wire.beginTransmission(adresseDeLaPucePCF8574_AZ);
Wire.write(0b11111111); // Mise à 1 des pins P7 à P0 du PCF8574
Wire.endTransmission();
// Remarques :
// - mettre à "1" une E/S du PCF8574 revient à permettre d'utiliser cette broche en ENTRÉE
// - on aura tout de même une tension +Vcc présente sur cette broche, si celle-ci n'est reliée à rien
// - cet état haut est dit "faible", en ce sens où on peut l'amener à la masse sans créer de court-circuit
// (c'est l'équivalent d'une pull-up, qui serait activée sur cette broche, si vous préférez)
}
// =================
// Boucle principale
// =================
void loop() {
byte reponseI2C;
// Envoi d'une demande de lecture de données, auprès du PCF8574
Wire.requestFrom(adresseDeLaPucePCF8574_AZ, 1); // Le "1" signifie qu'on envisage de lire 1 seul octet en retour
// Récupération de l'octet en question
if (Wire.available()) {
reponseI2C = Wire.read(); // Lecture de l'octet qu'on attendait en retour
afficheLes8bitsDeLaValeur(reponseI2C); // Affichage sur le moniteur série de l'IDE Arduino
// Les "1" diront que l'entrée est à l'état haut (+Vcc, par exemple)
// Les "0" diront que l'entrée est à l'état bas (0 volt, par exemple)
} else {
Serial.println(F("[ERREUR] Impossible de récupérer la valeur I2C renvoyée par le PCF8574"));
Serial.println(F("Arrêt du programme."));
while (1)
;
}
// … et on reboucle à l'infini (avec une petite pause au passage, pour ne pas surcharger le moniteur série)
delay(1000);
//delay(100);
}
// =========================================================================================
// Fonction : afficheLes8bitsDeLaValeur
// - permet d'afficher tous les 0 et 1 des 8 bits composant la valeur jointe en paramètre
// =========================================================================================
void afficheLes8bitsDeLaValeur(byte valeurAafficher) {
// Affichage des bits un à un, sur le moniteur série
Serial.print((valeurAafficher >> 7) & 0b00000001); // On décale 7 fois le 8ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
Serial.print((valeurAafficher >> 6) & 0b00000001); // On décale 6 fois le 7ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
Serial.print((valeurAafficher >> 5) & 0b00000001); // On décale 5 fois le 6ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
Serial.print((valeurAafficher >> 4) & 0b00000001); // On décale 4 fois le 5ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
Serial.print((valeurAafficher >> 3) & 0b00000001); // On décale 3 fois le 4ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
Serial.print((valeurAafficher >> 2) & 0b00000001); // On décale 2 fois le 3ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
Serial.print((valeurAafficher >> 1) & 0b00000001); // On décale 1 fois le 2ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
Serial.print((valeurAafficher >> 0) & 0b00000001); // On décale 0 fois le 1er bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
Serial.println();
// À noter qu'un "1" affiché indiquera que l'entrée en question est à l'état haut (et inversement : si un 0 s'affiche, c'est alors qu'elle est à l'état bas)
// affiche le valeur de la touche sur Serial Moniteur
Serial.print(valeurAafficher);
//void afficheLes8bitsDeLaValeur(byte valeurAafficher) {
// Affichage des bits un à un, sur le moniteur série
display.clearDisplay();
display.setCursor(0, 0);
// affiche le titre du test
//display.invertDisplay(1); // texte noir sur fond blanc
display.setTextSize(1);
display.print(ProgName);
display.display();
display.setTextSize(2);
display.setCursor(0, 32);
display.print((valeurAafficher >> 7) & 0b00000001); // On décale 7 fois le 8ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
display.print((valeurAafficher >> 6) & 0b00000001); // On décale 6 fois le 7ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
display.print((valeurAafficher >> 5) & 0b00000001); // On décale 5 fois le 6ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
display.print((valeurAafficher >> 4) & 0b00000001); // On décale 4 fois le 5ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
display.print((valeurAafficher >> 3) & 0b00000001); // On décale 3 fois le 4ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
display.print((valeurAafficher >> 2) & 0b00000001); // On décale 2 fois le 3ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
display.print((valeurAafficher >> 1) & 0b00000001); // On décale 1 fois le 2ème bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
display.println((valeurAafficher >> 0) & 0b00000001); // On décale 0 fois le 1er bit pour l'amener en position 0, puis on fait un "ET logique" pour le comparer à la valeur 1
// À noter qu'un "1" affiché indiquera que l'entrée en question est à l'état haut (et inversement : si un 0 s'affiche, c'est alors qu'elle est à l'état bas)
// affiche la valeur de la touche sur OLED
display.print(valeurAafficher);
//display.display();
// affiche le nom de la touche
switch (valeurAafficher) {
case 247:
{
Serial.println(" NONE");
display.println(" NONE");
break;
}
case 246:
{
Serial.println(" UP");
display.println(" UP");
break;
}
case 245:
{
Serial.println(" SELECT");
display.println(" SELECT");
break;
}
case 243:
{
Serial.println(" DOWN");
display.println(" DOWN");
break;
}
case 231:
{
Serial.println(" LEFT");
display.println(" LEFT");
break;
}
case 215:
{
Serial.println(" RIGHT");
display.println(" RIGHT");
break;
}
case 183:
{
Serial.println(" CANCEL");
display.println(" CANCEL");
break;
}
case 119:
{
Serial.println(" CORR");
display.println(" CORR");
break;
}
}
Serial.println("");
display.display();
}
// fin du Sketch
Address bits 2,1
Address bit 0
nINT
interrupt indicator