oled-i2c.ino

Teensy 3.2 · Fichier : oled-i2c.ino · Langage : Arduino · Usage : Afficher tension et uptime sur un écran OLED I2C SSD1306

Un écran OLED 128x64 en I2C affiche la tension lue sur A0 et le temps de fonctionnement. Le framebuffer géré par Adafruit_SSD1306 permet un affichage graphique complet (texte, courbes, sprites) avec un seul bus à deux fils.

Matériel requis

Un Teensy 3.2 (NXP Kinetis MK20DX256, Cortex-M4 @ 72 MHz, logique 3,3 V) alimenté par USB. 1 module OLED SSD1306 I2C (adresse 0x3C ou 0x3D).

Câblage

SDA (broche 18 sur Teensy 3.x, 18/19 sur 4.x), SCL (19/16), VCC 3,3 V, GND. Le module accepte le 3,3 V logique.

Fonctionnement

Wire pilote l'I2C 400 kHz ; le framebuffer 128x64 est construit en RAM puis transféré d'un bloc par display(). L'ADC 12 bits donne la tension sur A0 (max 3,3 V).

Exécution

Installer le plugin Teensyduino dans l'Arduino IDE, choisir la carte « Teensy 3.2 », cliquer sur Téléverser puis sur le bouton du Teensy Loader. Attention : broches en 3,3 V.

Variantes

Dessiner une courbe temps réel des mesures (drawPixel dans une boucle), ou afficher le niveau d'un capteur tactile en barre.

oled-i2c.ino

// OLED 0,96" SSD1306 (I2C 0x3C) avec la bibliotheque Adafruit_SSD1306.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define ADRESSE 0x3C
#define RAZ -1 // pas de broche reset sur les modules I2C

Adafruit_SSD1306 ecran(128, 64, &Wire, RAZ);

void setup() {
  Serial.begin(9600);
  Wire.setClock(400000); // les Teensy montent a 400 kHz sans souci
  if (!ecran.begin(SSD1306_SWITCHCAPVCC, ADRESSE)) {
    Serial.println(F("OLED absent (verifier 0x3C/0x3D)"));
    for (;;);
  }
  ecran.clearDisplay();
  ecran.setTextColor(SSD1306_WHITE);
  ecran.setTextSize(1);
  ecran.setCursor(0, 0);
  ecran.println(F("Teensy + OLED"));
  ecran.display();
}

void loop() {
  static unsigned long t0 = 0;
  if (millis() - t0 < 500) return;
  t0 = millis();

  analogReadResolution(12);
  float v = analogRead(A0) * 3.3 / 4095.0;

  ecran.clearDisplay();
  ecran.setCursor(0, 0);
  ecran.print(F("A0 : ")); ecran.print(v, 2); ecran.println(F(" V"));
  ecran.print(F("Up : ")); ecran.print(millis() / 1000); ecran.println(F(" s"));
  ecran.display(); // transfert du framebuffer vers l'ecran
}

← Retour à la fiche