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