Skip to content

Instantly share code, notes, and snippets.

@Grippy98
Created September 10, 2018 00:32
Show Gist options
  • Save Grippy98/8c267734c1a2bc05fc5375faf8a00850 to your computer and use it in GitHub Desktop.
Save Grippy98/8c267734c1a2bc05fc5375faf8a00850 to your computer and use it in GitHub Desktop.
/*
Nixie Clock Code by Andrei Aldea
Adapted for use with HV5530 Nixie Driver boards by Johnny Izzard
And the Sodaq_DS3231 library by Sodaq Moja
*/
#include <SPI.h>
#include <Wire.h>
#include "Sodaq_DS3231.h"
char weekDay[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
#define LD 10
#define CLK 13
#define SDO 11
#define PWM 9
uint32_t old_ts;
#define tube_off 10
#define ind_off 3
uint16_t decimal_lookup[11] = {0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0000}; // decimal_lookup[0]...decimal_lookup[9] outputs corresponding nixie number. decimal_lookup[10] is off.
uint8_t ind_lookup[4] = {0x01, 0x02, 0x03, 0x00}; // ind_lookup[0] is top indicator, ind_lookup[1] is bottom indicator, ind_lookup[2] is both, ind_lookup[3] is off.
uint32_t data1 = 0; // Used to store data to be shifted
uint32_t data2 = 0;
uint32_t data3 = 0;
uint32_t data4 = 0;
uint8_t tube1 = 0; // Value to display on the corresponding tube.
uint8_t tube2 = 0;
uint8_t tube3 = 0;
uint8_t tube4 = 0;
uint8_t tube5 = 0;
uint8_t tube6 = 0;
uint8_t tube7 = 0;
uint8_t tube8 = 0;
uint8_t indicator1 = 0; // Value to display on the corresponding indicator.
uint8_t indicator2 = 0;
uint8_t indicator3 = 0;
uint8_t indicator4 = 0;
void setup() {
Serial.begin(57600);
Wire.begin();
rtc.begin();
pinMode(LD, OUTPUT); // LD is pin 10 (active high)
pinMode(CLK, OUTPUT); // CLK is pin 13
pinMode(SDO, OUTPUT); // SDO is pin 11
pinMode(PWM, OUTPUT); // PWM (Blank) is pin 9 (active low)
digitalWrite(LD, LOW);
digitalWrite(CLK, LOW);
digitalWrite(SDO, LOW);
digitalWrite(PWM, HIGH);
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE1));
/* Reset Values/Blank The Display */
tube1 = tube_off;
tube2 = tube_off;
tube3 = tube_off;
tube4 = tube_off;
tube5 = tube_off;
tube6 = tube_off;
tube7 = tube_off;
tube8 = tube_off;
indicator1 = ind_off;
indicator2 = ind_off;
indicator3 = ind_off;
indicator4 = ind_off;
update_disp();
}
void loop() {
DateTime now = rtc.now(); //get the current date-time
uint32_t ts = now.getEpoch();
analogWrite(PWM, 150); //Set Brightness
if (old_ts == 0 || old_ts != ts) {
old_ts = ts;
indicator1 = 2; // Both indicators on
indicator2 = 2;
indicator3 = 2;
indicator4 = ind_off;
tube8 = now.hour()/10;
tube7 = now.hour()%10;
tube6 = now.minute()/10;
tube5 = now.minute()%10;
tube4 = now.second()/10;
tube3 = now.second()%10;
tube2 = 2;
tube1 = 2;
update_disp();
/*for(int i=0; i<=99; i++)
{
tube2 = i/10;
tube1 = i%10;
delay(10);
update_disp();
}
}*/
}
//delay(500);
}
void update_disp(void) {
data1 = 0x00000000;
data1 |= ((uint32_t (decimal_lookup[tube1])) & 0x000003FF);
data1 |= ((uint32_t (decimal_lookup[tube2]) << 10) & 0x000FFC00);
data1 |= ((uint32_t (ind_lookup[indicator1]) << 20) & 0x00300000);
data2 = 0x00000000;
data2 |= ((uint32_t (decimal_lookup[tube3])) & 0x000003FF);
data2 |= ((uint32_t (decimal_lookup[tube4]) << 10) & 0x000FFC00);
data2 |= ((uint32_t (ind_lookup[indicator2]) << 20) & 0x00300000);
data3 = 0x00000000;
data3 |= ((uint32_t (decimal_lookup[tube5])) & 0x000003FF);
data3 |= ((uint32_t (decimal_lookup[tube6]) << 10) & 0x000FFC00);
data3 |= ((uint32_t (ind_lookup[indicator3]) << 20) & 0x00300000);
data4 = 0x00000000;
data4 |= ((uint32_t (decimal_lookup[tube7])) & 0x000003FF);
data4 |= ((uint32_t (decimal_lookup[tube8]) << 10) & 0x000FFC00);
data4 |= ((uint32_t (ind_lookup[indicator4]) << 20) & 0x00300000);
digitalWrite(LD, HIGH);
SPI.transfer(data1 >> 24);
SPI.transfer(data1 >> 16);
SPI.transfer(data1 >> 8);
SPI.transfer(data1);
digitalWrite(LD, LOW);
digitalWrite(LD, HIGH);
digitalWrite(LD, HIGH);
SPI.transfer(data2 >> 24);
SPI.transfer(data2 >> 16);
SPI.transfer(data2 >> 8);
SPI.transfer(data2);
digitalWrite(LD, LOW);
digitalWrite(LD, HIGH);
digitalWrite(LD, HIGH);
SPI.transfer(data3 >> 24);
SPI.transfer(data3 >> 16);
SPI.transfer(data3 >> 8);
SPI.transfer(data3);
digitalWrite(LD, LOW);
digitalWrite(LD, HIGH);
digitalWrite(LD, HIGH);
SPI.transfer(data4 >> 24);
SPI.transfer(data4 >> 16);
SPI.transfer(data4 >> 8);
SPI.transfer(data4);
digitalWrite(LD, LOW);
digitalWrite(LD, HIGH);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment