|
@@ -10,12 +10,10 @@
|
|
I2C i2c(PA_10, PA_9);
|
|
I2C i2c(PA_10, PA_9);
|
|
// SWO_Channel swo("swo");
|
|
// SWO_Channel swo("swo");
|
|
|
|
|
|
-bool LED;
|
|
|
|
|
|
+bool Tick = false;
|
|
|
|
|
|
void RtcCallback(void) {
|
|
void RtcCallback(void) {
|
|
- LED = !LED;
|
|
|
|
-
|
|
|
|
- LED_SetOutput(LED);
|
|
|
|
|
|
+ Tick = true;
|
|
}
|
|
}
|
|
|
|
|
|
int main() {
|
|
int main() {
|
|
@@ -38,51 +36,79 @@ int main() {
|
|
|
|
|
|
// swo.printf("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock);
|
|
// swo.printf("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock);
|
|
|
|
|
|
- // Bump I2C frequency to 1MHz for PCA9685
|
|
|
|
- // i2c.frequency(1000000);
|
|
|
|
|
|
+ // Bump I2C frequency to 1MHz
|
|
|
|
+ i2c.frequency(1000000);
|
|
|
|
|
|
// DS3231_SetTime(0, 55, 6, true);
|
|
// DS3231_SetTime(0, 55, 6, true);
|
|
// DS3231_SetDate(0, 2, 12, 18, 0);
|
|
// DS3231_SetDate(0, 2, 12, 18, 0);
|
|
|
|
|
|
int currMinute = 0, currHour = 0;
|
|
int currMinute = 0, currHour = 0;
|
|
int nextSecond, nextMinute, nextHour;
|
|
int nextSecond, nextMinute, nextHour;
|
|
|
|
+ int rngTick = 0;
|
|
|
|
|
|
while(1) {
|
|
while(1) {
|
|
|
|
+
|
|
|
|
+ // Animate_Cycle_Basic();
|
|
|
|
+ // Animate_Cycle_Analog();
|
|
|
|
+ // Animate_Cycle_Low_Pwm();
|
|
|
|
+ // Animate_Cycle_Pwm();
|
|
|
|
+ // Animate_Cycle_Fade();
|
|
|
|
+ // Animate_Cycle_Fade_Random();
|
|
|
|
+ // Animate_Cycle_Fast();
|
|
|
|
+ // Animate_Cycle_Fast_Random();
|
|
|
|
+
|
|
|
|
+ rngTick = rand() % 60;
|
|
|
|
+
|
|
|
|
+ if (Tick) {
|
|
|
|
|
|
- DS3231_GetTime(&nextSecond, &nextMinute, &nextHour);
|
|
|
|
|
|
+ Tick = false;
|
|
|
|
|
|
- if (nextMinute != currMinute) {
|
|
|
|
|
|
+ rngTick--;
|
|
|
|
+ if (rngTick == 0) {
|
|
|
|
|
|
- PCA9685_SetDigit(3, currMinute % 10, PCA9685_Min_Brightness);
|
|
|
|
- PCA9685_SetDigit(2, currMinute / 10, PCA9685_Min_Brightness);
|
|
|
|
|
|
|
|
- PCA9685_SetDigit(3, nextMinute % 10, PCA9685_Max_Brightness);
|
|
|
|
- PCA9685_SetDigit(2, nextMinute / 10, PCA9685_Max_Brightness);
|
|
|
|
|
|
|
|
- currMinute = nextMinute;
|
|
|
|
- }
|
|
|
|
|
|
+ rngTick = rand() % 60;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ DS3231_GetTime(&nextSecond, &nextMinute, &nextHour);
|
|
|
|
|
|
- if (nextHour != currHour) {
|
|
|
|
|
|
+ // Fade dot/digits to show the updated time
|
|
|
|
+ for (int i = 0; i < PCA9685_Max_Brightness; i += 4) {
|
|
|
|
|
|
- PCA9685_SetDigit(1, currHour % 10, PCA9685_Min_Brightness);
|
|
|
|
- PCA9685_SetDigit(0, currHour / 10, PCA9685_Min_Brightness);
|
|
|
|
|
|
+ if (nextMinute % 10 != currMinute % 10) {
|
|
|
|
+ PCA9685_SetDigit(3, currMinute % 10, PCA9685_Max_Brightness - i);
|
|
|
|
+ PCA9685_SetDigit(3, nextMinute % 10, PCA9685_Min_Brightness + i);
|
|
|
|
+ }
|
|
|
|
|
|
- PCA9685_SetDigit(1, nextHour % 10, PCA9685_Max_Brightness);
|
|
|
|
- PCA9685_SetDigit(0, nextHour / 10, PCA9685_Max_Brightness);
|
|
|
|
|
|
+ if (nextMinute / 10 != currMinute / 10) {
|
|
|
|
+ PCA9685_SetDigit(2, currMinute / 10, PCA9685_Max_Brightness - i);
|
|
|
|
+ PCA9685_SetDigit(2, nextMinute / 10, PCA9685_Min_Brightness + i);
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ if (nextHour % 10 != currHour % 10 ) {
|
|
|
|
+ PCA9685_SetDigit(1, currHour % 10, PCA9685_Max_Brightness - i);
|
|
|
|
+ PCA9685_SetDigit(1, nextHour % 10, PCA9685_Min_Brightness + i);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (nextHour / 10 != currHour / 10) {
|
|
|
|
+ PCA9685_SetDigit(0, currHour / 10, PCA9685_Max_Brightness - i);
|
|
|
|
+ if (nextHour / 10 != 0) {
|
|
|
|
+ PCA9685_SetDigit(0, nextHour / 10, PCA9685_Min_Brightness + i);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ PCA9685_SetDot(nextSecond % 2 ? i : PCA9685_Max_Brightness - i);
|
|
|
|
+
|
|
|
|
+ wait(0.0007);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ currMinute = nextMinute;
|
|
currHour = nextHour;
|
|
currHour = nextHour;
|
|
}
|
|
}
|
|
|
|
|
|
- wait(0.1);
|
|
|
|
-
|
|
|
|
- // Animate_Cycle_Basic();
|
|
|
|
- // Animate_Cycle_Analog();
|
|
|
|
- // Animate_Cycle_Low_Pwm();
|
|
|
|
- // Animate_Cycle_Pwm();
|
|
|
|
- // Animate_Cycle_Fade();
|
|
|
|
- // Animate_Cycle_Fade_Random();
|
|
|
|
- // Animate_Cycle_Fast();
|
|
|
|
- // Animate_Cycle_Fast_Random();
|
|
|
|
|
|
+ // Delay a bit to avoid constant polling
|
|
|
|
+ wait(0.001);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|