Test von 2017
Text auf OLED speicherschonend darstellen
Aufgabe: Ein bestehendes Projekt mit Nano möchte ich um die Anzeige von Text erweitern. Dazu erstelle ich auf einem UNO einen Testsketch, der einen Text möglichst speicherschonend darstellen soll.
Hardware: UNO über I2C mit 0,96" OLED, programmiert mit IDE 1.6.5
1. Versuch: Adafruit_SSD1306 mit Sketch abgeleitet von ssd1306_128x64_i2c.ino
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET -1
Adafruit_SSD1306 oled(OLED_RESET);
void setup() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C = 0x78/2 (for the 128x64)
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(0, 0);
oled.println("21.8.2017 11:11");
oled.display();
}
void loop() {}
Der Sketch verwendet 10.130 Bytes (31%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 1.395 Bytes (68%) des dynamischen Speichers, 653 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
Neben verschiedenen Warnungen ist der Speicherverbrauch nicht akzeptabel, einen reinen Textmodus habe ich aber nicht gefunden.
2. Versuch: Oliver Kraus
Test_Forum.ino.386-002
#include <Arduino.h>
#include "U8g2lib.h"
#include <SPI.h>
#include <Wire.h>
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0);
void setup(void) {
oled.begin();
}
void loop(void) {
oled.firstPage();
do {
oled.setFont(u8g2_font_6x12_tr);
oled.drawStr(0,12,"21.8.2017 11:11");
} while ( oled.nextPage() );
}
Der Sketch verwendet 8.694 Bytes (26%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 606 Bytes (29%) des dynamischen Speichers, 1.442 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
3. Versuch:
Test_Forum.ino.386-003
#include <Arduino.h>
#include "U8glib.h"
#include <SPI.h>
#include <Wire.h>
// setup u8g object, please remove comment from one of the following constructor calls
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST); // Fast I2C / TWI
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send AC
void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setColorIndex(1); // pixel on
//u8g.setFont(u8g_font_unifont);
u8g.setFont(u8g_font_6x10);
u8g.drawStr( 0, 10, "21.8.2017 11:11");
}
void setup(void) {
}
void loop(void) {
// picture loop
u8g.firstPage();
do {
draw();
} while ( u8g.nextPage() );
// rebuild the picture after some delay
delay(50);
}
Der Sketch verwendet 7.350 Bytes (22%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 455 Bytes (22%) des dynamischen Speichers, 1.593 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
4. Versuch:
Test_Forum.ino.386-004
#include "U8x8lib.h"
#include <SPI.h>
#include <Wire.h>
/* Constructor */
U8X8_SSD1306_128X64_NONAME_HW_I2C oled(-1);
/* u8x8.begin() is required and will sent the setup/init sequence to the display */
void setup(void)
{
oled.begin();
oled.setFont(u8x8_font_artossans8_r);
oled.drawString(0,16,"21.8.2017 11:11");
}
void loop(void){}
Der Sketch verwendet 5.912 Bytes (18%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 398 Bytes (19%) des dynamischen Speichers, 1.650 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
5. Versuch:
Test_OLED_128X64.ino.006 mit MicroLCD.h
In file included from Test_Forum.ino:2:0:
F:\Arduino\libraries\MicroLCD/MicroLCD.h:39:43: warning: '__progmem__' attribute ignored [-Wattributes]
virtual void draw(const PROGMEM byte* buffer, byte width, byte height) {}
^
F:\Arduino\libraries\MicroLCD/MicroLCD.h:38:18: warning: unused parameter 'on' [-Wunused-parameter]
virtual void backlight(bool on) {}
^
F:\Arduino\libraries\MicroLCD/MicroLCD.h:39:18: warning: unused parameter 'buffer' [-Wunused-parameter]
virtual void draw(const PROGMEM byte* buffer, byte width, byte height) {}
^
F:\Arduino\libraries\MicroLCD/MicroLCD.h:39:18: warning: unused parameter 'width' [-Wunused-parameter]
F:\Arduino\libraries\MicroLCD/MicroLCD.h:39:18: warning: unused parameter 'height' [-Wunused-parameter]
F:\Arduino\libraries\MicroLCD/MicroLCD.h:43:18: warning: unused parameter 'n' [-Wunused-parameter]
virtual void writeDigit(byte n) {}
^
F:\Arduino\libraries\MicroLCD/MicroLCD.h:53:10: warning: unused parameter 'line' [-Wunused-parameter]
void clearLine(byte line) {}
^
F:\Arduino\libraries\MicroLCD/MicroLCD.h:56:10: warning: unused parameter 'column' [-Wunused-parameter]
void setCursor(byte column, byte line) {}
^
F:\Arduino\libraries\MicroLCD/MicroLCD.h:56:10: warning: unused parameter 'line' [-Wunused-parameter]
F:\Arduino\libraries\MicroLCD/MicroLCD.h:57:12: warning: unused parameter 'c' [-Wunused-parameter]
size_t write(uint8_t c) { return 0; }
^
In file included from Test_Forum.ino:2:0:
F:\Arduino\libraries\MicroLCD/MicroLCD.h:67:35: warning: '__progmem__' attribute ignored [-Wattributes]
void draw(const PROGMEM byte* buffer, byte width, byte height);
^
F:\Arduino\libraries\MicroLCD/MicroLCD.h:84:35: warning: '__progmem__' attribute ignored [-Wattributes]
void draw(const PROGMEM byte* buffer, byte width, byte height);
^
In file included from Test_Forum.ino:2:0:
F:\Arduino\libraries\MicroLCD/MicroLCD.h:115:35: warning: '__progmem__' attribute ignored [-Wattributes]
void draw(const PROGMEM byte* buffer, byte width, byte height);
^
Der Sketch verwendet 8.712 Bytes (27%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 278 Bytes (13%) des dynamischen Speichers, 1.770 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
#define MEMORY_SAVING in MicroLCD.h
Der Sketch verwendet 5.818 Bytes (18%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 278 Bytes (13%) des dynamischen Speichers, 1.770 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
Ich hoffe, es hilft Dir ![]()