Jump to content

Nixie Tube Clock Build Log And Plans

red_dr4gon1

About two months ago my friend and I started planing to build out own nixie tube clocks from scratch and now they are almost done!

 

I will start with the basics of how it works. First an Arduino checks the time from the RTC (real time clock). Then updates the two minute values and two hour values and changes them respectively. Next, we used the shift-out function two times: one for the hour and one for the minute. We are using two data arrays for the shift registers (two for the hours and two for the minutes). Next we have the shift registers output to strings of around 29 relays, with one relay for each pin of the four tubes.

 

I will be posting the steps, the part list,better pictures, more pictures, and the code in about two weeks. Feel free to ask any questions.

 

 

post-225239-0-94813900-1431689872_thumb.

post-225239-0-31298200-1431689874_thumb.

post-225239-0-90110000-1431689876_thumb.

post-225239-0-57155900-1431689882_thumb.

Main work PC:Surface Pro 3 i3 with a 128 GB micro sd card

 

http://linustechtips.com/main/topic/367001-nixie-tube-clock-build-log-and-plans/

Link to comment
Share on other sites

Link to post
Share on other sites

Looks very nice !

CPU: Xeon 1230v3 - GPU: GTX 770  - SSD: 120GB 840 Evo - HDD: WD Blue 1TB - RAM: Ballistix 8GB - Case: CM N400 - PSU: CX 600M - Cooling: Cooler Master 212 Evo

Update Plans: Mini ITX this bitch

Link to comment
Share on other sites

Link to post
Share on other sites

El Psy Congroo !!!!! 

... Life is a game and the checkpoints are your birthday , you will face challenges where you may not get rewarded afterwords but those are the challenges that help you improve yourself . Always live for tomorrow because you may never know when your game will be over ... I'm totally not going insane in anyway , shape or form ... I just have broken English and an open mind ... 

Link to comment
Share on other sites

Link to post
Share on other sites

cool, gonna sub out of curiousity.

 

u might want to ask a mod to move this to the buildlog section, because well... it's a build log afteral, workbench buildlog section isn't PC only i think

May the light have your back and your ISO low.

Link to comment
Share on other sites

Link to post
Share on other sites

Nice. Looking forward to the rest of the pictures and details - subbed.

 

 

El Psy Congroo !!!!! 

Bro-fist

duc sequere aut de via decede

CPU: i7 6800K | Mobo: MSI X99 Gaming Pro Carbon | GPU: SLI EVGA 980 Ti Hydro Copper | PSU: EVGA 1000P2 | Memory: 64 DDR4 Corsair Dominator Platinum | Storage: Samsung 950 Pro 512GB M.2 & Samsung 850 Evo 1TB| Case: Be Quiet! Dark Base Pro 900 | Display: Predator X34 & Dell U2715H | Cooling: Custom Loop

Custom hard line watercooled Fractal Node 202 ITX build log

Link to comment
Share on other sites

Link to post
Share on other sites

Nice. Looking forward to the rest of the pictures and details - subbed.

 

Bro-fist

We can share Dr.Pepper if you want ... 

... Life is a game and the checkpoints are your birthday , you will face challenges where you may not get rewarded afterwords but those are the challenges that help you improve yourself . Always live for tomorrow because you may never know when your game will be over ... I'm totally not going insane in anyway , shape or form ... I just have broken English and an open mind ... 

Link to comment
Share on other sites

Link to post
Share on other sites

cool, gonna sub out of curiosity.

 

u might want to ask a mod to move this to the buildlog section, because well... it's a build log after all, workbench buildlog section isn't PC only i think

I will do that

Main work PC:Surface Pro 3 i3 with a 128 GB micro sd card

 

http://linustechtips.com/main/topic/367001-nixie-tube-clock-build-log-and-plans/

Link to comment
Share on other sites

Link to post
Share on other sites

Here are some chicken scratch plans for the clocks I will be posting the code in about one week when the clocks are done if you want to ask me about any of the details of the plans or the clocks fell free.

post-225239-0-67364200-1432379241_thumb.

post-225239-0-28206200-1432379246_thumb.

post-225239-0-52601300-1432379250_thumb.

post-225239-0-25703000-1432379256_thumb.

post-225239-0-75585600-1432379260_thumb.

post-225239-0-79698400-1432379264_thumb.

post-225239-0-54213400-1432379268_thumb.

post-225239-0-01771400-1432379272_thumb.

nixie plans.pdf

Main work PC:Surface Pro 3 i3 with a 128 GB micro sd card

 

http://linustechtips.com/main/topic/367001-nixie-tube-clock-build-log-and-plans/

Link to comment
Share on other sites

Link to post
Share on other sites

seems interesting, cant wait to see more

May the light have your back and your ISO low.

Link to comment
Share on other sites

Link to post
Share on other sites

#include "Wire.h"


#define DS3231_I2C_ADDRESS 0x68

byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
int latchPinMin = 8; // min set
int latchPinHr = 9; // hr set
int clockPin = 12;
int dataPin = 11;
int hour12 = 0; // 12 hr


byte dataONE;
byte dataTWO;
byte dataArrayONE[60];
byte dataArrayTWO[60];

void setup() {
Wire.begin();
pinMode(latchPinMin, OUTPUT);
pinMode(latchPinHr, OUTPUT);
Serial.begin(9600);



dataArrayONE[0] = 130;
dataArrayONE[1] = 128;
dataArrayONE[2] = 128;
dataArrayONE[3] = 128;
dataArrayONE[4] = 128;
dataArrayONE[5] = 128;
dataArrayONE[6] = 128;
dataArrayONE[7] = 128;
dataArrayONE[8] = 128;
dataArrayONE[9] = 129;
dataArrayONE[10] = 3;
dataArrayONE[11] = 4;
dataArrayONE[12] = 4;
dataArrayONE[13] = 4;
dataArrayONE[14] = 4;
dataArrayONE[15] = 4;
dataArrayONE[16] = 4;
dataArrayONE[17] = 4;
dataArrayONE[18] = 4;
dataArrayONE[19] = 5;
dataArrayONE[20] = 10;
dataArrayONE[21] = 8;
dataArrayONE[22] = 8;
dataArrayONE[23] = 8;
dataArrayONE[24] = 8;
dataArrayONE[25] = 8;
dataArrayONE[26] = 8;
dataArrayONE[27] = 8;
dataArrayONE[28] = 8;
dataArrayONE[29] = 9;
dataArrayONE[30] = 18;
dataArrayONE[31] = 16;
dataArrayONE[32] = 16;
dataArrayONE[33] = 16;
dataArrayONE[34] = 16;
dataArrayONE[35] = 16;
dataArrayONE[36] = 16;
dataArrayONE[37] = 16;
dataArrayONE[38] = 16;
dataArrayONE[39] = 17;
dataArrayONE[40] = 34;
dataArrayONE[41] = 32;
dataArrayONE[42] = 32;
dataArrayONE[43] = 32;
dataArrayONE[44] = 32;
dataArrayONE[45] = 32;
dataArrayONE[46] = 32;
dataArrayONE[47] = 32;
dataArrayONE[48] = 32;
dataArrayONE[49] = 33;
dataArrayONE[50] = 66;
dataArrayONE[51] = 64;
dataArrayONE[52] = 64;
dataArrayONE[53] = 64;
dataArrayONE[54] = 64;
dataArrayONE[55] = 64;
dataArrayONE[56] = 64;
dataArrayONE[57] = 64;
dataArrayONE[58] = 64;
dataArrayONE[59] = 65;



//to shift register 2 (1st in series) LM
dataArrayTWO[0] = 0;
dataArrayTWO[1] = 1;
dataArrayTWO[2] = 2;
dataArrayTWO[3] = 4;
dataArrayTWO[4] = 8;
dataArrayTWO[5] = 16;
dataArrayTWO[6] = 32;
dataArrayTWO[7] = 64;
dataArrayTWO[8] = 128;
dataArrayTWO[9] = 0;
dataArrayTWO[10] = 0;
dataArrayTWO[11] = 1;
dataArrayTWO[12] = 2;
dataArrayTWO[13] = 4;
dataArrayTWO[14] = 8;
dataArrayTWO[15] = 16;
dataArrayTWO[16] = 32;
dataArrayTWO[17] = 64;
dataArrayTWO[18] = 128;
dataArrayTWO[19] = 0;
dataArrayTWO[20] = 0;
dataArrayTWO[21] = 1;
dataArrayTWO[22] = 2;
dataArrayTWO[23] = 4;
dataArrayTWO[24] = 8;
dataArrayTWO[25] = 16;
dataArrayTWO[26] = 32;
dataArrayTWO[27] = 64;
dataArrayTWO[28] = 128;
dataArrayTWO[29] = 0;
dataArrayTWO[30] = 0;
dataArrayTWO[31] = 1;
dataArrayTWO[32] = 2;
dataArrayTWO[33] = 4;
dataArrayTWO[34] = 8;
dataArrayTWO[35] = 16;
dataArrayTWO[36] = 32;
dataArrayTWO[37] = 64;
dataArrayTWO[38] = 128;
dataArrayTWO[39] = 0;
dataArrayTWO[40] = 0;
dataArrayTWO[41] = 1;
dataArrayTWO[42] = 2;
dataArrayTWO[43] = 4;
dataArrayTWO[44] = 8;
dataArrayTWO[45] = 16;
dataArrayTWO[46] = 32;
dataArrayTWO[47] = 64;
dataArrayTWO[48] = 128;
dataArrayTWO[49] = 0;
dataArrayTWO[50] = 0;
dataArrayTWO[51] = 1;
dataArrayTWO[52] = 2;
dataArrayTWO[53] = 4;
dataArrayTWO[54] = 8;
dataArrayTWO[55] = 16;
dataArrayTWO[56] = 32;
dataArrayTWO[57] = 64;
dataArrayTWO[58] = 128;
dataArrayTWO[59] = 0;


}

void loop() {

shiftTimeHrs();
shiftTimeMins();
displayTime();
delay(50);
}

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{

Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // sec
Wire.write(decToBcd(minute)); // min
Wire.write(decToBcd(hour)); // hr
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}



void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {


//setup
int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);

digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);

for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);

if ( myDataOut & (1< pinState= 1;
}
else {
pinState= 0;
}

digitalWrite(myDataPin, pinState);

digitalWrite(myClockPin, 1);

digitalWrite(myDataPin, 0);
}

//stop
digitalWrite(myClockPin, 0);
}



void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}

void displayTime()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);

Serial.print(hour, DEC);
Serial.print(":");
if (minute<10)
{
Serial.print("0");
}
Serial.print(minute, DEC);
Serial.print(":");
if (second<10)
{
Serial.print("0");
}
Serial.print(second, DEC);
Serial.print(" ");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.println(year, DEC);
}

void shiftTimeMins() { //shifts time to the mins set to registers
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
dataONE = dataArrayONE[second];
dataTWO = dataArrayTWO[second];
digitalWrite(latchPinMin, 0);
shiftOut(dataPin, clockPin, dataONE);
shiftOut(dataPin, clockPin, dataTWO);
digitalWrite(latchPinMin, 1);
delay(50);
}

void shiftTimeHrs() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
hour12 = hour % 12;
dataONE = dataArrayONE[minute];
dataTWO = dataArrayTWO[minute];
digitalWrite(latchPinHr, 0);
shiftOut(dataPin, clockPin, dataONE);
shiftOut(dataPin, clockPin, dataTWO);
digitalWrite(latchPinHr, 1);
delay(50);
}

)>

Main work PC:Surface Pro 3 i3 with a 128 GB micro sd card

 

http://linustechtips.com/main/topic/367001-nixie-tube-clock-build-log-and-plans/

Link to comment
Share on other sites

Link to post
Share on other sites

  • 1 month later...
  • 5 months later...

Update i know it has been a long time but it is working now!

Come on, we want to see some pictures.

Good job by the way.

The stars died for you to be here today.

A locked bathroom in the right place can make all the difference in the world.

