Nixie clock hours digit not working correctly

I am sort of still new to programing, but I built a Nixie Clock that runs off an Ardunio. I followed a tutorial online and everything works, but I have a weird bug where the hours digits, which consist of two nixie tubes, displays 00 when the hours should be noon, 10 p.m., 11, p.m. or midnight. For example, if the time is 12:34 a.m., my clock shows 00:34.

I have spent hours reviewing the sample code and I cannot figure out how to fix it. I can post the entire code, but I think this is where the issues is and I think it relates to the conversion of 24-hour time (i.e., 13:42), to 12-hour time (i.e., 1:42 p.m.):

for(hourtime = now.hour(); hourtime >= 10; hourtime = hourtime - 10){
 if (now.hour() >= 12){
   counthour = 0;
   hourtime = hourtime - 2;
 }else{
int hourtimecount = 1 + hourtimecount;
++counthour;
 }
}

runhours();

counthour=0;

I'm using an RTC1302, so the now.hour() function gets the time from the RTC chip. Here is the runhours() function:

void runhours(){
if (counthour == 0){
  TurnOnHL0();
}
if (counthour == 1){
  TurnOnHL1();
}

The clock uses 74141 chips, which take binary inputs and converts them to the digits from 0 to 9. Because this is the left digit of the hours digit, it is only a 0 or 1 when converted to 12-hour time.

Here are the TurnOn functions, which send the binary commands to the 74141 chips:

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);
}

If your RTC reports 12:34 am, now.hour() will return 0 since it is stores the time as 00:34. That means your for() loop

for(hourtime = now.hour(); hourtime >= 10; hourtime = hourtime - 10){

will immediately be false an never execute.

Do you have your RTC programmed to report in a 24 hour or 12 hour format?

Your code snipped (which is a bad idea - always post ALL your code) seems overly complicated.

If your RTC is reporting in 24 hour format, the hour will be 0-23.
If hour is above 11, then it is pm (don't know if you care). Subtract 12 from hour so it is 0-11.
if hour > 9, turn on HL1() else turn on HL0()

1 Like

Thanks... I believe the RTC is set to 24-hour format, which is the reason for the if statement in the loop. I didn't write this code, so it's hard for me to get my head around it. But if what you are saying is correct, then this would be an issue for all p.m. times after noon. But in my case, it's only an issue when the left most digits try to display noon hour (i.e., when 24-hour time is 12), 10 p.m. (when 24-hour time is 22), and 11 p.m. (when 24-hour time is 23). In those cases, my clock displays 00 for the hours positions, such as 00:12:34, rather than 11:12:34 p.m., for example.

Here's the whole code:

//clock libraries
#include <Wire.h>
#include <RTClib.h>
#include <RealTimeClockDS1307.h>
int GNDPin = A2;
int PowerPin = A3;
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int count = 0;
int secondtime;
int counthour = 0;
int hourtime;
int countminute = 0;
int minutetime;
int stopsecondtime;
int stopminutetime;
int stophourtime;

//test
int currentyear = 0;
int currentmonth;
int currentday;
int currentHour;
int currentminute;
int currentsecond;


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


//Switch test 
//Define switch to pin 12
int buttonInput = 12;
//Define switch to pin 13
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;
  
  while (!Serial); // for Leonardo/Micro/Zero

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

  if ( rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // 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, 19, 59, 56));
  }

//Serial.println();
//Serial.print("GO");
//Serial.println();
//delay(3000);
//Serial.print("0");
//TurnOnML0();
//TurnOnMR0();
//delay(5000); 
//Serial.print("1");
//TurnOnML1();
//TurnOnMR1();
//delay(5000); 
//Serial.print("2");
//TurnOnML2();
//TurnOnMR2();
//delay(5000); 
//Serial.print("3");
//TurnOnML3();
//TurnOnMR3();
//delay(5000); 
//Serial.print("4");
//TurnOnML4();
//TurnOnMR4();
//delay(5000);
//Serial.print("5"); 
//TurnOnML5();
//TurnOnMR5();
//delay(5000); 
//Serial.print("6");
//TurnOnML6();
//TurnOnMR6();
//delay(5000); 
//Serial.print("7");
//TurnOnML7();
//TurnOnMR7();
//delay(5000); 
//Serial.print("8");
//TurnOnML8();
//TurnOnMR8();
//delay(5000); 
//Serial.print("9");
//TurnOnML9();
//TurnOnMR9();
//delay(5000); 
//  
  }


void loop() {

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

delay(1000);

DateTime now =rtc.now();

//while (now.hour() >= 20){
  //turnClockOff(); 
//}

//Cathode prevention////////////////////////////////////////
if (now.minute() == 10){
  if (now.second() == 0) {
  Serial.print("HIT");
  AntiPoison();
  }
}
if (now.minute() == 20){
  if (now.second() == 0) {
  Serial.print("HIT");
  AntiPoison();
  }
}
if (now.minute() == 30){
  if (now.second() == 0) {
  Serial.print("HIT");
  AntiPoison();
  }
}
if (now.minute() == 40){
  if (now.second() == 0) {
  Serial.print("HIT");
  AntiPoison();
  }
}
if (now.minute() == 50){
  if (now.second() == 0) {
  Serial.print("HIT");
  AntiPoison();
  }
}
if (now.minute() == 0){
  if (now.second() == 0){
  Serial.print("HIT");
  AntiPoison();
  }
}
/////////////////////////////////////////////////////////

Serial.println();
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.print(now.second());

//////////////Seconds//////////////
for(secondtime = now.second(); secondtime >= 10; secondtime = secondtime - 10){
int secondtimecount = 1 + secondtimecount;
++count;
}
runseconds();



count=0;

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

for(hourtime = now.hour(); hourtime >= 10; hourtime = hourtime - 10){
  if (now.hour() >= 12){
    counthour = 0;
    hourtime = hourtime - 2;
  }else{
int hourtimecount = 1 + hourtimecount;
++counthour;
  }
}

runhours();

counthour=0;

////////////////////////////////////////////Minutes////////////////////////////////////

for(minutetime = now.minute(); minutetime >= 10; minutetime = minutetime - 10){
int minutetimecount = 1 + minutetimecount;
++countminute;
}

runminutes();
countminute=0;


//button state high
//else{
  }
 }
  



