#pragma once #include // Support for the Backpack FeatherWing #include // Adafruit's graphics library #include #include #include "ntp_time.h" #define DISPLAY_ADDRESS 0x70 #define BRIGHTNESS_MIN 0 #define BRIGHTNESS_MAX 15 #define BRIGHTNESS_STEP 1 #define BRIGHTNESS_NIGHT BRIGHTNESS_MIN #define BRIGHTNESS_DAY 11 #define DISPLAY_TIME 2000 #define DISPLAY_TEMP_TIME 5000 namespace Display { void display(); Task tDisplay(500, TASK_FOREVER, display, &ts, true); int currentHour = -1; int currentMin = -1; bool hourFormat24 = false; // Create display object Adafruit_7segment clockDisplay = Adafruit_7segment(); namespace Brightness { uint8_t current = BRIGHTNESS_NIGHT; void (*brightnessChangedCallback)(); void set(uint8_t value) { current = value % (BRIGHTNESS_MAX + 1); clockDisplay.setBrightness(current); brightnessChangedCallback(); } void onChanged(void (*f)()) { brightnessChangedCallback = f; } void change(bool increase) { increase ? set(current + BRIGHTNESS_STEP) : set(current - BRIGHTNESS_STEP); } void update() { currentHour > 8 && currentHour < 17 ? set(BRIGHTNESS_DAY) : set(BRIGHTNESS_NIGHT); } } void drawTime() { int displayHour = hourFormat24 ? hour() : hourFormat12(); int displayMinute = minute(); int displayValue = displayHour * 100 + displayMinute; // Print the time on the display clockDisplay.print(displayValue, DEC); // Add zero padding when in 24 hour mode and it's midnight. // In this case the print function above won't have leading 0's // which can look confusing. Go in and explicitly add these zeros. if (displayHour == 0) { clockDisplay.writeDigitNum(1, 0); if (displayMinute < 10) { clockDisplay.writeDigitNum(3, 0); } } } void drawColon(bool colonOn) { if (colonOn) { if (currentHour != hour()) { currentHour = hour(); Brightness::update(); if (currentHour == 8) Wifi::reconnect(); } if (currentMin != minute()) { currentMin = minute(); drawTime(); } } clockDisplay.drawColon(colonOn); } void display() { static bool colonOn = false; drawColon(colonOn); clockDisplay.writeDisplay(); colonOn = !colonOn; } void displayTemp(float value) { tDisplay.disable(); drawColon(false); clockDisplay.printFloat(value, 1); clockDisplay.writeDisplay(); drawTime(); tDisplay.enableDelayed(DISPLAY_TEMP_TIME); } void displayValue(uint8_t value) { tDisplay.disable(); drawColon(false); clockDisplay.print(value, HEX); clockDisplay.writeDisplay(); drawTime(); tDisplay.enableDelayed(DISPLAY_TIME); } void displayText(const char c[]) { tDisplay.disable(); drawColon(false); clockDisplay.println(c); clockDisplay.writeDisplay(); drawTime(); tDisplay.enableDelayed(DISPLAY_TIME); } void setup() { clockDisplay.begin(DISPLAY_ADDRESS); clockDisplay.setBrightness(Brightness::current); drawTime(); display(); } }