Link to comment
Share on other sites

Link to post
Share on other sites

"clock"

 

Ahmed-Mohammed-Clock.jpg

Someone told Luke and Linus at CES 2017 to "Unban the legend known as Jerakl" and that's about all I've got going for me. (It didn't work)

 

Link to comment
Share on other sites

Link to post
Share on other sites

Well after almost a year of work on this it is done here is the final code

 

#include "Wire.h"


#define DS3231_I2C_ADDRESS 0x68

byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
int latchPinMin = 8; // for the min set
int latchPinHr = 9; // for the hr set
int clockPin = 12;
int dataPin = 11;
int hour12 = 0; // fot the 12 hr converter
int statuspin = 13;


byte dataONE;
byte dataTWO;
byte dataArrayONE[60];
byte dataArrayTWO[60];

void setup() {
Wire.begin();
pinMode(latchPinMin, OUTPUT);
pinMode(latchPinHr, OUTPUT);
Serial.begin(9600);



dataArrayONE[0] = 130;
dataArrayONE[1] = 128;
dataArrayONE[2] = 128;
dataArrayONE[3] = 128;
dataArrayONE[4] = 128;
dataArrayONE[5] = 128;
dataArrayONE[6] = 128;
dataArrayONE[7] = 128;
dataArrayONE[8] = 128;
dataArrayONE[9] = 129;
dataArrayONE[10] = 6;
dataArrayONE[11] = 4;
dataArrayONE[12] = 4;
dataArrayONE[13] = 4;
dataArrayONE[14] = 4;
dataArrayONE[15] = 4;
dataArrayONE[16] = 4;
dataArrayONE[17] = 4;
dataArrayONE[18] = 4;
dataArrayONE[19] = 5;
dataArrayONE[20] = 10;
dataArrayONE[21] = 8;
dataArrayONE[22] = 8;
dataArrayONE[23] = 8;
dataArrayONE[24] = 8;
dataArrayONE[25] = 8;
dataArrayONE[26] = 8;
dataArrayONE[27] = 8;
dataArrayONE[28] = 8;
dataArrayONE[29] = 9;
dataArrayONE[30] = 18;
dataArrayONE[31] = 16;
dataArrayONE[32] = 16;
dataArrayONE[33] = 16;
dataArrayONE[34] = 16;
dataArrayONE[35] = 16;
dataArrayONE[36] = 16;
dataArrayONE[37] = 16;
dataArrayONE[38] = 16;
dataArrayONE[39] = 17;
dataArrayONE[40] = 34;
dataArrayONE[41] = 32;
dataArrayONE[42] = 32;
dataArrayONE[43] = 32;
dataArrayONE[44] = 32;
dataArrayONE[45] = 32;
dataArrayONE[46] = 32;
dataArrayONE[47] = 32;
dataArrayONE[48] = 32;
dataArrayONE[49] = 33;
dataArrayONE[50] = 66;
dataArrayONE[51] = 64;
dataArrayONE[52] = 64;
dataArrayONE[53] = 64;
dataArrayONE[54] = 64;
dataArrayONE[55] = 64;
dataArrayONE[56] = 64;
dataArrayONE[57] = 64;
dataArrayONE[58] = 64;
dataArrayONE[59] = 65;



dataArrayTWO[0] = 0;
dataArrayTWO[1] = 1;
dataArrayTWO[2] = 2;
dataArrayTWO[3] = 4;
dataArrayTWO[4] = 8;
dataArrayTWO[5] = 16;
dataArrayTWO[6] = 32;
dataArrayTWO[7] = 64;
dataArrayTWO[8] = 128;
dataArrayTWO[9] = 0;
dataArrayTWO[10] = 0;
dataArrayTWO[11] = 1;
dataArrayTWO[12] = 2;
dataArrayTWO[13] = 4;
dataArrayTWO[14] = 8;
dataArrayTWO[15] = 16;
dataArrayTWO[16] = 32;
dataArrayTWO[17] = 64;
dataArrayTWO[18] = 128;
dataArrayTWO[19] = 0;
dataArrayTWO[20] = 0;
dataArrayTWO[21] = 1;
dataArrayTWO[22] = 2;
dataArrayTWO[23] = 4;
dataArrayTWO[24] = 8;
dataArrayTWO[25] = 16;
dataArrayTWO[26] = 32;
dataArrayTWO[27] = 64;
dataArrayTWO[28] = 128;
dataArrayTWO[29] = 0;
dataArrayTWO[30] = 0;
dataArrayTWO[31] = 1;
dataArrayTWO[32] = 2;
dataArrayTWO[33] = 4;
dataArrayTWO[34] = 8;
dataArrayTWO[35] = 16;
dataArrayTWO[36] = 32;
dataArrayTWO[37] = 64;
dataArrayTWO[38] = 128;
dataArrayTWO[39] = 0;
dataArrayTWO[40] = 0;
dataArrayTWO[41] = 1;
dataArrayTWO[42] = 2;
dataArrayTWO[43] = 4;
dataArrayTWO[44] = 8;
dataArrayTWO[45] = 16;
dataArrayTWO[46] = 32;
dataArrayTWO[47] = 64;
dataArrayTWO[48] = 128;
dataArrayTWO[49] = 0;
dataArrayTWO[50] = 0;
dataArrayTWO[51] = 1;
dataArrayTWO[52] = 2;
dataArrayTWO[53] = 4;
dataArrayTWO[54] = 8;
dataArrayTWO[55] = 16;
dataArrayTWO[56] = 32;
dataArrayTWO[57] = 64;
dataArrayTWO[58] = 128;
dataArrayTWO[59] = 0;

setDS3231time(0,7,22,1,12,10,2015);
}

void loop() {
digitalWrite(statuspin, 1);
shiftTimeHrs();
shiftTimeMins();
displayTime();
delay(20);
digitalWrite(statuspin, 0);
delay(20);
}


]
int time(int time){
if (time > 12){
time -=12;
} else{
time = time;
}
return time;
}

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{

Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}



