Utiliser 2 sondes DS18B20 en même temps

Sur un autre post, comme je n'arrivais pas à calibrer le Ky-013, j'ai regardé les exemples de la bibliothèque Data-fruits
et j'ai vu l'exemple TwoPin_DS18B20.

Du coup je tente de le combiner avec mon code poue écran oled I2c 128x64.
J'ai une erreur (voir fin du post) où l'on parle de

' redeclaration of 'int readVal'

mais je ne trouve pas où ?

code de base des 2 sondes DS18B20

//
// FILE: TwoPin_DS18B20.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// PURPOSE: two pins for two sensors demo
// DATE: 2014-06-13
// URL: http://forum.arduino.cc/index.php?topic=216835.msg1764333#msg1764333
//
// Released to the public domain
//

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

#define ONE_WIRE_BUS_1 2
#define ONE_WIRE_BUS_2 4

OneWire oneWire_in(ONE_WIRE_BUS_1);
OneWire oneWire_out(ONE_WIRE_BUS_2);

DallasTemperature sensor_inhouse(&oneWire_in);
DallasTemperature sensor_outhouse(&oneWire_out);

void setup(void)
{
    Serial.begin(9600);
    Serial.println("Dallas Temperature Control Library Demo - TwoPin_DS18B20");

    sensor_inhouse.begin();
    sensor_outhouse.begin();
}

void loop(void)
{
    Serial.print("Requesting temperatures...");
    sensor_inhouse.requestTemperatures();
    sensor_outhouse.requestTemperatures();
    Serial.println(" done");

    Serial.print("Inhouse: ");
    Serial.println(sensor_inhouse.getTempCByIndex(0));

    Serial.print("Outhouse: ");
    Serial.println(sensor_outhouse.getTempCByIndex(0));
}

Mon code modifié en pièce jointe

Code de l'erreur

Arduino : 1.8.4 (Windows 7), Carte : "Arduino/Genuino Uno"

D:\Donnees\0_Personnel\Bateau\00 ok\Ecran_temp_volt_2-ds18b20\Ecran_temp_volt_2-ds18b20.ino: In function 'void setup()':

Ecran_temp_volt_2-ds18b20:99: error: redeclaration of 'int readVal'

   int readVal = analogRead(4);// met à  zéro la sonde AIR

       ^

D:\Donnees\0_Personnel\Bateau\00 ok\Ecran_temp_volt_2-ds18b20\Ecran_temp_volt_2-ds18b20.ino:98:7: note: 'int readVal' previously declared here

   int readVal = analogRead(2);// met à  zéro la sonde EAU

       ^

exit status 1
redeclaration of 'int readVal'

Ecran_temp_volt_2-ds18b20.ino (6.85 KB)

Ici :

...
  int readVal = analogRead(2);// met à zéro la sonde EAU
  int readVal = analogRead(4);// met à zéro la sonde AIR
}


void loop() {
...

Fais une différenciation par exemple :

readVal_Eau

readVal_Air

Bonour,

J'ajouterai que je ne vois pas ce que font ces analogRead.
Les DS18B20 sont des sondes numériques et non pas analogiques.

kamill:
Bonour,

J'ajouterai que je ne vois pas ce que font ces analogRead.
Les DS18B20 sont des sondes numériques et non pas analogiques.

ça c'est ballot.... :grin:

Merci à vous.

Je teste ce soir

Voici le résultat
On voit les 2 sondes DS18B20 dans un verre d'eau

J'ai encore 2 questions :

Comment écrire sur une seule ligne les 2 températures , et si possible le C après les 2 ?

Et surtout.
Ce code prend 87% de la mémoire. Je veux l'incorporer à mon projet de bateau qui fait 17% de mémoire.
Je vais avoir des pb ?

le code

/* utilisation de  A0 pour le voltage                avec resistance en //
             pin 4 pour l'AIR DS18b20EAU           
             des A4 et A5 pour l'écran                
             du  pin 2 pour l'eau DS18b20EAU       

  AO   récupère l'information du voltage avec GND fil direct à la batterie mais avec resistance en parallèle !!
  pin 4 AIR récupère l'information de la température de la sonde étanche 1m  DS18B20
  pin 2 EAU récupère l'information de la température de la sonde étanche 1m  DS18B20
  A4 et A5 affichage de l'écran

    "5 Volt c'est la tension de la référence de tension de l'ADC.
    J'espère que tu n'as pas raccordé directement le 12V à A0 ?
    Il faut placer un pont diviseur à deux résistances pour que la tension sur A0 soit inférieure à 12V".
*/


#include <DallasTemperature.h>     //DS18B20 pour température de l'eau et de l'air
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>


/* Essai affichage voltage, température air et eau
  // http://www.instructables.com/id/Arduino-OLED-Voltage-Meter/  le voltmètre
  //              A0 et GND entre les deux mettre resistance ( voir le lien)ici A0 pour le voltage
  //              A0 est lié à la batterie et GND à l'autre  pôle de la batterie

  // http://edu.mrpigg.ca/termo.html     thermo resistor  Keyes KY-013  pour l'air
  // https://letmeknow.fr/blog/2016/08/10/le-capteur-de-temperature-ds18b20/

  //les librairies de l'écran
  //https://github.com/adafruit/Adafruit_SSD1306
  //https://github.com/adafruit/Adafruit-GFX-Library


  //les librairies de la sonde étanche DS18B20
  //https://github.com/PaulStoffregen/OneWire
*/

// les branchements

//  L'écran OLED
#define OLED_RESET 8          // pin 8 'virtuel' ?                                  
Adafruit_SSD1306 display(OLED_RESET);

//définition de la taille de l'écran
#define SSD1306_128_64 // à modifier dans le dossier Liraries / dossier Adafruit_SSD1306.h avec 
// éditeur de texte  #define SSD1306_128_64 et pour les autres définitions d'écran
// écrire //#define SSD1306_128_32  #define SSD1306_128_16

// les 2 sondes DS18B20
#define ONE_WIRE_BUS_1 2               // sonde pour l'eau pin 2 
#define ONE_WIRE_BUS_2 4               // sonde pour l'air pin 4
OneWire oneWire_in(ONE_WIRE_BUS_1);    // sonde pour l'eau
OneWire oneWire_out(ONE_WIRE_BUS_2);   // sonde pour l'air
DallasTemperature sensor_eau(&oneWire_in);     // sonde pour l'eau
DallasTemperature sensor_air(&oneWire_out);    // sonde pour l'air

//*****************************
// Température de l'eau DS18B20
#define EAU_TEMPERATURE_PIN 2 //***********************************************************pin 4 pour voiture bateau
OneWire oneWire(EAU_TEMPERATURE_PIN);
DallasTemperature sensors(&oneWire);

/*-------------------------------------------------------------------------------------
   Template file for 4-pin I2C OLED display, e.g. from Geekcreit
   using Adafruit SSD1306 driver and GFX libraries.
   Tutorial:
   https://startingelectronics.org/tutorials/arduino/modules/OLED-128x64-I2C-display/
  -------------------------------------------------------------------------------------*/
// OLED display TWI address
#define OLED_ADDR   0x3C // C avant a modifier peut-etre

//------------------------------------------
//------------------------------------------



void setup() {
  // initialize and clear display
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);//   programme scanner
  display.clearDisplay();
  display.display();

  // start serial port
  Serial.begin(115200);
  Serial.println("Dallas Temperature Control Library Demo - TwoPin_DS18B20");

  // Start up the library
  sensor_eau.begin();    // sonde pour l'eau
  sensor_air.begin();    // sonde pour l'air

  // déclaration de la pin 2 et 4
  pinMode(2, INPUT);
  pinMode(4, INPUT);

  int readValEau = analogRead(2);// met à zéro la sonde EAU
  int readValAir = analogRead(4);// met à zéro la sonde AIR
}


