GLCD DrawBitmap

Hallo,

ich bleibe gerade an einer Stelle in meinem Sketch stecken und finde trotz der UTFT Bedienungsanleitung nicht zum Ziel.
Ich möchte (Gegen Ende des ersten Sketchausschnitts) den Doppelpunkt zwischen der Stunden und Minuten ausblenden. Dazu habe ich zwei Zeichen angefertigt.

// Bibiotheken einbinden
#include <DS3232RTC.h>    // http://github.com/JChristensen/DS3232RTC
#include <Time.h>         // http://www.arduino.cc/playground/Code/Time  
#include <Wire.h>         // http://arduino.cc/en/Reference/Wire
#include <FastLED.h>      // http://fastled.io/
#include <UTFT.h>         // http://henningkarlsen.com/electronics/

const byte DATA_PIN = 6;
const byte NUM_LEDS = 8;
#define RGB_ORDER GRB;
CRGB leds[NUM_LEDS];

const byte TFT_MODEL = ITDB18SP;
const byte TFT_CS = 10;   // SS
const byte TFT_SCL = 13;  // SCK
const byte TFT_SDA = 11;  // MOSI
const byte TFT_RS = 9;
const byte TFT_RST = 8;
UTFT tft(TFT_MODEL, TFT_SDA, TFT_SCL, TFT_CS, TFT_RST, TFT_RS);

extern uint8_t SevenSegment[];        // 32 x 50px
extern uint8_t SevenSegmentDPoint[];  // 32 x 50px
extern uint8_t SevenSegmentSpace[];   // 32 x 50px

void setup() {
  setSyncProvider(RTC.get);

  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  memset(leds, 0, NUM_LEDS * 3);

  FastLED.show();
  tft.InitLCD();
  tft.clrScr();
}

void loop() {
  static byte i;
  for (int led = 0; led < NUM_LEDS; led++) leds[led] = CHSV(second() * 4, 255, 127);
  FastLED.show();

  static unsigned long lastMillisDisplay;
  static bool secondState;
  if (millis() - lastMillisDisplay >= 1000) {
    secondState = !secondState;
    tft.setFont(SevenSegment);
    tft.setBackColor(VGA_RED);
    tft.printNumI(hour(), 0, 20, 2, '0');
    //if (secondState == true) tft.drawBitmap(64,20,32,50,SevenSegmentDPoint);
    //else tft.drawBitmap(64,20,32,50,SevenSegmentSpace);
    tft.printNumI(minute(), 96, 20, 2, '0');
    lastMillisDisplay = millis();
  }
}
#include <avr/pgmspace.h>
 [...]

