C'est quand même bizarre cette histoire, car quand je regarde sur le github du Core ESP8266, je trouve la bibliothèque Wire qui a bien une méthode onReceive, illustrée par un exemple.
Est-ce que tu peux :
Vérifier que tu as bien la même version de cette bibliothèque ? Elle est ici : Arduino/libraries/Wire at da6ec83b5fdbd5b02f04cf143dcf8e158a8cfd36 · esp8266/Arduino · GitHub
Vérifie par exemple le contenu des fichiers pour voir si c'est la même chose que celle de ton PC (par exemple le fichier C:\Users\Dominique\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\Wire/Wire.h).
Au besoin l'installer quelque part, si ce n'est pas la même (pas forcément facile à faire)
La com I2C entre 2 ESP8266 fonctionne depuis la version 2.5.0 du core ESP8266 (2019). Donc, ça marchera peut-être si tu le mets à jour dans le gestionnaire de cartes de l'IDE.
J'ajoute : même si ce paramètre n'est pas utilisé, comme dans ton exemple précédent :
void receiveEvent(size_t howMany) {
(void) howMany;
while (1 < Wire.available()) { // loop through all but the last
char c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
}
int x = Wire.read(); // receive byte as an integer
Serial.println(x); // print the integer
}
Voici le code Mega 2560 Pro mini (master) et le code simplifié du NodeMCU (slave)
//----------------------------------------------------------------------------------------------------------
// H A R D W A R E - M E G A
//
// Communication I2C (Master)
// Rev: 1.0
//
//
//----------------------------------------------------------------------------------------------------------
//
// SDA 20
// SCL 21
//
//----------------------------------------------------------------------------------------------------------
// 0 1 - S E T U P
// 0 2 - L O O P
//----------------------------------------------------------------------------------------------------------
#include <Wire.h>
#define PAYLOAD_SIZE 2
#include <LiquidCrystal.h> // Afficheur
LiquidCrystal lcd(26, 25, 24, 23, 22, 19);
const int16_t I2C_SLAVE = 0x0B;
//----------------------------------------------------------------------------------------------------------
// V A R I A B L E S
//----------------------------------------------------------------------------------------------------------
byte i;
byte j;
char Dat[15];
byte OldDataA = 254;
byte OldDataB = 254;
byte DataA = 0;
byte DataB = 0;
byte Data;
byte Row; // Aff
byte Zon; // Aff
byte Val; // Aff
byte Pos; // Aff
byte Bit_Dat; // Aff
int Compteur;
byte Valid = 0;
byte Act = 9;
byte Count = 0;
//----------------------------------------------------------------------------------------------------------
// 0 1 - S E T U P
//----------------------------------------------------------------------------------------------------------
void setup()
{
Wire.begin();
Serial.begin (57600);
Serial.println ("Mega Master");
delay (1000);
lcd.begin(15, 2); // utilisation d'un écran 16 colonnes et 2 lignes
delay(10);
for (byte j = 32; j <= 47;) // Pins zones INPUT
{
pinMode(j, INPUT);
j++;
}
pinMode(18, OUTPUT); // Retro
digitalWrite(18, HIGH); // Retro ON
Compteur = 0;
}
//----------------------------------------------------------------------------------------------------------
// W I R E T R A N S M I T
//----------------------------------------------------------------------------------------------------------
void Wire_Trabsmit()
{
Count++;
Wire.beginTransmission(I2C_SLAVE);
Wire.write(Data);
Serial.print(F("sending value : "));
Serial.println(Data);
if (Count == 3)
{
Serial.println("");
Count = 0;
}
Wire.endTransmission();
}
//----------------------------------------------------------------------------------------------------------
// D A T A A - C O N S T R U C T I O N - A F F I C H A G E
//----------------------------------------------------------------------------------------------------------
void CA_Data()
{
i = 0;
for (j = 32; j <= 39;)
{
Dat[i] = digitalRead(j) << i;
DataA = Dat[7] | Dat[6] | Dat[5] | Dat[4] | Dat[3] | Dat[2] | Dat[1] | Dat[0];
j++;
i++;
delay(10);
}
if (DataA != OldDataA)
{
digitalWrite(18, HIGH); // Retro ON
Valid = 1;
Compteur = 0;
Pos = 8; //Position curseur
Bit_Dat = 0; //Numero Bit
Zon = 0;
while (Bit_Dat <= 7)
{
Val = bitRead(DataA, Bit_Dat);
lcd.setCursor(Pos, 0);
if (Val == 0)
{
lcd.print("-");
}
else
{
lcd.print(Zon, HEX);
}
delay(1);
Pos = Pos + 1;
Bit_Dat = Bit_Dat + 1;
Zon = Zon + 1;
}
OldDataA = DataA;
}
i = 8;
for (j = 40; j <= 47;)
{
Dat[i] = digitalRead(j) << i - 8;
DataB = Dat[15] | Dat[14] | Dat[13] | Dat[12] | Dat[11] | Dat[10] | Dat[9] | Dat[8];
j++;
i++;
delay(10);
}
if (DataB != OldDataB)
{
digitalWrite(18, HIGH); // Retro ON
Valid = 1;
Compteur = 0;
Zon = 8;
Pos = 8; //Position curseur
Bit_Dat = 0; //Numero Bit
while (Bit_Dat <= 7)
{
Val = bitRead(DataB, Bit_Dat);
lcd.setCursor(Pos, 1);
if (Val == 0)
{
lcd.print("-");
}
else
{
lcd.print(Zon, HEX);
}
delay(1);
Pos = Pos + 1;
Bit_Dat = Bit_Dat + 1;
Zon = Zon + 1;
}
OldDataB = DataB;
}
}
//----------------------------------------------------------------------------------------------------------
// L O O P
//----------------------------------------------------------------------------------------------------------
void loop()
{
CA_Data();
if (Valid == 1)
{
Data = DataA;
Wire_Trabsmit();
delay(1000);
Data = DataB;
Wire_Trabsmit();
delay(1000);
Data = Act;
Wire_Trabsmit();
delay(2000);
Valid = 0;
}
delay(200);
Compteur++;
if (Compteur == 100)
{
digitalWrite(18, LOW); // Retro OFF
}
}
//----------------------------------------------------------------------------------------------------------
// H A R D W A R E - N O D E M C U - R E C E P T E U R
//
// Communication I2C
// Rev: 1.0
//
//
//----------------------------------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------------------------------
// 0 2 - S E T U P
// 0 3 - L O O P
//----------------------------------------------------------------------------------------------------------
#include <Wire.h>
#define SDA_PIN D1
#define SCL_PIN D2
const int16_t I2C_SLAVE = 0x0B;
//----------------------------------------------------------------------------------------------------------
// V A R I A B L E S
//----------------------------------------------------------------------------------------------------------
byte DataA;
byte DataB;
int Data;
byte Act;
byte Count = 0;
byte Val;
int n = 0;
int numBytes;
//----------------------------------------------------------------------------------------------------------
// 0 1 - R E C E I V E E V E N T S
//----------------------------------------------------------------------------------------------------------
void receiveEvents (size_t howMany)
{
(void) howMany;
Serial.println ("OK");
}
//----------------------------------------------------------------------------------------------------------
// 0 2 - S E T U P
//----------------------------------------------------------------------------------------------------------
void setup()
{
Wire.begin(SDA_PIN, SCL_PIN, I2C_SLAVE);
Serial.begin (9600);
Serial.println ("");
Serial.println ("NodeMCU Esclave");
Serial.println ("");
Wire.onReceive(receiveEvents);
}
//----------------------------------------------------------------------------------------------------------
// 0 2 - L O O P
//----------------------------------------------------------------------------------------------------------
void loop()
{
delay(10);
}