Go Down

Topic: Aide sur Ecran oled I2C 128x64 / sonde KY-013: double affichage  (Read 873 times) previous topic - next topic

lesept

Ici mais je croyais qu'elle était incluse de base dans l'IDE... Je dois me tromper
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

ArduinoFree

Merci

Image du code d'origine pour la sonde DS18b20

Le nouveau code
Code: [Select]



#include <Adafruit_SSD1306.h>      // la bibliothèque du l'écran
#include <Adafruit_GFX.h>          // la bibliothèque du l'écran
#include <math.h>                  //KY-013 pour température de l'air

#include <OneWire.h>                 //DS18B20 pour température de l'eau
#include <DallasTemperature.h>    //DS18B20 pour température de l'eau


// Essai affichage voltage, température air et eau
// http://www.instructables.com/id/Arduino-OLED-Voltage-Meter/  le voltmètre
// 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/           //A venir

//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



//  L'écran OLED
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);


// Température de l'eau DS18B20
#define EAU_TEMPERATURE_PIN A2
OneWire oneWire(EAU_TEMPERATURE_PIN);
DallasTemperature sensors(OneWire);


// Température de l'eau KY-013
int sensorPin = A1;                 // KY-013 Déclaration de la broche d'entrée
// fonction convertit la valeur analogique lue en température en °C
double Thermistor(int RawADC)
{
  double Temp;
  Temp = log(10000.0 * ((1024.0 / RawADC - 1)));
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
  Temp = Temp - 273.15;            // conversion de degrés Kelvin en °C
  return Temp;
}



void loop() {

  // la température de l'eau
  sensors.requestTemperatures();
  double dTempWater = sensors.getTempCByIndex(0);  // le nom de la variable de la températur eau

  // KY-013 le programme mesure la valeur de tension continue à la CTN et convertit le résultat en °C
  int readVal = analogRead(sensorPin);
  double temp =  Thermistor(readVal);

  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

  display.println("A0");//define analog pin  16 pixels
  display.setTextSize(1);
  display.setTextColor(WHITE);//text color
//*****************************

  display.setTextSize(1);//text size
  display.setTextColor(WHITE);//text color
  display.setCursor(0, 0);
  display.println("Température Eau et Air");//affiche texte 1ere ligne 8 pixels

  display.setTextColor(BLACK, WHITE);
  display.println(); // affiche une ligne noire

  display.println("A1");                     // ici on met la 1° température air ( Keyes KY-013)
  display.setTextSize(2);//text size         // mettre 2 pour 16 pixels
  display.print(char(186));                  //Affichage du symbole <°>
  display.println("C");                      //Affichage du symbole <C>
  delay(500);                                // Attente 0,5 sec pour réactualiser

  display.setTextColor(BLACK, WHITE);
  display.println(); // affiche une ligne noire

  display.println("dTempWater");             // ici on met la 2° température eau (sonde étanche)(A2)
  display.setTextSize(2);//text size         // mettre 2 pour 16 pixels
  display.print(char(186));                  //Affichage du symbole <°>
  display.println("C");                      //Affichage du symbole <C>
  delay(500);                                // Attente 0,5 sec pour réactualiser


  // pour le voltage de la batterie
  int sensorValue = analogRead(A0); // Convertion du signal (which goes from 0 - 1023) to a voltage (0 - 12V):
  float voltage = sensorValue * (12.0 / 1023.0);         // écrit la valeur lue
  display.print(voltage);
  display.println("V");
  display.display();
}
/*
  AO   récupère l'information du voltage
  A1   récupère l'information de la température  Thermo résistance (modèle Keyes KY-013)
  A2   récupère l'information de la température de la sonde étanche 1m  DS18B20
*/



Et ses erreurs   >:(
Code: [Select]

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

D:\Donnees\0_Personnel\Bateau\Ecran_temp_volt\Ecran_temp_volt.ino: In function 'void loop()':

Ecran_temp_volt:54: error: request for member 'requestTemperatures' in 'sensors', which is of non-class type 'DallasTemperature(OneWire)'

   sensors.requestTemperatures();

           ^

Ecran_temp_volt:55: error: request for member 'getTempCByIndex' in 'sensors', which is of non-class type 'DallasTemperature(OneWire)'

   double dTempWater = sensors.getTempCByIndex(0);  // le nom de la variable de la températur eau

                               ^

exit status 1
request for member 'requestTemperatures' in 'sensors', which is of non-class type 'DallasTemperature(OneWire)'

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.


hbachetti

Quote
Ici mais je croyais qu'elle était incluse de base dans l'IDE... Je dois me tromper
Je croyais aussi, mais non.

Dernière ligne droite :
Le constructeur de DallasTemperature réclame une adresse (&) :

Code: [Select]
DallasTemperature sensors(&oneWire);

Et il te manque un setup()

Code: [Select]
void setup(void)
{
  // start serial port
  Serial.begin(115200);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
  // INITIALISER AUSSI L'AFFICHEUR
}


Le bout de setup pour l'afficheur :

https://github.com/adafruit/Adafruit_SSD1306/blob/master/examples/ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

ArduinoFree

MERCIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII


( je n'arrivais pas à lire le '&'. Je croyais à une patte de mouche de mon pc)

Une dernière question pour ce post ( ... enfin je crois  :) )

Je veux donc écrire la tempéraur de la sonde étanche sur oled I2C.
Est-ce que je mets "dTempWater" ou A2 ?

Code: [Select]


  display.println("dTempWater");             // ici on met la 2° température eau (sonde étanche)(A2)
  display.setTextSize(2);//text size         // mettre 2 pour 16 pixels
  display.print(char(186));                  //Affichage du symbole <°>
  display.println("C");                      //Affichage du symbole <C>
  delay(500);                                // Attente 0,5 sec pour réactualiser


Ah ben non, une autre question
Ici j'ai modifié le code d'origine qui notait 5 volt par 12v, qui est la valeur de la batterie à pleine charge.
La logique est bonne ?
Pleine charge = 1023 dpnc = 12 ?

Code: [Select]

// pour le voltage de la batterie
  int sensorValue = analogRead(A0); // Conversion du signal (which goes from 0 - 1023) to a voltage (0 - 12V):
  float voltage = sensorValue * (12.0 / 1023.0);         // écrit la valeur lue
  display.print(voltage);
  display.println("V");
  display.display();





Code: [Select]



#include <Adafruit_SSD1306.h>      // la bibliothèque du l'écran
#include <Adafruit_GFX.h>          // la bibliothèque du l'écran
#include <math.h>                  //KY-013 pour température de l'air

#include <OneWire.h>                 //DS18B20 pour température de l'eau
#include <DallasTemperature.h>    //DS18B20 pour température de l'eau


// Essai affichage voltage, température air et eau
// http://www.instructables.com/id/Arduino-OLED-Voltage-Meter/  le voltmètre
// 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/           //A venir

//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



//  L'écran OLED
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);


