Cours du Bitcoin avec Arduino

Affichage du cours du Bitcoin

Le WiFi Kit 32 utilisé pour ce projet possède un écran graphique OLED de 64 ligne de 128 points. Cet écran va permettre d’afficher les informations suivantes:

  • l’état de connexion au point d’accès Wi-Fi
  • le symbole du Bitcoin
  • La valeur actualisé du Bitcoin.

Nous allons utiliser la bibliothèque lcdgfx déjà présentée dans l’article Comment programmer le WiFi Kit 32 avec l’Arduino IDE ?.

Pour commencer, je vous invite à installer la bibliothèque la bibliothèque “lcdgfx by Alexey Dynda” dans l’environnement Arduino. (L’opération est décrite ici.)

Puis à déclarer l’utilisation de cette bibliothèque dans notre projet:

#include <lcdgfx.h>

Le caractère € (euro) n’est pas présent dans les jeux de caractères pré-définis de cette bibliothèque. Aussi nous définissons un jeu de caractères complémentaire comme suit:

const PROGMEM uint8_t ssd1306_fonte_8x16_CaracteresSpeciaux []=
{
  0x01, // 
  0x08, // 0x08 = 8 - largeur de la police en pixels
  0x10, // 0x10 = 16 - hauteur de la police en pixels
  0x20,
  0x00, 0x82, 0x01, // Première partie du caractère Euro
  0x00, 0x00, 0x00, 0x80, 0x80, 0xE0, 0xB0, 0x98, 0x00, 0x00, 0x00, 0x02, 0x02, 0x0F, 0x1A, 0x12, // Symbole de l'euro
  0x00, 0xAC, 0x01, // Deuxième partie du caractère Euro
  0x88, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x22, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, // Symbole de l'euro
  0x00, 0x00, 0x00, // Fin du tableau de caractère
};

En suivant les explications décrites ici, la déclaration de l’objet global permettant de gérer l’afficheur d’un WiFi Kit 32 est:

DisplaySSD1306_128x64_I2C Afficheur_G(16,{-1, 0, 15, 4, 0});

Pour la configuration de l’écran dans la fonction “setup” de notre programme, nous commençons par son initialisation puis réalisons son effacement avant de sélectionner les jeux de caractères. La bibliothèque lcdgfx permet d’utiliser 2 jeux de caractères simultanément. Dans ce programme nous utilisons un jeu de caractère prédéfinis en 8 x 16 et le jeu de caractères spéciaux que nous avons défini pour le caractère € (euro):

  /* Initialisation de l'écran */
  Afficheur_G.begin();
  /* Effacement de l'écran */
  Afficheur_G.clear();
  /* Sélection des fontes de caractères */
  Afficheur_G.setFixedFont(ssd1306xled_font8x16, ssd1306_fonte_8x16_CaracteresSpeciaux);

Afin d’avoir un affichage plus convivial nous allons utiliser des images pour signaler l’état du Wi-Fi et illustrer la cryptomonnaie actuellement affichée.

Voici les fichiers images (.bmp) pour le Wi-Fi:

Image utilisée pour signaler une absence de signal Wi-Fi Première image utilisée pour signaler une tentative de connexion Wi-Fi Deuxième image utilisée pour signaler une tentative de connexion Wi-Fi Image utilisée pour signaler un signal Wi-Fi 100% fonctionnel

 

Et voici le fichier image pour le Bitcoin:

Logo du Bitcoin

Pour la conversion des fichier .bmp en tableaux hexadécimales compréhensibles par Arduino, je vous conseille l’utilisation de l’outil LCD Assistant également disponible ici. Son utilisation est décrite dans l’article “Température et humidité avec Arduino” au chapitre “Afficher une image“.

Pour une meilleure lisibilité de votre programme, je vous invite à stocker le résultat de cette conversion dans un fichier dédié “Image.h” dont voici le contenu:

