Mcp23017 avec ESP32

Bonjour,

j'ai installé un mcp23017 sur mon esp32 pour augmenter le nombre E/S.

Je n'arrive pas à lui faire reconnaitre l'affectation des GPIO du mcp.

J'ai notamment les erreurs suivantes :

je ne trouve pas de librairie spécifique au mcp23017 :

dans platformio.ini : adafruit/Adafruit MCP23017 Arduino Library@^2.3.2

#include <Adafruit_MCP23XXX.h>

Par contre, dans le main : #include <Adafruit_MCP23017.h> n'est pas reconnu et me retrouve avec un message : CMake incorrect : vérifier la valeur de Cmake.cMakePath (c'est quoi et on fait comment ?)

[Wire.cpp:499] requestFrom(): i2cWriteReadNonStop returned Error 263.

Je ne comprends ce que j'ai vu sur Internet...

que ce soit en Input ou en Output rien ne fonctionne

J'ai vérifié la communication I2C fonctionne avec une routine : OK

Où puis-je mettre le code du main.cpp et de platformio.ini et un croquis de mon câblage ?

platformio.ini :
[env:esp32dev]

platform = espressif32

board = esp32dev

framework = arduino

monitor_speed = 115200

lib_deps =

adafruit/Adafruit SSD1306@^2.5.7

adafruit/Adafruit GFX Library@^1.11.9

adafruit/DHT sensor library@^1.4.4

adafruit/Adafruit BusIO@^1.14.5

adafruit/Adafruit TestBed@^1.11.0

adafruit/Adafruit MCP23017 Arduino Library@^2.3.2

main.cpp :
// Projet carte extension MCP 23017

#include <Arduino.h>

#include <Wire.h>

// Mettez à jour includePath. comment ?
// impossible d'ouvrir le fichier source
// essai de rechargement à partir de la Library : idem defaut

// #include <Adafruit_MCP23X08.h>

// dans platformio.ini : adafruit/Adafruit MCP23017 Arduino Library@^2.3.2
#include <Adafruit_MCP23XXX.h> // pas d'erreur à la compilation : 017 et non XXX ...
// #include <Adafruit_MCP23017.h>
#include <Adafruit_Sensor.h> // rajout suite à message erreur : manque DHT sensor library
#include <DHT.h>
#include <Adafruit_TestBed.h> // pour connaitre les adresses de la carte d'extension mcp23017 et de l'écran

#define MCP_INPUTPIN 8 // 8 : GPB0 marche pas ...pourquoi ?

Adafruit_MCP23XXX mcp;

void setup()
{
Serial.begin(115200); // pour visualiser le moniteur série

mcp.begin_I2C();
mcp.pinMode(0, OUTPUT);
mcp.pinMode(1, OUTPUT);
mcp.pinMode(2, OUTPUT);
mcp.pinMode(3, OUTPUT);
mcp.pinMode(4, OUTPUT);
mcp.pinMode(5, OUTPUT);
mcp.pinMode(6, OUTPUT);
mcp.pinMode(7, OUTPUT);
pinMode(4, OUTPUT); // ok sur ESP32

mcp.pinMode(MCP_INPUTPIN,INPUT_PULLDOWN); // Pull-down interne sans resistance externe : 0x09
// ne voit pas l'entrée ni sur le + ni sur le -
// vu sur internet : le MCP23017 n’a pas de résistance pull-down : vrai ?

// mcp.pinMode(MCP_INPUTPIN,INPUT); // 0x01
// ne voit pas l'entrée ni sur le + ni sur le -
// rajouter une resistance ? si oui, quelle valeur ?

// mcp.pinMode(MCP_INPUTPIN,INPUT_PULLUP); // 0x05
// ne voit pas l'entrée ni sur le + ni sur le -
// rajouter une resistance ? si oui, quelle valeur ?

Serial.printf ("Sortie du setup \r") ;
delay (3000);
} // fin setup

