scale led colors to temperature in led_set

master
Dennis Gnad 13 years ago
parent ff0c0ee228
commit 251ea5b5f6

@ -12,6 +12,9 @@
#define TIMEOUT 255 #define TIMEOUT 255
const uint16_t LED_GREEN_TEMP = 300;
const uint16_t LED_RED_TEMP = 1200;
const uint16_t TARGET_TEMP_MAX = 1520; const uint16_t TARGET_TEMP_MAX = 1520;
uint8_t led_color = 0; uint8_t led_color = 0;
@ -20,7 +23,6 @@ uint8_t setting_timeout = 0;
uint8_t adc_pos = 0; uint8_t adc_pos = 0;
uint16_t adc_sum = 0; uint16_t adc_sum = 0;
uint16_t temperature_adc = 0;
uint16_t target = 0; uint16_t target = 0;
uint16_t temperature = 0; uint16_t temperature = 0;
@ -71,13 +73,13 @@ ISR(PCINT0_vect)
input_state = new_state; input_state = new_state;
} }
uint8_t control_output(uint16_t current_temp, uint16_t target_temp) uint8_t control_output()
{ {
if (current_temp > target_temp) if (temperature > target)
{ {
return 0; return 0;
} else { } else {
return (uint8_t)((uint16_t)((uint32_t)((uint32_t)255*target_temp)/current_temp)/TARGET_TEMP_MAX); return (uint8_t)((uint16_t)((uint32_t)((uint32_t)255*target)/temperature)/TARGET_TEMP_MAX);
} }
} }
@ -142,7 +144,14 @@ void led_init(void)
void led_set(uint16_t value) void led_set(uint16_t value)
{ {
OCR0A = OCR0B = led_color = value >> 8; if (LED_GREEN_TEMP < value && value < LED_RED_TEMP) {
value = (value-LED_GREEN_TEMP) * 255/(LED_RED_TEMP-LED_GREEN_TEMP);
} else if (value < LED_GREEN_TEMP) {
value = 0;
} else {
value = 255;
}
OCR0A = OCR0B = (uint8_t)value;
} }
void led_off(void) void led_off(void)
@ -192,11 +201,10 @@ int main(void)
adc_sum += ADC; adc_sum += ADC;
if(++adc_pos == 64) if(++adc_pos == 64)
{ {
temperature_adc = adc_sum; temperature = linearize_temp(adc_sum);
adc_sum = 0; adc_sum = 0;
adc_pos = 0; adc_pos = 0;
temperature = linearize_temp(temperature_adc); heat_output = control_output();
heat_output = control_output(temperature, target);
} }
} }

Loading…
Cancel
Save