question sur l i2c et multi adressage

bonjour, j'ai chargé un stagiaire en bts crsa, de me faire un petit programme sur arduino, mais il à l'air de secher, donc je lui cherche des pistes

en gros, un ecran i2c, 2 potard, 2 sondes ds18b20

sur l ecran il doit afficher la temperature lue, et en dessous le target qui est regler au potard, sur le meme ecran les 2 sondes en haut et les 2 targets en bas.

la ou il bloque c est de gerer 2 sondes en même temps, il a trouver un programme qui detecte la sonde tout seul, mais il se demande si c est pas un peu comme un ip dynamique, genre tu demarre, il va decider que sonde 1= adresse 1, et vice versa, et prochain redemarrage les valeurs pourrait etre inversé

il ne sait pas comment lire l'adresse d'une sonde, et faire en sorte qu elle soit fixe et definitive

merci

hello
chaque sonde ds18b21 à une adresse qui lui est propre et définitive

Les sondes ds18b20 ont chacune une adresse unique sur 64 bits. Vous pouvez vous en servir pour les différencier

Un tuto éventuellement ici

Bonjour

Si le stagiaitre accepte de lâcher son smartphone, de consacrer un peu de temps à l'étude de la librairie One_Wire, s'il ose cliquer sur l'exemple "DS18x20_Temperature" il y découvrira : le rececensement des sondes présentes sur le bus, la gestion de leurs adresses et l'interrgogation de chacune d'elles .... appelée par son adresse.
S'il va même jusqu'à câbler correctement l'exemple... il pourra constater que ça fonctionne.
Est-ce "exploiter" un stagiaire en 2019 que de lui suggérer ce travail ?
Est-ce démesuré pour un BTS CRSA ?

Le DS1820 ne s'adresse pas en TWI ..... que va faire le stagiaire s'il lit le titre de ce post? (je sais, je suis gratuitement méchant avec un responsable de stage qui s'inquiète de son stagiaire le jour de l'aScension)

effectivement !!
demander à son stagiaire de gérer en I2C les DS18B20 c'est pas très sympa , même sans multi adressage !!

MAis s’en préoccuper un jour ferié rend des maladresses pardonnables…

lol avec moi y a pas de jour férié

je me suis ramener un ecran i2c et une sonde ds18x20

chose que je maitrise pas,donc on va dire que j ai le meme niveau que lui

je vais essayer de trouver un exemple pour ecrire bla bla sur l ecran

un autre exemple pour lire la valeur de la sonde sur la console

ensuite je transforme cette valeur en variable affichable, je posterai mon code pour correction, car comme d'hab,ba ça marchera pas du premier coup

alors voila ce que j ai fais en bidouillant

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
//----- Adressage matériel -----
// En cas de non fonctionnement, mettez la ligne 8 en
// commentaire et retirez le commentaire à la ligne 9.
LiquidCrystal_I2C lcd(0x27, 20, 4);

/* Broche du bus 1-Wire */
const byte BROCHE_ONEWIRE = A2;
const byte BROCHE_ONEWIRE2 = A3;
#define potard1 A4
#define potard2 A5
int consigne1=0;
int consigne2=0;




/* Code de retour de la fonction getTemperature() */
enum DS18B20_RCODES {
  READ_OK,  // Lecture ok
  NO_SENSOR_FOUND,  // Pas de capteur
  INVALID_ADDRESS,  // Adresse reçue invalide
  INVALID_SENSOR  // Capteur invalide (pas un DS18B20)
};


/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds(BROCHE_ONEWIRE);
 
 
/**
 * Fonction de lecture de la température via un capteur DS18B20.
 */
