(Résolu) débuts avec PCF8574T (8 entrées/sorties I2C) et node MCU-ESP8266

Bonsoir à tous.

Je débute avec le PCF8574T (8 entrées/sorties I2C) et node MCU-ESP8266
Pour un 1er test, je prends :

Cela semble fonctionner mais pas à 100% comme indiqué par les commentaires ?
Si je comprends bien, la led bleu doit s'allumer et la led rouge doit s'éteindre or je n'ai que la led bleu qui clignote ?
Les leds devraient clignoter alternativement ?
(la led rouge est allumée si D3 du 8574 n'est pas raccordé, l'affichage du moniteur fonctionne mais pas très compréhensible)

Je pense que mon problème est un problème de câblage.
Je ne sais pas lire l'anglais et je n'arrive pas à comprendre le schéma à réaliser.
Voici ce qu j'ai compris et réalisé. Quelqu'un peut-il me confirmer ou me corriger.

PCF8574................... Nodemcu............ (+ et - non représentés)
SDA ----------------- GPIO 5 (D1)
SCL <---------------- GPIO 4 (D2)
INT ----------------> GPOI 14 (D5)
D3 <----------------- GPOI 2 (D4)
D7 --->--- résistance + led rouge vers GND C'est faux voir mon message #14

Merci d'avance.

Ci-dessous le programme :

/* Example sketch for the PCF8574 for the purposes of showing how to use the interrupt-pin.
Attach the positive lead of an LED to PIN7 on the PCF8574 and the negative lead to GND,
a wire from GPIO2 (Nodemcu D4) to PIN3 that will be used to trigger the interrupt,
and the INT-pin to GPIO14 (Nodemcu D5) on the ESP8266.
If all goes well you should see the small blue LED on the ESP-module lighting up and the
LED connected to the PCF going off, and vice versa. */

#include <pcf8574_esp.h>
#include <ESP8266WiFi.h>
#include <Wire.h>

/* Wire.h already defines "Wire" which the PCF8574-class would use by default,
but for the sakes of an example let's define our own instance of it and use that instead!
Also, since I2C is emulated on the ESP8266 let's redefine what pins to use as SDA and SCL
and instead swap them around!
DO NOT FORGET TO WIRE ACCORDINGLY, SDA GOES TO GPIO5, SCL TO GPIO4 (ON NODEMCU GPIO5 IS D1 AND GPIO4 IS D2) */
TwoWire testWire;
// Initialize a PCF8574 at I2C-address 0x20, using GPIO5, GPIO4 and testWire for the I2C-bus
PCF857x pcf8574(0x20, &testWire);
// Use PCF857x pcf8574(0x20, &Wire); if you don't wish to define your own Wire-instance.

//If you had a PCF8575 instead you'd use the below format
//PCF857x pcf8575(0x20, &testWire, true);

volatile bool PCFInterruptFlag = false;

void ICACHE_RAM_ATTR PCFInterrupt() {
PCFInterruptFlag = true;
}

void setup() {
WiFi.persistent(false);
WiFi.mode(WIFI_OFF);
WiFi.forceSleepBegin();
delay(1);
// The above lines turn WiFi off for lower power-consumption, since we're not using it in this sketch.
// Remove them if you want to modify the sketch and use WiFi.

Serial.begin(115200);
Serial.println("Firing up...");
pinMode(2, OUTPUT);

testWire.begin(5, 4);
//Specsheets say PCF8574 is officially rated only for 100KHz I2C-bus
//PCF8575 is rated for 400KHz
testWire.setClock(100000L);
pcf8574.begin();
// Most ready-made PCF8574-modules seem to lack an internal pullup-resistor, so you have to use the ESP8266-internal one.
pinMode(14, INPUT_PULLUP);
pcf8574.resetInterruptPin();
attachInterrupt(digitalPinToInterrupt(14), PCFInterrupt, FALLING);
}

void loop() {
if(PCFInterruptFlag){
Serial.println("Got an interrupt: ");
if(pcf8574.read(3)==HIGH) Serial.println("Pin 3 is HIGH!");
else Serial.println("Pin 3 is LOW!");
// DO NOTE: When you write LOW to a pin on a PCF8574 it becomes an OUTPUT.
// It wouldn't generate an interrupt if you were to connect a button to it that pulls it HIGH when you press the button.
// Any pin you wish to use as input must be written HIGH and be pulled LOW to generate an interrupt.
pcf8574.write(7, pcf8574.read(3));
PCFInterruptFlag=false;
}
Serial.println("Blink.");
if(digitalRead(2)==HIGH) digitalWrite(2, LOW);
else digitalWrite(2, HIGH);
delay(1000);
}

Bonjour,
de mémoire, c'est du open drain, donc led rouge sur le +

Bonjour trimarco232,

Désolé, NON.

La led rouge est bien connectée car dans certaines situations, (D3 ----GPOI 2 (D4) non connecté, elle s'allume correctement.

Les commentaires en début de programme précisent bien de mettre la led au GND !

pas de souci, tu fais comme tu veux !
pour les autres lecteurs, je maintiens qu'en sortie de pcf8574, les charges doivent être reliées au + !
(ce n'est pas le commentaire d'un créateur de programme qui ne marche pas qui y change quoi que ce soit :grin: )

Bonjour,

+1 avec trimarco22, l'étage de sortie des pcf8574 est composé de deux mosfet complémentaires alimentés par un générateur de courant constant de 100µA (voir doc).
En conséquence, il pourra fournir au maximum 100µA à la charge.
Chaque sortie peut recevoir 25mA max. avec un total max de 80mA.

Bonjour bilbo83 et trimarco232,

Merci pour votre aide et votre insistance.
Je viens d'inverser l'alimentation la del en mettant : D7 du pcf8574 > à résistance et led rouge au +VCC
Cette fois elle reste allumée en permanence ! et s'éteint si je coupe la liaison D3 --<-- GPOI 2 (D4)
Donc ça ne fonctionne pas non plus ! C'est l'inverse de ma situation 1ère.
Maintenant j'ai :
AVEC la liaison D3 --<-- GPOI 2, le moniteur affiche en permanence :
Got an interrupt :
pin 3 is low:
blink.
blink.

SANS la liaison D3 --<-- GPOI 2, le moniteur affiche
Got an interrupt : une seule fois
pin 3 is HIGH: une seule fois puis,
blink. blink.blink.blink.blink.blink.blink......... en permanence :

  • Pour l'instant, je n'ai pas modifié le programme, je cherche à comprendre et à confirmer le schéma de câblage.
  • le site https://github.com/... est-il fiable ?
  • OK, J'ai considéré que les commentaires en exemple avec la bibliothèque étaient du même auteur ?
  • j'avais bien noté que le courant de sortie était limité à 100 uA mais comme la del s'allumait normalement (del sensible avec R de 3,3k/3,3V = environ 300 uA )!! Là j'ai été trompé.

Avez-vous une piste?
Merci pour votre patience.

As-tu mis des résistances de tirage sur SDA, SCL et INT ?

re-Bonjour bilbo83,

Oui, bonne question. Mais ....
J'utilise le module bleu sur ce lien.

https://fr.aliexpress.com/item/32354610944.html?src=google&albslr=202171568&albch=shopping&acnt=494-037-6276&isdl=y&slnk=&plac=&mtctp=&albbt=Google_7_shopping&aff_platform=google&aff_short_key=UneMJZVf&albagn=888888&albcp=1706977641&albag=66909914152&trgt=760265873744&crea=fr32354610944&netw=u&device=c&gclid=Cj0KCQjwvdXpBRCoARIsAMJSKqLHJ5ccVjCmQH8_kajFtYCGvED4e24G3oBatHPZgfqDdSdC3iCJjdAaAnUdEALw_wcB&gclsrc=aw.ds

Sur SCL et SDA il y a déjà des résistances de "charge" de 1k (marquées 102). ( et je les ai mesurées)
Sur INT, GPIO14 du 8266 est paramétré pullup et je vois bien sur le moniteur que les interruptions fonctionnent.
J'ai même mis un oscilloscope sur GPIO 2 (D4) ça clignote bien.

Revenons à mes questions du départ si tu le veux bien :
Pourrais-tu me confirmer que mon schéma de raccordement est correct ? (voir les commentaires du sketch)
Pourrais-tu me confirmer que les 2 leds devraient clignoter en alternance ?
Je ne comprends rien dans les commentaires même avec un traducteur !
Merci

https://fr.aliexpress.com/item/32354610944.html?src=google&albslr=202171568&albch=shopping&acnt=494-037-6276&isdl=y&slnk=&plac=&mtctp=&albbt=Google_7_shopping&aff_platform=google&aff_short_key=UneMJZVf&albagn=888888&albcp=1706977641&albag=66909914152&trgt=760265873744&crea=fr32354610944&netw=u&device=c&gclid=Cj0KCQjwvdXpBRCoARIsAMJSKqLHJ5ccVjCmQH8_kajFtYCGvED4e24G3oBatHPZgfqDdSdC3iCJjdAaAnUdEALw_wcB&gclsrc=aw.ds

Oui, ton câblage correspond au commentaire.
Avec la liaison D3 --<-- GPOI 2, tu reçois une interruption chaque fois que tu écrit "LOW" sur GPIO2.

A chaque interruption, on recopie l'état de P3 sur P7, puis on inverse l'état de GPIO2 (led bleu).

En fait, d'après ce que je comprend, le programme simule l'appui sur un bouton poussoir câblé entre P3 et GND.

Même conclusion que Bilbo83 .

le câblage est conforme au programme et commentaires.

La led bleu clignote bien et les interruptions sont bien déclenchée.
Il reste donc le soucis de la led rouge sur P7.

J'aurais tendance à dire qu'il faut connecter l'Anode de la led (+) à Vcc, mettre une résistance de limitation de courant et la connecter à P7.

en complément, voici un extrait de la datasheet du PCF8574 ,
on voit bien que le lorsque la sortie mise à l'état haut, le courant de sortie est limité à 100µA.
Donc insuffisant pour allumer une Led.

Bonjour à tous,

  1. Oui, habituellement et en accord avec le schéma (extrait de datasheet) c'est plutôt le courant partant du + (del) qui va vers le drain du mosfet.
    Et pourtant, la del sensible s'allumait normalement, je pensais l'allumage (permanent) impossible avec 100uA. (permanent, sans parler de la "pichnette" pour activer plus rapidement)
    Reste que le commentaire est erroné car il dit de raccorder la led au GND. L'erreur est humaine.

  2. Je suis d'accord avec le fonctionnement énoncé par bilbo83.
    C'est bien ce que j'avais compris malgré mon handicap de langue.

  3. Selon vous, la del rouge devrait bien clignoter aussi ?

  4. Est-à dire que l'exemple fourni avec la bibliothèque est NUL !
    Dans la distribution d'une bibliothèque, je trouve quand même bizarre autant de bugs ? J'ai du mal à y croire.
    Dois-je abandonner l'exemple, la bibliothèque, les 2 mon capitaine ?

  5. Dernier recours, je vais maintenant essayer de modifier l'exemple.

Vos avis restent les bienvenus.
Merci

Non la bibliothèque est bonne (je l'ai gouté).
Je m'en sert avec un node MCU ESP12-E, ça fait le boulot.
Ceci-dit, je n'ai pas eu besoin d'utiliser les interruptions, seulement les fonctions de bases: "read" et "write".

Cet exemple fourni est un peu fumeux.

Il faut juste faire attention à une chose, par exemple:
Si on câble un bouton poussoir entre une E/S et le VCC, il ne faut pas écrire un état "LOW", ce qui met l'E/S en SORTIE et état zéro, si le bouton poussoir est pressé, on envoi directement le VCC sur la sortie, le courant n'est pas limité, fumée garantie.

Bonsoir à tous,

J'ai réussi à faire fonctionner le programme d'exemple fourni avec la bibliothèque voir mon 1er post,
correspondant à la description mise en commentaire.

  1. Le schéma de câblage
    PCF8574 Nodemcu (+ et - non représentés)
    SDA ----------------- GPIO 5 (D1)
    SCL <---------------- GPIO 4 (D2)
    INT -----------------> GPOI 14 (D5)
    D3 <------------------ GPOI 2 (D4)
    D7 --->--- résistance + led rouge vers GND il faut vers VCC

  2. Le programme
    A la ligne 54 il y a : attachInterrupt(digitalPinToInterrupt(14), PCFInterrupt, FALLING);
    A la ligne 54 il faut : attachInterrupt(digitalPinToInterrupt(14), PCFInterrupt, CHANGE);

C'est quand même fort !

Merci à tous. Et qu'on se le dise !

@bilbo83 : j'ai bien pris note de tes recommandations. Merci

J'ai réussi à faire fonctionner

bravo !

Il faut juste faire attention à une chose, par exemple:
Si on câble un bouton poussoir entre une E/S et le VCC, il ne faut pas écrire un état "LOW", ce qui met l'E/S en SORTIE et état zéro, si le bouton poussoir est pressé, on envoi directement le VCC sur la sortie, le courant n'est pas limité, fumée garantie.

mouais, en même temps quelle drôle d'idée de ne pas mettre le poussoir au gnd quand l'entrée dispose d'un pull up ...

Bonjour,

Oui, quelque chose n'est pas clair là. J'avais remarqué. Mettre un + direct sur une entrée !!!

@trimarco232:
J'ai vu de nombreux montages où les BP sont câblés ainsi (mauvaise habitude).
Mais c'est également le cas du montage proposé en exemple.
Si GPIO2 est à 1 et qu'on écrit 0 sur P3 du PCF, on crée un court-circuit et on crame et l'ESP et le PCF.

on est d'accord
juste que quand ton entrée dispose d'un pull-up intégré, sauf cas spécial, le + simple et logique est de mettre le bouton ou poussoir au gnd

Tout à fait d'accord pour la connexion d'un BP, malheureusement de nombreux débutants son perturbés par la logique négative et il leur semble plus intuitif d'envoyer un VCC plutôt que GND sur une entrée, niveau qui sera lu par le programme.