#define common_anode 1 #define temperature_pin A0 #define input_low 0 #define input_high 1023 #define temperature_low 0 #define temperature_high 5000 #define segments 7 #define serial_speed 9600 #define decimals_pin 9 #define units_pin 10 #define decades_pin 11 #define delay_time 500 #if common_anode == 1 # define on LOW # define off HIGH #else # define on HIGH # define off LOW #endif int display_table[][segments] = { /* a b c d e f g */ { on, on, on, on, on, on, off }, /* 0 */ { off, on, on, off, off, off, off }, /* 1 */ { on, on, off, on, on, off, on }, /* 2 */ { on, on, on, on, off, off, on }, /* 3 */ { off, on, on, off, off, on, on }, /* 4 */ { on, off, on, on, off, on, on }, /* 5 */ { on, off, on, on, on, on, on }, /* 6 */ { on, on, on, off, off, off, off }, /* 7 */ { on, on, on, on, on, on, on }, /* 8 */ { on, on, on, on, off, on, on } /* 9 */ }; int pin_mapping[] = { /* a b c d e f g */ 2, 3, 4, 5, 6, 7, 8 }; int read_temperature (void) { int raw_input = analogRead (temperature_pin); int calibrated_input = map (raw_input, input_low, input_high, temperature_low, temperature_high); return calibrated_input; } void display_temperature (int temperature, int digit) { int segment; for (segment = 0; segment < segments; ++segment) { digitalWrite (pin_mapping[segment], display_table[temperature%10][segment]); } digitalWrite (decades_pin, LOW); digitalWrite (units_pin, LOW); digitalWrite (decimals_pin, LOW); digitalWrite (digit, HIGH); } void setup (void) { int segment; for (segment = 0; segment < segments; ++segment) { pinMode (pin_mapping[segment], OUTPUT); } pinMode (decades_pin, OUTPUT); pinMode (units_pin, OUTPUT); pinMode (decimals_pin, OUTPUT); Serial.begin (serial_speed); } void loop (void) { int temperature = read_temperature (); Serial.println (temperature, DEC); display_temperature (temperature / 100, decades_pin); delay (delay_time); display_temperature (temperature / 10, units_pin); delay (delay_time); display_temperature (temperature, decimals_pin); delay (delay_time); }