prog_uint8_t SevenSegmentDPoint[0xC8] PROGMEM = {
  // :
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x70, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xFC, 0x00,
  0x00, 0x01, 0xFC, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00,
  0xF8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xF8, 0x00,
  0x00, 0x01, 0xFC, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x01,
  0xFC, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x70, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

prog_uint8_t SevenSegmentSpace[0xC8] PROGMEM = {
  // Leerzeichen
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

Arduino IDE 1.5

Ich denke, das Problem liegt darin, dass Du im drawBitmap-Aufruf angibst, dass Du 32*50 = 1600 Pixel übermitteln willst, Dein Array aber nur 200 Pixel enthält. Ich nehme an, Du hast mit einem schwarz-weissen Bild gerechnet, aber das Display stellst 16bittige Bilder dar, also muss es die Informationen ja irgendwo her haben.

Wieso machst du das als Bitmap und nicht als Font?

Hallo pylon, Serenfly.

Das Problem war, dass es vom Author empfholen wurde, vollständige Fontsätze zu nutzen. Entweder numerisch (10 Zeichen) oder 95 Zeichen mit Buchstaben. Das Bild ist als "schwarzweiß" hinterlegt gewesen. Das kam aus dem vollständigen Fontsatz. Das Problem war, die Schriftarten, haben egal wie wenige ich benutzt habe, den Code unnötig aufgebläht.

Da ich für den Due gestern die IDE 1.5 wieder installiert habe, habe ich auch die Adafruit GFX erneut versucht zu installieren. Diesmal hat es geklappt mit der 1.5er anstatt 1.0. Bin soweit mit der Lib zufrieden. Hab meine LED Effekte (http://forum.arduino.cc/index.php?topic=198987.0) und das Display im Mini Pro locker unterbringen können. Display hab ich von Software SPI wieder umgestellt wegen den FastLeds. Auf dem Display lasse ich Uhrzeit und sonstiges anzeigen.

Compiling 'sketch_feb25a' for 'Arduino Pro or Pro Mini w/ ATmega328 (5V, 16 MHz)'
Binary sketch size: 14572 bytes (used 47% of a 30720 byte maximum) (0,65 secs)
Minimum Memory Usage: 581 bytes (28% of a 2048 byte maximum)
Uploading to I/O board using 'diamexavr'
Done uploading

Bin aber am überlegen, ggf. einen 2. Mini Pro zur Hilfe nehmen, da scheinbar die FastLed und Adafruit Lib sich nicht so vertragen, bzw. es schaft nur einer für Hardware SPI. Das Display muss nicht viele Daten erhalten. Geht nur um Textanweisungen etc. Bin am überlegen, die beiden Geräte dann einfach über Serial/I2C kommunzieren zu lassen. I2C hier die bessere Wahl, wenn es darum geht, die Timings der FastLed nicht in Mitleidenschaft zu ziehen?

Die Libary von Adafruit war nun auch nicht ganz so grausam wie gedacht. Vorteil ist, dass ich ohne Modifkationen an der Libary (die beim Update vermutlich verloren gegangen wären) nicht mehr machen muss. In der der Ada Lib gab es die Auswahl, welche Version ich vom Display habe und alles klappt nun auch farblich.

sschultewolter:
Das Problem war, dass es vom Author empfholen wurde, vollständige Fontsätze zu nutzen. Entweder numerisch (10 Zeichen) oder 95 Zeichen mit Buchstaben

Ist aber absolut unnötig. Vielleicht zur Veröffentlichung und besseren Lesbarkeit, aber in der Praxis spielt es keine Rolle.

Ich habe mir mir den Symbolfont auf die drei Symbole gekürzt die ich wirklich brauche. Den “Ubuntu” Font habe ich auf die Zahlen gekürzt. :slight_smile: Spart viel Speicher und ich bekomme was ich will.

Lediglich die Bezeichnung der Zeichen ändert sich dadurch. Das Leerzeichen passt sogar auf 0x20, und das nächste Zeichen kann man mit “\x21” ansprechen (statt “!” laut ASCII Tabelle).

Das Problem war, die Schriftarten, haben egal wie wenige ich benutzt habe, den Code unnötig aufgebläht.

Soweit ich mich erinnere hat die UTFT immer alle Fließkomma und Trigonometrie Routinen mit eingebunden, sobald man auch nur einen Buchstaben zeichnen wollte. Damit war der Flash dann voll.

Oliver

Alle nicht. sin() und cos() sind drin, da man bei print() optional die Ausrichtung in Grad angeben kann. Und dann eine Koordinaten-Transformation gemacht wird. Mit 4 Berechnungen pro Pixel ist es auch entsprechend langsam. Da kann man zuschauen. Das wäre wohl besser als eigene Funktion, statt mit Default Parametern

Aber eine der größeren Schriftarten selbst belegt auch gleich mal um die 9kb

Ich weiß zwar nicht, was du genau meinst mit Fließkommo und Trigonometrie, aber es war so, sobald du nur einen Buchstaben brauchst und die ganze *.c eingebunden hattest, war der Speicher spätestens bei der 2. *.c aufgebraucht.

Werd nachher erstmal testen, ob mein Mega mit der Adalib auch rummuckt. Hab keine einzige Verbindung mehr mit dem Display hinbekommen. Selber bei freier Pinwahl. Kurz am Mini dran und es ging wieder mit der UTFT.