Witam serdecznie grono. Wziąłem się za wyświetlacz monochromatyczny 84x48, zgodny z PCD8544, kupiony na allegro.
Korzystam w projekcie z bibliotek:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Od razu mówię, że program testowy (pcdtest) działa, własne experymenty też pomyślne. Mam natomiast chęć wyświetlania własnej, monochromatycznej bitmapy i tutaj napotkałem trudności, do których straciłem cierpliwość.
Wiem z kilkunastu źródeł, że wyświetlanie jest możliwe po wgraniu do pamięci FLASH jakieś "mapy hexagonalnej", uzyskanej za pomocą chociażby programu: LCD ASSISTANT lub IMAGE2GLCD. Oto, co robię:
1) Tworzę obraz w paincie, w rozmiarze odpowiadającym rozmiarowi wyświetlacza 84x48.
2) Konwertuję .jpg na plik .c za pomocą programu IMAGE2GLCD
3) Uzyskuję "mapę", w postaci zmiennej, do której dodaję PROGMEM, np.:
const unsigned char PROGMEM test[504] = {
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, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF3, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0xFF, 0xE3, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xE3, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0xFC, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00,
0x00, 0x03, 0x80, 0x00, 0x00, 0x0F, 0x80, 0xFC, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07,
0x80, 0xF0, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0x00, 0x70, 0x00, 0x00, 0x00, 0x07,
0xC0, 0x00, 0x00, 0x07, 0x0C, 0x70, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x07, 0x3E, 0x70,
0x00, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x0E, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x00,
0x00, 0x0F, 0xF7, 0xF8, 0x00, 0x00, 0x3F, 0xFC, 0x7F, 0xF8, 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x00,
0x7F, 0xFC, 0x7F, 0xFC, 0x00, 0x1F, 0x80, 0xFC, 0x00, 0x00, 0x7F, 0xFC, 0x7F, 0xFC, 0x00, 0x1E,
0x00, 0x3C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xF8, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x0F, 0x80,
0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0xE0, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x1E, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xE0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x8E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDF,
0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0xF8, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x1F, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x80, 0x03, 0x80, 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,
0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
4) Fajno! Dalej wrzucam gościa, do przykładowego programu, który wydziubałem z pomocą wszelkich bibliotek:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
// this file generated by Image2GLCD
const unsigned char PROGMEM test[504] = {
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, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF3, 0xF8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0xFF, 0xE3, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xE3, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0xFC, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00,
0x00, 0x03, 0x80, 0x00, 0x00, 0x0F, 0x80, 0xFC, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07,
0x80, 0xF0, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0x00, 0x70, 0x00, 0x00, 0x00, 0x07,
0xC0, 0x00, 0x00, 0x07, 0x0C, 0x70, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x07, 0x3E, 0x70,
0x00, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x0E, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x00,
0x00, 0x0F, 0xF7, 0xF8, 0x00, 0x00, 0x3F, 0xFC, 0x7F, 0xF8, 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x00,
0x7F, 0xFC, 0x7F, 0xFC, 0x00, 0x1F, 0x80, 0xFC, 0x00, 0x00, 0x7F, 0xFC, 0x7F, 0xFC, 0x00, 0x1E,
0x00, 0x3C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xF8, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x0F, 0x80,
0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0xE0, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x1E, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xE0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x8E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDF,
0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0xF8, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x1F, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x80, 0x03, 0x80, 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,
0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void setup() {
Serial.begin(9600);
display.begin();
display.setContrast(50);
display.clearDisplay();
display.drawBitmap(0, 0, test, 84, 48, 1);
display.display();
}
void loop() {
// put your main code here, to run repeatedly:
}
display.drawBitmap(0, 0, test, 84, 48, 1); - funkcja odpowiedzialna za rysowanie (start X, start Y, nazwa_obrazu, szerokość, wysokość, 1 [w sensie kolor1=set, black])
5) Po kompilacji zamiast uzyskać obraz, nagryklany w PAINCIE: załącznik 1
6) Wychodzi jakiś makaron: załącznik 2
[btw. czemu nie mogę upać poprawnych plików graficznych?]
Idąc dalej, wiem, że jeżeli stworzę sobie wektor binarny z 1 (jako set pixel) i 0 (jako off pixel), mogę stworzyć jaki tylko obraz chcę, np.:
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 };
Ale, ale.... po
1) nie chce mi się tyle tego pisać (w końcu 84x48 małe, a pisania sporo)
2) nie znam programu, który umożliwiałby taką konwersję bmp2bin, w takim właśnie ciągu (stylu)
Moja prośba brzmi następująco:
1) czy znacie sposób, na wyświetlanie własnej botmapy, za pomocą takiego wyświetlacza?
2) czy znacie program (kod), który przerobi obraz (czarno-biały) na mapę binarną 8-bitową?