ds18b20

bonjour

j aimerais savoir comment programmer 2 ds18b20 un sur la broche 4 et l'autre sur la broche 5 de ma carte arduino mega

pourquoi cette solution? ne plus avoir de problème adressage de sonde ( 1 sonde / broche )

est ce possible?

merci d'avance

Le one-wire permet d'utiliser facilement une seule pin, qu'est ce que tu as comme problème d'adressage ?

salut

j'aimerais utiliser des ds18b20 pour leur précision , prix , et la version étanche.

le but d'avoir une sonde par broche est la possibilité de ne pas a avoir a reprogrammer l'arduino si je change une sonde hs par une autre.

merci d'avance

mike201085:
salut

j'aimerais utiliser des ds18b20 pour leur précision , prix , et la version étanche.

le but d'avoir une sonde par broche est la possibilité de ne pas a avoir a reprogrammer l'arduino si je change une sonde hs par une autre.

merci d'avance

Bonjour
je ne comprend pas bien ton probleme
tu veux faire du skip rom ?

Admettons le besoin

Qu'est-ce qui t'empêche d'instancier deux objets bus 1Wire, sur deux pins distinctes ?

#include <OneWire.h>
OneWire sonde1(4);
OneWire sonde2(5);

...

Cela ne marche pas ?

je suis très débutant ds le domaine de la programmation du ds18b20 ou plutôt en onewire.

j'ai essayé du genre

#include <OneWire.h>

byte data[12];
byte adresse[8];

float sonde1=0;
float sonde2=0;


OneWire sonde1(4);
OneWire sonde2(5);

void setup() {

Serial.begin(115200);

}
void loop(){
  
  sonde1=??????????????????
  sonde2=????????????????

apres je ne vois plus comment faire la différence entre les 2 broches et la facon simple de demander la prise de mesure au capteur.

Rapidos, quelques lignes à tester (pas compilé, mais donne un exemple de ce à quoi je pensais)

#include <OneWire.h>

OneWire bus_sonde1(4);
OneWire bus_sonde2(5);

uint8_t adresse_sonde1[8];
uint8_t adresse_sonde2[8];

void initialiserSonde1()
{
  if (!bus_sonde1.search(adresse_sonde1))
  {
    Serial.println("Sonde 1 absente");
    bus_sonde1.reset_search();
    return;
  }

  bus_sonde1.reset_search();

  if (OneWire::crc8(adresse_sonde1, 7) != adresse_sonde1[7])
  {
    Serial.println("Identifiant sonde 1 invalide");
    return;
  }

  if (adresse_sonde1[0] != 0x28)
  {
    Serial.println("Le composant sonde 1 n'est pas un DS18B20");
    return;
  }

  Serial.println("Sonde 1 trouvee");
}

void initialiserSonde2()
{
  if (!bus_sonde2.search(adresse_sonde2))
  {
    Serial.println("Sonde 2 absente");
    bus_sonde2.reset_search();
    return;
  }

  bus_sonde2.reset_search();

  if (OneWire::crc8(adresse_sonde2, 7) != adresse_sonde2[7])
  {
    Serial.println("Identifiant sonde 2 invalide");
    return;
  }

  if (adresse_sonde2[0] != 0x28)
  {
    Serial.println("Le composant sonde 2 n'est pas un DS18B20");
    return;
  }

  Serial.println("Sonde 2 trouvee");
}

uint16_t lectureSonde1()
{//retourne la température relevée en seizièmes de degrés
  uint8_t data[9];
  uint8_t i;

  bus_sonde1.reset();
  bus_sonde1.select(adresse_sonde1);
  bus_sonde1.write(0x44,1); 
  delay(750);

  bus_sonde1.reset();
  bus_sonde1.select(adresse_sonde1);
  bus_sonde1.write(0xBE);

  for (i=0; i<9; i++) data[i] = bus_sonde1.read();
  
  if (OneWire::crc8(data, 8) != data[8])
  {
    return 0;
  }
  else
  {
    return ((uint16_t) data[1] << 8) | data[0];
  }
}

uint16_t lectureSonde2()
{//retourne la température relevée en seizièmes de degrés
  uint8_t data[9];
  uint8_t i;

  bus_sonde2.reset();
  bus_sonde2.select(adresse_sonde2);
  bus_sonde2.write(0x44,1); 
  delay(750);

  bus_sonde2.reset();
  bus_sonde2.select(adresse_sonde2);
  bus_sonde2.write(0xBE);

  for (i=0; i<9; i++) data[i] = bus_sonde2.read();
  
  if (OneWire::crc8(data, 8) != data[8])
  {
    return 0;
  }
  else
  {
    return ((uint16_t) data[1] << 8) | data[0];
  }
}

void setup()
{
  Serial.begin(9600);
  initialiserSonde1();
  initialiserSonde2();
}

void loop()
{
  Serial.print("temperature sonde 1 : ");
  Serial.print((float) 0.0625 * lectureSonde1());
  Serial.write(176);
  Serial.write('C');
  Serial.println();
  Serial.print("temperature sonde 2 : ");
  Serial.print((float) 0.0625 * lectureSonde2());
  Serial.write(176);
  Serial.write('C');
  Serial.println();
  Serial.println();
  delay(5000);
}

Edit : quelques parenthèses plus tard, ça compile

il n'y a qu'un mot

BRAVO

je continu dans mon projet de régulation de chaudière bois / électrique avec par la suite gestion de la vmc double flux

pour info est ce que tu pourrai me dire ou mettre la résistance entre le vcc et le data ( au plus près de la sonde ou de l'arduino?

mike201085:
pour info est ce que tu pourrai me dire ou mettre la résistance entre le vcc et le data ( au plus près de la sonde ou de l'arduino?

tu mets la 4.7K? où c'est le plus simple pour toi, ce n'est qu'une R de tirage, de toutes façons si tu travaille en parasitic power (2 fils) tu n'a pas vraiment le choix

pour l'instant 4 sonde de branché

je me tourne vers vous pour savoir si il y a un moyen de mesurer une fréquence d'impulsion d'un débitmètre (flowmeter water)?

BUT:
mesurer une puissance thermique réelle dissipé par la chaudière debit *( delta T° départ retour)= puissance

Si tu as juste une sortie impulsionnelle (après tout dépend la fréquence évidemment mais je ne pense pas que ça dépasse le khz) rien de plus simple, il s'agit d'une "banale" lecture digitale.

Après il te faudra peut-être conditionner le signal pour l'adapter aux tensions/fréquence de l'Atmega mais rien de bien compliqué.

Quand tu parle de conditionner le signal tu parle de en faire quoi? Est ce que tu a un exemple de code ?

L'impulsion est de 5v et niveau fréquence je suis d'accord avec toi pas de khz .