Affichage de température sur écran Oled avec une sonde DS18b20

Bonjour a tous

J’ai fait l’acquisition d’un Arduino méga il y a tous juste un mois, et découvre donc le langage qui va avec,
pour m’exercer je me suis fait un petit montage avec un écran Oled 1.3" sh1106 et un capteur de température numérique DS18b20.

Pour faire fonctionnér l’ensemble j’ai utilisé plusieurs librairie:
OneWire, DallasTemperature, Wire, et U8glib.

Comme précisé plus haut je découvre la programmation, je me suis donc dans un premier temps servi d’un exemple de la bibliothèque DallasTempérature, et au travers de divers sites, blogs, et autres, trouvé des informations affin d’avoir un affichage de la température sur l’écran Oled.

Ca fonctionne mais avec une bémol…, quand la température change, l’affiche met du temps a se rafraichir et affiche des chiffres tronqués, après une a deux seconde l’affichage ce stabilise et devient lisible.

Je n’ai pas trouvé d’où vient le problème, certainement par manque de connaissance et de pratique.

Je met le code en question ci dessous, si je pouvais avoir une explication ca serait sympa, n’oublier pas que je débute soyer donc indulgent,merci.

#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>  
#include "U8glib.h"
//------------------------------------------------------------------
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI 

#define ONE_WIRE_BUS 11

OneWire oneWire(ONE_WIRE_BUS);
 
DallasTemperature sensors(&oneWire);
//------------------------------------------------------------------
void setup(void)
{
  //  start serial port
  //  Serial.begin(9600);
  //  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}
//------------------------------------------------------------------
void loop(void)
{
   u8g.firstPage();  
  do {
     draw();  
     } while( u8g.nextPage() );    
 
  //delay(50);
}
//-----------------------------------------------------------------
void draw()
{

    sensors.requestTemperatures();        
                                         
    float x=sensors.getTempCByIndex(0);
                                         
    u8g.setFont(u8g_font_courB10r);    
    u8g.setPrintPos(4,33);
    u8g.print("Temp:"+String(x));
}

Bonne journée.
Cordialement

Salut,

Je connais pas la lib mais généralement modification = effacement préalable de la page (si on bosse en mode un peu bourrin mais ça fait le job) avant de la mettre à jour.

Logiquement tu dois avoir une fonction clear() ou équivalente qui te permet de tout effacer.

Les piste d'amélioration ensuite :

  • sépare la mesure de l'affichage : ça sert à rien de mettre à jour continuellement mais uniquement quand la température change ;) tu gagneras en ressource CPU (si jamais tu veux ajouter des fonctions plus tard).
  • ne changer que les chiffres qui changent. Ca c'est plus velu à faire ... Mais très formateur

B@tto: - ne changer que les chiffres qui changent. Ca c'est plus velu à faire ... Mais très formateur

C'est expliqué ici, pour la librairie LiquidCrystal...

bonjour, le ds18b20 a besoin d'un peu de temps pour acquérir la temp suivant le degré de précision demandé.

mais je doute sur l"efficacité de ton code avec les modifs. le do while, me parait de trop, mais je ne connais pas bien la lib de cet lcd.

Bonsoir a tous

Merci pour vos réponses

Logiquement tu dois avoir une fonction clear()

Si il y en a une, et doit certainement y en avoir une, je ne l'ai pas trouvé, il faut dire que la bibliothèque U8glib est peut intuitive pour un débutant comparativement a d'autres.

sépare la mesure de l'affichage : ça sert à rien de mettre à jour continuellement mais uniquement quand la température change

Je pense aussi que de mettre a jour continuellement ca ne sert pas a grand chose, mais je suis encore incapable de réalisé cette prouesse, j'ai essayer mais en vain.

Ca c'est plus velu à faire ... Mais très formateur

Avant d'en arrivé la....

le ds18b20 a besoin d'un peu de temps pour acquérir la temp suivant le degré de précision demandé.

Je me demande si j'aurais pas fait mieux de prendre plutôt un capteur analogique, peut être plus simple a mettre en œuvre.

Pour le Lcd voici ce que j'ai

Bonne soirée Cordialement

essaye ceci pour faire un clear, car rien trouvé dans la lib

const byte LINE_MAX = 30; 
const byte ROW_MAX = 12; 
byte screen[ROW_MAX][LINE_MAX];

void clear_screen(void) {
  byte i, j;
  for( i = 0; i < ROW_MAX; i++ )
    for( j = 0; j < LINE_MAX; j++ )
      screen[i][j] = 0;  
}

Re

J’ai réussi a palier a mon problème de chiffre tronqué, tous s’affiche correctement.
Je m’excuse au près des puriste du C++ si mon code n’est pas écrit correctement, je ferais mieux en progressant.

Toute critiques est la bienvenue si toute fois elle es constructive.

@ infobarquee

Merci pour ton code j’essaierais demain par curiosité.

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

//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI
//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send ACK

//-----------------------------------------------------------------------------------------
#define ONE_WIRE_BUS 11

  OneWire oneWire(ONE_WIRE_BUS);

  DallasTemperature sensors(&oneWire);

  DeviceAddress tempEau = { 0x28, 0xFF, 0xDB, 0x63, 0x92, 0x15, 0x01, 0x54 }; //adresse du capteur D18B20
//-----------------------------------------------------------------------------------------
 float affEau=0.0;
//-----------------------------------------------------------------------------------------
void setup(void)
{
  sensors.begin();
  
  sensors.setResolution(tempEau, 9); //résolution possible (Bit): 9, 10, 11, 12
}
//-----------------------------------------------------------------------------------------
void draw(void)
{
  u8g.setFont(u8g_font_courB10r);    
  u8g.setPrintPos(4,33);
  u8g.print("Temp:"+String(affEau));   
}
//-----------------------------------------------------------------------------------------
void printTemperature(DeviceAddress deviceAddress)
{
  float tempCeau = sensors.getTempC(deviceAddress);     
   affEau=tempCeau;
}
//-----------------------------------------------------------------------------------------
void loop(void)
{
   //delay(2000); 
  sensors.requestTemperatures();
   u8g.firstPage();  
   do {
       draw();
      } while( u8g.nextPage() );    
  
  printTemperature(tempEau);
  
}

Cordialement

Bonsoir a tous

@ infobarquee

Ouups, j’ai oublier de te répondre.
Le bout de code que tu écrit ne fonctionne pas avec la bibliothèque, j’ai trouvé une autre solution, merci.

Cordialement