├── .clang-format ├── .gitignore ├── .vscode ├── extensions.json └── settings.json ├── README.md ├── assets ├── 3d │ ├── QPaper Smartwatch-Bottom Plate.stl │ ├── QPaper Smartwatch-Buttons.stl │ ├── QPaper Smartwatch-Shell.stl │ ├── QPaper Smartwatch.FCStd │ └── README.md ├── photos │ ├── README.md │ ├── qpaper_photo_1.jpeg │ ├── qpaper_photo_2.jpeg │ ├── qpaper_photo_3.jpeg │ ├── qpaper_photo_4.jpeg │ ├── qpaper_photo_5.jpeg │ ├── qpaper_photo_6.jpeg │ └── qpaper_photo_7.jpeg ├── qpaper_banner.png └── qpaper_screenshot.jpeg ├── lib ├── Adafruit-GFX │ ├── .github │ │ ├── ISSUE_TEMPLATE.md │ │ ├── PULL_REQUEST_TEMPLATE.md │ │ └── workflows │ │ │ └── githubci.yml │ ├── .gitignore │ ├── Adafruit_GFX.cpp │ ├── Adafruit_GFX.h │ ├── Adafruit_GrayOLED.cpp │ ├── Adafruit_GrayOLED.h │ ├── Adafruit_SPITFT.cpp │ ├── Adafruit_SPITFT.h │ ├── Adafruit_SPITFT_Macros.h │ ├── Fonts │ │ ├── FreeMono12pt7b.h │ │ ├── FreeMono18pt7b.h │ │ ├── FreeMono24pt7b.h │ │ ├── FreeMono9pt7b.h │ │ ├── FreeMonoBold12pt7b.h │ │ ├── FreeMonoBold18pt7b.h │ │ ├── FreeMonoBold24pt7b.h │ │ ├── FreeMonoBold9pt7b.h │ │ ├── FreeMonoBoldOblique12pt7b.h │ │ ├── FreeMonoBoldOblique18pt7b.h │ │ ├── FreeMonoBoldOblique24pt7b.h │ │ ├── FreeMonoBoldOblique9pt7b.h │ │ ├── FreeMonoOblique12pt7b.h │ │ ├── FreeMonoOblique18pt7b.h │ │ ├── FreeMonoOblique24pt7b.h │ │ ├── FreeMonoOblique9pt7b.h │ │ ├── FreeSans12pt7b.h │ │ ├── FreeSans18pt7b.h │ │ ├── FreeSans24pt7b.h │ │ ├── FreeSans9pt7b.h │ │ ├── FreeSansBold12pt7b.h │ │ ├── FreeSansBold18pt7b.h │ │ ├── FreeSansBold24pt7b.h │ │ ├── FreeSansBold9pt7b.h │ │ ├── FreeSansBoldOblique12pt7b.h │ │ ├── FreeSansBoldOblique18pt7b.h │ │ ├── FreeSansBoldOblique24pt7b.h │ │ ├── FreeSansBoldOblique9pt7b.h │ │ ├── FreeSansOblique12pt7b.h │ │ ├── FreeSansOblique18pt7b.h │ │ ├── FreeSansOblique24pt7b.h │ │ ├── FreeSansOblique9pt7b.h │ │ ├── FreeSerif12pt7b.h │ │ ├── FreeSerif18pt7b.h │ │ ├── FreeSerif24pt7b.h │ │ ├── FreeSerif9pt7b.h │ │ ├── FreeSerifBold12pt7b.h │ │ ├── FreeSerifBold18pt7b.h │ │ ├── FreeSerifBold24pt7b.h │ │ ├── FreeSerifBold9pt7b.h │ │ ├── FreeSerifBoldItalic12pt7b.h │ │ ├── FreeSerifBoldItalic18pt7b.h │ │ ├── FreeSerifBoldItalic24pt7b.h │ │ ├── FreeSerifBoldItalic9pt7b.h │ │ ├── FreeSerifItalic12pt7b.h │ │ ├── FreeSerifItalic18pt7b.h │ │ ├── FreeSerifItalic24pt7b.h │ │ ├── FreeSerifItalic9pt7b.h │ │ ├── Org_01.h │ │ ├── Picopixel.h │ │ ├── Tiny3x3a2pt7b.h │ │ └── TomThumb.h │ ├── README.md │ ├── examples │ │ ├── GFXcanvas │ │ │ ├── GFXcanvas.ino │ │ │ ├── GFXcanvasSerialDemo.cpp │ │ │ └── GFXcanvasSerialDemo.h │ │ └── mock_ili9341 │ │ │ └── mock_ili9341.ino │ ├── fontconvert │ │ ├── Makefile │ │ ├── fontconvert.c │ │ ├── fontconvert_win.md │ │ └── makefonts.sh │ ├── gfxfont.h │ ├── glcdfont.c │ ├── library.properties │ └── license.txt ├── ESP32Time │ ├── .piopm │ ├── ESP32Time.cpp │ ├── ESP32Time.h │ ├── LICENSE │ ├── README.md │ ├── examples │ │ └── esp32_time │ │ │ └── esp32_time.ino │ ├── keywords.txt │ ├── library.json │ └── library.properties └── README ├── platformio.ini ├── src ├── apps.cpp ├── apps.h ├── apps │ ├── about │ │ ├── app_about.cpp │ │ └── app_about.h │ ├── gps_sync │ │ ├── app_gps_sync.cpp │ │ └── app_gps_sync.h │ └── wifi_smartconfig │ │ ├── app_wifi_smartconfig.cpp │ │ └── app_wifi_smartconfig.h ├── home.cpp ├── home.h ├── lib │ ├── battery.cpp │ ├── battery.h │ ├── log.cpp │ ├── log.h │ ├── ui.cpp │ └── ui.h ├── main.cpp ├── os_config.h ├── resources │ ├── app_icons.h │ ├── fonts │ │ ├── Outfit_60011pt7b.h │ │ └── Outfit_80036pt7b.h │ └── icons.h ├── wakeup.cpp └── wakeup.h └── test └── README /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | # ref: https://clang.llvm.org/docs/ClangFormatStyleOptions.html 3 | # 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto 4 | Language: Cpp 5 | # BasedOnStyle: LLVM 6 | 7 | # 每行字符的限制,0表示没有限制 8 | ColumnLimit: 150 9 | 10 | # 预处理器指令的缩进样式 11 | IndentPPDirectives: None 12 | 13 | MacroBlockBegin: Without 14 | 15 | # 宏定义对齐 16 | AlignConsecutiveMacros: AcrossEmptyLinesAndComments 17 | # Enabled: true 18 | # AcrossEmptyLines: false 19 | # AcrossComments: true 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/launch.json 5 | .vscode/ipch 6 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "platformio.platformio-ide" 6 | ], 7 | "unwantedRecommendations": [ 8 | "ms-vscode.cpptools-extension-pack" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "string": "cpp" 4 | } 5 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![banner](assets/qpaper_banner.png) 2 | 3 | qpaperOS is a smartwatch firmware implementation for the LILYGO T-Wrist E-Paper ESP32 development board. This repositoy houses the qpaperOS source code along with 3D models and the FreeCAD file of the smartwatch case to make your very own qpaper! 4 | 5 | ## The Product 6 | 7 | ![screenshot](assets/qpaper_screenshot.jpeg) 8 | 9 | More photos of the complete watch can be found under `assets/photos/` (https://github.com/qewer33/qpaperOS/tree/main/assets/photos) 10 | 11 | qpaper is meant to be a minimal and lighweight smartwatch that does what it needs to do: always display time. The low power E-Paper screen of the qpaper allows it to always display the time and other information without having the display blank. The ESP32 wakes up every minute to update the display to show the correct time. More information about how the firmware works can be found in the next section. 12 | 13 | qpaper has a battery life of approx. ~3-4 days with a 250 mAh battery. This number is way lower than it should be (the battery should ideally last more than a week but I sometimes even get 2 days for some reason) and I'm not sure if it's a fault of the firmware of if the board is wasting the battery somehow, need to debug. 14 | 15 | ### Assembly 16 | 17 | The outer sheell/case of the qpaper is meant to be 3D printed and assembled with 4 short M2 screws. The 3D models and FreeCAD file for the case can be found under `assets/3d/` (https://github.com/qewer33/qpaperOS/tree/main/assets/3d) 18 | 19 | Required parts for assembly: 20 | - LILYGO T-Wrist E-Paper ESP32 development board 21 | - https://www.lilygo.cc/products/t-wrist-e-paper-1-54-inch-display?variant=42405749948597 (Note: you don't need to buy the GPS version if you don't want the GPS features but if you don't have a LILYGO T-U2T, buy a version with T-U2T bundled. You *need* T-U2T to program the board!) 22 | - 3D printed "Shell" piece 23 | - 3D printed "Bottom Plate" piece 24 | - 3D printed "Buttons" piece 25 | - 250 mAh 1S lipo battery 26 | - Half-size uFl GPS antenna (not required for the non-GPS version of the development board) 27 | - 4x short M2/M1.6/M1.4 screws 28 | - 22mm watch strap (compatible with Huawei GT2/GT3 straps) 29 | 30 | ### Uploading the firmware 31 | 32 | Clone this git repository and open it in VSCode. Make sure you have the PlatformIO extension installed. Connect the USB-C cable to your computer and to the T-U2T. Connect the T-U2T to the watch and click the "PlatformIO: Upload" button in the status bar. 33 | 34 | ### Connecting the watch to WiFi 35 | 36 | Install the "ESPTouch" app on your phone, open it and type your WiFi password. Long press the watch user button (top right of the case) to open the applications menu. Navigate to the "Connect to WiFi" app and long press user button to open it. Press "Connect" on the ESPTouch app and wait. Your watch should now be connected to the WiFi network that your phone is connected to. If the connection times out, try again. The watch will remember the SSID and password of the network and periodically try to connect to it to update time via NTP. 37 | 38 | ## The Firmware 39 | 40 | > [!WARNING] 41 | > qpaperOS is not yet finished, the information here might be inaccurate 42 | 43 | qpaperOS is the firmware part of the qpaper project. It is developed to work with the LILYGO T-Wrist E-Paper ESP32 development board. It uses the espressif-esp32-arduino framework and PlatformIO for development. 44 | 45 | Below are features that are implemented or planned: 46 | 47 | - [x] Display time and date 48 | - [x] Display battery percentage 49 | - [x] Have the ESP32 MCU on deep sleep and wakeup every minute to update the display for power saving 50 | - [x] Apps and app system 51 | - [x] About (minimal example app) 52 | - [x] WiFi Smartconfig (connect the watch to WiFi via your phone) 53 | - [ ] GPS Sync 54 | - [ ] Themes and theme system 55 | - [ ] GPS functionality 56 | - [ ] GPS based step counter 57 | - [ ] Weather display 58 | - [ ] Islamic prayer times display 59 | 60 | ### Apps 61 | 62 | Apps live under the `src/apps` directory. Each app has it's own subdirectory and consists of 3 (or 2, one of them is optional) files. 63 | 64 | ```sh 65 | src/ 66 | apps/ 67 | appname/ 68 | app_appname.cpp 69 | app_appname.h 70 | app_appname_res.h # optional 71 | ``` 72 | 73 | The `app_appname.h` file is the header file of the app. It contains the class and the extern instance definition of the app. Apps should extend the `App` class defined in `src/apps.h`. The methods that are going to be used by the app should be overriden methods from the `App` class. The instance should be an instance of the newly defined app class wrapped in an `std::unique_pointer`. There are 5 methods that apps can override from the App class: 74 | 75 | - `setup()`: Runs before the app gets started. Useful for initializing variable defaults or loading preferences. 76 | - `drawUI(GxEPD_Class *display)`: Runs every frame when the app is running. This method should draw the user interface of the app using `display`. 77 | - `exit()`: Runs when the app gets exited. Useful for saving preferences and such. 78 | - `buttonClick()`: Runs when the user button gets clicked while in the app. 79 | - `buttonDoubleClick()`: Runs when the user button gets double clicked while in the app. 80 | 81 | The `app_appname.cpp` file is the source file of the app. The source file should define the instance and implement the necessary app methods. The app constructor takes 2 argumnets: the first argument `String name` is the name and the second argument `uint16_t* icon` is the icon resource of the app. 82 | 83 | The `app_appname_res.h` file contains the custom resources that are used by the app. These resources can be fonts, icons etc. This file is not necessary if the app doesn't have any custom resources. The app icon should go in `src/resources/app_icons.h`, not the app resource file. 84 | 85 | The finished app should be included in `src/apps.cpp` and should be added to the `apps` array in the `initApps()` function. 86 | 87 | You can take a look at the source code of the "About" app in `apps/about` for an example of a minimal app. -------------------------------------------------------------------------------- /assets/3d/QPaper Smartwatch-Bottom Plate.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/3d/QPaper Smartwatch-Bottom Plate.stl -------------------------------------------------------------------------------- /assets/3d/QPaper Smartwatch-Buttons.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/3d/QPaper Smartwatch-Buttons.stl -------------------------------------------------------------------------------- /assets/3d/QPaper Smartwatch-Shell.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/3d/QPaper Smartwatch-Shell.stl -------------------------------------------------------------------------------- /assets/3d/QPaper Smartwatch.FCStd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/3d/QPaper Smartwatch.FCStd -------------------------------------------------------------------------------- /assets/3d/README.md: -------------------------------------------------------------------------------- 1 | # qpaper 3D Files 2 | 3 | This folder contains the 3D design and printing files for qpaper. The `.FCStd` file is the FreeCAD source design file, you can open and modify it in FreeCAD. The `.stl` files are mesh files that you can directly import into your slicer and setup for printing. -------------------------------------------------------------------------------- /assets/photos/README.md: -------------------------------------------------------------------------------- 1 | ![photo_1](qpaper_photo_1.jpeg) 2 | ![photo_2](qpaper_photo_2.jpeg) 3 | ![photo_3](qpaper_photo_3.jpeg) 4 | ![photo_4](qpaper_photo_4.jpeg) 5 | ![photo_5](qpaper_photo_5.jpeg) 6 | ![photo_6](qpaper_photo_6.jpeg) 7 | ![photo_7](qpaper_photo_7.jpeg) -------------------------------------------------------------------------------- /assets/photos/qpaper_photo_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/photos/qpaper_photo_1.jpeg -------------------------------------------------------------------------------- /assets/photos/qpaper_photo_2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/photos/qpaper_photo_2.jpeg -------------------------------------------------------------------------------- /assets/photos/qpaper_photo_3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/photos/qpaper_photo_3.jpeg -------------------------------------------------------------------------------- /assets/photos/qpaper_photo_4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/photos/qpaper_photo_4.jpeg -------------------------------------------------------------------------------- /assets/photos/qpaper_photo_5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/photos/qpaper_photo_5.jpeg -------------------------------------------------------------------------------- /assets/photos/qpaper_photo_6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/photos/qpaper_photo_6.jpeg -------------------------------------------------------------------------------- /assets/photos/qpaper_photo_7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/photos/qpaper_photo_7.jpeg -------------------------------------------------------------------------------- /assets/qpaper_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/qpaper_banner.png -------------------------------------------------------------------------------- /assets/qpaper_screenshot.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qewer33/qpaperOS/a8e3456cc0bbfb866bf4a19ce8c8a9c33839737d/assets/qpaper_screenshot.jpeg -------------------------------------------------------------------------------- /lib/Adafruit-GFX/.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Thank you for opening an issue on an Adafruit Arduino library repository. To 2 | improve the speed of resolution please review the following guidelines and 3 | common troubleshooting steps below before creating the issue: 4 | 5 | - **Do not use GitHub issues for troubleshooting projects and issues.** Instead use 6 | the forums at http://forums.adafruit.com to ask questions and troubleshoot why 7 | something isn't working as expected. In many cases the problem is a common issue 8 | that you will more quickly receive help from the forum community. GitHub issues 9 | are meant for known defects in the code. If you don't know if there is a defect 10 | in the code then start with troubleshooting on the forum first. 11 | 12 | - **If following a tutorial or guide be sure you didn't miss a step.** Carefully 13 | check all of the steps and commands to run have been followed. Consult the 14 | forum if you're unsure or have questions about steps in a guide/tutorial. 15 | 16 | - **For Arduino projects check these very common issues to ensure they don't apply**: 17 | 18 | - For uploading sketches or communicating with the board make sure you're using 19 | a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes 20 | very hard to tell the difference between a data and charge cable! Try using the 21 | cable with other devices or swapping to another cable to confirm it is not 22 | the problem. 23 | 24 | - **Be sure you are supplying adequate power to the board.** Check the specs of 25 | your board and plug in an external power supply. In many cases just 26 | plugging a board into your computer is not enough to power it and other 27 | peripherals. 28 | 29 | - **Double check all soldering joints and connections.** Flakey connections 30 | cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. 31 | 32 | - **Ensure you are using an official Arduino or Adafruit board.** We can't 33 | guarantee a clone board will have the same functionality and work as expected 34 | with this code and don't support them. 35 | 36 | If you're sure this issue is a defect in the code and checked the steps above 37 | please fill in the following fields to provide enough troubleshooting information. 38 | You may delete the guideline and text above to just leave the following details: 39 | 40 | - Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** 41 | 42 | - Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO 43 | VERSION HERE** 44 | 45 | - List the steps to reproduce the problem below (if possible attach a sketch or 46 | copy the sketch code in too): **LIST REPRO STEPS BELOW** 47 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Thank you for creating a pull request to contribute to Adafruit's GitHub code! 2 | Before you open the request please review the following guidelines and tips to 3 | help it be more easily integrated: 4 | 5 | - **Describe the scope of your change--i.e. what the change does and what parts 6 | of the code were modified.** This will help us understand any risks of integrating 7 | the code. 8 | 9 | - **Describe any known limitations with your change.** For example if the change 10 | doesn't apply to a supported platform of the library please mention it. 11 | 12 | - **Please run any tests or examples that can exercise your modified code.** We 13 | strive to not break users of the code and running tests/examples helps with this 14 | process. 15 | 16 | Thank you again for contributing! We will try to test and integrate the change 17 | as soon as we can, but be aware we have many GitHub repositories to manage and 18 | can't immediately respond to every request. There is no need to bump or check in 19 | on a pull request (it will clutter the discussion of the request). 20 | 21 | Also don't be worried if the request is closed or not integrated--sometimes the 22 | priorities of Adafruit's GitHub code (education, ease of use) might not match the 23 | priorities of the pull request. Don't fret, the open source community thrives on 24 | forks and GitHub makes it easy to keep your changes in a forked repo. 25 | 26 | After reviewing the guidelines above you can delete this text from the pull request. 27 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/.github/workflows/githubci.yml: -------------------------------------------------------------------------------- 1 | name: Arduino Library CI 2 | 3 | on: [pull_request, push, repository_dispatch] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/setup-python@v1 11 | with: 12 | python-version: '3.x' 13 | - uses: actions/checkout@v2 14 | - uses: actions/checkout@v2 15 | with: 16 | repository: adafruit/ci-arduino 17 | path: ci 18 | 19 | - name: pre-install 20 | run: bash ci/actions_install.sh 21 | 22 | - name: extra libraries 23 | run: | 24 | git clone --quiet https://github.com/adafruit/Adafruit_ILI9341.git /home/runner/Arduino/libraries/Adafruit_ILI9341 25 | 26 | - name: test platforms 27 | run: python3 ci/build_platform.py main_platforms 28 | 29 | - name: clang 30 | run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r . 31 | 32 | - name: doxygen 33 | env: 34 | GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} 35 | PRETTYNAME : "Adafruit GFX Library" 36 | run: bash ci/doxy_gen_and_deploy.sh 37 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/.gitignore: -------------------------------------------------------------------------------- 1 | default.vim 2 | fontconvert/fontconvert 3 | # Our handy .gitignore for automation ease 4 | Doxyfile* 5 | doxygen_sqlite3.db 6 | html -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Adafruit_GrayOLED.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * @file Adafruit_GrayOLED.h 3 | * 4 | * This is part of for Adafruit's GFX library, supplying generic support 5 | * for grayscale OLED displays: http://www.adafruit.com/category/63_98 6 | * 7 | * These displays use I2C or SPI to communicate. I2C requires 2 pins 8 | * (SCL+SDA) and optionally a RESET pin. SPI requires 4 pins (MOSI, SCK, 9 | * select, data/command) and optionally a reset pin. Hardware SPI or 10 | * 'bitbang' software SPI are both supported. 11 | * 12 | * Adafruit invests time and resources providing this open source code, 13 | * please support Adafruit and open-source hardware by purchasing 14 | * products from Adafruit! 15 | * 16 | * Written by Limor Fried/Ladyada for Adafruit Industries, with 17 | * contributions from the open source community. 18 | * 19 | * BSD license, all text above, and the splash screen header file, 20 | * must be included in any redistribution. 21 | * 22 | */ 23 | 24 | #ifndef _Adafruit_GRAYOLED_H_ 25 | #define _Adafruit_GRAYOLED_H_ 26 | 27 | #if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all 28 | 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | 35 | #define GRAYOLED_SETCONTRAST 0x81 ///< Generic contrast for almost all OLEDs 36 | #define GRAYOLED_NORMALDISPLAY 0xA6 ///< Generic non-invert for almost all OLEDs 37 | #define GRAYOLED_INVERTDISPLAY 0xA7 ///< Generic invert for almost all OLEDs 38 | 39 | #define MONOOLED_BLACK 0 ///< Default black 'color' for monochrome OLEDS 40 | #define MONOOLED_WHITE 1 ///< Default white 'color' for monochrome OLEDS 41 | #define MONOOLED_INVERSE 2 ///< Default inversion command for monochrome OLEDS 42 | 43 | /*! 44 | @brief Class that stores state and functions for interacting with 45 | generic grayscale OLED displays. 46 | */ 47 | class Adafruit_GrayOLED : public Adafruit_GFX { 48 | public: 49 | Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, TwoWire *twi = &Wire, 50 | int8_t rst_pin = -1, uint32_t preclk = 400000, 51 | uint32_t postclk = 100000); 52 | Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, int8_t mosi_pin, 53 | int8_t sclk_pin, int8_t dc_pin, int8_t rst_pin, 54 | int8_t cs_pin); 55 | Adafruit_GrayOLED(uint8_t bpp, uint16_t w, uint16_t h, SPIClass *spi, 56 | int8_t dc_pin, int8_t rst_pin, int8_t cs_pin, 57 | uint32_t bitrate = 8000000UL); 58 | 59 | ~Adafruit_GrayOLED(void); 60 | 61 | /** 62 | @brief The function that sub-classes define that writes out the buffer to 63 | the display over I2C or SPI 64 | **/ 65 | virtual void display(void) = 0; 66 | void clearDisplay(void); 67 | void invertDisplay(bool i); 68 | void setContrast(uint8_t contrastlevel); 69 | void drawPixel(int16_t x, int16_t y, uint16_t color); 70 | bool getPixel(int16_t x, int16_t y); 71 | uint8_t *getBuffer(void); 72 | 73 | void oled_command(uint8_t c); 74 | bool oled_commandList(const uint8_t *c, uint8_t n); 75 | 76 | protected: 77 | bool _init(uint8_t i2caddr = 0x3C, bool reset = true); 78 | 79 | Adafruit_SPIDevice *spi_dev = NULL; ///< The SPI interface BusIO device 80 | Adafruit_I2CDevice *i2c_dev = NULL; ///< The I2C interface BusIO device 81 | int32_t i2c_preclk = 400000, ///< Configurable 'high speed' I2C rate 82 | i2c_postclk = 100000; ///< Configurable 'low speed' I2C rate 83 | uint8_t *buffer = NULL; ///< Internal 1:1 framebuffer of display mem 84 | 85 | int16_t window_x1, ///< Dirty tracking window minimum x 86 | window_y1, ///< Dirty tracking window minimum y 87 | window_x2, ///< Dirty tracking window maximum x 88 | window_y2; ///< Dirty tracking window maximum y 89 | 90 | int dcPin, ///< The Arduino pin connected to D/C (for SPI) 91 | csPin, ///< The Arduino pin connected to CS (for SPI) 92 | rstPin; ///< The Arduino pin connected to reset (-1 if unused) 93 | 94 | uint8_t _bpp = 1; ///< Bits per pixel color for this display 95 | private: 96 | TwoWire *_theWire = NULL; ///< The underlying hardware I2C 97 | }; 98 | 99 | #endif // end __AVR_ATtiny85__ 100 | #endif // _Adafruit_GrayOLED_H_ 101 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Adafruit_SPITFT_Macros.h: -------------------------------------------------------------------------------- 1 | // THIS FILE INTENTIONALLY LEFT BLANK. 2 | 3 | // Macros previously #defined here have been made into (mostly) inline 4 | // functions in the Adafruit_SPITFT class. Other libraries might still 5 | // contain code trying to #include this header file, so until everything's 6 | // updated this file still exists (but doing nothing) to avoid trouble. 7 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Fonts/FreeMono9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeMono9pt7bBitmaps[] PROGMEM = { 2 | 0xAA, 0xA8, 0x0C, 0xED, 0x24, 0x92, 0x48, 0x24, 0x48, 0x91, 0x2F, 0xE4, 3 | 0x89, 0x7F, 0x28, 0x51, 0x22, 0x40, 0x08, 0x3E, 0x62, 0x40, 0x30, 0x0E, 4 | 0x01, 0x81, 0xC3, 0xBE, 0x08, 0x08, 0x71, 0x12, 0x23, 0x80, 0x23, 0xB8, 5 | 0x0E, 0x22, 0x44, 0x70, 0x38, 0x81, 0x02, 0x06, 0x1A, 0x65, 0x46, 0xC8, 6 | 0xEC, 0xE9, 0x24, 0x5A, 0xAA, 0xA9, 0x40, 0xA9, 0x55, 0x5A, 0x80, 0x10, 7 | 0x22, 0x4B, 0xE3, 0x05, 0x11, 0x00, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04, 8 | 0x00, 0x6B, 0x48, 0xFF, 0x00, 0xF0, 0x02, 0x08, 0x10, 0x60, 0x81, 0x04, 9 | 0x08, 0x20, 0x41, 0x02, 0x08, 0x00, 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x60, 10 | 0xC1, 0x82, 0x88, 0xE0, 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3E, 0x38, 11 | 0x8A, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, 0x03, 0xF8, 0x7C, 0x06, 0x02, 12 | 0x02, 0x1C, 0x06, 0x01, 0x01, 0x01, 0x42, 0x3C, 0x18, 0xA2, 0x92, 0x8A, 13 | 0x28, 0xBF, 0x08, 0x21, 0xC0, 0x7C, 0x81, 0x03, 0xE4, 0x40, 0x40, 0x81, 14 | 0x03, 0x88, 0xE0, 0x1E, 0x41, 0x04, 0x0B, 0x98, 0xB0, 0xC1, 0xC2, 0x88, 15 | 0xE0, 0xFE, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, 0x20, 0x40, 0x38, 16 | 0x8A, 0x0C, 0x14, 0x47, 0x11, 0x41, 0x83, 0x8C, 0xE0, 0x38, 0x8A, 0x1C, 17 | 0x18, 0x68, 0xCE, 0x81, 0x04, 0x13, 0xC0, 0xF0, 0x0F, 0x6C, 0x00, 0xD2, 18 | 0xD2, 0x00, 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, 0xFF, 0x80, 19 | 0x00, 0x1F, 0xF0, 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xC0, 0x80, 20 | 0x3D, 0x84, 0x08, 0x30, 0xC2, 0x00, 0x00, 0x00, 0x30, 0x3C, 0x46, 0x82, 21 | 0x8E, 0xB2, 0xA2, 0xA2, 0x9F, 0x80, 0x80, 0x40, 0x3C, 0x3C, 0x01, 0x40, 22 | 0x28, 0x09, 0x01, 0x10, 0x42, 0x0F, 0xC1, 0x04, 0x40, 0x9E, 0x3C, 0xFE, 23 | 0x21, 0x90, 0x48, 0x67, 0xE2, 0x09, 0x02, 0x81, 0x41, 0xFF, 0x80, 0x3E, 24 | 0xB0, 0xF0, 0x30, 0x08, 0x04, 0x02, 0x00, 0x80, 0x60, 0x8F, 0x80, 0xFE, 25 | 0x21, 0x90, 0x68, 0x14, 0x0A, 0x05, 0x02, 0x83, 0x43, 0x7F, 0x00, 0xFF, 26 | 0x20, 0x90, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x81, 0x40, 0xFF, 0xC0, 0xFF, 27 | 0xA0, 0x50, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x80, 0x40, 0x78, 0x00, 0x1E, 28 | 0x98, 0x6C, 0x0A, 0x00, 0x80, 0x20, 0xF8, 0x0B, 0x02, 0x60, 0x87, 0xC0, 29 | 0xE3, 0xA0, 0x90, 0x48, 0x27, 0xF2, 0x09, 0x04, 0x82, 0x41, 0x71, 0xC0, 30 | 0xF9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xC0, 0x1F, 0x02, 0x02, 0x02, 0x02, 31 | 0x02, 0x82, 0x82, 0xC6, 0x78, 0xE3, 0xA1, 0x11, 0x09, 0x05, 0x83, 0x21, 32 | 0x08, 0x84, 0x41, 0x70, 0xC0, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 33 | 0x41, 0x41, 0xFF, 0xE0, 0xEC, 0x19, 0x45, 0x28, 0xA4, 0xA4, 0x94, 0x91, 34 | 0x12, 0x02, 0x40, 0x5C, 0x1C, 0xC3, 0xB0, 0x94, 0x4A, 0x24, 0x92, 0x49, 35 | 0x14, 0x8A, 0x43, 0x70, 0x80, 0x1E, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 36 | 0x02, 0x82, 0x63, 0x0F, 0x00, 0xFE, 0x43, 0x41, 0x41, 0x42, 0x7C, 0x40, 37 | 0x40, 0x40, 0xF0, 0x1C, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 0x02, 0x82, 38 | 0x63, 0x1F, 0x04, 0x07, 0x92, 0x30, 0xFE, 0x21, 0x90, 0x48, 0x24, 0x23, 39 | 0xE1, 0x10, 0x84, 0x41, 0x70, 0xC0, 0x3A, 0xCD, 0x0A, 0x03, 0x01, 0x80, 40 | 0xC1, 0xC7, 0x78, 0xFF, 0xC4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, 0x10, 41 | 0x08, 0x1F, 0x00, 0xE3, 0xA0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, 0x82, 42 | 0x22, 0x0E, 0x00, 0xF1, 0xE8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, 0x04, 43 | 0x80, 0x50, 0x0C, 0x00, 0x80, 0xF1, 0xE8, 0x09, 0x11, 0x25, 0x44, 0xA8, 44 | 0x55, 0x0C, 0xA1, 0x8C, 0x31, 0x84, 0x30, 0xE3, 0xA0, 0x88, 0x82, 0x80, 45 | 0x80, 0xC0, 0x90, 0x44, 0x41, 0x71, 0xC0, 0xE3, 0xA0, 0x88, 0x82, 0x81, 46 | 0x40, 0x40, 0x20, 0x10, 0x08, 0x1F, 0x00, 0xFD, 0x0A, 0x20, 0x81, 0x04, 47 | 0x10, 0x21, 0x83, 0xFC, 0xEA, 0xAA, 0xAA, 0xC0, 0x80, 0x81, 0x03, 0x02, 48 | 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0xD5, 0x55, 0x55, 0xC0, 49 | 0x10, 0x51, 0x22, 0x28, 0x20, 0xFF, 0xE0, 0x88, 0x80, 0x7E, 0x00, 0x80, 50 | 0x47, 0xEC, 0x14, 0x0A, 0x0C, 0xFB, 0xC0, 0x20, 0x10, 0x0B, 0xC6, 0x12, 51 | 0x05, 0x02, 0x81, 0x40, 0xB0, 0xB7, 0x80, 0x3A, 0x8E, 0x0C, 0x08, 0x10, 52 | 0x10, 0x9E, 0x03, 0x00, 0x80, 0x47, 0xA4, 0x34, 0x0A, 0x05, 0x02, 0x81, 53 | 0x21, 0x8F, 0x60, 0x3C, 0x43, 0x81, 0xFF, 0x80, 0x80, 0x61, 0x3E, 0x3D, 54 | 0x04, 0x3E, 0x41, 0x04, 0x10, 0x41, 0x0F, 0x80, 0x3D, 0xA1, 0xA0, 0x50, 55 | 0x28, 0x14, 0x09, 0x0C, 0x7A, 0x01, 0x01, 0x87, 0x80, 0xC0, 0x20, 0x10, 56 | 0x0B, 0xC6, 0x32, 0x09, 0x04, 0x82, 0x41, 0x20, 0xB8, 0xE0, 0x10, 0x01, 57 | 0xC0, 0x81, 0x02, 0x04, 0x08, 0x11, 0xFC, 0x10, 0x3E, 0x10, 0x84, 0x21, 58 | 0x08, 0x42, 0x3F, 0x00, 0xC0, 0x40, 0x40, 0x4F, 0x44, 0x58, 0x70, 0x48, 59 | 0x44, 0x42, 0xC7, 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x23, 60 | 0xF8, 0xB7, 0x64, 0x62, 0x31, 0x18, 0x8C, 0x46, 0x23, 0x91, 0x5E, 0x31, 61 | 0x90, 0x48, 0x24, 0x12, 0x09, 0x05, 0xC7, 0x3E, 0x31, 0xA0, 0x30, 0x18, 62 | 0x0C, 0x05, 0x8C, 0x7C, 0xDE, 0x30, 0x90, 0x28, 0x14, 0x0A, 0x05, 0x84, 63 | 0xBC, 0x40, 0x20, 0x38, 0x00, 0x3D, 0xA1, 0xA0, 0x50, 0x28, 0x14, 0x09, 64 | 0x0C, 0x7A, 0x01, 0x00, 0x80, 0xE0, 0xCE, 0xA1, 0x82, 0x04, 0x08, 0x10, 65 | 0x7C, 0x3A, 0x8D, 0x0B, 0x80, 0xF0, 0x70, 0xDE, 0x40, 0x40, 0xFC, 0x40, 66 | 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0xC3, 0x41, 0x41, 0x41, 0x41, 0x41, 67 | 0x43, 0x3D, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x20, 0xA0, 0x50, 0x10, 0xE3, 68 | 0xC0, 0x92, 0x4B, 0x25, 0x92, 0xA9, 0x98, 0x44, 0xE3, 0x31, 0x05, 0x01, 69 | 0x01, 0x41, 0x11, 0x05, 0xC7, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x40, 0xA0, 70 | 0x60, 0x10, 0x10, 0x08, 0x3E, 0x00, 0xFD, 0x08, 0x20, 0x82, 0x08, 0x10, 71 | 0xBF, 0x29, 0x24, 0xA2, 0x49, 0x26, 0xFF, 0xF8, 0x89, 0x24, 0x8A, 0x49, 72 | 0x2C, 0x61, 0x24, 0x30}; 73 | 74 | const GFXglyph FreeMono9pt7bGlyphs[] PROGMEM = { 75 | {0, 0, 0, 11, 0, 1}, // 0x20 ' ' 76 | {0, 2, 11, 11, 4, -10}, // 0x21 '!' 77 | {3, 6, 5, 11, 2, -10}, // 0x22 '"' 78 | {7, 7, 12, 11, 2, -10}, // 0x23 '#' 79 | {18, 8, 12, 11, 1, -10}, // 0x24 '$' 80 | {30, 7, 11, 11, 2, -10}, // 0x25 '%' 81 | {40, 7, 10, 11, 2, -9}, // 0x26 '&' 82 | {49, 3, 5, 11, 4, -10}, // 0x27 ''' 83 | {51, 2, 13, 11, 5, -10}, // 0x28 '(' 84 | {55, 2, 13, 11, 4, -10}, // 0x29 ')' 85 | {59, 7, 7, 11, 2, -10}, // 0x2A '*' 86 | {66, 7, 7, 11, 2, -8}, // 0x2B '+' 87 | {73, 3, 5, 11, 2, -1}, // 0x2C ',' 88 | {75, 9, 1, 11, 1, -5}, // 0x2D '-' 89 | {77, 2, 2, 11, 4, -1}, // 0x2E '.' 90 | {78, 7, 13, 11, 2, -11}, // 0x2F '/' 91 | {90, 7, 11, 11, 2, -10}, // 0x30 '0' 92 | {100, 5, 11, 11, 3, -10}, // 0x31 '1' 93 | {107, 7, 11, 11, 2, -10}, // 0x32 '2' 94 | {117, 8, 11, 11, 1, -10}, // 0x33 '3' 95 | {128, 6, 11, 11, 3, -10}, // 0x34 '4' 96 | {137, 7, 11, 11, 2, -10}, // 0x35 '5' 97 | {147, 7, 11, 11, 2, -10}, // 0x36 '6' 98 | {157, 7, 11, 11, 2, -10}, // 0x37 '7' 99 | {167, 7, 11, 11, 2, -10}, // 0x38 '8' 100 | {177, 7, 11, 11, 2, -10}, // 0x39 '9' 101 | {187, 2, 8, 11, 4, -7}, // 0x3A ':' 102 | {189, 3, 11, 11, 3, -7}, // 0x3B ';' 103 | {194, 8, 8, 11, 1, -8}, // 0x3C '<' 104 | {202, 9, 4, 11, 1, -6}, // 0x3D '=' 105 | {207, 9, 8, 11, 1, -8}, // 0x3E '>' 106 | {216, 7, 10, 11, 2, -9}, // 0x3F '?' 107 | {225, 8, 12, 11, 2, -10}, // 0x40 '@' 108 | {237, 11, 10, 11, 0, -9}, // 0x41 'A' 109 | {251, 9, 10, 11, 1, -9}, // 0x42 'B' 110 | {263, 9, 10, 11, 1, -9}, // 0x43 'C' 111 | {275, 9, 10, 11, 1, -9}, // 0x44 'D' 112 | {287, 9, 10, 11, 1, -9}, // 0x45 'E' 113 | {299, 9, 10, 11, 1, -9}, // 0x46 'F' 114 | {311, 10, 10, 11, 1, -9}, // 0x47 'G' 115 | {324, 9, 10, 11, 1, -9}, // 0x48 'H' 116 | {336, 5, 10, 11, 3, -9}, // 0x49 'I' 117 | {343, 8, 10, 11, 2, -9}, // 0x4A 'J' 118 | {353, 9, 10, 11, 1, -9}, // 0x4B 'K' 119 | {365, 8, 10, 11, 2, -9}, // 0x4C 'L' 120 | {375, 11, 10, 11, 0, -9}, // 0x4D 'M' 121 | {389, 9, 10, 11, 1, -9}, // 0x4E 'N' 122 | {401, 9, 10, 11, 1, -9}, // 0x4F 'O' 123 | {413, 8, 10, 11, 1, -9}, // 0x50 'P' 124 | {423, 9, 13, 11, 1, -9}, // 0x51 'Q' 125 | {438, 9, 10, 11, 1, -9}, // 0x52 'R' 126 | {450, 7, 10, 11, 2, -9}, // 0x53 'S' 127 | {459, 9, 10, 11, 1, -9}, // 0x54 'T' 128 | {471, 9, 10, 11, 1, -9}, // 0x55 'U' 129 | {483, 11, 10, 11, 0, -9}, // 0x56 'V' 130 | {497, 11, 10, 11, 0, -9}, // 0x57 'W' 131 | {511, 9, 10, 11, 1, -9}, // 0x58 'X' 132 | {523, 9, 10, 11, 1, -9}, // 0x59 'Y' 133 | {535, 7, 10, 11, 2, -9}, // 0x5A 'Z' 134 | {544, 2, 13, 11, 5, -10}, // 0x5B '[' 135 | {548, 7, 13, 11, 2, -11}, // 0x5C '\' 136 | {560, 2, 13, 11, 4, -10}, // 0x5D ']' 137 | {564, 7, 5, 11, 2, -10}, // 0x5E '^' 138 | {569, 11, 1, 11, 0, 2}, // 0x5F '_' 139 | {571, 3, 3, 11, 3, -11}, // 0x60 '`' 140 | {573, 9, 8, 11, 1, -7}, // 0x61 'a' 141 | {582, 9, 11, 11, 1, -10}, // 0x62 'b' 142 | {595, 7, 8, 11, 2, -7}, // 0x63 'c' 143 | {602, 9, 11, 11, 1, -10}, // 0x64 'd' 144 | {615, 8, 8, 11, 1, -7}, // 0x65 'e' 145 | {623, 6, 11, 11, 3, -10}, // 0x66 'f' 146 | {632, 9, 11, 11, 1, -7}, // 0x67 'g' 147 | {645, 9, 11, 11, 1, -10}, // 0x68 'h' 148 | {658, 7, 10, 11, 2, -9}, // 0x69 'i' 149 | {667, 5, 13, 11, 3, -9}, // 0x6A 'j' 150 | {676, 8, 11, 11, 2, -10}, // 0x6B 'k' 151 | {687, 7, 11, 11, 2, -10}, // 0x6C 'l' 152 | {697, 9, 8, 11, 1, -7}, // 0x6D 'm' 153 | {706, 9, 8, 11, 1, -7}, // 0x6E 'n' 154 | {715, 9, 8, 11, 1, -7}, // 0x6F 'o' 155 | {724, 9, 11, 11, 1, -7}, // 0x70 'p' 156 | {737, 9, 11, 11, 1, -7}, // 0x71 'q' 157 | {750, 7, 8, 11, 3, -7}, // 0x72 'r' 158 | {757, 7, 8, 11, 2, -7}, // 0x73 's' 159 | {764, 8, 10, 11, 2, -9}, // 0x74 't' 160 | {774, 8, 8, 11, 1, -7}, // 0x75 'u' 161 | {782, 9, 8, 11, 1, -7}, // 0x76 'v' 162 | {791, 9, 8, 11, 1, -7}, // 0x77 'w' 163 | {800, 9, 8, 11, 1, -7}, // 0x78 'x' 164 | {809, 9, 11, 11, 1, -7}, // 0x79 'y' 165 | {822, 7, 8, 11, 2, -7}, // 0x7A 'z' 166 | {829, 3, 13, 11, 4, -10}, // 0x7B '{' 167 | {834, 1, 13, 11, 5, -10}, // 0x7C '|' 168 | {836, 3, 13, 11, 4, -10}, // 0x7D '}' 169 | {841, 7, 3, 11, 2, -6}}; // 0x7E '~' 170 | 171 | const GFXfont FreeMono9pt7b PROGMEM = {(uint8_t *)FreeMono9pt7bBitmaps, 172 | (GFXglyph *)FreeMono9pt7bGlyphs, 0x20, 173 | 0x7E, 18}; 174 | 175 | // Approx. 1516 bytes 176 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Fonts/FreeMonoBold9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeMonoBold9pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xFF, 0xD2, 0x1F, 0x80, 0xEC, 0x89, 0x12, 0x24, 0x40, 0x36, 0x36, 3 | 0x36, 0x7F, 0x7F, 0x36, 0xFF, 0xFF, 0x3C, 0x3C, 0x3C, 0x00, 0x18, 0xFF, 4 | 0xFE, 0x3C, 0x1F, 0x1F, 0x83, 0x46, 0x8D, 0xF0, 0xC1, 0x83, 0x00, 0x61, 5 | 0x22, 0x44, 0x86, 0x67, 0x37, 0x11, 0x22, 0x4C, 0x70, 0x3C, 0x7E, 0x60, 6 | 0x60, 0x30, 0x7B, 0xDF, 0xCE, 0xFF, 0x7F, 0xC9, 0x24, 0x37, 0x66, 0xCC, 7 | 0xCC, 0xCC, 0x66, 0x31, 0xCE, 0x66, 0x33, 0x33, 0x33, 0x66, 0xC8, 0x18, 8 | 0x18, 0xFF, 0xFF, 0x3C, 0x3C, 0x66, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 9 | 0x18, 0x18, 0x18, 0x6B, 0x48, 0xFF, 0xFF, 0xC0, 0xF0, 0x02, 0x0C, 0x18, 10 | 0x60, 0xC3, 0x06, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x20, 0x00, 0x38, 11 | 0xFB, 0xBE, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xDD, 0xF1, 0xC0, 0x38, 0xF3, 12 | 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0xFD, 0xF8, 0x3C, 0xFE, 0xC7, 0x03, 13 | 0x03, 0x06, 0x0C, 0x18, 0x70, 0xE3, 0xFF, 0xFF, 0x7C, 0xFE, 0x03, 0x03, 14 | 0x03, 0x1E, 0x1E, 0x07, 0x03, 0x03, 0xFE, 0x7C, 0x1C, 0x38, 0xB1, 0x64, 15 | 0xD9, 0xBF, 0xFF, 0x3E, 0x7C, 0x7E, 0x3F, 0x18, 0x0F, 0xC7, 0xF3, 0x1C, 16 | 0x06, 0x03, 0xC3, 0xFF, 0x9F, 0x80, 0x0F, 0x3F, 0x30, 0x60, 0x60, 0xDC, 17 | 0xFE, 0xE3, 0xC3, 0x63, 0x7E, 0x3C, 0xFF, 0xFF, 0xC3, 0x03, 0x06, 0x06, 18 | 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x38, 0xFB, 0x1E, 0x3C, 0x6F, 0x9F, 0x63, 19 | 0xC7, 0x8F, 0xF1, 0xC0, 0x3C, 0x7E, 0xE6, 0xC3, 0xC3, 0xE7, 0x7F, 0x3B, 20 | 0x06, 0x0E, 0xFC, 0xF0, 0xF0, 0x0F, 0x6C, 0x00, 0x1A, 0xD2, 0x00, 0x01, 21 | 0x83, 0x87, 0x0E, 0x0F, 0x80, 0xE0, 0x1C, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 22 | 0x0F, 0xFF, 0xFC, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0xF9, 0xE3, 0xC1, 0x80, 23 | 0x7C, 0xFE, 0xC7, 0x03, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x30, 0x30, 0x1E, 24 | 0x1F, 0x1C, 0xDC, 0x6C, 0x76, 0x7B, 0x6D, 0xB6, 0xDB, 0x6F, 0xF3, 0xFC, 25 | 0x06, 0x33, 0xF8, 0x78, 0x3C, 0x07, 0xC0, 0x38, 0x05, 0x81, 0xB0, 0x36, 26 | 0x0F, 0xE1, 0xFC, 0x71, 0xDF, 0x7F, 0xEF, 0x80, 0xFF, 0x3F, 0xE6, 0x19, 27 | 0x86, 0x7F, 0x1F, 0xE6, 0x1D, 0x83, 0x60, 0xFF, 0xFF, 0xF0, 0x1F, 0xBF, 28 | 0xD8, 0xF8, 0x3C, 0x06, 0x03, 0x01, 0x80, 0x61, 0xBF, 0xC7, 0xC0, 0xFE, 29 | 0x3F, 0xE6, 0x19, 0x83, 0x60, 0xD8, 0x36, 0x0D, 0x83, 0x61, 0xBF, 0xEF, 30 | 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC3, 0x61, 0xFF, 31 | 0xFF, 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC0, 0x60, 32 | 0x7C, 0x3E, 0x00, 0x1F, 0x9F, 0xE6, 0x1B, 0x06, 0xC0, 0x30, 0x0C, 0x7F, 33 | 0x1F, 0xE1, 0x9F, 0xE3, 0xF0, 0xF7, 0xFB, 0xD8, 0xCC, 0x66, 0x33, 0xF9, 34 | 0xFC, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0xFF, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 35 | 0x33, 0xFF, 0xC0, 0x1F, 0xC7, 0xF0, 0x30, 0x0C, 0x03, 0x00, 0xCC, 0x33, 36 | 0x0C, 0xC7, 0x3F, 0x87, 0xC0, 0xF7, 0xBD, 0xE6, 0x61, 0xB0, 0x78, 0x1F, 37 | 0x06, 0xE1, 0x98, 0x63, 0x3C, 0xFF, 0x3C, 0xFC, 0x7E, 0x0C, 0x06, 0x03, 38 | 0x01, 0x80, 0xC6, 0x63, 0x31, 0xFF, 0xFF, 0xE0, 0xE0, 0xFE, 0x3D, 0xC7, 39 | 0x3D, 0xE7, 0xBC, 0xD7, 0x9B, 0xB3, 0x76, 0x60, 0xDE, 0x3F, 0xC7, 0x80, 40 | 0xE1, 0xFE, 0x3D, 0xE3, 0x3C, 0x66, 0xCC, 0xDD, 0x99, 0xB3, 0x1E, 0x63, 41 | 0xDE, 0x3B, 0xC3, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80, 42 | 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C, 0x00, 0xFE, 0x7F, 0x98, 0x6C, 43 | 0x36, 0x1B, 0xF9, 0xF8, 0xC0, 0x60, 0x7C, 0x3E, 0x00, 0x1F, 0x07, 0xF1, 44 | 0xC7, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C, 45 | 0x0C, 0x33, 0xFE, 0x7F, 0x80, 0xFC, 0x7F, 0x18, 0xCC, 0x66, 0x73, 0xF1, 46 | 0xF0, 0xCC, 0x63, 0x7D, 0xFE, 0x60, 0x3F, 0xBF, 0xF0, 0x78, 0x0F, 0x03, 47 | 0xF8, 0x3F, 0x83, 0xC3, 0xFF, 0xBF, 0x80, 0xFF, 0xFF, 0xF6, 0x7B, 0x3D, 48 | 0x98, 0xC0, 0x60, 0x30, 0x18, 0x3F, 0x1F, 0x80, 0xF1, 0xFE, 0x3D, 0x83, 49 | 0x30, 0x66, 0x0C, 0xC1, 0x98, 0x33, 0x06, 0x60, 0xC7, 0xF0, 0x7C, 0x00, 50 | 0xFB, 0xFF, 0x7D, 0xC3, 0x18, 0xC3, 0x18, 0x36, 0x06, 0xC0, 0x50, 0x0E, 51 | 0x01, 0xC0, 0x10, 0x00, 0xFB, 0xFE, 0xF6, 0x0D, 0x93, 0x6E, 0xDB, 0xB7, 52 | 0xAD, 0xEE, 0x7B, 0x8E, 0xE3, 0x18, 0xF3, 0xFC, 0xF7, 0x38, 0xFC, 0x1E, 53 | 0x03, 0x01, 0xE0, 0xCC, 0x73, 0xBC, 0xFF, 0x3C, 0xF3, 0xFC, 0xF7, 0x38, 54 | 0xCC, 0x1E, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x0F, 0xC3, 0xF0, 0xFE, 0xFE, 55 | 0xC6, 0xCC, 0x18, 0x18, 0x30, 0x63, 0xC3, 0xFF, 0xFF, 0xFF, 0xCC, 0xCC, 56 | 0xCC, 0xCC, 0xCC, 0xFF, 0x01, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 57 | 0x30, 0x30, 0x60, 0x60, 0xC0, 0x80, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 58 | 0xFF, 0x10, 0x71, 0xE3, 0x6C, 0x70, 0x40, 0xFF, 0xFF, 0xFC, 0x88, 0x80, 59 | 0x7E, 0x3F, 0x8F, 0xCF, 0xEE, 0x36, 0x1B, 0xFE, 0xFF, 0xE0, 0x38, 0x06, 60 | 0x01, 0xBC, 0x7F, 0x9C, 0x76, 0x0D, 0x83, 0x71, 0xFF, 0xEE, 0xF0, 0x3F, 61 | 0xBF, 0xF8, 0x78, 0x3C, 0x07, 0x05, 0xFE, 0x7E, 0x03, 0x80, 0xE0, 0x18, 62 | 0xF6, 0x7F, 0xB8, 0xEC, 0x1B, 0x06, 0xE3, 0x9F, 0xF3, 0xFC, 0x3E, 0x3F, 63 | 0xB0, 0xFF, 0xFF, 0xFE, 0x01, 0xFE, 0x7E, 0x1F, 0x3F, 0x30, 0x7E, 0x7E, 64 | 0x30, 0x30, 0x30, 0x30, 0xFE, 0xFE, 0x3F, 0xBF, 0xF9, 0xD8, 0x6C, 0x37, 65 | 0x39, 0xFC, 0x76, 0x03, 0x01, 0x8F, 0xC7, 0xC0, 0xE0, 0x70, 0x18, 0x0D, 66 | 0xC7, 0xF3, 0x99, 0x8C, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0x18, 0x18, 0x00, 67 | 0x78, 0x78, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x60, 0x3F, 0xFC, 68 | 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0xFF, 0x80, 0xE0, 0x70, 0x18, 0x0D, 69 | 0xE6, 0xF3, 0xE1, 0xE0, 0xF8, 0x6E, 0x73, 0xF9, 0xE0, 0x78, 0x78, 0x18, 70 | 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0xFD, 0x9F, 0xF9, 0x9B, 71 | 0x33, 0x66, 0x6C, 0xCD, 0xBD, 0xFF, 0xBF, 0xEE, 0x7F, 0x98, 0xCC, 0x66, 72 | 0x33, 0x1B, 0xDF, 0xEF, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1F, 0x1D, 0xFC, 73 | 0x7C, 0xEF, 0x1F, 0xF9, 0xC3, 0xB0, 0x36, 0x06, 0xE1, 0xDF, 0xF3, 0x78, 74 | 0x60, 0x0C, 0x03, 0xE0, 0x7C, 0x00, 0x1E, 0xEF, 0xFF, 0x87, 0x60, 0x6C, 75 | 0x0D, 0xC3, 0x9F, 0xF0, 0xF6, 0x00, 0xC0, 0x18, 0x0F, 0x81, 0xF0, 0x77, 76 | 0xBF, 0xCF, 0x06, 0x03, 0x01, 0x83, 0xF9, 0xFC, 0x3F, 0xFF, 0xC3, 0xFC, 77 | 0x3F, 0xC3, 0xFF, 0xFC, 0x60, 0x60, 0x60, 0xFE, 0xFE, 0x60, 0x60, 0x60, 78 | 0x61, 0x7F, 0x3E, 0xE7, 0x73, 0x98, 0xCC, 0x66, 0x33, 0x19, 0xFE, 0x7F, 79 | 0xFB, 0xFF, 0x7C, 0xC6, 0x18, 0xC1, 0xB0, 0x36, 0x03, 0x80, 0x70, 0xF1, 80 | 0xFE, 0x3D, 0xBB, 0x37, 0x63, 0xF8, 0x77, 0x0E, 0xE1, 0x8C, 0xF7, 0xFB, 81 | 0xCD, 0x83, 0x83, 0xC3, 0xBB, 0xDF, 0xEF, 0xF3, 0xFC, 0xF6, 0x18, 0xCC, 82 | 0x33, 0x07, 0x81, 0xE0, 0x30, 0x0C, 0x06, 0x0F, 0xC3, 0xF0, 0xFF, 0xFF, 83 | 0x30, 0xC3, 0x0C, 0x7F, 0xFF, 0x37, 0x66, 0x66, 0xCC, 0x66, 0x66, 0x73, 84 | 0xFF, 0xFF, 0xFF, 0xF0, 0xCE, 0x66, 0x66, 0x33, 0x66, 0x66, 0xEC, 0x70, 85 | 0x7C, 0xF3, 0xC0, 0xC0}; 86 | 87 | const GFXglyph FreeMonoBold9pt7bGlyphs[] PROGMEM = { 88 | {0, 0, 0, 11, 0, 1}, // 0x20 ' ' 89 | {0, 3, 11, 11, 4, -10}, // 0x21 '!' 90 | {5, 7, 5, 11, 2, -10}, // 0x22 '"' 91 | {10, 8, 12, 11, 1, -10}, // 0x23 '#' 92 | {22, 7, 14, 11, 2, -11}, // 0x24 '$' 93 | {35, 7, 11, 11, 2, -10}, // 0x25 '%' 94 | {45, 8, 10, 11, 1, -9}, // 0x26 '&' 95 | {55, 3, 5, 11, 4, -10}, // 0x27 ''' 96 | {57, 4, 14, 11, 5, -10}, // 0x28 '(' 97 | {64, 4, 14, 11, 2, -10}, // 0x29 ')' 98 | {71, 8, 7, 11, 2, -10}, // 0x2A '*' 99 | {78, 8, 9, 11, 2, -8}, // 0x2B '+' 100 | {87, 3, 5, 11, 3, -1}, // 0x2C ',' 101 | {89, 9, 2, 11, 1, -5}, // 0x2D '-' 102 | {92, 2, 2, 11, 4, -1}, // 0x2E '.' 103 | {93, 7, 15, 11, 2, -12}, // 0x2F '/' 104 | {107, 7, 12, 11, 2, -11}, // 0x30 '0' 105 | {118, 7, 11, 11, 2, -10}, // 0x31 '1' 106 | {128, 8, 12, 11, 1, -11}, // 0x32 '2' 107 | {140, 8, 12, 11, 2, -11}, // 0x33 '3' 108 | {152, 7, 10, 11, 2, -9}, // 0x34 '4' 109 | {161, 9, 11, 11, 1, -10}, // 0x35 '5' 110 | {174, 8, 12, 11, 2, -11}, // 0x36 '6' 111 | {186, 8, 11, 11, 1, -10}, // 0x37 '7' 112 | {197, 7, 12, 11, 2, -11}, // 0x38 '8' 113 | {208, 8, 12, 11, 2, -11}, // 0x39 '9' 114 | {220, 2, 8, 11, 4, -7}, // 0x3A ':' 115 | {222, 3, 11, 11, 3, -7}, // 0x3B ';' 116 | {227, 9, 8, 11, 1, -8}, // 0x3C '<' 117 | {236, 9, 6, 11, 1, -7}, // 0x3D '=' 118 | {243, 9, 8, 11, 1, -8}, // 0x3E '>' 119 | {252, 8, 11, 11, 2, -10}, // 0x3F '?' 120 | {263, 9, 15, 11, 1, -11}, // 0x40 '@' 121 | {280, 11, 11, 11, 0, -10}, // 0x41 'A' 122 | {296, 10, 11, 11, 1, -10}, // 0x42 'B' 123 | {310, 9, 11, 11, 1, -10}, // 0x43 'C' 124 | {323, 10, 11, 11, 0, -10}, // 0x44 'D' 125 | {337, 9, 11, 11, 1, -10}, // 0x45 'E' 126 | {350, 9, 11, 11, 1, -10}, // 0x46 'F' 127 | {363, 10, 11, 11, 1, -10}, // 0x47 'G' 128 | {377, 9, 11, 11, 1, -10}, // 0x48 'H' 129 | {390, 6, 11, 11, 3, -10}, // 0x49 'I' 130 | {399, 10, 11, 11, 1, -10}, // 0x4A 'J' 131 | {413, 10, 11, 11, 1, -10}, // 0x4B 'K' 132 | {427, 9, 11, 11, 1, -10}, // 0x4C 'L' 133 | {440, 11, 11, 11, 0, -10}, // 0x4D 'M' 134 | {456, 11, 11, 11, 0, -10}, // 0x4E 'N' 135 | {472, 11, 11, 11, 0, -10}, // 0x4F 'O' 136 | {488, 9, 11, 11, 1, -10}, // 0x50 'P' 137 | {501, 11, 14, 11, 0, -10}, // 0x51 'Q' 138 | {521, 9, 11, 11, 1, -10}, // 0x52 'R' 139 | {534, 9, 11, 11, 1, -10}, // 0x53 'S' 140 | {547, 9, 11, 11, 1, -10}, // 0x54 'T' 141 | {560, 11, 11, 11, 0, -10}, // 0x55 'U' 142 | {576, 11, 11, 11, 0, -10}, // 0x56 'V' 143 | {592, 10, 11, 11, 0, -10}, // 0x57 'W' 144 | {606, 10, 11, 11, 0, -10}, // 0x58 'X' 145 | {620, 10, 11, 11, 0, -10}, // 0x59 'Y' 146 | {634, 8, 11, 11, 2, -10}, // 0x5A 'Z' 147 | {645, 4, 14, 11, 5, -10}, // 0x5B '[' 148 | {652, 7, 15, 11, 2, -12}, // 0x5C '\' 149 | {666, 4, 14, 11, 2, -10}, // 0x5D ']' 150 | {673, 7, 6, 11, 2, -11}, // 0x5E '^' 151 | {679, 11, 2, 11, 0, 3}, // 0x5F '_' 152 | {682, 3, 3, 11, 3, -11}, // 0x60 '`' 153 | {684, 9, 8, 11, 1, -7}, // 0x61 'a' 154 | {693, 10, 11, 11, 0, -10}, // 0x62 'b' 155 | {707, 9, 8, 11, 1, -7}, // 0x63 'c' 156 | {716, 10, 11, 11, 1, -10}, // 0x64 'd' 157 | {730, 9, 8, 11, 1, -7}, // 0x65 'e' 158 | {739, 8, 11, 11, 2, -10}, // 0x66 'f' 159 | {750, 9, 12, 11, 1, -7}, // 0x67 'g' 160 | {764, 9, 11, 11, 1, -10}, // 0x68 'h' 161 | {777, 8, 11, 11, 2, -10}, // 0x69 'i' 162 | {788, 6, 15, 11, 2, -10}, // 0x6A 'j' 163 | {800, 9, 11, 11, 1, -10}, // 0x6B 'k' 164 | {813, 8, 11, 11, 2, -10}, // 0x6C 'l' 165 | {824, 11, 8, 11, 0, -7}, // 0x6D 'm' 166 | {835, 9, 8, 11, 1, -7}, // 0x6E 'n' 167 | {844, 9, 8, 11, 1, -7}, // 0x6F 'o' 168 | {853, 11, 12, 11, 0, -7}, // 0x70 'p' 169 | {870, 11, 12, 11, 0, -7}, // 0x71 'q' 170 | {887, 9, 8, 11, 1, -7}, // 0x72 'r' 171 | {896, 8, 8, 11, 2, -7}, // 0x73 's' 172 | {904, 8, 11, 11, 1, -10}, // 0x74 't' 173 | {915, 9, 8, 11, 1, -7}, // 0x75 'u' 174 | {924, 11, 8, 11, 0, -7}, // 0x76 'v' 175 | {935, 11, 8, 11, 0, -7}, // 0x77 'w' 176 | {946, 9, 8, 11, 1, -7}, // 0x78 'x' 177 | {955, 10, 12, 11, 0, -7}, // 0x79 'y' 178 | {970, 7, 8, 11, 2, -7}, // 0x7A 'z' 179 | {977, 4, 14, 11, 3, -10}, // 0x7B '{' 180 | {984, 2, 14, 11, 5, -10}, // 0x7C '|' 181 | {988, 4, 14, 11, 4, -10}, // 0x7D '}' 182 | {995, 9, 4, 11, 1, -6}}; // 0x7E '~' 183 | 184 | const GFXfont FreeMonoBold9pt7b PROGMEM = {(uint8_t *)FreeMonoBold9pt7bBitmaps, 185 | (GFXglyph *)FreeMonoBold9pt7bGlyphs, 186 | 0x20, 0x7E, 18}; 187 | 188 | // Approx. 1672 bytes 189 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Fonts/FreeMonoOblique9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeMonoOblique9pt7bBitmaps[] PROGMEM = { 2 | 0x11, 0x22, 0x24, 0x40, 0x00, 0xC0, 0xDE, 0xE5, 0x29, 0x00, 0x09, 0x05, 3 | 0x02, 0x82, 0x47, 0xF8, 0xA0, 0x51, 0xFE, 0x28, 0x14, 0x0A, 0x09, 0x00, 4 | 0x08, 0x1D, 0x23, 0x40, 0x70, 0x1C, 0x02, 0x82, 0x84, 0x78, 0x20, 0x20, 5 | 0x1C, 0x11, 0x08, 0x83, 0x80, 0x18, 0x71, 0xC0, 0x1C, 0x11, 0x08, 0x83, 6 | 0x80, 0x1E, 0x60, 0x81, 0x03, 0x0A, 0x65, 0x46, 0x88, 0xE8, 0xFA, 0x80, 7 | 0x12, 0x24, 0x48, 0x88, 0x88, 0x88, 0x80, 0x01, 0x11, 0x11, 0x11, 0x22, 8 | 0x44, 0x80, 0x10, 0x22, 0x5B, 0xC3, 0x0A, 0x22, 0x00, 0x04, 0x02, 0x02, 9 | 0x1F, 0xF0, 0x80, 0x40, 0x20, 0x00, 0x36, 0x4C, 0x80, 0xFF, 0x80, 0xF0, 10 | 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 11 | 0x08, 0x08, 0x00, 0x1C, 0x45, 0x0A, 0x18, 0x30, 0x61, 0x42, 0x85, 0x11, 12 | 0xC0, 0x04, 0x38, 0x90, 0x20, 0x81, 0x02, 0x04, 0x08, 0x23, 0xF8, 0x07, 13 | 0x04, 0xC4, 0x20, 0x10, 0x10, 0x30, 0x20, 0x20, 0x60, 0x40, 0x3F, 0x80, 14 | 0x0F, 0x00, 0x40, 0x20, 0x20, 0x60, 0x18, 0x04, 0x02, 0x01, 0x43, 0x1E, 15 | 0x00, 0x03, 0x05, 0x0A, 0x12, 0x22, 0x22, 0x42, 0x7F, 0x04, 0x04, 0x1E, 16 | 0x1F, 0x88, 0x08, 0x05, 0xC3, 0x30, 0x08, 0x04, 0x02, 0x02, 0x42, 0x1E, 17 | 0x00, 0x07, 0x18, 0x20, 0x40, 0x5C, 0xA6, 0xC2, 0x82, 0x82, 0xC4, 0x78, 18 | 0xFF, 0x04, 0x10, 0x20, 0x82, 0x04, 0x10, 0x20, 0x81, 0x00, 0x1E, 0x23, 19 | 0x41, 0x41, 0x62, 0x1C, 0x66, 0x82, 0x82, 0x84, 0x78, 0x1E, 0x23, 0x41, 20 | 0x41, 0x43, 0x65, 0x3A, 0x02, 0x04, 0x18, 0xE0, 0x6C, 0x00, 0x36, 0x18, 21 | 0xC0, 0x00, 0x19, 0x8C, 0xC4, 0x00, 0x01, 0x83, 0x06, 0x0C, 0x06, 0x00, 22 | 0x80, 0x30, 0x04, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x20, 0x0C, 0x01, 0x00, 23 | 0x60, 0x20, 0x60, 0xC1, 0x80, 0x3D, 0x8E, 0x08, 0x10, 0xC6, 0x08, 0x00, 24 | 0x01, 0x80, 0x1C, 0x45, 0x0A, 0x79, 0x34, 0x69, 0x4E, 0x81, 0x03, 0x03, 25 | 0xC0, 0x0F, 0x00, 0x60, 0x12, 0x02, 0x40, 0x88, 0x21, 0x07, 0xE1, 0x04, 26 | 0x20, 0x5E, 0x3C, 0x3F, 0x84, 0x11, 0x04, 0x82, 0x3F, 0x88, 0x32, 0x04, 27 | 0x81, 0x60, 0xBF, 0xC0, 0x1E, 0x98, 0xD0, 0x28, 0x08, 0x04, 0x02, 0x01, 28 | 0x00, 0x41, 0x1F, 0x00, 0x3F, 0x0C, 0x22, 0x04, 0x81, 0x20, 0x48, 0x12, 29 | 0x09, 0x02, 0x43, 0x3F, 0x00, 0x3F, 0xC4, 0x11, 0x00, 0x88, 0x3E, 0x08, 30 | 0x82, 0x00, 0x82, 0x60, 0xBF, 0xE0, 0x3F, 0xE2, 0x08, 0x40, 0x11, 0x03, 31 | 0xE0, 0x44, 0x08, 0x01, 0x00, 0x60, 0x1F, 0x00, 0x1E, 0x98, 0xD0, 0x08, 32 | 0x08, 0x04, 0x7A, 0x05, 0x02, 0x41, 0x1F, 0x00, 0x3D, 0xE2, 0x18, 0x42, 33 | 0x08, 0x43, 0xF8, 0x41, 0x08, 0x21, 0x08, 0x21, 0x1E, 0xF0, 0x3F, 0x82, 34 | 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x20, 0x10, 0x7F, 0x00, 0x0F, 0xE0, 35 | 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, 0x20, 0x84, 0x10, 0x84, 0x0F, 0x00, 36 | 0x3C, 0xE2, 0x10, 0x44, 0x11, 0x02, 0xC0, 0x64, 0x08, 0x81, 0x08, 0x61, 37 | 0x1E, 0x38, 0x3E, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04, 0x01, 0x04, 0x42, 38 | 0x10, 0xBF, 0xE0, 0x38, 0x38, 0xC3, 0x05, 0x28, 0x29, 0x42, 0x52, 0x13, 39 | 0x10, 0x99, 0x84, 0x08, 0x20, 0x47, 0x8F, 0x00, 0x70, 0xE6, 0x08, 0xA1, 40 | 0x14, 0x22, 0x48, 0x49, 0x11, 0x22, 0x14, 0x43, 0x1E, 0x20, 0x1E, 0x18, 41 | 0x90, 0x28, 0x18, 0x0C, 0x06, 0x05, 0x02, 0x46, 0x1E, 0x00, 0x3F, 0x84, 42 | 0x31, 0x04, 0x81, 0x20, 0x8F, 0xC2, 0x00, 0x80, 0x60, 0x3E, 0x00, 0x1E, 43 | 0x18, 0x90, 0x28, 0x18, 0x0C, 0x06, 0x05, 0x02, 0x46, 0x1E, 0x08, 0x0F, 44 | 0x44, 0x60, 0x3F, 0x84, 0x31, 0x04, 0x81, 0x20, 0x8F, 0xC2, 0x10, 0x84, 45 | 0x60, 0xBC, 0x10, 0x0F, 0x88, 0xC8, 0x24, 0x01, 0x80, 0x38, 0x05, 0x02, 46 | 0xC2, 0x5E, 0x00, 0xFF, 0xC4, 0x44, 0x02, 0x01, 0x00, 0x80, 0x40, 0x60, 47 | 0x20, 0x7E, 0x00, 0xF1, 0xD0, 0x24, 0x09, 0x02, 0x41, 0xA0, 0x48, 0x12, 48 | 0x04, 0xC6, 0x1F, 0x00, 0xF1, 0xE8, 0x11, 0x02, 0x20, 0x82, 0x20, 0x44, 49 | 0x09, 0x01, 0x40, 0x28, 0x02, 0x00, 0xF1, 0xE8, 0x09, 0x12, 0x26, 0x45, 50 | 0x48, 0xAA, 0x29, 0x45, 0x28, 0xC6, 0x18, 0xC0, 0x38, 0xE2, 0x08, 0x26, 51 | 0x05, 0x00, 0x40, 0x18, 0x04, 0x81, 0x08, 0x41, 0x1C, 0x70, 0xE3, 0xA0, 52 | 0x90, 0x84, 0x81, 0x80, 0x80, 0x40, 0x20, 0x20, 0x7E, 0x00, 0x3F, 0x90, 53 | 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x82, 0x7F, 0x00, 0x39, 0x08, 54 | 0x44, 0x21, 0x08, 0x42, 0x21, 0x0E, 0x00, 0x88, 0x44, 0x44, 0x22, 0x22, 55 | 0x11, 0x11, 0x38, 0x42, 0x11, 0x08, 0x42, 0x10, 0x84, 0x2E, 0x00, 0x08, 56 | 0x28, 0x92, 0x18, 0x20, 0xFF, 0xC0, 0xA4, 0x3E, 0x00, 0x80, 0x47, 0xA4, 57 | 0x34, 0x12, 0x18, 0xF7, 0x38, 0x01, 0x00, 0x40, 0x09, 0xE1, 0xC6, 0x20, 58 | 0x44, 0x09, 0x01, 0x30, 0x46, 0x13, 0xBC, 0x00, 0x1F, 0x48, 0x74, 0x0A, 59 | 0x00, 0x80, 0x20, 0x0C, 0x18, 0xF8, 0x01, 0x80, 0x40, 0x23, 0x96, 0x32, 60 | 0x0A, 0x05, 0x02, 0x81, 0x61, 0x1F, 0xE0, 0x1F, 0x30, 0xD0, 0x3F, 0xF8, 61 | 0x04, 0x01, 0x00, 0x7C, 0x07, 0xC3, 0x00, 0x80, 0xFE, 0x10, 0x04, 0x01, 62 | 0x00, 0x40, 0x10, 0x08, 0x0F, 0xE0, 0x1D, 0xD8, 0xC4, 0x12, 0x04, 0x82, 63 | 0x20, 0x8C, 0x61, 0xE8, 0x02, 0x01, 0x07, 0x80, 0x30, 0x04, 0x01, 0x00, 64 | 0x5C, 0x38, 0x88, 0x22, 0x08, 0x82, 0x21, 0x18, 0x4F, 0x3C, 0x04, 0x04, 65 | 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0xFF, 0x01, 0x00, 0x80, 66 | 0x03, 0xF0, 0x10, 0x08, 0x04, 0x02, 0x02, 0x01, 0x00, 0x80, 0x40, 0x47, 67 | 0xC0, 0x38, 0x08, 0x04, 0x02, 0x71, 0x20, 0xA0, 0xA0, 0x68, 0x24, 0x11, 68 | 0x38, 0xE0, 0x3C, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 69 | 0xFF, 0x3E, 0xE2, 0x64, 0x88, 0x91, 0x12, 0x24, 0x48, 0x91, 0x17, 0x33, 70 | 0x37, 0x14, 0x4C, 0x24, 0x12, 0x09, 0x08, 0x85, 0xE3, 0x1E, 0x10, 0x90, 71 | 0x30, 0x18, 0x0C, 0x0B, 0x08, 0x78, 0x33, 0xC3, 0x8C, 0x40, 0x88, 0x12, 72 | 0x02, 0x60, 0x8C, 0x31, 0x78, 0x20, 0x08, 0x03, 0xE0, 0x00, 0x1C, 0xD8, 73 | 0xC4, 0x12, 0x04, 0x81, 0x20, 0x4C, 0x21, 0xF8, 0x02, 0x00, 0x81, 0xF0, 74 | 0x73, 0x8E, 0x04, 0x04, 0x02, 0x01, 0x00, 0x81, 0xFC, 0x1F, 0x61, 0x40, 75 | 0x3C, 0x03, 0x81, 0x82, 0xFC, 0x10, 0x63, 0xF9, 0x02, 0x04, 0x10, 0x20, 76 | 0x40, 0x7C, 0xE3, 0x10, 0x90, 0x48, 0x24, 0x22, 0x11, 0x18, 0xF6, 0xF3, 77 | 0xD0, 0x44, 0x10, 0x88, 0x24, 0x09, 0x02, 0x80, 0x40, 0xE1, 0xD0, 0x24, 78 | 0x91, 0x24, 0x55, 0x19, 0x86, 0x61, 0x10, 0x39, 0xC4, 0x20, 0xB0, 0x30, 79 | 0x0C, 0x04, 0x86, 0x13, 0x8E, 0x3C, 0x71, 0x04, 0x10, 0x40, 0x88, 0x09, 80 | 0x00, 0xA0, 0x06, 0x00, 0x40, 0x08, 0x01, 0x00, 0xFC, 0x00, 0x7F, 0x42, 81 | 0x04, 0x08, 0x10, 0x20, 0x42, 0xFE, 0x0C, 0x41, 0x04, 0x30, 0x8C, 0x08, 82 | 0x21, 0x04, 0x10, 0x60, 0x24, 0x94, 0x92, 0x52, 0x40, 0x18, 0x20, 0x82, 83 | 0x10, 0x40, 0xC4, 0x10, 0x82, 0x08, 0xC0, 0x61, 0x24, 0x30}; 84 | 85 | const GFXglyph FreeMonoOblique9pt7bGlyphs[] PROGMEM = { 86 | {0, 0, 0, 11, 0, 1}, // 0x20 ' ' 87 | {0, 4, 11, 11, 4, -10}, // 0x21 '!' 88 | {6, 5, 5, 11, 4, -10}, // 0x22 '"' 89 | {10, 9, 12, 11, 2, -10}, // 0x23 '#' 90 | {24, 8, 12, 11, 3, -10}, // 0x24 '$' 91 | {36, 9, 11, 11, 2, -10}, // 0x25 '%' 92 | {49, 7, 10, 11, 2, -9}, // 0x26 '&' 93 | {58, 2, 5, 11, 6, -10}, // 0x27 ''' 94 | {60, 4, 13, 11, 6, -10}, // 0x28 '(' 95 | {67, 4, 13, 11, 3, -10}, // 0x29 ')' 96 | {74, 7, 7, 11, 4, -10}, // 0x2A '*' 97 | {81, 9, 8, 11, 2, -8}, // 0x2B '+' 98 | {90, 4, 5, 11, 2, -1}, // 0x2C ',' 99 | {93, 9, 1, 11, 2, -5}, // 0x2D '-' 100 | {95, 2, 2, 11, 4, -1}, // 0x2E '.' 101 | {96, 9, 13, 11, 2, -11}, // 0x2F '/' 102 | {111, 7, 11, 11, 3, -10}, // 0x30 '0' 103 | {121, 7, 11, 11, 2, -10}, // 0x31 '1' 104 | {131, 9, 11, 11, 2, -10}, // 0x32 '2' 105 | {144, 9, 11, 11, 2, -10}, // 0x33 '3' 106 | {157, 8, 11, 11, 2, -10}, // 0x34 '4' 107 | {168, 9, 11, 11, 2, -10}, // 0x35 '5' 108 | {181, 8, 11, 11, 3, -10}, // 0x36 '6' 109 | {192, 7, 11, 11, 4, -10}, // 0x37 '7' 110 | {202, 8, 11, 11, 3, -10}, // 0x38 '8' 111 | {213, 8, 11, 11, 3, -10}, // 0x39 '9' 112 | {224, 3, 8, 11, 4, -7}, // 0x3A ':' 113 | {227, 5, 11, 11, 2, -7}, // 0x3B ';' 114 | {234, 9, 8, 11, 2, -8}, // 0x3C '<' 115 | {243, 9, 4, 11, 2, -6}, // 0x3D '=' 116 | {248, 9, 8, 11, 2, -8}, // 0x3E '>' 117 | {257, 7, 10, 11, 4, -9}, // 0x3F '?' 118 | {266, 7, 12, 11, 3, -10}, // 0x40 '@' 119 | {277, 11, 10, 11, 0, -9}, // 0x41 'A' 120 | {291, 10, 10, 11, 1, -9}, // 0x42 'B' 121 | {304, 9, 10, 11, 2, -9}, // 0x43 'C' 122 | {316, 10, 10, 11, 1, -9}, // 0x44 'D' 123 | {329, 10, 10, 11, 1, -9}, // 0x45 'E' 124 | {342, 11, 10, 11, 1, -9}, // 0x46 'F' 125 | {356, 9, 10, 11, 2, -9}, // 0x47 'G' 126 | {368, 11, 10, 11, 1, -9}, // 0x48 'H' 127 | {382, 9, 10, 11, 2, -9}, // 0x49 'I' 128 | {394, 11, 10, 11, 2, -9}, // 0x4A 'J' 129 | {408, 11, 10, 11, 1, -9}, // 0x4B 'K' 130 | {422, 10, 10, 11, 1, -9}, // 0x4C 'L' 131 | {435, 13, 10, 11, 0, -9}, // 0x4D 'M' 132 | {452, 11, 10, 11, 1, -9}, // 0x4E 'N' 133 | {466, 9, 10, 11, 2, -9}, // 0x4F 'O' 134 | {478, 10, 10, 11, 1, -9}, // 0x50 'P' 135 | {491, 9, 13, 11, 2, -9}, // 0x51 'Q' 136 | {506, 10, 10, 11, 1, -9}, // 0x52 'R' 137 | {519, 9, 10, 11, 2, -9}, // 0x53 'S' 138 | {531, 9, 10, 11, 3, -9}, // 0x54 'T' 139 | {543, 10, 10, 11, 2, -9}, // 0x55 'U' 140 | {556, 11, 10, 11, 2, -9}, // 0x56 'V' 141 | {570, 11, 10, 11, 2, -9}, // 0x57 'W' 142 | {584, 11, 10, 11, 1, -9}, // 0x58 'X' 143 | {598, 9, 10, 11, 3, -9}, // 0x59 'Y' 144 | {610, 9, 10, 11, 2, -9}, // 0x5A 'Z' 145 | {622, 5, 13, 11, 5, -10}, // 0x5B '[' 146 | {631, 4, 14, 11, 4, -11}, // 0x5C '\' 147 | {638, 5, 13, 11, 2, -10}, // 0x5D ']' 148 | {647, 7, 5, 11, 3, -10}, // 0x5E '^' 149 | {652, 11, 1, 11, 0, 2}, // 0x5F '_' 150 | {654, 2, 3, 11, 5, -11}, // 0x60 '`' 151 | {655, 9, 8, 11, 2, -7}, // 0x61 'a' 152 | {664, 11, 11, 11, 0, -10}, // 0x62 'b' 153 | {680, 10, 8, 11, 2, -7}, // 0x63 'c' 154 | {690, 9, 11, 11, 2, -10}, // 0x64 'd' 155 | {703, 9, 8, 11, 2, -7}, // 0x65 'e' 156 | {712, 10, 11, 11, 2, -10}, // 0x66 'f' 157 | {726, 10, 11, 11, 2, -7}, // 0x67 'g' 158 | {740, 10, 11, 11, 1, -10}, // 0x68 'h' 159 | {754, 8, 11, 11, 2, -10}, // 0x69 'i' 160 | {765, 9, 14, 11, 1, -10}, // 0x6A 'j' 161 | {781, 9, 11, 11, 1, -10}, // 0x6B 'k' 162 | {794, 8, 11, 11, 2, -10}, // 0x6C 'l' 163 | {805, 11, 8, 11, 0, -7}, // 0x6D 'm' 164 | {816, 9, 8, 11, 1, -7}, // 0x6E 'n' 165 | {825, 9, 8, 11, 2, -7}, // 0x6F 'o' 166 | {834, 11, 11, 11, 0, -7}, // 0x70 'p' 167 | {850, 10, 11, 11, 2, -7}, // 0x71 'q' 168 | {864, 9, 8, 11, 2, -7}, // 0x72 'r' 169 | {873, 8, 8, 11, 2, -7}, // 0x73 's' 170 | {881, 7, 10, 11, 2, -9}, // 0x74 't' 171 | {890, 9, 8, 11, 2, -7}, // 0x75 'u' 172 | {899, 10, 8, 11, 2, -7}, // 0x76 'v' 173 | {909, 10, 8, 11, 2, -7}, // 0x77 'w' 174 | {919, 10, 8, 11, 1, -7}, // 0x78 'x' 175 | {929, 12, 11, 11, 0, -7}, // 0x79 'y' 176 | {946, 8, 8, 11, 2, -7}, // 0x7A 'z' 177 | {954, 6, 13, 11, 4, -10}, // 0x7B '{' 178 | {964, 3, 12, 11, 5, -9}, // 0x7C '|' 179 | {969, 6, 13, 11, 3, -10}, // 0x7D '}' 180 | {979, 7, 3, 11, 3, -6}}; // 0x7E '~' 181 | 182 | const GFXfont FreeMonoOblique9pt7b PROGMEM = { 183 | (uint8_t *)FreeMonoOblique9pt7bBitmaps, 184 | (GFXglyph *)FreeMonoOblique9pt7bGlyphs, 0x20, 0x7E, 18}; 185 | 186 | // Approx. 1654 bytes 187 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Fonts/FreeSans9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSans9pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF, 3 | 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F, 4 | 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35, 5 | 0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40, 6 | 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63, 7 | 0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81, 8 | 0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4, 9 | 0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46, 10 | 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30, 11 | 0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10, 12 | 0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3, 13 | 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33, 14 | 0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18, 15 | 0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07, 16 | 0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46, 17 | 0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3, 18 | 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78, 19 | 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF, 20 | 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, 21 | 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0, 22 | 0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 23 | 0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0, 24 | 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF, 25 | 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71, 26 | 0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18, 27 | 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01, 28 | 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC, 29 | 0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00, 30 | 0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, 31 | 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30, 32 | 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, 33 | 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, 34 | 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, 35 | 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 36 | 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, 37 | 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0, 38 | 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83, 39 | 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36, 40 | 0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 41 | 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, 42 | 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 43 | 0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8, 44 | 0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0, 45 | 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0, 46 | 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, 47 | 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F, 48 | 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07, 49 | 0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, 50 | 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, 51 | 0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, 52 | 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 53 | 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C, 54 | 0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 55 | 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, 56 | 0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, 57 | 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, 58 | 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F, 59 | 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 60 | 0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04, 61 | 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30, 62 | 0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98, 63 | 0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81, 64 | 0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00, 65 | 0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06, 66 | 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 67 | 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, 68 | 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D, 69 | 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 70 | 0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2, 71 | 0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0, 72 | 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B, 73 | 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C, 74 | 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03, 75 | 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66, 76 | 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66, 77 | 0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 78 | 0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 79 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03, 80 | 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C, 81 | 0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF, 82 | 0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, 83 | 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 84 | 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 85 | 0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 86 | 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 87 | 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18, 88 | 0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, 89 | 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 90 | 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0, 91 | 0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3, 92 | 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36, 93 | 0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42, 94 | 0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE, 95 | 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x36, 0x66, 0x66, 0x6E, 96 | 0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66, 97 | 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38}; 98 | 99 | const GFXglyph FreeSans9pt7bGlyphs[] PROGMEM = { 100 | {0, 0, 0, 5, 0, 1}, // 0x20 ' ' 101 | {0, 2, 13, 6, 2, -12}, // 0x21 '!' 102 | {4, 5, 4, 6, 1, -12}, // 0x22 '"' 103 | {7, 10, 12, 10, 0, -11}, // 0x23 '#' 104 | {22, 9, 16, 10, 1, -13}, // 0x24 '$' 105 | {40, 16, 13, 16, 1, -12}, // 0x25 '%' 106 | {66, 11, 13, 12, 1, -12}, // 0x26 '&' 107 | {84, 2, 4, 4, 1, -12}, // 0x27 ''' 108 | {85, 4, 17, 6, 1, -12}, // 0x28 '(' 109 | {94, 4, 17, 6, 1, -12}, // 0x29 ')' 110 | {103, 5, 5, 7, 1, -12}, // 0x2A '*' 111 | {107, 6, 8, 11, 3, -7}, // 0x2B '+' 112 | {113, 2, 4, 5, 2, 0}, // 0x2C ',' 113 | {114, 4, 1, 6, 1, -4}, // 0x2D '-' 114 | {115, 2, 1, 5, 1, 0}, // 0x2E '.' 115 | {116, 5, 13, 5, 0, -12}, // 0x2F '/' 116 | {125, 8, 13, 10, 1, -12}, // 0x30 '0' 117 | {138, 4, 13, 10, 3, -12}, // 0x31 '1' 118 | {145, 9, 13, 10, 1, -12}, // 0x32 '2' 119 | {160, 8, 13, 10, 1, -12}, // 0x33 '3' 120 | {173, 7, 13, 10, 2, -12}, // 0x34 '4' 121 | {185, 9, 13, 10, 1, -12}, // 0x35 '5' 122 | {200, 9, 13, 10, 1, -12}, // 0x36 '6' 123 | {215, 8, 13, 10, 0, -12}, // 0x37 '7' 124 | {228, 9, 13, 10, 1, -12}, // 0x38 '8' 125 | {243, 8, 13, 10, 1, -12}, // 0x39 '9' 126 | {256, 2, 10, 5, 1, -9}, // 0x3A ':' 127 | {259, 3, 12, 5, 1, -8}, // 0x3B ';' 128 | {264, 9, 9, 11, 1, -8}, // 0x3C '<' 129 | {275, 9, 4, 11, 1, -5}, // 0x3D '=' 130 | {280, 9, 9, 11, 1, -8}, // 0x3E '>' 131 | {291, 9, 13, 10, 1, -12}, // 0x3F '?' 132 | {306, 17, 16, 18, 1, -12}, // 0x40 '@' 133 | {340, 12, 13, 12, 0, -12}, // 0x41 'A' 134 | {360, 11, 13, 12, 1, -12}, // 0x42 'B' 135 | {378, 11, 13, 13, 1, -12}, // 0x43 'C' 136 | {396, 11, 13, 13, 1, -12}, // 0x44 'D' 137 | {414, 9, 13, 11, 1, -12}, // 0x45 'E' 138 | {429, 8, 13, 11, 1, -12}, // 0x46 'F' 139 | {442, 12, 13, 14, 1, -12}, // 0x47 'G' 140 | {462, 11, 13, 13, 1, -12}, // 0x48 'H' 141 | {480, 2, 13, 5, 2, -12}, // 0x49 'I' 142 | {484, 7, 13, 10, 1, -12}, // 0x4A 'J' 143 | {496, 11, 13, 12, 1, -12}, // 0x4B 'K' 144 | {514, 8, 13, 10, 1, -12}, // 0x4C 'L' 145 | {527, 13, 13, 15, 1, -12}, // 0x4D 'M' 146 | {549, 11, 13, 13, 1, -12}, // 0x4E 'N' 147 | {567, 13, 13, 14, 1, -12}, // 0x4F 'O' 148 | {589, 10, 13, 12, 1, -12}, // 0x50 'P' 149 | {606, 13, 14, 14, 1, -12}, // 0x51 'Q' 150 | {629, 12, 13, 13, 1, -12}, // 0x52 'R' 151 | {649, 10, 13, 12, 1, -12}, // 0x53 'S' 152 | {666, 9, 13, 11, 1, -12}, // 0x54 'T' 153 | {681, 11, 13, 13, 1, -12}, // 0x55 'U' 154 | {699, 11, 13, 12, 0, -12}, // 0x56 'V' 155 | {717, 17, 13, 17, 0, -12}, // 0x57 'W' 156 | {745, 12, 13, 12, 0, -12}, // 0x58 'X' 157 | {765, 12, 13, 12, 0, -12}, // 0x59 'Y' 158 | {785, 10, 13, 11, 1, -12}, // 0x5A 'Z' 159 | {802, 3, 17, 5, 1, -12}, // 0x5B '[' 160 | {809, 5, 13, 5, 0, -12}, // 0x5C '\' 161 | {818, 3, 17, 5, 0, -12}, // 0x5D ']' 162 | {825, 7, 7, 8, 1, -12}, // 0x5E '^' 163 | {832, 10, 1, 10, 0, 3}, // 0x5F '_' 164 | {834, 4, 3, 5, 0, -12}, // 0x60 '`' 165 | {836, 9, 10, 10, 1, -9}, // 0x61 'a' 166 | {848, 9, 13, 10, 1, -12}, // 0x62 'b' 167 | {863, 8, 10, 9, 1, -9}, // 0x63 'c' 168 | {873, 8, 13, 10, 1, -12}, // 0x64 'd' 169 | {886, 8, 10, 10, 1, -9}, // 0x65 'e' 170 | {896, 4, 13, 5, 1, -12}, // 0x66 'f' 171 | {903, 8, 14, 10, 1, -9}, // 0x67 'g' 172 | {917, 8, 13, 10, 1, -12}, // 0x68 'h' 173 | {930, 2, 13, 4, 1, -12}, // 0x69 'i' 174 | {934, 4, 17, 4, 0, -12}, // 0x6A 'j' 175 | {943, 9, 13, 9, 1, -12}, // 0x6B 'k' 176 | {958, 2, 13, 4, 1, -12}, // 0x6C 'l' 177 | {962, 13, 10, 15, 1, -9}, // 0x6D 'm' 178 | {979, 8, 10, 10, 1, -9}, // 0x6E 'n' 179 | {989, 8, 10, 10, 1, -9}, // 0x6F 'o' 180 | {999, 9, 13, 10, 1, -9}, // 0x70 'p' 181 | {1014, 8, 13, 10, 1, -9}, // 0x71 'q' 182 | {1027, 5, 10, 6, 1, -9}, // 0x72 'r' 183 | {1034, 8, 10, 9, 1, -9}, // 0x73 's' 184 | {1044, 4, 12, 5, 1, -11}, // 0x74 't' 185 | {1050, 8, 10, 10, 1, -9}, // 0x75 'u' 186 | {1060, 9, 10, 9, 0, -9}, // 0x76 'v' 187 | {1072, 13, 10, 13, 0, -9}, // 0x77 'w' 188 | {1089, 8, 10, 9, 0, -9}, // 0x78 'x' 189 | {1099, 9, 14, 9, 0, -9}, // 0x79 'y' 190 | {1115, 7, 10, 9, 1, -9}, // 0x7A 'z' 191 | {1124, 4, 17, 6, 1, -12}, // 0x7B '{' 192 | {1133, 2, 17, 4, 2, -12}, // 0x7C '|' 193 | {1138, 4, 17, 6, 1, -12}, // 0x7D '}' 194 | {1147, 7, 3, 9, 1, -7}}; // 0x7E '~' 195 | 196 | const GFXfont FreeSans9pt7b PROGMEM = {(uint8_t *)FreeSans9pt7bBitmaps, 197 | (GFXglyph *)FreeSans9pt7bGlyphs, 0x20, 198 | 0x7E, 22}; 199 | 200 | // Approx. 1822 bytes 201 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Fonts/FreeSerif9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSerif9pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xEA, 0x03, 0xDE, 0xF7, 0x20, 0x11, 0x09, 0x04, 0x82, 0x4F, 0xF9, 3 | 0x10, 0x89, 0xFF, 0x24, 0x12, 0x09, 0x0C, 0x80, 0x10, 0x7C, 0xD6, 0xD2, 4 | 0xD0, 0xF0, 0x38, 0x1E, 0x17, 0x93, 0x93, 0xD6, 0x7C, 0x10, 0x38, 0x43, 5 | 0x3C, 0x39, 0x21, 0x8A, 0x0C, 0x50, 0x65, 0x39, 0xCB, 0x20, 0xB9, 0x05, 6 | 0x88, 0x4C, 0x44, 0x64, 0x21, 0xC0, 0x0E, 0x00, 0xC8, 0x06, 0x40, 0x32, 7 | 0x01, 0xA0, 0x07, 0x78, 0x31, 0x87, 0x88, 0x46, 0x86, 0x34, 0x30, 0xC1, 8 | 0xC7, 0x17, 0xCF, 0x00, 0xFE, 0x08, 0x88, 0x84, 0x63, 0x18, 0xC6, 0x10, 9 | 0x82, 0x08, 0x20, 0x82, 0x08, 0x21, 0x0C, 0x63, 0x18, 0xC4, 0x22, 0x22, 10 | 0x00, 0x63, 0x9A, 0xDC, 0x72, 0xB6, 0x08, 0x08, 0x04, 0x02, 0x01, 0x0F, 11 | 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xD8, 0xF0, 0xF0, 0x08, 0x84, 0x22, 12 | 0x10, 0x8C, 0x42, 0x31, 0x00, 0x1C, 0x31, 0x98, 0xD8, 0x3C, 0x1E, 0x0F, 13 | 0x07, 0x83, 0xC1, 0xE0, 0xD8, 0xC4, 0x61, 0xC0, 0x13, 0x8C, 0x63, 0x18, 14 | 0xC6, 0x31, 0x8C, 0x67, 0x80, 0x3C, 0x4E, 0x86, 0x06, 0x06, 0x04, 0x0C, 15 | 0x08, 0x10, 0x20, 0x41, 0xFE, 0x3C, 0xC6, 0x06, 0x04, 0x1C, 0x3E, 0x07, 16 | 0x03, 0x03, 0x03, 0x06, 0xF8, 0x04, 0x18, 0x71, 0x64, 0xC9, 0xA3, 0x46, 17 | 0xFE, 0x18, 0x30, 0x60, 0x0F, 0x10, 0x20, 0x3C, 0x0E, 0x07, 0x03, 0x03, 18 | 0x03, 0x02, 0x04, 0xF8, 0x07, 0x1C, 0x30, 0x60, 0x60, 0xDC, 0xE6, 0xC3, 19 | 0xC3, 0xC3, 0x43, 0x66, 0x3C, 0x7F, 0x82, 0x02, 0x02, 0x04, 0x04, 0x04, 20 | 0x08, 0x08, 0x08, 0x10, 0x10, 0x3C, 0x8F, 0x1E, 0x3E, 0x4F, 0x06, 0x36, 21 | 0xC7, 0x8F, 0x1B, 0x33, 0xC0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0xC3, 22 | 0x63, 0x3F, 0x06, 0x06, 0x0C, 0x38, 0x60, 0xF0, 0x0F, 0xD8, 0x00, 0x03, 23 | 0x28, 0x01, 0x87, 0x0E, 0x1C, 0x0C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0x80, 24 | 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xF8, 0x80, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 25 | 0xC0, 0xE0, 0xE0, 0xE0, 0xC0, 0x00, 0x79, 0x1A, 0x18, 0x30, 0x60, 0x83, 26 | 0x04, 0x10, 0x20, 0x40, 0x03, 0x00, 0x0F, 0x83, 0x8C, 0x60, 0x26, 0x02, 27 | 0xC7, 0x9C, 0xC9, 0xD8, 0x9D, 0x99, 0xD9, 0x26, 0xEC, 0x60, 0x03, 0x04, 28 | 0x0F, 0x80, 0x02, 0x00, 0x10, 0x01, 0xC0, 0x16, 0x00, 0x98, 0x04, 0xC0, 29 | 0x43, 0x03, 0xF8, 0x20, 0x61, 0x03, 0x18, 0x1D, 0xE1, 0xF0, 0xFF, 0x86, 30 | 0x1C, 0xC1, 0x98, 0x33, 0x0C, 0x7E, 0x0C, 0x31, 0x83, 0x30, 0x66, 0x0C, 31 | 0xC3, 0x7F, 0xC0, 0x1F, 0x26, 0x1D, 0x81, 0xE0, 0x1C, 0x01, 0x80, 0x30, 32 | 0x06, 0x00, 0xC0, 0x0C, 0x00, 0xC1, 0x8F, 0xC0, 0xFF, 0x03, 0x1C, 0x30, 33 | 0x63, 0x07, 0x30, 0x33, 0x03, 0x30, 0x33, 0x03, 0x30, 0x33, 0x06, 0x30, 34 | 0xCF, 0xF0, 0xFF, 0x98, 0x26, 0x01, 0x80, 0x61, 0x1F, 0xC6, 0x11, 0x80, 35 | 0x60, 0x18, 0x16, 0x0F, 0xFE, 0xFF, 0xB0, 0x58, 0x0C, 0x06, 0x13, 0xF9, 36 | 0x84, 0xC0, 0x60, 0x30, 0x18, 0x1E, 0x00, 0x1F, 0x23, 0x0E, 0x60, 0x26, 37 | 0x00, 0xC0, 0x0C, 0x0F, 0xC0, 0x6C, 0x06, 0xC0, 0x66, 0x06, 0x30, 0x60, 38 | 0xF8, 0xF1, 0xEC, 0x19, 0x83, 0x30, 0x66, 0x0C, 0xFF, 0x98, 0x33, 0x06, 39 | 0x60, 0xCC, 0x19, 0x83, 0x78, 0xF0, 0xF6, 0x66, 0x66, 0x66, 0x66, 0x6F, 40 | 0x3C, 0x61, 0x86, 0x18, 0x61, 0x86, 0x18, 0x6D, 0xBC, 0xF3, 0xE6, 0x08, 41 | 0x61, 0x06, 0x20, 0x64, 0x07, 0x80, 0x6C, 0x06, 0x60, 0x63, 0x06, 0x18, 42 | 0x60, 0xCF, 0x3F, 0xF0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 43 | 0x80, 0x60, 0x18, 0x16, 0x0B, 0xFE, 0xF0, 0x0E, 0x70, 0x38, 0xE0, 0x71, 44 | 0xE1, 0x62, 0xC2, 0xC5, 0xC9, 0x89, 0x93, 0x13, 0x26, 0x23, 0x8C, 0x47, 45 | 0x18, 0x84, 0x33, 0x88, 0xF0, 0xE0, 0xEE, 0x09, 0xC1, 0x2C, 0x25, 0xC4, 46 | 0x9C, 0x91, 0x92, 0x1A, 0x41, 0xC8, 0x19, 0x03, 0x70, 0x20, 0x1F, 0x06, 47 | 0x31, 0x83, 0x20, 0x2C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x68, 0x09, 48 | 0x83, 0x18, 0xC1, 0xF0, 0xFE, 0x31, 0x98, 0x6C, 0x36, 0x1B, 0x19, 0xF8, 49 | 0xC0, 0x60, 0x30, 0x18, 0x1E, 0x00, 0x1F, 0x06, 0x31, 0x83, 0x20, 0x2C, 50 | 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x68, 0x19, 0x83, 0x18, 0xC0, 0xE0, 51 | 0x0E, 0x00, 0xE0, 0x07, 0xFE, 0x0C, 0x61, 0x86, 0x30, 0xC6, 0x18, 0xC6, 52 | 0x1F, 0x83, 0x70, 0x67, 0x0C, 0x71, 0x87, 0x78, 0x70, 0x1D, 0x31, 0x98, 53 | 0x4C, 0x07, 0x80, 0xE0, 0x1C, 0x07, 0x01, 0xA0, 0xD8, 0xCB, 0xC0, 0xFF, 54 | 0xF8, 0xCE, 0x18, 0x83, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 55 | 0xC0, 0x18, 0x07, 0x80, 0xF0, 0xEC, 0x09, 0x81, 0x30, 0x26, 0x04, 0xC0, 56 | 0x98, 0x13, 0x02, 0x60, 0x4C, 0x08, 0xC2, 0x0F, 0x80, 0xF8, 0x77, 0x02, 57 | 0x30, 0x23, 0x04, 0x18, 0x41, 0x84, 0x0C, 0x80, 0xC8, 0x07, 0x00, 0x70, 58 | 0x02, 0x00, 0x20, 0xFB, 0xE7, 0xB0, 0xC0, 0x8C, 0x20, 0x86, 0x18, 0x41, 59 | 0x8C, 0x40, 0xCB, 0x20, 0x65, 0x90, 0x1A, 0x70, 0x0E, 0x38, 0x03, 0x1C, 60 | 0x01, 0x04, 0x00, 0x82, 0x00, 0xFC, 0xF9, 0x83, 0x06, 0x10, 0x19, 0x00, 61 | 0xD0, 0x03, 0x00, 0x1C, 0x01, 0x30, 0x11, 0xC1, 0x86, 0x08, 0x19, 0xE3, 62 | 0xF0, 0xF8, 0xF6, 0x06, 0x30, 0x41, 0x88, 0x1D, 0x00, 0xD0, 0x06, 0x00, 63 | 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0xF0, 0x3F, 0xCC, 0x11, 0x06, 0x01, 64 | 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x38, 0x06, 0x05, 0xC1, 0x7F, 0xE0, 65 | 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB8, 0x82, 0x10, 0x82, 0x10, 0x86, 0x10, 66 | 0x86, 0x10, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xF8, 0x18, 0x1C, 0x34, 0x26, 67 | 0x62, 0x42, 0xC1, 0xFF, 0x80, 0x84, 0x20, 0x79, 0x98, 0x30, 0xE6, 0xD9, 68 | 0xB3, 0x3F, 0x20, 0x70, 0x18, 0x0C, 0x06, 0x03, 0x71, 0xCC, 0xC3, 0x61, 69 | 0xB0, 0xD8, 0x6C, 0x63, 0xE0, 0x3C, 0xCF, 0x06, 0x0C, 0x18, 0x18, 0x9E, 70 | 0x01, 0x03, 0x80, 0xC0, 0x60, 0x31, 0xD9, 0x9D, 0x86, 0xC3, 0x61, 0xB0, 71 | 0xCC, 0x63, 0xF0, 0x3C, 0x46, 0xFE, 0xC0, 0xC0, 0xE1, 0x62, 0x3C, 0x1E, 72 | 0x41, 0x83, 0x06, 0x1E, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x0F, 0x00, 0x3C, 73 | 0x19, 0xF6, 0x31, 0x8C, 0x1E, 0x08, 0x04, 0x01, 0xFC, 0x40, 0xB0, 0x2E, 74 | 0x11, 0xF8, 0x20, 0x70, 0x18, 0x0C, 0x06, 0x03, 0x71, 0xCC, 0xC6, 0x63, 75 | 0x31, 0x98, 0xCC, 0x6F, 0x78, 0x60, 0x02, 0xE6, 0x66, 0x66, 0xF0, 0x18, 76 | 0x00, 0x33, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8B, 0x80, 0x20, 0x70, 0x18, 77 | 0x0C, 0x06, 0x03, 0x3D, 0x88, 0xD8, 0x78, 0x36, 0x19, 0x8C, 0x6F, 0x78, 78 | 0x2E, 0x66, 0x66, 0x66, 0x66, 0x66, 0xF0, 0xEE, 0x71, 0xCE, 0x66, 0x31, 79 | 0x98, 0xC6, 0x63, 0x19, 0x8C, 0x66, 0x31, 0xBD, 0xEF, 0xEE, 0x39, 0x98, 80 | 0xCC, 0x66, 0x33, 0x19, 0x8D, 0xEF, 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1E, 81 | 0x0D, 0x8C, 0x7C, 0xEE, 0x39, 0x98, 0x6C, 0x36, 0x1B, 0x0D, 0x8C, 0xFC, 82 | 0x60, 0x30, 0x18, 0x1E, 0x00, 0x3D, 0x31, 0xB0, 0xD8, 0x6C, 0x36, 0x1B, 83 | 0x8C, 0xFE, 0x03, 0x01, 0x80, 0xC0, 0xF0, 0x6D, 0xC6, 0x18, 0x61, 0x86, 84 | 0x3C, 0x76, 0x38, 0x58, 0x3E, 0x38, 0xFE, 0x27, 0x98, 0xC6, 0x31, 0x8C, 85 | 0x38, 0xE7, 0x31, 0x98, 0xCC, 0x66, 0x33, 0x19, 0x8C, 0x7F, 0xF3, 0x61, 86 | 0x22, 0x32, 0x14, 0x1C, 0x08, 0x08, 0xEF, 0x36, 0x61, 0x62, 0x22, 0x32, 87 | 0x35, 0x41, 0x9C, 0x18, 0x81, 0x08, 0xF7, 0x12, 0x0E, 0x03, 0x01, 0xC1, 88 | 0x21, 0x09, 0xCF, 0xF3, 0x61, 0x62, 0x32, 0x34, 0x14, 0x1C, 0x08, 0x08, 89 | 0x08, 0x10, 0xE0, 0xFD, 0x18, 0x60, 0x83, 0x0C, 0x70, 0xFE, 0x19, 0x8C, 90 | 0x63, 0x18, 0xC4, 0x61, 0x8C, 0x63, 0x18, 0xC3, 0xFF, 0xF0, 0xC3, 0x18, 91 | 0xC6, 0x31, 0x84, 0x33, 0x18, 0xC6, 0x31, 0x98, 0x70, 0x24, 0xC1, 0xC0}; 92 | 93 | const GFXglyph FreeSerif9pt7bGlyphs[] PROGMEM = { 94 | {0, 0, 0, 5, 0, 1}, // 0x20 ' ' 95 | {0, 2, 12, 6, 2, -11}, // 0x21 '!' 96 | {3, 5, 4, 7, 1, -11}, // 0x22 '"' 97 | {6, 9, 12, 9, 0, -11}, // 0x23 '#' 98 | {20, 8, 14, 9, 1, -12}, // 0x24 '$' 99 | {34, 13, 12, 15, 1, -11}, // 0x25 '%' 100 | {54, 13, 13, 14, 1, -12}, // 0x26 '&' 101 | {76, 2, 4, 4, 1, -11}, // 0x27 ''' 102 | {77, 5, 15, 6, 1, -11}, // 0x28 '(' 103 | {87, 5, 15, 6, 0, -11}, // 0x29 ')' 104 | {97, 6, 8, 9, 3, -11}, // 0x2A '*' 105 | {103, 9, 9, 10, 0, -8}, // 0x2B '+' 106 | {114, 2, 3, 4, 2, 0}, // 0x2C ',' 107 | {115, 4, 1, 6, 1, -3}, // 0x2D '-' 108 | {116, 2, 2, 5, 1, -1}, // 0x2E '.' 109 | {117, 5, 12, 5, 0, -11}, // 0x2F '/' 110 | {125, 9, 13, 9, 0, -12}, // 0x30 '0' 111 | {140, 5, 13, 9, 2, -12}, // 0x31 '1' 112 | {149, 8, 12, 9, 1, -11}, // 0x32 '2' 113 | {161, 8, 12, 9, 0, -11}, // 0x33 '3' 114 | {173, 7, 12, 9, 1, -11}, // 0x34 '4' 115 | {184, 8, 12, 9, 0, -11}, // 0x35 '5' 116 | {196, 8, 13, 9, 1, -12}, // 0x36 '6' 117 | {209, 8, 12, 9, 0, -11}, // 0x37 '7' 118 | {221, 7, 13, 9, 1, -12}, // 0x38 '8' 119 | {233, 8, 14, 9, 1, -12}, // 0x39 '9' 120 | {247, 2, 8, 5, 1, -7}, // 0x3A ':' 121 | {249, 3, 10, 5, 1, -7}, // 0x3B ';' 122 | {253, 9, 9, 10, 1, -8}, // 0x3C '<' 123 | {264, 9, 5, 10, 1, -6}, // 0x3D '=' 124 | {270, 10, 9, 10, 0, -8}, // 0x3E '>' 125 | {282, 7, 13, 8, 1, -12}, // 0x3F '?' 126 | {294, 12, 13, 16, 2, -12}, // 0x40 '@' 127 | {314, 13, 12, 13, 0, -11}, // 0x41 'A' 128 | {334, 11, 12, 11, 0, -11}, // 0x42 'B' 129 | {351, 11, 12, 12, 1, -11}, // 0x43 'C' 130 | {368, 12, 12, 13, 0, -11}, // 0x44 'D' 131 | {386, 10, 12, 11, 1, -11}, // 0x45 'E' 132 | {401, 9, 12, 10, 1, -11}, // 0x46 'F' 133 | {415, 12, 12, 13, 1, -11}, // 0x47 'G' 134 | {433, 11, 12, 13, 1, -11}, // 0x48 'H' 135 | {450, 4, 12, 6, 1, -11}, // 0x49 'I' 136 | {456, 6, 12, 7, 0, -11}, // 0x4A 'J' 137 | {465, 12, 12, 13, 1, -11}, // 0x4B 'K' 138 | {483, 10, 12, 11, 1, -11}, // 0x4C 'L' 139 | {498, 15, 12, 16, 0, -11}, // 0x4D 'M' 140 | {521, 11, 12, 13, 1, -11}, // 0x4E 'N' 141 | {538, 11, 13, 13, 1, -12}, // 0x4F 'O' 142 | {556, 9, 12, 10, 1, -11}, // 0x50 'P' 143 | {570, 11, 16, 13, 1, -12}, // 0x51 'Q' 144 | {592, 11, 12, 12, 1, -11}, // 0x52 'R' 145 | {609, 9, 12, 10, 0, -11}, // 0x53 'S' 146 | {623, 11, 12, 11, 0, -11}, // 0x54 'T' 147 | {640, 11, 12, 13, 1, -11}, // 0x55 'U' 148 | {657, 12, 12, 13, 0, -11}, // 0x56 'V' 149 | {675, 17, 12, 17, 0, -11}, // 0x57 'W' 150 | {701, 13, 12, 13, 0, -11}, // 0x58 'X' 151 | {721, 12, 12, 13, 0, -11}, // 0x59 'Y' 152 | {739, 11, 12, 11, 0, -11}, // 0x5A 'Z' 153 | {756, 3, 15, 6, 2, -11}, // 0x5B '[' 154 | {762, 5, 12, 5, 0, -11}, // 0x5C '\' 155 | {770, 3, 15, 6, 1, -11}, // 0x5D ']' 156 | {776, 8, 7, 8, 0, -11}, // 0x5E '^' 157 | {783, 9, 1, 9, 0, 2}, // 0x5F '_' 158 | {785, 4, 3, 5, 0, -11}, // 0x60 '`' 159 | {787, 7, 8, 8, 1, -7}, // 0x61 'a' 160 | {794, 9, 13, 9, 0, -12}, // 0x62 'b' 161 | {809, 7, 8, 8, 0, -7}, // 0x63 'c' 162 | {816, 9, 13, 9, 0, -12}, // 0x64 'd' 163 | {831, 8, 8, 8, 0, -7}, // 0x65 'e' 164 | {839, 7, 13, 7, 1, -12}, // 0x66 'f' 165 | {851, 10, 12, 8, 0, -7}, // 0x67 'g' 166 | {866, 9, 13, 9, 0, -12}, // 0x68 'h' 167 | {881, 4, 11, 5, 1, -10}, // 0x69 'i' 168 | {887, 5, 15, 6, 0, -10}, // 0x6A 'j' 169 | {897, 9, 13, 9, 1, -12}, // 0x6B 'k' 170 | {912, 4, 13, 5, 1, -12}, // 0x6C 'l' 171 | {919, 14, 8, 14, 0, -7}, // 0x6D 'm' 172 | {933, 9, 8, 9, 0, -7}, // 0x6E 'n' 173 | {942, 9, 8, 9, 0, -7}, // 0x6F 'o' 174 | {951, 9, 12, 9, 0, -7}, // 0x70 'p' 175 | {965, 9, 12, 9, 0, -7}, // 0x71 'q' 176 | {979, 6, 8, 6, 0, -7}, // 0x72 'r' 177 | {985, 6, 8, 7, 1, -7}, // 0x73 's' 178 | {991, 5, 9, 5, 0, -8}, // 0x74 't' 179 | {997, 9, 8, 9, 0, -7}, // 0x75 'u' 180 | {1006, 8, 8, 8, 0, -7}, // 0x76 'v' 181 | {1014, 12, 8, 12, 0, -7}, // 0x77 'w' 182 | {1026, 9, 8, 9, 0, -7}, // 0x78 'x' 183 | {1035, 8, 12, 8, 0, -7}, // 0x79 'y' 184 | {1047, 7, 8, 7, 1, -7}, // 0x7A 'z' 185 | {1054, 5, 16, 9, 1, -12}, // 0x7B '{' 186 | {1064, 1, 12, 4, 1, -11}, // 0x7C '|' 187 | {1066, 5, 16, 9, 3, -11}, // 0x7D '}' 188 | {1076, 9, 3, 9, 0, -5}}; // 0x7E '~' 189 | 190 | const GFXfont FreeSerif9pt7b PROGMEM = {(uint8_t *)FreeSerif9pt7bBitmaps, 191 | (GFXglyph *)FreeSerif9pt7bGlyphs, 0x20, 192 | 0x7E, 22}; 193 | 194 | // Approx. 1752 bytes 195 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Fonts/FreeSerifBold9pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSerifBold9pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xF4, 0x92, 0x1F, 0xF0, 0xCF, 0x3C, 0xE3, 0x88, 0x13, 0x09, 0x84, 3 | 0xC2, 0x47, 0xF9, 0x90, 0xC8, 0x4C, 0xFF, 0x13, 0x09, 0x0C, 0x86, 0x40, 4 | 0x10, 0x38, 0xD6, 0x92, 0xD2, 0xF0, 0x7C, 0x3E, 0x17, 0x93, 0x93, 0xD6, 5 | 0x7C, 0x10, 0x3C, 0x21, 0xCF, 0x0E, 0x24, 0x30, 0xA0, 0xC5, 0x03, 0x34, 6 | 0xE7, 0x26, 0x40, 0xB9, 0x04, 0xC4, 0x23, 0x30, 0x8C, 0x84, 0x1C, 0x0F, 7 | 0x00, 0xCC, 0x06, 0x60, 0x3E, 0x00, 0xE7, 0x8F, 0x18, 0x9C, 0x8C, 0xE4, 8 | 0xE3, 0xC7, 0x9E, 0x3C, 0x72, 0xFD, 0xE0, 0xFF, 0x80, 0x32, 0x44, 0xCC, 9 | 0xCC, 0xCC, 0xC4, 0x62, 0x10, 0x84, 0x22, 0x33, 0x33, 0x33, 0x32, 0x64, 10 | 0x80, 0x31, 0x6B, 0xB1, 0x8E, 0xD6, 0x8C, 0x00, 0x08, 0x04, 0x02, 0x01, 11 | 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xDF, 0x95, 0x00, 0xFF, 0xFF, 12 | 0x80, 0x0C, 0x21, 0x86, 0x10, 0xC3, 0x08, 0x61, 0x84, 0x30, 0xC0, 0x1C, 13 | 0x33, 0x98, 0xDC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xB1, 0x98, 0xC3, 14 | 0x80, 0x08, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0xBF, 0x3C, 0x3F, 15 | 0x23, 0xC0, 0xE0, 0x70, 0x30, 0x38, 0x18, 0x18, 0x18, 0x5F, 0xDF, 0xE0, 16 | 0x7C, 0x8E, 0x0E, 0x0E, 0x0C, 0x1E, 0x07, 0x03, 0x03, 0x02, 0xE6, 0xF8, 17 | 0x06, 0x0E, 0x0E, 0x3E, 0x2E, 0x4E, 0x8E, 0x8E, 0xFF, 0xFF, 0x0E, 0x0E, 18 | 0x3F, 0x7E, 0x40, 0x40, 0xF8, 0xFC, 0x1E, 0x06, 0x02, 0x02, 0xE4, 0xF8, 19 | 0x07, 0x1C, 0x30, 0x70, 0xFC, 0xE6, 0xE7, 0xE7, 0xE7, 0x67, 0x66, 0x3C, 20 | 0x7F, 0x3F, 0xA0, 0xD0, 0x40, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x04, 0x06, 21 | 0x03, 0x00, 0x3C, 0xC6, 0xC6, 0xC6, 0xFC, 0x7C, 0x3E, 0xCF, 0xC7, 0xC7, 22 | 0xC6, 0x7C, 0x3E, 0x33, 0xB8, 0xDC, 0x7E, 0x3F, 0x1D, 0xCE, 0x7F, 0x07, 23 | 0x07, 0x0F, 0x1C, 0x00, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x37, 0xE5, 24 | 0x40, 0x00, 0x00, 0x70, 0x78, 0x78, 0x78, 0x38, 0x03, 0x80, 0x3C, 0x03, 25 | 0xC0, 0x30, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0xC0, 0x3C, 0x03, 26 | 0xC0, 0x1C, 0x01, 0xC1, 0xE1, 0xE1, 0xE0, 0xE0, 0x00, 0x00, 0x3D, 0x9F, 27 | 0x3E, 0x70, 0xE1, 0x04, 0x08, 0x00, 0x70, 0xE1, 0xC0, 0x0F, 0x81, 0x83, 28 | 0x18, 0xC4, 0x89, 0x9C, 0x4C, 0xE4, 0x67, 0x22, 0x39, 0x22, 0x4F, 0xE3, 29 | 0x00, 0x0C, 0x10, 0x1F, 0x00, 0x02, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00, 30 | 0xB8, 0x05, 0xC0, 0x4F, 0x02, 0x38, 0x3F, 0xE1, 0x07, 0x18, 0x3D, 0xE3, 31 | 0xF0, 0xFF, 0x87, 0x1C, 0xE3, 0x9C, 0x73, 0x9C, 0x7F, 0x0E, 0x71, 0xC7, 32 | 0x38, 0xE7, 0x1C, 0xE7, 0x7F, 0xC0, 0x1F, 0x26, 0x1D, 0xC1, 0xB0, 0x1E, 33 | 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x0E, 0x04, 0xE1, 0x0F, 0xC0, 0xFF, 34 | 0x0E, 0x71, 0xC7, 0x38, 0x77, 0x0E, 0xE1, 0xDC, 0x3B, 0x87, 0x70, 0xCE, 35 | 0x39, 0xC6, 0x7F, 0x80, 0xFF, 0xCE, 0x19, 0xC1, 0x38, 0x87, 0x30, 0xFE, 36 | 0x1C, 0xC3, 0x88, 0x70, 0x2E, 0x0D, 0xC3, 0x7F, 0xE0, 0xFF, 0xDC, 0x37, 37 | 0x05, 0xC4, 0x73, 0x1F, 0xC7, 0x31, 0xC4, 0x70, 0x1C, 0x07, 0x03, 0xE0, 38 | 0x1F, 0x23, 0x0E, 0x70, 0x6E, 0x02, 0xE0, 0x0E, 0x00, 0xE1, 0xFE, 0x0E, 39 | 0x60, 0xE7, 0x0E, 0x38, 0xE0, 0xF8, 0xF9, 0xF7, 0x0E, 0x70, 0xE7, 0x0E, 40 | 0x70, 0xE7, 0xFE, 0x70, 0xE7, 0x0E, 0x70, 0xE7, 0x0E, 0x70, 0xEF, 0x9F, 41 | 0xFB, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 0x1F, 0x0E, 0x0E, 0x0E, 42 | 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xCE, 0xCC, 0x78, 0xF9, 0xF3, 43 | 0x82, 0x1C, 0x20, 0xE2, 0x07, 0x20, 0x3F, 0x01, 0xDC, 0x0E, 0x70, 0x73, 44 | 0xC3, 0x8F, 0x1C, 0x3D, 0xF3, 0xF0, 0xF8, 0x0E, 0x01, 0xC0, 0x38, 0x07, 45 | 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x2E, 0x09, 0xC3, 0x7F, 0xE0, 0xF8, 46 | 0x0F, 0x3C, 0x1E, 0x3C, 0x1E, 0x2E, 0x2E, 0x2E, 0x2E, 0x26, 0x4E, 0x27, 47 | 0x4E, 0x27, 0x4E, 0x23, 0x8E, 0x23, 0x8E, 0x21, 0x0E, 0x71, 0x1F, 0xF0, 48 | 0xEE, 0x09, 0xE1, 0x3E, 0x25, 0xE4, 0x9E, 0x91, 0xD2, 0x1E, 0x43, 0xC8, 49 | 0x39, 0x03, 0x70, 0x20, 0x1F, 0x83, 0x0C, 0x70, 0xEE, 0x07, 0xE0, 0x7E, 50 | 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x77, 0x0E, 0x30, 0xC1, 0xF8, 0xFF, 0x1C, 51 | 0xE7, 0x1D, 0xC7, 0x71, 0xDC, 0xE7, 0xF1, 0xC0, 0x70, 0x1C, 0x07, 0x03, 52 | 0xE0, 0x0F, 0x83, 0x9C, 0x70, 0xE6, 0x06, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 53 | 0x07, 0xE0, 0x76, 0x06, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0x78, 0x03, 0xE0, 54 | 0xFF, 0x07, 0x38, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x38, 0x7E, 0x07, 0x70, 55 | 0x77, 0x87, 0x3C, 0x71, 0xEF, 0x8F, 0x39, 0x47, 0xC1, 0xC0, 0xF0, 0x7C, 56 | 0x3E, 0x0F, 0x83, 0xC3, 0xC6, 0xBC, 0xFF, 0xFC, 0xE3, 0x8E, 0x10, 0xE0, 57 | 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xF0, 58 | 0xF8, 0xEE, 0x09, 0xC1, 0x38, 0x27, 0x04, 0xE0, 0x9C, 0x13, 0x82, 0x70, 59 | 0x4E, 0x08, 0xE2, 0x0F, 0x80, 0xFC, 0x7B, 0xC1, 0x0E, 0x08, 0x70, 0x81, 60 | 0xC4, 0x0E, 0x20, 0x7A, 0x01, 0xD0, 0x0E, 0x80, 0x38, 0x01, 0xC0, 0x04, 61 | 0x00, 0x20, 0x00, 0xFD, 0xFB, 0xDC, 0x38, 0x43, 0x87, 0x10, 0xE1, 0xC4, 62 | 0x38, 0xF2, 0x07, 0x2E, 0x81, 0xD3, 0xA0, 0x34, 0x70, 0x0E, 0x1C, 0x03, 63 | 0x87, 0x00, 0x60, 0x80, 0x10, 0x20, 0xFE, 0xF3, 0xC3, 0x0F, 0x10, 0x39, 64 | 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x01, 0x70, 0x09, 0xC0, 0x8F, 0x08, 0x3D, 65 | 0xF3, 0xF0, 0xFC, 0x7B, 0xC1, 0x8E, 0x08, 0x38, 0x81, 0xE8, 0x07, 0x40, 66 | 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x1F, 0x00, 0xFF, 0xD8, 67 | 0x72, 0x1E, 0x43, 0x80, 0xE0, 0x1C, 0x07, 0x01, 0xC0, 0x38, 0x2E, 0x0F, 68 | 0x83, 0x7F, 0xE0, 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF0, 0xC1, 69 | 0x06, 0x18, 0x20, 0xC3, 0x04, 0x18, 0x60, 0x83, 0x0C, 0xF3, 0x33, 0x33, 70 | 0x33, 0x33, 0x33, 0x33, 0xF0, 0x18, 0x1C, 0x34, 0x26, 0x62, 0x43, 0xC1, 71 | 0xFF, 0x80, 0xC6, 0x30, 0x7C, 0x63, 0xB1, 0xC0, 0xE1, 0xF3, 0x3B, 0x9D, 72 | 0xCE, 0xFF, 0x80, 0xF0, 0x1C, 0x07, 0x01, 0xDC, 0x7B, 0x9C, 0x77, 0x1D, 73 | 0xC7, 0x71, 0xDC, 0x77, 0x39, 0x3C, 0x3C, 0xED, 0x9F, 0x0E, 0x1C, 0x38, 74 | 0x39, 0x3C, 0x07, 0x80, 0xE0, 0x38, 0xEE, 0x77, 0xB8, 0xEE, 0x3B, 0x8E, 75 | 0xE3, 0xB8, 0xE7, 0x78, 0xEF, 0x3C, 0x66, 0xE6, 0xFE, 0xE0, 0xE0, 0xE0, 76 | 0x72, 0x3C, 0x3E, 0xED, 0xC7, 0xC7, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC7, 77 | 0xC0, 0x31, 0xDF, 0xBF, 0x7E, 0xE7, 0x90, 0x60, 0xFC, 0xFE, 0x0C, 0x17, 78 | 0xC0, 0xF0, 0x1C, 0x07, 0x01, 0xDC, 0x7B, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 79 | 0x9C, 0xE7, 0x3B, 0xFF, 0x73, 0x9D, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 80 | 0x1C, 0x71, 0xCF, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x7D, 0xBE, 81 | 0xF0, 0x1C, 0x07, 0x01, 0xCE, 0x71, 0x1C, 0x87, 0x41, 0xF8, 0x77, 0x1C, 82 | 0xE7, 0x1B, 0xEF, 0xF3, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 0xF7, 83 | 0x38, 0xF7, 0xB9, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 84 | 0x39, 0xCE, 0xFF, 0xFE, 0xF7, 0x1E, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 85 | 0x39, 0xCE, 0xFF, 0xC0, 0x3E, 0x31, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E, 86 | 0xC6, 0x3E, 0x00, 0xF7, 0x1E, 0xE7, 0x1D, 0xC7, 0x71, 0xDC, 0x77, 0x1D, 87 | 0xCE, 0x7F, 0x1C, 0x07, 0x01, 0xC0, 0xF8, 0x00, 0x3C, 0x9C, 0xEE, 0x3B, 88 | 0x8E, 0xE3, 0xB8, 0xEE, 0x39, 0xCE, 0x3F, 0x80, 0xE0, 0x38, 0x0E, 0x07, 89 | 0xC0, 0xF7, 0x7B, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xF8, 0x7E, 0x73, 90 | 0xC7, 0x8E, 0x39, 0xB0, 0x10, 0xCF, 0x9C, 0x71, 0xC7, 0x1C, 0x71, 0xD3, 91 | 0x80, 0xF7, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x3F, 92 | 0xC0, 0xFB, 0xB8, 0x8C, 0x87, 0x43, 0xC0, 0xE0, 0x70, 0x10, 0x08, 0x00, 93 | 0xF7, 0xB6, 0x31, 0x73, 0xA3, 0x3A, 0x3D, 0xA3, 0xDC, 0x18, 0xC1, 0x88, 94 | 0x10, 0x80, 0xFB, 0xB8, 0x8E, 0x83, 0x81, 0xC0, 0xF0, 0x98, 0xCE, 0xEF, 95 | 0x80, 0xF7, 0x62, 0x72, 0x34, 0x34, 0x3C, 0x18, 0x18, 0x10, 0x10, 0x10, 96 | 0xE0, 0xE0, 0xFF, 0x1C, 0x70, 0xE3, 0x87, 0x1C, 0x71, 0xFE, 0x19, 0x8C, 97 | 0x63, 0x18, 0xCC, 0x61, 0x8C, 0x63, 0x18, 0xC3, 0xFF, 0xF8, 0xC3, 0x18, 98 | 0xC6, 0x31, 0x86, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xF0, 0x8E}; 99 | 100 | const GFXglyph FreeSerifBold9pt7bGlyphs[] PROGMEM = { 101 | {0, 0, 0, 5, 0, 1}, // 0x20 ' ' 102 | {0, 3, 12, 6, 1, -11}, // 0x21 '!' 103 | {5, 6, 5, 10, 2, -11}, // 0x22 '"' 104 | {9, 9, 13, 9, 0, -12}, // 0x23 '#' 105 | {24, 8, 14, 9, 1, -12}, // 0x24 '$' 106 | {38, 14, 12, 18, 2, -11}, // 0x25 '%' 107 | {59, 13, 12, 15, 1, -11}, // 0x26 '&' 108 | {79, 2, 5, 5, 1, -11}, // 0x27 ''' 109 | {81, 4, 15, 6, 1, -11}, // 0x28 '(' 110 | {89, 4, 15, 6, 1, -11}, // 0x29 ')' 111 | {97, 7, 7, 9, 2, -11}, // 0x2A '*' 112 | {104, 9, 9, 12, 1, -8}, // 0x2B '+' 113 | {115, 3, 6, 4, 1, -2}, // 0x2C ',' 114 | {118, 4, 2, 6, 1, -4}, // 0x2D '-' 115 | {119, 3, 3, 4, 1, -2}, // 0x2E '.' 116 | {121, 6, 13, 5, 0, -11}, // 0x2F '/' 117 | {131, 9, 12, 9, 0, -11}, // 0x30 '0' 118 | {145, 6, 12, 9, 1, -11}, // 0x31 '1' 119 | {154, 9, 12, 9, 0, -11}, // 0x32 '2' 120 | {168, 8, 12, 9, 0, -11}, // 0x33 '3' 121 | {180, 8, 12, 9, 1, -11}, // 0x34 '4' 122 | {192, 8, 12, 9, 1, -11}, // 0x35 '5' 123 | {204, 8, 12, 9, 1, -11}, // 0x36 '6' 124 | {216, 9, 12, 9, 0, -11}, // 0x37 '7' 125 | {230, 8, 12, 9, 1, -11}, // 0x38 '8' 126 | {242, 9, 12, 9, 0, -11}, // 0x39 '9' 127 | {256, 3, 9, 6, 1, -8}, // 0x3A ':' 128 | {260, 3, 12, 6, 2, -8}, // 0x3B ';' 129 | {265, 10, 10, 12, 1, -9}, // 0x3C '<' 130 | {278, 10, 5, 12, 1, -6}, // 0x3D '=' 131 | {285, 10, 10, 12, 1, -8}, // 0x3E '>' 132 | {298, 7, 12, 9, 1, -11}, // 0x3F '?' 133 | {309, 13, 12, 17, 2, -11}, // 0x40 '@' 134 | {329, 13, 12, 13, 0, -11}, // 0x41 'A' 135 | {349, 11, 12, 12, 0, -11}, // 0x42 'B' 136 | {366, 11, 12, 13, 1, -11}, // 0x43 'C' 137 | {383, 11, 12, 13, 1, -11}, // 0x44 'D' 138 | {400, 11, 12, 12, 1, -11}, // 0x45 'E' 139 | {417, 10, 12, 11, 1, -11}, // 0x46 'F' 140 | {432, 12, 12, 14, 1, -11}, // 0x47 'G' 141 | {450, 12, 12, 14, 1, -11}, // 0x48 'H' 142 | {468, 5, 12, 7, 1, -11}, // 0x49 'I' 143 | {476, 8, 14, 9, 0, -11}, // 0x4A 'J' 144 | {490, 13, 12, 14, 1, -11}, // 0x4B 'K' 145 | {510, 11, 12, 12, 1, -11}, // 0x4C 'L' 146 | {527, 16, 12, 17, 0, -11}, // 0x4D 'M' 147 | {551, 11, 12, 13, 1, -11}, // 0x4E 'N' 148 | {568, 12, 12, 14, 1, -11}, // 0x4F 'O' 149 | {586, 10, 12, 11, 1, -11}, // 0x50 'P' 150 | {601, 12, 15, 14, 1, -11}, // 0x51 'Q' 151 | {624, 12, 12, 13, 1, -11}, // 0x52 'R' 152 | {642, 8, 12, 10, 1, -11}, // 0x53 'S' 153 | {654, 12, 12, 12, 0, -11}, // 0x54 'T' 154 | {672, 11, 12, 13, 1, -11}, // 0x55 'U' 155 | {689, 13, 13, 13, 0, -11}, // 0x56 'V' 156 | {711, 18, 12, 18, 0, -11}, // 0x57 'W' 157 | {738, 13, 12, 13, 0, -11}, // 0x58 'X' 158 | {758, 13, 12, 13, 0, -11}, // 0x59 'Y' 159 | {778, 11, 12, 12, 1, -11}, // 0x5A 'Z' 160 | {795, 4, 15, 6, 1, -11}, // 0x5B '[' 161 | {803, 6, 13, 5, 0, -11}, // 0x5C '\' 162 | {813, 4, 15, 6, 1, -11}, // 0x5D ']' 163 | {821, 8, 7, 10, 1, -11}, // 0x5E '^' 164 | {828, 9, 1, 9, 0, 3}, // 0x5F '_' 165 | {830, 4, 3, 6, 0, -12}, // 0x60 '`' 166 | {832, 9, 9, 9, 0, -8}, // 0x61 'a' 167 | {843, 10, 12, 10, 0, -11}, // 0x62 'b' 168 | {858, 7, 9, 8, 0, -8}, // 0x63 'c' 169 | {866, 10, 12, 10, 0, -11}, // 0x64 'd' 170 | {881, 8, 9, 8, 0, -8}, // 0x65 'e' 171 | {890, 7, 12, 7, 0, -11}, // 0x66 'f' 172 | {901, 7, 13, 9, 1, -8}, // 0x67 'g' 173 | {913, 10, 12, 10, 0, -11}, // 0x68 'h' 174 | {928, 5, 12, 5, 0, -11}, // 0x69 'i' 175 | {936, 6, 16, 7, 0, -11}, // 0x6A 'j' 176 | {948, 10, 12, 10, 0, -11}, // 0x6B 'k' 177 | {963, 5, 12, 5, 0, -11}, // 0x6C 'l' 178 | {971, 15, 9, 15, 0, -8}, // 0x6D 'm' 179 | {988, 10, 9, 10, 0, -8}, // 0x6E 'n' 180 | {1000, 9, 9, 9, 0, -8}, // 0x6F 'o' 181 | {1011, 10, 13, 10, 0, -8}, // 0x70 'p' 182 | {1028, 10, 13, 10, 0, -8}, // 0x71 'q' 183 | {1045, 8, 9, 8, 0, -8}, // 0x72 'r' 184 | {1054, 5, 9, 7, 1, -8}, // 0x73 's' 185 | {1060, 6, 11, 6, 0, -10}, // 0x74 't' 186 | {1069, 10, 9, 10, 0, -8}, // 0x75 'u' 187 | {1081, 9, 9, 9, 0, -8}, // 0x76 'v' 188 | {1092, 12, 9, 13, 0, -8}, // 0x77 'w' 189 | {1106, 9, 9, 9, 0, -8}, // 0x78 'x' 190 | {1117, 8, 13, 9, 0, -8}, // 0x79 'y' 191 | {1130, 7, 9, 8, 1, -8}, // 0x7A 'z' 192 | {1138, 5, 16, 7, 0, -12}, // 0x7B '{' 193 | {1148, 1, 13, 4, 1, -11}, // 0x7C '|' 194 | {1150, 5, 16, 7, 2, -12}, // 0x7D '}' 195 | {1160, 8, 2, 9, 1, -4}}; // 0x7E '~' 196 | 197 | const GFXfont FreeSerifBold9pt7b PROGMEM = { 198 | (uint8_t *)FreeSerifBold9pt7bBitmaps, (GFXglyph *)FreeSerifBold9pt7bGlyphs, 199 | 0x20, 0x7E, 22}; 200 | 201 | // Approx. 1834 bytes 202 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Fonts/Org_01.h: -------------------------------------------------------------------------------- 1 | // Org_v01 by Orgdot (www.orgdot.com/aliasfonts). A tiny, 2 | // stylized font with all characters within a 6 pixel height. 3 | 4 | const uint8_t Org_01Bitmaps[] PROGMEM = { 5 | 0xE8, 0xA0, 0x57, 0xD5, 0xF5, 0x00, 0xFD, 0x3E, 0x5F, 0x80, 0x88, 0x88, 6 | 0x88, 0x80, 0xF4, 0xBF, 0x2E, 0x80, 0x80, 0x6A, 0x40, 0x95, 0x80, 0xAA, 7 | 0x80, 0x5D, 0x00, 0xC0, 0xF0, 0x80, 0x08, 0x88, 0x88, 0x00, 0xFC, 0x63, 8 | 0x1F, 0x80, 0xF8, 0xF8, 0x7F, 0x0F, 0x80, 0xF8, 0x7E, 0x1F, 0x80, 0x8C, 9 | 0x7E, 0x10, 0x80, 0xFC, 0x3E, 0x1F, 0x80, 0xFC, 0x3F, 0x1F, 0x80, 0xF8, 10 | 0x42, 0x10, 0x80, 0xFC, 0x7F, 0x1F, 0x80, 0xFC, 0x7E, 0x1F, 0x80, 0x90, 11 | 0xB0, 0x2A, 0x22, 0xF0, 0xF0, 0x88, 0xA8, 0xF8, 0x4E, 0x02, 0x00, 0xFD, 12 | 0x6F, 0x0F, 0x80, 0xFC, 0x7F, 0x18, 0x80, 0xF4, 0x7D, 0x1F, 0x00, 0xFC, 13 | 0x21, 0x0F, 0x80, 0xF4, 0x63, 0x1F, 0x00, 0xFC, 0x3F, 0x0F, 0x80, 0xFC, 14 | 0x3F, 0x08, 0x00, 0xFC, 0x2F, 0x1F, 0x80, 0x8C, 0x7F, 0x18, 0x80, 0xF9, 15 | 0x08, 0x4F, 0x80, 0x78, 0x85, 0x2F, 0x80, 0x8D, 0xB1, 0x68, 0x80, 0x84, 16 | 0x21, 0x0F, 0x80, 0xFD, 0x6B, 0x5A, 0x80, 0xFC, 0x63, 0x18, 0x80, 0xFC, 17 | 0x63, 0x1F, 0x80, 0xFC, 0x7F, 0x08, 0x00, 0xFC, 0x63, 0x3F, 0x80, 0xFC, 18 | 0x7F, 0x29, 0x00, 0xFC, 0x3E, 0x1F, 0x80, 0xF9, 0x08, 0x42, 0x00, 0x8C, 19 | 0x63, 0x1F, 0x80, 0x8C, 0x62, 0xA2, 0x00, 0xAD, 0x6B, 0x5F, 0x80, 0x8A, 20 | 0x88, 0xA8, 0x80, 0x8C, 0x54, 0x42, 0x00, 0xF8, 0x7F, 0x0F, 0x80, 0xEA, 21 | 0xC0, 0x82, 0x08, 0x20, 0x80, 0xD5, 0xC0, 0x54, 0xF8, 0x80, 0xF1, 0xFF, 22 | 0x8F, 0x99, 0xF0, 0xF8, 0x8F, 0x1F, 0x99, 0xF0, 0xFF, 0x8F, 0x6B, 0xA4, 23 | 0xF9, 0x9F, 0x10, 0x8F, 0x99, 0x90, 0xF0, 0x55, 0xC0, 0x8A, 0xF9, 0x90, 24 | 0xF8, 0xFD, 0x63, 0x10, 0xF9, 0x99, 0xF9, 0x9F, 0xF9, 0x9F, 0x80, 0xF9, 25 | 0x9F, 0x20, 0xF8, 0x88, 0x47, 0x1F, 0x27, 0xC8, 0x42, 0x00, 0x99, 0x9F, 26 | 0x99, 0x97, 0x8C, 0x6B, 0xF0, 0x96, 0x69, 0x99, 0x9F, 0x10, 0x2E, 0x8F, 27 | 0x2B, 0x22, 0xF8, 0x89, 0xA8, 0x0F, 0xE0}; 28 | 29 | const GFXglyph Org_01Glyphs[] PROGMEM = {{0, 0, 0, 6, 0, 1}, // 0x20 ' ' 30 | {0, 1, 5, 2, 0, -4}, // 0x21 '!' 31 | {1, 3, 1, 4, 0, -4}, // 0x22 '"' 32 | {2, 5, 5, 6, 0, -4}, // 0x23 '#' 33 | {6, 5, 5, 6, 0, -4}, // 0x24 '$' 34 | {10, 5, 5, 6, 0, -4}, // 0x25 '%' 35 | {14, 5, 5, 6, 0, -4}, // 0x26 '&' 36 | {18, 1, 1, 2, 0, -4}, // 0x27 ''' 37 | {19, 2, 5, 3, 0, -4}, // 0x28 '(' 38 | {21, 2, 5, 3, 0, -4}, // 0x29 ')' 39 | {23, 3, 3, 4, 0, -3}, // 0x2A '*' 40 | {25, 3, 3, 4, 0, -3}, // 0x2B '+' 41 | {27, 1, 2, 2, 0, 0}, // 0x2C ',' 42 | {28, 4, 1, 5, 0, -2}, // 0x2D '-' 43 | {29, 1, 1, 2, 0, 0}, // 0x2E '.' 44 | {30, 5, 5, 6, 0, -4}, // 0x2F '/' 45 | {34, 5, 5, 6, 0, -4}, // 0x30 '0' 46 | {38, 1, 5, 2, 0, -4}, // 0x31 '1' 47 | {39, 5, 5, 6, 0, -4}, // 0x32 '2' 48 | {43, 5, 5, 6, 0, -4}, // 0x33 '3' 49 | {47, 5, 5, 6, 0, -4}, // 0x34 '4' 50 | {51, 5, 5, 6, 0, -4}, // 0x35 '5' 51 | {55, 5, 5, 6, 0, -4}, // 0x36 '6' 52 | {59, 5, 5, 6, 0, -4}, // 0x37 '7' 53 | {63, 5, 5, 6, 0, -4}, // 0x38 '8' 54 | {67, 5, 5, 6, 0, -4}, // 0x39 '9' 55 | {71, 1, 4, 2, 0, -3}, // 0x3A ':' 56 | {72, 1, 4, 2, 0, -3}, // 0x3B ';' 57 | {73, 3, 5, 4, 0, -4}, // 0x3C '<' 58 | {75, 4, 3, 5, 0, -3}, // 0x3D '=' 59 | {77, 3, 5, 4, 0, -4}, // 0x3E '>' 60 | {79, 5, 5, 6, 0, -4}, // 0x3F '?' 61 | {83, 5, 5, 6, 0, -4}, // 0x40 '@' 62 | {87, 5, 5, 6, 0, -4}, // 0x41 'A' 63 | {91, 5, 5, 6, 0, -4}, // 0x42 'B' 64 | {95, 5, 5, 6, 0, -4}, // 0x43 'C' 65 | {99, 5, 5, 6, 0, -4}, // 0x44 'D' 66 | {103, 5, 5, 6, 0, -4}, // 0x45 'E' 67 | {107, 5, 5, 6, 0, -4}, // 0x46 'F' 68 | {111, 5, 5, 6, 0, -4}, // 0x47 'G' 69 | {115, 5, 5, 6, 0, -4}, // 0x48 'H' 70 | {119, 5, 5, 6, 0, -4}, // 0x49 'I' 71 | {123, 5, 5, 6, 0, -4}, // 0x4A 'J' 72 | {127, 5, 5, 6, 0, -4}, // 0x4B 'K' 73 | {131, 5, 5, 6, 0, -4}, // 0x4C 'L' 74 | {135, 5, 5, 6, 0, -4}, // 0x4D 'M' 75 | {139, 5, 5, 6, 0, -4}, // 0x4E 'N' 76 | {143, 5, 5, 6, 0, -4}, // 0x4F 'O' 77 | {147, 5, 5, 6, 0, -4}, // 0x50 'P' 78 | {151, 5, 5, 6, 0, -4}, // 0x51 'Q' 79 | {155, 5, 5, 6, 0, -4}, // 0x52 'R' 80 | {159, 5, 5, 6, 0, -4}, // 0x53 'S' 81 | {163, 5, 5, 6, 0, -4}, // 0x54 'T' 82 | {167, 5, 5, 6, 0, -4}, // 0x55 'U' 83 | {171, 5, 5, 6, 0, -4}, // 0x56 'V' 84 | {175, 5, 5, 6, 0, -4}, // 0x57 'W' 85 | {179, 5, 5, 6, 0, -4}, // 0x58 'X' 86 | {183, 5, 5, 6, 0, -4}, // 0x59 'Y' 87 | {187, 5, 5, 6, 0, -4}, // 0x5A 'Z' 88 | {191, 2, 5, 3, 0, -4}, // 0x5B '[' 89 | {193, 5, 5, 6, 0, -4}, // 0x5C '\' 90 | {197, 2, 5, 3, 0, -4}, // 0x5D ']' 91 | {199, 3, 2, 4, 0, -4}, // 0x5E '^' 92 | {200, 5, 1, 6, 0, 1}, // 0x5F '_' 93 | {201, 1, 1, 2, 0, -4}, // 0x60 '`' 94 | {202, 4, 4, 5, 0, -3}, // 0x61 'a' 95 | {204, 4, 5, 5, 0, -4}, // 0x62 'b' 96 | {207, 4, 4, 5, 0, -3}, // 0x63 'c' 97 | {209, 4, 5, 5, 0, -4}, // 0x64 'd' 98 | {212, 4, 4, 5, 0, -3}, // 0x65 'e' 99 | {214, 3, 5, 4, 0, -4}, // 0x66 'f' 100 | {216, 4, 5, 5, 0, -3}, // 0x67 'g' 101 | {219, 4, 5, 5, 0, -4}, // 0x68 'h' 102 | {222, 1, 4, 2, 0, -3}, // 0x69 'i' 103 | {223, 2, 5, 3, 0, -3}, // 0x6A 'j' 104 | {225, 4, 5, 5, 0, -4}, // 0x6B 'k' 105 | {228, 1, 5, 2, 0, -4}, // 0x6C 'l' 106 | {229, 5, 4, 6, 0, -3}, // 0x6D 'm' 107 | {232, 4, 4, 5, 0, -3}, // 0x6E 'n' 108 | {234, 4, 4, 5, 0, -3}, // 0x6F 'o' 109 | {236, 4, 5, 5, 0, -3}, // 0x70 'p' 110 | {239, 4, 5, 5, 0, -3}, // 0x71 'q' 111 | {242, 4, 4, 5, 0, -3}, // 0x72 'r' 112 | {244, 4, 4, 5, 0, -3}, // 0x73 's' 113 | {246, 5, 5, 6, 0, -4}, // 0x74 't' 114 | {250, 4, 4, 5, 0, -3}, // 0x75 'u' 115 | {252, 4, 4, 5, 0, -3}, // 0x76 'v' 116 | {254, 5, 4, 6, 0, -3}, // 0x77 'w' 117 | {257, 4, 4, 5, 0, -3}, // 0x78 'x' 118 | {259, 4, 5, 5, 0, -3}, // 0x79 'y' 119 | {262, 4, 4, 5, 0, -3}, // 0x7A 'z' 120 | {264, 3, 5, 4, 0, -4}, // 0x7B '{' 121 | {266, 1, 5, 2, 0, -4}, // 0x7C '|' 122 | {267, 3, 5, 4, 0, -4}, // 0x7D '}' 123 | {269, 5, 3, 6, 0, -3}}; // 0x7E '~' 124 | 125 | const GFXfont Org_01 PROGMEM = {(uint8_t *)Org_01Bitmaps, 126 | (GFXglyph *)Org_01Glyphs, 0x20, 0x7E, 7}; 127 | 128 | // Approx. 943 bytes 129 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Fonts/Picopixel.h: -------------------------------------------------------------------------------- 1 | // Picopixel by Sebastian Weber. A tiny font 2 | // with all characters within a 6 pixel height. 3 | 4 | const uint8_t PicopixelBitmaps[] PROGMEM = { 5 | 0xE8, 0xB4, 0x57, 0xD5, 0xF5, 0x00, 0x4E, 0x3E, 0x80, 0xA5, 0x4A, 0x4A, 6 | 0x5A, 0x50, 0xC0, 0x6A, 0x40, 0x95, 0x80, 0xAA, 0x80, 0x5D, 0x00, 0x60, 7 | 0xE0, 0x80, 0x25, 0x48, 0x56, 0xD4, 0x75, 0x40, 0xC5, 0x4E, 0xC5, 0x1C, 8 | 0x97, 0x92, 0xF3, 0x1C, 0x53, 0x54, 0xE5, 0x48, 0x55, 0x54, 0x55, 0x94, 9 | 0xA0, 0x46, 0x64, 0xE3, 0x80, 0x98, 0xC5, 0x04, 0x56, 0xC6, 0x57, 0xDA, 10 | 0xD7, 0x5C, 0x72, 0x46, 0xD6, 0xDC, 0xF3, 0xCE, 0xF3, 0x48, 0x72, 0xD4, 11 | 0xB7, 0xDA, 0xF8, 0x24, 0xD4, 0xBB, 0x5A, 0x92, 0x4E, 0x8E, 0xEB, 0x58, 12 | 0x80, 0x9D, 0xB9, 0x90, 0x56, 0xD4, 0xD7, 0x48, 0x56, 0xD4, 0x40, 0xD7, 13 | 0x5A, 0x71, 0x1C, 0xE9, 0x24, 0xB6, 0xD4, 0xB6, 0xA4, 0x8C, 0x6B, 0x55, 14 | 0x00, 0xB5, 0x5A, 0xB5, 0x24, 0xE5, 0x4E, 0xEA, 0xC0, 0x91, 0x12, 0xD5, 15 | 0xC0, 0x54, 0xF0, 0x90, 0xC7, 0xF0, 0x93, 0x5E, 0x71, 0x80, 0x25, 0xDE, 16 | 0x5E, 0x30, 0x6E, 0x80, 0x77, 0x9C, 0x93, 0x5A, 0xB8, 0x45, 0x60, 0x92, 17 | 0xEA, 0xAA, 0x40, 0xD5, 0x6A, 0xD6, 0x80, 0x55, 0x00, 0xD7, 0x40, 0x75, 18 | 0x90, 0xE8, 0x71, 0xE0, 0xBA, 0x40, 0xB5, 0x80, 0xB5, 0x00, 0x8D, 0x54, 19 | 0xAA, 0x80, 0xAC, 0xE0, 0xE5, 0x70, 0x6A, 0x26, 0xFC, 0xC8, 0xAC, 0x5A}; 20 | 21 | const GFXglyph PicopixelGlyphs[] PROGMEM = {{0, 0, 0, 2, 0, 1}, // 0x20 ' ' 22 | {0, 1, 5, 2, 0, -4}, // 0x21 '!' 23 | {1, 3, 2, 4, 0, -4}, // 0x22 '"' 24 | {2, 5, 5, 6, 0, -4}, // 0x23 '#' 25 | {6, 3, 6, 4, 0, -4}, // 0x24 '$' 26 | {9, 3, 5, 4, 0, -4}, // 0x25 '%' 27 | {11, 4, 5, 5, 0, -4}, // 0x26 '&' 28 | {14, 1, 2, 2, 0, -4}, // 0x27 ''' 29 | {15, 2, 5, 3, 0, -4}, // 0x28 '(' 30 | {17, 2, 5, 3, 0, -4}, // 0x29 ')' 31 | {19, 3, 3, 4, 0, -3}, // 0x2A '*' 32 | {21, 3, 3, 4, 0, -3}, // 0x2B '+' 33 | {23, 2, 2, 3, 0, 0}, // 0x2C ',' 34 | {24, 3, 1, 4, 0, -2}, // 0x2D '-' 35 | {25, 1, 1, 2, 0, 0}, // 0x2E '.' 36 | {26, 3, 5, 4, 0, -4}, // 0x2F '/' 37 | {28, 3, 5, 4, 0, -4}, // 0x30 '0' 38 | {30, 2, 5, 3, 0, -4}, // 0x31 '1' 39 | {32, 3, 5, 4, 0, -4}, // 0x32 '2' 40 | {34, 3, 5, 4, 0, -4}, // 0x33 '3' 41 | {36, 3, 5, 4, 0, -4}, // 0x34 '4' 42 | {38, 3, 5, 4, 0, -4}, // 0x35 '5' 43 | {40, 3, 5, 4, 0, -4}, // 0x36 '6' 44 | {42, 3, 5, 4, 0, -4}, // 0x37 '7' 45 | {44, 3, 5, 4, 0, -4}, // 0x38 '8' 46 | {46, 3, 5, 4, 0, -4}, // 0x39 '9' 47 | {48, 1, 3, 2, 0, -3}, // 0x3A ':' 48 | {49, 2, 4, 3, 0, -3}, // 0x3B ';' 49 | {50, 2, 3, 3, 0, -3}, // 0x3C '<' 50 | {51, 3, 3, 4, 0, -3}, // 0x3D '=' 51 | {53, 2, 3, 3, 0, -3}, // 0x3E '>' 52 | {54, 3, 5, 4, 0, -4}, // 0x3F '?' 53 | {56, 3, 5, 4, 0, -4}, // 0x40 '@' 54 | {58, 3, 5, 4, 0, -4}, // 0x41 'A' 55 | {60, 3, 5, 4, 0, -4}, // 0x42 'B' 56 | {62, 3, 5, 4, 0, -4}, // 0x43 'C' 57 | {64, 3, 5, 4, 0, -4}, // 0x44 'D' 58 | {66, 3, 5, 4, 0, -4}, // 0x45 'E' 59 | {68, 3, 5, 4, 0, -4}, // 0x46 'F' 60 | {70, 3, 5, 4, 0, -4}, // 0x47 'G' 61 | {72, 3, 5, 4, 0, -4}, // 0x48 'H' 62 | {74, 1, 5, 2, 0, -4}, // 0x49 'I' 63 | {75, 3, 5, 4, 0, -4}, // 0x4A 'J' 64 | {77, 3, 5, 4, 0, -4}, // 0x4B 'K' 65 | {79, 3, 5, 4, 0, -4}, // 0x4C 'L' 66 | {81, 5, 5, 6, 0, -4}, // 0x4D 'M' 67 | {85, 4, 5, 5, 0, -4}, // 0x4E 'N' 68 | {88, 3, 5, 4, 0, -4}, // 0x4F 'O' 69 | {90, 3, 5, 4, 0, -4}, // 0x50 'P' 70 | {92, 3, 6, 4, 0, -4}, // 0x51 'Q' 71 | {95, 3, 5, 4, 0, -4}, // 0x52 'R' 72 | {97, 3, 5, 4, 0, -4}, // 0x53 'S' 73 | {99, 3, 5, 4, 0, -4}, // 0x54 'T' 74 | {101, 3, 5, 4, 0, -4}, // 0x55 'U' 75 | {103, 3, 5, 4, 0, -4}, // 0x56 'V' 76 | {105, 5, 5, 6, 0, -4}, // 0x57 'W' 77 | {109, 3, 5, 4, 0, -4}, // 0x58 'X' 78 | {111, 3, 5, 4, 0, -4}, // 0x59 'Y' 79 | {113, 3, 5, 4, 0, -4}, // 0x5A 'Z' 80 | {115, 2, 5, 3, 0, -4}, // 0x5B '[' 81 | {117, 3, 5, 4, 0, -4}, // 0x5C '\' 82 | {119, 2, 5, 3, 0, -4}, // 0x5D ']' 83 | {121, 3, 2, 4, 0, -4}, // 0x5E '^' 84 | {122, 4, 1, 4, 0, 1}, // 0x5F '_' 85 | {123, 2, 2, 3, 0, -4}, // 0x60 '`' 86 | {124, 3, 4, 4, 0, -3}, // 0x61 'a' 87 | {126, 3, 5, 4, 0, -4}, // 0x62 'b' 88 | {128, 3, 3, 4, 0, -2}, // 0x63 'c' 89 | {130, 3, 5, 4, 0, -4}, // 0x64 'd' 90 | {132, 3, 4, 4, 0, -3}, // 0x65 'e' 91 | {134, 2, 5, 3, 0, -4}, // 0x66 'f' 92 | {136, 3, 5, 4, 0, -3}, // 0x67 'g' 93 | {138, 3, 5, 4, 0, -4}, // 0x68 'h' 94 | {140, 1, 5, 2, 0, -4}, // 0x69 'i' 95 | {141, 2, 6, 3, 0, -4}, // 0x6A 'j' 96 | {143, 3, 5, 4, 0, -4}, // 0x6B 'k' 97 | {145, 2, 5, 3, 0, -4}, // 0x6C 'l' 98 | {147, 5, 3, 6, 0, -2}, // 0x6D 'm' 99 | {149, 3, 3, 4, 0, -2}, // 0x6E 'n' 100 | {151, 3, 3, 4, 0, -2}, // 0x6F 'o' 101 | {153, 3, 4, 4, 0, -2}, // 0x70 'p' 102 | {155, 3, 4, 4, 0, -2}, // 0x71 'q' 103 | {157, 2, 3, 3, 0, -2}, // 0x72 'r' 104 | {158, 3, 4, 4, 0, -3}, // 0x73 's' 105 | {160, 2, 5, 3, 0, -4}, // 0x74 't' 106 | {162, 3, 3, 4, 0, -2}, // 0x75 'u' 107 | {164, 3, 3, 4, 0, -2}, // 0x76 'v' 108 | {166, 5, 3, 6, 0, -2}, // 0x77 'w' 109 | {168, 3, 3, 4, 0, -2}, // 0x78 'x' 110 | {170, 3, 4, 4, 0, -2}, // 0x79 'y' 111 | {172, 3, 4, 4, 0, -3}, // 0x7A 'z' 112 | {174, 3, 5, 4, 0, -4}, // 0x7B '{' 113 | {176, 1, 6, 2, 0, -4}, // 0x7C '|' 114 | {177, 3, 5, 4, 0, -4}, // 0x7D '}' 115 | {179, 4, 2, 5, 0, -3}}; // 0x7E '~' 116 | 117 | const GFXfont Picopixel PROGMEM = {(uint8_t *)PicopixelBitmaps, 118 | (GFXglyph *)PicopixelGlyphs, 0x20, 0x7E, 7}; 119 | 120 | // Approx. 852 bytes 121 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/Fonts/Tiny3x3a2pt7b.h: -------------------------------------------------------------------------------- 1 | /** 2 | ** The FontStruction “Tiny3x3a” 3 | ** (https://fontstruct.com/fontstructions/show/670512) by “Michaelangel007” is 4 | ** licensed under a Creative Commons Attribution Non-commercial Share Alike 5 | *license 6 | ** (http://creativecommons.org/licenses/by-nc-sa/3.0/). 7 | ** “Tiny3x3a” was originally cloned (copied) from the FontStruction 8 | ** “CHECKER” (https://fontstruct.com/fontstructions/show/2391) by Wolf grant 9 | ** Grant, which is licensed under a Creative Commons Attribution Non-commercial 10 | ** Share Alike license (http://creativecommons.org/licenses/by-nc-sa/3.0/). 11 | * 12 | * Converted by eadmaster with fontconvert 13 | **/ 14 | 15 | const uint8_t Tiny3x3a2pt7bBitmaps[] PROGMEM = { 16 | 0xC0, 0xB4, 0xBF, 0x80, 0x6B, 0x00, 0xDD, 0x80, 0x59, 0x80, 0x80, 0x64, 17 | 0x98, 0xF0, 0x5D, 0x00, 0xC0, 0xE0, 0x80, 0x2A, 0x00, 0x55, 0x00, 0x94, 18 | 0xC9, 0x80, 0xEF, 0x80, 0xBC, 0x80, 0x6B, 0x00, 0x9F, 0x80, 0xE4, 0x80, 19 | 0x7F, 0x00, 0xFC, 0x80, 0xA0, 0x58, 0x64, 0xE3, 0x80, 0x98, 0xD8, 0xD8, 20 | 0x80, 0x5E, 0x80, 0xDF, 0x80, 0x71, 0x80, 0xD7, 0x00, 0xFB, 0x80, 0xFA, 21 | 0x00, 0xD7, 0x80, 0xBE, 0x80, 0xE0, 0x27, 0x00, 0xBA, 0x80, 0x93, 0x80, 22 | 0xFE, 0x80, 0xF6, 0x80, 0xF7, 0x80, 0xFE, 0x00, 0xF7, 0x00, 0xDE, 0x80, 23 | 0x6B, 0x00, 0xE9, 0x00, 0xB7, 0x80, 0xB5, 0x00, 0xBF, 0x80, 0xAA, 0x80, 24 | 0xA9, 0x00, 0xEB, 0x80, 0xEC, 0x88, 0x80, 0xDC, 0x54, 0xE0, 0x90, 0x70, 25 | 0xBC, 0xF0, 0x7C, 0xB0, 0x68, 0xFC, 0xBC, 0xC0, 0x58, 0x9A, 0x80, 0xA4, 26 | 0xDC, 0xD4, 0xF0, 0xF8, 0xF4, 0xE0, 0x60, 0x59, 0x80, 0xBC, 0xA8, 0xEC, 27 | 0xF0, 0xAC, 0x80, 0x90, 0x79, 0x80, 0xF0, 0xCF, 0x00, 0x78}; 28 | 29 | const GFXglyph Tiny3x3a2pt7bGlyphs[] PROGMEM = { 30 | {0, 0, 0, 4, 0, 1}, // 0x20 ' ' 31 | {0, 1, 2, 3, 1, -2}, // 0x21 '!' 32 | {1, 3, 2, 4, 0, -2}, // 0x22 '"' 33 | {2, 3, 3, 4, 0, -2}, // 0x23 '#' 34 | {4, 3, 3, 4, 0, -2}, // 0x24 '$' 35 | {6, 3, 3, 4, 0, -2}, // 0x25 '%' 36 | {8, 3, 3, 4, 0, -2}, // 0x26 '&' 37 | {10, 1, 1, 3, 1, -2}, // 0x27 ''' 38 | {11, 2, 3, 3, 0, -2}, // 0x28 '(' 39 | {12, 2, 3, 4, 1, -2}, // 0x29 ')' 40 | {13, 2, 2, 4, 1, -2}, // 0x2A '*' 41 | {14, 3, 3, 4, 0, -2}, // 0x2B '+' 42 | {16, 1, 2, 2, 0, 0}, // 0x2C ',' 43 | {17, 3, 1, 4, 0, -1}, // 0x2D '-' 44 | {18, 1, 1, 2, 0, 0}, // 0x2E '.' 45 | {19, 3, 3, 4, 0, -2}, // 0x2F '/' 46 | {21, 3, 3, 4, 0, -2}, // 0x30 '0' 47 | {23, 2, 3, 3, 0, -2}, // 0x31 '1' 48 | {24, 3, 3, 4, 0, -2}, // 0x32 '2' 49 | {26, 3, 3, 4, 0, -2}, // 0x33 '3' 50 | {28, 3, 3, 4, 0, -2}, // 0x34 '4' 51 | {30, 3, 3, 4, 0, -2}, // 0x35 '5' 52 | {32, 3, 3, 4, 0, -2}, // 0x36 '6' 53 | {34, 3, 3, 4, 0, -2}, // 0x37 '7' 54 | {36, 3, 3, 4, 0, -2}, // 0x38 '8' 55 | {38, 3, 3, 4, 0, -2}, // 0x39 '9' 56 | {40, 1, 3, 3, 1, -2}, // 0x3A ':' 57 | {41, 2, 3, 3, 0, -1}, // 0x3B ';' 58 | {42, 2, 3, 3, 0, -2}, // 0x3C '<' 59 | {43, 3, 3, 4, 0, -2}, // 0x3D '=' 60 | {45, 2, 3, 4, 1, -2}, // 0x3E '>' 61 | {46, 2, 3, 4, 1, -2}, // 0x3F '?' 62 | {47, 3, 3, 4, 0, -2}, // 0x40 '@' 63 | {49, 3, 3, 4, 0, -2}, // 0x41 'A' 64 | {51, 3, 3, 4, 0, -2}, // 0x42 'B' 65 | {53, 3, 3, 4, 0, -2}, // 0x43 'C' 66 | {55, 3, 3, 4, 0, -2}, // 0x44 'D' 67 | {57, 3, 3, 4, 0, -2}, // 0x45 'E' 68 | {59, 3, 3, 4, 0, -2}, // 0x46 'F' 69 | {61, 3, 3, 4, 0, -2}, // 0x47 'G' 70 | {63, 3, 3, 4, 0, -2}, // 0x48 'H' 71 | {65, 1, 3, 3, 1, -2}, // 0x49 'I' 72 | {66, 3, 3, 4, 0, -2}, // 0x4A 'J' 73 | {68, 3, 3, 4, 0, -2}, // 0x4B 'K' 74 | {70, 3, 3, 4, 0, -2}, // 0x4C 'L' 75 | {72, 3, 3, 4, 0, -2}, // 0x4D 'M' 76 | {74, 3, 3, 4, 0, -2}, // 0x4E 'N' 77 | {76, 3, 3, 4, 0, -2}, // 0x4F 'O' 78 | {78, 3, 3, 4, 0, -2}, // 0x50 'P' 79 | {80, 3, 3, 4, 0, -2}, // 0x51 'Q' 80 | {82, 3, 3, 4, 0, -2}, // 0x52 'R' 81 | {84, 3, 3, 4, 0, -2}, // 0x53 'S' 82 | {86, 3, 3, 4, 0, -2}, // 0x54 'T' 83 | {88, 3, 3, 4, 0, -2}, // 0x55 'U' 84 | {90, 3, 3, 4, 0, -2}, // 0x56 'V' 85 | {92, 3, 3, 4, 0, -2}, // 0x57 'W' 86 | {94, 3, 3, 4, 0, -2}, // 0x58 'X' 87 | {96, 3, 3, 4, 0, -2}, // 0x59 'Y' 88 | {98, 3, 3, 4, 0, -2}, // 0x5A 'Z' 89 | {100, 2, 3, 3, 0, -2}, // 0x5B '[' 90 | {101, 3, 3, 4, 0, -2}, // 0x5C '\' 91 | {103, 2, 3, 4, 1, -2}, // 0x5D ']' 92 | {104, 3, 2, 4, 0, -2}, // 0x5E '^' 93 | {105, 3, 1, 4, 0, 0}, // 0x5F '_' 94 | {106, 2, 2, 3, 0, -2}, // 0x60 '`' 95 | {107, 2, 2, 3, 0, -1}, // 0x61 'a' 96 | {108, 2, 3, 3, 0, -2}, // 0x62 'b' 97 | {109, 2, 2, 3, 0, -1}, // 0x63 'c' 98 | {110, 2, 3, 3, 0, -2}, // 0x64 'd' 99 | {111, 2, 2, 3, 0, -1}, // 0x65 'e' 100 | {112, 2, 3, 3, 0, -2}, // 0x66 'f' 101 | {113, 2, 3, 3, 0, -1}, // 0x67 'g' 102 | {114, 2, 3, 3, 0, -2}, // 0x68 'h' 103 | {115, 1, 2, 2, 0, -1}, // 0x69 'i' 104 | {116, 2, 3, 3, 0, -1}, // 0x6A 'j' 105 | {117, 3, 3, 4, 0, -2}, // 0x6B 'k' 106 | {119, 2, 3, 3, 0, -2}, // 0x6C 'l' 107 | {120, 3, 2, 4, 0, -1}, // 0x6D 'm' 108 | {121, 3, 2, 4, 0, -1}, // 0x6E 'n' 109 | {122, 2, 2, 3, 0, -1}, // 0x6F 'o' 110 | {123, 2, 3, 3, 0, -1}, // 0x70 'p' 111 | {124, 2, 3, 3, 0, -1}, // 0x71 'q' 112 | {125, 2, 2, 3, 0, -1}, // 0x72 'r' 113 | {126, 2, 2, 3, 0, -1}, // 0x73 's' 114 | {127, 3, 3, 4, 0, -2}, // 0x74 't' 115 | {129, 3, 2, 4, 0, -1}, // 0x75 'u' 116 | {130, 3, 2, 4, 0, -1}, // 0x76 'v' 117 | {131, 3, 2, 4, 0, -1}, // 0x77 'w' 118 | {132, 2, 2, 3, 0, -1}, // 0x78 'x' 119 | {133, 3, 3, 4, 0, -1}, // 0x79 'y' 120 | {135, 2, 2, 3, 0, -1}, // 0x7A 'z' 121 | {136, 3, 3, 4, 0, -2}, // 0x7B '{' 122 | {138, 1, 4, 3, 1, -2}, // 0x7C '|' 123 | {139, 3, 3, 4, 0, -2}, // 0x7D '}' 124 | {141, 3, 2, 4, 0, -2}}; // 0x7E '~' 125 | 126 | const GFXfont Tiny3x3a2pt7b PROGMEM = {(uint8_t *)Tiny3x3a2pt7bBitmaps, 127 | (GFXglyph *)Tiny3x3a2pt7bGlyphs, 0x20, 128 | 0x7E, 4}; 129 | 130 | // Approx. 814 bytes 131 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/README.md: -------------------------------------------------------------------------------- 1 | # Adafruit GFX Library ![Build Status](https://github.com/adafruit/Adafruit-GFX-Library/workflows/Arduino%20Library%20CI/badge.svg) 2 | 3 | This is the core graphics library for all our displays, providing a common set of graphics primitives (points, lines, circles, etc.). It needs to be paired with a hardware-specific library for each display device we carry (to handle the lower-level functions). 4 | 5 | Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! 6 | 7 | Written by Limor Fried/Ladyada for Adafruit Industries. 8 | BSD license, check license.txt for more information. 9 | All text above must be included in any redistribution. 10 | 11 | Recent Arduino IDE releases include the Library Manager for easy installation. Otherwise, to download, click the DOWNLOAD ZIP button, uncompress and rename the uncompressed folder Adafruit_GFX. Confirm that the Adafruit_GFX folder contains Adafruit_GFX.cpp and Adafruit_GFX.h. Place the Adafruit_GFX library folder your ArduinoSketchFolder/Libraries/ folder. You may need to create the Libraries subfolder if its your first library. Restart the IDE. 12 | 13 | **You will also need to install the latest Adafruit BusIO library.** Search for "Adafruit BusIO" in the library manager, or install by hand from https://github.com/adafruit/Adafruit_BusIO 14 | 15 | # Useful Resources 16 | 17 | - Image2Code: This is a handy Java GUI utility to convert a BMP file into the array code necessary to display the image with the drawBitmap function. Check out the code at ehubin's GitHub repository: https://github.com/ehubin/Adafruit-GFX-Library/tree/master/Img2Code 18 | 19 | - drawXBitmap function: You can use the GIMP photo editor to save a .xbm file and use the array saved in the file to draw a bitmap with the drawXBitmap function. See the pull request here for more details: https://github.com/adafruit/Adafruit-GFX-Library/pull/31 20 | 21 | - 'Fonts' folder contains bitmap fonts for use with recent (1.1 and later) Adafruit_GFX. To use a font in your Arduino sketch, \#include the corresponding .h file and pass address of GFXfont struct to setFont(). Pass NULL to revert to 'classic' fixed-space bitmap font. 22 | 23 | - 'fontconvert' folder contains a command-line tool for converting TTF fonts to Adafruit_GFX header format. 24 | 25 | - You can also use [this GFX Font Customiser tool](https://github.com/tchapi/Adafruit-GFX-Font-Customiser) (_web version [here](https://tchapi.github.io/Adafruit-GFX-Font-Customiser/)_) to customize or correct the output from [fontconvert](https://github.com/adafruit/Adafruit-GFX-Library/tree/master/fontconvert), and create fonts with only a subset of characters to optimize size. 26 | 27 | --- 28 | 29 | ### Roadmap 30 | 31 | The PRIME DIRECTIVE is to maintain backward compatibility with existing Arduino sketches -- many are hosted elsewhere and don't track changes here, some are in print and can never be changed! This "little" library has grown organically over time and sometimes we paint ourselves into a design corner and just have to live with it or add ungainly workarounds. 32 | 33 | Highly unlikely to merge any changes for additional or incompatible font formats (see Prime Directive above). There are already two formats and the code is quite bloaty there as it is (this also creates liabilities for tools and documentation). If you *must* have a more sophisticated font format, consider creating a fork with the features required for your project. For similar reasons, also unlikely to add any more bitmap formats, it's getting messy. 34 | 35 | Please don't reformat code for the sake of reformatting code. The resulting large "visual diff" makes it impossible to untangle actual bug fixes from merely rearranged lines. 36 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/examples/GFXcanvas/GFXcanvas.ino: -------------------------------------------------------------------------------- 1 | /*** 2 | This example is intended to demonstrate the use of getPixel() versus 3 | getRawPixel() and the fast horizontal and vertical drawing routines 4 | in the GFXcanvas family of classes, 5 | 6 | When using the GFXcanvas* classes as the image buffer for a hardware driver, 7 | there is a need to get individual pixel color values at given physical 8 | coordinates. Rather than subclasses or client classes call getBuffer() and 9 | reinterpret the byte layout of the buffer, two methods are added to each of the 10 | GFXcanvas* classes that allow fetching of specific pixel values. 11 | 12 | * getPixel(x, y) : Gets the pixel color value at the rotated coordinates in 13 | the image. 14 | * getRawPixel(x,y) : Gets the pixel color value at the unrotated coordinates 15 | in the image. This is useful for getting the pixel value to map to a hardware 16 | pixel location. This method was made protected as only the hardware driver 17 | should be accessing it. 18 | 19 | The GFXcanvas*SerialDemo classes in this example will print to Serial the 20 | contents of the underlying GFXcanvas buffer in both the current rotated layout 21 | and the underlying physical layout. 22 | ***/ 23 | 24 | #include "GFXcanvasSerialDemo.h" 25 | #include 26 | 27 | void setup() { 28 | Serial.begin(115200); 29 | 30 | // first create a rectangular GFXcanvas8SerialDemo object and draw to it 31 | GFXcanvas8SerialDemo demo8(21, 11); 32 | 33 | demo8.fillScreen(0x00); 34 | demo8.setRotation(1); // now canvas is 11x21 35 | demo8.fillCircle(5, 10, 5, 0xAA); 36 | demo8.writeFastHLine(0, 0, 11, 0x11); 37 | demo8.writeFastHLine(10, 10, -11, 0x22); 38 | demo8.writeFastHLine(0, 20, 11, 0x33); 39 | demo8.writeFastVLine(0, 0, 21, 0x44); 40 | demo8.writeFastVLine(10, 20, -21, 0x55); 41 | 42 | Serial.println("Demonstrating GFXcanvas rotated and raw pixels.\n"); 43 | 44 | // print it out rotated 45 | 46 | Serial.println("The canvas's content in the rotation of '0':\n"); 47 | demo8.setRotation(0); 48 | demo8.print(true); 49 | Serial.println("\n"); 50 | 51 | Serial.println("The canvas's content in the rotation of '1' (which is what " 52 | "it was drawn in):\n"); 53 | demo8.setRotation(1); 54 | demo8.print(true); 55 | Serial.println("\n"); 56 | 57 | Serial.println("The canvas's content in the rotation of '2':\n"); 58 | demo8.setRotation(2); 59 | demo8.print(true); 60 | Serial.println("\n"); 61 | 62 | Serial.println("The canvas's content in the rotation of '3':\n"); 63 | demo8.setRotation(3); 64 | demo8.print(true); 65 | Serial.println("\n"); 66 | 67 | // print it out unrotated 68 | Serial.println("The canvas's content in it's raw, physical layout:\n"); 69 | demo8.print(false); 70 | Serial.println("\n"); 71 | 72 | // Demonstrate GFXcanvas1SerialDemo 73 | 74 | GFXcanvas1SerialDemo demo1(21, 11); 75 | demo1.fillScreen(0); 76 | demo1.setRotation(0); 77 | demo1.writeFastHLine(0, 0, 9, 1); 78 | demo1.setRotation(1); 79 | demo1.writeFastHLine(0, 0, 9, 1); 80 | demo1.setRotation(2); 81 | demo1.writeFastHLine(0, 0, 9, 1); 82 | demo1.setRotation(3); 83 | demo1.writeFastHLine(0, 0, 9, 1); 84 | demo1.setRotation(1); 85 | demo1.fillRect(3, 8, 5, 5, 1); 86 | 87 | Serial.println("\nThe GFXcanvas1 raw content after drawing a fast horizontal " 88 | "line in each rotation:\n"); 89 | demo1.print(false); 90 | Serial.println("\n"); 91 | 92 | // Demonstrate GFXcanvas16SerialDemo 93 | 94 | GFXcanvas16SerialDemo demo16(21, 11); 95 | demo16.fillScreen(0); 96 | demo16.setRotation(0); 97 | demo16.writeFastHLine(0, 0, 9, 0x1111); 98 | demo16.setRotation(1); 99 | demo16.writeFastHLine(0, 0, 9, 0x2222); 100 | demo16.setRotation(2); 101 | demo16.writeFastHLine(0, 0, 9, 0x3333); 102 | demo16.setRotation(3); 103 | demo16.writeFastHLine(0, 0, 9, 0x4444); 104 | demo16.setRotation(1); 105 | demo16.fillRect(3, 8, 5, 5, 0x8888); 106 | 107 | Serial.println("\nThe GFXcanvas16 raw content after drawing a fast " 108 | "horizontal line in each rotation:\n"); 109 | demo16.print(false); 110 | Serial.println("\n"); 111 | } 112 | 113 | void loop() {} 114 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/examples/GFXcanvas/GFXcanvasSerialDemo.cpp: -------------------------------------------------------------------------------- 1 | #include "GFXcanvasSerialDemo.h" 2 | #include 3 | 4 | GFXcanvas1SerialDemo::GFXcanvas1SerialDemo(uint16_t w, uint16_t h) 5 | : GFXcanvas1(w, h) {} 6 | 7 | void GFXcanvas1SerialDemo::print(bool rotated) { 8 | char pixel_buffer[8]; 9 | uint16_t width, height; 10 | 11 | if (rotated) { 12 | width = this->width(); 13 | height = this->height(); 14 | } else { 15 | width = this->WIDTH; 16 | height = this->HEIGHT; 17 | } 18 | 19 | for (uint16_t y = 0; y < height; y++) { 20 | for (uint16_t x = 0; x < width; x++) { 21 | bool pixel; 22 | if (rotated) { 23 | pixel = this->getPixel(x, y); 24 | } else { 25 | pixel = this->getRawPixel(x, y); 26 | } 27 | sprintf(pixel_buffer, " %d", pixel); 28 | Serial.print(pixel_buffer); 29 | } 30 | Serial.print("\n"); 31 | } 32 | } 33 | 34 | GFXcanvas8SerialDemo::GFXcanvas8SerialDemo(uint16_t w, uint16_t h) 35 | : GFXcanvas8(w, h) {} 36 | 37 | void GFXcanvas8SerialDemo::print(bool rotated) { 38 | char pixel_buffer[8]; 39 | uint16_t width, height; 40 | 41 | if (rotated) { 42 | width = this->width(); 43 | height = this->height(); 44 | } else { 45 | width = this->WIDTH; 46 | height = this->HEIGHT; 47 | } 48 | 49 | for (uint16_t y = 0; y < height; y++) { 50 | for (uint16_t x = 0; x < width; x++) { 51 | uint8_t pixel; 52 | if (rotated) { 53 | pixel = this->getPixel(x, y); 54 | } else { 55 | pixel = this->getRawPixel(x, y); 56 | } 57 | sprintf(pixel_buffer, " %02x", pixel); 58 | Serial.print(pixel_buffer); 59 | } 60 | Serial.print("\n"); 61 | } 62 | } 63 | 64 | GFXcanvas16SerialDemo::GFXcanvas16SerialDemo(uint16_t w, uint16_t h) 65 | : GFXcanvas16(w, h) {} 66 | 67 | void GFXcanvas16SerialDemo::print(bool rotated) { 68 | char pixel_buffer[8]; 69 | uint16_t width, height; 70 | 71 | if (rotated) { 72 | width = this->width(); 73 | height = this->height(); 74 | } else { 75 | width = this->WIDTH; 76 | height = this->HEIGHT; 77 | } 78 | 79 | for (uint16_t y = 0; y < height; y++) { 80 | for (uint16_t x = 0; x < width; x++) { 81 | uint16_t pixel; 82 | if (rotated) { 83 | pixel = this->getPixel(x, y); 84 | } else { 85 | pixel = this->getRawPixel(x, y); 86 | } 87 | sprintf(pixel_buffer, " %04x", pixel); 88 | Serial.print(pixel_buffer); 89 | } 90 | Serial.print("\n"); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/examples/GFXcanvas/GFXcanvasSerialDemo.h: -------------------------------------------------------------------------------- 1 | #ifndef __GFXcanvasSerialDemo__ 2 | #define __GFXcanvasSerialDemo__ 3 | #include 4 | 5 | /**********************************************************************/ 6 | /*! 7 | @brief Demonstrates using the GFXconvas classes as the backing store 8 | for a device driver. 9 | */ 10 | /**********************************************************************/ 11 | class GFXcanvas1SerialDemo : public GFXcanvas1 { 12 | public: 13 | GFXcanvas1SerialDemo(uint16_t w, uint16_t h); 14 | 15 | /**********************************************************************/ 16 | /*! 17 | @brief Prints the current contents of the canvas to Serial 18 | @param rotated true to print according to the current GFX rotation, 19 | false to print to the native rotation of the canvas (or unrotated). 20 | */ 21 | /**********************************************************************/ 22 | void print(bool rotated); 23 | }; 24 | 25 | /**********************************************************************/ 26 | /*! 27 | @brief Demonstrates using the GFXconvas classes as the backing store 28 | for a device driver. 29 | */ 30 | /**********************************************************************/ 31 | class GFXcanvas8SerialDemo : public GFXcanvas8 { 32 | public: 33 | GFXcanvas8SerialDemo(uint16_t w, uint16_t h); 34 | 35 | /**********************************************************************/ 36 | /*! 37 | @brief Prints the current contents of the canvas to Serial 38 | @param rotated true to print according to the current GFX rotation, 39 | false to print to the native rotation of the canvas (or unrotated). 40 | */ 41 | /**********************************************************************/ 42 | void print(bool rotated); 43 | }; 44 | 45 | /**********************************************************************/ 46 | /*! 47 | @brief Demonstrates using the GFXconvas classes as the backing store 48 | for a device driver. 49 | */ 50 | /**********************************************************************/ 51 | class GFXcanvas16SerialDemo : public GFXcanvas16 { 52 | public: 53 | GFXcanvas16SerialDemo(uint16_t w, uint16_t h); 54 | 55 | /**********************************************************************/ 56 | /*! 57 | @brief Prints the current contents of the canvas to Serial 58 | @param rotated true to print according to the current GFX rotation, 59 | false to print to the native rotation of the canvas (or unrotated). 60 | */ 61 | /**********************************************************************/ 62 | void print(bool rotated); 63 | }; 64 | 65 | #endif // __GFXcanvasSerialDemo__ 66 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/examples/mock_ili9341/mock_ili9341.ino: -------------------------------------------------------------------------------- 1 | /*************************************************** 2 | This is our GFX example for the Adafruit ILI9341 Breakout and Shield 3 | ----> http://www.adafruit.com/products/1651 4 | 5 | Check out the links above for our tutorials and wiring diagrams 6 | These displays use SPI to communicate, 4 or 5 pins are required to 7 | interface (RST is optional) 8 | Adafruit invests time and resources providing this open source code, 9 | please support Adafruit and open-source hardware by purchasing 10 | products from Adafruit! 11 | 12 | Written by Limor Fried/Ladyada for Adafruit Industries. 13 | MIT license, all text above must be included in any redistribution 14 | ****************************************************/ 15 | 16 | 17 | #include "SPI.h" 18 | #include "Adafruit_GFX.h" 19 | #include "Adafruit_ILI9341.h" 20 | 21 | // For the Adafruit shield, these are the default. 22 | #define TFT_DC 9 23 | #define TFT_CS 10 24 | 25 | // Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC 26 | Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); 27 | // If using the breakout, change pins as desired 28 | //Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); 29 | 30 | void setup() { 31 | Serial.begin(9600); 32 | Serial.println("ILI9341 Test!"); 33 | 34 | tft.begin(); 35 | 36 | // read diagnostics (optional but can help debug problems) 37 | uint8_t x = tft.readcommand8(ILI9341_RDMODE); 38 | Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX); 39 | x = tft.readcommand8(ILI9341_RDMADCTL); 40 | Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX); 41 | x = tft.readcommand8(ILI9341_RDPIXFMT); 42 | Serial.print("Pixel Format: 0x"); Serial.println(x, HEX); 43 | x = tft.readcommand8(ILI9341_RDIMGFMT); 44 | Serial.print("Image Format: 0x"); Serial.println(x, HEX); 45 | x = tft.readcommand8(ILI9341_RDSELFDIAG); 46 | Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX); 47 | 48 | Serial.println(F("Benchmark Time (microseconds)")); 49 | delay(10); 50 | Serial.print(F("Screen fill ")); 51 | Serial.println(testFillScreen()); 52 | delay(500); 53 | 54 | Serial.print(F("Text ")); 55 | Serial.println(testText()); 56 | delay(3000); 57 | 58 | Serial.print(F("Lines ")); 59 | Serial.println(testLines(ILI9341_CYAN)); 60 | delay(500); 61 | 62 | Serial.print(F("Horiz/Vert Lines ")); 63 | Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE)); 64 | delay(500); 65 | 66 | Serial.print(F("Rectangles (outline) ")); 67 | Serial.println(testRects(ILI9341_GREEN)); 68 | delay(500); 69 | 70 | Serial.print(F("Rectangles (filled) ")); 71 | Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA)); 72 | delay(500); 73 | 74 | Serial.print(F("Circles (filled) ")); 75 | Serial.println(testFilledCircles(10, ILI9341_MAGENTA)); 76 | 77 | Serial.print(F("Circles (outline) ")); 78 | Serial.println(testCircles(10, ILI9341_WHITE)); 79 | delay(500); 80 | 81 | Serial.print(F("Triangles (outline) ")); 82 | Serial.println(testTriangles()); 83 | delay(500); 84 | 85 | Serial.print(F("Triangles (filled) ")); 86 | Serial.println(testFilledTriangles()); 87 | delay(500); 88 | 89 | Serial.print(F("Rounded rects (outline) ")); 90 | Serial.println(testRoundRects()); 91 | delay(500); 92 | 93 | Serial.print(F("Rounded rects (filled) ")); 94 | Serial.println(testFilledRoundRects()); 95 | delay(500); 96 | 97 | Serial.println(F("Done!")); 98 | 99 | } 100 | 101 | 102 | void loop(void) { 103 | for(uint8_t rotation=0; rotation<4; rotation++) { 104 | tft.setRotation(rotation); 105 | testText(); 106 | delay(1000); 107 | } 108 | } 109 | 110 | unsigned long testFillScreen() { 111 | unsigned long start = micros(); 112 | tft.fillScreen(ILI9341_BLACK); 113 | yield(); 114 | tft.fillScreen(ILI9341_RED); 115 | yield(); 116 | tft.fillScreen(ILI9341_GREEN); 117 | yield(); 118 | tft.fillScreen(ILI9341_BLUE); 119 | yield(); 120 | tft.fillScreen(ILI9341_BLACK); 121 | yield(); 122 | return micros() - start; 123 | } 124 | 125 | unsigned long testText() { 126 | tft.fillScreen(ILI9341_BLACK); 127 | unsigned long start = micros(); 128 | tft.setCursor(0, 0); 129 | tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); 130 | tft.println("Hello World!"); 131 | tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2); 132 | tft.println(1234.56); 133 | tft.setTextColor(ILI9341_RED); tft.setTextSize(3); 134 | tft.println(0xDEADBEEF, HEX); 135 | tft.println(); 136 | tft.setTextColor(ILI9341_GREEN); 137 | tft.setTextSize(5); 138 | tft.println("Groop"); 139 | tft.setTextSize(2); 140 | tft.println("I implore thee,"); 141 | tft.setTextSize(1); 142 | tft.println("my foonting turlingdromes."); 143 | tft.println("And hooptiously drangle me"); 144 | tft.println("with crinkly bindlewurdles,"); 145 | tft.println("Or I will rend thee"); 146 | tft.println("in the gobberwarts"); 147 | tft.println("with my blurglecruncheon,"); 148 | tft.println("see if I don't!"); 149 | return micros() - start; 150 | } 151 | 152 | unsigned long testLines(uint16_t color) { 153 | unsigned long start, t; 154 | int x1, y1, x2, y2, 155 | w = tft.width(), 156 | h = tft.height(); 157 | 158 | tft.fillScreen(ILI9341_BLACK); 159 | yield(); 160 | 161 | x1 = y1 = 0; 162 | y2 = h - 1; 163 | start = micros(); 164 | for(x2=0; x20; i-=6) { 249 | i2 = i / 2; 250 | start = micros(); 251 | tft.fillRect(cx-i2, cy-i2, i, i, color1); 252 | t += micros() - start; 253 | // Outlines are not included in timing results 254 | tft.drawRect(cx-i2, cy-i2, i, i, color2); 255 | yield(); 256 | } 257 | 258 | return t; 259 | } 260 | 261 | unsigned long testFilledCircles(uint8_t radius, uint16_t color) { 262 | unsigned long start; 263 | int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; 264 | 265 | tft.fillScreen(ILI9341_BLACK); 266 | start = micros(); 267 | for(x=radius; x10; i-=5) { 321 | start = micros(); 322 | tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, 323 | tft.color565(0, i*10, i*10)); 324 | t += micros() - start; 325 | tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, 326 | tft.color565(i*10, i*10, 0)); 327 | yield(); 328 | } 329 | 330 | return t; 331 | } 332 | 333 | unsigned long testRoundRects() { 334 | unsigned long start; 335 | int w, i, i2, 336 | cx = tft.width() / 2 - 1, 337 | cy = tft.height() / 2 - 1; 338 | 339 | tft.fillScreen(ILI9341_BLACK); 340 | w = min(tft.width(), tft.height()); 341 | start = micros(); 342 | for(i=0; i20; i-=6) { 359 | i2 = i / 2; 360 | tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0)); 361 | yield(); 362 | } 363 | 364 | return micros() - start; 365 | } 366 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/fontconvert/Makefile: -------------------------------------------------------------------------------- 1 | all: fontconvert 2 | 3 | CC = gcc 4 | CFLAGS = -Wall -I/usr/local/include/freetype2 -I/usr/include/freetype2 -I/usr/include 5 | LIBS = -lfreetype 6 | 7 | fontconvert: fontconvert.c 8 | $(CC) $(CFLAGS) $< $(LIBS) -o $@ 9 | strip $@ 10 | 11 | clean: 12 | rm -f fontconvert 13 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/fontconvert/fontconvert.c: -------------------------------------------------------------------------------- 1 | /* 2 | TrueType to Adafruit_GFX font converter. Derived from Peter Jakobs' 3 | Adafruit_ftGFX fork & makefont tool, and Paul Kourany's Adafruit_mfGFX. 4 | 5 | NOT AN ARDUINO SKETCH. This is a command-line tool for preprocessing 6 | fonts to be used with the Adafruit_GFX Arduino library. 7 | 8 | For UNIX-like systems. Outputs to stdout; redirect to header file, e.g.: 9 | ./fontconvert ~/Library/Fonts/FreeSans.ttf 18 > FreeSans18pt7b.h 10 | 11 | REQUIRES FREETYPE LIBRARY. www.freetype.org 12 | 13 | Currently this only extracts the printable 7-bit ASCII chars of a font. 14 | Will eventually extend with some int'l chars a la ftGFX, not there yet. 15 | Keep 7-bit fonts around as an option in that case, more compact. 16 | 17 | See notes at end for glyph nomenclature & other tidbits. 18 | */ 19 | #ifndef ARDUINO 20 | 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include FT_GLYPH_H 26 | #include FT_MODULE_H 27 | #include FT_TRUETYPE_DRIVER_H 28 | #include "../gfxfont.h" // Adafruit_GFX font structures 29 | 30 | #define DPI 141 // Approximate res. of Adafruit 2.8" TFT 31 | 32 | // Accumulate bits for output, with periodic hexadecimal byte write 33 | void enbit(uint8_t value) { 34 | static uint8_t row = 0, sum = 0, bit = 0x80, firstCall = 1; 35 | if (value) 36 | sum |= bit; // Set bit if needed 37 | if (!(bit >>= 1)) { // Advance to next bit, end of byte reached? 38 | if (!firstCall) { // Format output table nicely 39 | if (++row >= 12) { // Last entry on line? 40 | printf(",\n "); // Newline format output 41 | row = 0; // Reset row counter 42 | } else { // Not end of line 43 | printf(", "); // Simple comma delim 44 | } 45 | } 46 | printf("0x%02X", sum); // Write byte value 47 | sum = 0; // Clear for next byte 48 | bit = 0x80; // Reset bit counter 49 | firstCall = 0; // Formatting flag 50 | } 51 | } 52 | 53 | int main(int argc, char *argv[]) { 54 | int i, j, err, size, first = ' ', last = '~', bitmapOffset = 0, x, y, byte; 55 | char *fontName, c, *ptr; 56 | FT_Library library; 57 | FT_Face face; 58 | FT_Glyph glyph; 59 | FT_Bitmap *bitmap; 60 | FT_BitmapGlyphRec *g; 61 | GFXglyph *table; 62 | uint8_t bit; 63 | 64 | // Parse command line. Valid syntaxes are: 65 | // fontconvert [filename] [size] 66 | // fontconvert [filename] [size] [last char] 67 | // fontconvert [filename] [size] [first char] [last char] 68 | // Unless overridden, default first and last chars are 69 | // ' ' (space) and '~', respectively 70 | 71 | if (argc < 3) { 72 | fprintf(stderr, "Usage: %s fontfile size [first] [last]\n", argv[0]); 73 | return 1; 74 | } 75 | 76 | size = atoi(argv[2]); 77 | 78 | if (argc == 4) { 79 | last = atoi(argv[3]); 80 | } else if (argc == 5) { 81 | first = atoi(argv[3]); 82 | last = atoi(argv[4]); 83 | } 84 | 85 | if (last < first) { 86 | i = first; 87 | first = last; 88 | last = i; 89 | } 90 | 91 | ptr = strrchr(argv[1], '/'); // Find last slash in filename 92 | if (ptr) 93 | ptr++; // First character of filename (path stripped) 94 | else 95 | ptr = argv[1]; // No path; font in local dir. 96 | 97 | // Allocate space for font name and glyph table 98 | if ((!(fontName = malloc(strlen(ptr) + 20))) || 99 | (!(table = (GFXglyph *)malloc((last - first + 1) * sizeof(GFXglyph))))) { 100 | fprintf(stderr, "Malloc error\n"); 101 | return 1; 102 | } 103 | 104 | // Derive font table names from filename. Period (filename 105 | // extension) is truncated and replaced with the font size & bits. 106 | strcpy(fontName, ptr); 107 | ptr = strrchr(fontName, '.'); // Find last period (file ext) 108 | if (!ptr) 109 | ptr = &fontName[strlen(fontName)]; // If none, append 110 | // Insert font size and 7/8 bit. fontName was alloc'd w/extra 111 | // space to allow this, we're not sprintfing into Forbidden Zone. 112 | sprintf(ptr, "%dpt%db", size, (last > 127) ? 8 : 7); 113 | // Space and punctuation chars in name replaced w/ underscores. 114 | for (i = 0; (c = fontName[i]); i++) { 115 | if (isspace(c) || ispunct(c)) 116 | fontName[i] = '_'; 117 | } 118 | 119 | // Init FreeType lib, load font 120 | if ((err = FT_Init_FreeType(&library))) { 121 | fprintf(stderr, "FreeType init error: %d", err); 122 | return err; 123 | } 124 | 125 | // Use TrueType engine version 35, without subpixel rendering. 126 | // This improves clarity of fonts since this library does not 127 | // support rendering multiple levels of gray in a glyph. 128 | // See https://github.com/adafruit/Adafruit-GFX-Library/issues/103 129 | FT_UInt interpreter_version = TT_INTERPRETER_VERSION_35; 130 | FT_Property_Set(library, "truetype", "interpreter-version", 131 | &interpreter_version); 132 | 133 | if ((err = FT_New_Face(library, argv[1], 0, &face))) { 134 | fprintf(stderr, "Font load error: %d", err); 135 | FT_Done_FreeType(library); 136 | return err; 137 | } 138 | 139 | // << 6 because '26dot6' fixed-point format 140 | FT_Set_Char_Size(face, size << 6, 0, DPI, 0); 141 | 142 | // Currently all symbols from 'first' to 'last' are processed. 143 | // Fonts may contain WAY more glyphs than that, but this code 144 | // will need to handle encoding stuff to deal with extracting 145 | // the right symbols, and that's not done yet. 146 | // fprintf(stderr, "%ld glyphs\n", face->num_glyphs); 147 | 148 | printf("const uint8_t %sBitmaps[] PROGMEM = {\n ", fontName); 149 | 150 | // Process glyphs and output huge bitmap data array 151 | for (i = first, j = 0; i <= last; i++, j++) { 152 | // MONO renderer provides clean image with perfect crop 153 | // (no wasted pixels) via bitmap struct. 154 | if ((err = FT_Load_Char(face, i, FT_LOAD_TARGET_MONO))) { 155 | fprintf(stderr, "Error %d loading char '%c'\n", err, i); 156 | continue; 157 | } 158 | 159 | if ((err = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_MONO))) { 160 | fprintf(stderr, "Error %d rendering char '%c'\n", err, i); 161 | continue; 162 | } 163 | 164 | if ((err = FT_Get_Glyph(face->glyph, &glyph))) { 165 | fprintf(stderr, "Error %d getting glyph '%c'\n", err, i); 166 | continue; 167 | } 168 | 169 | bitmap = &face->glyph->bitmap; 170 | g = (FT_BitmapGlyphRec *)glyph; 171 | 172 | // Minimal font and per-glyph information is stored to 173 | // reduce flash space requirements. Glyph bitmaps are 174 | // fully bit-packed; no per-scanline pad, though end of 175 | // each character may be padded to next byte boundary 176 | // when needed. 16-bit offset means 64K max for bitmaps, 177 | // code currently doesn't check for overflow. (Doesn't 178 | // check that size & offsets are within bounds either for 179 | // that matter...please convert fonts responsibly.) 180 | table[j].bitmapOffset = bitmapOffset; 181 | table[j].width = bitmap->width; 182 | table[j].height = bitmap->rows; 183 | table[j].xAdvance = face->glyph->advance.x >> 6; 184 | table[j].xOffset = g->left; 185 | table[j].yOffset = 1 - g->top; 186 | 187 | for (y = 0; y < bitmap->rows; y++) { 188 | for (x = 0; x < bitmap->width; x++) { 189 | byte = x / 8; 190 | bit = 0x80 >> (x & 7); 191 | enbit(bitmap->buffer[y * bitmap->pitch + byte] & bit); 192 | } 193 | } 194 | 195 | // Pad end of char bitmap to next byte boundary if needed 196 | int n = (bitmap->width * bitmap->rows) & 7; 197 | if (n) { // Pixel count not an even multiple of 8? 198 | n = 8 - n; // # bits to next multiple 199 | while (n--) 200 | enbit(0); 201 | } 202 | bitmapOffset += (bitmap->width * bitmap->rows + 7) / 8; 203 | 204 | FT_Done_Glyph(glyph); 205 | } 206 | 207 | printf(" };\n\n"); // End bitmap array 208 | 209 | // Output glyph attributes table (one per character) 210 | printf("const GFXglyph %sGlyphs[] PROGMEM = {\n", fontName); 211 | for (i = first, j = 0; i <= last; i++, j++) { 212 | printf(" { %5d, %3d, %3d, %3d, %4d, %4d }", table[j].bitmapOffset, 213 | table[j].width, table[j].height, table[j].xAdvance, table[j].xOffset, 214 | table[j].yOffset); 215 | if (i < last) { 216 | printf(", // 0x%02X", i); 217 | if ((i >= ' ') && (i <= '~')) { 218 | printf(" '%c'", i); 219 | } 220 | putchar('\n'); 221 | } 222 | } 223 | printf(" }; // 0x%02X", last); 224 | if ((last >= ' ') && (last <= '~')) 225 | printf(" '%c'", last); 226 | printf("\n\n"); 227 | 228 | // Output font structure 229 | printf("const GFXfont %s PROGMEM = {\n", fontName); 230 | printf(" (uint8_t *)%sBitmaps,\n", fontName); 231 | printf(" (GFXglyph *)%sGlyphs,\n", fontName); 232 | if (face->size->metrics.height == 0) { 233 | // No face height info, assume fixed width and get from a glyph. 234 | printf(" 0x%02X, 0x%02X, %d };\n\n", first, last, table[0].height); 235 | } else { 236 | printf(" 0x%02X, 0x%02X, %ld };\n\n", first, last, 237 | face->size->metrics.height >> 6); 238 | } 239 | printf("// Approx. %d bytes\n", bitmapOffset + (last - first + 1) * 7 + 7); 240 | // Size estimate is based on AVR struct and pointer sizes; 241 | // actual size may vary. 242 | 243 | FT_Done_FreeType(library); 244 | 245 | return 0; 246 | } 247 | 248 | /* ------------------------------------------------------------------------- 249 | 250 | Character metrics are slightly different from classic GFX & ftGFX. 251 | In classic GFX: cursor position is the upper-left pixel of each 5x7 252 | character; lower extent of most glyphs (except those w/descenders) 253 | is +6 pixels in Y direction. 254 | W/new GFX fonts: cursor position is on baseline, where baseline is 255 | 'inclusive' (containing the bottom-most row of pixels in most symbols, 256 | except those with descenders; ftGFX is one pixel lower). 257 | 258 | Cursor Y will be moved automatically when switching between classic 259 | and new fonts. If you switch fonts, any print() calls will continue 260 | along the same baseline. 261 | 262 | ...........#####.. -- yOffset 263 | ..........######.. 264 | ..........######.. 265 | .........#######.. 266 | ........#########. 267 | * = Cursor pos. ........#########. 268 | .......##########. 269 | ......#####..####. 270 | ......#####..####. 271 | *.#.. .....#####...####. 272 | .#.#. ....############## 273 | #...# ...############### 274 | #...# ...############### 275 | ##### ..#####......##### 276 | #...# .#####.......##### 277 | ====== #...# ====== #*###.........#### ======= Baseline 278 | || xOffset 279 | 280 | glyph->xOffset and yOffset are pixel offsets, in GFX coordinate space 281 | (+Y is down), from the cursor position to the top-left pixel of the 282 | glyph bitmap. i.e. yOffset is typically negative, xOffset is typically 283 | zero but a few glyphs will have other values (even negative xOffsets 284 | sometimes, totally normal). glyph->xAdvance is the distance to move 285 | the cursor on the X axis after drawing the corresponding symbol. 286 | 287 | There's also some changes with regard to 'background' color and new GFX 288 | fonts (classic fonts unchanged). See Adafruit_GFX.cpp for explanation. 289 | */ 290 | 291 | #endif /* !ARDUINO */ 292 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/fontconvert/fontconvert_win.md: -------------------------------------------------------------------------------- 1 | ### A short guide to use fontconvert.c to create your own fonts using MinGW. 2 | 3 | #### STEP 1: INSTALL MinGW 4 | 5 | Install MinGW (Minimalist GNU for Windows) from [MinGW.org](http://www.mingw.org/). 6 | Please read carefully the instructions found on [Getting started page](http://www.mingw.org/wiki/Getting_Started). 7 | I suggest installing with the "Graphical User Interface Installer". 8 | To complete your initial installation you should further install some "packages". 9 | For our purpose you should only install the "Basic Setup" packages. 10 | To do that: 11 | 12 | 1. Open the MinGW Installation Manager 13 | 2. From the left panel click "Basic Setup". 14 | 3. On the right panel choose "mingw32-base", "mingw-gcc-g++", "mingw-gcc-objc" and "msys-base" 15 | and click "Mark for installation" 16 | 4. From the Menu click "Installation" and then "Apply changes". In the pop-up window select "Apply". 17 | 18 | 19 | #### STEP 2: INSTALL Freetype Library 20 | 21 | To read about the freetype project visit [freetype.org](https://www.freetype.org/). 22 | To Download the latest version of freetype go to [download page](http://download.savannah.gnu.org/releases/freetype/) 23 | and choose "freetype-2.7.tar.gz" file (or a newer version if available). 24 | To avoid long cd commands later in the command prompt, I suggest you unzip the file in the C:\ directory. 25 | (I also renamed the folder to "ft27") 26 | Before you build the library it's good to read these articles: 27 | * [Using MSYS with MinGW](http://www.mingw.org/wiki/MSYS) 28 | * [Installation and Use of Supplementary Libraries with MinGW](http://www.mingw.org/wiki/LibraryPathHOWTO) 29 | * [Include Path](http://www.mingw.org/wiki/IncludePathHOWTO) 30 | 31 | Inside the unzipped folder there is another folder named "docs". Open it and read the INSTALL.UNIX (using notepad). 32 | Pay attention to paragraph 3 (Build and Install the Library). So, let's begin the installation. 33 | To give the appropriate commands we will use the MSYS command prompt (not cmd.exe of windows) which is UNIX like. 34 | Follow the path C:\MinGW\msys\1.0 and double click "msys.bat". The command prompt environment appears. 35 | Enter "ft27" directory using the cd commands: 36 | ``` 37 | cd /c 38 | cd ft27 39 | ``` 40 | 41 | and then type one by one the commands: 42 | ``` 43 | ./configure --prefix=/mingw 44 | make 45 | make install 46 | ``` 47 | Once you're finished, go inside "C:\MinGW\include" and there should be a new folder named "freetype2". 48 | That, hopefully, means that you have installed the library correctly !! 49 | 50 | #### STEP 3: Build fontconvert.c 51 | 52 | Before proceeding I suggest you make a copy of Adafruit_GFX_library folder in C:\ directory. 53 | Then, inside "fontconvert" folder open the "makefile" with an editor ( I used notepad++). 54 | Change the commands so in the end the program looks like : 55 | ``` 56 | all: fontconvert 57 | 58 | CC = gcc 59 | CFLAGS = -Wall -I c:/mingw/include/freetype2 60 | LIBS = -lfreetype 61 | 62 | fontconvert: fontconvert.c 63 | $(CC) $(CFLAGS) $< $(LIBS) -o $@ 64 | 65 | clean: 66 | rm -f fontconvert 67 | ``` 68 | Go back in the command prompt and with a cd command enter the fontconvert directory. 69 | ``` 70 | cd /c/adafruit_gfx_library\fontconvert 71 | ``` 72 | Give the command: 73 | ``` 74 | make 75 | ``` 76 | This command will, eventually, create a "fontconvert.exe" file inside fontconvert directory. 77 | 78 | #### STEP 4: Create your own font header files 79 | 80 | Now that you have an executable file, you can use it to create your own fonts to work with Adafruit GFX lib. 81 | So, if we suppose that you already have a .ttf file with your favorite fonts, jump to the command prompt and type: 82 | ``` 83 | ./fontconvert yourfonts.ttf 9 > yourfonts9pt7b.h 84 | ``` 85 | You can read more details at: [learn.adafruit](https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts). 86 | 87 | Taraaaaaammm !! you've just created your new font header file. Put it inside the "Fonts" folder, grab a cup of coffee 88 | and start playing with your Arduino (or whatever else ....)+ display module project. 89 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/fontconvert/makefonts.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Ugly little Bash script, generates a set of .h files for GFX using 4 | # GNU FreeFont sources. There are three fonts: 'Mono' (Courier-like), 5 | # 'Sans' (Helvetica-like) and 'Serif' (Times-like); four styles: regular, 6 | # bold, oblique or italic, and bold+oblique or bold+italic; and four 7 | # sizes: 9, 12, 18 and 24 point. No real error checking or anything, 8 | # this just powers through all the combinations, calling the fontconvert 9 | # utility and redirecting the output to a .h file for each combo. 10 | 11 | # Adafruit_GFX repository does not include the source outline fonts 12 | # (huge zipfile, different license) but they're easily acquired: 13 | # http://savannah.gnu.org/projects/freefont/ 14 | 15 | convert=./fontconvert 16 | inpath=~/Desktop/freefont/ 17 | outpath=../Fonts/ 18 | fonts=(FreeMono FreeSans FreeSerif) 19 | styles=("" Bold Italic BoldItalic Oblique BoldOblique) 20 | sizes=(9 12 18 24) 21 | 22 | for f in ${fonts[*]} 23 | do 24 | for index in ${!styles[*]} 25 | do 26 | st=${styles[$index]} 27 | for si in ${sizes[*]} 28 | do 29 | infile=$inpath$f$st".ttf" 30 | if [ -f $infile ] # Does source combination exist? 31 | then 32 | outfile=$outpath$f$st$si"pt7b.h" 33 | # printf "%s %s %s > %s\n" $convert $infile $si $outfile 34 | $convert $infile $si > $outfile 35 | fi 36 | done 37 | done 38 | done 39 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/gfxfont.h: -------------------------------------------------------------------------------- 1 | // Font structures for newer Adafruit_GFX (1.1 and later). 2 | // Example fonts are included in 'Fonts' directory. 3 | // To use a font in your Arduino sketch, #include the corresponding .h 4 | // file and pass address of GFXfont struct to setFont(). Pass NULL to 5 | // revert to 'classic' fixed-space bitmap font. 6 | 7 | #ifndef _GFXFONT_H_ 8 | #define _GFXFONT_H_ 9 | 10 | /// Font data stored PER GLYPH 11 | typedef struct { 12 | uint16_t bitmapOffset; ///< Pointer into GFXfont->bitmap 13 | uint8_t width; ///< Bitmap dimensions in pixels 14 | uint8_t height; ///< Bitmap dimensions in pixels 15 | uint8_t xAdvance; ///< Distance to advance cursor (x axis) 16 | int8_t xOffset; ///< X dist from cursor pos to UL corner 17 | int8_t yOffset; ///< Y dist from cursor pos to UL corner 18 | } GFXglyph; 19 | 20 | /// Data stored for FONT AS A WHOLE 21 | typedef struct { 22 | uint8_t *bitmap; ///< Glyph bitmaps, concatenated 23 | GFXglyph *glyph; ///< Glyph array 24 | uint16_t first; ///< ASCII extents (first char) 25 | uint16_t last; ///< ASCII extents (last char) 26 | uint8_t yAdvance; ///< Newline distance (y axis) 27 | } GFXfont; 28 | 29 | #endif // _GFXFONT_H_ 30 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/glcdfont.c: -------------------------------------------------------------------------------- 1 | // This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. 2 | // See gfxfont.h for newer custom bitmap font info. 3 | 4 | #ifndef FONT5X7_H 5 | #define FONT5X7_H 6 | 7 | #ifdef __AVR__ 8 | #include 9 | #include 10 | #elif defined(ESP8266) 11 | #include 12 | #elif defined(__IMXRT1052__) || defined(__IMXRT1062__) 13 | // PROGMEM is defefind for T4 to place data in specific memory section 14 | #undef PROGMEM 15 | #define PROGMEM 16 | #else 17 | #define PROGMEM 18 | #endif 19 | 20 | // Standard ASCII 5x7 font 21 | 22 | static const unsigned char font[] PROGMEM = { 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x3E, 0x6B, 24 | 0x4F, 0x6B, 0x3E, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x18, 0x3C, 0x7E, 0x3C, 25 | 0x18, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 26 | 0x18, 0x3C, 0x18, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x18, 0x24, 27 | 0x18, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x30, 0x48, 0x3A, 0x06, 0x0E, 28 | 0x26, 0x29, 0x79, 0x29, 0x26, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x40, 0x7F, 29 | 0x05, 0x25, 0x3F, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x7F, 0x3E, 0x1C, 0x1C, 30 | 0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x5F, 31 | 0x5F, 0x00, 0x5F, 0x5F, 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x66, 0x89, 32 | 0x95, 0x6A, 0x60, 0x60, 0x60, 0x60, 0x60, 0x94, 0xA2, 0xFF, 0xA2, 0x94, 33 | 0x08, 0x04, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x08, 34 | 0x2A, 0x1C, 0x08, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x1E, 0x10, 0x10, 0x10, 35 | 0x10, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x30, 0x38, 0x3E, 0x38, 0x30, 0x06, 36 | 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 37 | 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 38 | 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x23, 0x13, 0x08, 0x64, 0x62, 0x36, 0x49, 39 | 0x56, 0x20, 0x50, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x1C, 0x22, 0x41, 40 | 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, 41 | 0x08, 0x3E, 0x08, 0x08, 0x00, 0x80, 0x70, 0x30, 0x00, 0x08, 0x08, 0x08, 42 | 0x08, 0x08, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 43 | 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x72, 0x49, 44 | 0x49, 0x49, 0x46, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x18, 0x14, 0x12, 0x7F, 45 | 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x41, 46 | 0x21, 0x11, 0x09, 0x07, 0x36, 0x49, 0x49, 0x49, 0x36, 0x46, 0x49, 0x49, 47 | 0x29, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, 48 | 0x00, 0x08, 0x14, 0x22, 0x41, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x41, 49 | 0x22, 0x14, 0x08, 0x02, 0x01, 0x59, 0x09, 0x06, 0x3E, 0x41, 0x5D, 0x59, 50 | 0x4E, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 51 | 0x41, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x49, 0x49, 52 | 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x41, 0x51, 0x73, 53 | 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, 54 | 0x41, 0x3F, 0x01, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 55 | 0x40, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, 56 | 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 57 | 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x26, 0x49, 0x49, 0x49, 0x32, 58 | 0x03, 0x01, 0x7F, 0x01, 0x03, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20, 59 | 0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, 60 | 0x63, 0x03, 0x04, 0x78, 0x04, 0x03, 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 61 | 0x7F, 0x41, 0x41, 0x41, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x41, 0x41, 62 | 0x41, 0x7F, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 63 | 0x00, 0x03, 0x07, 0x08, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x7F, 0x28, 64 | 0x44, 0x44, 0x38, 0x38, 0x44, 0x44, 0x44, 0x28, 0x38, 0x44, 0x44, 0x28, 65 | 0x7F, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x18, 66 | 0xA4, 0xA4, 0x9C, 0x78, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x44, 0x7D, 67 | 0x40, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 68 | 0x00, 0x41, 0x7F, 0x40, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x7C, 0x08, 69 | 0x04, 0x04, 0x78, 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x18, 0x24, 0x24, 70 | 0x18, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x48, 71 | 0x54, 0x54, 0x54, 0x24, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x3C, 0x40, 0x40, 72 | 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x3C, 0x40, 0x30, 0x40, 0x3C, 73 | 0x44, 0x28, 0x10, 0x28, 0x44, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x44, 0x64, 74 | 0x54, 0x4C, 0x44, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x77, 0x00, 75 | 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, 0x02, 0x01, 0x02, 0x04, 0x02, 0x3C, 76 | 0x26, 0x23, 0x26, 0x3C, 0x1E, 0xA1, 0xA1, 0x61, 0x12, 0x3A, 0x40, 0x40, 77 | 0x20, 0x7A, 0x38, 0x54, 0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, 78 | 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut 79 | 0x21, 0x55, 0x54, 0x78, 0x40, 0x20, 0x54, 0x55, 0x79, 0x40, 0x0C, 0x1E, 80 | 0x52, 0x72, 0x12, 0x39, 0x55, 0x55, 0x55, 0x59, 0x39, 0x54, 0x54, 0x54, 81 | 0x59, 0x39, 0x55, 0x54, 0x54, 0x58, 0x00, 0x00, 0x45, 0x7C, 0x41, 0x00, 82 | 0x02, 0x45, 0x7D, 0x42, 0x00, 0x01, 0x45, 0x7C, 0x40, 0x7D, 0x12, 0x11, 83 | 0x12, 0x7D, // A-umlaut 84 | 0xF0, 0x28, 0x25, 0x28, 0xF0, 0x7C, 0x54, 0x55, 0x45, 0x00, 0x20, 0x54, 85 | 0x54, 0x7C, 0x54, 0x7C, 0x0A, 0x09, 0x7F, 0x49, 0x32, 0x49, 0x49, 0x49, 86 | 0x32, 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut 87 | 0x32, 0x4A, 0x48, 0x48, 0x30, 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A, 0x42, 88 | 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x3D, 0x42, 0x42, 0x42, 89 | 0x3D, // O-umlaut 90 | 0x3D, 0x40, 0x40, 0x40, 0x3D, 0x3C, 0x24, 0xFF, 0x24, 0x24, 0x48, 0x7E, 91 | 0x49, 0x43, 0x66, 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0xFF, 0x09, 0x29, 0xF6, 92 | 0x20, 0xC0, 0x88, 0x7E, 0x09, 0x03, 0x20, 0x54, 0x54, 0x79, 0x41, 0x00, 93 | 0x00, 0x44, 0x7D, 0x41, 0x30, 0x48, 0x48, 0x4A, 0x32, 0x38, 0x40, 0x40, 94 | 0x22, 0x7A, 0x00, 0x7A, 0x0A, 0x0A, 0x72, 0x7D, 0x0D, 0x19, 0x31, 0x7D, 95 | 0x26, 0x29, 0x29, 0x2F, 0x28, 0x26, 0x29, 0x29, 0x29, 0x26, 0x30, 0x48, 96 | 0x4D, 0x40, 0x20, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 97 | 0x38, 0x2F, 0x10, 0xC8, 0xAC, 0xBA, 0x2F, 0x10, 0x28, 0x34, 0xFA, 0x00, 98 | 0x00, 0x7B, 0x00, 0x00, 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, 99 | 0x14, 0x08, 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old 100 | // code 101 | 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block 102 | 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block 103 | 0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x14, 0x14, 104 | 0x14, 0xFF, 0x00, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0xF0, 0x10, 105 | 0xF0, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 106 | 0x00, 0xFF, 0x00, 0xFF, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x14, 0x14, 0x17, 107 | 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0x1F, 0x00, 108 | 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 109 | 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x00, 0x00, 0x00, 0xFF, 110 | 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x00, 111 | 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x1F, 112 | 0x10, 0x17, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x17, 0x10, 0x17, 113 | 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, 114 | 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x17, 115 | 0x14, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x10, 116 | 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 117 | 0x1F, 0x14, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x00, 0x00, 0xF0, 0x10, 0xF0, 118 | 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x10, 0x10, 119 | 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 120 | 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 121 | 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x38, 0x44, 0x44, 122 | 0x38, 0x44, 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta 123 | 0x7E, 0x02, 0x02, 0x06, 0x06, 0x02, 0x7E, 0x02, 0x7E, 0x02, 0x63, 0x55, 124 | 0x49, 0x41, 0x63, 0x38, 0x44, 0x44, 0x3C, 0x04, 0x40, 0x7E, 0x20, 0x1E, 125 | 0x20, 0x06, 0x02, 0x7E, 0x02, 0x02, 0x99, 0xA5, 0xE7, 0xA5, 0x99, 0x1C, 126 | 0x2A, 0x49, 0x2A, 0x1C, 0x4C, 0x72, 0x01, 0x72, 0x4C, 0x30, 0x4A, 0x4D, 127 | 0x4D, 0x30, 0x30, 0x48, 0x78, 0x48, 0x30, 0xBC, 0x62, 0x5A, 0x46, 0x3D, 128 | 0x3E, 0x49, 0x49, 0x49, 0x00, 0x7E, 0x01, 0x01, 0x01, 0x7E, 0x2A, 0x2A, 129 | 0x2A, 0x2A, 0x2A, 0x44, 0x44, 0x5F, 0x44, 0x44, 0x40, 0x51, 0x4A, 0x44, 130 | 0x40, 0x40, 0x44, 0x4A, 0x51, 0x40, 0x00, 0x00, 0xFF, 0x01, 0x03, 0xE0, 131 | 0x80, 0xFF, 0x00, 0x00, 0x08, 0x08, 0x6B, 0x6B, 0x08, 0x36, 0x12, 0x36, 132 | 0x24, 0x36, 0x06, 0x0F, 0x09, 0x0F, 0x06, 0x00, 0x00, 0x18, 0x18, 0x00, 133 | 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x40, 0xFF, 0x01, 0x01, 0x00, 0x1F, 134 | 0x01, 0x01, 0x1E, 0x00, 0x19, 0x1D, 0x17, 0x12, 0x00, 0x3C, 0x3C, 0x3C, 135 | 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP 136 | }; 137 | 138 | // allow clean compilation with [-Wunused-const-variable=] and [-Wall] 139 | static inline void avoid_unused_const_variable_compiler_warning(void) { 140 | (void)font; 141 | } 142 | 143 | #endif // FONT5X7_H 144 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/library.properties: -------------------------------------------------------------------------------- 1 | name=Adafruit GFX Library 2 | version=1.10.7 3 | author=Adafruit 4 | maintainer=Adafruit 5 | sentence=Adafruit GFX graphics core library, this is the 'core' class that all our other graphics libraries derive from. 6 | paragraph=Install this library in addition to the display library for your hardware. 7 | category=Display 8 | url=https://github.com/adafruit/Adafruit-GFX-Library 9 | architectures=* 10 | depends=Adafruit BusIO 11 | -------------------------------------------------------------------------------- /lib/Adafruit-GFX/license.txt: -------------------------------------------------------------------------------- 1 | Software License Agreement (BSD License) 2 | 3 | Copyright (c) 2012 Adafruit Industries. All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | - Redistributions of source code must retain the above copyright notice, 9 | this list of conditions and the following disclaimer. 10 | - Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 18 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 19 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 20 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 22 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24 | POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /lib/ESP32Time/.piopm: -------------------------------------------------------------------------------- 1 | {"type": "library", "name": "ESP32Time", "version": "1.0.3", "spec": {"owner": "fbiego", "id": 11703, "name": "ESP32Time", "requirements": null, "url": null}} -------------------------------------------------------------------------------- /lib/ESP32Time/ESP32Time.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | MIT License 3 | 4 | Copyright (c) 2021 Felix Biego 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | */ 24 | 25 | #include "ESP32Time.h" 26 | #include "time.h" 27 | #include 28 | 29 | /*! 30 | @brief Constructor for ESP32Time 31 | */ 32 | ESP32Time::ESP32Time(){} 33 | 34 | /*! 35 | @brief set the internal RTC time 36 | @param sc 37 | second (0-59) 38 | @param mn 39 | minute (0-59) 40 | @param hr 41 | hour of day (0-23) 42 | @param dy 43 | day of month (1-31) 44 | @param mt 45 | month (1-12) 46 | @param yr 47 | year ie 2021 48 | @param ms 49 | microseconds (optional) 50 | */ 51 | void ESP32Time::setTime(int sc, int mn, int hr, int dy, int mt, int yr, int ms) { 52 | // seconds, minute, hour, day, month, year $ microseconds(optional) 53 | // ie setTime(20, 34, 8, 1, 4, 2021) = 8:34:20 1/4/2021 54 | struct tm t = {0}; // Initalize to all 0's 55 | t.tm_year = yr - 1900; // This is year-1900, so 121 = 2021 56 | t.tm_mon = mt - 1; 57 | t.tm_mday = dy; 58 | t.tm_hour = hr; 59 | t.tm_min = mn; 60 | t.tm_sec = sc; 61 | time_t timeSinceEpoch = mktime(&t); 62 | setTime(timeSinceEpoch, ms); 63 | } 64 | 65 | /*! 66 | @brief set the internal RTC time 67 | @param epoch 68 | epoch time in seconds 69 | @param ms 70 | microseconds (optional) 71 | */ 72 | void ESP32Time::setTime(long epoch, int ms) { 73 | struct timeval tv; 74 | tv.tv_sec = epoch; // epoch time (seconds) 75 | tv.tv_usec = ms; // microseconds 76 | settimeofday(&tv, NULL); 77 | } 78 | 79 | /*! 80 | @brief get the internal RTC time as a tm struct 81 | */ 82 | tm ESP32Time::getTimeStruct(){ 83 | struct tm timeinfo; 84 | getLocalTime(&timeinfo); 85 | return timeinfo; 86 | } 87 | 88 | /*! 89 | @brief get the time and date as an Arduino String object 90 | @param mode 91 | true = Long date format 92 | false = Short date format 93 | */ 94 | String ESP32Time::getDateTime(bool mode){ 95 | struct tm timeinfo = getTimeStruct(); 96 | char s[51]; 97 | if (mode) 98 | { 99 | strftime(s, 50, "%A, %B %d %Y %H:%M:%S", &timeinfo); 100 | } 101 | else 102 | { 103 | strftime(s, 50, "%a, %b %d %Y %H:%M:%S", &timeinfo); 104 | } 105 | return String(s); 106 | } 107 | 108 | /*! 109 | @brief get the time and date as an Arduino String object 110 | @param mode 111 | true = Long date format 112 | false = Short date format 113 | */ 114 | String ESP32Time::getTimeDate(bool mode){ 115 | struct tm timeinfo = getTimeStruct(); 116 | char s[51]; 117 | if (mode) 118 | { 119 | strftime(s, 50, "%H:%M:%S %A, %B %d %Y", &timeinfo); 120 | } 121 | else 122 | { 123 | strftime(s, 50, "%H:%M:%S %a, %b %d %Y", &timeinfo); 124 | } 125 | return String(s); 126 | } 127 | 128 | /*! 129 | @brief get the time as an Arduino String object 130 | */ 131 | String ESP32Time::getTime(){ 132 | struct tm timeinfo = getTimeStruct(); 133 | char s[51]; 134 | strftime(s, 50, "%H:%M:%S", &timeinfo); 135 | return String(s); 136 | } 137 | 138 | /*! 139 | @brief get the time as an Arduino String object with the specified format 140 | @param format 141 | time format 142 | http://www.cplusplus.com/reference/ctime/strftime/ 143 | */ 144 | String ESP32Time::getTime(String format){ 145 | struct tm timeinfo = getTimeStruct(); 146 | char s[128]; 147 | char c[128]; 148 | format.toCharArray(c, 127); 149 | strftime(s, 127, c, &timeinfo); 150 | return String(s); 151 | } 152 | 153 | /*! 154 | @brief get the date as an Arduino String object 155 | @param mode 156 | true = Long date format 157 | false = Short date format 158 | */ 159 | String ESP32Time::getDate(bool mode){ 160 | struct tm timeinfo = getTimeStruct(); 161 | char s[51]; 162 | if (mode) 163 | { 164 | strftime(s, 50, "%A, %B %d %Y", &timeinfo); 165 | } 166 | else 167 | { 168 | strftime(s, 50, "%a, %b %d %Y", &timeinfo); 169 | } 170 | return String(s); 171 | } 172 | 173 | /*! 174 | @brief get the current milliseconds as long 175 | */ 176 | long ESP32Time::getMillis(){ 177 | struct timeval tv; 178 | gettimeofday(&tv, NULL); 179 | return tv.tv_usec/1000; 180 | } 181 | 182 | /*! 183 | @brief get the current microseconds as long 184 | */ 185 | long ESP32Time::getMicros(){ 186 | struct timeval tv; 187 | gettimeofday(&tv, NULL); 188 | return tv.tv_usec; 189 | } 190 | 191 | /*! 192 | @brief get the current epoch seconds as long 193 | */ 194 | long ESP32Time::getEpoch(){ 195 | struct timeval tv; 196 | gettimeofday(&tv, NULL); 197 | return tv.tv_sec; 198 | } 199 | 200 | /*! 201 | @brief get the current seconds as int 202 | */ 203 | int ESP32Time::getSecond(){ 204 | struct tm timeinfo = getTimeStruct(); 205 | return timeinfo.tm_sec; 206 | } 207 | 208 | /*! 209 | @brief get the current minutes as int 210 | */ 211 | int ESP32Time::getMinute(){ 212 | struct tm timeinfo = getTimeStruct(); 213 | return timeinfo.tm_min; 214 | } 215 | 216 | /*! 217 | @brief get the current hour as int 218 | @param mode 219 | true = 24 hour mode (0-23) 220 | false = 12 hour mode (0-12) 221 | */ 222 | int ESP32Time::getHour(bool mode){ 223 | struct tm timeinfo = getTimeStruct(); 224 | if (mode) 225 | { 226 | return timeinfo.tm_hour; 227 | } 228 | else 229 | { 230 | int hour = timeinfo.tm_hour; 231 | if (hour > 12) 232 | { 233 | return timeinfo.tm_hour-12; 234 | } 235 | else 236 | { 237 | return timeinfo.tm_hour; 238 | } 239 | 240 | } 241 | } 242 | 243 | /*! 244 | @brief return current hour am or pm 245 | @param lowercase 246 | true = lowercase 247 | false = uppercase 248 | */ 249 | String ESP32Time::getAmPm(bool lowercase){ 250 | struct tm timeinfo = getTimeStruct(); 251 | if (timeinfo.tm_hour >= 12) 252 | { 253 | if (lowercase) 254 | { 255 | return "pm"; 256 | } 257 | else 258 | { 259 | return "PM"; 260 | } 261 | } 262 | else 263 | { 264 | if (lowercase) 265 | { 266 | return "am"; 267 | } 268 | else 269 | { 270 | return "AM"; 271 | } 272 | } 273 | } 274 | 275 | /*! 276 | @brief get the current day as int (1-31) 277 | */ 278 | int ESP32Time::getDay(){ 279 | struct tm timeinfo = getTimeStruct(); 280 | return timeinfo.tm_mday; 281 | } 282 | 283 | /*! 284 | @brief get the current day of week as int (0-6) 285 | */ 286 | int ESP32Time::getDayofWeek(){ 287 | struct tm timeinfo = getTimeStruct(); 288 | return timeinfo.tm_wday; 289 | } 290 | 291 | /*! 292 | @brief get the current day of year as int (0-365) 293 | */ 294 | int ESP32Time::getDayofYear(){ 295 | struct tm timeinfo = getTimeStruct(); 296 | return timeinfo.tm_yday; 297 | } 298 | 299 | /*! 300 | @brief get the current month as int (0-11) 301 | */ 302 | int ESP32Time::getMonth(){ 303 | struct tm timeinfo = getTimeStruct(); 304 | return timeinfo.tm_mon; 305 | } 306 | 307 | /*! 308 | @brief get the current year as int 309 | */ 310 | int ESP32Time::getYear(){ 311 | struct tm timeinfo = getTimeStruct(); 312 | return timeinfo.tm_year+1900; 313 | } 314 | -------------------------------------------------------------------------------- /lib/ESP32Time/ESP32Time.h: -------------------------------------------------------------------------------- 1 | /* 2 | MIT License 3 | 4 | Copyright (c) 2021 Felix Biego 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | */ 24 | 25 | #ifndef ESP32TIME_H 26 | #define ESP32TIME_H 27 | 28 | #include 29 | 30 | class ESP32Time { 31 | 32 | public: 33 | ESP32Time(); 34 | void setTime(long epoch = 1609459200, int ms = 0); // default (1609459200) = 1st Jan 2021 35 | void setTime(int sc, int mn, int hr, int dy, int mt, int yr, int ms = 0); 36 | tm getTimeStruct(); 37 | String getTime(String format); 38 | 39 | String getTime(); 40 | String getDateTime(bool mode = false); 41 | String getTimeDate(bool mode = false); 42 | String getDate(bool mode = false); 43 | String getAmPm(bool lowercase = false); 44 | 45 | long getEpoch(); 46 | long getMillis(); 47 | long getMicros(); 48 | int getSecond(); 49 | int getMinute(); 50 | int getHour(bool mode = false); 51 | int getDay(); 52 | int getDayofWeek(); 53 | int getDayofYear(); 54 | int getMonth(); 55 | int getYear(); 56 | 57 | 58 | }; 59 | 60 | 61 | #endif 62 | -------------------------------------------------------------------------------- /lib/ESP32Time/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Felix Biego 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/ESP32Time/README.md: -------------------------------------------------------------------------------- 1 | # ESP32Time 2 | An Arduino library for setting and retrieving internal RTC time on ESP32 boards 3 | 4 | [![arduino-library-badge](https://www.ardu-badge.com/badge/ESP32Time.svg?)](https://www.ardu-badge.com/ESP32Time) 5 | 6 | ## Functions 7 | 8 | ``` 9 | setTime(30, 24, 15, 17, 1, 2021); // 17th Jan 2021 15:24:30 10 | setTime(1609459200); // 1st Jan 2021 00:00:00 11 | setTime(); // default 1st Jan 2021 00:00:00 12 | 13 | getTime() // (String) 15:24:38 14 | getDate() // (String) Sun, Jan 17 2021 15 | getDate(true) // (String) Sunday, January 17 2021 16 | getDateTime() // (String) Sun, Jan 17 2021 15:24:38 17 | getDateTime(true) // (String) Sunday, January 17 2021 15:24:38 18 | getTimeDate() // (String) 15:24:38 Sun, Jan 17 2021 19 | getTimeDate(true) // (String) 15:24:38 Sunday, January 17 2021 20 | 21 | getMicros() // (long) 723546 22 | getMillis() // (long) 723 23 | getEpoch() // (long) 1609459200 24 | getSecond() // (int) 38 (0-59) 25 | getMinute() // (int) 24 (0-59) 26 | getHour() // (int) 3 (0-12) 27 | getHour(true) // (int) 15 (0-23) 28 | getAmPm() // (String) pm 29 | getAmPm(true) // (String) PM 30 | getDay() // (int) 17 (1-31) 31 | getDayofWeek() // (int) 0 (0-6) 32 | getDayofYear() // (int) 16 (0-365) 33 | getMonth() // (int) 0 (0-11) 34 | getYear() // (int) 2021 35 | 36 | getTime("%A, %B %d %Y %H:%M:%S") // (String) returns time with specified format 37 | ``` 38 | [`Formatting options`](http://www.cplusplus.com/reference/ctime/strftime/) 39 | -------------------------------------------------------------------------------- /lib/ESP32Time/examples/esp32_time/esp32_time.ino: -------------------------------------------------------------------------------- 1 | /* 2 | MIT License 3 | 4 | Copyright (c) 2021 Felix Biego 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | */ 24 | 25 | #include 26 | 27 | ESP32Time rtc; 28 | 29 | void setup() { 30 | Serial.begin(115200); 31 | rtc.setTime(30, 24, 15, 17, 1, 2021); // 17th Jan 2021 15:24:30 32 | //rtc.setTime(1609459200); // 1st Jan 2021 00:00:00 33 | 34 | } 35 | 36 | void loop() { 37 | // Serial.println(rtc.getTime()); // (String) 15:24:38 38 | // Serial.println(rtc.getDate()); // (String) Sun, Jan 17 2021 39 | // Serial.println(rtc.getDate(true)); // (String) Sunday, January 17 2021 40 | // Serial.println(rtc.getDateTime()); // (String) Sun, Jan 17 2021 15:24:38 41 | // Serial.println(rtc.getDateTime(true)); // (String) Sunday, January 17 2021 15:24:38 42 | // Serial.println(rtc.getTimeDate()); // (String) 15:24:38 Sun, Jan 17 2021 43 | // Serial.println(rtc.getTimeDate(true)); // (String) 15:24:38 Sunday, January 17 2021 44 | // 45 | // Serial.println(rtc.getMicros()); // (long) 723546 46 | // Serial.println(rtc.getMillis()); // (long) 723 47 | // Serial.println(rtc.getEpoch()); // (long) 1609459200 48 | // Serial.println(rtc.getSecond()); // (int) 38 (0-59) 49 | // Serial.println(rtc.getMinute()); // (int) 24 (0-59) 50 | // Serial.println(rtc.getHour()); // (int) 3 (0-12) 51 | // Serial.println(rtc.getHour(true)); // (int) 15 (0-23) 52 | // Serial.println(rtc.getAmPm()); // (String) pm 53 | // Serial.println(rtc.getAmPm(true)); // (String) PM 54 | // Serial.println(rtc.getDay()); // (int) 17 (1-31) 55 | // Serial.println(rtc.getDayofWeek()); // (int) 0 (0-6) 56 | // Serial.println(rtc.getDayofYear()); // (int) 16 (0-365) 57 | // Serial.println(rtc.getMonth()); // (int) 0 (0-11) 58 | // Serial.println(rtc.getYear()); // (int) 2021 59 | 60 | Serial.println(rtc.getTime("%A, %B %d %Y %H:%M:%S")); // (String) returns time with specified format 61 | // formating options http://www.cplusplus.com/reference/ctime/strftime/ 62 | 63 | 64 | struct tm timeinfo = rtc.getTimeStruct(); 65 | //Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); // (tm struct) Sunday, January 17 2021 07:24:38 66 | 67 | delay(1000); 68 | } 69 | -------------------------------------------------------------------------------- /lib/ESP32Time/keywords.txt: -------------------------------------------------------------------------------- 1 | ESP32Time KEYWORD1 2 | 3 | setTime KEYWORD2 4 | getTime KEYWORD2 5 | getTimeStruct KEYWORD2 6 | getDateTime KEYWORD2 7 | getTimeDate KEYWORD2 8 | getDate KEYWORD2 9 | getAmPm KEYWORD2 10 | getMillis KEYWORD2 11 | getMicros KEYWORD2 12 | getEpoch KEYWORD2 13 | getSecond KEYWORD2 14 | getMinute KEYWORD2 15 | getHour KEYWORD2 16 | getDay KEYWORD2 17 | getDayofWeek KEYWORD2 18 | getDayofYear KEYWORD2 19 | getMonth KEYWORD2 20 | getYear KEYWORD2 21 | -------------------------------------------------------------------------------- /lib/ESP32Time/library.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ESP32Time", 3 | "version": "1.0.3", 4 | "keywords": "Arduino, ESP32, Time, Internal RTC", 5 | "description": "An Arduino library for setting and retrieving internal RTC time on ESP32 boards", 6 | "repository": 7 | { 8 | "type": "git", 9 | "url": "https://github.com/fbiego/ESP32Time" 10 | }, 11 | "authors": 12 | [ 13 | { 14 | "name": "fbiego", 15 | "email": "fbiego.fb@gmail.com", 16 | "maintainer": true 17 | } 18 | ], 19 | "frameworks": "arduino", 20 | "platforms": "espressif8266, espressif32" 21 | } 22 | -------------------------------------------------------------------------------- /lib/ESP32Time/library.properties: -------------------------------------------------------------------------------- 1 | name=ESP32Time 2 | version=1.0.3 3 | author=fbiego 4 | maintainer=fbiego 5 | sentence=Set and retrieve internal RTC time on ESP32 boards. 6 | paragraph=No need for external RTC module or NTP time synchronization. 7 | category=Timing 8 | url=https://github.com/fbiego/ESP32Time 9 | architectures=* 10 | includes=ESP32Time.h 11 | 12 | -------------------------------------------------------------------------------- /lib/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link into executable file. 4 | 5 | The source code of each library should be placed in a an own separate directory 6 | ("lib/your_library_name/[here are source files]"). 7 | 8 | For example, see a structure of the following two libraries `Foo` and `Bar`: 9 | 10 | |--lib 11 | | | 12 | | |--Bar 13 | | | |--docs 14 | | | |--examples 15 | | | |--src 16 | | | |- Bar.c 17 | | | |- Bar.h 18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html 19 | | | 20 | | |--Foo 21 | | | |- Foo.c 22 | | | |- Foo.h 23 | | | 24 | | |- README --> THIS FILE 25 | | 26 | |- platformio.ini 27 | |--src 28 | |- main.c 29 | 30 | and a contents of `src/main.c`: 31 | ``` 32 | #include 33 | #include 34 | 35 | int main (void) 36 | { 37 | ... 38 | } 39 | 40 | ``` 41 | 42 | PlatformIO Library Dependency Finder will find automatically dependent 43 | libraries scanning project source files. 44 | 45 | More information about PlatformIO Library Dependency Finder 46 | - https://docs.platformio.org/page/librarymanager/ldf.html 47 | -------------------------------------------------------------------------------- /platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; 3 | ; Build options: build flags, source filter 4 | ; Upload options: custom upload port, speed and extra flags 5 | ; Library options: dependencies, extra library storages 6 | ; Advanced options: extra scripting 7 | ; 8 | ; Please visit documentation for the other options and examples 9 | ; https://docs.platformio.org/page/projectconf.html 10 | 11 | [env:esp32dev] 12 | platform = espressif32 13 | board = esp32dev 14 | framework = arduino 15 | lib_deps = 16 | adafruit/Adafruit BusIO@^1.8.2 17 | adafruit/Adafruit GFX Library@^1.10.10 18 | zinggjm/GxEPD@^3.1.1 19 | fbiego/ESP32Time@^1.0.3 20 | mikalhart/TinyGPSPlus@^1.0.3 21 | bxparks/AceButton@^1.10.1 22 | monitor_speed = 115200 23 | -------------------------------------------------------------------------------- /src/apps.cpp: -------------------------------------------------------------------------------- 1 | #include "apps.h" 2 | 3 | #include "apps/about/app_about.h" 4 | #include "apps/gps_sync/app_gps_sync.h" 5 | #include "apps/wifi_smartconfig/app_wifi_smartconfig.h" 6 | 7 | std::vector> apps; 8 | unsigned int currentAppIndex = 0; 9 | 10 | App::App(String name, const unsigned char *icon) { 11 | this->name = name; 12 | this->icon = icon; 13 | } 14 | 15 | void App::setup() {} 16 | void App::drawUI(GxEPD_Class *display) {} 17 | void App::exit() {} 18 | void App::buttonClick() {} 19 | void App::buttonDoubleClick() {} 20 | 21 | void initApps() { 22 | apps.emplace_back(std::move(appWiFiSmartconfig)); 23 | apps.emplace_back(std::move(appGpsSync)); 24 | apps.emplace_back(std::move(appAbout)); 25 | } 26 | 27 | void drawAppsListUI(GxEPD_Class *display, ESP32Time *rtc, int batteryStatus) { 28 | display->fillScreen(GxEPD_WHITE); 29 | display->setTextColor(GxEPD_BLACK); 30 | display->setTextWrap(false); 31 | 32 | // Time 33 | String hoursFiller = rtc->getHour(true) < 10 ? "0" : ""; 34 | String minutesFiller = rtc->getMinute() < 10 ? "0" : ""; 35 | String timeStr = hoursFiller + String(rtc->getHour(true)) + ":" + minutesFiller + String(rtc->getMinute()); 36 | display->setFont(&Outfit_60011pt7b); 37 | printLeftString(display, timeStr.c_str(), 11, 22); 38 | 39 | // Battery 40 | printRightString(display, String(String(batteryStatus) + "%").c_str(), 166, 22); 41 | 42 | const unsigned char *icon_battery_small_array[6] = {epd_bitmap_icon_battery_0_small, epd_bitmap_icon_battery_20_small, 43 | epd_bitmap_icon_battery_40_small, epd_bitmap_icon_battery_60_small, 44 | epd_bitmap_icon_battery_80_small, epd_bitmap_icon_battery_100_small}; 45 | display->drawBitmap(170, 2, icon_battery_small_array[batteryStatus / 20], 28, 28, GxEPD_BLACK); 46 | 47 | // App 48 | display->drawRoundRect(46, 46, 108, 108, 10, GxEPD_BLACK); 49 | display->drawRoundRect(45, 45, 110, 110, 11, GxEPD_BLACK); 50 | display->drawBitmap(50, 50, apps[currentAppIndex]->icon, 100, 100, GxEPD_BLACK); 51 | printCenterString(display, apps[currentAppIndex]->name.c_str(), 100, 185); 52 | } -------------------------------------------------------------------------------- /src/apps.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Arduino.h" 4 | #include "ESP32Time.h" 5 | #include "GxDEPG0150BN/GxDEPG0150BN.h" // 1.54" b/w 200x200 6 | #include "GxEPD.h" 7 | #include "memory" 8 | #include "vector" 9 | 10 | #include "lib/ui.h" 11 | 12 | #include "resources/fonts/Outfit_60011pt7b.h" 13 | #include "resources/icons.h" 14 | 15 | class App { 16 | public: 17 | String name; 18 | const unsigned char *icon; 19 | unsigned int iconWidth; 20 | unsigned int iconHeight; 21 | 22 | App(String name, const unsigned char *icon); 23 | virtual void setup(); 24 | virtual void drawUI(GxEPD_Class *display); 25 | virtual void exit(); 26 | virtual void buttonClick(); 27 | virtual void buttonDoubleClick(); 28 | }; 29 | 30 | extern std::vector> apps; 31 | 32 | extern uint32_t currentAppIndex; 33 | 34 | void initApps(); 35 | void drawAppsListUI(GxEPD_Class *display, ESP32Time *rtc, int batteryStatus); -------------------------------------------------------------------------------- /src/apps/about/app_about.cpp: -------------------------------------------------------------------------------- 1 | #include "app_about.h" 2 | 3 | void AppAbout::drawUI(GxEPD_Class *display) { 4 | display->fillScreen(GxEPD_WHITE); 5 | display->setTextColor(GxEPD_BLACK); 6 | display->setTextWrap(false); 7 | 8 | display->drawBitmap(50, 35, qpaperos_logo_100, 100, 100, GxEPD_BLACK); 9 | display->setFont(&Outfit_60011pt7b); 10 | printCenterString(display, "qpaperOS", 100, 170); 11 | 12 | display->updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT); 13 | } 14 | 15 | std::unique_ptr appAbout(new AppAbout("About", icon_app_about)); -------------------------------------------------------------------------------- /src/apps/about/app_about.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "apps.h" 4 | #include "resources/app_icons.h" 5 | #include "resources/fonts/Outfit_60011pt7b.h" 6 | 7 | class AppAbout : public App { 8 | public: 9 | using App::App; 10 | void drawUI(GxEPD_Class *display) override; 11 | }; 12 | 13 | extern std::unique_ptr appAbout; -------------------------------------------------------------------------------- /src/apps/gps_sync/app_gps_sync.cpp: -------------------------------------------------------------------------------- 1 | #include "app_gps_sync.h" 2 | 3 | void AppGpsSync::drawUI(GxEPD_Class *display) { 4 | display->fillScreen(GxEPD_WHITE); 5 | display->updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT); 6 | } 7 | 8 | std::unique_ptr appGpsSync(new AppGpsSync("Connect to GPS", icon_app_gps_connect)); -------------------------------------------------------------------------------- /src/apps/gps_sync/app_gps_sync.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "apps.h" 4 | #include "resources/app_icons.h" 5 | 6 | class AppGpsSync : public App { 7 | public: 8 | using App::App; 9 | void drawUI(GxEPD_Class *display) override; 10 | }; 11 | 12 | extern std::unique_ptr appGpsSync; -------------------------------------------------------------------------------- /src/apps/wifi_smartconfig/app_wifi_smartconfig.cpp: -------------------------------------------------------------------------------- 1 | #include "app_wifi_smartconfig.h" 2 | 3 | void AppWiFiSmartconfig::setup() { 4 | done = false; 5 | preferences.begin(PREFS_KEY); 6 | } 7 | 8 | void AppWiFiSmartconfig::drawUI(GxEPD_Class *display) { 9 | display->fillScreen(GxEPD_WHITE); 10 | display->setTextColor(GxEPD_BLACK); 11 | display->setFont(&Outfit_60011pt7b); 12 | display->drawBitmap(50, 20, icon_app_wifi_smartconfig, 100, 100, GxEPD_BLACK); 13 | 14 | int timer = 0; 15 | 16 | if (!done) { 17 | printCenterString(display, "Waiting connection...", 100, 150); 18 | display->updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT); 19 | 20 | WiFi.disconnect(); 21 | WiFi.mode(WIFI_AP_STA); 22 | WiFi.beginSmartConfig(); 23 | 24 | while (timer < 500) { 25 | timer++; 26 | delay(100); 27 | 28 | if (WiFi.smartConfigDone()) { 29 | display->fillRect(0, 130, GxEPD_WIDTH, 50, GxEPD_WHITE); 30 | printCenterString(display, String("Connected!").c_str(), 100, 150); 31 | printCenterString(display, WiFi.SSID().c_str(), 100, 175); 32 | display->updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT); 33 | preferences.putString("wifi_ssid", WiFi.SSID()); 34 | preferences.putString("wifi_passwd", WiFi.psk()); 35 | break; 36 | } 37 | } 38 | 39 | if (timer >= 500) { 40 | display->fillRect(0, 130, GxEPD_WIDTH, 50, GxEPD_WHITE); 41 | printCenterString(display, "Connection failed", 100, 150); 42 | display->updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT); 43 | 44 | String wifi_ssid = preferences.getString("wifi_ssid", ""); 45 | String wifi_passwd = preferences.getString("wifi_passwd", ""); 46 | if (wifi_ssid != "") { 47 | WiFi.mode(WIFI_AP_STA); 48 | WiFi.begin(wifi_ssid.c_str(), wifi_passwd.c_str()); 49 | } 50 | } 51 | 52 | done = true; 53 | } 54 | } 55 | 56 | void AppWiFiSmartconfig::exit() { preferences.end(); } 57 | 58 | std::unique_ptr appWiFiSmartconfig(new AppWiFiSmartconfig("Connect to WiFi", icon_app_wifi_smartconfig)); -------------------------------------------------------------------------------- /src/apps/wifi_smartconfig/app_wifi_smartconfig.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Preferences.h" 4 | #include "WiFi.h" 5 | 6 | #include "apps.h" 7 | #include "lib/ui.h" 8 | #include "os_config.h" 9 | #include "resources/app_icons.h" 10 | #include "resources/fonts/Outfit_60011pt7b.h" 11 | 12 | class AppWiFiSmartconfig : public App { 13 | public: 14 | bool done; 15 | Preferences preferences; 16 | using App::App; 17 | void setup(); 18 | void drawUI(GxEPD_Class *display) override; 19 | void exit(); 20 | }; 21 | 22 | extern std::unique_ptr appWiFiSmartconfig; -------------------------------------------------------------------------------- /src/home.cpp: -------------------------------------------------------------------------------- 1 | #include "home.h" 2 | 3 | const char *months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; 4 | 5 | const char *days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; 6 | 7 | void drawHomeUI(GxEPD_Class *display, ESP32Time *rtc, int batteryStatus) { 8 | display->fillScreen(GxEPD_WHITE); 9 | display->setTextColor(GxEPD_BLACK); 10 | display->setTextWrap(false); 11 | 12 | // Time 13 | display->setFont(&Outfit_80036pt7b); 14 | String hoursFiller = rtc->getHour(true) < 10 ? "0" : ""; 15 | String minutesFiller = rtc->getMinute() < 10 ? "0" : ""; 16 | String timeStr = hoursFiller + String(rtc->getHour(true)) + ":" + minutesFiller + String(rtc->getMinute()); 17 | printCenterString(display, timeStr.c_str(), 100, 125); 18 | 19 | // Date 20 | display->setFont(&Outfit_60011pt7b); 21 | printCenterString(display, String(String(days[rtc->getDayofWeek()]) + ", " + String(months[rtc->getMonth()]) + " " + String(rtc->getDay())).c_str(), 22 | 100, 60); 23 | 24 | // Battery 25 | printRightString(display, String(String(batteryStatus) + "%").c_str(), 166, 22); 26 | 27 | const unsigned char *icon_battery_small_array[6] = {epd_bitmap_icon_battery_0_small, epd_bitmap_icon_battery_20_small, 28 | epd_bitmap_icon_battery_40_small, epd_bitmap_icon_battery_60_small, 29 | epd_bitmap_icon_battery_80_small, epd_bitmap_icon_battery_100_small}; 30 | display->drawBitmap(170, 2, icon_battery_small_array[batteryStatus / 20], 28, 28, GxEPD_BLACK); 31 | 32 | // Status icons 33 | display->drawBitmap(2, 2, icon_wifi_small, 28, 28, GxEPD_BLACK); 34 | display->drawBitmap(30, 2, icon_no_ble_small, 28, 28, GxEPD_BLACK); 35 | display->drawBitmap(58, 2, icon_gps_small, 28, 28, GxEPD_BLACK); 36 | 37 | // Prayer time 38 | display->drawBitmap(2, 142, icon_prayer_small, 28, 28, GxEPD_BLACK); 39 | printLeftString(display, "Isha, 22:10", 34, 164); 40 | 41 | // Steps 42 | display->drawBitmap(2, 170, icon_steps_small, 28, 28, GxEPD_BLACK); 43 | printLeftString(display, "7.546", 34, 192); 44 | 45 | // Weather 46 | display->drawBitmap(170, 170, icon_weather_small, 28, 28, GxEPD_BLACK); 47 | printRightString(display, "24°C", 166, 192); 48 | } -------------------------------------------------------------------------------- /src/home.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Arduino.h" 4 | #include "ESP32Time.h" 5 | #include "GxDEPG0150BN/GxDEPG0150BN.h" // 1.54" b/w 200x200 6 | #include "GxEPD.h" 7 | 8 | #include "lib/ui.h" 9 | 10 | #include "resources/fonts/Outfit_60011pt7b.h" 11 | #include "resources/fonts/Outfit_80036pt7b.h" 12 | #include "resources/icons.h" 13 | 14 | void drawHomeUI(GxEPD_Class *display, ESP32Time *rtc, int batteryStatus); -------------------------------------------------------------------------------- /src/lib/battery.cpp: -------------------------------------------------------------------------------- 1 | #include "battery.h" 2 | 3 | int calculateBatteryStatus() { 4 | int bat = 0; 5 | for (uint8_t i = 0; i < 25; i++) { 6 | bat += analogRead(BAT_ADC); 7 | } 8 | bat /= 25; 9 | float volt = (bat * 3.3 / 4096); 10 | return constrain(map(volt * 1000, 1630, 1850, 0, 100), 0, 100); 11 | } -------------------------------------------------------------------------------- /src/lib/battery.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Arduino.h" 4 | #include "os_config.h" 5 | 6 | int calculateBatteryStatus(); -------------------------------------------------------------------------------- /src/lib/log.cpp: -------------------------------------------------------------------------------- 1 | #include "log.h" 2 | 3 | void log(LogLevel level, const char *message) { 4 | if (Serial) { 5 | String prefix = ""; 6 | switch (level) { 7 | case LogLevel::INFO: 8 | prefix = "[INFO]"; 9 | break; 10 | case LogLevel::SUCCESS: 11 | prefix = "[SUCCESS]"; 12 | break; 13 | case LogLevel::WARNING: 14 | prefix = "[WARNING]"; 15 | break; 16 | case LogLevel::ERROR: 17 | prefix = "[ERROR]"; 18 | break; 19 | } 20 | Serial.println(prefix + " : [" + millis() + "] : " + message); 21 | } 22 | } -------------------------------------------------------------------------------- /src/lib/log.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Arduino.h" 4 | 5 | enum class LogLevel { INFO, SUCCESS, WARNING, ERROR }; 6 | 7 | void log(LogLevel level, const char *message); -------------------------------------------------------------------------------- /src/lib/ui.cpp: -------------------------------------------------------------------------------- 1 | #include "ui.h" 2 | 3 | void printLeftString(GxEPD_Class *display, const char *buf, int x, int y) { 4 | display->setCursor(x, y); 5 | display->print(buf); 6 | } 7 | 8 | void printRightString(GxEPD_Class *display, const char *buf, int x, int y) { 9 | int16_t x1, y1; 10 | uint16_t w, h; 11 | display->getTextBounds(buf, x, y, &x1, &y1, &w, &h); 12 | display->setCursor(x - w, y); 13 | display->print(buf); 14 | } 15 | 16 | void printCenterString(GxEPD_Class *display, const char *buf, int x, int y) { 17 | int16_t x1, y1; 18 | uint16_t w, h; 19 | display->getTextBounds(buf, x, y, &x1, &y1, &w, &h); 20 | display->setCursor(x - w / 2, y); 21 | display->print(buf); 22 | } -------------------------------------------------------------------------------- /src/lib/ui.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Arduino.h" 4 | #include "GxEPD.h" 5 | #include // 1.54" b/w 200x200 6 | 7 | void printLeftString(GxEPD_Class *display, const char *buf, int x, int y); 8 | void printRightString(GxEPD_Class *display, const char *buf, int x, int y); 9 | void printCenterString(GxEPD_Class *display, const char *buf, int x, int y); -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "AceButton.h" 2 | #include "Adafruit_I2CDevice.h" 3 | #include "ESP32Time.h" 4 | #include "GxDEPG0150BN/GxDEPG0150BN.h" // 1.54" b/w 200x200 5 | #include "GxEPD.h" 6 | #include "GxIO/GxIO.h" 7 | #include "GxIO/GxIO_SPI/GxIO_SPI.h" 8 | #include "HTTPClient.h" 9 | #include "Preferences.h" 10 | #include "TinyGPSPlus.h" 11 | #include "WiFi.h" 12 | #include "soc/rtc_cntl_reg.h" 13 | #include "soc/soc.h" 14 | #include "time.h" 15 | 16 | #include "apps.h" 17 | #include "home.h" 18 | #include "lib/battery.h" 19 | #include "lib/log.h" 20 | #include "os_config.h" 21 | #include "wakeup.h" 22 | 23 | using namespace ace_button; 24 | 25 | GxIO_Class io(SPI, /*CS*/ EPD_CS, /*DC=*/EPD_DC, /*RST=*/EPD_RESET); 26 | GxEPD_Class display(io, /*RST=*/EPD_RESET, /*BUSY=*/EPD_BUSY); 27 | 28 | ESP32Time rtc; 29 | TinyGPSPlus gps; 30 | HardwareSerial gpsPort(Serial2); 31 | Preferences preferences; 32 | 33 | RTC_DATA_ATTR WakeupFlag wakeup = WakeupFlag::WAKEUP_INIT; 34 | RTC_DATA_ATTR uint32_t wakeupCount = 0; 35 | 36 | AwakeState awakeState = AwakeState::APPS_MENU; 37 | 38 | uint32_t sleepTimer = 0; 39 | 40 | AceButton button(PIN_KEY); 41 | void buttonUpdateTask(void *pvParameters); 42 | void handleButtonEvent(AceButton *button, uint8_t eventType, uint8_t buttonState); 43 | 44 | hw_timer_t *uiTimer = NULL; 45 | volatile SemaphoreHandle_t timerSemaphore; 46 | 47 | void ARDUINO_ISR_ATTR onTimer() { xSemaphoreGiveFromISR(timerSemaphore, NULL); } 48 | 49 | void WiFiConnected(WiFiEvent_t event, WiFiEventInfo_t info) { 50 | log(LogLevel::INFO, "WiFi connected"); 51 | configTime(GMT_OFFSET_SEC, DAY_LIGHT_OFFSET_SEC, NTP_SERVER1); 52 | log(LogLevel::INFO, "Time synchronized from WiFi"); 53 | } 54 | 55 | void setup() { 56 | Serial.begin(115200); 57 | delay(10); 58 | log(LogLevel::INFO, "Welcome to qPaperOS!"); 59 | log(LogLevel::SUCCESS, "Serial communication initiliazed"); 60 | 61 | // gpsPort.begin(9600, SERIAL_8N1, GPS_RX, GPS_TX); 62 | // digitalWrite(GPS_RES, OUTPUT); 63 | // digitalWrite(GPS_RES, LOW); 64 | SPI.begin(SPI_SCK, -1, SPI_DIN, EPD_CS); 65 | 66 | pinMode(PWR_EN, OUTPUT); 67 | pinMode(PIN_MOTOR, OUTPUT); 68 | digitalWrite(PWR_EN, HIGH); 69 | digitalWrite(PIN_MOTOR, LOW); 70 | pinMode(PIN_KEY, INPUT_PULLUP); 71 | ButtonConfig *buttonConfig = button.getButtonConfig(); 72 | buttonConfig->setEventHandler(handleButtonEvent); 73 | buttonConfig->setFeature(ButtonConfig::kFeatureClick); 74 | buttonConfig->setFeature(ButtonConfig::kFeatureDoubleClick); 75 | buttonConfig->setFeature(ButtonConfig::kFeatureLongPress); 76 | buttonConfig->setClickDelay(200); 77 | buttonConfig->setDebounceDelay(10); 78 | buttonConfig->setLongPressDelay(1000); 79 | 80 | pinMode(BAT_ADC, ANALOG); 81 | adcAttachPin(BAT_ADC); 82 | analogReadResolution(12); 83 | analogSetWidth(50); 84 | log(LogLevel::SUCCESS, "Hardware pins initiliazed"); 85 | 86 | WiFi.onEvent(WiFiConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED); 87 | 88 | timerSemaphore = xSemaphoreCreateBinary(); 89 | uiTimer = timerBegin(0, 80, true); 90 | timerAttachInterrupt(uiTimer, &onTimer, true); 91 | timerAlarmWrite(uiTimer, 1000000, true); 92 | timerAlarmEnable(uiTimer); 93 | log(LogLevel::SUCCESS, "Hardware timer initiliazed"); 94 | 95 | preferences.begin(PREFS_KEY); 96 | log(LogLevel::SUCCESS, "Preferences initiliazed"); 97 | 98 | configTime(GMT_OFFSET_SEC, DAY_LIGHT_OFFSET_SEC, nullptr); 99 | log(LogLevel::SUCCESS, "Time configured"); 100 | 101 | display.init(); 102 | display.setRotation(1); 103 | log(LogLevel::SUCCESS, "Display initiliazed"); 104 | 105 | if (digitalRead(PIN_KEY) == 0) 106 | wakeup = WakeupFlag::WAKEUP_FULL; 107 | log(LogLevel::INFO, "Starting wakeup process..."); 108 | 109 | switch (wakeup) { 110 | case WakeupFlag::WAKEUP_INIT: 111 | wakeupInit(&wakeup, &wakeupCount, &display, &rtc, &preferences); 112 | break; 113 | 114 | case WakeupFlag::WAKEUP_LIGHT: 115 | wakeupLight(&wakeup, &wakeupCount, &display, &rtc, &preferences); 116 | break; 117 | 118 | case WakeupFlag::WAKEUP_FULL: 119 | xTaskCreate(buttonUpdateTask, "ButtonUpdateTask", 10000, NULL, 1, NULL); 120 | wakeupFull(&wakeup, &wakeupCount, &display, &rtc, &preferences); 121 | break; 122 | } 123 | 124 | log(LogLevel::SUCCESS, "Wakeup process completed"); 125 | } 126 | 127 | void loop() { 128 | if (xSemaphoreTake(timerSemaphore, 0) == pdTRUE && awakeState != AwakeState::IN_APP) 129 | sleepTimer++; 130 | 131 | switch (wakeup) { 132 | case WakeupFlag::WAKEUP_INIT: 133 | wakeupInitLoop(&wakeup, sleepTimer, &display, &rtc); 134 | break; 135 | 136 | case WakeupFlag::WAKEUP_LIGHT: 137 | wakeupLightLoop(&wakeup, sleepTimer, &display, &rtc); 138 | break; 139 | 140 | case WakeupFlag::WAKEUP_FULL: 141 | wakeupFullLoop(&wakeup, sleepTimer, &display, &rtc, awakeState); 142 | break; 143 | } 144 | } 145 | 146 | void buttonUpdateTask(void *pvParameters) { 147 | while (1) { 148 | button.check(); 149 | // vTaskDelay(5); 150 | } 151 | vTaskDelete(NULL); 152 | } 153 | 154 | void handleButtonEvent(AceButton *button, uint8_t eventType, uint8_t buttonState) { 155 | sleepTimer = 0; 156 | 157 | switch (eventType) { 158 | case AceButton::kEventClicked: 159 | if (awakeState == AwakeState::APPS_MENU) { 160 | currentAppIndex++; 161 | if (currentAppIndex >= apps.size()) 162 | currentAppIndex = 0; 163 | } else 164 | apps[currentAppIndex]->buttonClick(); 165 | break; 166 | 167 | case AceButton::kEventDoubleClicked: 168 | if (awakeState == AwakeState::IN_APP) 169 | apps[currentAppIndex]->buttonDoubleClick(); 170 | break; 171 | 172 | case AceButton::kEventLongPressed: 173 | if (awakeState == AwakeState::APPS_MENU) { 174 | awakeState = AwakeState::IN_APP; 175 | apps[currentAppIndex]->setup(); 176 | } else { 177 | awakeState = AwakeState::APPS_MENU; 178 | apps[currentAppIndex]->exit(); 179 | } 180 | break; 181 | } 182 | } -------------------------------------------------------------------------------- /src/os_config.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // OS Configuration 4 | #define DEVICE_NAME "qewer33's Watch" 5 | #define PREFS_KEY "qpaper-os" 6 | 7 | // Hardware Configuration 8 | #define GPS_RES 23 9 | #define GPS_RX 21 10 | #define GPS_TX 22 11 | 12 | #define PIN_KEY 35 13 | #define PWR_EN 5 14 | #define BACKLIGHT 33 15 | #define BAT_ADC 34 16 | #define PIN_MOTOR 4 17 | 18 | #define SPI_SCK 14 19 | #define SPI_DIN 13 20 | #define EPD_CS 15 21 | #define EPD_DC 2 22 | #define SRAM_CS -1 23 | #define EPD_RESET 17 24 | #define EPD_BUSY 16 25 | 26 | // Time Configuration 27 | #define NTP_SERVER1 "pool.ntp.org" 28 | #define NTP_SERVER2 "time.nist.gov" 29 | #define GMT_OFFSET_SEC (3600 * 3) 30 | #define DAY_LIGHT_OFFSET_SEC 0 31 | 32 | // Software Functions Configuration 33 | #define UPDATE_WAKEUP_TIMER_US 60 * 1000000 -------------------------------------------------------------------------------- /src/wakeup.cpp: -------------------------------------------------------------------------------- 1 | #include "wakeup.h" 2 | 3 | // Setup 4 | 5 | void wakeupInit(WakeupFlag *wakeupType, unsigned int *wakeupCount, GxEPD_Class *display, ESP32Time *rtc, Preferences *preferences) { 6 | log(LogLevel::INFO, "WAKEUP_INIT"); 7 | 8 | rtc->setTime(preferences->getLong64("prev_time_unix", 0) + 15); 9 | 10 | display->fillScreen(GxEPD_WHITE); 11 | display->update(); 12 | delay(1000); 13 | drawHomeUI(display, rtc, calculateBatteryStatus()); 14 | display->update(); 15 | 16 | WiFi.mode(WIFI_STA); 17 | WiFi.begin(preferences->getString("wifi_ssid"), preferences->getString("wifi_passwd")); 18 | log(LogLevel::SUCCESS, "WiFi initiliazed"); 19 | } 20 | 21 | void wakeupLight(WakeupFlag *wakeupType, unsigned int *wakeupCount, GxEPD_Class *display, ESP32Time *rtc, Preferences *preferences) { 22 | log(LogLevel::INFO, "WAKEUP_LIGHT"); 23 | setCpuFrequencyMhz(80); 24 | 25 | drawHomeUI(display, rtc, calculateBatteryStatus()); 26 | display->update(); 27 | display->powerDown(); 28 | 29 | preferences->putLong64("prev_time_unix", rtc->getEpoch()); 30 | 31 | wakeupCount++; 32 | 33 | if (*wakeupCount % 30 == 0) { 34 | WiFi.mode(WIFI_STA); 35 | WiFi.begin(preferences->getString("wifi_ssid"), preferences->getString("wifi_passwd")); 36 | return; 37 | } 38 | 39 | log(LogLevel::INFO, "Going to sleep..."); 40 | digitalWrite(PWR_EN, LOW); 41 | esp_sleep_enable_ext0_wakeup((gpio_num_t)PIN_KEY, 0); 42 | esp_sleep_enable_timer_wakeup(UPDATE_WAKEUP_TIMER_US); 43 | esp_deep_sleep_start(); 44 | } 45 | 46 | void wakeupFull(WakeupFlag *wakeupType, unsigned int *wakeupCount, GxEPD_Class *display, ESP32Time *rtc, Preferences *preferences) { 47 | log(LogLevel::INFO, "WAKEUP_FULL"); 48 | setCpuFrequencyMhz(240); 49 | 50 | wakeupCount = 0; 51 | 52 | initApps(); 53 | log(LogLevel::SUCCESS, "Apps initiliazed"); 54 | 55 | WiFi.mode(WIFI_STA); 56 | WiFi.begin(preferences->getString("wifi_ssid"), preferences->getString("wifi_passwd")); 57 | 58 | display->fillScreen(GxEPD_WHITE); 59 | display->updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT); 60 | } 61 | 62 | // Loop 63 | 64 | void wakeupInitLoop(WakeupFlag *wakeupType, unsigned int sleepTimer, GxEPD_Class *display, ESP32Time *rtc) { 65 | if (sleepTimer == 30) { 66 | *wakeupType = WakeupFlag::WAKEUP_LIGHT; 67 | esp_sleep_enable_timer_wakeup(1000000); 68 | esp_deep_sleep_start(); 69 | } 70 | } 71 | 72 | void wakeupLightLoop(WakeupFlag *wakeupType, unsigned int sleepTimer, GxEPD_Class *display, ESP32Time *rtc) { 73 | if (sleepTimer == 15) { 74 | digitalWrite(PWR_EN, LOW); 75 | esp_sleep_enable_ext0_wakeup((gpio_num_t)PIN_KEY, 0); 76 | esp_sleep_enable_timer_wakeup(UPDATE_WAKEUP_TIMER_US - 15000000); 77 | esp_deep_sleep_start(); 78 | } 79 | } 80 | 81 | void wakeupFullLoop(WakeupFlag *wakeupType, unsigned int sleepTimer, GxEPD_Class *display, ESP32Time *rtc, AwakeState awakeState) { 82 | if (awakeState == AwakeState::APPS_MENU) { 83 | drawAppsListUI(display, rtc, calculateBatteryStatus()); 84 | display->updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT); 85 | } else { 86 | apps[currentAppIndex]->drawUI(display); 87 | } 88 | 89 | if (sleepTimer == 15) { 90 | *wakeupType = WakeupFlag::WAKEUP_LIGHT; 91 | esp_sleep_enable_timer_wakeup(1000000); 92 | esp_deep_sleep_start(); 93 | } 94 | } -------------------------------------------------------------------------------- /src/wakeup.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "ESP32Time.h" 4 | #include "GxDEPG0150BN/GxDEPG0150BN.h" // 1.54" b/w 200x200 5 | #include "GxEPD.h" 6 | #include "Preferences.h" 7 | #include "WiFi.h" 8 | 9 | #include "apps.h" 10 | #include "home.h" 11 | #include "lib/battery.h" 12 | #include "lib/log.h" 13 | #include "os_config.h" 14 | 15 | enum class WakeupFlag { WAKEUP_INIT, WAKEUP_FULL, WAKEUP_LIGHT }; 16 | enum class AwakeState { APPS_MENU, IN_APP }; 17 | 18 | void wakeupInit(WakeupFlag *wakeupType, unsigned int *wakeupCount, GxEPD_Class *display, ESP32Time *rtc, Preferences *preferences); 19 | void wakeupLight(WakeupFlag *wakeupType, unsigned int *wakeupCount, GxEPD_Class *display, ESP32Time *rtc, Preferences *preferences); 20 | void wakeupFull(WakeupFlag *wakeupType, unsigned int *wakeupCount, GxEPD_Class *display, ESP32Time *rtc, Preferences *preferences); 21 | 22 | void wakeupInitLoop(WakeupFlag *wakeupType, unsigned int sleepTimer, GxEPD_Class *display, ESP32Time *rtc); 23 | void wakeupLightLoop(WakeupFlag *wakeupType, unsigned int sleepTimer, GxEPD_Class *display, ESP32Time *rtc); 24 | void wakeupFullLoop(WakeupFlag *wakeupType, unsigned int sleepTimer, GxEPD_Class *display, ESP32Time *rtc, AwakeState awakeState); 25 | -------------------------------------------------------------------------------- /test/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for PlatformIO Unit Testing and project tests. 3 | 4 | Unit Testing is a software testing method by which individual units of 5 | source code, sets of one or more MCU program modules together with associated 6 | control data, usage procedures, and operating procedures, are tested to 7 | determine whether they are fit for use. Unit testing finds problems early 8 | in the development cycle. 9 | 10 | More information about PlatformIO Unit Testing: 11 | - https://docs.platformio.org/page/plus/unit-testing.html 12 | --------------------------------------------------------------------------------