Arduino, DHT22 et écran OLED 128*64

Capteur de température et humidité, avec affichage sur un petit écran LCD.

Suite à mon article précédent sur l’écran OLED 0,96″ 128*64, j’ai ajouté sur mon Uno une sonde DHT22 afin de faire des relevés de température et d’humidité, puis de les afficher sur le petit écran.

L’afficheur OLED possède 4 connecteurs :

  1. VCC
  2. GND
  3. SCL
  4. SDA

Pour la sonde de température et humidité :

  1. + (positif)
  2. out (données)
  3. – (négatif)

Aussi bien le DHT22 que l’afficheur peuvent être alimentés en 3,3V comme en 5V, on a donc le choix avec l’Uno qui possède deux connecteurs 5V et un 3,3V !

J’ai donc connecté l’afficheur ainsi :

  • VCC sur 3,3V
  • GND sur GND
  • SCL sur SCL
  • SDA sur SDA

Pour la sonde :

  • + sur 5V
  • – sur GND
  • out sur le port 6

Résultat, presque bien :

temp_utf8_2

Ah, l’UTF-8 vient nous embêter même ici 🙂

Une solution est de remplacer dans le code les caractères non standards (comme les accents, ou le signe “degré”) par leur code hexadécimal, comme indiqué dans le tableau suivant.

u8g_font_unifont

Pour obtenir “é” on prend donc l’avant-dernière ligne, puis on commence à 0xe0, puis on compte de 0 à 9 puis A à F (c’est de l’hexadécimal…) ce qui nous donne Oxe9.

La ligne suivante :

u8g.print("Humidité: " + String(charhumidite) + "%");

va devenir :

u8g.print("Humidit" "\xe9" ": " + String(charhumidite) + "%");

Une autre solution est de recompiler l’IDE Arduino en mode UTF-8. Un peu moins évident…

Voici le code modifié :

#include "U8glib.h"
#include <dht.h>

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);

dht DHT;
float temperature;
float humidite;

#define DHT22_PIN 6

void draw(float temperature, float humidite) {
  char chartemperature[10];
  char charhumidite[10];
  u8g.setFont(u8g_font_unifont);
  dtostrf(temperature, 4, 1, chartemperature);
  dtostrf(humidite, 4, 1, charhumidite);

  u8g.setPrintPos(0, 22);
  u8g.print("Temp. : " + String(chartemperature) + "\xb0" "C");
  u8g.setPrintPos(0, 44);
  u8g.print("Humidit" "\xe9" ": " + String(charhumidite) + "%");
}

void setup(void) {
  // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255,255,255);
  }
}

void loop(void) {
  int chk = DHT.read22(DHT22_PIN);
  // READ DATA
  humidite = DHT.humidity;
  temperature = DHT.temperature;

  delay(1000);
  u8g.firstPage();  
  do {
    draw(temperature, humidite);
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  delay(50);
}

Si vous voulez le commander :
Ecran OLED 0.96″ 128X64 blanc pour Arduino

DHT22 Digital Temperature and Humidity Sensor AM2302 Module+PCB with Cable

8 comments

  • TarK`

    Petite modification du code, qui ne marchait pas.
    J’ai rajouté la ligne 42:
    int chk = DHT.read22(DHT22_PIN);
    Sans ça, les données ne sont pas lues sur le capteur.

    Aussi, la précision des données est de 1/10ème de degré et 0,1% d’humidité, donc nul beoin d’afficher deux chiffres après la virgule 🙂

  • Christian V

    Bonjour,
    Vous m’avez sauvé “la vie” en m’expliquant comment mettre des accents sur les “e”; Merci;
    Deux soucis toutefois. Un- si je fais \oxb7 j’obtiens bien un point (1 pixel) en hauteur. Si je fais \x2E j’obtiens non pas un point de 1 pixel mais une croix de 5 pixels !!!! Pourquoi ou alors où est le point ?
    Deux- je voudrais placer ce point de 1 pixel en séparateur décimal de coordonnées géographiques en degrés décimaux. (ex 45.14587). Actuellement mon écran 128×64 me fait une croix de 5 pixels idem que ci-dessus. Si !!! vous me donnez la solution pour avoir un vrai point comment l’insérer dans ma coordonnée.
    Merci.

    • TarK`

      1. Je n’ai pas testé le caractère \0x2e, je ne sais pas ce que ça donne sur l’écran… Mais pour le point, pourquoi ne pas taper un point normal (.) au clavier ?
      2. là sans le code je ne sais pas trop. J’ai l’impression qu’il s’agit simplement de manipulation de chaîne de caractères.

  • ChristianV

    De retour,
    J’ai avancé un peu …
    La police u8g.setFont(u8g_font_6x10); ne fait pas le point mais une croix même tapé au clavier. La police font_6x12 fait bien le point en 4 pixels carrés. Donc j’utilise cette police et c’est parfait.
    Le problème est aussi réglé pour le point décimal. En fait si la police 6×10 faisait ce point la combine aurait été de trouver une méthode pour insérer ce point entre deux parties d’un nombre décimal comme 43.56987
    je pense que c’est faisable avec un peu de sport mais l’affaire est réglée et bien réglée…
    Encore merci

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.