Problème de Callback sur escalve I2C (utilisation de la bibliotheque Wire)

Bonjour/bonsoir,

Je suis actuallement sur un projet en classe (BTS informatique) et je dois à ce moment faire communiquer deux arduinos (mega 2560). Rien de bien compliqué quand on utilise les exemples fournis dans la librairie Wire, seulement, dans mon cahier des charges, il est spécifié que je dois séparer le code en .cpp et .h.

C’est ici que ca se complique:

Voici le sketch original et fonctionnel dont je dispose:

I2CSlave.ino

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

int receiveByte = 0;
byte myByteStruct[2];

void setup()
{
  Wire.begin(1);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
  Serial.begin(9600);
}

void loop()
{
 
}

void receiveEvent(int howMany)
{
  while(Wire.available())
  {
    myByteStruct[receiveByte] = Wire.read();
    receiveByte++;
  }
  Serial.println(myByte[0], HEX);
  Serial.println(myByte[1], HEX);
  
  receiveByte=0;
}

void requestEvent()
{
  Wire.write("done");
}

Le but est de le transcrire sous ce format:

I2CSlave.h

#ifndef I2CSlave_H
#define I2CSlave_H

/* I2CSlave.h */

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

class I2CSlave
{
  public:
  I2CSlave();
  void receiveEvent(int howMany);
  void requestEvent();
  void wireOnReceive();
  void wireOnRequest();
  
  private:
  int receiveByte = 0;
  byte myByte[2];
};

#endif

I2CSlave.cpp

/* I2CSlave.cpp */

#include "I2CSlave.h"

I2CSlave::I2CSlave()
{
}

void I2CSlave::receiveEvent(int howMany)
{
  while(Wire.available())
  {
    doseur[receiveByte] = Wire.read();
    receiveByte++;
  }
  Serial.println(doseur[0], HEX);
  Serial.println(doseur[1], HEX);

  receiveByte=0;
}

void I2CSlave::requestEvent()
{
  Wire.write("done");
}

void I2CSlave::wireOnReceive()
{
  Wire.onReceive(receiveEvent);
}

void I2CSlave::wireOnRequest()
{
  Wire.onRequest(requestEvent);
}

Seulement j’obtiens ces erreurs de compilation…

I2CSlave.cpp: In member function ‘void I2CSlave::wireOnReceive()’:
I2CSlave.cpp:29:30: error: no matching function for call to ‘TwoWire::onReceive(<unresolved overloaded function type>)’
   Wire.onReceive(receiveEvent);
                              ^
I2CSlave.cpp:29:30: note: candidate is:
In file included from I2CSlave.h:7:0,
                 from I2CSlave.cpp:3:
/usr/share/arduino/libraries/Wire/Wire.h:66:10: note: void TwoWire::onReceive(void (*)(int))
     void onReceive( void (*)(int) );
          ^
/usr/share/arduino/libraries/Wire/Wire.h:66:10: note:   no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘void (*)(int)’
I2CSlave.cpp: In member function ‘void I2CSlave::wireOnRequest()’:
I2CSlave.cpp:34:30: error: no matching function for call to ‘TwoWire::onRequest(<unresolved overloaded function type>)’
   Wire.onRequest(requestEvent);
                              ^
I2CSlave.cpp:34:30: note: candidate is:
In file included from I2CSlave.h:7:0,
                 from I2CSlave.cpp:3:
/usr/share/arduino/libraries/Wire/Wire.h:67:10: note: void TwoWire::onRequest(void (*)())
     void onRequest( void (*)(void) );
          ^
/usr/share/arduino/libraries/Wire/Wire.h:67:10: note:   no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘void (*)()’

J’ai énormément essayé de comprendre comment ça fonctionnait pour tenter de corriger ces erreurs. J’ai surtout tourné autour des callbacks (car c’est apparement l’élément qui me bloque, corrigez-moi si je me trompe) mais ça n’avance pas du tout.

Si quelqu’un pouvait m’aider ou me renseigner, ça m’avancerait beaucoup.

Merci de votre attention (et de votre temps) !

salut une des erreur vient du fait que tu as deux fois la meme methode de déclaré dans le .h et elle est deux foi implémenté diférament dans le .cpp d'où le "previously defined here"

void wireOnReceive();

donc si tu veux que le systeme puise compilé il faut faire en sorte de pouvoir diférencier les prototype dans le .h

En effet, bien vu, j'ai fait une petite erreur en faisant un copier-coller tout bête.. J'ai édité le premier message en prenant compte de ta remarque.

Il reste maintenant le plus gros problème à résoudre.. Merci encore de ta réponse Heloderma-kris!