[Arduino] Communiquer sur le bus I2C (TWI) grâce à la bibliothèque WIRE.

แชร์
ฝัง
  • เผยแพร่เมื่อ 15 พ.ย. 2024

ความคิดเห็น • 5

  •  3 ปีที่แล้ว +3

    Le code final :
    #include
    const uint8_t RTCAdresse = 0x68;
    void setup() {
    Serial.begin(9600);
    Serial.println("Récupération et changement valeurs registres RTC.");
    // Initialise la librairie I2C.
    Wire.begin();
    // Changement de la valeur d'un registre.
    // 1) On crée un tableau contenant les deux données à écrire via le bus I2C (numéro du registre et nouvelle valeur pour le registre)
    // On store et définit le nombre de donnée à écrire.
    uint8_t nombreDeDonneesAEcrire = 2;
    // On crée un tableau et on y met les deux donnée à écrire.
    uint8_t donneesAEcrire[ nombreDeDonneesAEcrire ] = { 0x09, 0xAA };
    // 2) On exécute la requête d'écriture des deux données.
    i2cMaitre_requeteEcriture(RTCAdresse, donneesAEcrire, nombreDeDonneesAEcrire);
    // Récupération de la valeur d'un registre.
    // 1) On va faire une requête d'écriture pour envoyer à l'esclave le numéro du registre que l'on souhaite récupérer.
    // 1.1) On crée un tableau contenant la donnée à écrire via le bus I2C (numéro du registre à lire)
    // On stoque le nombre de donnée à lire.
    nombreDeDonneesAEcrire = 1;
    // On crée un tableau et on y met le donnée à écrire.
    donneesAEcrire[ nombreDeDonneesAEcrire ] = { 0x09 };
    // 1.2) On on exécute la requête d'écriture.
    uint8_t writeResult = i2cMaitre_requeteEcriture(RTCAdresse, donneesAEcrire, nombreDeDonneesAEcrire);
    // 2) On va faire une requête de lecture pour récuprer la valeur du registre de l'esclave.
    // 2.1) On crée un tableau que l'on va utiliser pour stoquer la donnée à lire le bus I2C (numéro du registre à lire)
    // On stoque le nombre de donnée à lire.
    const uint8_t nombreDeDonneesALire = 1;
    // On déclare le tableau que l'on va utiliser pour stoquer la donnée lue.
    const uint8_t bufferReception[ nombreDeDonneesALire ];
    // 2.2) On execute la requête de lecture sur le bus I2C.
    i2cMaitre_requeteDeLecture(RTCAdresse, bufferReception, nombreDeDonneesALire);
    Serial.print("Valeur du registre = ");
    Serial.println(bufferReception[ 0 ], HEX);
    }
    void loop() {
    // put your main code here, to run repeatedly:
    }
    uint8_t i2cMaitre_requeteEcriture(const uint8_t adresseEsclave, uint8_t *donneesAEnvoyer, const uint8_t nombreDeDonneeAEnvoyer) {
    // 1) On configure la librarie Wire (I2C) de l'arduino pour faire une écriture de données.
    // On donne l'adresse de l'esclave à la librarie.
    Wire.beginTransmission(adresseEsclave);
    // Pour chaque donnée à écrire.
    for(uint16_t indiceDonnee = 0; indiceDonnee < nombreDeDonneeAEnvoyer; indiceDonnee++) {
    // On donne à la librairie la donnée suivante à écrire.
    Wire.write( donneesAEnvoyer[ indiceDonnee ] );
    }
    // 2) On demande à la librairie d'envoyer la requête d'écriture sur le bus I2C.
    // On envoie la requête sur le bus I2C et on reçoit le résultat de la transmission.
    uint8_t resultatTransmission = Wire.endTransmission();
    // DEBUG
    Serial.print("\tI2C, Resultat transmission = ");
    Serial.println(resultatTransmission);
    // /DEBUG
    // Retourne le résultat de la transmission.
    return resultatTransmission;
    }
    void i2cMaitre_requeteDeLecture(uint8_t adresseEsclave, uint8_t *bufferPourStoquerDonnneesRecues, uint8_t nombreDeDonneeARecevoir) {
    // 1) On utilise la librarie Wire (I2C) de l'arduino pour faire une requête de lecture de données sur le bus I2C.
    // On donne l'adresse de l'esclave et le nombre de donnée à lire. La librarie fait la requête de lecture et revoie le nombre de donnéees lues.
    const uint8_t nombreDeDonneesRecues = Wire.requestFrom(adresseEsclave, nombreDeDonneeARecevoir);
    // 2) On copie les données lues dans notre buffer.
    // Pour chaque donnée recue.
    for(int numeroDonneeRecue = 0; numeroDonneeRecue < nombreDeDonneesRecues; numeroDonneeRecue++) {
    // On récupère la donnée à cette position.
    const uint8_t donneeRecue = Wire.read();
    // On copie la donnee recue dans le buffer de reception.
    bufferPourStoquerDonnneesRecues[ numeroDonneeRecue ] = donneeRecue;
    // DEBUG
    Serial.print("\tI2C, Donnée reçue = ");
    Serial.println(donneeRecue, HEX);
    // /DEBUG
    }
    }

  • @mohamedibnoualibenomar3975
    @mohamedibnoualibenomar3975 2 ปีที่แล้ว +1

    excellente explication merci beaucoups de tes efforts qui facilitent la comprehension de I'electronique.je souhaite que vous continuer ,merci infiniment

  • @vas-yguitare7095
    @vas-yguitare7095 2 ปีที่แล้ว +1

    Merci !!

  • @Dontbeabadguy
    @Dontbeabadguy 2 ปีที่แล้ว +1

    Bonjour, y a t'il un endroit pour vous contacter pour des questions sur des capteurs Arduino et idée de projet ? Car je ne sais pas vers quels capteurs m'orienter

    •  2 ปีที่แล้ว

      Bonjour. Vous pouvez posez vos questions en réponse à ce commentaire.