Go Down

Topic: (Résolu) débuts avec PCF8574T (8 entrées/sorties I2C) et node MCU-ESP8266 (Read 349 times) previous topic - next topic

geryko

Bonsoir à tous.

Je débute avec le PCF8574T (8 entrées/sorties I2C) et node MCU-ESP8266
Pour un 1er test, je prends :
 https://github.com/WereCatf/PCF8574_ESP/blob/master/examples/pcf8574_esp8266/pcf8574_esp8266.ino
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  :
Quote
/*  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);
}
Lorsque vous avez la solution, la donner et marquer le titre du 1er post [Résolu] .     Géryko

trimarco232

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

geryko

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 !
Lorsque vous avez la solution, la donner et marquer le titre du 1er post [Résolu] .     Géryko

trimarco232

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  :smiley-mr-green: )

bilbo83

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. 

geryko

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.
Lorsque vous avez la solution, la donner et marquer le titre du 1er post [Résolu] .     Géryko

bilbo83

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

geryko

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
Lorsque vous avez la solution, la donner et marquer le titre du 1er post [Résolu] .     Géryko


bilbo83

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.

Leptro

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.


Leptro

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.

geryko

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
Lorsque vous avez la solution, la donner et marquer le titre du 1er post [Résolu] .     Géryko

bilbo83

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.

geryko

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
Lorsque vous avez la solution, la donner et marquer le titre du 1er post [Résolu] .     Géryko

Go Up