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 } }
excellente explication merci beaucoups de tes efforts qui facilitent la comprehension de I'electronique.je souhaite que vous continuer ,merci infiniment
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.
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
}
}
excellente explication merci beaucoups de tes efforts qui facilitent la comprehension de I'electronique.je souhaite que vous continuer ,merci infiniment
Merci !!
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
Bonjour. Vous pouvez posez vos questions en réponse à ce commentaire.