diff --git a/Images.md b/Images.md index 3d17889..fbd9363 100644 --- a/Images.md +++ b/Images.md @@ -6,6 +6,8 @@ \ ![ёRadio](images/img5.jpg)\ \ +![ёRadio](images/img6.jpg)\ +\ ![ёRadio](images/page1.jpg)\ \ ![ёRadio](images/page2.jpg)\ diff --git a/README.md b/README.md index dcf7e51..7e410cd 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ ##### Displays - **ST7735** 1.8' or 1.44' https://aliexpress.ru/item/1005002822797745.html - or **SSD1306** 0.96' I2C https://aliexpress.ru/item/1005001621806398.html +- or **Nokia5110** 84x48 SPI https://aliexpress.ru/item/1005001621837569.html ##### Controls Three tact buttons or Encoder or all together ### Connection table @@ -47,10 +48,13 @@ Three tact buttons or Encoder or all together \* Any free pin, configured in options.h ### Dependencies #### Libraries: -Adafruit_GFX, Adafruit_ST7735\*, Adafruit_SSD1306\* (\* depending on display model), ESP32Encoder, OneButton, [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer), [AsyncTCP](https://github.com/me-no-dev/AsyncTCP) +Adafruit_GFX, Adafruit_ST7735\*, Adafruit_SSD1306\*, Adafruit_PCD8544\*, (\* depending on display model), ESP32Encoder, OneButton, [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer), [AsyncTCP](https://github.com/me-no-dev/AsyncTCP) #### Tool: [ESP32 Filesystem Uploader](https://randomnerdtutorials.com/install-esp32-filesystem-uploader-arduino-ide/) ## Version history +### v0.4.197 +- added support for Nokia 5110 SPI displays +- some bugs fixes ### v0.4.183 - ovol reading bug ### v0.4.182 @@ -59,5 +63,5 @@ Adafruit_GFX, Adafruit_ST7735\*, Adafruit_SSD1306\* (\* depending on display mod ### v0.4.180 - vol steps 0..256 (in ESP32-audioI2S) ### v0.4.177 -- added support for SSD1306 I2C displays. +- added support for SSD1306 I2C displays - fixed broken buttons. diff --git a/images/img6.jpg b/images/img6.jpg new file mode 100644 index 0000000..0164fb2 Binary files /dev/null and b/images/img6.jpg differ diff --git a/yoRadio/display.cpp b/yoRadio/display.cpp index 25dc176..c483e83 100644 --- a/yoRadio/display.cpp +++ b/yoRadio/display.cpp @@ -16,6 +16,9 @@ DisplayST7735 dsp; #elif DSP_MODEL==2 #include "src/displays/displaySSD1306.h" DisplaySSD1306 dsp; +#elif DSP_MODEL==3 +#include "src/displays/displayN5110.h" +DisplayN5110 dsp; #endif Display display; @@ -25,8 +28,14 @@ void ticks() { } #define STARTTIME 5000 -#define SCROLLTIME 83 + +#if DSP_MODEL==3 +#define SCROLLDELTA 8 +#define SCROLLTIME 332 +#else #define SCROLLDELTA 3 +#define SCROLLTIME 83 +#endif void Scroll::init(char *sep, byte tsize, byte top, uint16_t dlay, uint16_t fgcolor, uint16_t bgcolor) { textsize = tsize; @@ -128,12 +137,18 @@ void Scroll::getbounds(uint16_t &tWidth, uint16_t &tHeight, uint16_t &sWidth) { void Display::init() { dsp.initD(screenwidth, screenheight); dsp.drawLogo(); - meta.init(" * ", 2, TFT_FRAMEWDT, STARTTIME, TFT_LOGO, TFT_BG); - title1.init(" * ", 1, TFT_FRAMEWDT + 2 * TFT_LINEHGHT, STARTTIME, TFT_FG, TFT_BG); - title2.init(" * ", 1, TFT_FRAMEWDT + 3 * TFT_LINEHGHT, STARTTIME, TFT_FG, TFT_BG); + if(DSP_MODEL==3){ + meta.init(" * ", 1, TFT_FRAMEWDT, STARTTIME, TFT_LOGO, TFT_BG); + title1.init(" * ", 1, TFT_FRAMEWDT + TFT_LINEHGHT+1, STARTTIME, TFT_FG, TFT_BG); + //title2.init(" * ", 1, TFT_FRAMEWDT + 2 * TFT_LINEHGHT, STARTTIME, TFT_FG, TFT_BG); + }else{ + meta.init(" * ", 2, TFT_FRAMEWDT, STARTTIME, TFT_LOGO, TFT_BG); + title1.init(" * ", 1, TFT_FRAMEWDT + 2 * TFT_LINEHGHT, STARTTIME, TFT_FG, TFT_BG); + title2.init(" * ", 1, TFT_FRAMEWDT + 3 * TFT_LINEHGHT, STARTTIME, TFT_FG, TFT_BG); + } int yStart = (screenheight / 2 - PLMITEMHEIGHT / 2) + 3; //plCurrent.init(" * ", 2, 57, 0, TFT_BG, TFT_LOGO); - plCurrent.init(" * ", 2, yStart, 0, TFT_BG, TFT_LOGO); + plCurrent.init(" * ", DSP_MODEL==3?1:2, yStart, 0, TFT_BG, TFT_LOGO); plCurrent.lock(); } @@ -178,13 +193,13 @@ void Display::swichMode(displayMode_e newmode) { if (newmode == PLAYER) { meta.reset(); title1.reset(); - title2.reset(); + if(DSP_MODEL!=3) title2.reset(); plCurrent.lock(); time(); } else { meta.lock(); title1.lock(); - title2.lock(); + if(DSP_MODEL!=3) title2.lock(); } if (newmode == VOL) { dsp.frameTitle("VOLUME"); @@ -210,7 +225,7 @@ void Display::drawPlayer() { } meta.loop(); title1.loop(); - title2.loop(); + if(DSP_MODEL!=3) title2.loop(); } void Display::drawVolume() { @@ -260,6 +275,7 @@ void Display::rightText(const char* text, byte y, uint16_t fg, uint16_t bg) { void Display::station() { meta.setText(dsp.utf8Rus(config.station.name, true)); + dsp.loop(); netserver.requestOnChange(STATION, 0); } @@ -271,7 +287,7 @@ void Display::title(const char *str) { strlcpy(config.station.title, title, BUFLEN); if (strlen(config.station.title) > 0) { char* ici; - if ((ici = strstr(config.station.title, " - ")) != NULL) { + if ((ici = strstr(config.station.title, " - ")) != NULL && DSP_MODEL!=3) { strlcpy(sng, ici + 3, BUFLEN / 2); strlcpy(ttl, config.station.title, strlen(config.station.title) - strlen(ici) + 1); } else { @@ -279,7 +295,8 @@ void Display::title(const char *str) { sng[0] = '\0'; } title1.setText(dsp.utf8Rus(ttl, true)); - title2.setText(dsp.utf8Rus(sng, true)); + if(DSP_MODEL!=3) title2.setText(dsp.utf8Rus(sng, true)); + dsp.loop(); } netserver.requestOnChange(TITLE, 0); } diff --git a/yoRadio/options.h b/yoRadio/options.h index c567178..e0df12d 100644 --- a/yoRadio/options.h +++ b/yoRadio/options.h @@ -1,12 +1,13 @@ #ifndef options_h #define options_h -#define VERSION "0.4.183" +#define VERSION "0.4.197" /* DISPLAY MODEL * 0 - DUMMY * 1 - ST7735 * 2 - SSD1306 + * 3 - NOKIA5110 */ #define DSP_MODEL 1 diff --git a/yoRadio/src/displays/displayN5110.cpp b/yoRadio/src/displays/displayN5110.cpp new file mode 100644 index 0000000..c370807 --- /dev/null +++ b/yoRadio/src/displays/displayN5110.cpp @@ -0,0 +1,306 @@ +#include "displayN5110.h" +#include +#include "../../player.h" +#include "../../config.h" +#include "../../network.h" + +#define LOGO_WIDTH 21 +#define LOGO_HEIGHT 28 + +const unsigned char logo [] PROGMEM= +{ + 0x07, 0x03, 0x80, 0x0f, 0x87, 0xc0, 0x0f, 0x87, 0xc0, 0x0f, 0x87, 0xc0, 0x0f, 0x87, 0xc0, 0x07, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x07, 0xff, 0x80, 0x1f, 0xff, + 0xc0, 0x1f, 0xff, 0xe0, 0x3f, 0xff, 0xf0, 0x7f, 0x07, 0xf0, 0x7e, 0x03, 0xf0, 0x7e, 0x01, 0xf8, + 0x7f, 0xff, 0xf8, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xf8, 0x7e, 0x00, 0x00, 0x7f, + 0x00, 0x00, 0x7f, 0x80, 0x20, 0x3f, 0xff, 0xe0, 0x3f, 0xff, 0xe0, 0x1f, 0xff, 0xe0, 0x0f, 0xff, + 0xe0, 0x01, 0xff, 0xc0 +}; + +DisplayN5110::DisplayN5110(): Adafruit_PCD8544(TFT_DC, TFT_CS, TFT_RST) { + +} + +char* DisplayN5110::utf8Rus(const char* str, bool uppercase) { + int index = 0; + static char strn[BUFLEN]; + bool E = false; + strlcpy(strn, str, BUFLEN); + if (uppercase) { + bool next = false; + for (char *iter = strn; *iter != '\0'; ++iter) + { + if (E) { + E = false; + continue; + } + byte rus = (byte) * iter; + if (rus == 208 && (byte) * (iter + 1) == 129) { + *iter = (char)209; + *(iter + 1) = (char)145; + E = true; + continue; + } + if (rus == 209 && (byte) * (iter + 1) == 145) { + *iter = (char)209; + *(iter + 1) = (char)145; + E = true; + continue; + } + if (next) { + if (rus >= 128 && rus <= 143) *iter = (char)(rus + 32); + if (rus >= 176 && rus <= 191) *iter = (char)(rus - 32); + next = false; + } + if (rus == 208) next = true; + if (rus == 209) { + *iter = (char)208; + next = true; + } + *iter = toupper(*iter); + } + } + while (strn[index]) + { + if (strn[index] >= 0xBF) + { + switch (strn[index]) { + case 0xD0: { + if (strn[index + 1] == 0x81) { + strn[index] = 0xA8; + break; + } + if (strn[index + 1] >= 0x90 && strn[index + 1] <= 0xBF) strn[index] = strn[index + 1] + 0x30; + break; + } + case 0xD1: { + if (strn[index + 1] == 0x91) { + strn[index] = 0xB8; + break; + } + if (strn[index + 1] >= 0x80 && strn[index + 1] <= 0x8F) strn[index] = strn[index + 1] + 0x70; + break; + } + } + int sind = index + 2; + while (strn[sind]) { + strn[sind - 1] = strn[sind]; + sind++; + } + strn[sind - 1] = 0; + } + index++; + } + return strn; +} + +void DisplayN5110::apScreen() { + setTextSize(1); + setTextColor(TFT_FG, TFT_BG); + setFont(&TinyFont6); + setCursor(TFT_FRAMEWDT, TFT_FRAMEWDT + 1 * TFT_LINEHGHT+6); + print("AP NAME: "); + print(apSsid); + setCursor(TFT_FRAMEWDT, TFT_FRAMEWDT + 2 * TFT_LINEHGHT+6); + print("PASSWD: "); + print(apPassword); + setTextColor(SILVER, TFT_BG); + setCursor(TFT_FRAMEWDT, sheight - 10); + print("SETTINGS PAGE ON: "); + setCursor(TFT_FRAMEWDT, sheight-2); + print("http://"); + print(WiFi.softAPIP().toString().c_str()); + print("/"); + setFont(); +} + +void DisplayN5110::initD(uint16_t &screenwidth, uint16_t &screenheight) { + begin(); + setContrast(TFT_CONTRAST); + cp437(true); + fillScreen(TFT_BG); + setRotation(TFT_ROTATE); + setTextWrap(false); + screenwidth = width(); + screenheight = height(); + swidth = screenwidth; + sheight = screenheight; +} + +void DisplayN5110::drawLogo() { + clearDisplay(); + drawBitmap((width() - LOGO_WIDTH ) / 2, 0, logo, LOGO_WIDTH, LOGO_HEIGHT, 1); + display(); +} + +void DisplayN5110::drawPlaylist(uint16_t currentItem, char* currentItemText) { + for (byte i = 0; i < PLMITEMS; i++) { + plMenu[i][0] = '\0'; + } + config.fillPlMenu(plMenu, currentItem - 3, PLMITEMS); + setTextSize(1); + int yStart = (sheight / 2 - PLMITEMHEIGHT / 2) - PLMITEMHEIGHT * (PLMITEMS - 1) / 2 + 3; + fillRect(0, (sheight / 2 - PLMITEMHEIGHT / 2) + 1, swidth, PLMITEMHEIGHT, TFT_LOGO); + setTextColor(TFT_FG, TFT_BG); + for (byte i = 0; i < PLMITEMS; i++) { + if (i == 3) { + strlcpy(currentItemText, plMenu[i], PLMITEMLENGHT - 1); + } else { + setCursor(TFT_FRAMEWDT, yStart + i * PLMITEMHEIGHT); + print(utf8Rus(plMenu[i], true)); + } + } +} + +void DisplayN5110::clearDsp() { + fillScreen(TFT_BG); +} + +void DisplayN5110::drawScrollFrame(uint16_t texttop, uint16_t textheight, uint16_t bg) { + if (TFT_FRAMEWDT == 0) return; + fillRect(0, texttop, TFT_FRAMEWDT, textheight, bg); + fillRect(swidth - TFT_FRAMEWDT, texttop, TFT_FRAMEWDT, textheight, bg); +} + +void DisplayN5110::getScrolBbounds(const char* text, const char* separator, byte textsize, uint16_t &tWidth, uint16_t &tHeight, uint16_t &sWidth) { + int16_t x1, y1; + uint16_t w, h; + setTextSize(textsize); + getTextBounds(text, 0, 0, &x1, &y1, &w, &h); + tWidth = w; + tHeight = h; + getTextBounds(separator, 0, 0, &x1, &y1, &w, &h); + sWidth = w; +} + +void DisplayN5110::clearScroll(uint16_t texttop, uint16_t textheight, uint16_t bg) { + fillRect(0, texttop, swidth, textheight, bg); +} + +void DisplayN5110::centerText(const char* text, byte y, uint16_t fg, uint16_t bg) { + int16_t x1, y1; + uint16_t w, h; + const char* txt = text; + + if(y==90) { + y=sheight-TFT_LINEHGHT*2; + } + if(y==110) { + y=sheight; + setFont(&TinyFont5); + } + getTextBounds(txt, 0, 0, &x1, &y1, &w, &h); + setTextColor(fg); + setCursor((swidth - w) / 2, y); + fillRect(0, y, swidth, h, bg); + print(utf8Rus(txt, true)); + setFont(); +} + +void DisplayN5110::rightText(const char* text, byte y, uint16_t fg, uint16_t bg) { + int16_t x1, y1; + uint16_t w, h; + getTextBounds(text, 0, 0, &x1, &y1, &w, &h); + setTextColor(fg); + setCursor(swidth - w - TFT_FRAMEWDT, y+h+1); + fillRect(swidth - w - TFT_FRAMEWDT, y, w, h+1, bg); + print(text); +} + +void DisplayN5110::displayHeapForDebug() { + +} + +void DisplayN5110::printClock(const char* timestr) { + int16_t x1, y1; + uint16_t w, h; + setTextSize(1); + setFont(&DS_DIGI15pt7b); + getTextBounds(timestr, 0, 0, &x1, &y1, &w, &h); + setTextColor(TFT_FG); + setCursor((swidth - w) / 2, 19+17); + fillRect(0, 18, swidth, h+2, TFT_BG); + print(timestr); + setFont(); +} + +void DisplayN5110::drawVolumeBar(bool withNumber) { + int16_t vTop = sheight - 3; + int16_t vWidth = swidth; + uint8_t ww = map(config.store.volume, 0, 254, 0, vWidth - 2); + fillRect(TFT_FRAMEWDT, vTop, vWidth, 3, TFT_BG); + drawRect(TFT_FRAMEWDT, vTop, vWidth, 3, TFT_LOGO); + fillRect(TFT_FRAMEWDT + 1, vTop + 1, ww, 1, TFT_LOGO); + if (withNumber) { + setTextSize(1); + setTextColor(TFT_FG); + char volstr[4]; + uint16_t wv, hv; + int16_t x1, y1; + sprintf(volstr, "%d", config.store.volume); + setFont(&DS_DIGI15pt7b); + getTextBounds(volstr, 0, 0, &x1, &y1, &wv, &hv); + fillRect(TFT_FRAMEWDT, 24-10, swidth - TFT_FRAMEWDT / 2, hv + 3, TFT_BG); + setCursor((swidth - wv) / 2, 24+8); + print(volstr); + setFont(); + } +} + +void DisplayN5110::frameTitle(const char* str) { + setTextSize(1); + centerText(str, TFT_FRAMEWDT, TFT_LOGO, TFT_BG); +} + +void DisplayN5110::rssi(const char* str) { + char buf[4]; + strlcpy(buf, str, strlen(str)-2); + int16_t vTop = sheight - TFT_LINEHGHT - 2; + setTextSize(1); + setFont(&TinyFont5); + rightText(buf, vTop, SILVER, TFT_BG); + setFont(); +} + +void DisplayN5110::ip(const char* str) { + int16_t vTop = sheight - TFT_LINEHGHT - 2; + setTextSize(1); + setTextColor(SILVER, TFT_BG); + setCursor(0, vTop); + setFont(&TinyFont5); + print(str); + setFont(); +} + +void DisplayN5110::set_TextSize(uint8_t s) { + setTextSize(s); +} + +void DisplayN5110::set_TextColor(uint16_t fg, uint16_t bg) { + setTextColor(fg, bg); +} + +void DisplayN5110::set_Cursor(int16_t x, int16_t y) { + setCursor(x, y); +} + +void DisplayN5110::printText(const char* txt) { + print(txt); +} + +void DisplayN5110::loop() { + if (checkdelay(83, loopdelay)) { + display(); + } + yield(); +} + +boolean DisplayN5110::checkdelay(int m, unsigned long &tstamp) { + if (millis() - tstamp > m) { + tstamp = millis(); + return true; + } else { + return false; + } +} + diff --git a/yoRadio/src/displays/displayN5110.h b/yoRadio/src/displays/displayN5110.h new file mode 100644 index 0000000..095f147 --- /dev/null +++ b/yoRadio/src/displays/displayN5110.h @@ -0,0 +1,64 @@ +#ifndef displayN5110_h +#define displayN5110_h + +#include "Arduino.h" +#include +#include +#include "fonts/TinyFont5.h" +#include "fonts/TinyFont6.h" +#include "fonts/DS_DIGI15pt7b.h" +#include "../../options.h" + +#define TFT_ROTATE 0 +#define TFT_LINEHGHT 8 +#define TFT_FRAMEWDT 0 +#define TFT_CONTRAST 55 + +#define PLMITEMS 7 +#define PLMITEMLENGHT 40 +#define PLMITEMHEIGHT 10 + +class DisplayN5110: public Adafruit_PCD8544 { + public: + DisplayN5110(); + char plMenu[PLMITEMS][PLMITEMLENGHT]; + uint16_t clockY; + void initD(uint16_t &screenwidth, uint16_t &screenheight); + void apScreen(); + void drawLogo(); + void clearDsp(); + void centerText(const char* text, byte y, uint16_t fg, uint16_t bg); + void rightText(const char* text, byte y, uint16_t fg, uint16_t bg); + void set_TextSize(uint8_t s); + void set_TextColor(uint16_t fg, uint16_t bg); + void set_Cursor(int16_t x, int16_t y); + void printText(const char* txt); + void printClock(const char* timestr); + void displayHeapForDebug(); + void drawVolumeBar(bool withNumber); + char* utf8Rus(const char* str, bool uppercase); + void drawScrollFrame(uint16_t texttop, uint16_t textheight, uint16_t bg); + void getScrolBbounds(const char* text, const char* separator, byte textsize, uint16_t &tWidth, uint16_t &tHeight, uint16_t &sWidth); + void clearScroll(uint16_t texttop, uint16_t textheight, uint16_t bg); + void frameTitle(const char* str); + void rssi(const char* str); + void ip(const char* str); + void drawPlaylist(uint16_t currentItem, char* currentItemText); + void loop(); + private: + uint16_t swidth, sheight; + unsigned long loopdelay; + boolean checkdelay(int m, unsigned long &tstamp); +}; + +extern DisplayN5110 dsp; + +/* + * TFT COLORS + */ +#define SILVER BLACK +#define TFT_BG WHITE +#define TFT_FG BLACK +#define TFT_LOGO BLACK + +#endif diff --git a/yoRadio/src/displays/displaySSD1306.cpp b/yoRadio/src/displays/displaySSD1306.cpp index 2f3f2bb..0333c92 100644 --- a/yoRadio/src/displays/displaySSD1306.cpp +++ b/yoRadio/src/displays/displaySSD1306.cpp @@ -11,13 +11,13 @@ const unsigned char logo [] PROGMEM= { - 0x06, 0x03, 0x00, 0x0f, 0x07, 0x80, 0x1f, 0x8f, 0xc0, 0x1f, 0x8f, 0xc0, - 0x0f, 0x07, 0x80, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x03, 0xff, 0x00, 0x0f, 0xff, 0x80, - 0x1f, 0xff, 0xc0, 0x1f, 0xff, 0xc0, 0x3f, 0x8f, 0xe0, 0x7e, 0x03, 0xf0, - 0x7c, 0x01, 0xf0, 0x7c, 0x01, 0xf0, 0x7f, 0xff, 0xf0, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf8, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x00, - 0x7e, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x3f, 0xc0, 0xe0, 0x3f, 0xff, 0xe0, + 0x06, 0x03, 0x00, 0x0f, 0x07, 0x80, 0x1f, 0x8f, 0xc0, 0x1f, 0x8f, 0xc0, + 0x0f, 0x07, 0x80, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x03, 0xff, 0x00, 0x0f, 0xff, 0x80, + 0x1f, 0xff, 0xc0, 0x1f, 0xff, 0xc0, 0x3f, 0x8f, 0xe0, 0x7e, 0x03, 0xf0, + 0x7c, 0x01, 0xf0, 0x7c, 0x01, 0xf0, 0x7f, 0xff, 0xf0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf8, 0x7c, 0x00, 0x00, 0x7c, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x3f, 0xc0, 0xe0, 0x3f, 0xff, 0xe0, 0x1f, 0xff, 0xe0, 0x0f, 0xff, 0xe0, 0x03, 0xff, 0xc0, 0x00, 0xfe, 0x00 }; @@ -212,7 +212,7 @@ void DisplaySSD1306::rightText(const char* text, byte y, uint16_t fg, uint16_t b } void DisplaySSD1306::displayHeapForDebug() { - + } void DisplaySSD1306::printClock(const char* timestr) { @@ -248,9 +248,11 @@ void DisplaySSD1306::frameTitle(const char* str) { } void DisplaySSD1306::rssi(const char* str) { + char buf[4]; + strlcpy(buf, str, strlen(str)-2); int16_t vTop = sheight - TFT_LINEHGHT - 4; setTextSize(1); - rightText(str, vTop, SILVER, TFT_BG); + rightText(buf, vTop, SILVER, TFT_BG); } void DisplaySSD1306::ip(const char* str) { diff --git a/yoRadio/src/displays/displaySSD1306.h b/yoRadio/src/displays/displaySSD1306.h index 94cbf89..2409fb0 100644 --- a/yoRadio/src/displays/displaySSD1306.h +++ b/yoRadio/src/displays/displaySSD1306.h @@ -1,5 +1,5 @@ -#ifndef displayST7735_h -#define displayST7735_h +#ifndef displaySSD1306_h +#define displaySSD1306_h #include "Arduino.h" #include diff --git a/yoRadio/src/displays/fonts/DS_DIGI15pt7b.h b/yoRadio/src/displays/fonts/DS_DIGI15pt7b.h new file mode 100644 index 0000000..8f36c2a --- /dev/null +++ b/yoRadio/src/displays/fonts/DS_DIGI15pt7b.h @@ -0,0 +1,60 @@ +const uint8_t DS_DIGI15pt7bBitmaps[] PROGMEM = { + 0x7F, 0xFF, 0x47, 0xFF, 0xF4, 0xF0, 0x7F, 0xD7, 0xF7, 0x7D, 0xF0, 0x7E, + 0x0F, 0xC1, 0xF8, 0x3E, 0x03, 0x80, 0x20, 0x02, 0x00, 0xE0, 0x3E, 0x0F, + 0xC1, 0xF8, 0x3F, 0x07, 0xDF, 0x77, 0xF5, 0xFF, 0x00, 0x05, 0xFF, 0xFB, + 0x20, 0xBF, 0xFF, 0x64, 0x00, 0x7F, 0xC7, 0xF4, 0x7D, 0x80, 0x70, 0x0E, + 0x01, 0xC0, 0x38, 0x03, 0x3F, 0xAF, 0xFA, 0xFE, 0x60, 0x0E, 0x01, 0xC0, + 0x38, 0x07, 0x00, 0xDF, 0x17, 0xF1, 0xFF, 0x00, 0x7F, 0xC7, 0xF4, 0x7D, + 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x03, 0x3F, 0xAF, 0xF8, 0xFE, 0x80, + 0x30, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x1F, 0x67, 0xF5, 0xFF, 0x00, 0x00, + 0x10, 0x07, 0x01, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3E, 0x03, 0xBF, 0xAF, + 0xF8, 0xFE, 0x80, 0x30, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0x60, 0x04, + 0x00, 0x00, 0x7F, 0xD7, 0xF3, 0x7C, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x06, + 0x00, 0xBF, 0x8F, 0xF8, 0xFE, 0x80, 0x30, 0x0E, 0x01, 0xC0, 0x38, 0x07, + 0x1F, 0x67, 0xF5, 0xFF, 0x00, 0x7F, 0xD7, 0xF3, 0x7C, 0x70, 0x0E, 0x01, + 0xC0, 0x38, 0x06, 0x00, 0xBF, 0x8F, 0xFA, 0xFE, 0xE0, 0x3E, 0x0F, 0xC1, + 0xF8, 0x3F, 0x07, 0xDF, 0x77, 0xF5, 0xFF, 0x00, 0x7F, 0xC7, 0xF4, 0x7D, + 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x20, 0x00, 0x00, 0x80, + 0x30, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0x60, 0x04, 0x00, 0x00, 0x7F, + 0xD7, 0xF7, 0x7D, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3E, 0x03, 0xBF, 0xAF, + 0xFA, 0xFE, 0xE0, 0x3E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xCE, 0x77, 0xF5, + 0xFF, 0x00, 0x7F, 0xD7, 0xF7, 0x7D, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3E, + 0x03, 0xBF, 0xAF, 0xF8, 0xFE, 0x80, 0x30, 0x0E, 0x01, 0xC0, 0x38, 0x07, + 0x1F, 0x67, 0xF5, 0xFF, 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x00 +}; + +const GFXglyph DS_DIGI15pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 6, 0, 1 }, // 0x20 ' ' + { 0, 0, 0, 0, 0, 0 }, // 0x21 '!' + { 0, 0, 0, 0, 0, 0 }, // 0x22 '"' + { 0, 0, 0, 0, 0, 0 }, // 0x23 '#' + { 0, 0, 0, 0, 0, 0 }, // 0x24 '$' + { 0, 0, 0, 0, 0, 0 }, // 0x25 '%' + { 0, 0, 0, 0, 0, 0 }, // 0x26 '&' + { 0, 0, 0, 0, 0, 0 }, // 0x27 ''' + { 0, 0, 0, 0, 0, 0 }, // 0x28 '(' + { 0, 0, 0, 0, 0, 0 }, // 0x29 ')' + { 0, 0, 0, 0, 0, 0 }, // 0x2A '*' + { 0, 0, 0, 0, 0, 0 }, // 0x2B '+' + { 0, 0, 0, 0, 0, 0 }, // 0x2C ',' + { 0, 0, 0, 0, 0, 0 }, // 0x2D '-' + { 0, 0, 0, 0, 0, 0 }, // 0x2E '.' + { 0, 0, 0, 0, 0, 0 }, // 0x2F '/' + { 6, 11, 19, 14, 2, -18 }, // 0x30 '0' + { 33, 3, 19, 6, 2, -18 }, // 0x31 '1' + { 41, 11, 19, 14, 2, -18 }, // 0x32 '2' + { 68, 11, 19, 14, 2, -18 }, // 0x33 '3' + { 95, 11, 19, 14, 2, -18 }, // 0x34 '4' + { 122, 11, 19, 14, 2, -18 }, // 0x35 '5' + { 149, 11, 19, 14, 2, -18 }, // 0x36 '6' + { 176, 11, 19, 14, 2, -18 }, // 0x37 '7' + { 203, 11, 19, 14, 2, -18 }, // 0x38 '8' + { 230, 11, 19, 14, 2, -18 }, // 0x39 '9' + { 257, 3, 16, 6, 2, -15 } // 0x3A ':' +}; + +const GFXfont DS_DIGI15pt7b PROGMEM = { + (uint8_t *)DS_DIGI15pt7bBitmaps, + (GFXglyph *)DS_DIGI15pt7bGlyphs, 0x20, 0x3A, 29 }; + +// Approx. 664 bytes diff --git a/yoRadio/src/displays/fonts/TinyFont5.h b/yoRadio/src/displays/fonts/TinyFont5.h new file mode 100644 index 0000000..17343de --- /dev/null +++ b/yoRadio/src/displays/fonts/TinyFont5.h @@ -0,0 +1,195 @@ +const uint8_t TinyFont5_Bitmaps[] PROGMEM = { + 0x00, 0x00, 0x00, 0xE8, 0x00, 0xB4, 0x00, 0x57, 0xD5, 0xF5, 0x00, 0x7A, + 0x65, 0xE0, 0xA5, 0x4A, 0x00, 0x33, 0xE9, 0x70, 0xC0, 0x6A, 0x40, 0x95, + 0x80, 0xAA, 0x80, 0x5D, 0x00, 0x60, 0xE0, 0x80, 0x5E, 0x80, 0x69, 0x99, + 0x60, 0x59, 0x2E, 0x00, 0x69, 0x24, 0xF0, 0x69, 0x29, 0x60, 0x99, 0xF1, + 0x10, 0xF8, 0xE1, 0xE0, 0x68, 0xE9, 0x60, 0xF1, 0x24, 0x40, 0x69, 0x69, + 0x60, 0x69, 0x71, 0x60, 0xA0, 0x46, 0x64, 0x00, 0xE3, 0x80, 0x98, 0x00, + 0x69, 0x20, 0x20, 0x6B, 0xB8, 0x70, 0x69, 0x9F, 0x90, 0xE9, 0xE9, 0xE0, + 0x69, 0x89, 0x60, 0xE9, 0x99, 0xE0, 0xF8, 0xC8, 0xF0, 0xF8, 0xC8, 0x80, + 0x69, 0x8B, 0x60, 0x99, 0xF9, 0x90, 0xF8, 0x00, 0x11, 0x19, 0x60, 0x99, + 0xE9, 0x90, 0x88, 0x88, 0xF0, 0x8C, 0x63, 0xBA, 0x80, 0x99, 0xDB, 0x90, + 0x69, 0x99, 0x60, 0xE9, 0x9E, 0x80, 0x64, 0xA5, 0x26, 0x80, 0xE9, 0x9E, + 0x90, 0x68, 0x61, 0xE0, 0xE9, 0x24, 0x00, 0x99, 0x99, 0x60, 0x8C, 0x54, + 0xA2, 0x00, 0x8C, 0x6A, 0xE5, 0x00, 0x99, 0x69, 0x90, 0xB6, 0xA4, 0x00, + 0xF1, 0x68, 0xF0, 0xEA, 0xC0, 0xAD, 0x40, 0xD5, 0xC0, 0x54, 0x00, 0xE0, + 0x90, 0x17, 0x99, 0x70, 0x07, 0xEB, 0x5A, 0x80, 0x2B, 0x22, 0x00, 0xF0, + 0x89, 0xA8, 0x00, 0x16, 0x80, 0xF9, 0x99, 0xF0, 0x69, 0x9F, 0x90, 0xE8, + 0xF9, 0xE0, 0xE9, 0xE9, 0xE0, 0xF8, 0x88, 0x80, 0x32, 0x94, 0xAF, 0x80, + 0xF8, 0xC8, 0xF0, 0xAD, 0x5D, 0x5A, 0x80, 0x69, 0x29, 0x60, 0x99, 0xBD, + 0x90, 0xD1, 0xBD, 0x90, 0x99, 0xE9, 0x90, 0x79, 0x99, 0x90, 0x8C, 0x63, + 0xBA, 0x80, 0x99, 0xF9, 0x90, 0x69, 0x99, 0x60, 0xF9, 0x99, 0x90, 0xE9, + 0x9E, 0x80, 0x69, 0x89, 0x60, 0xE9, 0x24, 0x00, 0x99, 0x71, 0x60, 0x75, + 0x6A, 0xE2, 0x00, 0x99, 0x69, 0x90, 0x94, 0xA5, 0x2F, 0x84, 0x00, 0x99, + 0x9F, 0x10, 0x8C, 0x6B, 0x5F, 0x80, 0x8A, 0x2A, 0xAA, 0xFC, 0x10, 0xC3, + 0x92, 0x97, 0x00, 0x87, 0x99, 0x65, 0xE4, 0x00, 0x8E, 0x99, 0xE0, 0x69, + 0x39, 0x60, 0x95, 0x7B, 0x59, 0x00, 0x79, 0x97, 0x90, 0x80, 0x96, 0x9F, + 0x86, 0x96, 0x9F, 0x86 +}; + +const GFXglyph TinyFont5_Glyphs[] PROGMEM = { + { 0, 3, 5, 3, 0, -5 }, // 0x20 ' ' + { 3, 1, 5, 2, 0, -5 }, // 0x21 '!' + { 5, 3, 2, 4, 0, -5 }, // 0x22 '"' + { 7, 5, 5, 6, 0, -4 }, // 0x23 '#' + { 11, 4, 5, 5, 0, -5 }, // 0x24 '$' + { 14, 3, 5, 4, 0, -5 }, // 0x25 '%' + { 17, 4, 5, 5, 0, -5 }, // 0x26 '&' + { 20, 1, 2, 2, 0, -5 }, // 0x27 ''' + { 21, 2, 5, 4, 0, -5 }, // 0x28 '(' + { 23, 2, 5, 4, 0, -5 }, // 0x29 ')' + { 25, 3, 3, 4, 0, -4 }, // 0x2A '*' + { 27, 3, 3, 4, 0, -4 }, // 0x2B '+' + { 29, 2, 2, 3, 0, -1 }, // 0x2C ',' + { 30, 3, 1, 4, 0, -3 }, // 0x2D '-' + { 31, 1, 1, 2, 0, -1 }, // 0x2E '.' + { 32, 2, 5, 4, 0, -5 }, // 0x2F '/' + { 34, 4, 5, 5, 0, -5 }, // 0x30 '0' + { 37, 3, 5, 4, 0, -5 }, // 0x31 '1' + { 40, 4, 5, 5, 0, -5 }, // 0x32 '2' + { 43, 4, 5, 5, 0, -5 }, // 0x33 '3' + { 46, 4, 5, 5, 0, -5 }, // 0x34 '4' + { 49, 4, 5, 5, 0, -5 }, // 0x35 '5' + { 52, 4, 5, 5, 0, -5 }, // 0x36 '6' + { 55, 4, 5, 5, 0, -5 }, // 0x37 '7' + { 58, 4, 5, 5, 0, -5 }, // 0x38 '8' + { 61, 4, 5, 5, 0, -5 }, // 0x39 '9' + { 64, 1, 3, 2, 0, -4 }, // 0x3A ':' + { 65, 2, 4, 3, 0, -4 }, // 0x3B ';' + { 66, 2, 3, 3, 0, -4 }, // 0x3C '<' + { 68, 3, 3, 4, 0, -4 }, // 0x3D '=' + { 70, 2, 3, 3, 0, -4 }, // 0x3E '>' + { 72, 4, 5, 5, 0, -5 }, // 0x3F '?' + { 75, 4, 5, 5, 0, -5 }, // 0x40 '@' + { 78, 4, 5, 5, 0, -5 }, // 0x41 'A' + { 81, 4, 5, 5, 0, -5 }, // 0x42 'B' + { 84, 4, 5, 5, 0, -5 }, // 0x43 'C' + { 87, 4, 5, 5, 0, -5 }, // 0x44 'D' + { 90, 4, 5, 5, 0, -5 }, // 0x45 'E' + { 93, 4, 5, 5, 0, -5 }, // 0x46 'F' + { 96, 4, 5, 5, 0, -5 }, // 0x47 'G' + { 99, 4, 5, 5, 0, -5 }, // 0x48 'H' + { 102, 1, 5, 2, 0, -5 }, // 0x49 'I' + { 104, 4, 5, 5, 0, -5 }, // 0x4A 'J' + { 107, 4, 5, 5, 0, -5 }, // 0x4B 'K' + { 110, 4, 5, 5, 0, -5 }, // 0x4C 'L' + { 113, 5, 5, 6, 0, -5 }, // 0x4D 'M' + { 117, 4, 5, 5, 0, -5 }, // 0x4E 'N' + { 120, 4, 5, 5, 0, -5 }, // 0x4F 'O' + { 123, 4, 5, 5, 0, -5 }, // 0x50 'P' + { 126, 5, 5, 6, 0, -5 }, // 0x51 'Q' + { 130, 4, 5, 5, 0, -5 }, // 0x52 'R' + { 133, 4, 5, 5, 0, -5 }, // 0x53 'S' + { 136, 3, 5, 4, 0, -5 }, // 0x54 'T' + { 139, 4, 5, 5, 0, -5 }, // 0x55 'U' + { 142, 5, 5, 6, 0, -5 }, // 0x56 'V' + { 146, 5, 5, 6, 0, -5 }, // 0x57 'W' + { 150, 4, 5, 5, 0, -5 }, // 0x58 'X' + { 153, 3, 5, 4, 0, -5 }, // 0x59 'Y' + { 156, 4, 5, 5, 0, -5 }, // 0x5A 'Z' + { 159, 2, 5, 3, 0, -5 }, // 0x5B '[' + { 161, 2, 5, 3, 0, -5 }, // 0x5C '\' + { 163, 2, 5, 4, 0, -5 }, // 0x5D ']' + { 165, 3, 2, 4, 0, -5 }, // 0x5E '^' + { 167, 3, 1, 4, 0, -1 }, // 0x5F '_' + { 168, 2, 2, 3, 0, -5 }, // 0x60 '`' + { 0, 0, 0, 0, 0, 0 }, // 0x61 'a' + { 0, 0, 0, 0, 0, 0 }, // 0x62 'b' + { 0, 0, 0, 0, 0, 0 }, // 0x63 'c' + { 169, 4, 5, 5, 0, -5 }, // 0x64 'd' + { 0, 0, 0, 0, 0, 0 }, // 0x65 'e' + { 0, 0, 0, 0, 0, 0 }, // 0x66 'f' + { 0, 0, 0, 0, 0, 0 }, // 0x67 'g' + { 0, 0, 0, 0, 0, 0 }, // 0x68 'h' + { 0, 0, 0, 0, 0, 0 }, // 0x69 'i' + { 0, 0, 0, 0, 0, 0 }, // 0x6A 'j' + { 0, 0, 0, 0, 0, 0 }, // 0x6B 'k' + { 0, 0, 0, 0, 0, 0 }, // 0x6C 'l' + { 172, 5, 5, 6, 0, -5 }, // 0x6D 'm' + { 0, 0, 0, 0, 0, 0 }, // 0x6E 'n' + { 0, 0, 0, 0, 0, 0 }, // 0x6F 'o' + { 0, 0, 0, 0, 0, 0 }, // 0x70 'p' + { 0, 0, 0, 0, 0, 0 }, // 0x71 'q' + { 0, 0, 0, 0, 0, 0 }, // 0x72 'r' + { 0, 0, 0, 0, 0, 0 }, // 0x73 's' + { 0, 0, 0, 0, 0, 0 }, // 0x74 't' + { 0, 0, 0, 0, 0, 0 }, // 0x75 'u' + { 0, 0, 0, 0, 0, 0 }, // 0x76 'v' + { 0, 0, 0, 0, 0, 0 }, // 0x77 'w' + { 0, 0, 0, 0, 0, 0 }, // 0x78 'x' + { 0, 0, 0, 0, 0, 0 }, // 0x79 'y' + { 0, 0, 0, 0, 0, 0 }, // 0x7A 'z' + { 176, 3, 5, 4, 0, -5 }, // 0x7B '{' + { 179, 1, 4, 4, 0, -4 }, // 0x7C '|' + { 180, 3, 5, 4, 0, -5 }, // 0x7D '}' + { 183, 4, 3, 5, 0, -4 }, // 0x7E '~' + { 185, 4, 5, 5, 0, -5 }, // 0x7F 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x80 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x81 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x82 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x83 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x84 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x85 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x86 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x87 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x88 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x89 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8A 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8B 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8C 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8D 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8E 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8F 'non-printable' + { 188, 4, 5, 5, 0, -5 }, // 0x90 'non-printable' + { 191, 4, 5, 5, 0, -5 }, // 0x91 'non-printable' + { 194, 4, 5, 5, 0, -5 }, // 0x92 'non-printable' + { 197, 4, 5, 5, 0, -5 }, // 0x93 'non-printable' + { 200, 5, 5, 6, 0, -5 }, // 0x94 'non-printable' + { 204, 4, 5, 5, 0, -5 }, // 0x95 'non-printable' + { 207, 5, 5, 6, 0, -5 }, // 0x96 'non-printable' + { 211, 4, 5, 5, 0, -5 }, // 0x97 'non-printable' + { 214, 4, 5, 5, 0, -5 }, // 0x98 'non-printable' + { 217, 4, 5, 5, 0, -5 }, // 0x99 'non-printable' + { 220, 4, 5, 4, 0, -5 }, // 0x9A 'non-printable' + { 223, 4, 5, 4, 0, -5 }, // 0x9B 'non-printable' + { 226, 5, 5, 6, 0, -5 }, // 0x9C 'non-printable' + { 230, 4, 5, 5, 0, -5 }, // 0x9D 'non-printable' + { 233, 4, 5, 5, 0, -5 }, // 0x9E 'non-printable' + { 236, 4, 5, 5, 0, -5 }, // 0x9F 'non-printable' + { 239, 4, 5, 5, 0, -5 }, // 0xA0 ' ' + { 242, 4, 5, 5, 0, -5 }, // 0xA1 '¡' + { 245, 3, 5, 4, 0, -5 }, // 0xA2 '¢' + { 248, 4, 5, 5, 0, -5 }, // 0xA3 '£' + { 251, 5, 5, 6, 0, -5 }, // 0xA4 '¤' + { 255, 4, 5, 5, 0, -5 }, // 0xA5 '¥' + { 258, 5, 6, 6, 0, -5 }, // 0xA6 '¦' + { 263, 4, 5, 5, 0, -5 }, // 0xA7 '§' + { 266, 5, 5, 6, 0, -5 }, // 0xA8 '¨' + { 270, 6, 6, 7, 0, -5 }, // 0xA9 '©' + { 275, 5, 5, 6, 0, -5 }, // 0xAA 'ª' + { 279, 6, 5, 7, 0, -5 }, // 0xAB '«' + { 284, 4, 5, 5, 0, -5 }, // 0xAC '¬' + { 287, 4, 5, 5, 0, -5 }, // 0xAD 'non-printable' + { 290, 5, 5, 6, 0, -5 }, // 0xAE '®' + { 294, 4, 5, 5, 0, -5 }, // 0xAF '¯' + { 0, 0, 0, 0, 0, 0 }, // 0xB0 '°' + { 0, 0, 0, 0, 0, 0 }, // 0xB1 '±' + { 0, 0, 0, 0, 0, 0 }, // 0xB2 '²' + { 0, 0, 0, 0, 0, 0 }, // 0xB3 '³' + { 0, 0, 0, 0, 0, 0 }, // 0xB4 '´' + { 0, 0, 0, 0, 0, 0 }, // 0xB5 'µ' + { 0, 0, 0, 0, 0, 0 }, // 0xB6 '¶' + { 297, 1, 1, 2, 0, -3 }, // 0xB7 '·' + { 0, 0, 0, 0, 0, 0 }, // 0xB8 '¸' + { 0, 0, 0, 0, 0, 0 }, // 0xB9 '¹' + { 0, 0, 0, 0, 0, 0 }, // 0xBA 'º' + { 0, 0, 0, 0, 0, 0 }, // 0xBB '»' + { 0, 0, 0, 0, 0, 0 }, // 0xBC '¼' + { 0, 0, 0, 0, 0, 0 }, // 0xBD '½' + { 0, 0, 0, 0, 0, 0 }, // 0xBE '¾' + { 0, 0, 0, 0, 0, 0 }, // 0xBF '¿' + { 298, 4, 6, 5, 0, -5 }, // 0xC0 'À' + { 301, 4, 6, 5, 0, -5 } // 0xC1 'Á' +}; + +const GFXfont TinyFont5 PROGMEM = {(uint8_t *) TinyFont5_Bitmaps, (GFXglyph *)TinyFont5_Glyphs, 0x20, 0xC1, 5}; diff --git a/yoRadio/src/displays/fonts/TinyFont6.h b/yoRadio/src/displays/fonts/TinyFont6.h new file mode 100644 index 0000000..1d2c24c --- /dev/null +++ b/yoRadio/src/displays/fonts/TinyFont6.h @@ -0,0 +1,198 @@ +const uint8_t TinyFont6_Bitmaps[] PROGMEM = { + 0xF4, 0x00, 0xF4, 0x00, 0xB4, 0x00, 0x57, 0xD5, 0xF5, 0x00, 0x75, 0x18, + 0x6B, 0x30, 0x00, 0xA5, 0x29, 0x40, 0x66, 0x4A, 0x96, 0xC0, 0x6A, 0x90, + 0x95, 0x60, 0xAA, 0x80, 0x5D, 0x00, 0x60, 0xC0, 0x80, 0x25, 0x29, 0x00, + 0x69, 0x99, 0x96, 0x59, 0x25, 0xC0, 0x69, 0x12, 0x4F, 0x69, 0x21, 0x96, + 0x99, 0x9F, 0x11, 0xF8, 0xE1, 0x96, 0x68, 0xE9, 0x96, 0xF1, 0x12, 0x44, + 0x69, 0x69, 0x96, 0x69, 0x97, 0x16, 0xA0, 0x46, 0x2A, 0x22, 0x00, 0xE3, + 0x80, 0x88, 0xA8, 0x00, 0x54, 0xA0, 0x80, 0x6B, 0xFA, 0x96, 0x69, 0x99, + 0xF9, 0xE9, 0xE9, 0x9E, 0x69, 0x88, 0x96, 0xE9, 0x99, 0x9E, 0xF8, 0xE8, + 0x8F, 0xF8, 0x8E, 0x88, 0x69, 0x8B, 0x97, 0x99, 0x9F, 0x99, 0xFC, 0x00, + 0x11, 0x11, 0x96, 0x99, 0xE9, 0x99, 0x88, 0x88, 0x8F, 0x8C, 0x63, 0xBA, + 0xD4, 0x00, 0x99, 0x9D, 0xB9, 0x69, 0x99, 0x96, 0xE9, 0x99, 0xE8, 0x64, + 0xA5, 0x29, 0x34, 0x00, 0xE9, 0x99, 0xE9, 0x68, 0x61, 0x96, 0xE9, 0x24, + 0x80, 0x99, 0x99, 0x96, 0x8C, 0x54, 0xA2, 0x10, 0x00, 0x8C, 0x6B, 0x55, + 0x28, 0x00, 0x99, 0x66, 0x99, 0x8C, 0x62, 0xA2, 0x10, 0x00, 0xF1, 0x24, + 0x8F, 0xEA, 0xB0, 0x91, 0x22, 0x40, 0xD5, 0x70, 0x54, 0x00, 0xE0, 0x90, + 0x61, 0x79, 0x70, 0x11, 0x79, 0x97, 0x88, 0xE9, 0x99, 0xB8, 0x00, 0x05, + 0x7F, 0x5A, 0xD4, 0x00, 0x69, 0x99, 0x60, 0xE9, 0x9E, 0x88, 0x4E, 0x44, + 0x52, 0xB7, 0xA4, 0x00, 0x29, 0x64, 0x40, 0xF0, 0x89, 0x35, 0x00, 0x16, + 0x80, 0xF9, 0x99, 0x9F, 0x69, 0x99, 0xF9, 0xF8, 0xE9, 0x9E, 0xE9, 0xE9, + 0x9E, 0xF2, 0x49, 0x00, 0x35, 0x55, 0x5F, 0xF8, 0xE8, 0x8F, 0xAD, 0x5D, + 0x5A, 0xD4, 0x00, 0x69, 0x21, 0x96, 0x99, 0x9B, 0xD9, 0xD1, 0x9B, 0xD9, + 0x99, 0xE9, 0x99, 0x79, 0x99, 0x99, 0x8C, 0x63, 0xBA, 0xD4, 0x00, 0x99, + 0x9F, 0x99, 0x69, 0x99, 0x96, 0xF9, 0x99, 0x99, 0xE9, 0x99, 0xE8, 0x69, + 0x88, 0x96, 0xE9, 0x24, 0x80, 0x99, 0x97, 0x16, 0x75, 0x6B, 0x57, 0x10, + 0x00, 0x99, 0x66, 0x99, 0x94, 0xA5, 0x29, 0x7C, 0x20, 0x99, 0x9F, 0x11, + 0x8C, 0x63, 0x5A, 0xFC, 0x00, 0x8A, 0x28, 0xAA, 0xAB, 0xF0, 0x40, 0xC2, + 0x1C, 0x94, 0xB8, 0x00, 0x86, 0x1E, 0x65, 0x97, 0x90, 0x88, 0xE9, 0x9E, + 0x69, 0x13, 0x96, 0x95, 0x6B, 0xDA, 0xC8, 0x00, 0x79, 0x97, 0x99, 0xF0, + 0x96, 0x9F, 0x86, 0x96, 0x9F, 0x86 +}; + +const GFXglyph TinyFont6_Glyphs[] PROGMEM = { + { 0, 3, 0, 3, 0, 0 }, // 0x20 ' ' + { 2, 1, 6, 2, 0, -5 }, // 0x21 '!' + { 4, 3, 2, 4, 0, -5 }, // 0x22 '"' + { 6, 5, 5, 6, 0, -5 }, // 0x23 '#' + { 10, 5, 6, 6, 0, -5 }, // 0x24 '$' + { 15, 3, 6, 4, 0, -5 }, // 0x25 '%' + { 18, 4, 6, 5, 0, -5 }, // 0x26 '&' + { 21, 1, 2, 2, 0, -5 }, // 0x27 ''' + { 22, 2, 6, 3, 0, -5 }, // 0x28 '(' + { 24, 2, 6, 3, 0, -5 }, // 0x29 ')' + { 26, 3, 3, 4, 0, -3 }, // 0x2A '*' + { 28, 3, 3, 4, 0, -3 }, // 0x2B '+' + { 30, 2, 2, 3, 0, 0 }, // 0x2C ',' + { 31, 2, 1, 3, 0, -2 }, // 0x2D '-' + { 32, 1, 1, 2, 0, 0 }, // 0x2E '.' + { 33, 3, 6, 4, 0, -5 }, // 0x2F '/' + { 36, 4, 6, 5, 0, -5 }, // 0x30 '0' + { 39, 3, 6, 4, 0, -5 }, // 0x31 '1' + { 42, 4, 6, 5, 0, -5 }, // 0x32 '2' + { 45, 4, 6, 5, 0, -5 }, // 0x33 '3' + { 48, 4, 6, 5, 0, -5 }, // 0x34 '4' + { 51, 4, 6, 5, 0, -5 }, // 0x35 '5' + { 54, 4, 6, 5, 0, -5 }, // 0x36 '6' + { 57, 4, 6, 5, 0, -5 }, // 0x37 '7' + { 60, 4, 6, 5, 0, -5 }, // 0x38 '8' + { 63, 4, 6, 5, 0, -5 }, // 0x39 '9' + { 66, 1, 3, 2, 0, -3 }, // 0x3A ':' + { 67, 2, 4, 3, 0, -3 }, // 0x3B ';' + { 68, 3, 5, 4, 0, -4 }, // 0x3C '<' + { 71, 3, 3, 4, 0, -3 }, // 0x3D '=' + { 73, 3, 5, 4, 0, -4 }, // 0x3E '>' + { 76, 3, 6, 4, 0, -5 }, // 0x3F '?' + { 79, 4, 6, 5, 0, -5 }, // 0x40 '@' + { 82, 4, 6, 5, 0, -5 }, // 0x41 'A' + { 85, 4, 6, 5, 0, -5 }, // 0x42 'B' + { 88, 4, 6, 5, 0, -5 }, // 0x43 'C' + { 91, 4, 6, 5, 0, -5 }, // 0x44 'D' + { 94, 4, 6, 5, 0, -5 }, // 0x45 'E' + { 97, 4, 6, 5, 0, -5 }, // 0x46 'F' + { 100, 4, 6, 5, 0, -5 }, // 0x47 'G' + { 103, 4, 6, 5, 0, -5 }, // 0x48 'H' + { 106, 1, 6, 2, 0, -5 }, // 0x49 'I' + { 108, 4, 6, 5, 0, -5 }, // 0x4A 'J' + { 111, 4, 6, 5, 0, -5 }, // 0x4B 'K' + { 114, 4, 6, 5, 0, -5 }, // 0x4C 'L' + { 117, 5, 6, 6, 0, -5 }, // 0x4D 'M' + { 122, 4, 6, 5, 0, -5 }, // 0x4E 'N' + { 125, 4, 6, 5, 0, -5 }, // 0x4F 'O' + { 128, 4, 6, 5, 0, -5 }, // 0x50 'P' + { 131, 5, 6, 6, 0, -5 }, // 0x51 'Q' + { 136, 4, 6, 5, 0, -5 }, // 0x52 'R' + { 139, 4, 6, 5, 0, -5 }, // 0x53 'S' + { 142, 3, 6, 4, 0, -5 }, // 0x54 'T' + { 145, 4, 6, 5, 0, -5 }, // 0x55 'U' + { 148, 5, 6, 6, 0, -5 }, // 0x56 'V' + { 153, 5, 6, 6, 0, -5 }, // 0x57 'W' + { 158, 4, 6, 5, 0, -5 }, // 0x58 'X' + { 161, 5, 6, 6, 0, -5 }, // 0x59 'Y' + { 166, 4, 6, 5, 0, -5 }, // 0x5A 'Z' + { 169, 2, 6, 3, 0, -5 }, // 0x5B '[' + { 171, 3, 6, 4, 0, -5 }, // 0x5C '\' + { 174, 2, 6, 3, 0, -5 }, // 0x5D ']' + { 176, 3, 2, 4, 0, -5 }, // 0x5E '^' + { 178, 3, 1, 4, 0, 0 }, // 0x5F '_' + { 179, 2, 2, 3, 0, -5 }, // 0x60 '`' + { 180, 4, 5, 5, 0, -4 }, // 0x61 'a' + { 0, 0, 0, 0, 0, 0 }, // 0x62 'b' + { 0, 0, 0, 0, 0, 0 }, // 0x63 'c' + { 183, 4, 6, 5, 0, -5 }, // 0x64 'd' + { 0, 0, 0, 0, 0, 0 }, // 0x65 'e' + { 0, 0, 0, 0, 0, 0 }, // 0x66 'f' + { 0, 0, 0, 0, 0, 0 }, // 0x67 'g' + { 186, 4, 6, 5, 0, -5 }, // 0x68 'h' + { 189, 1, 5, 2, 0, -4 }, // 0x69 'i' + { 0, 0, 0, 0, 0, 0 }, // 0x6A 'j' + { 0, 0, 0, 0, 0, 0 }, // 0x6B 'k' + { 0, 0, 0, 0, 0, 0 }, // 0x6C 'l' + { 191, 5, 6, 6, 0, -5 }, // 0x6D 'm' + { 0, 0, 0, 0, 0, 0 }, // 0x6E 'n' + { 196, 4, 5, 5, 0, -4 }, // 0x6F 'o' + { 199, 4, 6, 5, 0, -4 }, // 0x70 'p' + { 0, 0, 0, 0, 0, 0 }, // 0x71 'q' + { 0, 0, 0, 0, 0, 0 }, // 0x72 'r' + { 0, 0, 0, 0, 0, 0 }, // 0x73 's' + { 202, 4, 6, 4, 0, -5 }, // 0x74 't' + { 0, 0, 0, 0, 0, 0 }, // 0x75 'u' + { 0, 0, 0, 0, 0, 0 }, // 0x76 'v' + { 0, 0, 0, 0, 0, 0 }, // 0x77 'w' + { 0, 0, 0, 0, 0, 0 }, // 0x78 'x' + { 205, 3, 5, 4, 0, -4 }, // 0x79 'y' + { 0, 0, 0, 0, 0, 0 }, // 0x7A 'z' + { 208, 3, 6, 4, 0, -5 }, // 0x7B '{' + { 211, 1, 4, 2, 0, -4 }, // 0x7C '|' + { 212, 3, 6, 4, 0, -5 }, // 0x7D '}' + { 215, 4, 3, 5, 0, -3 }, // 0x7E '~' + { 217, 4, 6, 5, 0, -5 }, // 0x7F 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x80 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x81 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x82 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x83 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x84 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x85 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x86 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x87 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x88 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x89 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8A 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8B 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8C 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8D 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8E 'non-printable' + { 0, 0, 0, 0, 0, 0 }, // 0x8F 'non-printable' + { 220, 4, 6, 5, 0, -5 }, // 0x90 'non-printable' + { 223, 4, 6, 5, 0, -5 }, // 0x91 'non-printable' + { 226, 4, 6, 5, 0, -5 }, // 0x92 'non-printable' + { 229, 3, 6, 4, 0, -5 }, // 0x93 'non-printable' + { 232, 4, 6, 5, 0, -5 }, // 0x94 'non-printable' + { 235, 4, 6, 5, 0, -5 }, // 0x95 'non-printable' + { 238, 5, 6, 6, 0, -5 }, // 0x96 'non-printable' + { 243, 4, 6, 5, 0, -5 }, // 0x97 'non-printable' + { 246, 4, 6, 5, 0, -5 }, // 0x98 'non-printable' + { 249, 4, 6, 5, 0, -5 }, // 0x99 'non-printable' + { 252, 4, 6, 5, 0, -5 }, // 0x9A 'non-printable' + { 255, 4, 6, 5, 0, -5 }, // 0x9B 'non-printable' + { 258, 5, 6, 6, 0, -5 }, // 0x9C 'non-printable' + { 263, 4, 6, 5, 0, -5 }, // 0x9D 'non-printable' + { 266, 4, 6, 5, 0, -5 }, // 0x9E 'non-printable' + { 269, 4, 6, 5, 0, -5 }, // 0x9F 'non-printable' + { 272, 4, 6, 5, 0, -5 }, // 0xA0 ' ' + { 275, 4, 6, 5, 0, -5 }, // 0xA1 '¡' + { 278, 3, 6, 4, 0, -5 }, // 0xA2 '¢' + { 281, 4, 6, 5, 0, -5 }, // 0xA3 '£' + { 284, 5, 6, 6, 0, -5 }, // 0xA4 '¤' + { 289, 4, 6, 5, 0, -5 }, // 0xA5 '¥' + { 292, 5, 7, 6, 0, -5 }, // 0xA6 '¦' + { 297, 4, 6, 5, 0, -5 }, // 0xA7 '§' + { 300, 5, 6, 6, 0, -5 }, // 0xA8 '¨' + { 305, 6, 7, 7, 0, -5 }, // 0xA9 '©' + { 311, 5, 6, 6, 0, -5 }, // 0xAA 'ª' + { 316, 6, 6, 7, 0, -5 }, // 0xAB '«' + { 321, 4, 6, 5, 0, -5 }, // 0xAC '¬' + { 324, 4, 6, 5, 0, -5 }, // 0xAD 'non-printable' + { 327, 5, 6, 6, 0, -5 }, // 0xAE '®' + { 332, 4, 6, 5, 0, -5 }, // 0xAF '¯' + { 0, 0, 0, 0, 0, 0 }, // 0xB0 '°' + { 0, 0, 0, 0, 0, 0 }, // 0xB1 '±' + { 0, 0, 0, 0, 0, 0 }, // 0xB2 '²' + { 0, 0, 0, 0, 0, 0 }, // 0xB3 '³' + { 0, 0, 0, 0, 0, 0 }, // 0xB4 '´' + { 0, 0, 0, 0, 0, 0 }, // 0xB5 'µ' + { 0, 0, 0, 0, 0, 0 }, // 0xB6 '¶' + { 335, 2, 2, 3, 0, -3 }, // 0xB7 '·' + { 0, 0, 0, 0, 0, 0 }, // 0xB8 '¸' + { 0, 0, 0, 0, 0, 0 }, // 0xB9 '¹' + { 0, 0, 0, 0, 0, 0 }, // 0xBA 'º' + { 0, 0, 0, 0, 0, 0 }, // 0xBB '»' + { 0, 0, 0, 0, 0, 0 }, // 0xBC '¼' + { 0, 0, 0, 0, 0, 0 }, // 0xBD '½' + { 0, 0, 0, 0, 0, 0 }, // 0xBE '¾' + { 0, 0, 0, 0, 0, 0 }, // 0xBF '¿' + { 336, 4, 6, 5, 0, -5 }, // 0xC0 'À' + { 339, 4, 6, 5, 0, -5 } // 0xC1 'Á' +}; + +const GFXfont TinyFont6 PROGMEM = {(uint8_t *) TinyFont6_Bitmaps, (GFXglyph *)TinyFont6_Glyphs, 0x20, 0xC1, 5};