Go Down

Topic: lire capteur I2C (Read 162 times) previous topic - next topic

Thea

Bonjour à tous,

Je possède un capteur à température infrarouge MLX90614 qui marche en I2C et une Arduino Nano et j'aimerais lire la valeur de la température sur mon port série.
J'ai vu qu'il faudrait utiliser la librairie Wire mais je n'arrive pas à comprendre comment faire.
Mon capteur et en adresse 0xA5 donc en décimal 165.

Le code que j'utilise :
Code: [Select]
#include <Wire.h>

void setup() {

  Wire.begin();       
 
  Serial.begin(9600);

}

void loop() {

  Wire.requestFrom(165, 2);    // request 6 bytes from slave device #0xA5

  while (Wire.available()) { // slave may send less than requested
    char c = Wire.read(); // receive a byte as character
    Serial.print(c);         // print the character
  }

  delay(500);
}


Je sais que c'est basique mais pas de données reçues ....

hbachetti

Tu ne vas pas t'emmerder à réécrire le monde de A à Z ?
Simplifie-toi l'existence.
Il y a des librairies pour pratiquement tous les modules qui existent sur le marché :

https://github.com/adafruit/Adafruit-MLX90614-Library

Avec un exemple de sketch siouplait

C'est pas beau la vie ?
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

68tjs

Quote
Tu ne vas pas t'emmerder à réécrire le monde de A à Z ?
Certes non, mais comprendre au moins une seule fois comment  utiliser l'I2C peut rendre service.

Exemple avec une DS3231.
Pourquoi une DS3231? Parce que selon l'utilisation faite de cette tocante les bibliothèques peuvent être des mastodontes et certaines obligent à récupérer la totalité des informations alors qu'une ou deux info sont utiles à l'application, d'où un gaspillage de ram.

Exemple pour lire uniquement les minutes.
Note importante : le DS3231 utilise le codage "décimal codé binaire" (BCD). Je ne m'en occupe pas ici, je ne montre pas comment faire une bibliothèque pour le DS3231 mais seulement comment dialoguer en I2C.

Info tirées de la datasheet du DS3231 :
  • Adresse du DS3231 : 0x68
  • Adresse du registre des minutes : 0x01


              Ordres                                                            Explications                    
Wire.beginTransmission(0x68); Fait commuter l'étage push-pull des broches A4 et A5 en mode collecteur ouvert.
Initie une transaction I2C sur le capteur d'adresse 0x68
.
Wire.write(0x01);Indique à l'esclave que son registre 0x01 va être concerné par une opération d'écriture ou de lecture
.

Wire.endTransmission();

Clos la phase où le maître prévient l'esclave de sa demande.
.
Wire.requestFrom(0x68,1)Le maître passe à la phase "réalisation de la demande".
A partir du moment où on utilise Wire.requestFrom  l'esclave comprends que l'opération demandée est une lecture.
Le chiffre 1 indique à l'esclave le nombre de registres consécutifs à lire à partir de l'adresse registre précédemment indiquée.
Ici on ne va lire qu'un seul registre.
.

Lecture = Wire.read();

On lit le contenu de l'octet et on affecte sa valeur dans une variable.
.


Variante : on peut lire plusieurs registres consécutifs :
Seconde = registre 0x00            
Minutes = registre  0x01


             Ordre                           Explications
Wire.requestFrom(0x68,2);              On spécifie qu'on veux lire 2 registres consécutifs à partir de celui qui a été précédemment indiqué et que l'on lira séquentiellement dans une boucle for
.
for (r=0;r<2; r++) Boucle for.
.
{Lecture[r]  = Wire.read();}On affecte séquentiellement les lecture à une variable.
.


Écrire une valeur dans un registre.
Exemple mise à l'heure des minutes dans le DS3231 :
Prérequis : les minutes ont été préalablement mise en forme avec la conversion décimal vers BCD
La variable de type byte (ou uint8_t c'est la même chose)  qui reçoit cette mise en forme se nomme : minutes_bcd.
 
                     Ordres                                                              Explications    
Wire.beginTransmission(0x68)     Fait commuter l'étage push-pull des broches A4 et A5 en mode collecteur ouvert.
Initie une transaction I2C sur le capteur d'adresse 0x68
.
 Wire.write(0x01);Indique à l'esclave que son registre 0x01 va être concerné par une opération d'écriture ou de lecture.
.
Wire.write(minutes_bcd);L'esclave comprend qu'il doit placer le contenu minutes_bcd dans le registre précédemment sélectionné.
.
Wire.endTransmission();L'esclave est libéré.
.





Go Up