// Température de l'eau DS18B20
#define EAU_TEMPERATURE_PIN A2
OneWire oneWire(EAU_TEMPERATURE_PIN);
DallasTemperature sensors(&oneWire);


// Température de l'eau KY-013
int sensorPin = A1;                 // KY-013 Déclaration de la broche d'entrée
// fonction convertit la valeur analogique lue en température en °C
double Thermistor(int RawADC)
{
  double Temp;
  Temp = log(10000.0 * ((1024.0 / RawADC - 1)));
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
  Temp = Temp - 273.15;            // conversion de degrés Kelvin en °C
  return Temp;
}

void setup(void)
{
  // start serial port
  Serial.begin(115200);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
  // INITIALISER AUSSI L'AFFICHEUR
  display.clearDisplay();
}


void loop() {

  // la température de l'eau
  sensors.requestTemperatures();
  double dTempWater = sensors.getTempCByIndex(0);  // le nom de la variable de la températur eau

  // KY-013 le programme mesure la valeur de tension continue à la CTN et convertit le résultat en °C
  int readVal = analogRead(sensorPin);
  double temp =  Thermistor(readVal);

  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

  display.println("A0");//define analog pin  16 pixels
  display.setTextSize(1);
  display.setTextColor(WHITE);//text color
  //*****************************

  display.setTextSize(1);//text size
  display.setTextColor(WHITE);//text color
  display.setCursor(0, 0);
  display.println("Température Eau et Air");//affiche texte 1ere ligne 8 pixels

  display.setTextColor(BLACK, WHITE);
  display.println(); // affiche une ligne noire

  display.println("A1");                     // ici on met la 1° température air ( Keyes KY-013)
  display.setTextSize(2);//text size         // mettre 2 pour 16 pixels
  display.print(char(186));                  //Affichage du symbole <°>
  display.println("C");                      //Affichage du symbole <C>
  delay(500);                                // Attente 0,5 sec pour réactualiser

  display.setTextColor(BLACK, WHITE);
  display.println(); // affiche une ligne noire

  display.println("dTempWater");             // ici on met la 2° température eau (sonde étanche)(A2)
  display.setTextSize(2);//text size         // mettre 2 pour 16 pixels
  display.print(char(186));                  //Affichage du symbole <°>
  display.println("C");                      //Affichage du symbole <C>
  delay(500);                                // Attente 0,5 sec pour réactualiser


  // pour le voltage de la batterie
  int sensorValue = analogRead(A0); // Conversion du signal (which goes from 0 - 1023) to a voltage (0 - 12V):
  float voltage = sensorValue * (12.0 / 1023.0);         // écrit la valeur lue
  display.print(voltage);
  display.println("V");
  display.display();
}
/*
  AO   récupère l'information du voltage
  A1   récupère l'information de la température  Thermo résistance (modèle Keyes KY-013)
  A2   récupère l'information de la température de la sonde étanche 1m  DS18B20
*/

lesept

Quand tu écris
Code: [Select]
display.println("dTempWater");avec des guillemets, tu affiches un texte, pas une valeur numérique. Pour afficher la valeur d'une variable, il faut ôter les guillemets :
Code: [Select]
display.println(dTempWater);Après, il faut que la variable que tu affiches corresponde bien à ton besoin.

En général, les noms tels que A0, A1 sont réservés à des numéros de broches, donc tu peux les afficher si tu veux mais ils ne te donneront pas la valeur mesurée sur cette broche, c'est clair. Donc pour afficher la température, il faut afficher la variable qui contient cette température.

Pour la mesure de tension, c'est bon. Je ne suis pas un pro des batteries, mais tu devrais mesurer la vraie valeur de tension délivrée par ta batterie à pleine charge, ce serait plus précis que de mettre 12 par défaut.

Et essuie ton écran !!! :)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

hbachetti

Quote
Ici j'ai modifié le code d'origine qui notait 5 volt par 12v, qui est la valeur de la batterie à pleine charge.
La logique est bonne ?
Pas du tout.
5V 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.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

ArduinoFree

Et essuie ton écran !!! :)
:)  :)  :)  :)  :)  :)


'J'espère que tu n'as pas raccordé directement le 12V à A0 ?'
           Non, pour l'instant ce n'est que de la théorie.
           j'attends toujours mes jouets  :smiley-cry:  :smiley-cry:  :smiley-cry:

ArduinoFree


ArduinoFree

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.

@+

As-tu un schéma de câblage pour voir où je mets  les résistances stp ?

Merci

hbachetti

Facile : une simple question sur google :

arduino mesure tension pont diviseur

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...


Go Up