void loop()
{

mcp.digitalWrite(0, HIGH); // la led ne s'allume pas ...sur aucune sorties
mcp.digitalWrite(1, HIGH); // du port A ...
mcp.digitalWrite(2, HIGH); // idem sur HIGH ou sur LOW ...
mcp.digitalWrite(3, HIGH); // ne renvoie jamais une tension entre la pin et le GND
mcp.digitalWrite(4, LOW); // idem sur HIGH ou sur LOW ...
mcp.digitalWrite(5, LOW);
mcp.digitalWrite(6, LOW);
mcp.digitalWrite(7, LOW);
digitalWrite(4,HIGH); // sur ESP32 : ok allume la led

// sur les pin du ports A en Output : aucune tension en HIGH ou en LOW
// sur INTA et INTB : 3.28 VDC (rien de branché dessus) : normal ?

// Transfer input pin state to LED1
if (mcp.digitalRead(MCP_INPUTPIN)) // si bouton à 1 : avec le mcp,
// devrait voir l'entrée de l'extension mcp
{
Serial.printf ("Bouton actif \r") ;
// bouton actif quand rien n'est branché sur aucune GPIO 0.21 à 0.24 VDC instable
delay(200);
}
else // si bouton à 0
{
Serial.printf ("Bouton inactif \r") ;
delay(200);
}
}

Merci d'avance pour votre aide Use code tags to format code for the forum


* type or paste code here
platformio.ini :
[env:esp32dev]

platform = espressif32

board = esp32dev

framework = arduino

monitor_speed = 115200

lib_deps =

adafruit/Adafruit SSD1306@^2.5.7

adafruit/Adafruit GFX Library@^1.11.9

adafruit/DHT sensor library@^1.4.4

adafruit/Adafruit BusIO@^1.14.5

adafruit/Adafruit TestBed@^1.11.0

adafruit/Adafruit MCP23017 Arduino Library@^2.3.2

main.cpp : 
// Projet carte extension MCP 23017


#include <Arduino.h>

#include <Wire.h>

// Mettez à jour includePath.  comment ?
// impossible d'ouvrir le fichier source 
// essai de rechargement à partir de la Library : idem defaut


// #include <Adafruit_MCP23X08.h>

// dans platformio.ini : adafruit/Adafruit MCP23017 Arduino Library@^2.3.2
#include <Adafruit_MCP23XXX.h>  // pas d'erreur à la compilation : 017 et non XXX ...
                                // #include <Adafruit_MCP23017.h>
#include <Adafruit_Sensor.h>      // rajout suite à message erreur : manque DHT sensor library
#include <DHT.h>
#include <Adafruit_TestBed.h>     // pour connaitre les adresses de la carte d'extension mcp23017 et de l'écran

#define MCP_INPUTPIN 8          // 8 : GPB0   marche pas ...pourquoi ?
 
Adafruit_MCP23XXX mcp;
 
void setup()
  {
  Serial.begin(115200);   // pour visualiser le moniteur série

  mcp.begin_I2C();
mcp.pinMode(0, OUTPUT);
mcp.pinMode(1, OUTPUT);
mcp.pinMode(2, OUTPUT);
mcp.pinMode(3, OUTPUT);
mcp.pinMode(4, OUTPUT);
mcp.pinMode(5, OUTPUT);
mcp.pinMode(6, OUTPUT);
mcp.pinMode(7, OUTPUT);
pinMode(4, OUTPUT);       // ok sur ESP32

  mcp.pinMode(MCP_INPUTPIN,INPUT_PULLDOWN);   // Pull-down interne sans resistance externe : 0x09
  // ne voit pas l'entrée ni sur le + ni sur le -
  // vu sur internet : le MCP23017 n’a pas de résistance pull-down : vrai ?

  // mcp.pinMode(MCP_INPUTPIN,INPUT);    // 0x01
  // ne voit pas l'entrée ni sur le + ni sur le -
  // rajouter une resistance ? si oui, quelle valeur ?

  // mcp.pinMode(MCP_INPUTPIN,INPUT_PULLUP); // 0x05
  // ne voit pas l'entrée ni sur le + ni sur le -
  // rajouter une resistance ? si oui, quelle valeur ?

Serial.printf ("Sortie du setup \r") ;
delay (3000);
}   // fin setup

void loop()
{

mcp.digitalWrite(0, HIGH);  // la led ne s'allume pas ...sur aucune sorties
mcp.digitalWrite(1, HIGH);  // du port A ...
mcp.digitalWrite(2, HIGH);  // idem sur HIGH ou sur LOW ...
mcp.digitalWrite(3, HIGH);  // ne renvoie jamais une tension entre la pin et le GND
mcp.digitalWrite(4, LOW);   // idem sur HIGH ou sur LOW ...
mcp.digitalWrite(5, LOW);
mcp.digitalWrite(6, LOW);
mcp.digitalWrite(7, LOW);
digitalWrite(4,HIGH);   // sur ESP32 : ok allume la led

// sur les pin du ports A en Output : aucune tension en HIGH ou en LOW
// sur INTA et INTB : 3.28 VDC (rien de branché dessus) : normal ?

  // Transfer input pin state to LED1
  if (mcp.digitalRead(MCP_INPUTPIN))  // si bouton à 1 : avec le mcp, 
  // devrait voir l'entrée de l'extension mcp
   {
    Serial.printf ("Bouton actif    \r") ;  
     // bouton actif quand rien n'est branché sur aucune GPIO 0.21 à 0.24 VDC instable
     delay(200);
   }
  else                           // si bouton à 0
    {
     Serial.printf ("Bouton inactif  \r") ;
     delay(200);
    }
}

Je me suis servi du bouton <CODE/> pour formater le code et fait un copier / coller : je ne vois pas ce que ça change ?
ou faut-il faire autre chose ou autrement ?

Je tourne en rond :
en bas de cette fenêtre j'ai 2 boutons : Save Edit    et     Close
si je clique sur : Save Edit   j'ai 2 choix soit : Edit Post   (retour à l'étape précédente)
                                                                             Post Anyway   (poster quand même)
si je clique sur : Close   j'ai 3 choix soit : Discard (supprimer)
                                                                     Save draft for later    (sauvegarder le brouillon pour plus tard)
                                                                     Keep Editing   (rester en mode Edition)
Comment dire au site internet que j'ai modifié la conversation, que je veux enregistrer et envoyer cette conversation ?

Bonjour et bienvenu ici...

Avant que qq'un puisse se pencher sur ton promblème, peux-tu mettre en forme ton code avec le bouton <code> de l'éditeur ? Cela améliore grandement la lecture.

Les bonnes pratiques du forum sont par là : Les bonnes pratiques du Forum Francophone

Bonnes bidouilles !

+1 à @ProfesseurMephisto
Il y a des aidants qui répondent sur téléphone, c'est illisible pour eux.

Question :
As-tu déjà eu le même souci avec une autre bibliothèque ?
C'est cette bibliothèque particulière qui pose un problème ?

Bonjour,

Merci pour votre réponse

Oui, c'est seulement avec cette bibliothèque.
J'ai l'impression qu'il y un décalage entre le nom de la bibliothèque dans le main.cpp et le nom dans platformio.ini comme si je serai " à cheval" entre 2 bibliothèques ?

Par ailleurs,j'ai un message d'erreur du Cmake qui me demande de mettre à jour le path (chemin).
1 est-ce que les 2 problèmes sont liés ?
2 je ne sais pas comment mettre à jour ce chemin et l'aide proposée parle de Linux alors que je suis sous Windows...

J'ai trouvé un petit code pour Arduino qui permet d'allumeur des led directement à partir du registre sans bibliothèque.
Je vais voir si cela fonctionne avec platformio

Bonne journée

Envoyé depuis l'application Mail Orange

Tu n'as pas corrigé ton premier message.

Tu cliques sur l'icone "crayon" en bas de ton premier message. Tu passes alors en mode édition.

Tu sélectionne la zone de code et tu cliques sur l'icone qui est dans la barre de titre de la fenétre d'édition.

Si tu le fais, ce n'est pas sur que quelqu'un ait la solution
Si tu ne le fais pas, personne ne lira.

Bonjour,

Comme je suis bloqué sur la librairie : Adafruit_MCP23017.h j'ai cherché du code pour travailler directement sur les registres.
Sur ESP learning j'ai trouvé un code que j'ai légèrement adapté pour qu'il fonctionne sur mon ESP32 :

