How to use the fonts available in /Arduino/libraries/M5GFX/src/lgfx/Fonts/GFXFF
-
I have used the example "RTC_Clock" from the M5Core_Ink library as attached. The sketch works fine on my M5CoreInk module. I would like to modify the fonts however and I find that only AsciiFont24x48 and AsciiFont8x16 are available to use. Even though some other fonts are available under /Arduino/libraries/M5GFX/src/lgfx/Fonts if I try and use them in place of AsciiFont24x48 in the sketch below I get the error "'FontXXX' was not declared in this scope". How do I declare these additional fonts?
Also, I have seen that the Library MGFX has lots of fonts under /M5GFX/src/lgfx/Fonts/GFXFF. But I cannot find a simple example of using the M5GFX library to display a text string, any help would be appreciated.
One final point, if I include the M5GFX library tn the RTC_Clock sketch the compiler complains that AsciiFont24x48 is ambiguous as it has found two versions, how do I fix this?
#include "M5CoreInk.h" #include <WiFi.h> #include "time.h" const char* ssid = "YOUR_SSID"; const char* password = "YOUR_PASSWORD"; const char* ntpServer = "pool.ntp.org"; const long gmtOffset_sec = 3600; const int daylightOffset_sec = 3600; // every hour at minute 45 do a full ink display refresh #define FULL_REFRESH_MINUTE (45) Ink_Sprite TimePageSprite(&M5.M5Ink); void printLocalTimeAndSetRTC() { struct tm timeinfo; if (getLocalTime(&timeinfo) == false) { Serial.println("Failed to obtain time"); return; } Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); RTC_TimeTypeDef time; time.Hours = timeinfo.tm_hour; time.Minutes = timeinfo.tm_min; time.Seconds = timeinfo.tm_sec; M5.rtc.SetTime(&time); RTC_DateTypeDef date; date.Date = timeinfo.tm_mday; date.Month = timeinfo.tm_mon + 1; date.Year = timeinfo.tm_year + 1900; M5.rtc.SetDate(&date); } void getNTPTime() { // Try to connect for 10 seconds uint32_t connect_timeout = millis() + 10000; Serial.printf("Connecting to %s ", ssid); WiFi.begin(ssid, password); while ((WiFi.status() != WL_CONNECTED) && (millis() < connect_timeout)) { delay(500); Serial.print("."); } if (WiFi.status() != WL_CONNECTED) { // WiFi connection failed - set fantasy time and date RTC_TimeTypeDef time; time.Hours = 6; time.Minutes = 43; time.Seconds = 50; M5.rtc.SetTime(&time); RTC_DateTypeDef date; date.Date = 4; date.Month = 12; date.Year = 2020; M5.rtc.SetDate(&date); return; } Serial.println("Connected"); configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); printLocalTimeAndSetRTC(); WiFi.disconnect(true); WiFi.mode(WIFI_OFF); } void drawTimeAndDate(RTC_TimeTypeDef time, RTC_DateTypeDef date) { char buf[11]; snprintf(buf, 6, "%02d:%02d", time.Hours, time.Minutes); TimePageSprite.drawString(40, 20, buf, &AsciiFont24x48); snprintf(buf, 11, "%02d.%02d.%02d", date.Date, date.Month, date.Year - 2000); TimePageSprite.drawString(4, 70, buf, &AsciiFont24x48); } void setup() { // Check power on reason before calling M5.begin() // which calls Rtc.begin() which clears the timer flag. Wire1.begin(21, 22); uint8_t data = M5.rtc.ReadReg(0x01); M5.begin(); // Green LED - indicates ESP32 is running digitalWrite(LED_EXT_PIN, LOW); if (M5.M5Ink.isInit() == false) { Serial.printf("Ink Init failed"); while (1) delay(100); } RTC_TimeTypeDef time; RTC_DateTypeDef date; // Check timer flag if ((data & 0b00000100) == 0b00000100) { Serial.println("Power on by: RTC timer"); M5.rtc.GetTime(&time); M5.rtc.GetDate(&date); // Full refresh once per hour if (time.Minutes == FULL_REFRESH_MINUTE - 1) { M5.M5Ink.clear(); } } else { Serial.println("Power on by: power button"); M5.M5Ink.clear(); // Fetch current time from Internet getNTPTime(); M5.rtc.GetTime(&time); M5.rtc.GetDate(&date); } // After every shutdown the sprite is created anew. // But the sprite doesn't know about the current image on the // ink display therefore the same time and date, as have been // drawn before the shutdown, are redrawn. // This is required, else drawing new time and date only adds // pixels to the already drawn pixels instead of clearing the // previous time and date and then draw the new time and date. TimePageSprite.creatSprite(0, 0, 200, 200); drawTimeAndDate(time, date); TimePageSprite.pushSprite(); // Wait until full minute, e.g. seconds are 0 while ((time.Seconds != 0)) { M5.rtc.GetTime(&time); delay(200); } M5.rtc.GetDate(&date); // Draw new time and date drawTimeAndDate(time, date); TimePageSprite.pushSprite(); Serial.printf("Shutdown...\n"); Serial.flush(); // Full refresh once per hour if (time.Minutes == FULL_REFRESH_MINUTE - 1) { // Allow extra time for full ink refresh // Shutdown for 55 seconds only M5.shutdown(55); return; } // Shutdown for 58 seconds M5.shutdown(58); } void loop() { }
-
I have found out how to use the fonts within the M5GFX library;
#include <Arduino.h> #include <M5GFX.h> M5GFX display; void setup() { display.begin(); display.setTextDatum(middle_center); uint16_t x = display.width() / 2; uint16_t y = display.height() / 2; display.setFont(&fonts::FreeMonoBold24pt7b); display.drawString("Test", x, y); } void loop() { }