Bonjour,
Je communique entre un ESP8266 ESP01 et un DHT12 (Capteur température) en I2C.
C'est la première fois que j'utilise l'I2C.
Je ne comprend pas comment un peut atteindre une adresse en particulier avec les fonctions disponibles!
C'est à dire, comment lire l'adresse 100 d'un esclave x?
Obligé de lire les 100 première adresses ?
Wire.requestFrom(x, 101)
Si on lance une 2e requête, (Wire.requestFrom(x, 100)), la lecture reprend à l'adresse 0 ou 100?
Comment fait on pour reprendre à l'adresse 0?
C'est questions car je communique bien avec mon capteur, mais les données sont bonnes uniquement à la première requête (a chaque reboot du capteur/esp8266), les données suivantes sont incohérentes. Il semblerai que j’accède au données suivantes dans le capteur.
Vérification faite, la bibliothèque que tu as indiquée répond bien à ce principe.
Extrait du cpp :
int DHT12::_readSensor()
{
// GET CONNECTION
Wire.beginTransmission(DHT12_ADDRESS);
Wire.write(0);
int rv = Wire.endTransmission();
if (rv < 0) return rv;
// GET DATA
const uint8_t length = 5;
int bytes = Wire.requestFrom(DHT12_ADDRESS, length);
if (bytes == 0) return DHT12_ERROR_CONNECT;
if (bytes < length) return DHT12_MISSING_BYTES;
for (int i = 0; i < bytes; i++)
{
bits[i] = Wire.read();
}
return bytes;
}
Visiblement, on se positionne à l'adresse 0 de l'esclave, puis on lit 5 octets.
Soyons clair : la bibliothèque ne se limite pas au seul fichier Wire.h. Il y a obligatoirement un fichier c ou cpp associé car c'est lui qui fait le travail.
Il se trouve que la "bibliothèque" Wire fait partie intégrante de l'IDE et que le seul fait d'écrire #include <Wire.h> suffit pour l'IDE comprenne et fasse le travail.
Si tu es habitué aux PIC et à la programmation orienté objet tu devrais comprendre le mécanisme Arduino.
La classe qui gère l'IDE est la classe "Two-Wire". Dans cette classe est instancié un objet Wire.
Il se trouve que le fichier h ne porte pas le nom de la classe mais celui de l'objet. C'est plus simple pour quelqu'un qui ne cherche pas à voir ce qu'il y a sous le capot, c'est perturbant dans le cas contraire.
En réalité tu manipules un objet pré-instancié par les auteurs de la classe. Je pense que cela a été fait pour simplifier, toutes les bibliothèques utilisant le même nom de l'objet, que de toute façon il fallait "créer" .
Les adresses à fournir sont sous 7 bits et se trouvent dans les datasheets des composants, la classe Two-Wire complète automatiquement cette adresse avec un 8eme bit qui indique si c'est une lecture ou une écriture.
PS : il existe des programmes "scanner I2C" pour carte arduino. C'est utile pour vérifier les adresses et pour contrôler que tous les composants I2C sont bien reliés et reconnus.