`#include <Arduino.h>
#include <Wire.h >
void setup ()
{
Wire.begin() ; // reveille le bus I2C
// définit les broches d’E/S sur les sorties
Wire.beginTransmission (0x20) ;
Wire.write (0x00) ; // IODIRA register
Wire.write (0x00) ; // définit tout le port A sur les sorties (output)
Wire.endTransmission () ;
}

void loop()
{

Wire.beginTransmission (0x20) ; // A0 à A2 sur GND
Wire.write (0x12) ; // banque d’adresses A
Wire.write (0xAA); // allume les GPA impairs
Wire.endTransmission () ;
delay (6000);

Wire.beginTransmission (0x20) ;
Wire.write (0x12) ; // banque d’adresses A
Wire.write (0x55); // allume les GPA pairs et le GPA0
Wire.endTransmission () ;
delay (2000) ;

} // fin de la boucle loop`

Ce code fait clignoter alternativement un jeu de 4 leds puis un autre jeu de 4 autres leds sur le port A. Pourquoi ?
Comment faire pour allumer seulement la led que je veux ?
Je n'arrive pas à comprendre la datasheet du MCP23017 ...
Où puis-je trouver d'autres exemples de code sur les registres ou des supports en français?
Bon noël

Bonjour @BailleauChristian

Tu te prives d'un partie de l'aide du forum si tu ne consens pas à publier ton code comme demandé à plusieurs reprises dans ce fil de discussion,....

Bonsoir,
quand tu installes adafruit MCP23017 il faut aussi installer les dépendances sinon il ne pourra pas compiler
Bon Noël

Je l'avais fait tout à l'heure
Je le refais ici :

#include <Arduino.h>
#include <Wire.h >
void setup ()
{
Wire.begin() ;    // reveille le bus I2C
// définit les broches d’E/S sur les sorties
Wire.beginTransmission (0x20) ;
Wire.write (0x00) ;   // IODIRA register
Wire.write (0x00) ;   // définit tout le port A sur les sorties
Wire.endTransmission () ;
}

void loop()
{

// allume les GPA impairs
Wire.beginTransmission (0x20) ;   // A0 à A2 sur GND
Wire.write (0x12) ;   // banque d’adresses A
Wire.write (0xAA);
Wire.endTransmission () ;
delay (6000);

// allume les GPA pairs et le GPA0
Wire.beginTransmission (0x20) ;
Wire.write (0x12) ;   // banque d’adresses A
Wire.write (0x55);
Wire.endTransmission () ;
delay (2000) ;

}   // fin de la boucle loop

Bon noël

bonsoir,
oui j'ai installé les dépendances dans platformio.ini :
||adafruit/Adafruit BusIO@^1.14.5|
||adafruit/Adafruit MCP23017 Arduino Library@^2.3.2|

dans le main.cpp :
ça ne reconnais pas :
#include <Adafruit_MCP23017.h>
avec le message : impossible d'ouvrir le fichier source

Bon noël et merci pour vos réponses

Il faut regarder dans le terminal après avoir ajouté chaque librairie pourquoi la compil échoue et corriger. Il ne te manque pas l'include Wire.h par exemple

Dans le cas du travail direct dans les registres du MCP23017 :

il faut voir les choses en binaire

0xAA (hexadécimal) vaut 10101010 en binaire
0x55 (hexadécimal) vaut 01010101 en binaire

les voilà tes deux jeux de 4 leds allumées successivement

si tu envoies 0x01 ou 0x02 ou 0x04 .......que se passe-t-il ?

N.B le code correspondant à un travail direct sur les registres du MCP2307 et bien formaté en #9 par contre le code du message #1 (travail avec la bibliothèque d'Adafruit) ne l'est pas encore, en utilsant le crayon il serait bon de le retoucher... pour augmenter le nombre de lecteurs...

bonjour,

Merci beaucoup pour l'explication concernant la "vision" en binaire,

J'ai enfin compris comment activer une seul sortie à la fois sur le port A du MCP23017 en passant directement par les registres :
J'ai cliquer sur le bouton code pour coller le code suivant :

