Pages: [1]   Go Down
Author Topic: Lilypad Thermometer w/ Numitron Display  (Read 1216 times)
0 Members and 1 Guest are viewing this topic.
Salem, Oregon
Offline Offline
Sr. Member
****
Karma: 7
Posts: 307
Friends don't let friends use Strings
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/* 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 (167.08 KB, 640x480 - viewed 24 times.)

* CIMG8267.JPG (121.29 KB, 640x480 - viewed 35 times.)
« Last Edit: February 15, 2012, 03:17:48 pm by Brad Burleson » Logged

Pages: [1]   Go Up
Jump to: