Lilypad Thermometer w/ Numitron Display

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:

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.

CIMG8302.JPG

CIMG8267.JPG