void SwitchCheck(){
}

///////////////////////////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(){
if (count == 0){
  TurnOnL0();
}
if (count == 1){
  TurnOnL1();
}
if (count == 2){
  TurnOnL2();
}
if (count == 3){
  TurnOnL3();
}
if (count == 4){
  TurnOnL4();
}
if (count == 5){
  TurnOnL5();
}

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

if (secondtime == 0){
  TurnOnR0();
}
if (secondtime == 1){
  TurnOnR1();
}
if (secondtime == 2){
  TurnOnR2();
}
if (secondtime == 3){
  TurnOnR3();
}
if (secondtime == 4){
  TurnOnR4();
}
if (secondtime == 5){
  TurnOnR5();
}
if (secondtime == 6){
  TurnOnR6();
}
if (secondtime == 7){
  TurnOnR7();
}
if (secondtime == 8){
  TurnOnR8();
}
if (secondtime == 9){
  TurnOnR9();
}
}

/////////////////////runhours////////////////////////
void runhours(){
if (counthour == 0){
  TurnOnHL0();
}
if (counthour == 1){
  TurnOnHL1();
}

//////////Move by hour, R////////////////

if (hourtime == 0){
  TurnOnHR0();
}
if (hourtime == 1){
  TurnOnHR1();
}
if (hourtime == 2){
  TurnOnHR2();
}
if (hourtime == 3){
  TurnOnHR3();
}
if (hourtime == 4){
  TurnOnHR4();
}
if (hourtime == 5){
  TurnOnHR5();
}
if (hourtime == 6){
  TurnOnHR6();
}
if (hourtime == 7){
  TurnOnHR7();
}
if (hourtime == 8){
  TurnOnHR8();
}
if (hourtime == 9){
  TurnOnHR9();
}
}

/////////////////////////////Minutes///////////////////////////
void runminutes(){
if (countminute == 0){
  TurnOnML0();
}
if (countminute == 1){
  TurnOnML1();
}
if (countminute == 2){
  TurnOnML2();
}
if (countminute == 3){
  TurnOnML3();
}
if (countminute == 4){
  TurnOnML4();
}
if (countminute == 5){
  TurnOnML5();
}

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

if (minutetime == 0){
  TurnOnMR0();
}
if (minutetime == 1){
  TurnOnMR1();
}
if (minutetime == 2){
  TurnOnMR2();
}
if (minutetime == 3){
  TurnOnMR3();
}
if (minutetime == 4){
  TurnOnMR4();
}
if (minutetime == 5){
  TurnOnMR5();
}
if (minutetime == 6){
  TurnOnMR6();
}
if (minutetime == 7){
  TurnOnMR7();
}
if (minutetime == 8){
  TurnOnMR8();
}
if (minutetime == 9){
  TurnOnMR9();
}
}

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

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

That don't look right. Can you explain the code where it is in you sketch?

a7

I posted the entire sketch. That part is where i thought the problem is.

That code is not very well written, wherever you got it. This piece of code

   for (hourtime = now.hour(); hourtime >= 10; hourtime = hourtime - 10) {
      if (now.hour() >= 12) {
        counthour = 0;
        hourtime = hourtime - 2;
      } else {
        ++counthour;
      }
    }

gives this


Simulation
Ready
hour: 0 count: 0
hour: 1 count: 0
hour: 2 count: 0
hour: 3 count: 0
hour: 4 count: 0
hour: 5 count: 0
hour: 6 count: 0
hour: 7 count: 0
hour: 8 count: 0
hour: 9 count: 0
hour: 10 count: 1
hour: 11 count: 1
hour: 12 count: 0
hour: 13 count: 0
hour: 14 count: 0
hour: 15 count: 0
hour: 16 count: 0
hour: 17 count: 0
hour: 18 count: 0
hour: 19 count: 0
hour: 20 count: 0
hour: 21 count: 0
hour: 22 count: 0
hour: 23 count: 0

which "looks" like you are trying to figure out if the left hours digit needs to be 1. It does not work for hour 22 and 23 which should be 10 and 11. At midnight, hour will be 0 and is usually displayed as 12:00 am so that is wrong as well.

What you really need to be doning is mapping the rtc.hour() like this:
0 -> 12
1..12 -> 1..12
13..23 -> 1..11

Thanks... what do you mean by mapping?

mapping is changing one range of numbers into another
when now.hour() == 0, you want to display 12
when now.hour() == 1 to 12, you want to display the number
when now.hour() == 13..23, you want to display 1..11

something like this

//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!");
    // 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, 19, 59, 56));
  }

}


void loop() {

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

    delay(1000);

    DateTime now = rtc.now();

    if (now.second() == 0 && now.minute() % 10 == 0) {
      Serial.println("HIT");
      AntiPoison();
    }
    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;
  }
}

/////////////////////////////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(1000);
  TurnOnR1();
  TurnOnL1();
  TurnOnMR1();
  TurnOnML1();
  TurnOnHR1();
  TurnOnHL1();
  delay(1000);
  TurnOnR2();
  TurnOnL2();
  TurnOnMR2();
  TurnOnML2();
  TurnOnHR2();
  TurnOnHL2();
  delay(1000);
  TurnOnR3();
  TurnOnL3();
  TurnOnMR3();
  TurnOnML3();
  TurnOnHR3();
  TurnOnHL3();
  delay(1000);
  TurnOnR4();
  TurnOnL4();
  TurnOnMR4();
  TurnOnML4();
  TurnOnHR4();
  TurnOnHL4();
  delay(1000);
  TurnOnR5();
  TurnOnL5();
  TurnOnMR5();
  TurnOnML5();
  TurnOnHR5();
  TurnOnHL5();
  delay(1000);
  TurnOnR6();
  TurnOnL6();
  TurnOnMR6();
  TurnOnML6();
  TurnOnHR6();
  TurnOnHL6();
  delay(1000);
  TurnOnR7();
  TurnOnL7();
  TurnOnMR7();
  TurnOnML7();
  TurnOnHR7();
  TurnOnHL7();
  delay(1000);
  TurnOnR8();
  TurnOnL8();
  TurnOnMR8();
  TurnOnML8();
  TurnOnHR8();
  TurnOnHL8();
  delay(1000);
  TurnOnR9();
  TurnOnL9();
  TurnOnMR9();
  TurnOnML9();
  TurnOnHR9();
  TurnOnHL9();
  delay(1000);

}

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

Thank you! Your changes make total sense and really cleanup the code. Only issue I had was that 10 p.m., 11 p.m. and 12 a.m. didn't work. Looks like you forgot to add those numbers to the switch statement, so I added them:

case 10: TurnOnHR0(); break;
case 11: TurnOnHR1(); break;
case 12: TurnOnHR2(); break;

Now it works perfectly. Thanks again!

One more question... I am trying to program the tubes to turn off overnight. As you can see, I added a method at the end called turnClockOff(), which works the same way as the methods to turn the digits on except it sends binary code that turns the tubes off. I put this in the void loop() method, right after the call to antipoison()

while (now.hour() >= 23){
     turnClockOff();
     }

If I set the time manually to 10:59:50, when it changes to 11 p.m., the method works and turns the tubes off. The problem is, they never come back on. If I manually set the time to 23:59:50, they should come back on in 10 seconds, since then the now.hour would flip to 0 and therefore, be less than 23, but that doesn't work. Any ideas?

Here's the complete 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!");
    // 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, 23, 59, 50));
  }

}


void loop() {

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

    delay(1000);

    DateTime now = rtc.now();

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

    while (now.hour() >= 23){
     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(1000);
  TurnOnR1();
  TurnOnL1();
  TurnOnMR1();
  TurnOnML1();
  TurnOnHR1();
  TurnOnHL1();
  delay(1000);
  TurnOnR2();
  TurnOnL2();
  TurnOnMR2();
  TurnOnML2();
  TurnOnHR2();
  TurnOnHL2();
  delay(1000);
  TurnOnR3();
  TurnOnL3();
  TurnOnMR3();
  TurnOnML3();
  TurnOnHR3();
  TurnOnHL3();
  delay(1000);
  TurnOnR4();
  TurnOnL4();
  TurnOnMR4();
  TurnOnML4();
  TurnOnHR4();
  TurnOnHL4();
  delay(1000);
  TurnOnR5();
  TurnOnL5();
  TurnOnMR5();
  TurnOnML5();
  TurnOnHR5();
  TurnOnHL5();
  delay(1000);
  TurnOnR6();
  TurnOnL6();
  TurnOnMR6();
  TurnOnML6();
  TurnOnHR6();
  TurnOnHL6();
  delay(1000);
  TurnOnR7();
  TurnOnL7();
  TurnOnMR7();
  TurnOnML7();
  TurnOnHR7();
  TurnOnHL7();
  delay(1000);
  TurnOnR8();
  TurnOnL8();
  TurnOnMR8();
  TurnOnML8();
  TurnOnHR8();
  TurnOnHL8();
  delay(1000);
  TurnOnR9();
  TurnOnL9();
  TurnOnMR9();
  TurnOnML9();
  TurnOnHR9();
  TurnOnHL9();
  delay(1000);

}

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

Try changing that while to an if, and see if that solves your problem.
I suspect that what is happening is that the while is causing your program to get caught in an infinite loop.

DateTime now = rtc.now();

The line above is what sets now to the current time.
But, as long as you are in the while loop, now never gets updated. So your clock essentially gets frozen at 11:59:50 p.m., and can never reach midnight.

Like I said, if you change the while to an if, it can escape the loop, and that should solve the problem.

2 Likes

Thanks... I will give that a try. That may also explain another issue I saw where the clock gets set to the same time every time the arduino is reset, rather than continuing to count time. For example, if the time is 3:30, the clock works, but if you unplug it and plug it in an hour later, it starts at 3:30.

Good catch! If you wanted to be a bit more efficient, you can put those case statements together

switch(hour) {
  case 0:
  case 10:
    TurnOnHR0();
    break;
 case 1:
  case 11:
    TurnOnHR1();
    break;
...

Since there are 2 cases that do the exact same thing for 0, 1, and 2.

Hmm, let me take a look at your code again...

What?!

Isn't this line

  if ( rtc.isrunning()) {

supposed to be like this

  if ( !rtc.isrunning()) {

instead?

It looks like someone must have thought that that exclamation point was just a meaningless decoration, and so got rid of it.

With the exclamation point, what the code does is check if the RTC is not running, and if it is not running, sets it to the date and time that the code was compiled.

Without the exclamation point, the code checks if the RTC is running, and if it is running, it sets it to the date and time that the code was compiled.

Read over that last sentence again. Does that behavior sound familiar to you?

Thank you... you were right. I'm not sure how but that exclamation point got deleted by accident. I added it back in and it fixed the problem.

Good point... thanks.

I changed it to an if statement and it didn't work. The clock never went into the TurnOffClock function. I set it manually via the commented out section to 10:59:50 and when it flipped to 11 p.m., the clock stayed on. Really dont' understand why.

After further inspection, it looks like the if statement is being called and the tubes are turning off, but only for a fraction of a second and then turning back on, which makes sense since they are being turned off and then the code is continuing and turning them back on and then off and then on, etc. I can see the flicker ever so slightly. I need to rethink this.

The answer is obvious, if you only stop to think about what you want to do and when you want to do it. Let me rearrange your code a bit...

    if (now.hour() < 23){
      // show the time
      runseconds(now.second());
      runhours(now.hour());
      runminutes(now.minute());
    }
    else {
      // don't show the time
      turnClockOff();
    }

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