void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {



int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);


digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);

for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);

if ( myDataOut & (1< pinState= 1;
}
else {
pinState= 0;
}


digitalWrite(myDataPin, pinState);

digitalWrite(myClockPin, 1);

digitalWrite(myDataPin, 0);
}

//stop shifting
digitalWrite(myClockPin, 0);
}

void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);

*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}

void displayTime()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);

Serial.print(hour, DEC);
// convert the byte variable to a decimal number when displayed
Serial.print(":");
if (minute<10)
{
Serial.print("0");
}
Serial.print(minute, DEC);
Serial.print(":");
if (second<10)
{
Serial.print("0");
}
Serial.print(second, DEC);
Serial.print(" ");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.println(year, DEC);
}

void shiftTimeMins() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
dataONE = dataArrayONE[minute];
dataTWO = dataArrayTWO[minute];
digitalWrite(latchPinMin, 0);
shiftOut(dataPin, clockPin, dataTWO);
shiftOut(dataPin, clockPin, dataONE);
digitalWrite(latchPinMin, 1);
delay(50);
}

void shiftTimeHrs() { //and to the hours
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
hour12 = time(hour);
Serial.print("the 12 hour function returns");
Serial.println(hour12);
dataONE = dataArrayONE[hour12];
dataTWO = dataArrayTWO[hour12];
digitalWrite(latchPinHr, 0);
shiftOut(dataPin, clockPin, dataTWO);
shiftOut(dataPin, clockPin, dataONE);
digitalWrite(latchPinHr, 1);
delay(50);
}

)>

Main work PC:Surface Pro 3 i3 with a 128 GB micro sd card

 

http://linustechtips.com/main/topic/367001-nixie-tube-clock-build-log-and-plans/

Link to comment
Share on other sites

Link to post
Share on other sites

Nicely done. Nixie tubes are cool.

I cannot be held responsible for any bad advice given.

I've no idea why the world is afraid of 3D-printed guns when clearly 3D-printed crossbows would be more practical for now.

My rig: The StealthRay. Plans for a newer, better version of its mufflers are already being made.

Link to comment
Share on other sites

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×