void loop() {
  // AFFICHAGE SUR SERIAL
  Serial.print("Recherceh des temperatures...");
  sensor_eau.requestTemperatures();
  sensor_air.requestTemperatures();
  Serial.println(" done");

  // sonde EAU
  Serial.print("Température eau: ");
  Serial.println(sensor_eau.getTempCByIndex(0));

  // sonde AIR
  Serial.print("Température air: ");
  Serial.println(sensor_air.getTempCByIndex(0));




  // AFFICHAGE SUR ECRAN
  delay(1);//delay time 1 milli second
  display.clearDisplay();

  display.setTextSize(1);//text size
  display.setTextColor(WHITE);//text color
  display.setCursor(0, 0);
  display.println("NIVEAU BATTERIE");//affiche texte 1ere ligne 8 pixels
  //*****************************
  //display.setTextColor(BLACK, WHITE);
  //display.println(); // affiche une ligne noire
  //*****************************
  
  // Affichage sur la même ligne des 2 températures Air et Eau
  display.setTextSize(1);//text size        // mettre 2 pour 16 pixels
  display.setCursor(0, 42);                 // position du curseur
  display.print("TEMP. AIR   ");//affiche texte 1ere ligne 8 pixels
  //display.print( temp );                    // ici on met la 1° température air(sonde étanche)(pin4)
  display.println(sensor_air.getTempCByIndex(0));
  display.print("'");                       //Affichage du symbole <C>
  display.print("C");                       //Affichage du symbole <C>

  display.setTextSize(1);//text size        // mettre 2 pour 16 pixels
  display.setCursor(0, 57);                 // position du curseur
  display.print("TEMP. EAU   ");//affiche texte 1ere ligne 8 pixels
  //display.print(dTempWater);              // ici on met la 2° température eau (sonde étanche)(pin2)
  display.println(sensor_eau.getTempCByIndex(0));
  display.print("'");                       //Affichage du symbole <C>
  display.print("C");                       //Affichage du symbole <C>
  delay(500);                               // Attente 0,5 sec pour réactualiser


  // pour le voltage de la batterie
  // Conversion du signal (which goes from 0 - 1023) to a voltage (0 - (V):
  int sensorValue = analogRead(A0);//*******************************************************  A3 pour la voiture bateau
  // écrit la valeur lue
  float voltage = sensorValue * (5.0 / 1023.0);
  display.setTextSize(1);//text size         // mettre 2 pour 16 pixels
  display.setCursor(0, 16);
  display.print(voltage);
  display.print(" V");
  display.display();


}

Pour mettre les °C après la température, il ne faut pas utiliser println qui fait un saut de ligne, mais print.

 display.print(sensor_air.getTempCByIndex(0));
 display.print("'");                       //Affichage du symbole <C>
 display.println("C");                       //Affichage du symbole <C>

Ca c'est bon, le pb c'est de mettre les 2 données de température sur la même ligne, et si possible de mettre le C après chacune d'elle.

Et l'histoire de la mémoire aussi

Fais quelque chose comme ça :

  display.setTextSize(1);        //text size mettre 2 pour 16 pixels
  display.setCursor(0, 42);      // position du curseur
  display.print("TEMP. AIR   "); //affiche texte 1ere ligne 8 pixels
  display.print(sensor_air.getTempCByIndex(0));
  display.print("'");
  display.print("C EAU   ");       //affiche texte 1ere ligne 8 pixels
  display.print(sensor_eau.getTempCByIndex(0));
  display.print("'");                       
  display.print("C");            //Affichage du symbole <C>

Si tu veux le symbole "°", tu peux utiliser la commande :
display.print((char)223);(trouvé sur le forum)

Je ne peux tester que ce soir, mais de mémoire j'avais déjà essayé ce code. On verra.

Pour le caractère "°" , j'avais un mauvais code , le

display.print((char)186);

J'ai trouvé une autre source qui confirme le 223. A tester...

Pourtant il apparaît à la place 166 sur la table des codes ASCII : il doit y avoir dans la bibli une redéfinition de certains codes utiles.

EDIT : Table ASCII étendue, suite à la réponse de pepe --> Le symbole '°' est bien au code 248.

Ok
On verra le test

Si ça dépasse la largeur de l'écran, tu peux enlever des espaces après AIR et EAU...

ok

ArduinoFree:
Et l'histoire de la mémoire aussi

La librairie de l'écran OLED bouffe déjà 1024 octets (soit la moitié de la RAM) pour stocker le bitmap de l'écran plus quelques variables de travail.
Donc de ton coté, il faut être très économe et optimiser ton code pour réduire l'utilisation de la RAM.

fdufnews:
Donc de ton coté, il faut être très économe et optimiser ton code pour réduire l'utilisation de la RAM.

Je ne connais arduino que depuis très peu
Pour utiliser cet écran, j'ai pris des codes existants et je les ai combinés.

Optimiser un code, je ne sais pas faire et je pensais que ceux des exemples sont déjà optimisés non ?

pour pepe, merci je regarde ça ce soir

J'ai trouvé ici
https://projetsdiy.fr/ssd1306-mini-ecran-oled-i2c-128x64-arduino/

