Skip to content

Instantly share code, notes, and snippets.

@mzero
Created July 26, 2020 23:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mzero/c2c501a0334610a8d998c7aa34b40f40 to your computer and use it in GitHub Desktop.
Save mzero/c2c501a0334610a8d998c7aa34b40f40 to your computer and use it in GitHub Desktop.
#include "RTClib.h"
#include <Adafruit_MCP23017.h>
#define NUM_ONES_LEDS 4
RTC_DS3231 rtc;
Adafruit_MCP23017 mcpMinutes;
Adafruit_MCP23017 mcpHours;
Adafruit_MCP23017 mcpMonths;
Adafruit_MCP23017 mcpDayLow;
Adafruit_MCP23017 mcpDayHigh;
enum {
pinMinute4 = 0,
pinMinute3,
pinMinute2,
pinMinute1,
pinMinute55,
pinMinute50,
pinMinute45,
pinMinute40,
pinMinute35,
pinMinute30,
pinMinute25,
pinMinute20,
pinMinute15,
pinMinute10,
pinMinute5,
pinMinuteFirst = pinMinute4,
pinMinuteLast = pinMinute5,
pinHour12 = 0,
pinHour11,
pinHour10,
pinHour9,
pinHour8,
pinHour7,
pinHour6,
pinHour5,
pinHour4,
pinHour3,
pinHour2,
pinHour1,
pinHourFirst = pinHour12,
pinHourLast = pinHour1,
pinMonthJAN = 0,
pinMonthFEB,
pinMonthMAR,
pinMonthAPR,
pinMonthMAY,
pinMonthJUN,
pinMonthJUL,
pinMonthAUG,
pinMonthSEP,
pinMonthOCT,
pinMonthNOV,
pinMonthDEC,
pinMonthFirst = pinMonthJAN,
pinMonthLast = pinMonthDEC,
pinDayLowFirst = 0,
pinDayLowLast = 14,
pinDayHighFirst = 0,
pinDayHighLast = 15,
};
void setupMCP(
Adafruit_MCP23017& mcp, uint8_t addr, uint8_t pinFirst, uint8_t pinLast)
{
mcp.begin(addr);
for (uint8_t pin = pinFirst; pin <= pinLast; ++pin) {
mcp.pinMode(pin, OUTPUT);
mcp.digitalWrite(pin, LOW);
}
}
void range(
uint8_t value,
Adafruit_MCP23017& mcp,
uint8_t pintFirstValue,
uint8_t pinFirst, uint8_t pinLast)
// Set all the pins from first to last: HIGH if the pin's value is less than
// or equal to the given value, LOW otherwise.
// The value of the first pin is given by pinFirstValue.
// Note that pinFirst may be less than or greater than pinLast, depending
// on the direction of the indicators.
{
uint8_t direction = pinFirst < pinLast ? 1 : -1;
uint8_t pin = pinFirst;
uint8_t pinValue = pintFirstValue;
while (pin != pinLast) {
mcp.digitalWrite(pin, pinValue <= value ? HIGH : LOW);
pin += direction;
pinValue += 1;
}
}
const char* daysOfTheWeek[] = {
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
};
void setup () {
setupMCP(mcpMinutes, B000, pinMinuteFirst, pinMinuteLast);
setupMCP(mcpHours, B001, pinHourFirst, pinHourLast);
setupMCP(mcpMonths, B010, pinMonthFirst, pinMonthLast);
setupMCP(mcpDayLow, B100, pinDayLowFirst, pinDayLowLast);
setupMCP(mcpDayHigh, B011, pinDayHighFirst,pinDayHighLast);
Serial.begin(115200);
while (!Serial); // comment this out if you don't want to wait for the IDE
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop () {
//rtc
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print("Temperature: ");
Serial.print(rtc.getTemperature());
Serial.println(" C");
Serial.println();
range(now.minute() % 5, mcpMinutes, 1, pinMinute1, pinMinute4);
range(now.minute() / 5, mcpMinutes, 1, pinMinute5, pinMinute55);
range((now.hour() - 1) % 12 + 1,
mcpHours, 1, pinHour1, pinHour12);
range(now.month(), mcpMonths, 1, pinMonthJAN, pinMonthDEC);
range(now.day(), mcpDayLow, 1, pinDayLowFirst, pinDayLowLast);
range(now.day(), mcpDayHigh, 16, pinDayHighFirst, pinDayHighLast);
delay(1000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment