Skip to main content

Analog clock torture test

After playing around with things a bit, I find that I am able to run the clock forward at 8x speed (125ms/tick), but only able to do so reliably in reverse at 4x speed (250ms/tick).

So here is the "torture test" I have devised. It fastforwards the clock for 60 ticks, then reverse the direction for another 60 ticks. At the end of it, the second hand should return to the original position. By running this in a loop for many hours, I can confirm that there is no slippage for a given set of parameters.

The parameters for this particular clock (another $2 clock I picked up from KMart after I accidentally stepped on and broke the Ikea one) are:
  • Forward : 32ms pulse (9ms on, 1ms off)
  • Reverse : 12ms pulse, 12ms wait, 28ms pulse

The high-level code to implement the above looks like this:

void forward_tick() {
  for (int i=0; i<32; i++) {
    digitalWrite(tickpin, HIGH); delayMicroseconds(900);
    digitalWrite(tickpin, LOW); delayMicroseconds(100);
} tickpin = (tickpin == 25 ? 27 : 25); } void reverse_tick() { digitalWrite(tickpin, HIGH); delay(12); digitalWrite(tickpin, LOW); delay(12); tickpin = (tickpin == 25 ? 27 : 25); digitalWrite(tickpin, HIGH); delay(28);
  digitalWrite(tickpin, LOW);

It is actually OK for the reverse tick to run slower because if you are trying to catch up to a certain time by running in reverse, the clock is still ticking ahead. So say if it's 3am now and I am trying to reverse back to 2am, that's 60 minutes worth of path to backtrace. At 4x speed, it will take me 60/4 = 15 minutes to do so. But in that 15 minutes, the clock has also moved ahead 15 minutes, so that's actually more like 45 minutes worth of time to backtrace.

Whereas if it's 2am and I am trying to fastforward to 3pm, again that's 60 minutes worth of time to traverse. At 8x speed, it will take me 60/8 = 7.5 minutes. But in that time, the clock has also moved ahead 7.5 minutes, so it will take me more than 7.5 minutes to catch up with the clock.

I need to come out with a function to calculate given the current and target time, how much time it will take me to fastforward or reverse to the desired position. Then it will provide an objective measure for the optimal route to take when the clock needs to catch up with the actual time.



  1. I never thought I would see someone as addicted to this stuff as me.

    Countless hours poured into making a dashboard of meters using the hacked clocks.

    After many futile attempts only now managed to get a clock going forward (the wires would come off with my limited soldering skills)

    Thanks for posting your discoveries. Helps many a lot.

    Going to try your PWM method.

  2. Ha ha! Nice to see someone working on this as well. I have been working on this clock stuff on-and-off for a few years now, mainly to see if it's possible that make a WiFi analog clock that works reliably and reasonably well on batteries. My friends just think I am wasting my time.

    I was elated when I discovered I could make the clock go in reverse. Didn't think it was possible! And quite reliably as well. Now I have to go back and rip up my ULP code to incorporate the reverse logic.

  3. With your advanced electronic skills wouldn't it be possible to make the clock use the esp32 only for time sync purposes and let the clock run "normally" otherwise ?


Post a Comment

Popular posts from this blog

Update: Line adapter for Ozito Blade Trimmer

Update (Dec 2021): If you access to a 3D printer, I would now recommend this solution , which makes it super easy to replace the trimmer line. I have been using it for a few months now with zero issue.

Attiny85 timer programming using Timer1

This Arduino sketch uses Timer1 to drive the LED blinker: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 /* * Program ATTiny85 to blink LED connected to PB1 at 1s interval. * Assumes ATTiny85 is running at 1MHz internal clock speed. */ #include <avr/io.h> #include <avr/wdt.h> #include <avr/sleep.h> #include <avr/interrupt.h> bool timer1 = false , led = true ; // Interrupt service routine for timer1 ISR(TIMER1_COMPA_vect) { timer1 = true ; } void setup() { // Setup output pins pinMode( 1 , OUTPUT); digitalWrite( 1 , led); set_sleep_mode(SLEEP_MODE_IDLE); // Setup timer1 to interrupt every second TCCR1 = 0 ; // Stop timer TCNT1 = 0 ; // Zero timer GTCCR = _BV(PSR1); // Reset prescaler OCR1A = 243 ; // T = prescaler / 1MHz = 0.004096s; OCR1A = (1s/T) - 1 = 243 OCR1C = 243 ; // Set to same value to reset timer1 to

3D Printer Filament Joiner

I have been looking at various ways of joining 3D printing filaments. One method involves running one end of a filament through a short PTFE tubing, melting it with a lighter or candle, retracting it back into the tubing and immediately plunging the filament to be fused into the tubing: One problem with this method is that you can't really control the temperature at which you melt the filament, so you frequently end up with a brittle joint that breaks upon the slightest bend. Aliexpress even sells a contraption that works along the same line. As it uses a lighter or candle as well, it suffers from the same weakness. I am not even sure why you need a special contraption when a short PTFE tubing will work just as well. Another method involves using shrink tubing/aluminium foil, and a heat gun: But a heat gun is rather expensive, so I wanted to explore other alternatives. The candle + PTFE tubing method actually works quite well when you happen to melt it at the rig