const uint8_t ImageWifiNiveau_0 [] PROGMEM =
{
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F,
  0x0F, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

const uint8_t ImageWifiNiveau_1 [] PROGMEM =
{
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x78, 0x3C, 0x3C, 0x3C,
  0x3C, 0x3C, 0x3C, 0x78, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F,
  0x0F, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

const uint8_t ImageWifiNiveau_2 [] PROGMEM =
{
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0x78, 0x78, 0x78, 0x78,
  0x78, 0x78, 0x78, 0x78, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x01, 0x10, 0x38, 0x78, 0x3C, 0x3C, 0x3C,
  0x3C, 0x3C, 0x3C, 0x78, 0x38, 0x10, 0x01, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F,
  0x0F, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

const uint8_t ImageWifiNiveau_3 [] PROGMEM =
{
  0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
  0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00,
  0x04, 0x0E, 0x1E, 0x1F, 0x0F, 0x87, 0xC3, 0xE3, 0xE1, 0xF1, 0xF1, 0xF0, 0x78, 0x78, 0x78, 0x78,
  0x78, 0x78, 0x78, 0x78, 0xF0, 0xF1, 0xF1, 0xE1, 0xE3, 0xC3, 0x87, 0x0F, 0x1F, 0x1F, 0x0E, 0x04,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x01, 0x10, 0x38, 0x78, 0x3C, 0x3C, 0x3C,
  0x3C, 0x3C, 0x3C, 0x78, 0x38, 0x10, 0x01, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F,
  0x0F, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

const uint8_t ImageBitcoin [] PROGMEM =
{
  0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xFF, 0xF0, 0xE0, 0xF0,
  0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xC0, 0xC0,
  0xC0, 0xC0, 0xC1, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x01, 0x01,
  0x01, 0x81, 0x81, 0x83, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x07, 0x07, 0x07,
  0xFF, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

L’ajout de ce fichier d’en-tête à votre projet Arduino s’effectue de la façon suivante:

1) Enregistrez le fichier “Image.h” au même endroit que votre fichier croquis en .ino .

2) Fermez l’IDE Arduino

3) Ré-ouvrez votre projet dans l’éditeur Arduino,  un deuxième onglet apparait nommé “Image.h”.

4) Indiquez au compilateur qu’une partie de vos déclarations se situe dans un fichier séparé par l’instruction “#include” au début de votre fichier principal (.ino) de code logiciel:

#include "image.h"

Passons maintenant à la fonction d’affichage de la valeur et du symbole du Bitcoin.

Nous déclarons la fonction “AfficherCrypto” qui prend:

  • pour 1er paramètre le cours de la cryptomonnaie (Bitcoin) mis en forme à l’aide de notre fonction “ExtractionCours” écrite précédemment.
  • pour 2ème paramètre une structure contenant les caractéristiques fixes de la cryptomonnaie, c’est à dire  son nom et son logo.

Voici la déclaration de cette fonction “AfficherCrypto”:

void AfficherCrypto(char*, crypto_t);

Le type de la structure “crypto_t” se compose d’un nom d’au maximum 19 caractères et d’un pointeur vers la mémoire flash contenant le logo:

typedef struct
{
  char id[20];
  PGM_VOID_P image;
} crypto_t;

Dans ce paragraphe nous nous focalisons sur le Bitcoin, aussi le tableau “cryptos” de structure de type “crypto_t” est uniquement complété avec les informations de cette cryptomonnaie:

crypto_t cryptos[] =
{
  {"Bitcoin", ImageBitcoin}
};

Dans ce chapitre, la fonction “AfficherCrypto” sera appelée par l’instruction suivante:

AfficherCrypto(cours_l, cryptos[0]);

Le corps de la fonction “AfficherCrypto” se compose essentiellement d’appel à des méthodes de notre objet “Afficheur_G” fournies par la bibliothèque lcdgfx.

La méthode “setColor” permet d’afficher sur l’écran OLED du WiFi Kit 32 des images stockées en mémoires flash.

Entre 2 affichages OLED, l’utilisation de la méthode “clear” introduit un scintillement de l’écran pas très agréable à l’œil. Aussi je vous invite à lui préférer un effacement localisé à l’aide de la méthode “fillRect” qui permet de tracer un rectangle plein et de la méthode “setColor” qui permet de sélectionner la couleur du pinceau (inverser la couleur du pinceau avec la couleur de fond d’écran dans ce cas).

Je vous propose le corps de la fonction “AfficherCrypto” suivant:

void AfficherCrypto(char *cours_p, crypto_t crypto_p)
{
  Afficheur_G.setColor(0);
  Afficheur_G.fillRect(0, 45, 127, 63);
  Afficheur_G.setColor(0xFFFF);
  Afficheur_G.printFixed (0, 8, crypto_p.id);
  Afficheur_G.drawBitmap1(0, 29, 32, 32, (const uint8_t*)crypto_p.image);
  Afficheur_G.printFixed (127-(8*(strlen(cours_p))), 45, cours_p); // On ajoute le +1 car le signe euros s'étale sur 2 caractères
}

Il ne reste plus qu’à modifier la fonction GestionConnexionWifi pour y ajouter les appels à nos 4 images signalant l’état du réseau Wi-FI:

void GestionConnexionWifi()
{
  // Variables de la fonction
  static wl_status_t StatutConnexion_L = WL_DISCONNECTED; // Pour mémoriser l'état de la connexion

  // Verification du statut de la connexion
  StatutConnexion_L = WiFi.status();

  if(WiFi.status()!=WL_CONNECTED)
  {
    Serial.println("Connexion au point d'accès Wi-Fi ...");
    WiFi.begin(SSID_L, MOT_DE_PASSE_L); // Tentative de connexion au point d'accès Wi-Fi
    StatutConnexion_L = WiFi.status(); // Lecture de l'état de la connexion et mémorisation dans la variable "StatutConnexion_L"
    while ((StatutConnexion_L != WL_NO_SSID_AVAIL)&&(StatutConnexion_L != WL_CONNECTED)&&(StatutConnexion_L != WL_CONNECT_FAILED))
    {
      Afficheur_G.drawBitmap1(95, 0, 32, 32, ImageWifiNiveau_0);
      delay(300);
      Afficheur_G.drawBitmap1(95, 0, 32, 32, ImageWifiNiveau_1);
      delay(300);
      Afficheur_G.drawBitmap1(95, 0, 32, 32, ImageWifiNiveau_2);
      delay(300);
      Afficheur_G.drawBitmap1(95, 0, 32, 32, ImageWifiNiveau_3);
      delay(300);
      StatutConnexion_L = WiFi.status(); // Lecture de l'état de la connexion et mémorisation dans la variable "StatutConnexion_L"
    }
    // Affichage du résultat de la tentative de connexion
    if (StatutConnexion_L == WL_CONNECTED)
    {
      Serial.println("Connection OK");
      ClientWeb_G.setInsecure();  //  On ne vérifie pas les certificats ni les empreintes https 
    }
    else if (StatutConnexion_L == WL_NO_SSID_AVAIL)
    {
      Afficheur_G.drawBitmap1( 95, 0, 32, 32, ImageWifiNiveau_0);
      Serial.println("SSID introuvable");
    }
    else if (StatutConnexion_L == WL_CONNECT_FAILED)
    {
      Afficheur_G.drawBitmap1( 95, 0, 32, 32, ImageWifiNiveau_0);
      Serial.println("Mot de passe KO");
    }
    else
    {
      Afficheur_G.drawBitmap1( 95, 0, 32, 32, ImageWifiNiveau_0);
      Serial.println("Autre erreur");
    }   
  }  
}

Le chapitre consacré à l’affichage du cours du Bitcoin est terminé. Le code logiciel Arduino (de ce chapitre) est disponible à ce lien. N’oubliez pas de le compléter en y renseignant les identifiants de votre point d’accès Wi-Fi (Nom du réseau ligne 9 et mot de passe ligne 10).

Une fois le code logiciel compilé puis transféré dans le WiFi Kit 32, voici ce que nous obtenons:

Suivre le cours du Bitcoin avec Arduino

Pour allez plus loin, je vous propose maintenant d’afficher d’autre cryptomonnaies. Si cela vous intéresse, rendez-vous page suivante.

Laisser un commentaire