Communication I2C sonde SEN0546

Bonjour,
J'essaye en vain de faire communiquer un arduino UNO R3 avec une sonde de mesure de température et humidité de vendue par DFRobot, le modèle SEN0546. C'est une sonde qui communique avec le protocole I2C. J'ai utilisé le code Arduino mis à disposition sur leur site (ici) (D'ailleurs il contenait deux erreurs à la compilation, assez étonnant...), mais j'obtiens dans la console toujours la même chose :
temp(C):-40.00 hum(%RH):0.00

En étudiant le code, j'ai vu que
Wire.endTransmission() (ligne 38) renvoi un code erreur différent de 0.

En l'occurrence il prend les valeurs :

  • 2 (received NACK on transmit of address. - selon la doc de Wire), si je met une résistance (4.6 kOhm) entre le fil SDA (jaune) de la sonde et le port SDA (A4 ou SDA) de l'Arduino.
  • 3 (received NACK on transmit of data.), si je relis le fil jaune (SDA) directement à l'Arduino.

J'ai testé avec cette résistance car il est question d'une résistance pull-up dans la datasheet de la sonde, mais j'ai peut-être mal compris ce passage...

Je suis débutant Arduino donc il y a surement quelque chose qui m'échappe. J'espère vous avoir donné toutes les infos pour pouvoir comprendre le problème et m'aider à trouver une solution.

PS : Dernier point, en terme de branchement, j'ai relié :
- Le fil Rouge au 5V côté Arduino
- Le fil Noir au GND
- Le fil Jaune (SDA) à l'entrée A4 (avec ou sans résistance 4.6 kOhm)
- Le fil Blanc (SCL) à l'entrée A5

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ je l'ai déplacé vers le forum francophone pour vous pour cette fois...

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

dans le lien que vous donnez ils disent:

Le bus I2C utilise une ligne de données série (SDA ) et une ligne d'horloge série (SCL ).

Sur la description ils disent que SDA c'est la clock et SDL (qui n'existe pas) ce sont les données...

ça paraît donc un peu foireux...

➜ essayez d'inverser les 2 fils

Merci pour le déplacement du sujet dans la bonne catégorie, et désolé, je ferai plus attention la prochaine fois.

L'inversion des fils ne règle pas le soucis. Le code erreur change cependant en passant de 3 à 2.

Bonjour MorganF

Ces résistances se connectent ainsi:
image

Un outil indispensable, dans ton cas, le scanner i2C, qui te permettra de voir l'adresse i2C de ta sonde, s'il n'indique rien, c'est qu'il y a un problème sur ton bus i2C, alors essaies de croiser SDA et SCL.

Cordialement
jpbbricole

Bonjour Jpbbricole.
Merci pour ton schéma. J'ai testé mais cela n'a pas aidé non plus.

Cependant j'ai enfin trouvé la solution ! :smiley:
En réalité il s'agissait d'une erreur dans le code exemple du revendeur.

Au moment de l'instruction "Wire.write", il fallait écrire dans le registre passait en paramètre de la fonction.

Je met ci-dessous le code qui fonctionne pour lire la sonde. Si vous voulez voir où se situait le problème par rapport à l'exemple du site du revendeur, il faut regarder à la ligne 37 (l'une des deux lignes qui justement comportait une erreur de compilation que j'évoquais rapidement dans mon post d'origine) où il faut écrire :
Wire.write(reg);
au lieu de
Wire.write(®, 1);

Voici le code complet avec les erreurs corrigées (l'autre concernait un typage a corriger dans l'appel à requestFrom l. 42) :

#include "Wire.h"
#define address 0x40
char dtaUart[15];
char dtaLen = 0;
uint8_t Data[100] = {0};
uint8_t buff[100] = {0};
void setup()
{
  Serial.begin(9600);
  Wire.begin();
}
uint8_t buf[4] = {0};
uint16_t data, data1;
float temp;
float hum;
void loop()
{
  readReg(0x00, buf, 4);
  data = buf[0] << 8 | buf[1];
  data1 = buf[2] << 8 | buf[3];
  temp = ((float)data * 165 / 65535.0) - 40.0;
  hum =  ((float)data1 / 65535.0) * 100;
  Serial.print("temp(C):");
  Serial.print(temp);
  Serial.print("\t");
  Serial.print("hum(%RH):");
  Serial.println(hum);
  delay(500);
}
uint8_t readReg(uint8_t reg, const void* pBuf, size_t size)
{
  if (pBuf == NULL) {
    Serial.println("pBuf ERROR!! : null pointer");
  }
  uint8_t * _pBuf = (uint8_t *)pBuf;
  Wire.beginTransmission(address);
  Wire.write(reg);
  if ( Wire.endTransmission() != 0) {
    return 0;
  }
  delay(20);
  Wire.requestFrom((uint8_t)address, (uint8_t) size);
  for (uint16_t i = 0; i < size; i++) {
    _pBuf[i] = Wire.read();
  }
  return size;
}