Go Down

Topic: Utiliser 2 sondes DS18B20 en même temps (Read 1 time) previous topic - next topic

ArduinoFree

Jun 19, 2018, 10:38 am Last Edit: Jun 19, 2018, 10:50 am by ArduinoFree
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
Code: [Select]
' redeclaration of 'int readVal'
 mais je ne trouve pas où ?

code de base des 2 sondes DS18B20
Code: [Select]
//
// 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
Code: [Select]

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'



jfs

#1
Jun 19, 2018, 10:53 am Last Edit: Jun 19, 2018, 10:57 am by jfs
Ici :
Code: [Select]

...
  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
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

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.

jfs

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....  :smiley-mr-green:
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

ArduinoFree


ArduinoFree

#5
Jun 19, 2018, 06:09 pm Last Edit: Jun 19, 2018, 06:09 pm by ArduinoFree
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
Code: [Select]

/* 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();


}




kamill

Pour mettre les °C après la température, il ne faut pas utiliser println qui fait un saut de ligne, mais print.
Code: [Select]
 display.print(sensor_air.getTempCByIndex(0));
 display.print("'");                       //Affichage du symbole <C>
 display.println("C");                       //Affichage du symbole <C>

ArduinoFree

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

lesept

Fais quelque chose comme ça :

Code: [Select]
  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 :
Code: [Select]
display.print((char)223);(trouvé sur le forum)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

ArduinoFree

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

Code: [Select]
display.print((char)186); 

lesept

#10
Jun 20, 2018, 10:03 am Last Edit: Jun 20, 2018, 10:54 am by lesept
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.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

ArduinoFree


lesept

Si ça dépasse la largeur de l'écran, tu peux enlever des espaces après AIR et EAU...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).


fdufnews

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.

Go Up