Updated to more Bahn view

main
Paco Hope 2022-01-06 22:43:41 -05:00
parent 32df788a61
commit 1a8e2260eb
3 changed files with 720 additions and 2875 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,136 +1,49 @@
#define TEMP_UNIT, "imperial"
#include <Watchy.h> //include the Watchy library
#include "DIN_1451_Engschrift_Regular64pt7b.h"
#include "DIN_1451_Engschrift_Regular12pt7b.h"
#include "heavitas12pt7b.h"
class WatchFace : public Watchy { //inherit and extend Watchy class
public:
//! Change these if you want light background, dark text
uint16_t bg = GxEPD_BLACK;
uint16_t fg = GxEPD_WHITE;
void drawWatchFace() { //override this method to customize how the watch face looks
int16_t x1;
int16_t y1;
uint16_t w;
uint16_t h;
String textstring;
int16_t lasty;
int16_t x1, y1, lasty;
uint16_t w, h;
String textstring;
bool light = false;
// ** UPDATE **
//resets step counter at midnight everyday
if(currentTime.Hour == 00 && currentTime.Minute == 00) {
sensor.resetStepCounter();
}
// ** DRAW **
//drawbg
display.fillScreen(light ? GxEPD_WHITE : GxEPD_BLACK);
display.fillRoundRect(2,2,196,196,8,light ? GxEPD_BLACK : GxEPD_WHITE);
display.fillRoundRect(6,6,188,188,5,light ? GxEPD_WHITE : GxEPD_BLACK);
// Flood fill with background
// display.fillScreen(bg);
// display.fillRoundRect(2,2,196,196,8,bg);
// display.fillRoundRect(6,6,188,188,5,fg);
display.setFont(&DIN_1451_Engschrift_Regular64pt7b);
display.setTextColor(light ? GxEPD_BLACK : GxEPD_WHITE);
display.setTextColor(fg);
display.setTextWrap(false);
// draw hours with leading 0
if (currentTime.Hour < 10) {
textstring = "0";
} else {
textstring = "";
}
textstring += currentTime.Hour;
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
display.setCursor(183-w, 100-5);
display.print(textstring);
//draw minutes
if (currentTime.Minute < 10) {
textstring = "0";
} else {
textstring = "";
}
textstring += currentTime.Minute;
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
display.setCursor(183-w, 100+3+h);
display.print(textstring);
// draw battery
display.fillRoundRect(16,16,34,12,4,light ? GxEPD_BLACK : GxEPD_WHITE);
display.fillRoundRect(49,20,3,4,2,light ? GxEPD_BLACK : GxEPD_WHITE);
display.fillRoundRect(18,18,30,8,3,light ? GxEPD_WHITE : GxEPD_BLACK);
float batt = (getBatteryVoltage()-3.3)/0.9;
if (batt > 0) {
display.fillRoundRect(20,20,26*batt,4,2,light ? GxEPD_BLACK : GxEPD_WHITE);
}
drawTime( 183, 92 );
drawBattery( 8, 4 );
display.setFont(&DIN_1451_Engschrift_Regular12pt7b);
lasty = 200 - 16;
display.setTextColor(fg);
drawSteps( 8, 20 );
drawDate( 8, 130 );
display.setFont(&DIN_1451_Engschrift_Regular12pt7b);
display.setTextColor(fg);
// draw steps with footprint icon
textstring = sensor.getCounter();
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
display.drawBitmap(58, lasty-h-10, png_feet, 32, 32, GxEPD_WHITE);
display.setCursor(19, lasty-3);
display.print(textstring);
lasty += -8-h;
lasty += -10;
// draw date as DD MMM YY
textstring = currentTime.Day;
textstring += " ";
textstring += monthShortStr(currentTime.Month);
textstring += " ";
textstring += currentTime.Year;
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
display.setCursor(16, lasty);
display.print(textstring);
lasty += -20;
// draw day
textstring = dayStr(currentTime.Wday);
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
display.setCursor(16, lasty);
display.print(textstring);
lasty += -40;
display.setTextColor(fg);
lasty = 120;
// weather things
weatherData currentWeather = getWeatherData();
int8_t temperature = currentWeather.temperature;
int16_t weatherConditionCode = currentWeather.weatherConditionCode;
// draw weather state
if (weatherConditionCode >= 801) {
textstring = "Cloudy";
} else if (weatherConditionCode == 800) {
textstring = "Clear";
} else if (weatherConditionCode == 781) {
textstring = "Tornado";
} else if (weatherConditionCode == 771) {
textstring = "Squall";
} else if (weatherConditionCode == 762) {
textstring = "Ash";
} else if (weatherConditionCode == 761 || weatherConditionCode == 731) {
textstring = "Dust";
} else if (weatherConditionCode == 751) {
textstring = "Sand";
} else if (weatherConditionCode == 741) {
textstring = "Fog";
} else if (weatherConditionCode == 721) {
textstring = "Haze";
} else if (weatherConditionCode == 711) {
textstring = "Smoke";
} else if (weatherConditionCode == 701) {
textstring = "Mist";
} else if (weatherConditionCode >= 600) {
textstring = "Snow";
} else if (weatherConditionCode >= 500) {
textstring = "Rain";
} else if (weatherConditionCode >= 300) {
textstring = "Drizzle";
} else if (weatherConditionCode >= 200) {
textstring = "Thunderstorm";
} else {
textstring = "Ambient";
}
textstring = currentWeather.weatherDescription;
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
display.setCursor(16, lasty);
display.print(textstring);
@ -138,17 +51,158 @@ class WatchFace : public Watchy { //inherit and extend Watchy class
// draw temperature
textstring = temperature;
textstring += strcmp(TEMP_UNIT, "metric") == 0 ? "~ C" : "~ F"; // ~ will be rendered as º
if( weatherCelsius == true ) {
textstring += "~ C"; // ~ will be rendered as º
} else {
textstring += "~ F"; // ~ will be rendered as º
}
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
display.setCursor(16, lasty);
display.print(textstring);
}
private:
// Draw step counter and footrpints icon
// x and y are the top corner
void drawSteps(uint8_t x, uint8_t y) {
int16_t x1;
int16_t y1;
uint16_t w;
uint16_t h;
String textstring;
//reset step counter at midnight
if(currentTime.Hour == 00 && currentTime.Minute == 00) {
sensor.resetStepCounter();
}
// Put the feet icon down
display.drawBitmap(x, y, png_feet, 32, 32, fg);
textstring = "00000"; // prototype 6-digit number
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
// Now we know how wide a 6-digit number would be. We want to right-justify
// our number. So figure out how wide 6 digits are, and subtract how wide
// our current number is.
x = w; //hang on to width
textstring = String(sensor.getCounter());
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
display.setCursor( x + 32 - w, y + 32 ); // add 32 because of icon, right justify
display.print(textstring);
}
//! Draw the battery symbol with its x and y coordinates starting at x,y
#define BATTWIDTH 26
void drawBattery( uint8_t x, uint8_t y ) {
float batt;
// draw battery
display.fillRoundRect( x, y, 34, 12, 4, fg ); // overall frame
display.fillRoundRect( x+34, y+2, 4, 8, 2, fg ); // nub, to look like battery
display.fillRoundRect( x+2, y+2, 30, 8, 3, bg ); // area for battery charge
// According to 7_SEG, 3.8 is the voltage floor. Below that is rendered as
// flat battery on that watch face.
batt = (getBatteryVoltage()-3.3)/0.9;
if (batt > 0) {
display.fillRoundRect( x+4, y+4, (BATTWIDTH*batt), 4, 2, fg ); // actual charge
}
}
void drawTemperature() {
}
//! Draw time on the right side of the face.
/**
* Note that x is the RIGHT margin, not the left. The
* numbers are right justified. The y is the top of the
* numbers.
**/
void drawTime( uint8_t x, uint8_t y ) {
int16_t x1;
int16_t y1;
uint16_t w;
uint16_t h;
String textstring;
// draw hours with leading 0
if( currentTime.Hour < 10 ) {
textstring = "0";
} else {
textstring = "";
}
textstring += currentTime.Hour;
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
display.setCursor( x-w, y );
display.print(textstring);
y = y + h + 8;
if( currentTime.Minute < 10 )
{
textstring = "0";
} else {
textstring = "";
}
textstring += currentTime.Minute;
display.setTextColor(fg);
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
display.setCursor( x-w, y );
display.print(textstring);
}
#define BOXX (60)
#define BOXY (60)
void drawDate( uint8_t x, uint8_t y ) {
int16_t x1;
int16_t y1;
uint16_t w;
uint16_t h;
uint8_t width;
uint8_t newx;
uint8_t newy;
String textstring;
// draw box
display.fillRoundRect( x, y, BOXX, BOXY, 2, fg ); // overall frame
// draw short day name inverted
display.setFont(&Heavitas12pt7b);
display.setTextColor(bg);
textstring = currentTime.Day;
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
h = h/2; // this font seems really tall.
// center text in box
newx = x + ((BOXX-w) / 2 );
display.setCursor( newx, y + 20 );
display.print(textstring);
// draw day
textstring = dayShortStr(currentTime.Wday);
textstring.toUpperCase();
display.setFont(&Heavitas12pt7b);
display.setTextColor(bg);
display.getTextBounds(textstring, 0, 0, &x1, &y1, &w, &h);
h = h/2; // this font seems really tall.
// Start at bottom of box, go up height, plus a small margin
newy = y + BOXY - h; // Near bottom of box
newx = x + ((BOXX-w) / 2 );
display.setCursor( newx, newy );
display.print(textstring);
}
};
WatchFace m; //instantiate your watchface
void setup() {
// Change this to use your own API key!
// get an API key at: https://openweathermap.org/api
String APIkey = String ("ca4849c5f0c3949bda419307e34a669e");
// 4751935 == Chantilly, VA, USA
m.setupWeather( 4751935, false, 30, String("en"), APIkey );
m.init(); //call init in setup
}

172
heavitas12pt7b.h Normal file
View File

@ -0,0 +1,172 @@
const uint8_t Heavitas12pt7bBitmaps[] PROGMEM = {
0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFC, 0x7F, 0xFE, 0x7E, 0x3E,
0xFC, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x3F,
0x7E, 0x7E, 0x7F, 0xFE, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0,
0x03, 0xC1, 0xF0, 0xFC, 0x7F, 0x3F, 0xDF, 0xFF, 0xFD, 0xFF, 0x3F, 0xC5,
0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x0F,
0x80, 0xFF, 0x0F, 0xFC, 0xFF, 0xF7, 0xFF, 0xFC, 0x7F, 0xE3, 0xE2, 0x1F,
0x01, 0xF0, 0x1F, 0x83, 0xF8, 0x3F, 0x03, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0x81, 0xFF, 0x0F, 0xFC, 0xFF, 0xFF,
0xFF, 0xFC, 0x7D, 0xC3, 0xE0, 0x3E, 0x0F, 0xE0, 0x7F, 0x00, 0x7C, 0xE1,
0xFF, 0x8F, 0xBF, 0xFD, 0xFF, 0xE7, 0xFE, 0x1F, 0xE0, 0x7C, 0x00, 0x00,
0x78, 0x01, 0xF0, 0x07, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0xFF, 0x03, 0xFE,
0x0F, 0xFC, 0x3E, 0xF8, 0x79, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x80, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x3F, 0xF8, 0xFF,
0xE3, 0xFF, 0x8F, 0xFE, 0x3F, 0xF9, 0xF0, 0x07, 0xFC, 0x1F, 0xFC, 0x7F,
0xF9, 0xFF, 0xF3, 0x8F, 0xC8, 0x1F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F,
0xFE, 0x3F, 0xF0, 0x3F, 0x00, 0x07, 0xE0, 0x3E, 0x03, 0xF0, 0x3F, 0x01,
0xF0, 0x1F, 0xC1, 0xFF, 0x8F, 0xFE, 0xFF, 0xF7, 0xEF, 0xFE, 0x3F, 0xF1,
0xFF, 0xDF, 0xFF, 0xFD, 0xFF, 0xCF, 0xFE, 0x3F, 0xE0, 0x7C, 0x00, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x80, 0x7C, 0x07, 0xC0, 0x3E,
0x03, 0xE0, 0x3F, 0x01, 0xF0, 0x1F, 0x00, 0xF8, 0x0F, 0x80, 0xFC, 0x07,
0xC0, 0x7E, 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x7F, 0x83, 0xFF, 0x1F, 0xFE,
0x7F, 0xF9, 0xF3, 0xE7, 0xCF, 0x8F, 0xFC, 0x3F, 0xF1, 0xFF, 0xEF, 0xFF,
0xBE, 0x1F, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xDF, 0xFE, 0x3F, 0xF0, 0x3F,
0x00, 0x0F, 0xC0, 0xFF, 0x87, 0xFF, 0x1F, 0xFE, 0xFF, 0xFF, 0xF3, 0xFF,
0x87, 0xFE, 0x1F, 0xFC, 0xFD, 0xFF, 0xF7, 0xFF, 0x8F, 0xFE, 0x0F, 0xF0,
0x1F, 0x80, 0xFE, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x00, 0x77, 0xFF, 0xF7,
0x01, 0xDF, 0xFF, 0xDC, 0x77, 0xFF, 0xF7, 0x01, 0xDF, 0xFF, 0xDE, 0xEE,
0x20, 0x00, 0x20, 0x1C, 0x0F, 0x87, 0xF7, 0xFF, 0xFF, 0xBF, 0xC7, 0xE0,
0xFF, 0x9F, 0xFC, 0xFF, 0x87, 0xF0, 0x1E, 0x00, 0xC0, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x80, 0x80, 0x1C, 0x03, 0xE0, 0x7F, 0x0F, 0xF8, 0xFF, 0xC7, 0xF8, 0x7F,
0x3F, 0xFF, 0xFB, 0xFC, 0x7E, 0x0F, 0x01, 0x80, 0x00, 0x0F, 0xC0, 0x7F,
0xC3, 0xFF, 0x9F, 0xFE, 0x7F, 0xFF, 0xE1, 0xF7, 0x07, 0xC0, 0x3F, 0x03,
0xF8, 0x1F, 0xC0, 0xFC, 0x03, 0xE0, 0x00, 0x00, 0x3E, 0x00, 0xF8, 0x03,
0xE0, 0x0F, 0x80, 0x3E, 0x00, 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x78,
0x1E, 0x77, 0xE6, 0x6F, 0xE3, 0xCF, 0xE3, 0xDE, 0x63, 0xDC, 0x63, 0xDC,
0x63, 0xDC, 0x67, 0xDE, 0x7F, 0xEF, 0xFE, 0x7F, 0xFE, 0x7F, 0x9C, 0x3F,
0xF8, 0x3F, 0xF8, 0x0F, 0xE0, 0x00, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xF8,
0x00, 0x3F, 0xC0, 0x03, 0xFC, 0x00, 0x7F, 0xE0, 0x07, 0xFE, 0x00, 0x7F,
0xE0, 0x0F, 0x9F, 0x00, 0xF9, 0xF0, 0x1F, 0x9F, 0x81, 0xFF, 0xF8, 0x3F,
0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0xFF, 0xC7, 0xFF, 0xFE, 0x7E, 0x07, 0xEF,
0xC0, 0x3E, 0xFF, 0xE1, 0xFF, 0xF3, 0xFF, 0xE7, 0xFF, 0xEF, 0xFF, 0xDF,
0x0F, 0xBF, 0xFF, 0x7F, 0xFC, 0xFF, 0xF1, 0xFF, 0xF3, 0xFF, 0xF7, 0xC1,
0xFF, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFD, 0xFF, 0xE0,
0x03, 0xF8, 0x03, 0xFF, 0x01, 0xFF, 0xF0, 0xFF, 0xFE, 0x7F, 0xFF, 0x9F,
0x83, 0xFF, 0xC0, 0x7B, 0xE0, 0x08, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80,
0x63, 0xF0, 0x1E, 0x7E, 0x1F, 0xDF, 0xFF, 0xE3, 0xFF, 0xF8, 0x7F, 0xFC,
0x0F, 0xFE, 0x00, 0xFE, 0x00, 0xFF, 0xC0, 0xFF, 0xF0, 0xFF, 0xFC, 0xFF,
0xFC, 0xFF, 0xFE, 0xF8, 0x7E, 0xF8, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8,
0x1F, 0xF8, 0x1F, 0xF8, 0x3F, 0xF8, 0x7E, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF,
0xFC, 0xFF, 0xF0, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xE0, 0x0F, 0x80, 0x3F, 0xFE, 0xFF, 0xFB, 0xFF, 0xEF, 0xFF,
0xBF, 0xFE, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F,
0x80, 0x3F, 0xFE, 0xFF, 0xFB, 0xFF, 0xEF, 0xFF, 0xBF, 0xFE, 0xF8, 0x03,
0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x00, 0x03, 0xF8, 0x00,
0xFF, 0xE0, 0x1F, 0xFF, 0x03, 0xFF, 0xF8, 0x7F, 0xFF, 0x87, 0xE1, 0xF8,
0xFC, 0x06, 0x0F, 0x83, 0xFE, 0xF8, 0x3F, 0xEF, 0x83, 0xFF, 0xF8, 0x3F,
0xEF, 0xC3, 0xFE, 0x7F, 0x07, 0xE7, 0xFF, 0xFC, 0x3F, 0xFF, 0xC1, 0xFF,
0xF8, 0x07, 0xFE, 0x00, 0x1F, 0x80, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01,
0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E,
0x21, 0xF7, 0x9F, 0xFF, 0xFF, 0xFF, 0xCF, 0xFE, 0x3F, 0xE0, 0x7C, 0x00,
0xF8, 0x3F, 0xF8, 0x7E, 0xF8, 0xFC, 0xF9, 0xF8, 0xF9, 0xF0, 0xFB, 0xF0,
0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0,
0xFF, 0xF0, 0xFB, 0xF8, 0xF9, 0xFC, 0xF8, 0xFC, 0xF8, 0x7E, 0xF8, 0x3F,
0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F,
0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0x01, 0xFF, 0xC0, 0x3F, 0xFC,
0x03, 0xFF, 0xE0, 0x7F, 0xFF, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x9F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFD, 0xFF, 0x9F, 0x9F,
0xF9, 0xF9, 0xFF, 0x8F, 0x1F, 0xF8, 0x61, 0xFF, 0x86, 0x1F, 0xF8, 0x01,
0xFF, 0x80, 0x1F, 0xF8, 0x0F, 0xFE, 0x07, 0xFF, 0x83, 0xFF, 0xC1, 0xFF,
0xF0, 0xFF, 0xFC, 0x7F, 0xFF, 0x3F, 0xFF, 0x9F, 0xFF, 0xEF, 0xFD, 0xFF,
0xFE, 0x7F, 0xFF, 0x3F, 0xFF, 0x8F, 0xFF, 0xC3, 0xFF, 0xE0, 0xFF, 0xF0,
0x7F, 0xF8, 0x1F, 0xFC, 0x07, 0xC0, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xFF,
0xE0, 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0x87, 0xEF, 0xC0, 0xFF, 0xE0, 0x1F,
0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xF0, 0x3F, 0x7E, 0x1F, 0x9F,
0xFF, 0xE3, 0xFF, 0xF0, 0x7F, 0xF8, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0xFF,
0xE1, 0xFF, 0xE3, 0xFF, 0xE7, 0xFF, 0xEF, 0xFF, 0xFF, 0x0F, 0xFE, 0x0F,
0xFC, 0x1F, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xEF, 0xFF, 0x9F,
0xFC, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x00, 0x03, 0xF8, 0x01,
0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC7, 0xFF, 0xFC, 0xFC, 0x1F, 0xBF,
0x01, 0xFF, 0xC0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFE,
0x03, 0xE7, 0xF1, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F,
0xFF, 0xE0, 0x7F, 0xFC, 0xFF, 0xE0, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFC,
0xFF, 0xFE, 0xF8, 0x7E, 0xF8, 0x3E, 0xF8, 0x3E, 0xF8, 0x7E, 0xFF, 0xFC,
0xFF, 0xFC, 0xFF, 0xF0, 0xFF, 0xF0, 0xF9, 0xF8, 0xF8, 0xFC, 0xF8, 0xFE,
0xF8, 0x7E, 0xF8, 0x3F, 0x0F, 0xC0, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF,
0xFB, 0xE1, 0xEF, 0xC1, 0x3F, 0xE0, 0x7F, 0xF0, 0xFF, 0xE0, 0x7F, 0xC8,
0x1F, 0x78, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xF0, 0x3F, 0x80,
0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0x01,
0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C,
0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0xF8, 0x1F,
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x3F,
0x7F, 0xFE, 0x7F, 0xFE, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0xF8, 0x03,
0xFF, 0x00, 0x7D, 0xF0, 0x1F, 0x3E, 0x03, 0xE3, 0xE0, 0xFC, 0x7C, 0x1F,
0x0F, 0xC7, 0xE0, 0xF8, 0xF8, 0x1F, 0x9F, 0x01, 0xF7, 0xC0, 0x3F, 0xF8,
0x03, 0xFF, 0x00, 0x7F, 0xC0, 0x0F, 0xF8, 0x00, 0xFE, 0x00, 0x1F, 0xC0,
0x01, 0xF0, 0x00, 0x3E, 0x00, 0xF8, 0x1F, 0x03, 0xFF, 0x03, 0xE0, 0xF9,
0xF0, 0xFC, 0x1F, 0x3E, 0x1F, 0xC3, 0xE7, 0xC3, 0xF8, 0xF8, 0x7C, 0xFF,
0x1F, 0x0F, 0x9F, 0xF7, 0xE1, 0xF3, 0xFE, 0xF8, 0x1F, 0xFF, 0xDF, 0x03,
0xFF, 0x7F, 0xE0, 0x7F, 0xEF, 0xF8, 0x07, 0xF9, 0xFF, 0x00, 0xFF, 0x1F,
0xE0, 0x1F, 0xE3, 0xF8, 0x01, 0xF8, 0x7F, 0x00, 0x3F, 0x07, 0xE0, 0x07,
0xE0, 0xF8, 0x00, 0x78, 0x1F, 0x00, 0x7C, 0x07, 0xEF, 0xC1, 0xF8, 0xFC,
0x3E, 0x0F, 0x8F, 0xC0, 0xFB, 0xF0, 0x1F, 0xFC, 0x01, 0xFF, 0x00, 0x1F,
0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xF0, 0x03, 0xFE, 0x00, 0xFF,
0xE0, 0x1F, 0x7E, 0x07, 0xE7, 0xE1, 0xF8, 0x7C, 0x7E, 0x0F, 0xCF, 0xC0,
0xFC, 0xF8, 0x0F, 0xBF, 0x07, 0xE7, 0xC1, 0xF1, 0xF8, 0xFC, 0x3F, 0x7E,
0x07, 0xDF, 0x01, 0xFF, 0xC0, 0x3F, 0xE0, 0x0F, 0xF8, 0x01, 0xFC, 0x00,
0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F,
0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xE0, 0x1F,
0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFC };
const GFXglyph Heavitas12pt7bGlyphs[] PROGMEM = {
{ 0, 16, 18, 18, 1, -17 }, // 0x30 '0'
{ 36, 10, 18, 11, -1, -17 }, // 0x31 '1'
{ 59, 13, 18, 16, 1, -17 }, // 0x32 '2'
{ 89, 13, 18, 14, 0, -17 }, // 0x33 '3'
{ 119, 15, 18, 16, 0, -17 }, // 0x34 '4'
{ 153, 14, 18, 15, 0, -17 }, // 0x35 '5'
{ 185, 13, 18, 15, 1, -17 }, // 0x36 '6'
{ 215, 13, 18, 14, 0, -17 }, // 0x37 '7'
{ 245, 14, 18, 15, 0, -17 }, // 0x38 '8'
{ 277, 14, 18, 16, 1, -17 }, // 0x39 '9'
{ 309, 5, 11, 6, 0, -10 }, // 0x3A ':'
{ 316, 5, 14, 6, 0, -10 }, // 0x3B ';'
{ 325, 11, 14, 13, 1, -15 }, // 0x3C '<'
{ 345, 11, 11, 13, 1, -13 }, // 0x3D '='
{ 361, 11, 14, 13, 1, -15 }, // 0x3E '>'
{ 381, 14, 18, 14, -1, -17 }, // 0x3F '?'
{ 413, 16, 18, 19, 2, -17 }, // 0x40 '@'
{ 449, 20, 18, 19, -1, -17 }, // 0x41 'A'
{ 494, 15, 18, 17, 1, -17 }, // 0x42 'B'
{ 528, 18, 18, 19, 0, -17 }, // 0x43 'C'
{ 569, 16, 18, 19, 1, -17 }, // 0x44 'D'
{ 605, 14, 18, 16, 1, -17 }, // 0x45 'E'
{ 637, 14, 18, 16, 1, -17 }, // 0x46 'F'
{ 669, 20, 18, 20, 0, -17 }, // 0x47 'G'
{ 714, 16, 18, 19, 1, -17 }, // 0x48 'H'
{ 750, 5, 18, 8, 1, -17 }, // 0x49 'I'
{ 762, 13, 18, 15, 0, -17 }, // 0x4A 'J'
{ 792, 16, 18, 18, 1, -17 }, // 0x4B 'K'
{ 828, 13, 18, 15, 1, -17 }, // 0x4C 'L'
{ 858, 20, 18, 24, 1, -17 }, // 0x4D 'M'
{ 903, 17, 18, 20, 1, -17 }, // 0x4E 'N'
{ 942, 18, 18, 20, 1, -17 }, // 0x4F 'O'
{ 983, 15, 18, 17, 1, -17 }, // 0x50 'P'
{ 1017, 19, 18, 20, 0, -17 }, // 0x51 'Q'
{ 1060, 16, 18, 18, 1, -17 }, // 0x52 'R'
{ 1096, 14, 18, 16, 1, -17 }, // 0x53 'S'
{ 1128, 15, 18, 15, 0, -17 }, // 0x54 'T'
{ 1162, 16, 18, 19, 1, -17 }, // 0x55 'U'
{ 1198, 19, 18, 20, 0, -17 }, // 0x56 'V'
{ 1241, 27, 18, 27, 0, -17 }, // 0x57 'W'
{ 1302, 19, 18, 18, -1, -17 }, // 0x58 'X'
{ 1345, 18, 18, 17, 0, -17 }, // 0x59 'Y'
{ 1386, 15, 18, 17, 1, -17 } }; // 0x5A 'Z'
const GFXfont Heavitas12pt7b PROGMEM = {
(uint8_t *)Heavitas12pt7bBitmaps,
(GFXglyph *)Heavitas12pt7bGlyphs,
0x30, 0x5A, 24 };
// Approx. 1728 bytes