Actuellement, pour consulter les sondes ou d’autres informations, il est necessaire soit de choper son smartphone, soit son PC, voire, se lever du canapé pour aller devant la console centrale, rangé près de la liste des courses et du thermostat de la chaudière. Cette derniere est un eepc très habilement cloué au mur.

console

A terme, l’idée est de pouvoir integrer des ecrans LCD ou OLED directement à certains des boitiers à base de wemos/arduino. L’idée est de rendre l’utilisation la plus simple possible.

J’ai des tests en cours sur des LCD. Ce sont des afficheurs basés sur le super classique hd44780 dont voici un représentant tout à fait commun.

hd44780

Sa grosse limite principale est de ne pouvoir afficher que des caractères. En revanche, il est utilisable via 8 ou 4 pins (pour les gens riches en pins) ou en I²C via un driver. Si on veut du pixel, on peut se rabattre sur le légendaire écran du Nokia 3110/3310/… qui utilise la meme technologie LCD, mais, on peut y afficher des pixels .

nikia

C’est là que la technologie OLED arrive, elle a certains avantages sur le LCD :

  • Les OLED sont plus fines
  • Les OLED ne consomment pas quand elles affichent du noir, dans ce cas, elles sont juste éteintes
  • Les OLED produisent leur propre lumiere, il n’est pas necessaire d’avoir de système de rétroéclairage.

Pour ce premier test, je me suis tourné vers un tout-piti-rikiki écran OLED de …. 0.96" (ça fait 2,43 cm de diagonale, on est large) auquel on cause en I²C ;). Cela ressemble à ça :

oled

vous le voyez là aussi, sur une breadboard, pas loin d’un SHT30 (dont on parlera plus tard) et de Wemos D1.

oled

Oui, l’APN me fait du flou quand le mode grande ouverture est activé et que je suis trop proche :/

Coté code, c’est limite trivial :


// Les includes qui sont tous dans les dépots Arduino 

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// La config (Attention sur des Wemos, on defini la pin OLED_RESET à 0 contrairement aux arduinos vanilla )

#define OLED_RESET 0
Adafruit_SSD1306 OLED(OLED_RESET);

et coté usage :


  OLED.println(" OK");
  OLED.display()

Bref, c’est très dur … ;)

En gros, le bout de code ci dessous, va afficher des notifications de tous les capteurs de la maison, depuis le serveur MQTT (dont on reparlera aussi)


#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


// Oled
#define OLED_RESET 0  // GPIO0
Adafruit_SSD1306 OLED(OLED_RESET);

#define WIFI_SSID "LeWiFiDuVoisin"
#define WIFI_PASS "TPdElecEchec"

#define MQTT_SERVER "192.168.0.4"

void callback(char* topic, byte* payload, unsigned int length) {
  OLED.setCursor(0,0);
  OLED.setTextSize(2);
  OLED.println(" * NOTIF *");
  OLED.setTextSize(1);
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]);
    OLED.print((char)payload[i]);
  }
  Serial.println();
  OLED.display();
  delay(1000);
}

WiFiClient espClient;
PubSubClient mqttClient(espClient);

void reconnect() {
  // Loop until we're reconnected
  while (!mqttClient.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (mqttClient.connect("arduinoClient")) {
      Serial.println("connected");
      // ... and resubscribe
      //mqttClient.subscribe("display/oled");
      mqttClient.subscribe("#");
    } else {
      Serial.print("failed, rc=");
      Serial.print(mqttClient.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup()
{
  Serial.begin(115200);
  OLED.begin();
  OLED.display();
  delay(1000);
  OLED.clearDisplay();
  OLED.display();
  delay(200);
  Serial.println();


  OLED.setTextWrap(true);
  OLED.setTextSize(1);
  OLED.setTextColor(WHITE);
  OLED.setCursor(0,0);
  OLED.print("Wifi ");
  OLED.display(); //output 'display buffer' to screen
  WiFi.begin(WIFI_SSID,WIFI_PASS);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    OLED.print('.');
    OLED.display();
  }
  Serial.println("WiFi connected");
  OLED.println(" OK");
  OLED.print("MQTT");
  OLED.display();
  mqttClient.setServer(MQTT_SERVER, 1883);
  mqttClient.setCallback(callback);
  OLED.println(" OK");
  OLED.display();

  // Allow the hardware to sort itself out
  delay(1500);
}

void loop()
{
  OLED.clearDisplay();
  OLED.display();
  if (!mqttClient.connected()) {
    reconnect();
  }
  mqttClient.loop();
}

Le petit test, pour la forme :

oled_test

Bisoux ! ;)