Can anyone help me understand why my Nixie Clock is running fast?

I built a Nixie clock, which is really cool and probably the coolest thing I ever built. I'm only a part-time coder, so I used code I found online and then tweaked it based on some of my own ideas and some help I got here. It's been running for about nine months now and it is about four minutes fast now. So it's fast, but not by much.

I've tried using a new RTC module and replacing the battery, neither worked. I've been over the code a million times and I just can't figure it out.

One other thing I have noticed is that the clock sometimes skips numbers on the seconds display. For example, the seconds will go from 01, 02, 04, 05 . . . It doesn't happen frequently, but I have noticed it.

Here is a video: https://www.youtube.com/watch?v=4BdckjbtDkI

Here's the code:

//clock libraries
#include <Wire.h>
#include <RTClib.h>
const int GNDPin = A2;
const int PowerPin = A3;
RTC_DS1307 rtc;

//Include shift register library
#include <ShiftRegister74HC595.h>


//Switch test
//Define switch to pin 12
const int buttonInput = 12;
//Define switch to pin 13
const int secondbuttoninput = 13;
//Set integer to see if clock is in program mode
int buttonState = 0;
//set integer to set second
//int secondbuttonstate = 0;
//Set mode for time insert
byte Mode = 0;
//Variable for cahode poision
//int PoisonCheck = 0;

//Set shift register
ShiftRegister74HC595<1> sr (2, 3, 4);
ShiftRegister74HC595<1> sr1(8, 9, 10);
ShiftRegister74HC595<1> sr2(5, 6, 7);


void setup() {
  // put your setup code here, to run once:
  pinMode(buttonInput, INPUT);
  pinMode(secondbuttoninput, INPUT);
  digitalWrite(secondbuttoninput, HIGH);
  digitalWrite(buttonInput, HIGH);
  Mode = 0;

  //Cock stuff
  pinMode(GNDPin, OUTPUT);
  pinMode(PowerPin, OUTPUT);
  digitalWrite(GNDPin, LOW);
  digitalWrite(PowerPin, HIGH);
  //  int secondtimecount = 0;

  Serial.begin(57600);
  while (!Serial); // for Leonardo/Micro/Zero

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // remove the exclamation point to set the time based on time sketch was compiled, then add the exlamation point back in and reupload in order to have it save the time when power is off
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    //rtc.adjust(DateTime(2024, 12, 25, 6, 59, 50));
  }

}


void loop() {

  buttonState = digitalRead(buttonInput);
  if (buttonState == HIGH) {

    delay(1000);

    DateTime now = rtc.now();

   
    
  if (now.hour() >= 7 && now.hour() < 23){
      if (now.second() == 0 && now.minute() % 10 == 0) {
      Serial.println("HIT");
      AntiPoison();
    }
      
      // show the time
      runseconds(now.second());
      runhours(now.hour());
      runminutes(now.minute());
    }
    else {
      // don't show the time
      turnClockOff();
    }
    
    
    Serial.print(now.hour());
    Serial.print(":");
    Serial.print(now.minute());
    Serial.print(":");
    Serial.println(now.second());

    //runseconds(now.second());
    //runhours(now.hour());
    //runminutes(now.minute());
  }
}

///////////////////////////seconds///////////////////////////////
/////////////RIGHT//////////////////////


void TurnOnR9() {
  sr.set(4, HIGH);
  sr.set(5, LOW);
  sr.set(6, LOW);
  sr.set(7, HIGH);
}
void TurnOnR8() {
  sr.set(4, LOW);
  sr.set(5, LOW);
  sr.set(6, LOW);
  sr.set(7, HIGH);
}
void TurnOnR7() {
  sr.set(4, HIGH);
  sr.set(5, HIGH);
  sr.set(6, HIGH);
  sr.set(7, LOW);
}
void TurnOnR6() {
  sr.set(4, LOW);
  sr.set(5, HIGH);
  sr.set(6, HIGH);
  sr.set(7, LOW);
}
void TurnOnR5() {
  sr.set(4, HIGH);
  sr.set(5, LOW);
  sr.set(6, HIGH);
  sr.set(7, LOW);
}
void TurnOnR4() {
  sr.set(4, LOW);
  sr.set(5, LOW);
  sr.set(6, HIGH);
  sr.set(7, LOW);
}
void TurnOnR3() {
  sr.set(4, HIGH);
  sr.set(5, HIGH);
  sr.set(6, LOW);
  sr.set(7, LOW);
}
void TurnOnR2() {
  sr.set(4, LOW);
  sr.set(5, HIGH);
  sr.set(6, LOW);
  sr.set(7, LOW);
}

void TurnOnR1() {
  sr.set(4, HIGH);
  sr.set(5, LOW);
  sr.set(6, LOW);
  sr.set(7, LOW);
}

void TurnOnR0() {
  sr.set(4, LOW);
  sr.set(5, LOW);
  sr.set(6, LOW);
  sr.set(7, LOW);
}

void TurnOffR0() {
  sr.set(4, LOW);
  sr.set(5, HIGH);
  sr.set(6, LOW);
  sr.set(7, HIGH);
}

///////////////////////LEFT////////////////////////////

void TurnOnL9() {
  sr.set(0, HIGH);
  sr.set(1, LOW);
  sr.set(2, LOW);
  sr.set(3, HIGH);
}
void TurnOnL8() {
  sr.set(0, LOW);
  sr.set(1, LOW);
  sr.set(2, LOW);
  sr.set(3, HIGH);
}
void TurnOnL7() {
  sr.set(0, HIGH);
  sr.set(1, HIGH);
  sr.set(2, HIGH);
  sr.set(3, LOW);
}
void TurnOnL6() {
  sr.set(0, LOW);
  sr.set(1, HIGH);
  sr.set(2, HIGH);
  sr.set(3, LOW);
}
void TurnOnL5() {
  sr.set(0, HIGH);
  sr.set(1, LOW);
  sr.set(2, HIGH);
  sr.set(3, LOW);
}
void TurnOnL4() {
  sr.set(0, LOW);
  sr.set(1, LOW);
  sr.set(2, HIGH);
  sr.set(3, LOW);
}
void TurnOnL3() {
  sr.set(0, HIGH);
  sr.set(1, HIGH);
  sr.set(2, LOW);
  sr.set(3, LOW);
}
void TurnOnL2() {
  sr.set(0, LOW);
  sr.set(1, HIGH);
  sr.set(2, LOW);
  sr.set(3, LOW);
}
void TurnOnL1() {
  sr.set(0, HIGH);
  sr.set(1, LOW);
  sr.set(2, LOW);
  sr.set(3, LOW);
}
void TurnOnL0() {
  sr.set(0, LOW);
  sr.set(1, LOW);
  sr.set(2, LOW);
  sr.set(3, LOW);
}
void TurnOffL0() {
  sr.set(0, LOW);
  sr.set(1, HIGH);
  sr.set(2, LOW);
  sr.set(3, HIGH);
}
//////////////////////////////Minutes//////////////////////////

////////////////////////////RIGHT/////////////////////////////
void TurnOnMR9() {
  sr2.set(4, HIGH);
  sr2.set(5, LOW);
  sr2.set(6, LOW);
  sr2.set(7, HIGH);
}
void TurnOnMR8() {
  sr2.set(4, LOW);
  sr2.set(5, LOW);
  sr2.set(6, LOW);
  sr2.set(7, HIGH);
}
void TurnOnMR7() {
  sr2.set(4, HIGH);
  sr2.set(5, HIGH);
  sr2.set(6, HIGH);
  sr2.set(7, LOW);
}
void TurnOnMR6() {
  sr2.set(4, LOW);
  sr2.set(5, HIGH);
  sr2.set(6, HIGH);
  sr2.set(7, LOW);
}
void TurnOnMR5() {
  sr2.set(4, HIGH);
  sr2.set(5, LOW);
  sr2.set(6, HIGH);
  sr2.set(7, LOW);
}
void TurnOnMR4() {
  sr2.set(4, LOW);
  sr2.set(5, LOW);
  sr2.set(6, HIGH);
  sr2.set(7, LOW);
}
void TurnOnMR3() {
  sr2.set(4, HIGH);
  sr2.set(5, HIGH);
  sr2.set(6, LOW);
  sr2.set(7, LOW);
}
void TurnOnMR2() {
  sr2.set(4, LOW);
  sr2.set(5, HIGH);
  sr2.set(6, LOW);
  sr2.set(7, LOW);
}
void TurnOnMR1() {
  sr2.set(4, HIGH);
  sr2.set(5, LOW);
  sr2.set(6, LOW);
  sr2.set(7, LOW);
}
void TurnOnMR0() {
  sr2.set(4, LOW);
  sr2.set(5, LOW);
  sr2.set(6, LOW);
  sr2.set(7, LOW);
}

void TurnOffMR0() {
  sr2.set(4, LOW);
  sr2.set(5, HIGH);
  sr2.set(6, LOW);
  sr2.set(7, HIGH);
}

///////////////////////LEFT////////////////////////////

void TurnOnML9() {
  sr2.set(0, HIGH);
  sr2.set(1, LOW);
  sr2.set(2, LOW);
  sr2.set(3, HIGH);
}
void TurnOnML8() {
  sr2.set(0, LOW);
  sr2.set(1, LOW);
  sr2.set(2, LOW);
  sr2.set(3, HIGH);
}
void TurnOnML7() {
  sr2.set(0, HIGH);
  sr2.set(1, HIGH);
  sr2.set(2, HIGH);
  sr2.set(3, LOW);
}
void TurnOnML6() {
  sr2.set(0, LOW);
  sr2.set(1, HIGH);
  sr2.set(2, HIGH);
  sr2.set(3, LOW);
}
void TurnOnML5() {
  sr2.set(0, HIGH);
  sr2.set(1, LOW);
  sr2.set(2, HIGH);
  sr2.set(3, LOW);
}
void TurnOnML4() {
  sr2.set(0, LOW);
  sr2.set(1, LOW);
  sr2.set(2, HIGH);
  sr2.set(3, LOW);
}
void TurnOnML3() {
  sr2.set(0, HIGH);
  sr2.set(1, HIGH);
  sr2.set(2, LOW);
  sr2.set(3, LOW);
}
void TurnOnML2() {
  sr2.set(0, LOW);
  sr2.set(1, HIGH);
  sr2.set(2, LOW);
  sr2.set(3, LOW);
}

void TurnOnML1() {
  sr2.set(0, HIGH);
  sr2.set(1, LOW);
  sr2.set(2, LOW);
  sr2.set(3, LOW);
}
void TurnOnML0() {
  sr2.set(0, LOW);
  sr2.set(1, LOW);
  sr2.set(2, LOW);
  sr2.set(3, LOW);
}

void TurnOffML0() {
  sr2.set(0, LOW);
  sr2.set(1, HIGH);
  sr2.set(2, LOW);
  sr2.set(3, HIGH);
}

//////////////////////////////Hours//////////////////////////

/////////////////////////////RIGHT/////////////////////////////

void TurnOnHR9() {
  sr1.set(4, HIGH);
  sr1.set(5, LOW);
  sr1.set(6, LOW);
  sr1.set(7, HIGH);
}
void TurnOnHR8() {
  sr1.set(4, LOW);
  sr1.set(5, LOW);
  sr1.set(6, LOW);
  sr1.set(7, HIGH);
}
void TurnOnHR7() {
  sr1.set(4, HIGH);
  sr1.set(5, HIGH);
  sr1.set(6, HIGH);
  sr1.set(7, LOW);
}
void TurnOnHR6() {
  sr1.set(4, LOW);
  sr1.set(5, HIGH);
  sr1.set(6, HIGH);
  sr1.set(7, LOW);
}
void TurnOnHR5() {
  sr1.set(4, HIGH);
  sr1.set(5, LOW);
  sr1.set(6, HIGH);
  sr1.set(7, LOW);
}
void TurnOnHR4() {
  sr1.set(4, LOW);
  sr1.set(5, LOW);
  sr1.set(6, HIGH);
  sr1.set(7, LOW);
}
void TurnOnHR3() {
  sr1.set(4, HIGH);
  sr1.set(5, HIGH);
  sr1.set(6, LOW);
  sr1.set(7, LOW);
}
void TurnOnHR2() {
  sr1.set(4, LOW);
  sr1.set(5, HIGH);
  sr1.set(6, LOW);
  sr1.set(7, LOW);
}
void TurnOnHR1() {
  sr1.set(4, HIGH);
  sr1.set(5, LOW);
  sr1.set(6, LOW);
  sr1.set(7, LOW);
}
void TurnOnHR0() {
  sr1.set(4, LOW);
  sr1.set(5, LOW);
  sr1.set(6, LOW);
  sr1.set(7, LOW);
}

void TurnOffHR0() {
  sr1.set(4, LOW);
  sr1.set(5, HIGH);
  sr1.set(6, LOW);
  sr1.set(7, HIGH);
}
///////////////////////LEFT////////////////////////////

void TurnOnHL9() {
  sr1.set(0, HIGH);
  sr1.set(1, LOW);
  sr1.set(2, LOW);
  sr1.set(3, HIGH);
}
void TurnOnHL8() {
  sr1.set(0, LOW);
  sr1.set(1, LOW);
  sr1.set(2, LOW);
  sr1.set(3, HIGH);
}
void TurnOnHL7() {
  sr1.set(0, HIGH);
  sr1.set(1, HIGH);
  sr1.set(2, HIGH);
  sr1.set(3, LOW);
}
void TurnOnHL6() {
  sr1.set(0, LOW);
  sr1.set(1, HIGH);
  sr1.set(2, HIGH);
  sr1.set(3, LOW);
}
void TurnOnHL5() {
  sr1.set(0, HIGH);
  sr1.set(1, LOW);
  sr1.set(2, HIGH);
  sr1.set(3, LOW);
}
void TurnOnHL4() {
  sr1.set(0, LOW);
  sr1.set(1, LOW);
  sr1.set(2, HIGH);
  sr1.set(3, LOW);
}
void TurnOnHL3() {
  sr1.set(0, HIGH);
  sr1.set(1, HIGH);
  sr1.set(2, LOW);
  sr1.set(3, LOW);
}
void TurnOnHL2() {
  sr1.set(0, LOW);
  sr1.set(1, HIGH);
  sr1.set(2, LOW);
  sr1.set(3, LOW);
}
void TurnOnHL1() {
  sr1.set(0, HIGH);
  sr1.set(1, LOW);
  sr1.set(2, LOW);
  sr1.set(3, LOW);
}
void TurnOnHL0() {
  sr1.set(0, LOW);
  sr1.set(1, LOW);
  sr1.set(2, LOW);
  sr1.set(3, LOW);
}
void TurnOffHL0() {
  sr1.set(0, LOW);
  sr1.set(1, HIGH);
  sr1.set(2, LOW);
  sr1.set(3, HIGH);
}
/////////////////Run second///////////////////
void runseconds(int seconds) {
  int tens = seconds / 10;
  int digits = seconds % 10;

  switch (tens) {
    case 0: TurnOnL0(); break;
    case 1: TurnOnL1(); break;
    case 2: TurnOnL2(); break;
    case 3: TurnOnL3(); break;
    case 4: TurnOnL4(); break;
    case 5: TurnOnL5(); break;
  }


  switch (digits) {
    case 0: TurnOnR0(); break;
    case 1: TurnOnR1(); break;
    case 2: TurnOnR2(); break;
    case 3: TurnOnR3(); break;
    case 4: TurnOnR4(); break;
    case 5: TurnOnR5(); break;
    case 6: TurnOnR6(); break;
    case 7: TurnOnR7(); break;
    case 8: TurnOnR8(); break;
    case 9: TurnOnR9(); break;
  }
}


/////////////////////runhours////////////////////////
void runhours(int hour) {
  // hour comes in 0..23 so convert to 12 hour format and make 0  be 12

  if ( hour > 12 ) hour -= 12;
  if ( hour == 0 ) hour = 12;

  if ( hour > 9 ) {
    TurnOnHL1();
  }
  else {
    TurnOnHL0();
  }

  switch (hour) {
    case 0: TurnOnHR0(); break;
    case 1: TurnOnHR1(); break;
    case 2: TurnOnHR2(); break;
    case 3: TurnOnHR3(); break;
    case 4: TurnOnHR4(); break;
    case 5: TurnOnHR5(); break;
    case 6: TurnOnHR6(); break;
    case 7: TurnOnHR7(); break;
    case 8: TurnOnHR8(); break;
    case 9: TurnOnHR9(); break;
    case 10: TurnOnHR0(); break;
    case 11: TurnOnHR1(); break;
    case 12: TurnOnHR2(); break;
  }
}

/////////////////////////////Minutes///////////////////////////
void runminutes(int minutes) {
  int tens = minutes / 10;
  int digits = minutes % 10;

  switch (tens) {
    case 0: TurnOnML0(); break;
    case 1: TurnOnML1(); break;
    case 2: TurnOnML2(); break;
    case 3: TurnOnML3(); break;
    case 4: TurnOnML4(); break;
    case 5: TurnOnML5(); break;
  }

  //////////Move by second, R////////////////

  switch (digits) {
    case 0: TurnOnMR0(); break;
    case 1: TurnOnMR1(); break;
    case 2: TurnOnMR2(); break;
    case 3: TurnOnMR3(); break;
    case 4: TurnOnMR4(); break;
    case 5: TurnOnMR5(); break;
    case 6: TurnOnMR6(); break;
    case 7: TurnOnMR7(); break;
    case 8: TurnOnMR8(); break;
    case 9: TurnOnMR9(); break;
  }
}

/////////Cycle and prevent poision/////////
void AntiPoison() {
  //turn on 0 sequence
  TurnOnR0();
  TurnOnL0();
  TurnOnMR0();
  TurnOnML0();
  TurnOnHR0();
  TurnOnHL0();
  delay(2000);
  TurnOnR1();
  TurnOnL1();
  TurnOnMR1();
  TurnOnML1();
  TurnOnHR1();
  TurnOnHL1();
  delay(2000);
  TurnOnR2();
  TurnOnL2();
  TurnOnMR2();
  TurnOnML2();
  TurnOnHR2();
  TurnOnHL2();
  delay(2000);
  TurnOnR3();
  TurnOnL3();
  TurnOnMR3();
  TurnOnML3();
  TurnOnHR3();
  TurnOnHL3();
  delay(2000);
  TurnOnR4();
  TurnOnL4();
  TurnOnMR4();
  TurnOnML4();
  TurnOnHR4();
  TurnOnHL4();
  delay(2000);
  TurnOnR5();
  TurnOnL5();
  TurnOnMR5();
  TurnOnML5();
  TurnOnHR5();
  TurnOnHL5();
  delay(2000);
  TurnOnR6();
  TurnOnL6();
  TurnOnMR6();
  TurnOnML6();
  TurnOnHR6();
  TurnOnHL6();
  delay(2000);
  TurnOnR7();
  TurnOnL7();
  TurnOnMR7();
  TurnOnML7();
  TurnOnHR7();
  TurnOnHL7();
  delay(2000);
  TurnOnR8();
  TurnOnL8();
  TurnOnMR8();
  TurnOnML8();
  TurnOnHR8();
  TurnOnHL8();
  delay(2000);
  TurnOnR9();
  TurnOnL9();
  TurnOnMR9();
  TurnOnML9();
  TurnOnHR9();
  TurnOnHL9();
  delay(2000);

}

void turnClockOff() {
  TurnOffR0();
  TurnOffL0();
  TurnOffMR0();
  TurnOffML0();
  TurnOffHR0();
  TurnOffHL0();
}

I hear the DS3231 is more accurate, and the DS1307 is prone to daily drift.

You'll want to fix this one...

An RTC is only as accurate as the 32kHz crystal it runs off. Getting it to be perfectly accurate is really hard and involves calibration as well as temperature control.

The most straightforward fix is really to just include a WiFi module and sync time with NTP. It's a lot easier and dependable than trying to get an RTC to not drift over the course of months.

What is the purpose of the 1 second delay here? Is it to slow down the loop so that writing the time to the tubes happens once a second -ish? That may well explain the skipped seconds.

You could monitor the seconds from the RTC and only update the tubes when the seconds value is different from the previous seconds value.

1 Like

You are in the 10ppm range for accuracy. This is good for a DS1307 with external crystal. For better accuracy go to the DS3231 as mentioned above. It has an internal temperature compensated oscillator and is 2.5ppm for human tolerable temperatures.

That is much better than I would expect for a DS1307. The DS3231 modules are accurate to about one minute drift per year.

1 Like
      // show the time
      if (now.second() != oldSecond) { // oldSecond - add this global variable
        oldSecond = now.second();
        runseconds(now.second());
        runminutes(now.minute());
        runhours(now.hour());

        if (now.hour() < 10) Serial.print(0);
        Serial.print(now.hour());
        Serial.print(":");
        if (now.minute() < 10) Serial.print(0);
        Serial.print(now.minute());
        Serial.print(":");
        if (now.second() < 10) Serial.print(0);
        Serial.println(now.second());
      }

And why, between the hours of 7 and 22 (10p) every ten minutes, is an "anti-poison" run that turns on every digit for two seconds (0 through 9)?

     if (now.hour() >= 7 && now.hour() < 23) {
       if (now.second() == 0 && now.minute() % 10 == 0) {
         Serial.println("HIT");
         AntiPoison();
       }

really? powering RTC module thru digital pins? did the 5V and GND rails something bad for you?

1 Like

Hi, @kevinbright

Can you please post a copy of your circuit, a picture of a hand drawn circuit in jpg, png?
Hand drawn and photographed is perfectly acceptable.
Please include ALL hardware, power supplies, component names and pin labels.

This will help us immensly.

Thanks.. Tom... :smiley: :+1: :coffee: :australia:

There is massive room for improvement here. A huge amount of repetition can be removed.

ShiftRegister74HC595<1> sr (2, 3, 4);
ShiftRegister74HC595<1> sr1(8, 9, 10);
ShiftRegister74HC595<1> sr2(5, 6, 7);

Did you know you can cascade/chain shift registers? This would save you 6 Arduino pins and help make your code simpler. All the shift registers can share the same clock and latch pins. The Q7' pin on the first shift register can be connected to the data in pin of the second register and so on.

void TurnOnR9() {
  sr.set(4, HIGH);
  sr.set(5, LOW);
  sr.set(6, LOW);
  sr.set(7, HIGH);
}

This code is repeated 60 times! You may have set a new record there! Only minor details are different between each function.

If you are interested, the forum can help you clean up all these repetitions.

1 Like

Indeed; to be honest, I only went through the code briefly and concluded that it's just too tedious to try and trace any problems in it. It's a bit like looking at one of those optical illusions of squares and lines where your brain starts to project dots etc.

//clock libraries
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
const byte sr[3][3] = {{2, 3, 4}, {8, 9, 10}, {5, 6, 7}} ;

void setup() {
  Serial.begin(115200);
  while (!Serial); // for Leonardo/Micro/Zero
  Serial.println(F("NixieClock:3x74HC595+3x74HC42+6xNixieTube"));
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println(F("RTC is NOT running!"));
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  Serial.end();
for(int i=2;i<11;i++)pinMode(i,OUTPUT);
}

void loop() {
  static uint32_t oldMillis = 0;
  if (millis() - oldMillis < 1000)return;
  oldMillis = oldMillis + 1000;
  DateTime now = rtc.now();
  byte Hour = now.hour();

  if (Hour >= 23 && Hour < 7) {
    Update(0xFF, 0xFF, 0xFF); //off
    delay(60000);
    return;
  }
  Update(Hour, now.minute(), now.second());
}
void  Update(byte h, byte m, byte s) {
  shiftOut(sr[0][0], sr[0][1], LSBFIRST, mod(h));
  digitalWrite(sr[0][2], HIGH);
  digitalWrite(sr[0][2], LOW);

  shiftOut(sr[1][0], sr[1][1], LSBFIRST, mod(m));
  digitalWrite(sr[1][2], HIGH);
  digitalWrite(sr[1][2], LOW);

  shiftOut(sr[2][0], sr[2][1], LSBFIRST, mod(s));
  digitalWrite(sr[2][2], HIGH);
  digitalWrite(sr[2][2], LOW);
}
byte mod(byte b) {
  if (b!=0xFF)return ((b / 10) << 4) | (b % 10); // I'm not sure about order may be "(b / 10) | ((b % 10)<< 4)" 
else return b;
}

This also can be changed to have one object with 3 registers... according to the library.

Indeed, simplifying the code as I was saying. :wink:

maybe it is 3 PCBs modules with only 5 input pins

That's because the tubes need to be cycled through periodically or they go bad. They can't stay static on one digit for long. So the hours and minutes digits need to get cycled. The time is because the tubes turn off between 10 p.m. and 7 a.m. to also help them from wearing out.

The nixie tube instructions are for best practice. In the way-back-machine, I used a calculator with nixie tubes, and I was in the habit of turning it on, using, off. I probably got those instructions day-1 and forgot.

Are you considering the slightly more accurate DS3231 or looking for a "time-correction code" solution?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.