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
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:
Es ist definitiv bequem, ein komplettes Kit zu kaufen, hier ist der Link:
Name |
ELEMENTE IN DIESEM KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Du kannst sie auch einzeln über die folgenden Links kaufen.
KOMPONENTENBESCHREIBUNG |
KAUFLINK |
|---|---|
- |
|
- |
|
- |
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 |
Experimentelle Verfahren
Schritt 1: Baue die Schaltung auf.
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 bittesudo apt install python3-smbus2aus.Wenn der Fehler
OSError: [Errno 121] Remote I/O errorauftritt, 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
Dieser Abschnitt importiert die erforderlichen Bibliotheken.
LCD1602dient zur LCD-Anzeige über I2C,gpiozerounterstützt LED, Summer und Taste,spidevwird zur Kommunikation mit dem MCP3008 ADC verwendet, und die Standardbibliothekentimeundmathwerden 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
Initialisiert Hardwarekomponenten, die mit den GPIO-Pins verbunden sind:
Button(22)ist mit dem Joystick-Knopf verbunden.Buzzer(23)undLED(24)dienen als Ausgabesignale bei hoher Temperatur.
Joy_BtnPin = Button(22) # GPIO22, Pin15 buzzPin = Buzzer(23) # GPIO23, Pin16 ledPin = LED(24) # GPIO24, Pin18
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)
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
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
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)
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)
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()
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()
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()