Browse Source

Fixed fade animation for dot/digits

Kevin Lee 5 years ago
parent
commit
304be39a3b
2 changed files with 57 additions and 29 deletions
  1. 55 29
      Nixie_Firmware_Mbed/main.cpp
  2. 2 0
      Nixie_Firmware_Mbed/pca9685.cpp

+ 55 - 29
Nixie_Firmware_Mbed/main.cpp

@@ -10,12 +10,10 @@
 I2C i2c(PA_10, PA_9);
 // SWO_Channel swo("swo");
 
-bool LED;
+bool Tick = false;
 
 void RtcCallback(void) {
-    LED = !LED;
-
-    LED_SetOutput(LED);
+    Tick = true;
 }
 
 int main() {
@@ -38,51 +36,79 @@ int main() {
     
     // 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_SetDate(0, 2, 12, 18, 0);
 
     int currMinute = 0, currHour = 0;
     int nextSecond, nextMinute, nextHour;
+    int rngTick = 0;
 
     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;
         }
 
-        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);
     }
 }
 

+ 2 - 0
Nixie_Firmware_Mbed/pca9685.cpp

@@ -70,6 +70,8 @@ void PCA9685_SetDigit(int Tube, int Digit, int Brightness) {
 
 void PCA9685_SetDot(int Brightness) {
     LED_CTRL reg = {0};
+
+    Brightness /= 2;
     
     if (Brightness >= PCA9685_Max_Brightness) {
         reg.ON_FULL = 1;