Go Down

Topic: Lilypad Thermometer w/ Numitron Display (Read 1 time) previous topic - next topic

Brad Burleson

Feb 15, 2012, 12:11 am Last Edit: Feb 15, 2012, 09:17 pm by Brad Burleson Reason: 1
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 (http://hackaday.com/2011/12/21/numitron-tube-tutorial/) 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...

Code: [Select]
/* 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.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy