I've always wanted to build something with a Nixie tube but have avoided them due to the high voltages needed.
Then a couple month's ago Hackaday had a great post on using Numitron tubes (Numitron Tube Tutorial | Hackaday) so I thought I'd give it a spin.
I picked up a set of tubes on eBay and, after messing around with a breadboarded version I thought I'd build a standalone version.
My project is an ATmega168 running off the internal resonator (basically a Lilypad), with a DS18b20 temperature sensor and a TLC5940 to drive the Numitron tubes. The board is mounted on a Radio Shack case that's empty except for 9volts of "AA" batteries.
I added a diode to the power line of each tube to drop the 5V to a bit closer to the tubes 4.5v max (you can see the lousy soldering job too).
Sorry there are no schematics, but I used the following sources to build the board:
- Power supply section (top left of board) Beginning Embedded Electronics - 1 - SparkFun Electronics
- Lilypad (top right) Minimal Arduino with ATmega8 – todbot blog
- TLC5940 (bottom left) Google Code Archive - Long-term storage for Google Code Project Hosting.
- DS18b20 (bottom right) OneWire Arduino Library, connecting 1-wire devices (DS18S20, etc) to Teensy
This is the first time I've used a TLC5940 with anything besides LEDs. Worked great.
Oops - forgot to include the code at least. Here it is, FWIW...
/* Numitron temperature display (two digits)
*
* Code taken from the TLC5940 "Basic Use" example as well as the Dallas Temperature Sensor
* library
*
* Hardware follows the todbot "Minimal Arduino" 8Mhz
* (http://todbot.com/blog/2009/05/26/minimal-arduino-with-atmega8/) along with the
* TLC5940 reference (http://code.google.com/p/tlc5940arduino/)
*
* Brad Burleson (KF7FER)
*
*/
#include <avr/pgmspace.h>
#include <Tlc5940.h>
#include <DallasTemperature.h>
// Table for each seven-digit segment
PROGMEM prog_uint8_t digits[10] = {
B1111011, // Zero
B1100000, // One
B1010111, // Two
B1110110, // Three
B1101100, // Four
B0111110, // Five
B0111111, // Six
B1110000, // Seven
B1111111, // Eight
B1111110 // Nine
};
static const int ONE_WIRE_PIN = 2;
NewOneWire oneWire(ONE_WIRE_PIN);
DallasTemperature tempSensor(oneWire);
void setup()
{
Tlc.init(); // Setup the TLC5940
tempSensor.begin(); // Prep the temperature sensor
delay(500); // Need this delay for OneWire?
}
void loop()
{
// Fetch temperature from the sensor (in Celcius)
float temperature = tempSensor.getTemperature();
// Now convert to int (and to Fahrenheit) for display
int displayTemp = (int) (DallasTemperature::toFahrenheit(temperature));
Tlc.clear();
// Calculate ones and tens digits (only handles 2-digit above-zero temps for now)
int temp_ones = displayTemp % 10;
int temp_tens = 0;
if (displayTemp >= 10)
temp_tens = displayTemp / 10;
// Now handle the display
setupTLC(temp_tens, 0); // Setup Tens digit
setupTLC(temp_ones, 8); // Then the Ones digit
Tlc.update(); // Update the display
delay(3000); // Wait a bit...
}
// Pull digit from program memory and decode bits
void setupTLC(int digit, int offset) {
byte data = pgm_read_byte (&digits[digit]);
for (int i=0; i < 7; i++)
if (data & (1<<i))
Tlc.set(offset + i, 4095);
}
Brad.

