YouTube: Mäter temperatur med Picon

Jag har några olika projekt på gång där just temperaturen är intressant. För dessa projekt använder jag därför olika temperatursensorer. Men innan jag bygger ett stort projekt så lägger jag lite tid på att testa hur de olika komponenterna fungerar.

I denna veckans avsnitt tittar jag närmare på två olika givare. Den ena är en digital givare, DHT11, den andra är en klassisk NTC termistor.

I avsnittet har jag utvecklat lite kod. Den kan du ta del av här:

from Blinker import Blinker
from machine import Pin
from NTC import NTC
import dht

# Gör så att LED börjar blinka (Pico W), använd 25 på Pico utan WiFi
b = Blinker("LED", freq=1)
b.start()

sensor = dht.DHT11(Pin(16)) # DHT11:an finns på pin 16
sensor.measure()
temp = sensor.temperature()
humidity = sensor.humidity()

print("DHT11: {} grader C, {}%".format(temp, humidity))

ntc = NTC(26, Rref = 9860) # NTC finns på pin 26 (ad0)
tempC = ntc.readT()
print("NTC: {} grader C".format(round(tempC)))

I koden här över använder jag två klasser. Följande klass heter Blinker och sparas i en fil som heter Blinker.py

from machine import Pin, Timer
import time

class Blinker:

    def __init__(self, pin, freq=1):
        self.led = Pin(pin, Pin.OUT)
        self.timer = Timer()
        self.freq=freq
        if self.freq < 1:
            self.freq = 1
        
    def blink(self, timer):
        self.led.toggle()
        
    def start(self, freq = -1):
        if freq < 1:
            freq = self.freq
        self.timer.init(freq=freq, mode=Timer.PERIODIC, callback=self.blink)
        
    def stop(self):
        self.timer.deinit()

I denna koden visar jag min NTC-klass som ansvarar för inläsning och omvandling från spänning till temperatur. Spara den i en fil du kallar för NTC.py.

from machine import ADC
import math

class NTC:
    # A, B, C is the Steinhart-Hart coefficients for the Thermistor (specific for the thermistor)
    # Vref = is the voltage given the voltage divider
    # Rref = is the value of the resistor in the voltage divider
    def __init__(self, pin, A = 1.624e-3, B = 1.235e-4, C = 9.124e-7, Vref = 3.3, Rref = 10e3):
        self.A = A
        self.B = B
        self.C = C
        self.ADC = ADC(pin)
        self.Vref = Vref
        self.Rref = Rref

    # Returns the current temperature from the configured pin
    def readT(self):
        # Read voltage over Rtemp from AD-converter
        adc0 = self.ADC.read_u16()
        # Convert uint16 -> value between 0 and Vref
        Vout = (self.Vref/65535)*adc0
        
        # Calculate Resistance of Thermistor on Pin
        Rt = (Vout * self.Rref) / (self.Vref - Vout)
        
        # Use Steinhart–Hart equation to calculate Termperature
        # https://en.wikipedia.org/wiki/Steinhart%E2%80%93Hart_equation
        TempK = 1 / (self.A + (self.B * math.log(Rt)) + self.C * math.pow(math.log(Rt), 3))
        
        # Convert Temperature in Kelvin to Temperature in Celsius
        TempC = TempK - 273.15
    
        return TempC

Om du gillar avsnittet, varför inte ge det en 👍🏻? Passa också på att prenumerera på kanalen så missar du inte liknande innehåll i framtiden.