byte getTemperature(float *temperature, byte reset_search) {
  byte data[9], addr[8];
  // data[] : Données lues depuis le scratchpad
  // addr[] : Adresse du module 1-Wire détecté
  
  /* Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) */
  if (reset_search) {
    ds.reset_search();
  }
 
  /* Recherche le prochain capteur 1-Wire disponible */
  if (!ds.search(addr)) {
    // Pas de capteur
    return NO_SENSOR_FOUND;
  }
  
  /* Vérifie que l'adresse a été correctement reçue */
  if (OneWire::crc8(addr, 7) != addr[7]) {
    // Adresse invalide
    return INVALID_ADDRESS;
  }
 
  /* Vérifie qu'il s'agit bien d'un DS18B20 */
  if (addr[0] != 0x28) {
    // Mauvais type de capteur
    return INVALID_SENSOR;
  }
 
  /* Reset le bus 1-Wire et sélectionne le capteur */
  ds.reset();
  ds.select(addr);
  
  /* Lance une prise de mesure de température et attend la fin de la mesure */
  ds.write(0x44, 1);
  delay(800);
  
  /* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
 
 /* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
   
  /* Calcul de la température en degré Celsius */
  *temperature = (int16_t) ((data[1] << 8) | data[0]) * 0.0625; 
  
  // Pas d'erreur
  return READ_OK;
}
void consignetemp()
{
  consigne1 = 25+(analogRead(potard1)/1000);
  consigne2 = 25+(analogRead(potard2)/1000);
}
 
void setup()
{
 lcd.init(); // initialisation de l'afficheur
  Serial.begin(115200);
}
void loop()
{

  consignetemp();
 lcd.backlight();
 // Envoi du message




   float temperature;
   
  /* Lit la température ambiante à ~1Hz */
  if (getTemperature(&temperature, true) != READ_OK) {
    Serial.println(F("Erreur de lecture du capteur"));
    return;
  }

  /* Affiche la température 1*/
  lcd.setCursor(0, 0);
  lcd.print(F("Temp: "));
  Serial.print(F("Temperature : "));
  lcd.print(temperature, 2);
  Serial.print(temperature, 2);
  lcd.write(176); // Caractère degré
  Serial.write(176); // Caractère degré
  lcd.write('C');
  Serial.write('C');
  Serial.println();

  
  // Affiche la consigne 1
  lcd.setCursor(0, 1);
  lcd.print(F("Target: "));
  Serial.print(F("Target : "));
  lcd.print(consigne1, 2);
  Serial.print(consigne1, 2);
  lcd.write(176); // Caractère degré
  Serial.write(176); // Caractère degré
  lcd.write('C');
  Serial.write('C');
  Serial.println();

 

  
}

j’affiche la temperature sur la premiere ligne et une consigne sur la 2eme (sauf que la valeur de la consigne =11001), le potard n est pas encore en place

mais je devrais afficher un truc entre 25 et 40 degrée

et j’aurais voulu que la temperature afficher soit en entier, mais j ose pas trop allez toucher

temperature est un float
Tu peux déclarer une variable byte et tu castes la température dans cette variable

byte temp = (byte)temperature ;

Puis tu affiches temp sur ton écran

en gros on castre la valeur ^^

edit: cela m affiche 10111-C en temp...

bon plus simple

lcd.print(temperature,0);

du coup pourquoi target affiche 11001-C ²sur l ecran?

Parce que c'est très chaud ?

Combien vaut la valeur float ?

Lol

Ba analogread vaut entre 0 et 1023

Consigne1 vaut normalement entre 25 et 26

Certes mais combien vaut temperature lorsque tu affiches 11001 ?

J'avais mal compris, tu ne parles plus de la température lue mais de la consigne

lcd.print(consigne1, 2);
 Serial.print(consigne1, 2);

Ça c'est pour des float, le 2 c'est le nombre de chiffres après la virgule. Pour des int, fais plus simple

lcd.print(consigne1);
 Serial.print(consigne1);

ok merci, du coup c’est bon j’affiche mes valeurs correctement

bon etape 2, je dois tout mettre en double

est ce que je dois necessairement doubler tout le code? sachant que en fait je ne comprend rien à la partie 1 wire

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
//----- Adressage matériel -----
// En cas de non fonctionnement, mettez la ligne 8 en
// commentaire et retirez le commentaire à la ligne 9.
LiquidCrystal_I2C lcd(0x27, 20, 4);

/* Broche du bus 1-Wire */

const byte BROCHE_ONEWIRE = A2;
const byte BROCHE_ONEWIRE2 = A3;
#define potard1 A4
#define potard2 A5
int consigne1=0;
int consigne2=0;
float temperature = 0;
int temp = 0;




/* Code de retour de la fonction getTemperature() */
enum DS18B20_RCODES {
  READ_OK,  // Lecture ok
  NO_SENSOR_FOUND,  // Pas de capteur
  INVALID_ADDRESS,  // Adresse reçue invalide
  INVALID_SENSOR  // Capteur invalide (pas un DS18B20)
};


/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds(BROCHE_ONEWIRE);
 
 
/**
 * Fonction de lecture de la température via un capteur DS18B20.
 */
byte getTemperature(float *temperature, byte reset_search) {
  byte data[9], addr[8];
  // data[] : Données lues depuis le scratchpad
  // addr[] : Adresse du module 1-Wire détecté
  
  /* Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) */
  if (reset_search) {
    ds.reset_search();
  }
 
  /* Recherche le prochain capteur 1-Wire disponible */
  if (!ds.search(addr)) {
    // Pas de capteur
    return NO_SENSOR_FOUND;
  }
  
  /* Vérifie que l'adresse a été correctement reçue */
  if (OneWire::crc8(addr, 7) != addr[7]) {
    // Adresse invalide
    return INVALID_ADDRESS;
  }
 
  /* Vérifie qu'il s'agit bien d'un DS18B20 */
  if (addr[0] != 0x28) {
    // Mauvais type de capteur
    return INVALID_SENSOR;
  }
 
  /* Reset le bus 1-Wire et sélectionne le capteur */
  ds.reset();
  ds.select(addr);
  
  /* Lance une prise de mesure de température et attend la fin de la mesure */
  ds.write(0x44, 1);
  delay(800);
  
  /* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
 
 /* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
   
  /* Calcul de la température en degré Celsius */
  *temperature = (int16_t) ((data[1] << 8) | data[0]) * 0.0625; 
  
  // Pas d'erreur
  return READ_OK;
}
void consignetemp()
{
  consigne1 = 25+(analogRead(potard1)/1000);
  consigne2 = 25+(analogRead(potard2)/1000);
}
 
void setup()
{
 lcd.init(); // initialisation de l'afficheur
  Serial.begin(115200);
}
void loop()
{

  consignetemp();
 lcd.backlight();
 // Envoi du message



  temp = temperature;
   //float temperature;
   
  /* Lit la température ambiante à ~1Hz */
  if (getTemperature(&temperature, true) != READ_OK) {
    Serial.println(F("Erreur de lecture du capteur"));
    return;
  }
 ;

  /* Affiche la température 1*/
  lcd.setCursor(0, 0);
  lcd.print(F("Temp: "));
  Serial.print(F("Temperature : "));
  lcd.print(temperature,0);
  Serial.print(temperature, 2);
  lcd.write(176); // Caractère degré
  Serial.write(176); // Caractère degré
  lcd.write('C');
  Serial.write('C');
  Serial.println();

  
  // Affiche la consigne 1
  lcd.setCursor(0, 1);
  lcd.print(F("Target: "));
  Serial.print(F("Target : "));
  lcd.print(consigne1);
  Serial.print(consigne1, 2);
  lcd.write(176); // Caractère degré
  Serial.write(176); // Caractère degré
  lcd.write('C');
  Serial.write('C');
  Serial.println();

 

  
}

ou bien on peut garder une partie du code et juste dupliquer la partie "adressage " de sonde?

Soyons fous, essayons de faire une fonction qui prend en argument l’instanciation de ta sonde :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
//----- Adressage matériel -----
// En cas de non fonctionnement, mettez la ligne 8 en
// commentaire et retirez le commentaire à la ligne 9.
LiquidCrystal_I2C lcd(0x27, 20, 4);

/* Broche du bus 1-Wire */

const byte BROCHE_ONEWIRE1 = A2;
const byte BROCHE_ONEWIRE2 = A3;
#define potard1 A4
#define potard2 A5
int consigne1 = 0;
int consigne2 = 0;
float temperature1 = 0;
float temperature2 = 0;
int temp = 0;




/* Code de retour de la fonction getTemperature() */
enum DS18B20_RCODES {
  READ_OK,  // Lecture ok
  NO_SENSOR_FOUND,  // Pas de capteur
  INVALID_ADDRESS,  // Adresse reçue invalide
  INVALID_SENSOR  // Capteur invalide (pas un DS18B20)
};


/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds1(BROCHE_ONEWIRE1);
OneWire ds2(BROCHE_ONEWIRE2);


/**
   Fonction de lecture de la température via un capteur DS18B20.
*/
byte getTemperature(OneWire *ds, float *temperature, byte reset_search) {
  byte data[9], addr[8];
  // data[] : Données lues depuis le scratchpad
  // addr[] : Adresse du module 1-Wire détecté

  /* Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) */
  if (reset_search) {
    ds.reset_search();
  }

  /* Recherche le prochain capteur 1-Wire disponible */
  if (!ds.search(addr)) {
    // Pas de capteur
    return NO_SENSOR_FOUND;
  }

  /* Vérifie que l'adresse a été correctement reçue */
  if (OneWire::crc8(addr, 7) != addr[7]) {
    // Adresse invalide
    return INVALID_ADDRESS;
  }

  /* Vérifie qu'il s'agit bien d'un DS18B20 */
  if (addr[0] != 0x28) {
    // Mauvais type de capteur
    return INVALID_SENSOR;
  }

  /* Reset le bus 1-Wire et sélectionne le capteur */
  ds.reset();
  ds.select(addr);

  /* Lance une prise de mesure de température et attend la fin de la mesure */
  ds.write(0x44, 1);
  delay(800);

  /* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);

  /* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }

  /* Calcul de la température en degré Celsius */
  *temperature = (int16_t) ((data[1] << 8) | data[0]) * 0.0625;

  // Pas d'erreur
  return READ_OK;
}

void consignetemp()
{
  consigne1 = 25 + (analogRead(potard1) / 1000);
  consigne2 = 25 + (analogRead(potard2) / 1000);
}

void setup()
{
  lcd.init(); // initialisation de l'afficheur
  Serial.begin(115200);
}

void loop()
{
  consignetemp();
  lcd.backlight();

  /* Lit la température ambiante à ~1Hz */
  if (getTemperature(&ds1, &temperature1, true) != READ_OK) {
    Serial.println(F("Erreur de lecture du capteur 1"));
    return;
  }
  if (getTemperature(&ds2, &temperature2, true) != READ_OK) {
    Serial.println(F("Erreur de lecture du capteur 2"));
    return;
  }

  /* Affiche la température 1*/
  lcd.setCursor(0, 0);
  lcd.print(F("Temp1: "));
  Serial.print(F("Temperature 1 : "));
  lcd.print(temperature1, 0);
  Serial.print(temperature1, 2);
  lcd.write(176); // Caractère degré
  Serial.write(176); // Caractère degré
  lcd.write('C');
  Serial.write('C');
  Serial.println();

  /* Affiche la température 2*/
  lcd.setCursor(0, 2);
  lcd.print(F("Temp2: "));
  Serial.print(F("Temperature 2 : "));
  lcd.print(temperature2, 0);
  Serial.print(temperature2, 2);
  lcd.write(176); // Caractère degré
  Serial.write(176); // Caractère degré
  lcd.write('C');
  Serial.write('C');
  Serial.println();

  // Affiche la consigne 1
  lcd.setCursor(0, 2);
  lcd.print(F("Target: "));
  Serial.print(F("Target : "));
  lcd.print(consigne1);
  Serial.print(consigne1, 2);
  lcd.write(176); // Caractère degré
  Serial.write(176); // Caractère degré
  lcd.write('C');
  Serial.write('C');
  Serial.println();
}

J’ai jamais fait ça, c’est sans garantie !!!

oula pourquoi tu utilise des mots bizarres... l'instanciation, je vais allez regarder la definition

edit: L'instanciation est l'action d'instancier, de créer un objet à partir d'un modèle. Elle est réalisée par la composition de deux opérations : l'allocation et l'initialisation. L'allocation consiste à réserver un espace mémoire au nouvel objet.

j'ai rien compris...

C'est du jargon, je l'ai appris en côtoyant des softeux C++. J'aurais dû dire "une instance" c'est plus français.

Je te l'explique avec mes mots : lorsque tu utilises une bibliothèque (par exemple DHTLib) pour déclarer un capteur ou un écran, tu utilises un constructeur. C'est un bout de code de la bibliothèque qui définit les principaux paramètres. Du côté de ton code, on dit que tu crées une instance du capteur.

C'est un objet dont tu vas utiliser les méthodes, liées à la bibliothèque que tu charges.

Dans ton cas, la ligne

OneWire ds1(BROCHE_ONEWIRE1);

déclare une instance de la classe OneWire, nommée 'ds1', avec comme paramètre le numéro de la pinoche.

On en déclare 2 : ds1 et ds2. Reste à les utiliser dans une fonction générique. C'est ce que j'ai essayé de faire...