une bibliothèque allégée .
le code fournit ne prend que 44% de mémoire alors que le code fourni par l'exemple de Adafruit en prend 75%.
Par contre il est bcp plus compliqué à comprendre :confused:

Je n'arrive pas à voir où écrire mes lignes de lecture des valeurs, et quelles lignes garder ou effacer tellement il y a de données

sketch_jun20a.ino (10.5 KB)

Cette bibliothèque me semble compatible de ton code actuel : les mêmes fonctions

Afficher du texte :

 display.print("56789:;<=>?@ABCDEFGHI");

et afficher l'écran :

 display.display();

le setup, à adapter à ton besoin :

 display.begin();    // Initialize the OLED
  display.clear(ALL); // Clear the display's internal memory
  display.clear(PAGE); // Clear the buffer.

Il faut juste la déclarer dans l'entête à la place de l'ancienne

#include <Wire.h>  // Include Wire if you're using I2C
#include <SFE_MicroOLED.h>  // Include the SFE_MicroOLED library

et bien déclarer l'écran

//////////////////////////
// MicroOLED Definition //
//////////////////////////
#define PIN_RESET 9  // Connect RST to pin 9
#define DC_JUMPER 0 // Ceci n'est pas une déclaration de pin de l'Arduino !!!

//////////////////////////////////
// MicroOLED Object Declaration //
//////////////////////////////////
MicroOLED display(PIN_RESET, DC_JUMPER);    // I2C declaration

Tu utilises les pins dont tu as besoin (change 9 si tu veux l'utiliser pour autre chose) et bien sûr les A4 et A5 pour l'I2C.

Pour les "pros", qui peuvent expliquer mieux que moi, voici le code de la bibli :

/** \brief MicroOLED Constructor -- I2C Mode
 Setup the MicroOLED class, configure the display to be controlled via a
 I2C interface.
*/
MicroOLED::MicroOLED(uint8_t rst, uint8_t dc)
{
 rstPin = rst; // Assign reset pin to private class variable
 interface = MODE_I2C; // Set interface to I2C
 // Set the I2C Address based on whether DC is high (1) or low (0).
 // The pin is pulled low by default, so if it's not explicitly set to
 // 1, just default to 0.
 if (dc == 1)
 i2c_address = I2C_ADDRESS_SA0_1;
 else
 i2c_address = I2C_ADDRESS_SA0_0;
}

avec dans le .h

#define I2C_ADDRESS_SA0_0 0b0111100
// c'est 60 en décimal

AMHA, à part dans l'entête et le setup, tu n'auras rien à changer dans ton code.

Cette librairie utilise moins de mémoire car elle déclare un afficheur plus petit

#define LCDWIDTH 64
#define LCDHEIGHT 48

Pour manipuler seulement du texte, on pourrait imaginer une librairie qui travaillerait uniquement avec un buffer de texte et qui écrirait directement dans l'afficheur. Mais cela veut dire développer une nouvelle librairie.

Vu pour la taille de l'écran.

Questions

Quel est ce pin 9 reset ?
sur le code adafruit, il y a A4, A5, 5volt et GND comme branchement pour l'écran
et dans la continuité que dois-je déclarer ici ?

MicroOLED display(PIN_RESET, DC_JUMPER);    // I2C declaration

le reset pin9 ?, DC_jumper c'est le 5 volt ?

Dans le code avec adafruit , toutes les commandes sont avec display.setCursor ( display.*)
avec Spark dans le code d'exemple c'est oled.setCursor ( oled.
)

Dois-je faire le remplacement ?

Dans le code adafruit j'ai cette ligne

// Température de l'eau DS18B20
#define EAU_TEMPERATURE_PIN 2 //*************pin ?? pour voiture bateau
OneWire oneWire(EAU_TEMPERATURE_PIN);

Ne dois-je pas la dupliquer pour la sonde de l'air ?
Je l'ai fais et msg d'erreur de redefinition de OneWire oneWire

// Température de l'eau DS18B20
#define EAU_TEMPERATURE_PIN 2 //*************pin ?? pour voiture bateau
OneWire oneWire(EAU_TEMPERATURE_PIN);
#define AIR_TEMPERATURE_PIN 4 //*************pin ?? pour voiture bateau
OneWire oneWire(AIR_TEMPERATURE_PIN);

Ecran_temp_volt_2-ds18b20_spark.ino (5.54 KB)

MicroOLED_Demo.ino (10.3 KB)