/*
ProgName : ESP32_PCF8574_blink_Leds.ino \_|
Description : Programme permettant de lire les entrées P0 à P3 d'un expander PCF8574,
en utilisant la librairie Wire (native sous "Arduino IDE").
On 'mirror' les entrées P0 à P3 vers les sorties P4 à 7
MCU : ESP32 DEVKIT V1
PCF8574
Status : OK
*/
#include <Wire.h>
#include "Oled.h"
// definition du nom du sketch
#define ProgName "ESP32_PCF8574_blink_Leds.ino "
// Touch Pad
#define adresseDeLaPucePCF8574 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("");
Serial.println("\n --- RUNNING --- \n");
// 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);
if (Wire.endTransmission() != 0) {
Serial.print(F("Le PCF8574 ne répond pas à l'adresse 0x"));
Serial.println(adresseDeLaPucePCF8574, 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);
// Wire.write(0b00001111); // 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, 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(10);
}
// =========================================================================================
// 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,HEX);
//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.println(valeurAafficher);
// //display.display();
// Serial.println();
// display.display();
mirrorInputOntoOutputs(valeurAafficher);
}
void mirrorInputOntoOutputs(byte valeurAafficher) {
// uint16_t bothports = getChangedInputValue();
// uint16_t inputs = lowByte(bothports);
// Mirror the inputs to the outputs
// leave the inputs, as inputs (i.e. writing high)
// uint16_t newValue = word(inputs, 0xff) ; // (inputs << 8) | 0xff;
// Serial.print("Inputs read as 0x");
// //Serial.print(inputs, HEX);
// Serial.println(valeurAafficher, HEX);
// Serial.println(" being mirrored to out");
valeurAafficher = (valeurAafficher << 4);
writeData(valeurAafficher);
// // device.digitalWrite(newValue);
// Serial.print("Wrote 1 byte: port0 -> 0x");
// Serial.println(valeurAafficher, HEX);
// Serial.println("\n");
}
void writeData(byte valeurAafficher)
{
Wire.beginTransmission(adresseDeLaPucePCF8574);
// //Wire.write(0b11011111);
// //Serial.println(valeurAafficher,HEX);
Wire.write(valeurAafficher);
Wire.endTransmission();
}
// fin du Sketch
Address bits 2,1
Address bit 0
nINT
interrupt indicator