Skip to content

Instantly share code, notes, and snippets.

@haeshh
Created April 10, 2021 14:08
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save haeshh/44c22538c8dfbbc8082ad832fd9c2997 to your computer and use it in GitHub Desktop.
OLED-Diplays mit SSD1306-Chipsatz am ESP32 (Beispielprogramme; siehe https://unsinnsbasis.de/oled-display-ssd1306/)
/* SSD1306 OLED-Display 128*64 Pixel
* und
* SD1306 OLED-Display 128*32 Pixel
* gleichzeitig ansprechen
*
* 2020-11-15 Heiko (unsinnsbasis.de)
*/
// Bibliothek für das Display
// bindet auch <Adafruit_GFX.h>, <SPI.h>, <Wire.h> ein
#include <Adafruit_SSD1306.h>
// großes Display am Standard-I2C-Interface
// (SDA Pin 21, SCL Pin 22)
// I2C-Adresse des Displays (0x3C oder 0x3D)
#define DISPLAY_1_I2C_ADDRESS 0x3C
// Auflösung des SSD1306-OLED-Displays
#define DISPLAY_1_WIDTH 128 // Breite in Pixeln
#define DISPLAY_1_HEIGHT 64 // Höhe in Pixeln
// kleines Display am zweiten I2C-Interface
// (SDA Pin 17, SCL Pin 16)
#define I2C_2_SDA 17
#define I2C_2_SCL 16
// I2C-Adresse des Displays (0x3C oder 0x3D)
#define DISPLAY_2_I2C_ADDRESS 0x3C
// Auflösung des SSD1306-OLED-Displays
#define DISPLAY_2_WIDTH 128 // Breite in Pixeln
#define DISPLAY_2_HEIGHT 32 // Höhe in Pixeln
// je I2C-Kanal ein Interface definieren
TwoWire I2C_1 = TwoWire(0);
TwoWire I2C_2 = TwoWire(1);
// Datenstrukturen für die Displays
// (-1 -> Display hat keinen Reset-Pin)
Adafruit_SSD1306 display1(DISPLAY_1_WIDTH, DISPLAY_1_HEIGHT, &I2C_1, -1);
Adafruit_SSD1306 display2(DISPLAY_2_WIDTH, DISPLAY_2_HEIGHT, &I2C_2, -1);
// Bitrate für die Datenübertragung zum seriellen Monitor
// (ESP: z.B. 115200, Arduino: zwingend 9600)
#define BITRATE 115200 // Arduino: 9600
void setup() {
bool status1, status2;
// Übertragungsrate zum seriellen Monitor setzen
Serial.begin(BITRATE);
Serial.println("Test mit 2 OLED-Displays");
// beide I2C-Interfaces nutzen
I2C_1.begin(); // Standard-Interface
I2C_2.begin(I2C_2_SDA, I2C_2_SCL); // 2. Interface
// Displays initialisieren
// im Fehlerfall Meldung ausgeben und Programm nicht
// fortsetzen (leere Dauerschleife))
status1 = display1.begin(SSD1306_SWITCHCAPVCC, DISPLAY_1_I2C_ADDRESS);
status2 = display2.begin(SSD1306_SWITCHCAPVCC, DISPLAY_2_I2C_ADDRESS);
if (!(status1 & status2)) {
Serial.println("Fehler beim Initialisieren der Displays");
Serial.print("Status Display 1: ");
Serial.print(status1);
Serial.print(" - Status Display 2: ");
Serial.print(status2);
Serial.println(" (1=OK)");
for (;;) ;
}
display1.clearDisplay();
display1.setTextSize(2); // große Schrift
display1.setTextColor(SSD1306_WHITE); // helle Schrift auf dunklem Grund
display1.setCursor(0, 0);
display1.print(" Grosse\nBuchstaben\n in vier\n Zeilen");
display1.display();
display2.clearDisplay();
display2.setTextSize(1); // kleine bzw. Standard-Schrift
display2.setTextColor(SSD1306_WHITE); // helle Schrift auf dunklem Grund
display2.setCursor(0, 0);
display2.println("Mit dem Unsinn lebt");
display2.println("es sich leichter als");
display2.println("mit der Sinnlosigkeit");
display2.print("(Ernst Reinhardt)");
display2.display();
}
void loop() {
}
/* SSD1306 OLED-Display 128*64 Pixel
*
* Anzeige der darstellbaren Zeichen
*
* 2020-11-15 Heiko (unsinnsbasis.de)
*/
// Bibliothek für das Display
// bindet auch <Adafruit_GFX.h>, <SPI.h>, <Wire.h> ein
#include <Adafruit_SSD1306.h>
// I2C-Adresse des Displays (0x3C oder 0x3D)
#define DISPLAY_I2C_ADDRESS 0x3C
// Auflösung des SSD1306-OLED-Displays
#define DISPLAY_WIDTH 128 // Breite in Pixeln
#define DISPLAY_HEIGHT 64 // Höhe in Pixeln
// Datenstruktur für das Display
// - Verbindung per I2C (Standard-Pins SCL, SDA)
// - Display hat keinen Reset-Pin
Adafruit_SSD1306 display(DISPLAY_WIDTH, DISPLAY_HEIGHT, &Wire, -1);
// Bitrate für die Datenübertragung zum seriellen Monitor
// (ESP: z.B. 115200, Arduino: zwingend 9600)
#define BITRATE 115200 // Arduino: 9600
int16_t i, j;
void setup() {
// Übertragungsrate zum seriellen Monitor setzen
Serial.begin(BITRATE);
// Display initialisieren
// im Fehlerfall Meldung ausgeben und Programm nicht
// fortsetzen (leere Dauerschleife))
if (!display.begin(SSD1306_SWITCHCAPVCC, DISPLAY_I2C_ADDRESS)) {
Serial.println("SSD1306 nicht gefunden");
for (;;) ;
}
}
void loop() {
display.clearDisplay(); // Display(buffer) löschen
display.setTextSize(1); // kleine Schriftgröße (Höhe 8px)
display.setTextColor(SSD1306_WHITE); // helle Schrift, dunkler Grund)
display.setCursor(0, 0); // links oben anfangen
display.cp437(true); // Zeichensatz der Codepage 437 verwenden
// erste Hälfte der Codepage (Zeichen 0-127)
for (i=0; i<8; i++) {
if (i == 0) {
display.print("00 ");
} else {
display.print(i<<4, HEX);
display.write(" ");
}
for (j=0; j<16; j++) {
if (i*16+j == '\n')
display.write(" ");
else
display.write(i*16+j);
}
display.write("\n"); // neue Zeile
}
display.display();
delay(5000);
display.clearDisplay();
display.setCursor(0, 0);
// zweite Hälfte der Codepage (Zeichen 128-255)
for (i=8; i<16; i++) {
display.print(i<<4, HEX);
display.write(" ");
for (j=0; j<16; j++) {
display.write(i*16+j);
}
display.write("\n"); // neue Zeile
}
display.display();
delay(5000);
}
/* Messung von Sensorwerten: DHT11
* (Temperatur und rel. Luftfeuchtigkeit)
*
* Anzeige der Messwerte auf OLED-Display
* Typ SSD1306 128*32 Pixel
*
* 2020-11-15 Heiko (unsinnsbasis.de)
*/
// Bibliotheken für den DHT11/22-Sensor
#include <Adafruit_Sensor.h>
#include <DHT.h>
#define DHTPIN 4 // Pin für Sensor-DATA
// Sensor-Typ: DHT11, DHT21 (AM2301) oder DHT22 (AM2302)
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE); // Datenstruktur für den Sensor
// Bibliotheken für das Display
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// I2C-Adresse des Displays (0x3C oder 0x3D)
#define DISPLAY_I2C_ADDRESS 0x3C
// Auflösung des SSD1306-OLED-Displays
#define DISPLAY_WIDTH 128 // Breite in Pixeln
#define DISPLAY_HEIGHT 32 // Höhe in Pixeln
// Datenstruktur für das Display
// - Verbindung per I2C (Standard-Pins SCL, SDA)
// - Display hat keinen Reset-Pin (-1)
Adafruit_SSD1306 display(DISPLAY_WIDTH, DISPLAY_HEIGHT, &Wire, -1);
// Bitrate für die Datenübertragung zum seriellen Monitor
// (ESP: z.B. 115200, Arduino: zwingend 9600)
#define BITRATE 9600 // Arduino: 9600
float temp, hum; // Variablen für Temperatur und Luftfeuchtigkeit
void setup() {
// Übertragungsrate zum seriellen Monitor setzen
Serial.begin(BITRATE);
dht.begin(); // Sensor initialisieren
// Display initialisieren
// im Fehlerfall Meldung ausgeben und Programm nicht
// fortsetzen (leere Dauerschleife))
if(!display.begin(SSD1306_SWITCHCAPVCC, DISPLAY_I2C_ADDRESS)) {
Serial.println("SSD1306 nicht gefunden");
for(;;);
}
}
void loop() {
temp = dht.readTemperature();
hum = dht.readHumidity();
display.clearDisplay(); // Display(puffer) löschen
display.setTextSize(1); // kleine Schriftgröße (Höhe 8px)
display.setTextColor(WHITE); // helle Schrift, dunkler Grund)
display.setCursor(0, 0); // links oben anfangen
if (isnan(temp)) {
Serial.println("Fehler beim Auslesen des DHT-Sensors.");
} else {
display.print("Temperatur: ");
display.print(temp, 1);
display.print("\xF7"); // Grad-Symbol ° in Codepage 437
display.println("C");
}
// gleiches Vorgehen für die Luftfeuchtigkeit
if (isnan(hum)) {
Serial.println("Fehler beim Auslesen des DHT-Sensors.");
} else {
display.print("rel. Feuchte: ");
display.print(hum, 1);
display.println("%");
}
// alle bisher nur in den Puffer geschriebenen Daten anzeigen
display.display();
delay(5000); // vor der nächsten Messung etwas warten
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment