temp: Actually calculate temperature values
Do the monster math to convert ADC readings into appropriate temperature values. The absolute result is way off but it seems to respond sanely in relative terms. Additionally, apply a low pass filter with f=1Hz to smoothen the noise a tiny bit.
This commit is contained in:
parent
25ce0ebdff
commit
f481e4de38
|
@ -1,20 +1,40 @@
|
|||
import time
|
||||
import math
|
||||
from cs1237 import CS1237
|
||||
from machine import Pin
|
||||
|
||||
clock = Pin(2)
|
||||
data = Pin(4)
|
||||
|
||||
cs1237 = CS1237(clock, data)
|
||||
cs1237.config(gain=1)
|
||||
ADC_RATE = 40
|
||||
|
||||
cs1237 = CS1237(clock, data)
|
||||
cs1237.config(gain=1, rate=ADC_RATE)
|
||||
|
||||
print(repr(cs1237.get_config()))
|
||||
|
||||
THERMISTOR_BETA = 3950.0
|
||||
THERMISTOR_R25 = 10e3
|
||||
|
||||
THERMISTOR_RINF = THERMISTOR_R25 * math.exp(-THERMISTOR_BETA / 298.15)
|
||||
|
||||
# Filter constant in seconds
|
||||
FILTER_RC = 1
|
||||
FILTER_A = 1 / ADC_RATE / (FILTER_RC / 1 / ADC_RATE)
|
||||
|
||||
temperature_filtered = 25
|
||||
while True:
|
||||
raw_value = cs1237.read()
|
||||
value = float(raw_value) / (2**23 - 1)
|
||||
value = float(raw_value) / (2**24 - 1)
|
||||
|
||||
if value > 0.9999:
|
||||
value = 0
|
||||
else:
|
||||
value = 1 / (1 / value - 1)
|
||||
temperature = 25 - value
|
||||
if abs(temperature) < 50:
|
||||
print(temperature)
|
||||
value = 10e3 * 1 / (1 / value - 1)
|
||||
|
||||
temperature = THERMISTOR_BETA / math.log(value / THERMISTOR_RINF) - 273.15
|
||||
|
||||
temperature_filtered = (
|
||||
temperature_filtered * (1 - FILTER_A) + temperature * FILTER_A
|
||||
)
|
||||
|
||||
print(temperature_filtered)
|
||||
|
|
Loading…
Reference in a new issue