Bemerkung

Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauche tiefer in die Welt von Raspberry Pi, Arduino und ESP32 ein – gemeinsam mit Gleichgesinnten.

Warum beitreten?

  • Expertenunterstützung: Erhalte Hilfe bei technischen Herausforderungen und nach dem Kauf auftretenden Problemen durch unsere Community und unser Team.

  • Lernen & Teilen: Tausche Tipps und Tutorials aus, um deine Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalte frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezielle Rabatte: Profitiere von exklusiven Preisnachlässen auf unsere neuesten Produkte.

  • Feierliche Aktionen und Gewinnspiele: Nimm an Verlosungen und saisonalen Aktionen teil.

👉 Bereit, mit uns zu entdecken und zu kreieren? Klicke auf [hier] und werde Teil unserer Community!

7.2 Bau eines Raumthermometers

In diesem Projekt erstellen wir ein Raumthermometer, das einen Thermistor und ein I2C LCD1602-Display verwendet. Dieses einfache, aber praktische Gerät misst die Umgebungstemperatur und zeigt sie auf dem LCD-Bildschirm an, sodass du in Echtzeit die Temperatur deiner Umgebung überwachen kannst.

Benötigte Komponenten

Für dieses Projekt werden folgende Komponenten benötigt.

Ein komplettes Kit ist besonders praktisch. Hier ist der Link:

Name

ENTHALTENE TEILE

LINK

Newton Lab Kit

450+

Newton Lab Kit

Alternativ können die Komponenten auch einzeln über die folgenden Links erworben werden.

SN

KOMPONENTE

MENGE

LINK

1

Raspberry Pi Pico 2

1

KAUFEN

2

Micro-USB-Kabel

1

3

Steckbrett

1

KAUFEN

4

Jumperkabel

Mehrere

KAUFEN

5

Widerstand

1 (10KΩ)

KAUFEN

6

Thermistor

1

KAUFEN

7

I2C LCD1602

1

KAUFEN

Funktionsweise der Komponenten

  • Thermistor: Ein Widerstand, dessen Widerstandswert sich mit der Temperatur ändert. Wir verwenden einen NTC-Thermistor (Negative Temperature Coefficient), dessen Widerstand bei steigender Temperatur sinkt.

  • Spannungsteiler: Durch die Kombination des Thermistors mit einem festen Widerstand entsteht ein Spannungsteiler, der Spannungsänderungen in Abhängigkeit von der Temperatur ermöglicht.

  • I2C LCD1602 Display: Ein 16x2-Zeichen-LCD mit I2C-Schnittstelle, das die Verkabelung und Programmierung durch die Nutzung von nur zwei Datenleitungen (SDA und SCL) vereinfacht.

Schaltplan

sch_room_temp

Verdrahtungsdiagramm

wiring_room_temp

Code schreiben

Wir schreiben ein MicroPython-Programm, das die Temperatur vom Thermistor ausliest und auf dem LCD-Display anzeigt.

Bemerkung

  • Öffne 7.2_room_temperature_meter.py aus newton-lab-kit/micropython oder kopiere den Code in Thonny, dann klicke auf „Run“ oder drücke F5.

  • Stelle sicher, dass der richtige Interpreter ausgewählt ist: MicroPython (Raspberry Pi Pico).COMxx.

  • Die Bibliothek lcd1602.py muss hochgeladen sein. Eine detaillierte Anleitung findest du unter Bibliotheken auf den Pico hochladen.

from lcd1602 import LCD
from machine import I2C, Pin, ADC
import utime
import math

# Initialisierung des Thermistors (ADC an Pin 28)
thermistor = ADC(28)  # Analogeingang für den Thermistor

# Initialisierung der I2C-Kommunikation für das LCD1602-Display
i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=400000)

# Erstellen eines LCD-Objekts zur Steuerung des LCD1602-Displays
lcd = LCD(i2c)

# Konstanten für die Steinhart-Hart-Gleichung
BETA = 3950  # Beta-Koeffizient des Thermistors
R0 = 10000   # Widerstand bei 25 Grad Celsius
T0 = 298.15  # Referenztemperatur in Kelvin (25°C)

def read_temperature():
    # Lese den ADC-Rohwert vom Thermistor
    adc_value = thermistor.read_u16()

    # Wandle den ADC-Wert in eine Spannung um
    voltage = adc_value * 3.3 / 65535

    # Berechne den Widerstand des Thermistors
    Rt = (voltage * R0) / (3.3 - voltage)

    # Steinhart-Hart-Gleichung zur Berechnung der Temperatur in Kelvin
    tempK = 1 / ((1 / T0) + (1 / BETA) * math.log(Rt / R0))

    # Umrechnung von Kelvin in Celsius
    tempC = tempK - 273.15

    return tempC

def main():
    while True:
        temperature = read_temperature()
        # Temperatur mit zwei Dezimalstellen formatieren
        temp_str = "{:.2f} C".format(temperature)

        # Temperatur auf dem LCD anzeigen
        lcd.clear()
        lcd.write(0, 0, "Room Temp:")
        lcd.write(4, 1, temp_str)

        # Optionale Ausgabe der Temperatur in der Konsole
        print("Temperature:", temp_str)

        utime.sleep(1)

if __name__ == "__main__":
    main()

Sobald der Code läuft, sollte das LCD-Display die aktuelle Raumtemperatur in Celsius anzeigen. Falls das Display leer bleibt, passe den Kontrast mit dem Potentiometer auf der Rückseite an. Die Konsole in Thonny gibt ebenfalls die gemessenen Temperaturwerte aus.

