commit aecda6c21bcd916c90391cec93b54845a937aea1 Author: Daniel Eichhorn Date: Sun Oct 16 20:34:42 2016 +0200 Initial import diff --git a/ArialRoundedMTBold_36.h b/ArialRoundedMTBold_36.h new file mode 100644 index 0000000..12ddeb1 --- /dev/null +++ b/ArialRoundedMTBold_36.h @@ -0,0 +1,220 @@ +/**The MIT License (MIT) +Copyright (c) 2015 by Daniel Eichhorn +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. +See more at http://blog.squix.ch +*/ + +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t ArialRoundedMTBold_36Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0x77,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0x39,0xCE,0x73,0x00,0x00,0x3B,0xFF,0xFB,0x80, // '!' + 0xFC,0xFF,0xF3,0xFF,0xCF,0xFF,0x3F,0xFC,0xFF,0xF3,0xFF,0xCF,0xDE,0x1E,0x78,0x78, // '"' + 0x01,0x83,0x80,0x78,0x70,0x0F,0x0E,0x01,0xC3,0xC0,0x78,0x78,0x0F,0x0F,0x01,0xE1,0xE3,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0x07,0x87,0x80,0xF0,0xE0,0x1E,0x3C,0x07,0x87,0x80,0xF0,0xF0,0x7F,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xE3,0xC3,0xC0,0x78,0x78,0x0F,0x0E,0x01,0xC3,0xC0,0x78,0x78,0x07,0x06,0x00, // '#' + 0x00,0x60,0x00,0x0C,0x00,0x01,0x80,0x00,0x30,0x00,0x7F,0xE0,0x3F,0xFE,0x0F,0xFF,0xE1,0xF3,0x7E,0x7C,0x67,0xCF,0x0C,0x79,0xE1,0x8F,0x3C,0x30,0xC7,0xC6,0x00,0xFE,0xC0,0x0F,0xF8,0x00,0xFF,0xE0,0x0F,0xFF,0x00,0x7F,0xF0,0x01,0xFF,0x00,0x37,0xE0,0x06,0x3E,0xE0,0xC3,0xFC,0x18,0x7F,0xC3,0x0F,0xF8,0x61,0xEF,0x8C,0x79,0xFD,0x9F,0x1F,0xFF,0xC1,0xFF,0xF0,0x0F,0xFC,0x00,0x38,0x00,0x03,0x00,0x00,0x60,0x00,0x0C,0x00,0x01,0x80,0x00,0x30,0x00,0x06,0x00, // '$' + 0x1F,0x00,0x06,0x03,0xFC,0x00,0x70,0x1C,0x70,0x03,0x01,0xC1,0x80,0x38,0x0E,0x0E,0x03,0x80,0x70,0x70,0x1C,0x03,0x83,0x81,0xC0,0x1C,0x1C,0x0C,0x00,0xE0,0xE0,0xE0,0x07,0x07,0x0E,0x00,0x1C,0x70,0x70,0x00,0xFF,0x87,0x00,0x03,0xF8,0x30,0x00,0x00,0x03,0x87,0xF0,0x00,0x38,0x7F,0xC0,0x01,0xC3,0x8E,0x00,0x1C,0x38,0x38,0x00,0xC1,0xC1,0xC0,0x0E,0x0E,0x0E,0x00,0xE0,0x70,0x70,0x07,0x03,0x83,0x80,0x70,0x1C,0x1C,0x07,0x00,0xE0,0xE0,0x38,0x03,0x8E,0x03,0x80,0x0F,0xE0,0x1C,0x00,0x3E,0x00,0xC0,0x00,0x00, // '%' + 0x00,0xFC,0x00,0x01,0xFF,0x80,0x01,0xFF,0xE0,0x01,0xF0,0xF0,0x00,0xF0,0x3C,0x00,0x78,0x1E,0x00,0x3C,0x0F,0x00,0x1F,0x0F,0x80,0x0F,0xDF,0x80,0x03,0xFF,0x80,0x00,0xFF,0x80,0x00,0xFF,0x00,0x00,0xFF,0xC1,0x81,0xFF,0xF0,0xE1,0xF9,0xF8,0xF8,0xF8,0x7E,0x78,0xF8,0x1F,0xFC,0x7C,0x07,0xFC,0x3E,0x01,0xFE,0x1F,0x00,0x7F,0x0F,0xC0,0x3F,0xC3,0xF0,0x7F,0xF1,0xFF,0xFF,0xFC,0x7F,0xFF,0x3F,0x0F,0xFE,0x0F,0x01,0xFC,0x03,0x80, // '&' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xDE,0x78, // ''' + 0x03,0x81,0xC1,0xC1,0xE0,0xF0,0xF0,0xF8,0x78,0x3C,0x3E,0x1F,0x0F,0x0F,0x87,0xC3,0xE1,0xF0,0xF8,0x7C,0x3E,0x1F,0x0F,0x83,0xC1,0xF0,0xF8,0x3C,0x1E,0x0F,0x83,0xC0,0xF0,0x78,0x1C,0x07,0x01,0x80, // '(' + 0xE0,0x70,0x1C,0x0F,0x03,0x81,0xE0,0xF8,0x3C,0x1E,0x0F,0x87,0xC1,0xE0,0xF8,0x7C,0x3E,0x1F,0x0F,0x87,0xC3,0xE1,0xF0,0xF8,0x78,0x7C,0x3E,0x1E,0x0F,0x0F,0x87,0x83,0x83,0xC1,0xC1,0xC0,0xE0,0x00, // ')' + 0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x0E,0x38,0xFF,0x77,0xDF,0xFF,0x07,0xF0,0x07,0xC0,0x1D,0xC0,0x3B,0xC0,0xE3,0x83,0xC7,0x83,0x06,0x00, // '*' + 0x01,0xF0,0x00,0x3E,0x00,0x07,0xC0,0x00,0xF8,0x00,0x1F,0x00,0x03,0xE0,0x00,0x7C,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x1F,0x00,0x03,0xE0,0x00,0x7C,0x00,0x0F,0x80,0x01,0xF0,0x00,0x3E,0x00, // '+' + 0x7B,0xEF,0xFF,0x7C,0x71,0xCE,0x7B,0xCE,0x00, // ',' + 0x7F,0xDF,0xFF,0xFF,0xBF,0xE0, // '-' + 0x77,0xFF,0xF7,0x00, // '.' + 0x03,0x81,0xC1,0xE0,0xF0,0x70,0x78,0x3C,0x1E,0x0E,0x07,0x07,0x83,0xC1,0xC0,0xE0,0xF0,0x78,0x38,0x1C,0x1E,0x0F,0x07,0x03,0x83,0xC1,0xE0,0xE0,0x70,0x00, // '/' + 0x03,0xF0,0x03,0xFF,0x01,0xFF,0xE0,0xFF,0xFC,0x3E,0x1F,0x1F,0x03,0xE7,0xC0,0xF9,0xE0,0x1E,0xF8,0x07,0xFE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xFE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xFE,0x01,0xF7,0x80,0x79,0xF0,0x3E,0x7C,0x0F,0x8F,0x87,0xC3,0xFF,0xF0,0x7F,0xF8,0x0F,0xFC,0x00,0xFC,0x00, // '0' + 0x00,0x30,0x03,0xC0,0x3E,0x03,0xF0,0x3F,0x83,0xFC,0x7F,0xEF,0xDF,0xFC,0xFF,0xC7,0xD8,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x03,0x80, // '1' + 0x03,0xF8,0x03,0xFF,0x83,0xFF,0xF0,0xFF,0xFE,0x7E,0x1F,0x9F,0x03,0xFF,0x80,0x7F,0xE0,0x1F,0xF0,0x07,0xD8,0x01,0xF0,0x00,0xF8,0x00,0x7E,0x00,0x1F,0x00,0x1F,0x80,0x0F,0xC0,0x07,0xE0,0x03,0xF0,0x01,0xF8,0x00,0xFC,0x00,0x7E,0x00,0x3F,0x00,0x1F,0x80,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xF0, // '2' + 0x03,0xF0,0x07,0xFF,0x03,0xFF,0xE1,0xF0,0xFC,0x78,0x1F,0x1E,0x03,0xE7,0x00,0xF8,0x80,0x3E,0x00,0x1F,0x00,0x0F,0xC0,0x7F,0xE0,0x1F,0xF0,0x07,0xFE,0x01,0xFF,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xD8,0x01,0xFF,0x00,0x7F,0xE0,0x1F,0xF8,0x0F,0x9F,0x07,0xE7,0xFF,0xF0,0xFF,0xF8,0x1F,0xFC,0x01,0xFC,0x00, // '3' + 0x00,0x0F,0x00,0x00,0xFC,0x00,0x07,0xE0,0x00,0x7F,0x00,0x07,0xF8,0x00,0x7F,0xC0,0x03,0xFE,0x00,0x3D,0xF0,0x03,0xCF,0x80,0x3C,0x7C,0x03,0xE3,0xE0,0x1E,0x1F,0x01,0xE0,0xF8,0x1E,0x07,0xC1,0xF0,0x3E,0x0F,0x01,0xF0,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xE0,0x00,0xF8,0x00,0x07,0xC0,0x00,0x3E,0x00,0x01,0xF0,0x00,0x0F,0x80,0x00,0x38,0x00, // '4' + 0x1F,0xFF,0x8F,0xFF,0xE3,0xFF,0xF8,0xFF,0xFC,0x3C,0x00,0x0F,0x00,0x07,0xC0,0x01,0xF0,0x00,0x78,0x00,0x1E,0x7E,0x07,0xFF,0xE1,0xFF,0xFC,0xFF,0xFF,0xBF,0x07,0xE7,0x80,0xFC,0x80,0x1F,0x00,0x07,0xC0,0x01,0xF6,0x00,0x7F,0xC0,0x1F,0xF0,0x0F,0xBE,0x03,0xE7,0xC1,0xF1,0xFF,0xF8,0x1F,0xFC,0x01,0xFC,0x00, // '5' + 0x03,0xF8,0x01,0xFF,0x81,0xFF,0xF0,0x7C,0x7C,0x3C,0x0F,0x9F,0x03,0xE7,0x80,0x71,0xE0,0x00,0xF8,0x00,0x3E,0x3E,0x0F,0xBF,0xE3,0xFF,0xFC,0xFE,0x1F,0xBF,0x03,0xEF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xFE,0x01,0xF7,0x80,0x7D,0xF0,0x1F,0x7C,0x0F,0x8F,0x87,0xE3,0xFF,0xF0,0x7F,0xFC,0x0F,0xFC,0x00,0xFC,0x00, // '6' + 0x7F,0xFF,0xBF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0x00,0x0F,0x80,0x07,0xC0,0x01,0xE0,0x00,0xF8,0x00,0x7C,0x00,0x1E,0x00,0x0F,0x80,0x03,0xC0,0x01,0xF0,0x00,0x78,0x00,0x3E,0x00,0x0F,0x80,0x07,0xC0,0x01,0xF0,0x00,0x7C,0x00,0x3F,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x01,0xC0,0x00, // '7' + 0x03,0xF8,0x01,0xFF,0xC0,0x7F,0xFC,0x1F,0x0F,0xC7,0xC0,0xFC,0xF8,0x0F,0x9F,0x01,0xF3,0xE0,0x3E,0x7C,0x07,0xCF,0x80,0xF0,0xF8,0x7E,0x0F,0xFF,0x80,0xFF,0xE0,0x7F,0xFE,0x1F,0x83,0xF3,0xE0,0x3E,0xF8,0x03,0xFF,0x00,0x7F,0xE0,0x0F,0xFC,0x01,0xFF,0x80,0x3E,0xF8,0x0F,0x9F,0x83,0xF1,0xFF,0xFC,0x1F,0xFF,0x00,0x7F,0x00, // '8' + 0x03,0xF0,0x03,0xFF,0x03,0xFF,0xE0,0xFF,0xFC,0x7E,0x1F,0x1F,0x03,0xEF,0x80,0xFB,0xE0,0x1E,0xF8,0x07,0xFE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0x7C,0x0F,0xDF,0x87,0xF3,0xFF,0xFC,0x7F,0xDF,0x07,0xC7,0xC0,0x01,0xF0,0x00,0x78,0xE0,0x1E,0x78,0x0F,0x9F,0x03,0xC3,0xE3,0xE0,0xFF,0xF8,0x1F,0xF8,0x01,0xF8,0x00, // '9' + 0x77,0xFF,0xF7,0x00,0x00,0x00,0x00,0x00,0x01,0xDF,0xFF,0xDC, // ':' + 0x77,0xFF,0xF7,0x00,0x00,0x00,0x00,0x00,0x01,0xDE,0xFF,0xFE,0x73,0x9B,0xDC,0xC0, // ';' + 0x00,0x00,0x40,0x00,0x70,0x00,0xFC,0x00,0xFF,0x00,0xFF,0xC1,0xFF,0xE1,0xFF,0xC1,0xFF,0xC0,0xFF,0x80,0x3F,0x80,0x0F,0xE0,0x03,0xFE,0x00,0x7F,0xF0,0x07,0xFF,0x00,0x7F,0xF8,0x03,0xFF,0x00,0x3F,0xC0,0x03,0xF0,0x00,0x1C,0x00,0x01, // '<' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0, // '=' + 0x80,0x00,0x38,0x00,0x0F,0xC0,0x03,0xFC,0x00,0xFF,0xC0,0x1F,0xFE,0x00,0xFF,0xE0,0x0F,0xFE,0x00,0x7F,0xC0,0x07,0xF0,0x01,0xFC,0x01,0xFF,0x03,0xFF,0x83,0xFF,0x87,0xFF,0x83,0xFF,0x00,0xFF,0x00,0x3F,0x00,0x0E,0x00,0x02,0x00,0x00, // '>' + 0x03,0xF8,0x03,0xFF,0x83,0xFF,0xF0,0xFF,0xFE,0x7E,0x1F,0xBF,0x03,0xFF,0x80,0x7F,0xE0,0x1F,0x70,0x07,0xC8,0x03,0xE0,0x01,0xF8,0x00,0xFC,0x00,0x7E,0x00,0x3F,0x00,0x0F,0x80,0x03,0xC0,0x01,0xF0,0x00,0x78,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x1F,0x00,0x07,0xC0,0x01,0xF0,0x00,0x38,0x00, // '?' + 0x00,0x07,0xFE,0x00,0x00,0x0F,0xFF,0xF0,0x00,0x0F,0xFF,0xFE,0x00,0x07,0xE0,0x0F,0xE0,0x07,0xC0,0x00,0x7C,0x03,0xE0,0x00,0x0F,0x00,0xE0,0x00,0x01,0xE0,0x70,0x1F,0x9F,0x3C,0x3C,0x1F,0xF7,0xC7,0x0E,0x0F,0xFF,0xE1,0xC7,0x07,0xE3,0xF8,0x39,0xC3,0xE0,0x7E,0x0E,0x70,0xF8,0x0F,0x83,0xB8,0x7C,0x03,0xE0,0xEE,0x1F,0x00,0xF0,0x3B,0x8F,0x80,0x3C,0x0E,0xE3,0xE0,0x1F,0x07,0xB8,0xF8,0x07,0xC1,0xCE,0x3E,0x01,0xE0,0xF3,0x8F,0x80,0xF8,0x78,0xE3,0xE0,0x3E,0x1E,0x1C,0x7C,0x1F,0x9F,0x07,0x1F,0xFF,0xFF,0x81,0xC3,0xFF,0xFF,0xC0,0x38,0x7F,0xBF,0xE0,0x0F,0x07,0x87,0xE0,0x01,0xE0,0x00,0x00,0x3C,0x3C,0x00,0x00,0x3E,0x07,0xC0,0x00,0x1F,0x00,0xFE,0x00,0x3F,0x80,0x1F,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0x80,0x00,0x07,0xFF,0x00,0x00, // '@' + 0x00,0x3C,0x00,0x00,0x7E,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x01,0xFF,0x00,0x01,0xFF,0x80,0x01,0xEF,0x80,0x03,0xE7,0xC0,0x03,0xE7,0xC0,0x07,0xC7,0xC0,0x07,0xC3,0xE0,0x07,0xC3,0xE0,0x0F,0x81,0xF0,0x0F,0x81,0xF0,0x1F,0x81,0xF8,0x1F,0x00,0xF8,0x1F,0xFF,0xF8,0x3F,0xFF,0xFC,0x3F,0xFF,0xFC,0x7F,0xFF,0xFE,0x7C,0x00,0x7E,0x7C,0x00,0x3E,0xFC,0x00,0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x1F,0x70,0x00,0x0E, // 'A' + 0x7F,0xFF,0x07,0xFF,0xFC,0x3F,0xFF,0xF1,0xFF,0xFF,0xCF,0x80,0x7F,0x7C,0x01,0xFB,0xE0,0x07,0xDF,0x00,0x3E,0xF8,0x01,0xF7,0xC0,0x1F,0x3E,0x01,0xF9,0xFF,0xFF,0x8F,0xFF,0xF0,0x7F,0xFF,0xE3,0xFF,0xFF,0x9F,0x00,0x7E,0xF8,0x01,0xFF,0xC0,0x07,0xFE,0x00,0x3F,0xF0,0x01,0xFF,0x80,0x1F,0xFC,0x01,0xFB,0xFF,0xFF,0xDF,0xFF,0xFC,0xFF,0xFF,0xC3,0xFF,0xF8,0x00, // 'B' + 0x00,0xFF,0x00,0x07,0xFF,0x80,0x3F,0xFF,0xC0,0xFF,0xFF,0xC3,0xF8,0x1F,0xC7,0xE0,0x1F,0x9F,0x80,0x1F,0x3E,0x00,0x1F,0x7C,0x00,0x3D,0xF0,0x00,0x33,0xE0,0x00,0x07,0xC0,0x00,0x0F,0x80,0x00,0x1F,0x00,0x00,0x3E,0x00,0x00,0x7C,0x00,0x04,0xF8,0x00,0x1C,0xF8,0x00,0x7D,0xF0,0x00,0xFB,0xF0,0x03,0xE3,0xF0,0x0F,0xC7,0xF0,0x3F,0x07,0xFF,0xFE,0x07,0xFF,0xF8,0x03,0xFF,0xC0,0x01,0xFE,0x00, // 'C' + 0x7F,0xFE,0x03,0xFF,0xFE,0x0F,0xFF,0xFC,0x3F,0xFF,0xF8,0xF8,0x07,0xF3,0xE0,0x07,0xEF,0x80,0x1F,0xBE,0x00,0x3E,0xF8,0x00,0xFF,0xE0,0x01,0xFF,0x80,0x07,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x01,0xFF,0x80,0x07,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x03,0xFF,0x80,0x0F,0xBE,0x00,0x7E,0xF8,0x01,0xFB,0xE0,0x1F,0xCF,0xFF,0xFE,0x3F,0xFF,0xF0,0xFF,0xFF,0x81,0xFF,0xF8,0x00, // 'D' + 0x7F,0xFF,0xEF,0xFF,0xFE,0xFF,0xFF,0xEF,0xFF,0xFE,0xF8,0x00,0x0F,0x80,0x00,0xF8,0x00,0x0F,0x80,0x00,0xF8,0x00,0x0F,0x80,0x00,0xFF,0xFF,0xCF,0xFF,0xFC,0xFF,0xFF,0xCF,0xFF,0xFC,0xF8,0x00,0x0F,0x80,0x00,0xF8,0x00,0x0F,0x80,0x00,0xF8,0x00,0x0F,0x80,0x00,0xF8,0x00,0x0F,0x80,0x00,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFE, // 'E' + 0x7F,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xFF,0xF8,0xFF,0xFF,0x3F,0xFF,0xCF,0xFF,0xE3,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x1C,0x00,0x00, // 'F' + 0x00,0x7F,0x80,0x03,0xFF,0xF0,0x07,0xFF,0xF8,0x1F,0xFF,0xFC,0x1F,0xC1,0xFE,0x3F,0x00,0x7E,0x7E,0x00,0x3E,0x7C,0x00,0x3E,0x7C,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0xF8,0x07,0xFE,0xF8,0x0F,0xFF,0xF8,0x0F,0xFF,0xF8,0x07,0xFF,0xF8,0x00,0x1F,0x7C,0x00,0x1F,0x7C,0x00,0x1F,0x7E,0x00,0x1F,0x3F,0x00,0x3F,0x1F,0xC0,0xFF,0x1F,0xFF,0xFE,0x07,0xFF,0xFC,0x03,0xFF,0xF0,0x00,0x7F,0x80, // 'G' + 0x70,0x00,0x77,0xC0,0x07,0xFE,0x00,0x3F,0xF0,0x01,0xFF,0x80,0x0F,0xFC,0x00,0x7F,0xE0,0x03,0xFF,0x00,0x1F,0xF8,0x00,0xFF,0xC0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x03,0xFF,0x00,0x1F,0xF8,0x00,0xFF,0xC0,0x07,0xFE,0x00,0x3F,0xF0,0x01,0xFF,0x80,0x0F,0xFC,0x00,0x7F,0xE0,0x03,0xFF,0x00,0x1F,0xF8,0x00,0xFB,0x80,0x03,0x80, // 'H' + 0x77,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x80, // 'I' + 0x00,0x07,0x00,0x07,0xC0,0x03,0xE0,0x01,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x00,0x0F,0x80,0x07,0xC0,0x03,0xE0,0x01,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x70,0x0F,0xFC,0x07,0xFE,0x03,0xFF,0x01,0xFF,0xC1,0xFB,0xF1,0xF9,0xFF,0xFC,0x7F,0xFC,0x1F,0xFC,0x03,0xF8,0x00, // 'J' + 0x70,0x00,0xE3,0xE0,0x07,0xCF,0x80,0x3F,0x3E,0x01,0xFC,0xF8,0x0F,0xE3,0xE0,0x7F,0x0F,0x83,0xF8,0x3E,0x1F,0xC0,0xF8,0xFE,0x03,0xE7,0xF0,0x0F,0xBF,0x80,0x3F,0xFF,0x00,0xFF,0xFC,0x03,0xFF,0xF8,0x0F,0xFB,0xF0,0x3F,0xCF,0xE0,0xFE,0x1F,0x83,0xE0,0x3F,0x0F,0x80,0xFE,0x3E,0x01,0xF8,0xF8,0x03,0xF3,0xE0,0x0F,0xEF,0x80,0x1F,0xBE,0x00,0x3F,0xF8,0x00,0xFD,0xC0,0x01,0xE0, // 'K' + 0x70,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xE0, // 'L' + 0x7E,0x00,0x3F,0x7F,0x80,0x3F,0xFF,0xE0,0x1F,0xFF,0xF0,0x1F,0xFF,0xF8,0x0F,0xFF,0xFC,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0x83,0xFF,0xFB,0xC1,0xEF,0xFD,0xE0,0xF7,0xFE,0xF8,0xFB,0xFF,0x7C,0x7D,0xFF,0x9E,0x3C,0xFF,0xCF,0x1E,0x7F,0xE7,0xDF,0x3F,0xF3,0xEF,0x9F,0xF8,0xF7,0x8F,0xFC,0x7B,0xC7,0xFE,0x3F,0xE3,0xFF,0x1F,0xF1,0xFF,0x87,0xF0,0xFF,0xC3,0xF8,0x7F,0xE1,0xFC,0x3F,0xF0,0x7C,0x1F,0xF8,0x3E,0x0F,0xB8,0x0E,0x03,0x80, // 'M' + 0x78,0x00,0x3B,0xF0,0x01,0xFF,0xC0,0x07,0xFF,0x80,0x1F,0xFF,0x00,0x7F,0xFE,0x01,0xFF,0xF8,0x07,0xFF,0xF0,0x1F,0xFF,0xE0,0x7F,0xEF,0x81,0xFF,0x9F,0x07,0xFE,0x7E,0x1F,0xF8,0xF8,0x7F,0xE1,0xF1,0xFF,0x87,0xE7,0xFE,0x0F,0x9F,0xF8,0x1F,0x7F,0xE0,0x7F,0xFF,0x80,0xFF,0xFE,0x01,0xFF,0xF8,0x07,0xFF,0xE0,0x0F,0xFF,0x80,0x1F,0xFE,0x00,0x7F,0xF8,0x00,0xFD,0xC0,0x01,0xE0, // 'N' + 0x00,0xFF,0x00,0x01,0xFF,0xF0,0x03,0xFF,0xFE,0x03,0xFF,0xFF,0x83,0xFC,0x1F,0xE1,0xF8,0x03,0xF1,0xF8,0x00,0xFC,0xF8,0x00,0x3E,0x7C,0x00,0x1F,0x7C,0x00,0x07,0xFE,0x00,0x03,0xFF,0x00,0x01,0xFF,0x80,0x00,0xFF,0xC0,0x00,0x7F,0xE0,0x00,0x3F,0xF0,0x00,0x1F,0xFC,0x00,0x0F,0xBE,0x00,0x0F,0x9F,0x00,0x07,0xCF,0xC0,0x07,0xE3,0xF0,0x07,0xE0,0xFE,0x0F,0xF0,0x7F,0xFF,0xF0,0x1F,0xFF,0xF0,0x03,0xFF,0xE0,0x00,0x3F,0xC0,0x00, // 'O' + 0x7F,0xFC,0x1F,0xFF,0xE3,0xFF,0xFE,0x7F,0xFF,0xEF,0x80,0xFD,0xF0,0x0F,0xFE,0x00,0xFF,0xC0,0x1F,0xF8,0x03,0xFF,0x00,0x7F,0xE0,0x1F,0xFC,0x07,0xEF,0xFF,0xFD,0xFF,0xFF,0x3F,0xFF,0xC7,0xFF,0xE0,0xF8,0x00,0x1F,0x00,0x03,0xE0,0x00,0x7C,0x00,0x0F,0x80,0x01,0xF0,0x00,0x3E,0x00,0x07,0xC0,0x00,0xF8,0x00,0x0E,0x00,0x00, // 'P' + 0x00,0xFF,0x00,0x00,0xFF,0xF8,0x00,0xFF,0xFF,0x80,0x7F,0xFF,0xF0,0x3F,0xC1,0xFE,0x0F,0xC0,0x1F,0x87,0xE0,0x03,0xF1,0xF0,0x00,0x7C,0x7C,0x00,0x1F,0x3E,0x00,0x03,0xEF,0x80,0x00,0xFB,0xE0,0x00,0x3E,0xF8,0x00,0x0F,0xBE,0x00,0x03,0xEF,0x80,0x00,0xFB,0xE0,0x00,0x3E,0xF8,0x00,0x0F,0x9F,0x07,0x07,0xC7,0xC1,0xF1,0xF1,0xF8,0x3F,0xFC,0x3F,0x03,0xFE,0x07,0xF0,0x7F,0x81,0xFF,0xFF,0xC0,0x1F,0xFF,0xF8,0x03,0xFF,0xFF,0x80,0x1F,0xE3,0xF0,0x00,0x00,0x7C,0x00,0x00,0x07, // 'Q' + 0x7F,0xFF,0x07,0xFF,0xFE,0x3F,0xFF,0xF9,0xFF,0xFF,0xEF,0x80,0x3F,0xFC,0x00,0xFF,0xE0,0x03,0xFF,0x00,0x1F,0xF8,0x00,0xFF,0xC0,0x0F,0xFE,0x00,0xFD,0xFF,0xFF,0xEF,0xFF,0xFE,0x7F,0xFF,0xC3,0xFF,0xF8,0x1F,0x07,0xE0,0xF8,0x1F,0x87,0xC0,0x7E,0x3E,0x01,0xF9,0xF0,0x0F,0xCF,0x80,0x3F,0x7C,0x00,0xFF,0xE0,0x07,0xFF,0x00,0x1F,0xF8,0x00,0xFB,0x80,0x03,0xC0, // 'R' + 0x03,0xF8,0x01,0xFF,0xF0,0x3F,0xFF,0x87,0xFF,0xFC,0x7E,0x0F,0xCF,0xC0,0x7E,0xF8,0x03,0xEF,0x80,0x1E,0xFC,0x00,0xCF,0xF0,0x00,0x7F,0xF0,0x03,0xFF,0xE0,0x1F,0xFF,0x80,0x7F,0xFC,0x00,0x7F,0xE0,0x00,0x7F,0x60,0x03,0xFF,0x00,0x1F,0xF0,0x01,0xFF,0x80,0x1F,0xFC,0x03,0xFF,0xE0,0x7E,0x7F,0xFF,0xC3,0xFF,0xFC,0x0F,0xFF,0x00,0x3F,0xC0, // 'S' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x0F,0x80,0x00,0x7C,0x00,0x03,0xE0,0x00,0x1F,0x00,0x00,0xF8,0x00,0x07,0xC0,0x00,0x3E,0x00,0x01,0xF0,0x00,0x0F,0x80,0x00,0x7C,0x00,0x03,0xE0,0x00,0x1F,0x00,0x00,0xF8,0x00,0x07,0xC0,0x00,0x3E,0x00,0x01,0xF0,0x00,0x0F,0x80,0x00,0x7C,0x00,0x03,0xE0,0x00,0x1F,0x00,0x00,0xF8,0x00,0x03,0x80,0x00, // 'T' + 0x70,0x00,0x77,0xC0,0x07,0xFE,0x00,0x3F,0xF0,0x01,0xFF,0x80,0x0F,0xFC,0x00,0x7F,0xE0,0x03,0xFF,0x00,0x1F,0xF8,0x00,0xFF,0xC0,0x07,0xFE,0x00,0x3F,0xF0,0x01,0xFF,0x80,0x0F,0xFC,0x00,0x7F,0xE0,0x03,0xFF,0x00,0x1F,0xF8,0x00,0xFF,0xC0,0x07,0xFE,0x00,0x3F,0xF8,0x03,0xF7,0xC0,0x1F,0x3F,0x83,0xF8,0xFF,0xFF,0x83,0xFF,0xF8,0x0F,0xFF,0x80,0x1F,0xF0,0x00, // 'U' + 0x70,0x00,0x1D,0xF0,0x00,0x7F,0xE0,0x00,0xFF,0xE0,0x03,0xF7,0xC0,0x07,0xCF,0x80,0x0F,0x9F,0x80,0x3F,0x1F,0x00,0x7C,0x3F,0x00,0xF8,0x7E,0x03,0xE0,0x7C,0x07,0xC0,0xFC,0x0F,0x80,0xF8,0x3E,0x01,0xF0,0x7C,0x03,0xF0,0xF8,0x03,0xE3,0xE0,0x07,0xC7,0xC0,0x07,0xDF,0x00,0x0F,0xBE,0x00,0x1F,0x7C,0x00,0x1F,0xF0,0x00,0x3F,0xE0,0x00,0x7F,0x80,0x00,0x7F,0x00,0x00,0xFE,0x00,0x00,0x70,0x00, // 'V' + 0x70,0x03,0xC0,0x0E,0xF8,0x07,0xE0,0x1F,0xF8,0x07,0xE0,0x1F,0xF8,0x0F,0xF0,0x1F,0xF8,0x0F,0xF0,0x1F,0x7C,0x0F,0xF0,0x3E,0x7C,0x0F,0xF0,0x3E,0x7C,0x1F,0xF8,0x3E,0x7C,0x1E,0x78,0x3E,0x3E,0x1E,0x78,0x7C,0x3E,0x1E,0x78,0x7C,0x3E,0x3E,0x7C,0x7C,0x3E,0x3C,0x3C,0x7C,0x1E,0x3C,0x3C,0x78,0x1F,0x7C,0x3E,0xF8,0x1F,0x78,0x1E,0xF8,0x1F,0x78,0x1E,0xF8,0x0F,0x78,0x1E,0xF0,0x0F,0xF8,0x1F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x07,0xF0,0x0F,0xE0,0x07,0xF0,0x0F,0xE0,0x07,0xE0,0x07,0xE0,0x03,0xE0,0x07,0xC0,0x03,0xC0,0x03,0xC0, // 'W' + 0x38,0x00,0x73,0xE0,0x07,0x9F,0x00,0x7E,0xFC,0x07,0xE3,0xF0,0x3F,0x1F,0x83,0xF0,0x7E,0x3F,0x01,0xF9,0xF8,0x0F,0xDF,0x80,0x3F,0xF8,0x00,0xFF,0xC0,0x07,0xFC,0x00,0x1F,0xC0,0x00,0xFE,0x00,0x0F,0xF8,0x00,0xFF,0xE0,0x07,0xFF,0x80,0x7E,0xFC,0x07,0xE3,0xF0,0x7F,0x1F,0xC3,0xF0,0x7E,0x3F,0x01,0xFB,0xF0,0x07,0xFF,0x80,0x3F,0xF8,0x00,0xFB,0x80,0x03,0x80, // 'X' + 0x70,0x00,0x77,0xC0,0x07,0xFF,0x00,0x3E,0xF8,0x03,0xF7,0xE0,0x3F,0x1F,0x01,0xF0,0xFC,0x1F,0x83,0xF0,0xF8,0x0F,0x8F,0x80,0x7E,0xFC,0x01,0xF7,0xC0,0x07,0xFC,0x00,0x3F,0xE0,0x00,0xFE,0x00,0x03,0xE0,0x00,0x1F,0x00,0x00,0xF8,0x00,0x07,0xC0,0x00,0x3E,0x00,0x01,0xF0,0x00,0x0F,0x80,0x00,0x7C,0x00,0x03,0xE0,0x00,0x1F,0x00,0x00,0xF8,0x00,0x03,0x80,0x00, // 'Y' + 0x3F,0xFF,0xF8,0x7F,0xFF,0xF9,0xFF,0xFF,0xF1,0xFF,0xFF,0xE0,0x00,0x1F,0x80,0x00,0x7F,0x00,0x01,0xFC,0x00,0x07,0xF0,0x00,0x0F,0xC0,0x00,0x3F,0x00,0x00,0xFC,0x00,0x03,0xF0,0x00,0x0F,0xE0,0x00,0x3F,0x80,0x00,0x7E,0x00,0x01,0xF8,0x00,0x07,0xE0,0x00,0x1F,0x80,0x00,0x7F,0x00,0x01,0xFC,0x00,0x07,0xF0,0x00,0x0F,0xC0,0x00,0x3F,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xF8, // 'Z' + 0x7F,0xFF,0xFF,0xFF,0xFF,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3F,0xFF,0xFF,0xFF,0x7F,0xC0, // '[' + 0x70,0x3C,0x07,0x01,0xE0,0x78,0x1E,0x03,0x80,0xF0,0x3C,0x0F,0x01,0xC0,0x78,0x1E,0x07,0x80,0xE0,0x3C,0x0F,0x03,0xC0,0x70,0x1E,0x07,0x81,0xE0,0x38,0x0F,0x03,0xC0,0x60, // '\' + 0xFF,0xBF,0xFF,0xFF,0xFF,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0x80, // ']' + 0x03,0xE0,0x01,0xF0,0x01,0xFC,0x00,0xFE,0x00,0x7F,0x80,0x7B,0xC0,0x3D,0xF0,0x3E,0xF8,0x1E,0x3C,0x1F,0x1F,0x0F,0x07,0x8F,0x83,0xE7,0xC1,0xF7,0xC0,0x7C, // '^' + 0xFF,0xFF,0xFF,0xFF,0xF0, // '_' + 0xF8,0x3C,0x1E,0x0E,0x07, // '`' + 0x03,0xFC,0x03,0xFF,0xE0,0xFF,0xFE,0x3F,0x07,0xC7,0xC0,0x7C,0xF0,0x0F,0x9C,0x01,0xF0,0x00,0xFE,0x01,0xFF,0xC3,0xFF,0xF8,0xFF,0x9F,0x3F,0x03,0xEF,0x80,0x7D,0xF0,0x0F,0xBE,0x03,0xF7,0xE1,0xFE,0x7F,0xFF,0xE7,0xFE,0x7C,0x3E,0x07,0x00, // 'a' + 0x70,0x00,0x1F,0x00,0x03,0xE0,0x00,0x7C,0x00,0x0F,0x80,0x01,0xF0,0x00,0x3E,0x00,0x07,0xC7,0xE0,0xF9,0xFF,0x1F,0x7F,0xF3,0xFF,0xFF,0x7F,0x87,0xEF,0xE0,0x7D,0xF8,0x0F,0xFF,0x00,0xFF,0xC0,0x1F,0xF8,0x03,0xFF,0x00,0x7F,0xE0,0x0F,0xFE,0x03,0xFF,0xC0,0x7D,0xFE,0x1F,0xBF,0xFF,0xE7,0xDF,0xFC,0xF9,0xFF,0x0E,0x1F,0x80, // 'b' + 0x03,0xF8,0x03,0xFF,0x81,0xFF,0xF0,0xFF,0xFE,0x7F,0x0F,0xDF,0x01,0xFF,0xC0,0x3F,0xE0,0x04,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x07,0xFC,0x03,0xDF,0x01,0xF7,0xF0,0xFC,0xFF,0xFE,0x1F,0xFF,0x83,0xFF,0x80,0x3F,0x80, // 'c' + 0x00,0x01,0xC0,0x00,0x7C,0x00,0x0F,0x80,0x01,0xF0,0x00,0x3E,0x00,0x07,0xC0,0x00,0xF8,0x3F,0x1F,0x1F,0xF3,0xE7,0xFF,0x7D,0xFF,0xFF,0xBF,0x0F,0xF7,0xC0,0xFF,0xF8,0x0F,0xFE,0x01,0xFF,0xC0,0x1F,0xF8,0x03,0xFF,0x00,0x7F,0xE0,0x1F,0xFE,0x03,0xF7,0xC0,0x7E,0xFC,0x3F,0xCF,0xFF,0xF9,0xFF,0xDF,0x1F,0xF3,0xE0,0xF8,0x38, // 'd' + 0x03,0xF8,0x03,0xFF,0x81,0xFF,0xF0,0xF8,0x7E,0x7C,0x07,0x9F,0x01,0xFF,0x80,0x7F,0xE0,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xE0,0x00,0xF8,0x00,0x1F,0x00,0x77,0xC0,0x3C,0xFC,0x3F,0x1F,0xFF,0x83,0xFF,0xC0,0x3F,0x80, // 'e' + 0x01,0xF8,0x0F,0xF8,0x1F,0xF8,0x7F,0xE0,0xF8,0x01,0xF0,0x03,0xE0,0x3F,0xF8,0x7F,0xF9,0xFF,0xF1,0xFF,0xC0,0x7C,0x00,0xF8,0x01,0xF0,0x03,0xE0,0x07,0xC0,0x0F,0x80,0x1F,0x00,0x3E,0x00,0x7C,0x00,0xF8,0x01,0xF0,0x03,0xE0,0x07,0xC0,0x0F,0x80,0x0E,0x00, // 'f' + 0x07,0xE1,0xC3,0xFE,0x7C,0xFF,0xEF,0xBF,0xFF,0xF7,0xE1,0xFE,0xF8,0x0F,0xFF,0x01,0xFF,0xC0,0x1F,0xF8,0x03,0xFF,0x00,0x7F,0xE0,0x0F,0xFC,0x01,0xFF,0xC0,0x7E,0xF8,0x0F,0xDF,0x87,0xF9,0xFF,0xFF,0x3F,0xFB,0xE3,0xFE,0x7C,0x1F,0x8F,0x80,0x01,0xF7,0x00,0x7E,0xF0,0x0F,0x9F,0x83,0xF3,0xFF,0xFC,0x1F,0xFF,0x00,0xFF,0x80, // 'g' + 0x70,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE3,0xF0,0xF9,0xFF,0x3E,0xFF,0xEF,0xFF,0xFB,0xF8,0x3F,0xFC,0x0F,0xFE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xFE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xFE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xDC,0x00,0xE0, // 'h' + 0x77,0xFF,0xF7,0x00,0x0E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x80, // 'i' + 0x03,0x81,0xF0,0x7C,0x1F,0x03,0x80,0x00,0x00,0x0E,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xC1,0xF0,0x7C,0x1F,0x07,0xFF,0xFF,0xFB,0xFE,0x7E,0x00, // 'j' + 0x70,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x00,0x0F,0x80,0x07,0xC0,0x03,0xE0,0x01,0xF0,0x1C,0xF8,0x1E,0x7C,0x1F,0x3E,0x1F,0x9F,0x1F,0x8F,0x9F,0x07,0xDF,0x03,0xFF,0x81,0xFF,0xE0,0xFF,0xF0,0x7F,0x7C,0x3F,0x1F,0x1F,0x0F,0x8F,0x83,0xE7,0xC1,0xFB,0xE0,0x7D,0xF0,0x1F,0xF8,0x0F,0xB8,0x03,0x80, // 'k' + 0x77,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x80, // 'l' + 0x70,0xFC,0x0F,0x8F,0x3F,0xE3,0xFC,0xFF,0xFF,0x7F,0xEF,0xFF,0xFF,0xFE,0xFE,0x1F,0xE3,0xFF,0xC0,0xFC,0x1F,0xF8,0x0F,0x81,0xFF,0x80,0xF8,0x1F,0xF8,0x0F,0x81,0xFF,0x80,0xF8,0x1F,0xF8,0x0F,0x81,0xFF,0x80,0xF8,0x1F,0xF8,0x0F,0x81,0xFF,0x80,0xF8,0x1F,0xF8,0x0F,0x81,0xFF,0x80,0xF8,0x1F,0xF8,0x0F,0x81,0xFF,0x80,0xF8,0x1F,0x70,0x07,0x00,0xE0, // 'm' + 0x70,0xFC,0x3C,0x7F,0xCF,0xBF,0xFB,0xFF,0xFE,0xFE,0x0F,0xFF,0x03,0xFF,0xC0,0x7F,0xE0,0x1F,0xF8,0x07,0xFE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xFE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xFE,0x01,0xF7,0x00,0x38, // 'n' + 0x01,0xF8,0x00,0xFF,0xF0,0x1F,0xFF,0x83,0xFF,0xFC,0x7F,0x0F,0xE7,0xC0,0x3E,0xFC,0x03,0xFF,0x80,0x1F,0xF8,0x01,0xFF,0x80,0x1F,0xF8,0x01,0xFF,0x80,0x1F,0xFC,0x03,0xF7,0xC0,0x3E,0x7F,0x0F,0xE3,0xFF,0xFC,0x1F,0xFF,0x80,0xFF,0xF0,0x01,0xF8,0x00, // 'o' + 0x70,0xFC,0x1F,0x3F,0xE3,0xEF,0xFE,0x7F,0xFF,0xCF,0xF0,0xFD,0xF8,0x0F,0xBF,0x01,0xFF,0xC0,0x1F,0xF8,0x03,0xFF,0x00,0x7F,0xE0,0x0F,0xFC,0x01,0xFF,0xC0,0x7F,0xF8,0x0F,0xBF,0xC3,0xF7,0xFF,0xFC,0xFB,0xFF,0x9F,0x3F,0xE3,0xE3,0xF0,0x7C,0x00,0x0F,0x80,0x01,0xF0,0x00,0x3E,0x00,0x07,0xC0,0x00,0xF8,0x00,0x0E,0x00,0x00, // 'p' + 0x07,0xE1,0xC3,0xFE,0x7C,0xFF,0xEF,0x9F,0xFF,0xF7,0xE1,0xFE,0xF8,0x0F,0xFF,0x01,0xFF,0xC0,0x1F,0xF8,0x03,0xFF,0x00,0x7F,0xE0,0x0F,0xFC,0x01,0xFF,0xC0,0x7E,0xF8,0x0F,0xDF,0x87,0xF9,0xFF,0xFF,0x3F,0xFB,0xE3,0xFE,0x7C,0x1F,0x0F,0x80,0x01,0xF0,0x00,0x3E,0x00,0x07,0xC0,0x00,0xF8,0x00,0x1F,0x00,0x03,0xE0,0x00,0x38, // 'q' + 0x71,0xE7,0xDF,0xFF,0xFF,0xFF,0xFF,0xE1,0x7E,0x03,0xF0,0x1F,0x00,0xF8,0x07,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xC0,0x1C,0x00, // 'r' + 0x0F,0xF0,0x1F,0xFE,0x1F,0xFF,0x8F,0x87,0xEF,0x81,0xF7,0xC0,0x7B,0xF0,0x00,0xFF,0x80,0x3F,0xF8,0x0F,0xFF,0x00,0xFF,0xC0,0x0F,0xF6,0x01,0xFF,0x80,0x7F,0xE0,0x3F,0xF8,0x3E,0x7F,0xFF,0x1F,0xFF,0x03,0xFC,0x00, // 's' + 0x0E,0x00,0xF8,0x07,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x0F,0xFC,0xFF,0xF7,0xFF,0x9F,0xF8,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7F,0xE3,0xFF,0x0F,0xF8,0x3F,0x80, // 't' + 0x70,0x03,0xBE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xFE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xFE,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF8,0x07,0xFF,0x03,0xFF,0xE3,0xFD,0xFF,0xFF,0x7F,0xF7,0xCF,0xF8,0xF0,0xF8,0x38, // 'u' + 0x70,0x03,0xBC,0x00,0xFF,0x80,0x7F,0xE0,0x1F,0x7C,0x07,0x9F,0x03,0xE3,0xC0,0xF0,0xF8,0x7C,0x3E,0x1E,0x07,0x87,0x81,0xF3,0xE0,0x3C,0xF0,0x0F,0x3C,0x01,0xFE,0x00,0x7F,0x80,0x1F,0xE0,0x03,0xF0,0x00,0xFC,0x00,0x1E,0x00, // 'v' + 0x70,0x0F,0x00,0xEF,0x00,0xF0,0x0F,0xF8,0x1F,0x81,0xFF,0x81,0xF8,0x1F,0x78,0x1F,0x81,0xE7,0x83,0xFC,0x1E,0x7C,0x3F,0xC3,0xE3,0xC3,0xFC,0x3C,0x3C,0x79,0xE3,0xC3,0xE7,0x9E,0x7C,0x1E,0x79,0xE7,0x81,0xE7,0x0E,0x78,0x0E,0xF0,0xF7,0x00,0xFF,0x0F,0xF0,0x0F,0xE0,0x7F,0x00,0x7E,0x07,0xE0,0x07,0xE0,0x7E,0x00,0x7C,0x03,0xE0,0x03,0xC0,0x3C,0x00, // 'w' + 0x70,0x07,0x3C,0x07,0xBF,0x07,0xEF,0xC7,0xE3,0xE3,0xE0,0xFB,0xE0,0x7F,0xE0,0x1F,0xF0,0x07,0xF0,0x03,0xF8,0x03,0xFE,0x01,0xFF,0x01,0xF7,0xC1,0xF1,0xF1,0xF8,0xFC,0xF8,0x3E,0xF8,0x0F,0xFC,0x07,0xDC,0x01,0xC0, // 'x' + 0x38,0x01,0xCF,0x80,0x3D,0xF0,0x0F,0xBE,0x01,0xF3,0xE0,0x3C,0x7C,0x0F,0x87,0x81,0xE0,0xF8,0x7C,0x1F,0x0F,0x81,0xE1,0xE0,0x3E,0x7C,0x03,0xCF,0x00,0x7D,0xE0,0x07,0xFC,0x00,0xFF,0x00,0x1F,0xE0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xF8,0x00,0x1F,0x00,0x07,0xC0,0x1F,0xF8,0x07,0xFE,0x00,0x7F,0xC0,0x07,0xE0,0x00, // 'y' + 0x7F,0xFF,0x1F,0xFF,0xE7,0xFF,0xF9,0xFF,0xFE,0x00,0x3F,0x00,0x1F,0x80,0x07,0xC0,0x03,0xE0,0x01,0xF0,0x00,0xF8,0x00,0x7E,0x00,0x3F,0x00,0x1F,0x80,0x0F,0xC0,0x07,0xE0,0x03,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xF8, // 'z' + 0x01,0xF0,0x1F,0xC1,0xFE,0x1F,0xE0,0xFC,0x07,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x01,0xF8,0x0F,0x81,0xFC,0x1F,0xC0,0xF8,0x07,0xF0,0x1F,0xC0,0x3E,0x01,0xF8,0x07,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xFC,0x07,0xF8,0x1F,0xE0,0x7F,0x01,0xF0, // '{' + 0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x60, // '|' + 0x7C,0x07,0xF0,0x3F,0xC0,0xFF,0x01,0xF8,0x07,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xFC,0x03,0xE0,0x1F,0xC0,0x7F,0x00,0xF8,0x1F,0xC1,0xFC,0x0F,0x80,0xFC,0x07,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x01,0xF8,0x3F,0xC3,0xFC,0x1F,0xC0,0x7C,0x00 // '}' +}; +const GFXglyph ArialRoundedMTBold_36Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 10, 0, 0 }, // ' ' + { 1, 5, 26, 13, 4, -26 }, // '!' + { 18, 14, 9, 18, 2, -26 }, // '"' + { 34, 19, 26, 21, 0, -26 }, // '#' + { 96, 19, 37, 22, 1, -30 }, // '$' + { 184, 29, 27, 32, 1, -26 }, // '%' + { 282, 25, 26, 28, 2, -26 }, // '&' + { 364, 6, 9, 10, 1, -26 }, // ''' + { 371, 9, 33, 14, 2, -26 }, // '(' + { 409, 9, 33, 14, 2, -26 }, // ')' + { 447, 15, 14, 17, 0, -28 }, // '*' + { 474, 19, 18, 22, 1, -22 }, // '+' + { 517, 6, 11, 12, 3, -5 }, // ',' + { 526, 11, 4, 13, 1, -11 }, // '-' + { 532, 5, 5, 12, 3, -5 }, // '.' + { 536, 9, 26, 11, 1, -26 }, // '/' + { 566, 18, 26, 22, 2, -26 }, // '0' + { 625, 13, 26, 22, 2, -26 }, // '1' + { 668, 18, 26, 22, 2, -26 }, // '2' + { 727, 18, 26, 22, 2, -26 }, // '3' + { 786, 21, 26, 22, 0, -26 }, // '4' + { 855, 18, 26, 22, 2, -26 }, // '5' + { 914, 18, 26, 22, 2, -26 }, // '6' + { 973, 18, 26, 22, 3, -26 }, // '7' + { 1032, 19, 26, 22, 1, -26 }, // '8' + { 1094, 18, 26, 22, 1, -26 }, // '9' + { 1153, 5, 19, 12, 3, -19 }, // ':' + { 1165, 5, 25, 12, 3, -19 }, // ';' + { 1181, 18, 20, 22, 1, -23 }, // '<' + { 1226, 18, 13, 22, 2, -19 }, // '=' + { 1256, 18, 20, 22, 1, -23 }, // '>' + { 1301, 18, 26, 22, 1, -26 }, // '?' + { 1360, 34, 33, 36, 1, -26 }, // '@' + { 1501, 24, 26, 27, 1, -26 }, // 'A' + { 1579, 21, 26, 27, 3, -26 }, // 'B' + { 1648, 23, 26, 28, 2, -26 }, // 'C' + { 1723, 22, 26, 28, 3, -26 }, // 'D' + { 1795, 20, 26, 25, 3, -26 }, // 'E' + { 1860, 18, 26, 23, 3, -26 }, // 'F' + { 1919, 24, 26, 30, 2, -26 }, // 'G' + { 1997, 21, 26, 28, 3, -26 }, // 'H' + { 2066, 5, 26, 12, 3, -26 }, // 'I' + { 2083, 17, 26, 22, 1, -26 }, // 'J' + { 2139, 22, 26, 28, 3, -26 }, // 'K' + { 2211, 18, 26, 23, 3, -26 }, // 'L' + { 2270, 25, 26, 31, 3, -26 }, // 'M' + { 2352, 22, 26, 28, 3, -26 }, // 'N' + { 2424, 25, 26, 30, 2, -26 }, // 'O' + { 2506, 19, 26, 25, 3, -26 }, // 'P' + { 2568, 26, 28, 30, 2, -26 }, // 'Q' + { 2659, 21, 26, 27, 3, -26 }, // 'R' + { 2728, 20, 26, 25, 2, -26 }, // 'S' + { 2793, 21, 26, 24, 1, -26 }, // 'T' + { 2862, 21, 26, 28, 3, -26 }, // 'U' + { 2931, 23, 26, 26, 1, -26 }, // 'V' + { 3006, 32, 26, 35, 1, -26 }, // 'W' + { 3110, 21, 26, 23, 0, -26 }, // 'X' + { 3179, 21, 26, 24, 1, -26 }, // 'Y' + { 3248, 23, 26, 24, 0, -26 }, // 'Z' + { 3323, 10, 33, 14, 2, -26 }, // '[' + { 3365, 10, 26, 11, 0, -26 }, // '\' + { 3398, 10, 33, 14, 0, -26 }, // ']' + { 3440, 17, 14, 22, 2, -26 }, // '^' + { 3470, 18, 2, 19, 0, 3 }, // '_' + { 3475, 8, 5, 13, 1, -26 }, // '`' + { 3480, 19, 19, 22, 1, -19 }, // 'a' + { 3526, 19, 26, 24, 2, -26 }, // 'b' + { 3588, 18, 19, 22, 1, -19 }, // 'c' + { 3631, 19, 26, 24, 1, -26 }, // 'd' + { 3693, 18, 19, 22, 2, -19 }, // 'e' + { 3736, 15, 26, 13, -1, -26 }, // 'f' + { 3785, 19, 26, 24, 1, -19 }, // 'g' + { 3847, 18, 26, 23, 2, -26 }, // 'h' + { 3906, 5, 26, 11, 2, -26 }, // 'i' + { 3923, 10, 33, 11, -3, -26 }, // 'j' + { 3965, 17, 26, 22, 3, -26 }, // 'k' + { 4021, 5, 26, 11, 2, -26 }, // 'l' + { 4038, 28, 19, 33, 2, -19 }, // 'm' + { 4105, 18, 19, 23, 2, -19 }, // 'n' + { 4148, 20, 19, 23, 1, -19 }, // 'o' + { 4196, 19, 26, 24, 2, -19 }, // 'p' + { 4258, 19, 26, 24, 1, -19 }, // 'q' + { 4320, 13, 19, 17, 2, -19 }, // 'r' + { 4351, 17, 19, 21, 1, -19 }, // 's' + { 4392, 13, 26, 14, 0, -26 }, // 't' + { 4435, 18, 19, 23, 2, -19 }, // 'u' + { 4478, 18, 19, 21, 1, -19 }, // 'v' + { 4521, 28, 19, 30, 1, -19 }, // 'w' + { 4588, 17, 19, 20, 1, -19 }, // 'x' + { 4629, 19, 26, 21, 0, -19 }, // 'y' + { 4691, 18, 19, 20, 1, -19 }, // 'z' + { 4734, 13, 33, 15, 1, -26 }, // '{' + { 4788, 4, 33, 11, 3, -26 }, // '|' + { 4805, 13, 33, 15, 0, -26 } // '}' +}; +const GFXfont ArialRoundedMTBold_36 PROGMEM = { +(uint8_t *)ArialRoundedMTBold_36Bitmaps,(GFXglyph *)ArialRoundedMTBold_36Glyphs,0x20, 0x7E, 43}; + diff --git a/ArialRoundedMtBold_14.h b/ArialRoundedMtBold_14.h new file mode 100644 index 0000000..365d344 --- /dev/null +++ b/ArialRoundedMtBold_14.h @@ -0,0 +1,220 @@ +/**The MIT License (MIT) +Copyright (c) 2015 by Daniel Eichhorn +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. +See more at http://blog.squix.ch +*/ + +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t ArialRoundedMTBold_14Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0xFF,0xF8,0xF0, // '!' + 0xDE,0xF6, // '"' + 0x12,0x32,0x36,0xFF,0xFF,0x24,0xFF,0xFF,0x4C,0x48, // '#' + 0x10,0x61,0xF6,0xAD,0x7A,0x1E,0x0E,0xD7,0xAF,0x5B,0xE1,0x02,0x04,0x00, // '$' + 0x60,0x92,0x22,0x44,0x49,0x07,0x60,0x0B,0x82,0x48,0xC9,0x11,0x24,0x18, // '%' + 0x3C,0x19,0x82,0x60,0xF0,0x39,0x33,0x6C,0x73,0x1C,0xFF,0x8E,0x30, // '&' + 0xFC, // ''' + 0x32,0x64,0xCC,0xCC,0xC4,0x62,0x30, // '(' + 0xC4,0x62,0x33,0x33,0x32,0x64,0xC0, // ')' + 0x21,0x2A,0xE5,0x28, // '*' + 0x18,0x18,0x18,0xFF,0xFF,0x18,0x18, // '+' + 0xF6, // ',' + 0xFF, // '-' + 0xF0, // '.' + 0x33,0x32,0x66,0x4C,0xCC, // '/' + 0x38,0xFB,0x9E,0x3C,0x78,0xF1,0xF6,0x7C,0x70, // '0' + 0x19,0xDF,0xB1,0x8C,0x63,0x18,0xC0, // '1' + 0x38,0xFF,0x1E,0x30,0xC3,0x0C,0x30,0xFF,0xFC, // '2' + 0x79,0x9B,0x10,0x63,0xC7,0x81,0xC3,0xC6,0xF0, // '3' + 0x06,0x0E,0x1E,0x16,0x26,0x46,0xFF,0xFF,0x06,0x06, // '4' + 0x7E,0xFD,0x06,0x0F,0xD8,0xC1,0xC3,0xCC,0xF0, // '5' + 0x38,0xDB,0x1E,0x0F,0xD8,0xF1,0xE3,0x66,0x78, // '6' + 0xFF,0xFC,0x30,0x41,0x82,0x0C,0x18,0x30,0xC0, // '7' + 0x38,0xDB,0x1F,0x63,0x98,0xF1,0xE3,0xC6,0xF8, // '8' + 0x3C,0x66,0xC3,0xC3,0xE7,0x3F,0x03,0xC3,0x66,0x3C, // '9' + 0xF0,0x3C, // ':' + 0xF0,0x3D,0x80, // ';' + 0x02,0x1D,0xF7,0x0E,0x0F,0x83,0x81, // '<' + 0xFF,0xFC,0x07,0xFF,0xE0, // '=' + 0x81,0xC1,0xF0,0x70,0xEF,0xB8,0x40, // '>' + 0x3C,0xFF,0x1E,0x30,0xC7,0x0C,0x00,0x30,0x60, // '?' + 0x0F,0x83,0x06,0x60,0x24,0xED,0x99,0x9B,0x19,0xB1,0xBB,0x12,0xBF,0xE4,0xDC,0x40,0x13,0x06,0x0F,0xC0, // '@' + 0x1C,0x0E,0x05,0x06,0xC3,0x63,0x19,0xFC,0xFE,0xC1,0xE0,0xC0, // 'A' + 0xFC,0xFE,0xC7,0xC6,0xFE,0xFE,0xC3,0xC3,0xFF,0xFE, // 'B' + 0x3E,0x3F,0xB8,0xF8,0x3C,0x06,0x03,0x06,0xC7,0x7F,0x0F,0x00, // 'C' + 0xFE,0x7F,0xB0,0xF8,0x3C,0x1E,0x0F,0x07,0x87,0xFF,0x7F,0x00, // 'D' + 0xFE,0xFF,0xC0,0xC0,0xFE,0xFE,0xC0,0xC0,0xFF,0xFF, // 'E' + 0xFF,0xFF,0x06,0x0F,0xDF,0xB0,0x60,0xC1,0x80, // 'F' + 0x1E,0x3F,0x98,0xF8,0x2C,0x06,0x3F,0x1E,0xC3,0x7F,0x9F,0x00, // 'G' + 0xC1,0xE0,0xF0,0x78,0x3F,0xFF,0xFF,0x07,0x83,0xC1,0xE0,0xC0, // 'H' + 0xFF,0xFF,0xF0, // 'I' + 0x06,0x0C,0x18,0x30,0x60,0xF1,0xF3,0x7E,0x78, // 'J' + 0xC3,0x63,0xB3,0x9B,0x8F,0x87,0x63,0x19,0x8E,0xC3,0x60,0xC0, // 'K' + 0xC1,0x83,0x06,0x0C,0x18,0x30,0x60,0xFF,0xFC, // 'L' + 0xE1,0xFC,0xFF,0x3F,0xCF,0xD2,0xF7,0xBD,0xEF,0x7B,0xCC,0xF3,0x30, // 'M' + 0xC1,0xF0,0xFC,0x7E,0x3D,0x9E,0x6F,0x3F,0x8F,0xC3,0xE0,0xC0, // 'N' + 0x1E,0x1F,0xE6,0x1B,0x03,0xC0,0xF0,0x3C,0x0D,0x86,0x7F,0x87,0x80, // 'O' + 0xFE,0xFF,0xC3,0xC3,0xFF,0xFE,0xC0,0xC0,0xC0,0xC0, // 'P' + 0x1E,0x0F,0xF1,0x87,0x60,0x6C,0x0D,0x81,0xB1,0x33,0x7C,0x7F,0x83,0xD8,0x01,0x80, // 'Q' + 0xFE,0xFF,0xC3,0xC3,0xFE,0xFC,0xCE,0xC6,0xC3,0xC3, // 'R' + 0x7C,0xFE,0xC7,0xC2,0x7C,0x0F,0xC3,0xC3,0x7E,0x3C, // 'S' + 0xFF,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, // 'T' + 0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x1F,0x00, // 'U' + 0xC1,0xE0,0xD8,0xCC,0x66,0x31,0xB0,0xD8,0x6C,0x1C,0x0E,0x00, // 'V' + 0xC7,0x1E,0x38,0xF1,0x46,0xDB,0x66,0xDB,0x36,0xD9,0xA2,0xC7,0x1C,0x38,0xE1,0x83,0x00, // 'W' + 0xC3,0x66,0x7E,0x3C,0x18,0x3C,0x7E,0x66,0xC3,0xC3, // 'X' + 0xC3,0xC3,0x66,0x3E,0x3C,0x18,0x18,0x18,0x18,0x18, // 'Y' + 0x7F,0x3F,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xFF,0xFF,0xC0, // 'Z' + 0xFF,0xCC,0xCC,0xCC,0xCC,0xCF,0xF0, // '[' + 0xCC,0x44,0x66,0x22,0x33, // '\' + 0xFF,0x33,0x33,0x33,0x33,0x3F,0xF0, // ']' + 0x30,0xE7,0x9A,0xCF,0x30, // '^' + 0xFE, // '_' + 0xD0, // '`' + 0x7D,0x8C,0x7F,0x3C,0x79,0xDD,0x80, // 'a' + 0xC1,0x83,0x06,0xEF,0xF8,0xF1,0xE3,0xFF,0xB8, // 'b' + 0x3C,0xFF,0x1E,0x0C,0x6F,0xCF,0x00, // 'c' + 0x06,0x0C,0x1B,0xBF,0xF8,0xF1,0xE3,0xFE,0xEC, // 'd' + 0x3C,0xCF,0x1F,0xFC,0x0C,0xCF,0x00, // 'e' + 0x3B,0x19,0xF6,0x31,0x8C,0x63,0x00, // 'f' + 0x77,0xFF,0x1E,0x3C,0x7F,0xDD,0xE3,0xC6,0xF8, // 'g' + 0xC1,0x83,0x06,0xEF,0xF8,0xF1,0xE3,0xC7,0x8C, // 'h' + 0xF3,0xFF,0xF0, // 'i' + 0x33,0x03,0x33,0x33,0x33,0x3F,0xE0, // 'j' + 0xC1,0x83,0x06,0x6D,0x9E,0x3E,0x66,0xCD,0x8C, // 'k' + 0xFF,0xFF,0xF0, // 'l' + 0xD9,0xDF,0xFF,0x31,0xE6,0x3C,0xC7,0x98,0xF3,0x18, // 'm' + 0xDD,0xFF,0x1E,0x3C,0x78,0xF1,0x80, // 'n' + 0x38,0xFB,0x1E,0x3C,0x6F,0x8E,0x00, // 'o' + 0xDD,0xFF,0x1E,0x3C,0x7F,0xF7,0x60,0xC1,0x80, // 'p' + 0x77,0xFF,0x1E,0x3C,0x7F,0xDD,0x83,0x06,0x0C, // 'q' + 0xDF,0xF1,0x8C,0x63,0x00, // 'r' + 0x7B,0x3E,0x1E,0x0F,0x37,0x80, // 's' + 0x63,0x19,0xF6,0x31,0x8C,0x79,0xC0, // 't' + 0xC7,0x8F,0x1E,0x3C,0x7F,0xDD,0x80, // 'u' + 0xC7,0x8D,0x93,0x62,0x87,0x04,0x00, // 'v' + 0xC4,0x79,0xCD,0x29,0x35,0x67,0xBC,0x63,0x0C,0x60, // 'w' + 0xC6,0xD9,0xF1,0xC7,0xCD,0xB1,0x80, // 'x' + 0xC7,0x8D,0x93,0x62,0xC7,0x06,0x18,0xF1,0xC0, // 'y' + 0xFE,0x18,0x61,0x86,0x1F,0xFF,0x80, // 'z' + 0x19,0xCC,0x63,0x3B,0x8E,0x31,0x8C,0x71,0x80, // '{' + 0xFF,0xFF,0xFF,0xC0, // '|' + 0xC7,0x18,0xC6,0x38,0xEE,0x63,0x19,0xCC,0x00 // '}' +}; +const GFXglyph ArialRoundedMTBold_14Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 5, 0, 0 }, // ' ' + { 1, 2, 10, 6, 1, -10 }, // '!' + { 4, 5, 3, 8, 1, -10 }, // '"' + { 6, 8, 10, 9, 0, -10 }, // '#' + { 16, 7, 15, 9, 1, -12 }, // '$' + { 30, 11, 10, 13, 0, -10 }, // '%' + { 44, 10, 10, 12, 1, -10 }, // '&' + { 57, 2, 3, 4, 1, -10 }, // ''' + { 58, 4, 13, 6, 1, -10 }, // '(' + { 65, 4, 13, 6, 0, -10 }, // ')' + { 72, 5, 6, 7, 1, -11 }, // '*' + { 76, 8, 7, 9, 0, -9 }, // '+' + { 83, 2, 4, 5, 1, -2 }, // ',' + { 84, 4, 2, 6, 0, -5 }, // '-' + { 85, 2, 2, 5, 1, -2 }, // '.' + { 86, 4, 10, 5, 0, -10 }, // '/' + { 91, 7, 10, 9, 1, -10 }, // '0' + { 100, 5, 10, 9, 1, -10 }, // '1' + { 107, 7, 10, 9, 1, -10 }, // '2' + { 116, 7, 10, 9, 1, -10 }, // '3' + { 125, 8, 10, 9, 0, -10 }, // '4' + { 135, 7, 10, 9, 1, -10 }, // '5' + { 144, 7, 10, 9, 1, -10 }, // '6' + { 153, 7, 10, 9, 1, -10 }, // '7' + { 162, 7, 10, 9, 1, -10 }, // '8' + { 171, 8, 10, 9, 0, -10 }, // '9' + { 181, 2, 7, 5, 1, -7 }, // ':' + { 183, 2, 9, 5, 1, -7 }, // ';' + { 186, 7, 8, 9, 1, -9 }, // '<' + { 193, 7, 5, 9, 1, -7 }, // '=' + { 198, 7, 8, 9, 1, -9 }, // '>' + { 205, 7, 10, 9, 1, -10 }, // '?' + { 214, 12, 13, 15, 1, -10 }, // '@' + { 234, 9, 10, 11, 1, -10 }, // 'A' + { 246, 8, 10, 11, 1, -10 }, // 'B' + { 256, 9, 10, 11, 1, -10 }, // 'C' + { 268, 9, 10, 11, 1, -10 }, // 'D' + { 280, 8, 10, 10, 1, -10 }, // 'E' + { 290, 7, 10, 9, 1, -10 }, // 'F' + { 299, 9, 10, 12, 1, -10 }, // 'G' + { 311, 9, 10, 12, 1, -10 }, // 'H' + { 323, 2, 10, 5, 1, -10 }, // 'I' + { 326, 7, 10, 9, 0, -10 }, // 'J' + { 335, 9, 10, 11, 1, -10 }, // 'K' + { 347, 7, 10, 9, 1, -10 }, // 'L' + { 356, 10, 10, 13, 1, -10 }, // 'M' + { 369, 9, 10, 12, 1, -10 }, // 'N' + { 381, 10, 10, 12, 1, -10 }, // 'O' + { 394, 8, 10, 10, 1, -10 }, // 'P' + { 404, 11, 11, 12, 1, -10 }, // 'Q' + { 420, 8, 10, 11, 1, -10 }, // 'R' + { 430, 8, 10, 10, 1, -10 }, // 'S' + { 440, 8, 10, 10, 0, -10 }, // 'T' + { 450, 9, 10, 12, 1, -10 }, // 'U' + { 462, 9, 10, 11, 0, -10 }, // 'V' + { 474, 13, 10, 14, 0, -10 }, // 'W' + { 491, 8, 10, 9, 0, -10 }, // 'X' + { 501, 8, 10, 10, 0, -10 }, // 'Y' + { 511, 9, 10, 10, 0, -10 }, // 'Z' + { 523, 4, 13, 6, 1, -10 }, // '[' + { 530, 4, 10, 5, 0, -10 }, // '\' + { 535, 4, 13, 6, 0, -10 }, // ']' + { 542, 6, 6, 9, 1, -10 }, // '^' + { 547, 7, 1, 8, 0, 1 }, // '_' + { 548, 2, 2, 6, 1, -10 }, // '`' + { 549, 7, 7, 9, 1, -7 }, // 'a' + { 556, 7, 10, 10, 1, -10 }, // 'b' + { 565, 7, 7, 9, 1, -7 }, // 'c' + { 572, 7, 10, 10, 1, -10 }, // 'd' + { 581, 7, 7, 9, 1, -7 }, // 'e' + { 588, 5, 10, 6, 0, -10 }, // 'f' + { 595, 7, 10, 10, 1, -7 }, // 'g' + { 604, 7, 10, 9, 1, -10 }, // 'h' + { 613, 2, 10, 5, 1, -10 }, // 'i' + { 616, 4, 13, 5, -1, -10 }, // 'j' + { 623, 7, 10, 9, 1, -10 }, // 'k' + { 632, 2, 10, 5, 1, -10 }, // 'l' + { 635, 11, 7, 13, 1, -7 }, // 'm' + { 645, 7, 7, 9, 1, -7 }, // 'n' + { 652, 7, 7, 9, 1, -7 }, // 'o' + { 659, 7, 10, 10, 1, -7 }, // 'p' + { 668, 7, 10, 10, 1, -7 }, // 'q' + { 677, 5, 7, 7, 1, -7 }, // 'r' + { 682, 6, 7, 9, 1, -7 }, // 's' + { 688, 5, 10, 6, 0, -10 }, // 't' + { 695, 7, 7, 9, 1, -7 }, // 'u' + { 702, 7, 7, 9, 0, -7 }, // 'v' + { 709, 11, 7, 12, 0, -7 }, // 'w' + { 719, 7, 7, 8, 0, -7 }, // 'x' + { 726, 7, 10, 9, 0, -7 }, // 'y' + { 735, 7, 7, 8, 0, -7 }, // 'z' + { 742, 5, 13, 6, 0, -10 }, // '{' + { 751, 2, 13, 5, 1, -10 }, // '|' + { 755, 5, 13, 6, 1, -10 } // '}' +}; +const GFXfont ArialRoundedMTBold_14 PROGMEM = { +(uint8_t *)ArialRoundedMTBold_14Bitmaps,(GFXglyph *)ArialRoundedMTBold_14Glyphs,0x20, 0x7E, 17}; + diff --git a/GfxUi.cpp b/GfxUi.cpp new file mode 100644 index 0000000..86819b4 --- /dev/null +++ b/GfxUi.cpp @@ -0,0 +1,213 @@ +/**The MIT License (MIT) +Copyright (c) 2015 by Daniel Eichhorn +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. +See more at http://blog.squix.ch +*/ + +#include "GfxUi.h" + +GfxUi::GfxUi(Adafruit_ILI9341 *tft) { + _tft = tft; +} + +void GfxUi::drawString(int x, int y, char *text) { + int16_t x1, y1; + uint16_t w, h; + _tft->setTextWrap(false); + _tft->getTextBounds(text, 0, 0, &x1, &y1, &w, &h); + switch (_alignment) { + case LEFT: + x1 = x; + break; + case CENTER: + x1 = x - w / 2; + break; + case RIGHT: + x1 = x - w; + break; + } + if (_textColor != _backgroundColor) { + _tft->fillRect(x1, y - h -1, w + 1, h + 1, _backgroundColor); + } + _tft->setCursor(x1, y); + _tft->print(text); +} + +void GfxUi::drawString(int x, int y, String text) { + char buf[text.length()+2]; + text.toCharArray(buf, text.length() + 1); + drawString(x, y, buf); +} + +void GfxUi::setTextColor(uint16_t c) { + setTextColor(c, c); +} +void GfxUi::setTextColor(uint16_t c, uint16_t bg) { + _textColor = c; + _backgroundColor = bg; + _tft->setTextColor(_textColor, _backgroundColor); +} + +void GfxUi::setTextAlignment(TextAlignment alignment) { + _alignment = alignment; +} + +void GfxUi::drawProgressBar(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint8_t percentage, uint16_t frameColor, uint16_t barColor) { + if (percentage == 0) { + _tft->fillRoundRect(x0, y0, w, h, 3, _backgroundColor); + } + uint8_t margin = 2; + uint16_t barHeight = h - 2 * margin; + uint16_t barWidth = w - 2 * margin; + _tft->drawRoundRect(x0, y0, w, h, 3, frameColor); + _tft->fillRect(x0 + margin, y0 + margin, barWidth * percentage / 100.0, barHeight, barColor); +} + + +// Code mostly from +// https://github.com/adafruit/Adafruit_ILI9341/blob/master/examples/spitftbitmap/spitftbitmap.ino +void GfxUi::drawBmp(String filename, uint8_t x, uint16_t y) { + + File bmpFile; + int bmpWidth, bmpHeight; // W+H in pixels + uint8_t bmpDepth; // Bit depth (currently must be 24) + uint32_t bmpImageoffset; // Start of image data in file + uint32_t rowSize; // Not always = bmpWidth; may have padding + uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel) + uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer + boolean goodBmp = false; // Set to true on valid header parse + boolean flip = true; // BMP is stored bottom-to-top + int w, h, row, col; + uint8_t r, g, b; + uint32_t pos = 0, startTime = millis(); + + if((x >= _tft->width()) || (y >= _tft->height())) return; + + Serial.println(); + Serial.print(F("Loading image '")); + Serial.print(filename); + Serial.println('\''); + + // Open requested file on SD card + if ((bmpFile = SPIFFS.open(filename, "r")) == NULL) { + Serial.print(F("File not found")); + return; + } + + // Parse BMP header + if(read16(bmpFile) == 0x4D42) { // BMP signature + Serial.print(F("File size: ")); Serial.println(read32(bmpFile)); + (void)read32(bmpFile); // Read & ignore creator bytes + bmpImageoffset = read32(bmpFile); // Start of image data + Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC); + // Read DIB header + Serial.print(F("Header size: ")); Serial.println(read32(bmpFile)); + bmpWidth = read32(bmpFile); + bmpHeight = read32(bmpFile); + if(read16(bmpFile) == 1) { // # planes -- must be '1' + bmpDepth = read16(bmpFile); // bits per pixel + Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth); + if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed + + goodBmp = true; // Supported BMP format -- proceed! + Serial.print(F("Image size: ")); + Serial.print(bmpWidth); + Serial.print('x'); + Serial.println(bmpHeight); + + // BMP rows are padded (if needed) to 4-byte boundary + rowSize = (bmpWidth * 3 + 3) & ~3; + + // If bmpHeight is negative, image is in top-down order. + // This is not canon but has been observed in the wild. + if(bmpHeight < 0) { + bmpHeight = -bmpHeight; + flip = false; + } + + // Crop area to be loaded + w = bmpWidth; + h = bmpHeight; + if((x+w-1) >= _tft->width()) w = _tft->width() - x; + if((y+h-1) >= _tft->height()) h = _tft->height() - y; + + // Set TFT address window to clipped image bounds + _tft->setAddrWindow(x, y, x+w-1, y+h-1); + + for (row=0; row= sizeof(sdbuffer)) { // Indeed + bmpFile.read(sdbuffer, sizeof(sdbuffer)); + buffidx = 0; // Set index to beginning + } + + // Convert pixel from BMP to TFT format, push to display + b = sdbuffer[buffidx++]; + g = sdbuffer[buffidx++]; + r = sdbuffer[buffidx++]; + _tft->pushColor(_tft->color565(r,g,b)); + yield(); + } // end pixel + } // end scanline + Serial.print(F("Loaded in ")); + Serial.print(millis() - startTime); + Serial.println(" ms"); + } // end goodBmp + } + } + + bmpFile.close(); + if(!goodBmp) Serial.println(F("BMP format not recognized.")); +} + +// These read 16- and 32-bit types from the SD card file. +// BMP data is stored little-endian, Arduino is little-endian too. +// May need to reverse subscript order if porting elsewhere. + +uint16_t GfxUi::read16(File &f) { + uint16_t result; + ((uint8_t *)&result)[0] = f.read(); // LSB + ((uint8_t *)&result)[1] = f.read(); // MSB + return result; +} + +uint32_t GfxUi::read32(File &f) { + uint32_t result; + ((uint8_t *)&result)[0] = f.read(); // LSB + ((uint8_t *)&result)[1] = f.read(); + ((uint8_t *)&result)[2] = f.read(); + ((uint8_t *)&result)[3] = f.read(); // MSB + return result; +} + diff --git a/GfxUi.h b/GfxUi.h new file mode 100644 index 0000000..4b0cbfc --- /dev/null +++ b/GfxUi.h @@ -0,0 +1,56 @@ +/**The MIT License (MIT) +Copyright (c) 2015 by Daniel Eichhorn +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. +See more at http://blog.squix.ch +*/ + +#include +#include + +#ifndef _GFX_UI_H +#define _GFX_UI_H + + +#define BUFFPIXEL 20 + +enum TextAlignment { + LEFT, CENTER, RIGHT +}; + +class GfxUi { + public: + GfxUi(Adafruit_ILI9341 * tft); + void drawString(int x, int y, char *text); + void drawString(int x, int y, String text); + void setTextAlignment(TextAlignment alignment); + void setTextColor(uint16_t c); + void setTextColor(uint16_t c, uint16_t bg); + void drawBmp(String filename, uint8_t x, uint16_t y); + void drawProgressBar(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t percentage, uint16_t frameColor, uint16_t barColor); + + private: + Adafruit_ILI9341 * _tft; + TextAlignment _alignment = LEFT; + uint16_t _textColor; + uint16_t _backgroundColor; + uint16_t read16(File &f); + uint32_t read32(File &f); + +}; + +#endif + diff --git a/WebResource.cpp b/WebResource.cpp new file mode 100644 index 0000000..0e668a2 --- /dev/null +++ b/WebResource.cpp @@ -0,0 +1,104 @@ +/**The MIT License (MIT) +Copyright (c) 2015 by Daniel Eichhorn +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. +See more at http://blog.squix.ch +*/ + +#include "WebResource.h" + +WebResource::WebResource(){ + +} + +void WebResource::downloadFile(String url, String filename) { + downloadFile(url, filename, nullptr); +} + +void WebResource::downloadFile(String url, String filename, ProgressCallback progressCallback) { + Serial.println("Downloading " + url + " and saving as " + filename); + + if (SPIFFS.exists(filename) == true) { + Serial.println("File already exists. Skipping"); + return; + } + // wait for WiFi connection + if((_wifiMulti.run() == WL_CONNECTED)) { + HTTPClient http; + + Serial.print("[HTTP] begin...\n"); + + // configure server and url + http.begin(url); + + Serial.print("[HTTP] GET...\n"); + // start connection and send HTTP header + int httpCode = http.GET(); + if(httpCode > 0) { + //SPIFFS.remove(filename); + File f = SPIFFS.open(filename, "w+"); + if (!f) { + Serial.println("file open failed"); + return; + } + // HTTP header has been send and Server response header has been handled + Serial.printf("[HTTP] GET... code: %d\n", httpCode); + + // file found at server + if(httpCode == HTTP_CODE_OK) { + + // get lenght of document (is -1 when Server sends no Content-Length header) + int total = http.getSize(); + int len = total; + progressCallback(filename, 0,total); + // create buffer for read + uint8_t buff[128] = { 0 }; + + // get tcp stream + WiFiClient * stream = http.getStreamPtr(); + + // read all data from server + while(http.connected() && (len > 0 || len == -1)) { + // get available data size + size_t size = stream->available(); + + if(size) { + // read up to 128 byte + int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size)); + + // write it to Serial + f.write(buff, c); + + if(len > 0) { + len -= c; + } + progressCallback(filename, total - len,total); + } + delay(1); + } + + Serial.println(); + Serial.print("[HTTP] connection closed or file end.\n"); + + } + f.close(); + } else { + Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); + } + + http.end(); + } +} diff --git a/WebResource.h b/WebResource.h new file mode 100644 index 0000000..6039316 --- /dev/null +++ b/WebResource.h @@ -0,0 +1,45 @@ +/**The MIT License (MIT) +Copyright (c) 2015 by Daniel Eichhorn +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. +See more at http://blog.squix.ch +*/ + +#include +#include +#include +#include +#include + +#ifndef _WEBRESOURCE_H +#define _WEBRESOURCE_H + +typedef void (*ProgressCallback)(String fileName, int16_t bytesDownloaded, int16_t bytesTotal); + +class WebResource { + public: + WebResource(); + void downloadFile(String url, String filename, ProgressCallback progressCallback); + void downloadFile(String url, String filename); + + + private: + ESP8266WiFiMulti _wifiMulti; + +}; + +#endif + diff --git a/esp8266-weather-station-color.ino b/esp8266-weather-station-color.ino new file mode 100644 index 0000000..4a58e30 --- /dev/null +++ b/esp8266-weather-station-color.ino @@ -0,0 +1,341 @@ +/**The MIT License (MIT) +Copyright (c) 2015 by Daniel Eichhorn +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. +See more at http://blog.squix.ch +*/ + +#include + +#include // Core graphics library +#include // Hardware-specific library +#include +// Additional UI functions +#include "GfxUi.h" + +// Fonts created by http://oleddisplay.squix.ch/ +#include "ArialRoundedMTBold_14.h" +#include "ArialRoundedMTBold_36.h" + +// Download helper +#include "WebResource.h" + +#include +#include +#include +#include +#include + +// Helps with connecting to internet +#include + +// check settings.h for adapting to your needs +#include "settings.h" +#include +#include +#include "TimeClient.h" + +// HOSTNAME for OTA update +#define HOSTNAME "ESP8266-OTA-" + +/***************************** + * Important: see settings.h to configure your settings!!! + * ***************************/ + +Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); +GfxUi ui = GfxUi(&tft); + + +WebResource webResource; +TimeClient timeClient(UTC_OFFSET); + +// Set to false, if you prefere imperial/inches, Fahrenheit +WundergroundClient wunderground(IS_METRIC); + +//declaring prototypes +void configModeCallback (WiFiManager *myWiFiManager); +void downloadCallback(String filename, int16_t bytesDownloaded, int16_t bytesTotal); +ProgressCallback _downloadCallback = downloadCallback; +void downloadResources(); +void updateData(); +void drawProgress(uint8_t percentage, String text); +void drawTime(); +void drawCurrentWeather(); +void drawForecast(); +void drawForecastDetail(uint16_t x, uint16_t y, uint8_t dayIndex); +String getMeteoconIcon(String iconText); +void drawAstronomy(); +void drawSeparator(uint16_t y); + +long lastDownloadUpdate = millis(); + +void setup() { + Serial.begin(115200); + tft.begin(); + tft.fillScreen(ILI9341_BLACK); + tft.setFont(&ArialRoundedMTBold_14); + ui.setTextColor(ILI9341_ORANGE, ILI9341_BLACK); + ui.setTextAlignment(CENTER); + ui.drawString(120, 160, "Connecting to WiFi"); + + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + // Uncomment for testing wifi manager + //wifiManager.resetSettings(); + wifiManager.setAPCallback(configModeCallback); + + //or use this for auto generated name ESP + ChipID + wifiManager.autoConnect(); + + //Manual Wifi + //WiFi.begin(WIFI_SSID, WIFI_PWD); + + // OTA Setup + String hostname(HOSTNAME); + hostname += String(ESP.getChipId(), HEX); + WiFi.hostname(hostname); + ArduinoOTA.setHostname((const char *)hostname.c_str()); + ArduinoOTA.begin(); + SPIFFS.begin(); + + //Uncomment if you want to update all internet resources + //SPIFFS.format(); + + // download images from the net. If images already exist don't download + downloadResources(); + + // load the weather information + updateData(); +} + +long lastDrew = 0; +void loop() { + // Handle OTA update requests + ArduinoOTA.handle(); + + // Check if we should update the clock + if (millis() - lastDrew > 30000 && wunderground.getSeconds() == "00") { + drawTime(); + lastDrew = millis(); + } + + // Check if we should update weather information + if (millis() - lastDownloadUpdate > 1000 * UPDATE_INTERVAL_SECS) { + updateData(); + lastDownloadUpdate = millis(); + } +} + +// Called if WiFi has not been configured yet +void configModeCallback (WiFiManager *myWiFiManager) { + ui.setTextAlignment(CENTER); + tft.setFont(&ArialRoundedMTBold_14); + tft.setTextColor(ILI9341_ORANGE); + ui.drawString(120, 28, "Wifi Manager"); + ui.drawString(120, 42, "Please connect to AP"); + tft.setTextColor(ILI9341_WHITE); + ui.drawString(120, 56, myWiFiManager->getConfigPortalSSID()); + tft.setTextColor(ILI9341_ORANGE); + ui.drawString(120, 70, "To setup Wifi Configuration"); +} + +// callback called during download of files. Updates progress bar +void downloadCallback(String filename, int16_t bytesDownloaded, int16_t bytesTotal) { + Serial.println(String(bytesDownloaded) + " / " + String(bytesTotal)); + + int percentage = 100 * bytesDownloaded / bytesTotal; + if (percentage == 0) { + ui.drawString(120, 160, filename); + } + if (percentage % 5 == 0) { + ui.setTextAlignment(CENTER); + ui.setTextColor(ILI9341_ORANGE, ILI9341_BLACK); + //ui.drawString(120, 160, String(percentage) + "%"); + ui.drawProgressBar(10, 165, 240 - 20, 15, percentage, ILI9341_WHITE, ILI9341_BLUE); + } + +} + +// Download the bitmaps +void downloadResources() { + tft.fillScreen(ILI9341_BLACK); + char id[5]; + for (int i = 0; i < 21; i++) { + sprintf(id, "%02d", i); + tft.fillRect(0, 120, 240, 40, ILI9341_BLACK); + webResource.downloadFile("http://www.squix.org/blog/wunderground/" + wundergroundIcons[i] + ".bmp", wundergroundIcons[i] + ".bmp", _downloadCallback); + } + for (int i = 0; i < 21; i++) { + sprintf(id, "%02d", i); + tft.fillRect(0, 120, 240, 40, ILI9341_BLACK); + webResource.downloadFile("http://www.squix.org/blog/wunderground/mini/" + wundergroundIcons[i] + ".bmp", "/mini/" + wundergroundIcons[i] + ".bmp", _downloadCallback); + } + for (int i = 0; i < 23; i++) { + tft.fillRect(0, 120, 240, 40, ILI9341_BLACK); + webResource.downloadFile("http://www.squix.org/blog/moonphase_L" + String(i) + ".bmp", "/moon" + String(i) + ".bmp", _downloadCallback); + } +} + +// Update the internet based information and update screen +void updateData() { + tft.fillScreen(ILI9341_BLACK); + drawProgress(20, "Updating time..."); + timeClient.updateTime(); + drawProgress(50, "Updating conditions..."); + wunderground.updateConditions(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY); + drawProgress(70, "Updating forecasts..."); + wunderground.updateForecast(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY); + drawProgress(90, "Updating astronomy..."); + wunderground.updateAstronomy(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY); + //lastUpdate = timeClient.getFormattedTime(); + //readyForWeatherUpdate = false; + drawProgress(100, "Done..."); + delay(1000); + tft.fillScreen(ILI9341_BLACK); + drawTime(); + drawCurrentWeather(); + drawForecast(); + drawAstronomy(); +} + +// Progress bar helper +void drawProgress(uint8_t percentage, String text) { + ui.setTextAlignment(CENTER); + ui.setTextColor(ILI9341_ORANGE, ILI9341_BLACK); + tft.fillRect(0, 140, 240, 45, ILI9341_BLACK); + ui.drawString(120, 160, text); + ui.drawProgressBar(10, 165, 240 - 20, 15, percentage, ILI9341_WHITE, ILI9341_BLUE); +} + +// draws the clock +void drawTime() { + ui.setTextAlignment(CENTER); + ui.setTextColor(ILI9341_WHITE, ILI9341_BLACK); + tft.setFont(&ArialRoundedMTBold_14); + String date = wunderground.getDate(); + ui.drawString(120, 20, date); + + tft.setFont(&ArialRoundedMTBold_36); + String time = timeClient.getHours() + ":" + timeClient.getMinutes(); + ui.drawString(120, 56, time); + drawSeparator(65); +} + +// draws current weather information +void drawCurrentWeather() { + // Weather Icon + String weatherIcon = getMeteoconIcon(wunderground.getTodayIcon()); + ui.drawBmp(weatherIcon + ".bmp", 0, 55); + + // Weather Text + tft.setFont(&ArialRoundedMTBold_14); + ui.setTextColor(ILI9341_ORANGE, ILI9341_BLACK); + ui.setTextAlignment(RIGHT); + ui.drawString(220, 90, wunderground.getWeatherText()); + + tft.setFont(&ArialRoundedMTBold_36); + ui.setTextColor(ILI9341_ORANGE, ILI9341_BLACK); + ui.setTextAlignment(RIGHT); + String degreeSign = "F"; + if (IS_METRIC) { + degreeSign = "C"; + } + String temp = wunderground.getCurrentTemp() + degreeSign; + ui.drawString(220, 125, temp); + drawSeparator(135); + +} + +// draws the three forecast columns +void drawForecast() { + drawForecastDetail(10, 165, 0); + drawForecastDetail(95, 165, 2); + drawForecastDetail(180, 165, 4); + drawSeparator(165 + 65 + 10); +} + +// helper for the forecast columns +void drawForecastDetail(uint16_t x, uint16_t y, uint8_t dayIndex) { + ui.setTextColor(ILI9341_ORANGE, ILI9341_BLACK); + tft.setFont(&ArialRoundedMTBold_14); + ui.setTextAlignment(CENTER); + String day = wunderground.getForecastTitle(dayIndex).substring(0, 3); + day.toUpperCase(); + ui.drawString(x + 25, y, day); + + ui.setTextColor(ILI9341_WHITE, ILI9341_BLACK); + ui.drawString(x + 25, y + 14, wunderground.getForecastLowTemp(dayIndex) + "|" + wunderground.getForecastHighTemp(dayIndex)); + + String weatherIcon = getMeteoconIcon(wunderground.getForecastIcon(dayIndex)); + ui.drawBmp("/mini/" + weatherIcon + ".bmp", x, y + 15); + +} + +// draw moonphase and sunrise/set and moonrise/set +void drawAstronomy() { + int moonAgeImage = 24 * wunderground.getMoonAge().toInt() / 30.0; + ui.drawBmp("/moon" + String(moonAgeImage) + ".bmp", 120 - 30, 255); + + ui.setTextColor(ILI9341_WHITE, ILI9341_BLACK); + tft.setFont(&ArialRoundedMTBold_14); + ui.setTextAlignment(LEFT); + ui.setTextColor(ILI9341_ORANGE, ILI9341_BLACK); + ui.drawString(20, 270, "Sun"); + ui.setTextColor(ILI9341_WHITE, ILI9341_BLACK); + ui.drawString(20, 285, wunderground.getSunriseTime()); + ui.drawString(20, 300, wunderground.getSunsetTime()); + + ui.setTextAlignment(RIGHT); + ui.setTextColor(ILI9341_ORANGE, ILI9341_BLACK); + ui.drawString(220, 270, "Moon"); + ui.setTextColor(ILI9341_WHITE, ILI9341_BLACK); + ui.drawString(220, 285, wunderground.getMoonriseTime()); + ui.drawString(220, 300, wunderground.getMoonsetTime()); + +} + +// Helper function, should be part of the weather station library and should disappear soon +String getMeteoconIcon(String iconText) { + if (iconText == "F") return "chanceflurries"; + if (iconText == "Q") return "chancerain"; + if (iconText == "W") return "chancesleet"; + if (iconText == "V") return "chancesnow"; + if (iconText == "S") return "chancetstorms"; + if (iconText == "B") return "clear"; + if (iconText == "Y") return "cloudy"; + if (iconText == "F") return "flurries"; + if (iconText == "M") return "fog"; + if (iconText == "E") return "hazy"; + if (iconText == "Y") return "mostlycloudy"; + if (iconText == "H") return "mostlysunny"; + if (iconText == "H") return "partlycloudy"; + if (iconText == "J") return "partlysunny"; + if (iconText == "W") return "sleet"; + if (iconText == "R") return "rain"; + if (iconText == "W") return "snow"; + if (iconText == "B") return "sunny"; + if (iconText == "0") return "tstorms"; + + + return "unknown"; +} + +// if you want separators, uncomment the tft-line +void drawSeparator(uint16_t y) { + //tft.drawFastHLine(10, y, 240 - 2 * 10, 0x4228); +} + diff --git a/settings.h b/settings.h new file mode 100644 index 0000000..17ebcd6 --- /dev/null +++ b/settings.h @@ -0,0 +1,47 @@ +/**The MIT License (MIT) +Copyright (c) 2015 by Daniel Eichhorn +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. +See more at http://blog.squix.ch +*/ + +// Setup +const int UPDATE_INTERVAL_SECS = 10 * 60; // Update every 10 minutes + +// Pins for the ILI9341 +#define TFT_DC 2 +#define TFT_CS 5 + +// TimeClient settings +const float UTC_OFFSET = 2; + +// Wunderground Settings +const boolean IS_METRIC = true; +const String WUNDERGRROUND_API_KEY = ""; +const String WUNDERGRROUND_LANGUAGE = "EN"; +const String WUNDERGROUND_COUNTRY = "CH"; +const String WUNDERGROUND_CITY = "Zurich"; + +//Thingspeak Settings +const String THINGSPEAK_CHANNEL_ID = "67284"; +const String THINGSPEAK_API_READ_KEY = "L2VIW20QVNZJBLAK"; + +// List, so that the downloader knows what to fetch +String wundergroundIcons [] = {"chanceflurries","chancerain","chancesleet","chancesnow","clear","cloudy","flurries","fog","hazy","mostlycloudy","mostlysunny","partlycloudy","partlysunny","rain","sleet","snow","sunny","tstorms","unknown"}; + +/*************************** + * End Settings + **************************/