CtrlJ pen v2 oled logo tratta di come sia possibile inserire un logo o immagine in formato bitmap in un progetto con display oled.
Prima di trattare la parte di conversione dell’immagine e il codice per caricarla nel tuo progetto ti consiglio la lettura del mio articolo CtrlJ pen v2 oled test in cui trovi dettagliata la libreria che puoi usare.
Prima di proporti questa libreria ne ho provate alcune ed eseguito numerosi test che coinvolgevano l’uso di un attiny84.
La libreria SSD1306
La libreria per oled 128×32 monocromatico e attiny84 è la seguente: ssd1306_attiny
la cui documentazione, sebbene non discorsiva, è fatta sufficientemente bene e ti aiuta molto nella realizzazione del tuo progetto.
Dopo averla installata, come spiegato nella libreria stessa o nel mio precedente articolo, potrai accedere agli esempi tra cui trovi “ssd1306_demo”:
- che è composto da tre file:
- ssd1306_demo.ino: il programma principale;
- sova.h: con gli header della classe SOVA_H;
- sova.cpp: contenente sia il PROGMEM dell’immagine di default usata dallo sketch sia un link ad un tool che puoi utilizzare per convertire le tue bitmap in PROGMEM.
Grazie al tool consigliato dall’autore della libreria:
potrai convertire il tuo logo o la tua immagine nel formato supportato dalla libreria ssd1306 per attiny84.
Notice
Ti consigio di preparare l’immagine già della dimensione in cui ti occorre con un qualsiasi programma di photo editing, il tool tende a distorcere l’immagine se desideri un output in formato differente da quello di input.
Una volta ottenuta la tua immagine non dovrai far altro che inserirla nel codice PROGMEM e richiamarla dallo sketch mediante il .h
Scketch CtrlJ pen v2 oled logo
lo sketch per il CtrlJ pen v2 oled logo è composto da 3 file:
- logo.h
- logo.cpp
- ctrlJpen_v2.ino
In ordine te li riporto uno alla volta:
logo.h
/* MIT License Copyright (c) 2016-2018, Alexey Dynda Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef _LOGO_H_ #define _LOGO_H_ // ---------------------------------------------------------------------------- #include "ssd1306_hal/io.h" #include <stdint.h> extern const uint8_t Logo [] PROGMEM; #endif
alle linee 29-30: includi le due librerie che serviranno alla libreria;
linea 32: crea una interfaccia denominata “Logo[]” di tipo PROGMEM;
logo.cpp
Sarà il file che conterrà il logo vero e proprio:
#include "logo.h" //------------------------------------------------------------------------------ // File generated by LCD Assistant // http://en.radzio.dxp.pl/bitmap_converter/ //------------------------------------------------------------------------------ const uint8_t Logo [] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0x7E, 0x3E, 0x7E, 0x7E, 0x3C, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x7F, 0x7F, 0xC1, 0x40, 0x7C, 0x7C, 0xE0, 0x63, 0x7F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
in cui alla linea 01: includi il file .h;
linee 03-06: è indicato il tool che puoi utilizzare per convertire l’immagine bitmap;
linee 08-25: definisci il PROGMEM Logo[] in cui incolli il codice che il tool di conversione ti ha prodotto.
in questo modo hai solo preparato la variabile per ospitare il logo in formato data array.
ctrlJpen_v2.ino
Lo sketch vero e proprio in cui
/****************** CTRL-J Pen v2 ************************ MIT License Copyright (c) 2017-2018, Alexey Dynda Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /********************************************************/ #include "ssd1306.h" #include "nano_gfx.h" #include "logo.h" void setup() { ssd1306_128x32_i2c_init(); ssd1306_fillScreen(0x00); ssd1306_setFixedFont(ssd1306xled_font6x8); ssd1306_clearScreen(); delay(1000); showLogo(); showIntro(); } void loop() { } static void showLogo() { ssd1306_flipHorizontal(1); ssd1306_flipVertical(1); ssd1306_drawBitmap(0, 0, 32, 32, Logo); } static void showIntro() { ssd1306_setFixedFont(ssd1306xled_font6x8); ssd1306_printFixed(32, 8, "CtrlJ pen v2", STYLE_BOLD); ssd1306_printFixed(28, 16, "mauroalfieri.it", STYLE_ITALIC); delay(3000); }
alle linee 26-28: includi le librerie necessare al funzionamento dello sketch, tra cui avrai notato come ultima l’inclusione della libreria logo.h, vista in precedenza;
linea 31: inizializza il display richiamando la funzione ssd1306_128x32_i2c_init() il cui nome è parlante, indica alla libreria che userai un display con le degienti caratteristiche:
- driver del display: ssd1306;
- dimensioni in pixel: 128 x 32;
- comunicazione mediante: i2c;
linee 32-33: imposta lo sfondo nero e la dimensione del font a 6×8;
linea 35: pulisci lo schermo con la funzione ssd1306_clearScreen;
linee 36-37: attendi un secondo, dopo la pulizia dello schermo e richiama la funzione showLogo();
linea 38: richiama la funzione showIntro();
La funzione loop in questo sketch è vuota in quanto non è necessario che si occupi di gestire nulla fino per la visualizzazione del logo.
Linea 44: definisci una funzione di tipo static void che ti serve per visualizzare il logo sul display;
linee 45-46: esegui un flip dello schermo in orizzontale e poi in verticale, ti servirà con lo sketch della CtrlJ pen v2 oled logo quando sarà montato sulla penna stessa in funzione di come è montato il display;
linea 47: disegna il logo usando la funzione ssd1306_drawBitmap(x1,y1,x2,y2,progmem) in cui avrai:
- x1: 0
- y1: 0
- x2: 32
- y2: 32
- progmem: Logo
ossia disegnerai il Logo, definito nella classe logo.cpp e logo.h partendo dal punto 0,0 e della dimensione 32 x 32 pixel;
linea 50: definisci una funzione di tipo static void che ti serve per visualizzare un testo in due righe sul display di fianco al logo;
linea 51: imposta la dimensione del logo a 6×8;
linee 53-54: scrivi le due linee sul display usando la funzione ssd1306_printFixed(x1,y1,str,style) in cui per la prima linea posizioni il testo “CtrlJ pen v2” in BOLD alla posizione 32 x 8 e per la seconda scrivi la linea “mauroalfieri.it” in stile ITALIC alla posizione 28 x 16;
linea 56: imposta un ritardo di 3 secondi in cui vedrai chiaramente il logo ed il testo nel tuo progetto sul ctrlJ pen v2 oled logo: