Bemerkung

Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauche tiefer ein in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Löse nach dem Kauf auftretende Probleme und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.

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

  • Exklusive Vorschauen: Erhalte frühzeitigen Zugriff auf neue Produktankündigungen und exklusive Einblicke.

  • Sonderrabatte: Genieße exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Verlosungen: Nimm an Verlosungen und Feiertagsaktionen teil.

👉 Bereit, mit uns zu forschen und zu erschaffen? Klicke auf [hier] und tritt noch heute bei!

4.1.10 Überhitzungsmonitor (MCP3008)

Bemerkung

../_images/mcp3008_and_adc0834.jpg

Abhängig von deiner Kit-Version identifiziere bitte, ob du ADC0834 oder MCP3008 hast, und fahre mit dem entsprechenden Abschnitt fort.

Einführung

Vielleicht möchtest du ein Überhitzungsüberwachungsgerät bauen, das in verschiedenen Situationen eingesetzt werden kann, z. B. in einer Fabrik, wenn ein Alarm ausgelöst und die Maschine automatisch abgeschaltet werden soll, wenn eine Schaltung überhitzt. In diesem Projekt verwenden wir einen Thermistor, einen Joystick, einen Summer, eine LED und ein LCD, um ein intelligentes Temperaturüberwachungsgerät zu bauen, dessen Schwellenwert einstellbar ist.

Benötigte Komponenten

In diesem Projekt benötigen wir die folgenden Komponenten:

../_images/list2_Overheat_Monitor1.png

Es ist definitiv bequem, ein komplettes Kit zu kaufen, hier ist der Link:

Name

ELEMENTE IN DIESEM KIT

LINK

Raphael Kit

337

Raphael Kit

Du kannst sie auch einzeln über die folgenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUFLINK

GPIO Extension Board

KAUFEN

Steckbrett

KAUFEN

Jumper-Kabel

KAUFEN

Widerstand

KAUFEN

LED

KAUFEN

Joystick-Modul

-

MCP3008

-

Transistor

KAUFEN

I2C LCD1602

KAUFEN

Thermistor

KAUFEN

Summer

-

Schaltplan

T-Board Name

physical

wiringPi

BCM

SPICE0

Pin 24

10

8

SPIMOSI

Pin 19

12

10

SPIMISO

Pin 21

13

9

SPISCLK

Pin 23

14

11

GPIO22

Pin15

3

22

GPIO23

Pin16

4

23

GPIO24

Pin18

5

24

SDA1

Pin 3

SCL1

Pin 5

../_images/schematic_over_monitor_mcp30081.png

Experimentelle Verfahren

Schritt 1: Baue die Schaltung auf.

../_images/july24_3.1.8_overheat_monitor_mcp30081.png

Schritt 2: Richte die SPI-Schnittstelle ein und installiere die spidev-Bibliothek (siehe SPI-Konfiguration für detaillierte Anweisungen). Wenn du diese Schritte bereits abgeschlossen hast, kannst du diesen Schritt überspringen.

Schritt 3: Gehe in den Code-Ordner.

cd ~/raphael-kit/python-pi5

Schritt 4: Führe die ausführbare Datei aus.

sudo python3 4.1.13-2_OverheatMonitor_zero.py

Wenn der Code läuft, werden die aktuelle Temperatur und der Hochtemperaturschwellenwert 40 auf I2C LCD1602 angezeigt. Wenn die aktuelle Temperatur größer als der Schwellenwert ist, werden Summer und LED aktiviert, um dich zu warnen.

Der Joystick dient hier dazu, den Hochtemperaturschwellenwert einzustellen. Durch Bewegen des Joysticks in X- und Y-Richtung kann der aktuelle Hochtemperaturschwellenwert erhöht oder verringert werden. Ein erneutes Drücken des Joysticks setzt den Schwellenwert auf den Anfangswert zurück.

Bemerkung

  • Wenn du den Fehler FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1' erhältst, musst du gemäß I²C-Konfiguration I2C aktivieren.

  • Wenn der Fehler ModuleNotFoundError: No module named 'smbus2' auftritt, führe bitte sudo apt install python3-smbus2 aus.

  • Wenn der Fehler OSError: [Errno 121] Remote I/O error auftritt, bedeutet das, dass das Modul falsch verdrahtet ist oder defekt ist.

  • Wenn Code und Verdrahtung korrekt sind, das LCD aber immer noch nichts anzeigt, kannst du das Potentiometer auf der Rückseite drehen, um den Kontrast zu erhöhen.

Warnung

Wenn die Fehlermeldung RuntimeError: Cannot determine SOC peripheral base address erscheint, lies bitte If gpiozero doesn’t work..

Code

Bemerkung

Du kannst den untenstehenden Code Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen. Bevor du dies tust, musst du in den Quellcodepfad wie raphael-kit/python wechseln. Nach dem Ändern des Codes kannst du ihn direkt ausführen, um den Effekt zu sehen.

#!/usr/bin/env python3

import LCD1602
from gpiozero import LED, Buzzer, Button
import spidev
import time
import math

# Initialize joystick button, buzzer, and LED
Joy_BtnPin = Button(22)  # GPIO22, Pin15
buzzPin = Buzzer(23)     # GPIO23, Pin16
ledPin = LED(24)         # GPIO24, Pin18

# Set initial upper temperature threshold
upperTem = 40

# Initialize SPI for MCP3008 (Bus 0, CE0 -> GPIO8 / Pin24)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000  # 1 MHz

# Initialize LCD (I2C address 0x27, backlight on)
LCD1602.init(0x27, 1)

def read_adc(channel):
    """
    Read analog value from MCP3008 (0–7)
    """
    if channel < 0 or channel > 7:
        return -1
    adc = spi.xfer2([1, (8 + channel) << 4, 0])
    value = ((adc[1] & 0x03) << 8) | adc[2]
    return value

def get_joystick_value():
    """
    Reads the joystick values and returns a change value based on the joystick's position.
    """
    x_val = read_adc(1)
    y_val = read_adc(2)
    if x_val > 800:
        return 1
    elif x_val < 200:
        return -1
    elif y_val > 800:
        return -10
    elif y_val < 200:
        return 10
    else:
        return 0

def upper_tem_setting():
    """
    Adjusts and displays the upper temperature threshold on the LCD.
    """
    global upperTem
    LCD1602.write(0, 0, 'Upper Adjust: ')
    change = int(get_joystick_value())
    upperTem += change
    strUpperTem = str(upperTem)
    LCD1602.write(0, 1, strUpperTem)
    LCD1602.write(len(strUpperTem), 1, '              ')
    time.sleep(0.1)

def temperature():
    """
    Reads the current temperature from the sensor and returns it in Celsius.
    """
    analogVal = read_adc(0)
    Vr = 3.3 * analogVal / 1023.0  # Voltage across the fixed resistor
    if Vr == 0:
        return 0  # Prevent division by zero
    Rt = 10000.0 * Vr / (3.3 - Vr)  # Adjusted formula: thermistor voltage is (3.3 - Vr)
    temp = 1 / (((math.log(Rt / 10000.0)) / 3950.0) + (1 / (273.15 + 25.0)))
    Cel = temp - 273.15
    return round(Cel, 2)

def monitoring_temp():
    """
    Monitors and displays the current temperature and upper temperature threshold.
    Activates buzzer and LED if the temperature exceeds the upper limit.
    """
    global upperTem
    Cel = temperature()
    LCD1602.write(0, 0, 'Temp: ')
    LCD1602.write(0, 1, 'Upper: ')
    LCD1602.write(6, 0, str(Cel))
    LCD1602.write(7, 1, str(upperTem))
    time.sleep(0.1)
    if Cel >= upperTem:
        buzzPin.on()
        ledPin.on()
    else:
        buzzPin.off()
        ledPin.off()

# Main execution loop
try:
    lastState = 1
    stage = 0
    while True:
        currentState = Joy_BtnPin.value
        if currentState == 1 and lastState == 0:
            stage = (stage + 1) % 2
            time.sleep(0.1)
            LCD1602.clear()
        lastState = currentState
        if stage == 1:
            upper_tem_setting()
        else:
            monitoring_temp()
except KeyboardInterrupt:
    LCD1602.clear()
    spi.close()

