Température et humidité avec Arduino

Afficher une image

Un des avantages de Dessin d'une icône de thermomètrel’écran OLED 0.96 par rapport à un module d’affichage LCD 16×2, est la possibilité d’afficher des images.  Nous allons profiter de cette possibilité pour égayer notre écran avec l’image du petit thermomètre ci-contre que je vous à télécharger sur votre PC.

Si vous le souhaitez, plutôt que d’utiliser cette image vous pouvez dessiner la votre avec un outil basique de dessin comme le « Paint » de  Windows. L’important est qu’il soit enregistré au format « .bmp » et qu’il possède les dimensions 27 x 64 pixels.

Pour convertir cette image en code logiciel compréhensible par le compilateur Arduino, je vous propose d’utiliser l’outil LCD Assistant également disponible ici.

Une fois dézippé, vous avez simplement à cliquer sur l’exécutable pour lancer le logiciel. Sélectionnez ensuite « Load image » dans le menu « File » et choisissez l’image du thermomètre que vous venez de télécharger. Une fois l’image chargée, le logiciel LCD assistant affiche les information suivante sur sa page principale:

Configuration de l'outil "LCD Assistant" pour notre projet d'affichage de la température et de l'humidité

Pour exporter le résultat de la conversion, choisissez « Save output » dans le menu « File » également. Vous obtenez alors un fichier avec le contenu suivant :

//------------------------------------------------------------------------------
// File generated by LCD Assistant
// http://en.radzio.dxp.pl/bitmap_converter/
//------------------------------------------------------------------------------

const unsigned char Thermometre_PGM [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x70, 0x18, 0x0C, 0x0C, 0x06, 0x06,
0x06, 0x06, 0x06, 0x04, 0x0C, 0x18, 0x38, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFE, 0xFF, 0xFE, 0x30, 0x30, 0x30, 0x30, 0x30, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x08, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x38, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x1C, 0x70, 0xE0, 0x80, 0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3F, 0x61, 0x40, 0x40, 0x40, 0x61, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x30,
0x18, 0x18, 0x0C, 0x07, 0x03, 0x01, 0x00, 0x00,
};

La carte Arduino Uno que nous utilisons repose sur le microcontrôleur  Atmega328p qui ne possède que 2 k octets de SRAM pour la gestion des variables d’exécutions. Aussi, lorsqu’on travaille avec une quantité de données importante comme une image, on demande au microcontrôleur de lire directement les données en mémoire flash sans préalablement charger la totalité de ces données en SRAM. Ceci est obtenu en utilisant la déclaration de ces données importantes avec le mot clé « PROGMEM ».

Pour déclarer le tableau octet décrivant l’image à afficher, vous allez inclure le résultat de la conversion dans votre programme Arduino en le modifiant de la façon suivante :

// Déclaration globales
const uint8_t Thermometre_PGM [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x70, 0x18, 0x0C, 0x0C, 0x06, 0x06,
0x06, 0x06, 0x06, 0x04, 0x0C, 0x18, 0x38, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFE, 0xFF, 0xFE, 0x30, 0x30, 0x30, 0x30, 0x30, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x08, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x38, 0x0F, 0x07, 0x00,
0x00, 0x00, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x00, 0x00, 0x07,
0x0F, 0x1C, 0x70, 0xE0, 0x80, 0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1E, 0x3F, 0x61, 0x40, 0x40, 0x40, 0x61, 0x3F, 0x1F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0E,
0x18, 0x18, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x30,
0x18, 0x18, 0x0C, 0x07, 0x03, 0x01, 0x00, 0x00,
};

Ensuite, nous appelons la fonction « drawBitmap1 » pour dessiner notre image sur l’écran OLED. Vous remarquerez que cette fonction prend en paramètres les coordonnées d’affichage de l’image (0,0) et la taille de l’image (27,64) :

      Afficheur_G.drawBitmap1(0, 0, 27, 64, Thermometre_PGM);

Afin d’éviter que le texte affiché et l’image ne se superposent à l’écran, nous diminuons la longueur du texte affiché:

      sprintf(TexteTemperature_L, "Temper.: %d C", temperature_L);
      sprintf(TexteHumidite_L, "Humidite: %d%%", humidite_L);

Et nous décalons ce texte vers la gauche:

      Afficheur_G.printFixed (35, 16, TexteTemperature_L, STYLE_NORMAL);
      Afficheur_G.printFixed (35, 40, TexteHumidite_L, STYLE_NORMAL);

Ça y est ! Nous avons terminé notre programme ! Maintenant, il doit ressembler à ça :

// Déclaration des librairies utilisées
#include "lcdgfx.h"
#include "SimpleDHT.h"

// Déclaration globales
const uint8_t Thermometre_PGM [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x70, 0x18, 0x0C, 0x0C, 0x06, 0x06,
0x06, 0x06, 0x06, 0x04, 0x0C, 0x18, 0x38, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFE, 0xFF, 0xFE, 0x30, 0x30, 0x30, 0x30, 0x30, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x08, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x38, 0x0F, 0x07, 0x00,
0x00, 0x00, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x00, 0x00, 0x07,
0x0F, 0x1C, 0x70, 0xE0, 0x80, 0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1E, 0x3F, 0x61, 0x40, 0x40, 0x40, 0x61, 0x3F, 0x1F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0E,
0x18, 0x18, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x30,
0x18, 0x18, 0x0C, 0x07, 0x03, 0x01, 0x00, 0x00,
};
DisplaySSD1306_128x64_I2C Afficheur_G(-1);
SimpleDHT11 CapteurDHT11_G(4);

// Fonction de démarrage, s'exécute une seule fois:
void setup()
{
    /* Sélection de la fonte de 6x8 */
    Afficheur_G.setFixedFont( ssd1306xled_font6x8 );


    // Initialisation et effacement de l'écran   
    Afficheur_G.begin();
    Afficheur_G.clear();
}

// Fonction principale du programme, s'exécute en boucle:
void loop()
{
    byte temperature_L = 0;
    byte humidite_L = 0;
    char TexteTemperature_L[100];
    char TexteHumidite_L[100];
    int CodeRetour_L;

    CodeRetour_L = CapteurDHT11_G.read(&temperature_L, &humidite_L, NULL);
    if( CodeRetour_L == SimpleDHTErrSuccess)
    {
      Afficheur_G.drawBitmap1(0, 0, 27, 64, Thermometre_PGM);
      sprintf(TexteTemperature_L, "Temper.: %d C", temperature_L);
      sprintf(TexteHumidite_L, "Humidite: %d%%", humidite_L);
      Afficheur_G.printFixed (35, 16, TexteTemperature_L, STYLE_NORMAL);
      Afficheur_G.printFixed (35, 40, TexteHumidite_L, STYLE_NORMAL);
    }
    else
    {
      Afficheur_G.printFixed (5, 30, "Erreur d'acquisition !!!", STYLE_NORMAL);
    }
    delay(2000);
    Afficheur_G.clear();   
}

Une fois le code logiciel compilé puis transféré dans l’Arduino, voici ce que nous obtenons:

Ecran Oled 0.96 affichant une image, la température et l'humidité

Rendre le prototype compact et mobile:

Afin de pouvoir rendre notre montage Arduino de mesure de la température et de l’humidité plus compact et transportable, je vous propose d’utiliser les 2 accessoires suivants:

Fiche pile 9V pour connecteur d'alimentation Arduino Extension de protoypage pour Arduino  
Fiche 9V ProtoSchield  

Concernant l’alimentation de notre projet, nous allons utiliser un adaptateur permettant de relier une pile 9V au connecteur jack femelle d’alimentation de la carte Arduino. Cet adaptateur nous permettra d’enlever le fil qui relie notre réalisation au PC, une fois le programme transféré :

Alimenter la carte Arduino avec une simple pile 9V

Si ce n’est pas déjà fait, collez la mini plaque d’essai sur le ProtoSchield en ôtant la bande de protection de l’adhésif situé sous la plaque afin d’avoir un ensemble solidaire :

Coller la mini-plaque d'essai sur le ProtoSchield

Afin d’avoir un ensemble compact, j’ai choisi de positionner la pile 9V sous la carte Arduino en la maintenant avec un élastique. Attention, les piles sont souvent enrobées d’un revêtement métallique, aussi j’ai découpé un morceau de carton que j’insère entre le circuit imprimé et la pile :

Assemblage de la carte Arduino, du ProtoSchield et de la pile 9V

Maintenant, que vous avez compris le principe, je vous invite à reproduire le câblage précédent sur cette nouvelle mini carte d’essai.

Le projet est maintenant terminé ! Amusez-vous bien :

Laisser un commentaire