[RESOLU]Wire.h Fonction de lecture disponible

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.

Merci

Salut

Pourquoi n'utilises-tu pas une librairie DHT ?
Il y a des exemples dont tu peux t'inspirer.

@+

Effectivement je viens de trouver une libraire spécifique au DHT12

Je viens de regarder le code et je pense comprendre le mécanisme.
Je ferai des essais ce soir.

Merci

Bonjour

Très souvent, les esclaves I2C (eeprom, sonde, capteur, RTC, etc.) fonctionnent de la manière ci-dessous :

L'esclave dispose d'une mémoire interne, contenant des informations à des emplacements bien précis documentés dans le datasheet.

L'esclave dispose également d'un curseur = pointeur d'adresse interne

Lorsque le maître écrit à l'esclave, le ou les premiers octets transmis servent à définir la valeur du pointeur d'adresse.

Ainsi par exemple, les accès en lecture ressemblent souvent à :

  1. un Wire.write pour que l'esclave positionne son registre interne à l'adresse désirée
  2. un Wire.requestFrom pour lire n octets à partir de cette adresse

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.

Tu peux également utiliser la librairie telle quelle.
Pourquoi vouloir la ré-écrire ?

@+

J'ai bossé tout le week-end sur mon projet et je n'ai jamais trouvé cette librairie!!!??
Je viens simplement de la trouver aujourd'hui...

Je vais donc l'utiliser.

Par contre, du coup, je voulais aussi comprendre le mécanisme I2C (wire.h), car habitué à dialoguer avec mes PIC en I2C, je ne comprenais pas.

C'est plus clair maintenant.

Merci

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.

Effectivement, ça fonctionne !

Merci à tous