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 changed files with 28 additions and 8 deletions
|
@ -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…
Add table
Add a link
Reference in a new issue