Station de mesures – Visualisation des données 1/

Introduction :

Dans le cadre d’un projet de réalisation d’une station de mesures nous allons voir dans cet article comment restituer les données sur un écran physique de type OLED.

Présentation :

La société “Solomon Systech” fournit plusieurs types de puces permettant de contrôler des écrans OLED.
Dans cet article nous utiliserons le SSD1331 (Solomon Systec Driver 1331). Pour plus de précisions sur les autres types de contrôleurs d’écrans OLED disponibles vous pouvez consulter la page http://www.solomon-systech.com/en/product/advanced-display/oled-display-driver-ic/

L’écran OLED SSD1331 dont on peut voir une photo ci-dessous permet de disposer d’un afficheur couleur de bonne qualité pour un prix modique :

Les caractéristiques de cet écran sont les suivantes :

  • Écran :
    • Type OLED,
    • 96 * 64 pixels de résolution,
    • 0.96″ de diagonale,
    • 16-bits pour la couleur (65 536 couleurs),
    • Circuit intégré de contrôle : SSD1331
  • Alimentation :
    • 3.3V à 5V pour l’alimentation et les données,
    • Faible consommation du fait de la technologie OLED ne nécessitant pas de rétroéclairage, environ 25 mA.
  • Pattes :

phmo_ssd1331_photo connexion

  • GND : Masse (Ground),
  • VCC : Alimentation,
  • SCL : Horloge (Serial clock),
  • SDA : Données (Serial Data),
  • RES : Reset,
  • DC : Data ou Command :
    • si à l’état bas alors les données transmises sont traitées comme des commandes,
    • si à l’état bas alors les données transmises sont traitées comme une image,
  • CS : Sélection écran (Chip Select).
  • En terme d’interface, le module permet trois méthodes de communication :
    • Série SPI (Serial Peripheral Interface) avec 4 fils :
      1. MOSI (Master Out Slave In) : Transport des données du maitre vers le périphérique SPI (ici Arduino D11 vers écran) ,
      2. MISO (Master In Slave Out) : Transport des données en provenance du périphérique SPI (non utilisé ici) vers le maitre,
      3. SS (Slave Select) : Indique au périphérique connecté sur le bus que le maitre souhaite communiquer avec lui (Arduino D10 vers écran ici),
      4. SCK (Serial clock) : Horloge (D13 Arduino).
    • Parallèle sur 8 bits aux formats 6800 et 8080.
  • Datasheet :

Disponible par exemple ici : https://www.crystalfontz.com/controllers/SolomonSystech/SSD1331/

Mise en œuvre :

Montage :

  • Branchements avec un Arduino UNO :

  • Branchements avec un ESP8266 :
    • SCL D5        >  écran : SCL pin (Serial Clock)
    • MOSI D7     > écran : SDA pin (Serial Data)
    • RST D6        > écran : RES pin (Reset)
    • DC D8          > écran : DC pin (Data or Command)
    • CS D0           > écran : CS pin (Chip Select)

 

  • Branchements avec un ESP32 :

Pour cet article j’ai utilisé un Arduino UNO que l’on peut voir sur la photo du montage ci-dessous :

Programmation :

Pour le code je me suis appuyé sur les library d’Adafruit suivantes :

  • Adafruit SSD1331 OLED DRIVER library,
  • Adafruit GFX.

 

Elles sont disponibles ici :

Pour plus d’infos vous pouvez consulter la page https://learn.adafruit.com/096-mini-color-oled/wiring

D’autres bibliothèques sont disponibles comme par exemple ucglib disponible sur la page http://www.arduinolibraries.info/libraries/ucglib

Le code de mon sketch Arduino est le suivant :

//Programme   : Affichage temperature, pression, humidite 
//              sur ecran OLED couleur SSD1331 meusre avec
//              un capteur BME280
//Auteur      : PHMARDUINO
//Date        : Le 21 11 2017
//Commentaire : Base sur les sources ADAFRUIT ET SPARKFUN

#include <stdint.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include "SparkFunBME280.h"
#include "Wire.h"
#include <SPI.h>

//Instanciation dun objet de type BME280
BME280 mySensor;

//Definition pattes ecran oled SSD1331
#define sclk 13
#define mosi 11
#define cs   10
#define rst  9
#define dc   8

//Definition des couleurs
#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0
#define WHITE           0xFFFF

//Initilisalisation ecran Oled
Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, rst);

// Declaration des variables pour les mesures
  float temp;   //Variable stockage température
  float pres;   //Variable stockage pression 
  float hum;    //Variable stockage humidite  

void setup(void)
{
  mySensor.settings.commInterface = I2C_MODE;
  mySensor.settings.I2CAddress = 0x76;
  mySensor.settings.runMode = 3; //Normal mode
  mySensor.settings.tStandby = 0;
  mySensor.settings.filter = 0;
  mySensor.settings.tempOverSample = 1;
  mySensor.settings.pressOverSample = 1;
  mySensor.settings.humidOverSample = 1;
  
  Serial.begin(57600);
  Serial.print("Demarrage du BME280...");
  
  delay(10);  //On laisee au BME280 le temps de demarrer, a minima 2ms
  Serial.println(mySensor.begin(), HEX);
  
  //Informations initiales a afficher
  display.begin();
  display.fillScreen(BLACK);
  
  display.fillRect(0, 0, 96, 15, YELLOW);
  display.drawRect(0, 0, 96, 15, WHITE);
  
  display.fillRect(0, 16, 96, 15, WHITE);
  display.drawRect(0, 16, 96, 15, BLUE);

  display.fillRect(0, 32, 96, 15, WHITE);
  display.drawRect(0, 32, 96, 15, BLUE);

  display.fillRect(0, 48, 96, 15, WHITE);
  display.drawRect(0, 48, 96, 15, BLUE);
  

  display.setTextSize(1);
  display.setTextColor(BLUE);
  display.setCursor( 20, 5 );
  display.print( "MESURES" );
}

void loop(void)
{
  //Lecture donnees
  Serial.print("Temperature : ");
  temp = mySensor.readTempC();
  Serial.print(temp, 2);
  Serial.println(" degres C");

  Serial.print("Pression : ");
  pres = mySensor.readFloatPressure()/100.0;
  Serial.print(pres, 2);
  Serial.println(" hPa");

  Serial.print("%RH : ");
  hum = mySensor.readFloatHumidity();
  Serial.print(hum, 2);
  Serial.println(" %");
  
  Serial.println();

  //Actualisation affichage

  display.fillRect(0, 16, 96, 15, WHITE);
  display.fillRect(0, 32, 96, 15, WHITE);
  display.fillRect(0, 48, 96, 15, WHITE);
  display.setTextSize(1);
  display.setTextColor(RED);
  display.setCursor( 3, 20 );
  display.print("T: ");
  display.setCursor( 3, 36 );
  display.print("P: ");
  display.setCursor( 3, 52 );
  display.print("H: ");
  
  display.setCursor( 17, 20 );
  display.print( temp );
  display.setCursor( 17, 36 );
  display.print( pres );
  display.setCursor( 17, 52 );
  display.print( hum );

  display.setCursor( 65, 20 );
  display.print("deg C");
  display.setCursor( 65, 36 );
  display.print("hPa");
  display.setCursor( 65, 52 );
  display.print("%");

  delay(1000);
}



 

Résultats obtenus :

Moniteur série :

Ecran OLED :

 

 

 

Publicités

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s