Code-Erklärung

  1. Dieser Abschnitt importiert die erforderlichen Bibliotheken. LCD1602 dient zur LCD-Anzeige über I2C, gpiozero unterstützt LED, Summer und Taste, spidev wird zur Kommunikation mit dem MCP3008 ADC verwendet, und die Standardbibliotheken time und math werden für Verzögerungen und Temperaturberechnungen genutzt.

    #!/usr/bin/env python3
    
    import LCD1602
    from gpiozero import LED, Buzzer, Button
    import spidev
    import time
    import math
    
  2. Initialisiert Hardwarekomponenten, die mit den GPIO-Pins verbunden sind:

    • Button(22) ist mit dem Joystick-Knopf verbunden.

    • Buzzer(23) und LED(24) dienen als Ausgabesignale bei hoher Temperatur.

    Joy_BtnPin = Button(22)  # GPIO22, Pin15
    buzzPin = Buzzer(23)     # GPIO23, Pin16
    ledPin = LED(24)         # GPIO24, Pin18
    
  3. Legt den Standardschwellenwert für die obere Temperatur fest und initialisiert sowohl SPI für MCP3008 als auch das LCD1602-Display.

    upperTem = 40
    
    spi = spidev.SpiDev()
    spi.open(0, 0)
    spi.max_speed_hz = 1000000
    
    LCD1602.init(0x27, 1)
    
  4. Liest den analogen Wert von einem angegebenen Kanal (0–7) des MCP3008 unter Verwendung des SPI-Protokolls und gibt einen 10-Bit-Wert zurück.

    def read_adc(channel):
        if channel < 0 or channel > 7:
            return -1
        adc = spi.xfer2([1, (8 + channel) << 4, 0])
        value = ((adc[1] & 0x03) << 8) | adc[2]
        return value
    
  5. Die Joystick-Position wird durch Lesen der Kanäle 1 und 2 des MCP3008 ausgewertet. Je nach X- oder Y-Richtung werden unterschiedliche Werte für die Schwellenwerteinstellung zurückgegeben.

    def get_joystick_value():
        x_val = read_adc(1)
        y_val = read_adc(2)
        if x_val > 800:
            return 1
        elif x_val < 200:
            return -1
        elif y_val > 800:
            return -10
        elif y_val < 200:
            return 10
        else:
            return 0
    
  6. Passt den oberen Temperaturschwellenwert mit dem Joystick an. Zeigt den aktuellen Schwellenwert auf dem LCD an und sorgt für eine saubere Formatierung.

    def upper_tem_setting():
        global upperTem
        LCD1602.write(0, 0, 'Upper Adjust: ')
        change = int(get_joystick_value())
        upperTem += change
        strUpperTem = str(upperTem)
        LCD1602.write(0, 1, strUpperTem)
        LCD1602.write(len(strUpperTem), 1, '              ')
        time.sleep(0.1)
    
  7. Diese Funktion liest den analogen Wert vom MCP3008-Kanal 0 (angeschlossen an einen Thermistor), berechnet Spannung, Widerstand und schließlich die Temperatur in Celsius unter Verwendung der Steinhart–Hart-Annäherung.

    def temperature():
        """
        Reads the current temperature from the sensor and returns it in Celsius.
        """
        analogVal = read_adc(0)
        Vr = 3.3 * analogVal / 1023.0  # Voltage across the fixed resistor
        if Vr == 0:
            return 0  # Prevent division by zero
        Rt = 10000.0 * Vr / (3.3 - Vr)  # Adjusted formula: thermistor voltage is (3.3 - Vr)
        temp = 1 / (((math.log(Rt / 10000.0)) / 3950.0) + (1 / (273.15 + 25.0)))
        Cel = temp - 273.15
        return round(Cel, 2)
    
  8. Liest kontinuierlich die aktuelle Temperatur, vergleicht sie mit dem oberen Schwellenwert und zeigt beides auf dem LCD an. Wenn die Temperatur den Schwellenwert überschreitet, werden Summer und LED aktiviert.

    def monitoring_temp():
        global upperTem
        Cel = temperature()
        LCD1602.write(0, 0, 'Temp: ')
        LCD1602.write(0, 1, 'Upper: ')
        LCD1602.write(6, 0, str(Cel))
        LCD1602.write(7, 1, str(upperTem))
        time.sleep(0.1)
        if Cel >= upperTem:
            buzzPin.on()
            ledPin.on()
        else:
            buzzPin.off()
            ledPin.off()
    
  9. Die Hauptausführungsschleife wechselt zwischen Einstellmodus und Überwachungsmodus mit einem Joystick-Knopf. Ein Tastendruck wechselt den Modus. Im Einstellmodus wird der obere Schwellenwert angepasst; im Überwachungsmodus wird die Temperatur kontinuierlich überprüft.

    try:
        lastState = 1
        stage = 0
        while True:
            currentState = Joy_BtnPin.value
            if currentState == 1 and lastState == 0:
                stage = (stage + 1) % 2
                time.sleep(0.1)
                LCD1602.clear()
            lastState = currentState
            if stage == 1:
                upper_tem_setting()
            else:
                monitoring_temp()
    
  10. Stellt sicher, dass das LCD gelöscht und die SPI-Kommunikation ordnungsgemäß geschlossen wird, wenn das Programm über eine Tastaturunterbrechung beendet wird.

    except KeyboardInterrupt:
        LCD1602.clear()
        spi.close()