Assigner une adresse par index sur sonde DS18b20

Bonjour,

Je n’arrive pas à assigner une adresse manuellement pour un index sur des sondes DS18b20.

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer, outsideThermometer;
float tempInside, tempOutside;

void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
  // Assign address manually. The addresses below will beed to be changed
  // to valid device addresses on your bus. Device address can be retrieved
  // by using either oneWire.search(deviceAddress) or individually via
  // sensors.getAddress(deviceAddress, index)
  //insideThermometer = { 0x28, 0xFF, 0x66, 0x3F, 0x60, 0x16, 0x05, 0xCB };
  //outsideThermometer   = { 0x28, 0xFF, 0x34, 0x09, 0xC0, 0x16, 0x05, 0x6A };

  // Search for devices on the bus and assign based on an index. Ideally,
  // you would do this to initially discover addresses on the bus and then
  // use those addresses and manually assign them (see above) once you know
  // the devices on your bus (and assuming they don't change).
  //
  // method 1: by index
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
  if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");

  // method 2: search()
  // search() looks for the next device. Returns 1 if a new address has been
  // returned. A zero might mean that the bus is shorted, there are no devices,
  // or you have already retrieved all of them. It might be a good idea to
  // check the CRC to make sure you didn't get garbage. The order is
  // deterministic. You will always get the same devices in the same order
  //
  // Must be called before search()
  //oneWire.reset_search();
  // assigns the first address found to insideThermometer
  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");
  // assigns the seconds address found to outsideThermometer
  //if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer");
}

void loop(void)
{
  sensors.requestTemperatures();

  tempInside = (sensors.getTempCByIndex(0));
  Serial.println (tempInside,1);
  tempOutside = (sensors.getTempCByIndex(1));
  Serial.println (tempOutside,1);
  delay(1000);
}

Ce code est un exemple de la librairie Dallas que j’ai modifié.

Si je décommente les lignes qui assignent les adresses à mes sondes manuellement, j’ai une erreur à la compilation :

Arduino : 1.8.12 (Windows 7), Carte : “Arduino Uno”

C:\Users\Eric\Documents\Arduino\Arduino\TEST_Dallas\TEST_Dallas.ino: In function ‘void setup()’:

TEST_Dallas:20:72: error: assigning to an array from an initializer list

insideThermometer = { 0x28, 0xFF, 0x66, 0x3F, 0x60, 0x16, 0x05, 0xCB };

TEST_Dallas:21:75: error: assigning to an array from an initializer list

outsideThermometer = { 0x28, 0xFF, 0x34, 0x09, 0xC0, 0x16, 0x05, 0x6A };

assigning to an array from an initializer list

Je n’arrive pas à trouver la solution… :confused:

comme c’est écrit dans le code posté:

// Assign address manually. The addresses below will need to be changed
// to valid device addresses on your bus. Device address can be retrieved
// by using either oneWire.search(deviceAddress) or individually via

→ on n’invente pas les adresses, elles sont en dur dans vos produits

sinon un tableau ça s’initialise comme cela:const uint8_t insideThermometer[] = { 0x28, 0xFF, 0x66, 0x3F, 0x60, 0x16, 0x05, 0xCB }; ou dans le cas d’un type “DeviceAddress” (qui doit être un tableau aussi)

DeviceAddress insideThermomete = { 0x28, 0xFF, 0x66, 0x3F, 0x60, 0x16, 0x05, 0xCB };

On ne peut le faire comme ça qu’à la définition de la variable. sinon il faut affecter à la main chaque indice

Merci pour cette réponse rapide.

Je sais bien que les adresses sont en dur dans les sondes, mais je veux mettre manuellement dans mon code une adresse à l’index 0 et une autre à l’index suivant.

Dans l’exemple Dallas ça a l’air possible mais je ne comprends pas la méthode décrite dans l.exemple pour y arriver

vous avez essayé un truc comme cela?

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 0x28, 0xFF, 0x66, 0x3F, 0x60, 0x16, 0x05, 0xCB };
DeviceAddress outsideThermometer= { 0x28, 0xFF, 0x34, 0x09, 0xC0, 0x16, 0x05, 0x6A };
float tempInside, tempOutside;

void setup(void)
{
  Serial.begin(115200); // bannir 9600 quand on parle à un PC ou un MAC !
  sensors.begin();
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println(F("pb avec #0"));
  if (!sensors.getAddress(outsideThermometer, 1)) Serial.println(F("pb avec #1"));
...

le type DeviceAddress est défini comme cela: typedef uint8_t DeviceAddress[8];dans la bibliothèque c'est donc bien un tableau d'octets.

Ok je vais tester ça demain

Encore merci pour l’aide

un exemple avec détection des capteurs et enregistrement des adresses en eeprom, avec menu sur un LCD

exemple disponible avec la librairie YASM (dispo dans le gestionnaire de l'IDE)

Bonsoir

@ J-M-L

merci pour l’aide, tout fonctionne comme je le voulais.

pour les 115200, très souvent les exemples sont avec une vitesse de 9600 donc je ne pense pas à changer mais je le ferais à l’avenir.

@ bricofoy

Je vais me pencher plus en détail sur cette solution. Ça m.interesse

Merci

pour les 115200, très souvent les exemples sont avec une vitesse de 9600 donc je ne pense pas à changer mais je le ferais à l'avenir.

oui les exemples datent du temps où les arduino étaient lents... ce n'est plus le cas donc 115200 ou plus c'est sans souci avec un PC