Den Code verstehen

  1. Importe und Initialisierung:

    • lcd1602.LCD: Zur Steuerung des LCD-Displays.

    • machine.ADC: Zum Auslesen der analogen Werte vom Thermistor.

    • math: Für die logarithmischen Berechnungen zur Temperaturumrechnung.

  2. Variablen:

    • BETA: Der Beta-Koeffizient des Thermistors (normalerweise 3950).

    • R0: Der Widerstand des Thermistors bei der Referenztemperatur (üblicherweise 10 kΩ bei 25°C).

    • T0: Die Referenztemperatur in Kelvin (25°C + 273.15).

    BETA = 3950  # Beta-Koeffizient des Thermistors
    R0 = 10000   # Widerstand bei 25 Grad Celsius
    T0 = 298.15  # Referenztemperatur in Kelvin (25°C)
    
  3. Temperaturmessung (read_temperature Function):

    • ADC-Wert auslesen: Erfasst den analogen Wert des Thermistors.

    • Spannungsberechnung: Wandelt den ADC-Wert in eine tatsächliche Spannung um.

    • Widerstandsberechnung (Rt): Berechnet den Widerstand des Thermistors mit der Spannungsteilerformel.

    • Steinhart-Hart-Gleichung: Ein mathematisches Modell, das den Widerstand eines Thermistors mit der Temperatur in Beziehung setzt.

    • Umrechnung in Celsius: Wandelt die Temperatur von Kelvin in Celsius um.

    def read_temperature():
            # Rohwert des ADC vom Thermistor auslesen
            adc_value = thermistor.read_u16()
    
            # Umrechnung des Rohwerts in eine Spannung
            voltage = adc_value * 3.3 / 65535
    
            # Berechnung des Widerstands des Thermistors
            Rt = (voltage * R0) / (3.3 - voltage)
    
            # Anwendung der Steinhart-Hart-Gleichung zur Berechnung der Temperatur in Kelvin
            tempK = 1 / ((1 / T0) + (1 / BETA) * math.log(Rt / R0))
    
            # Umrechnung von Kelvin in Celsius
            tempC = tempK - 273.15
    
            return tempC
    
  4. Hauptschleife (main-Funktion):

    • Liest kontinuierlich die Temperatur.

    • Formatiert und zeigt die Temperatur auf dem LCD an.

    • Gibt die Temperatur optional zur Fehlerüberprüfung in der Konsole aus.

    • Wartet eine Sekunde, bevor die nächste Messung durchgeführt wird.

    def main():
        while True:
            temperature = read_temperature()
            # Temperatur mit zwei Dezimalstellen formatieren
            temp_str = "{:.2f} C".format(temperature)
    
            # Temperatur auf dem LCD anzeigen
            lcd.clear()
            lcd.write(0, 0, "Room Temp:")
            lcd.write(4, 1, temp_str)
    
            # Optionale Ausgabe der Temperatur in der Konsole
            print("Temperature:", temp_str)
    
            utime.sleep(1)
    

Fehlersuche

  • LCD zeigt keinen Text an:

    • Überprüfe die Verbindungen von SDA und SCL (GP6 und GP7).

    • Stelle sicher, dass das LCD-Modul korrekt mit Strom versorgt wird.

    • Passe den Kontrast mit dem Potentiometer auf der Rückseite des Displays an.

  • Falsche Temperaturwerte:

    • Vergewissere dich, dass Thermistor und Widerstand richtig angeschlossen sind.

    • Überprüfe die Widerstandswerte.

    • Stelle sicher, dass der BETA-Wert zu deinem Thermistor passt.

  • Programmfehler:

    • Prüfe, ob alle notwendigen Bibliotheken korrekt auf den Pico hochgeladen wurden.

    • Überprüfe den Code auf Tippfehler oder fehlerhafte Einrückungen.

Weitere Experimente

  • Anzeige der Temperatur in Fahrenheit:

    Ändere die read_temperature-Funktion, um die Temperatur auch in Fahrenheit anzuzeigen: tempF = (tempC * 9 / 5) + 32.

  • Luftfeuchtigkeit messen:

    Integriere einen DHT11- oder DHT22-Sensor, um zusätzlich die Luftfeuchtigkeit anzuzeigen.

  • Datenprotokollierung:

    Speichere die Temperaturwerte über einen längeren Zeitraum auf dem Pico und analysiere sie auf einem Computer.

  • Visuelle Alarme:

    Füge LEDs oder einen Summer hinzu, um einen Alarm auszulösen, wenn die Temperatur einen bestimmten Schwellenwert überschreitet.

Die Wissenschaft dahinter verstehen

  • Thermistoren und Temperaturmessung:

    • Thermistoren reagieren empfindlich auf Temperaturänderungen und eignen sich daher ideal für präzise Messungen.

    • Der Spannungsteiler wandelt Widerstandsänderungen in Spannungsänderungen um, die vom ADC des Pico ausgelesen werden können.

  • Steinhart-Hart-Gleichung:

    • Liefert eine genauere Temperaturberechnung als eine einfache lineare Näherung.

    • Essenziell für Anwendungen, die eine präzise Temperaturmessung erfordern.

Fazit

Herzlichen Glückwunsch! Du hast erfolgreich ein funktionales Raumthermometer mit dem Raspberry Pi Pico 2 gebaut. Dieses Projekt zeigt nicht nur, wie analoge Sensoren mit I2C-Displays kombiniert werden, sondern bietet auch praktische Erfahrungen in der Temperaturmessung und Anzeige. Erweitere und passe dein Thermometer an, indem du neue Funktionen hinzufügst oder weitere Sensoren integrierst. Dieses Projekt bildet eine solide Grundlage für die Entwicklung von Umweltüberwachungs- und Steuerungssystemen.