#include <Arduino.h>
#include <Wire.h >

void setup ()
{
Wire.begin() ;		// reveille le bus I2C
// définit les broches d’E/S sur les sorties
Wire.beginTransmission (0x20) ;
Wire.write (0x00) ;		// IODIRA register
Wire.write (0x00) ;		// définit tout le port A sur les sorties (output)
Wire.endTransmission () ;
}

void loop()
{

Wire.beginTransmission (0x20) ;   // A0 à A2 sur GND
Wire.write (0x12) ;		// banque d’adresses A
// Wire.write (0xAA);    // allume les 4 GPA impairs : 
// GPA1, GPA3, GPA5, GPA7
// 0xAA : 10101010 en binaire

// Wire.write (0x01);  // GPA0 : broche 21
// Wire.write (0x03);    // 
// 0x03 (hexa) correspond à 11 en binaire donc allume 2 lampes :
// (GPA0 : broche 21 et GPA1 : broche 22)

// Wire.write (0x05);
// 0x05 (hexa) correspond à 101 en binaire donc allume 2 lampes :
// (GPA0 : broche 21 : bread board : 8 et GPA2 : broche 23 : bread board : 6)

// Wire.write (0x06);
// 0x06 (hexa) correspond à 110 en binaire donc allume 2 lampes :
// (GPA1 : broche 22 : bread board : 7 et GPA2 : broche 23 : bread board : 6)

// Wire.write (0x07);
// 0x07 (hexa) correspond à 111 en binaire donc allume 3 lampes :
// (GPA2 : broche 23 : bread board : 6 et GPA1 : broche 22 : bread board : 7 et GPA0 : broche 21 : bread board : 8)

// Wire.write (0xFF);
// 0xFF (hexa) correspond à 11111111 en binaire donc allume les 8 lampes du port A :

Wire.write (0x10);
// 0x10 (hexa) correspond à 10000 en binaire donc allume 1 seule lampe (la GPA4 : broche 25 : bread board : 4)

// Wire.write (0x40);
// 0x40 (hexa) correspond à 1000000 en binaire donc allume 1 seule lampe (la GPA6 : broche 27 : bread board : 2)

Wire.endTransmission () ;
delay (6000);


Wire.beginTransmission (0x20) ;
Wire.write (0x12) ;		// banque d’adresses A
// Wire.write (0x55);    // allume les 4 GPA pairs : GPA2, GPA4, GPA6 et le GPA0
// 0x55 : 01010101 en binaire

// Wire.write (0x02);  // GPA1 : broche 22 : bread board : 7
// Wire.write (0x04);    // GPA2 : broche 23
// 0x04 (hexa) correspond à 100 en binaire donc allume 1 seule lampe (la GPA2 : broche 23 : bread board : 6)

// Wire.write (0x08);  // 
// Wire.write (0x08);    // GPA2 : broche 23
// 0x08 (hexa) correspond à 1000 en binaire donc allume 1 seule lampe (la GPA3 : broche 24 : bread board : 5)

// Wire.write (0x00);  // 
// Wire.write (0x00);    // allume aucune lampe du port A

Wire.write (0x20);
// 0x20 (hexa) correspond à 100000 en binaire donc allume 1 seule lampe (la GPA5 : broche 26 : bread board : 3)

// Wire.write (0x80);
// 0x80 (hexa) correspond à 10000000 en binaire donc allume 1 seule lampe (la GPA7 : broche 28 : bread board : 1)


Wire.endTransmission () ;
delay (2000) ;

}		// fin de la boucle loop

Voici un petit tableau Excel synthétique :

activation d'une seule sortie à la fois sur le port A du MCP 23017

binaire (8 bits)|hexadécimale : 0x…|GPA :
|1 |1 | 0
|10 |2 l 1
|100 |4 l 2
|1000 |8 | 3
|10000 |10 | 4
|100000 |20 | 5
|1000000 |40 | 6
|10000000 |80 | 7

Si vous le souhaitez je vous enverrai directement par mail le fichier Excel qui détail la démarche.

Il me reste notamment à voir comment paramétrer le port B en entrées.
Le but étant qu'une entrée activée par un fin de course mécanique fasse passer le programme à l'étape grafcet suivante (commande de 2 vérins pneumatique) pour ouvrir ou fermer 2 fenêtres.

Bonne année 2024
kezicris

Bonjour,
j'ai besoin de connaitre individuellement l'état des bits du registre des GPIO du port A que j'ai défini en entrées :
Je test 2 méthodes :

Méthode 1 en partant de ce que j'ai trouvé chez Openclassroom : Developpez en C pour l'embarqué
Je n'arrive pas à récupérer les valeurs de ce registre en utilisant les masques :
Dans cette explication mask est un mot clé du langage ou une variable ? j'ai essayé les 2 en vain. SVP, Que signifie : fd_mask ?
comment faut-il faire ?

Tester un bit

Les opérateurs bit-à-bit peuvent aussi servir pour tester la valeur d’un bit dans un registre. Pour cela, il faut créer un masque en mettant à 0 tous les bits qui n’ont pas d’intérêt pour le test à faire, puis l’utiliser avec l’opérateur bit-à-bit ET.

Prenons un exemple : supposons que vous avez une valeur value égale à b7 b6 b5 b4 b3 b2 b1 b0 et que vous voulez tester si le bit 5 est à 1.

Commencez par préparer un masque avec des 0 partout sauf pour le bit 5, soit

mask = (1 << 5);

et appliquez le à la valeur value avec l’opérateur bit-à-bit ET :

value = value & mask;

Vous obtenez comme résultat 0 0 b5 0 0 0 0 0, ce qui représente une valeur équivalente à vraie si b5 vaut 1 et faux si b5 vaut 0.

Vous pouvez ainsi utiliser le résultat de l’opération directement comme condition d’un test. Par exemple

if ( value & (1 << 5) ) {
    ...
}

permet de tester si le bit 5 de value est à 1 et

if !( value & (1 << 5) ) {
    ...
}

s’il est à 0.

Méthode 2 en utilisant la somme totale de la variable : inputs
cela fonctionne : je récupère des valeurs cohérentes.
Par contre, je ne vois pas comment faire pour, à partir d'une somme retrouver une par une toutes les entrées activées.
Existe-t-il une méthode ou un outil mathématique pour cela ?

voici mon code concernant que les entrées :

// Projet carte extension MCP 23017

// allume 4 leds sur GPIOA puis les 4 autres de GPIOA en boucle
// allume une led à la fois
// passe par les registres

// test des entrées par 2 méthodes différentes
// méthode 1 : masque : non ok   pourquoi ?
// méthode 2 : somme en décimale : ok

#include <Arduino.h>
#include <Wire.h >
#include <String.h>                 // chaine de caractères
#include <Adafruit_I2CDevice.h>  // protocole I2C
#include <SPI.h>                 // Serial Peripheral Interface : protocole SPI
#include <Adafruit_Sensor.h>        // capteurs température et humidité
#include <DHT.h>                    // capteurs température et humidité
#include <Adafruit_GFX.h>           // écran OLED 0.96 pouce
#include <Adafruit_SSD1306.h>       // écran OLED 0.96 pouce
#include <Adafruit_TestBed.h>     // pour connaitre les adresses de la carte d'extension mcp23017 et de l'écran

byte inputs = 0;    // byte : octet

// servira pour tester les entrées à 1
// int mask0 = 0;
// int mask1 = 0;
// int mask2 = 0;
// int mask3 = 0;
// int mask4 = 0;
// int mask5 = 0;
// int mask6 = 0;
// int mask7 = 0;
// int mask8 = 0;

void setup ()
{

Serial.begin(115200);   // pour visualiser le moniteur série

Wire.begin() ;		// reveille le bus I2C
// définit les broches d’E/S sur les sorties
Wire.beginTransmission (0x20) ;
Wire.write (0x00) ;		// IODIRA register
Wire.write (0x00) ;		// définit tout le port A sur les sorties (output)
Wire.endTransmission () ;

// définit les broches d’E/S sur les entrees

// Serial.printf ("sortie du setup    \r") ; 
// delay (3000);
}

void loop()   // entre dans la boucle principale
{

// informations venant des entrees : boutons ou fins de courses

  Wire.beginTransmission (0x20) ;
  Wire.write (0x13) ;             // set MCP 23017  memory pointer to GPIOB adress  // banque d’adresses B
  Wire.endTransmission () ;

  Wire.requestFrom (0x20,1);  // request 1 byte of data from MCP 23017
  // Wire.requestFrom (0x13,1);  // voir essai avec 0x13 : erreur

  inputs = Wire.read ();      // store the incoming byte into "inputs" soit 1 octet de 8 bits

  // voir Openclassroom : Développez en C pour l'embarqué : Tester si un bit est à 1

/*  bit 0 Instable
mask = (1<<0);    // bit 0 : GPB0 : broche 1 : bread board : 1
inputs = inputs & mask ;
if (ValeurInputs & (1<<0))
  {
    printf ("Le bit 0 (GPB0, broche 1) est à 1  ");
    delay (100);
  }
*/

/* bit 1 Instable
mask = (1<<1);    // bit 1 : GPB1 : broche 2 : bread board : 2
inputs = inputs & mask ;
if (inputs & (1<<1))
  {
    printf ("Le bit 1 (GPB1, broche 2) est à 1  ");
    delay (2000);
  }
*/

delay(1000);
fd_mask   // correspond à : typedef unsigned long
          // dans select.h : typedef	struct _types_fd_set
          // fd_mask permet que mask soit reconnu
mask = (1<<2);    // bit 2 : GPB2 : broche 3 : bread board : 3
inputs = inputs & mask ;                  // sur toutes les entrees
if (inputs & (1<<2))              // 
  {
    printf ("Le bit 2 (broche 3) est à 1  ");
    delay (2000);
  }


// fd_mask   erreur car déclaration en doublon
mask = (1<<3);    // bit 3 : GPB3 : broche 4 : bread board : 4
inputs = inputs & mask ;     // essayer avec la variable inputs
if (inputs & (1<<3))
  {
    printf ("Le bit 3 (GPB3, broche 4) est à 1  ");
    delay (2000);
  }

/*
// fd_mask
mask = (1<<4);    // bit 4 : GPB4 : broche 5 : bread board : 5
inputs = inputs & mask ;
if (inputs & (1<<4))
  {
    printf ("Le bit 4 (GPB4, broche 5) est à 1  ");
    delay (2000);
  }

// fd_mask
mask = (1<<5);    // bit 5 : GPB5 : broche 6 : bread board : 6
inputs = inputs & mask ;
if (inputs & (1<<5))
  {
    printf ("Le bit 5 (GPB5, broche 6) est à 1  ");
    delay (2000);
  }

// fd_mask
mask = (1<<6);    // bit 6 : GPB6 : broche 7 : bread board : 7
inputs = inputs & mask ;
if (inputs & (1<<6))
  {
    printf ("Le bit 6 (GPB6, broche 7) est à 1  ");
    delay (2000);
  }

// fd_mask
mask = (1<<7);    // bit 7 : GPB7 : broche 8 : bread board : 8
inputs = inputs & mask ;
if (inputs & (1<<7))
  {
    printf ("Le bit 7 (GPB7, broche 8) est à 1  ");
    delay (2000);
  }
*/
Serial.printf ("%d                                  ",inputs) ; 
// renvoie toujours 0 alors que ça marche dans la méthode 2 ... pourquoi ?
// pendant 3 cycles à trouver la valeur 4 (normale) puis est revenue en permanence à 0
//delay(2000);



// méthode 2 : somme en décimale : ok
/*
  if (inputs>0)
    {

    Serial.printf ("%d  ",inputs) ; 
    // inputs : affiche la somme des valeurs des entrées en decimale : OK
    delay(2000); 
*/
Wire.endTransmission () ;

}		// fin de la boucle loop

voir aussi le fichier joint Excel :
J'ai cliquer sur le bouton téléchargé, sélectionné le fichier et fait ouvrir mais j'ai l'impression que ça n'importe pas le fichier ...
Merci d'avance
Bonne soirée

Attention inputs n'est plus égal à wire.read()

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.