#include "BasicThermistor.h"
BasicThermistor::BasicThermistor(byte i2c_address, boolean debug_flag) {
address = i2c_address;
debug = debug_flag;
temperature = 0.0;
cached_digital_value = 0;
digital_value = 0;
invalid_read_counter = 0;
buffer_pointer = 0;
for
(
int
i = 0; i < READINGS; i++) {
read_buffer[i] = -1.0f;
}
}
int
BasicThermistor::read_digital_value() {
unsigned
char
val_0 = 0;
unsigned
char
val_1 = 0;
unsigned
int
digital_value;
Wire.beginTransmission(ADC_I2C_ADDRESS);
Wire.write(address);
delay(DELAY_BETWEEN_OPERATION);
Wire.requestFrom(ADC_I2C_ADDRESS, 2);
delay(DELAY_BETWEEN_OPERATION);
val_0 = Wire.read();
delay(DELAY_BETWEEN_OPERATION);
val_1 = Wire.read();
delay(DELAY_BETWEEN_OPERATION);
digital_value =
int
(val_0)*16 +
int
(val_1>>4);
if
(debug) {
printf
("[BT] val [%2x,%2x]\n", val_0, val_1);
printf
("[BT] Read digital value %d\n", digital_value);
}
return
digital_value;
}
int
BasicThermistor::is_valid_value(
int
value) {
if
(cached_digital_value == 0) {
cached_digital_value = value;
return
1;
}
if
(
abs
(cached_digital_value - value) < DIGITAL_TOLLERANCE) {
if
(debug)
printf
("[BT] Valid digital value %d\n", value);
cached_digital_value = value;
invalid_read_counter = 0;
return
1;
}
if
(invalid_read_counter > DIGITAL_TOLLERANCE_COUNTER) {
if
(debug)
printf
("[BT] Too many invalid digital value %d..so use it\n", value);
cached_digital_value = value;
invalid_read_counter = 0;
return
1;
}
invalid_read_counter++;
if
(debug)
printf
("[BT] Invalid digital value %d\n", value);
return
0;
}
float
BasicThermistor::calc_temperature(
int
value) {
float
analog_value = value * 1023.0 / 4095.0;
analog_value = (1023 / analog_value) - 1;
analog_value = TENKRESISTOR / analog_value;
analog_value = analog_value / THERMISTOR;
if
(debug)
printf
("[BT] Analog value %f\n", analog_value);
float
kelvin =
log
(analog_value);
kelvin /= BETA;
kelvin += 1.0 / ROOMTEMPK;
kelvin = 1.0 / kelvin;
return
kelvin - 273.15;
}
float
BasicThermistor::read_temperature() {
digital_value = read_digital_value();
float
single_temperature;
if
(is_valid_value(digital_value)) {
single_temperature = calc_temperature(digital_value);
if
(debug)
printf
("[BT] Single current temperature is %f\n", single_temperature);
}
else
{
single_temperature = calc_temperature(cached_digital_value);
if
(debug)
printf
("[BT] Invalid temp,
using
cached value %f\n", single_temperature);
}
if
(debug)
printf
("[BT] Storing the temp at pointer %d\n", buffer_pointer);
read_buffer[buffer_pointer] = single_temperature;
buffer_pointer++;
if
(read_buffer[buffer_pointer] == -1.0f) {
for
(
int
i = buffer_pointer; i < READINGS; i++) {
read_buffer[i] = single_temperature;
}
}
if
(buffer_pointer == READINGS) buffer_pointer = 0;
temperature = 0;
if
(debug) {
printf
("[BT] Temp. buffer[");
for
(
int
i = 0; i < READINGS; i++) {
printf
("%0.1f,", read_buffer[i]);
}
printf
("]\n");
}
for
(
int
i = 0; i < READINGS; i++) {
temperature += read_buffer[i];
}
temperature /= READINGS;
return
temperature;
}