.. note:: Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten. **Warum beitreten?** - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams. - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern. - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken. - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte. - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil. 👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei! .. _py_pi5_fan: 3.1.4 Intelligenter Ventilator ================================= .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left Je nach deiner Kit-Version überprüfe bitte, ob du **ADC0834** oder **MCP3008** hast, und fahre mit dem entsprechenden Abschnitt fort. Einführung ----------------- In diesem Projekt werden wir Motoren, Tasten und Thermistoren verwenden, um einen manuellen + automatischen intelligenten Ventilator zu bauen, dessen Windgeschwindigkeit einstellbar ist. Benötigte Komponenten ------------------------------ Für dieses Projekt benötigen wir folgende Komponenten. .. image:: ../python_pi5/img/4.1.10_smart_fan_list.png :width: 800 :align: center Schaltplan ------------------------ ============ ======== ======== === T-Board Name physisch wiringPi BCM GPIO17 Pin 11 0 17 GPIO18 Pin 12 1 18 GPIO27 Pin 13 2 27 GPIO22 Pin 15 3 22 GPIO5 Pin 29 21 5 GPIO6 Pin 31 22 6 GPIO13 Pin 33 23 13 ============ ======== ======== === .. image:: ../python_pi5/img/4.1.10_smart_fan_schematic.png :align: center Experimentelle Verfahren ----------------------------- **Schritt 1:** Bauen Sie den Schaltkreis. .. image:: ../python_pi5/img/4.1.10_smart_fan_circuit.png .. note:: Das Powermodul kann mit dem 9V-Batterieclip im Kit eine 9V-Batterie verwenden. Stecken Sie den Jumper des Powermoduls in die 5V-Steckleisten des Steckbretts. .. image:: ../python_pi5/img/4.1.10_smart_fan_battery.jpeg :align: center **Schritt 2**: Wechseln Sie in den Ordner des Codes. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Schritt 3**: Ausführen. .. raw:: html .. code-block:: sudo python3 3.1.4_SmartFan_zero.py Wenn der Code ausgeführt wird, starten Sie den Ventilator, indem Sie die Taste drücken. Jedes Mal, wenn Sie drücken, wird die Geschwindigkeitsstufe um 1 erhöht oder verringert. Es gibt **5** Geschwindigkeitsstufen: **0~4**. Wenn Sie auf die 4. Stufe eingestellt sind und die Taste drücken, stoppt der Ventilator und zeigt eine Windgeschwindigkeit von **0** an. Steigt oder fällt die Temperatur um mehr als 2℃, wird die Geschwindigkeit automatisch um 1 Stufe schneller oder langsamer eingestellt. Code -------- .. note:: Sie können den untenstehenden Code **modifizieren/zurücksetzen/kopieren/ausführen/stoppen**. Bevor Sie dies tun, sollten Sie jedoch zum Quellcodepfad wie ``davinci-kit-for-raspberry-pi/python-pi5`` wechseln. Nachdem Sie den Code geändert haben, können Sie ihn direkt ausführen, um das Ergebnis zu sehen. .. raw:: html .. code-block:: python #!/usr/bin/env python3 from gpiozero import Motor, Button from time import sleep import ADC0834 import math # Initialisierung der GPIO-Pins für die Taste und die Motorsteuerung BtnPin = Button(22) motor = Motor(forward=5, backward=6, enable=13) # Initialisierung des ADC0834-Moduls für die Temperaturmessung ADC0834.setup() # Initialisierung von Variablen zur Überwachung der Motordrehzahl und Temperaturen level = 0 currentTemp = 0 markTemp = 0 def temperature(): """ Liest und berechnet die aktuelle Temperatur vom Sensor. Rückgabe: float: Die aktuelle Temperatur in Celsius. """ # Analogwert vom ADC0834-Modul lesen analogVal = ADC0834.getResult() # Analogwert in Spannung und dann in Widerstand umwandeln Vr = 5 * float(analogVal) / 255 Rt = 10000 * Vr / (5 - Vr) # Temperatur in Celsius berechnen temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25))) Cel = temp - 273.15 return Cel def motor_run(level): """ Passt die Motorgeschwindigkeit an das angegebene Niveau an. Argumente: level (int): Gewünschtes Motorgeschwindigkeitsniveau. Rückgabe: int: Angepasstes Motorgeschwindigkeitsniveau. """ # Motor stoppen, wenn das Niveau 0 ist if level == 0: motor.stop() return 0 # Niveau auf 4 begrenzen für maximale Geschwindigkeit if level >= 4: level = 4 # Motorgeschwindigkeit einstellen motor.forward(speed=float(level / 4)) return level def changeLevel(): """ Ändert das Motorgeschwindigkeitsniveau, wenn die Taste gedrückt wird, und aktualisiert die Referenztemperatur. """ global level, currentTemp, markTemp print("Taste gedrückt") # Durch die Niveaus 0-4 zyklisch wechseln level = (level + 1) % 5 # Referenztemperatur aktualisieren markTemp = currentTemp # Die Taste mit der Funktion changeLevel verbinden BtnPin.when_pressed = changeLevel def main(): """ Hauptfunktion zur kontinuierlichen Überwachung und Reaktion auf Temperaturänderungen. """ global level, currentTemp, markTemp # Anfängliche Referenztemperatur setzen markTemp = temperature() while True: # Aktuelle Temperatur kontinuierlich lesen currentTemp = temperature() # Motorniveau anhand der Temperaturdifferenz anpassen if level != 0: if currentTemp - markTemp <= -2: level -= 1 markTemp = currentTemp elif currentTemp - markTemp >= 2: if level < 4: level += 1 markTemp = currentTemp # Motor auf angepasstem Niveau betreiben level = motor_run(level) # Die Hauptfunktion ausführen und auf KeyboardInterrupt reagieren try: main() except KeyboardInterrupt: # Motor stoppen, wenn das Skript unterbrochen wird motor.stop() Code-Erklärung --------------------- #. Importiert Klassen zur Steuerung eines Motors und einer Taste sowie die Sleep-Funktion für Pausen. Außerdem wird die ADC0834-Bibliothek für die Temperaturmessung und die Math-Bibliothek für mathematische Berechnungen importiert. .. code-block:: python #!/usr/bin/env python3 from gpiozero import Motor, Button from time import sleep import ADC0834 import math #. Richtet die Taste an GPIO-Pin 22 ein und konfiguriert den Motor mit spezifischen GPIO-Pins zur Steuerung. Initialisiert das ADC0834-Modul zur Temperaturmessung. Außerdem werden Variablen initialisiert, um die Motordrehzahl und Temperaturen zu überwachen. .. code-block:: python # Initialisierung der GPIO-Pins für die Taste und die Motorsteuerung BtnPin = Button(22) motor = Motor(forward=5, backward=6, enable=13) # Initialisierung des ADC0834-Moduls für die Temperaturmessung ADC0834.setup() # Initialisierung von Variablen zur Überwachung der Motordrehzahl und Temperaturen level = 0 currentTemp = 0 markTemp = 0 #. Definiert eine Funktion zur Ablesung und Berechnung der Temperatur vom Sensor, die den Messwert in Celsius umwandelt. .. code-block:: python def temperature(): """ Liest und berechnet die aktuelle Temperatur vom Sensor. Rückgabe: float: Die aktuelle Temperatur in Celsius. """ # Analogwert vom ADC0834-Modul lesen analogVal = ADC0834.getResult() # Analogwert in Spannung und dann in Widerstand umwandeln Vr = 5 * float(analogVal) / 255 Rt = 10000 * Vr / (5 - Vr) # Temperatur in Celsius berechnen temp = 1 / (((math.log(Rt / 10000)) / 3950) + (1 / (273.15 + 25))) Cel = temp - 273.15 return Cel #. Führt eine Funktion ein, um die Motorgeschwindigkeit entsprechend dem angegebenen Niveau anzupassen. .. code-block:: python def motor_run(level): """ Passt die Motorgeschwindigkeit an das angegebene Niveau an. Argumente: level (int): Gewünschtes Motorgeschwindigkeitsniveau. Rückgabe: int: Angepasstes Motorgeschwindigkeitsniveau. """ # Motor stoppen, wenn das Niveau 0 ist if level == 0: motor.stop() return 0 # Niveau auf 4 begrenzen für maximale Geschwindigkeit if level >= 4: level = 4 # Motorgeschwindigkeit einstellen motor.forward(speed=float(level / 4)) return level #. Implementiert eine Funktion, um das Motorgeschwindigkeitsniveau manuell mithilfe einer Taste zu ändern und bindet diese Funktion an das Drücken der Taste. .. code-block:: python def changeLevel(): """ Ändert das Motorgeschwindigkeitsniveau, wenn die Taste gedrückt wird, und aktualisiert die Referenztemperatur. """ global level, currentTemp, markTemp print("Taste gedrückt") # Durch die Niveaus 0-4 zyklisch wechseln level = (level + 1) % 5 # Referenztemperatur aktualisieren markTemp = currentTemp # Die Taste mit der Funktion changeLevel verbinden BtnPin.when_pressed = changeLevel #. Die Hauptfunktion, die entwickelt wurde, um die Motorgeschwindigkeit kontinuierlich in Reaktion auf Temperaturschwankungen anzupassen, muss noch implementiert werden. .. code-block:: python def main(): """ Hauptfunktion zur kontinuierlichen Überwachung und Reaktion auf Temperaturänderungen. """ global level, currentTemp, markTemp # Anfängliche Referenztemperatur setzen markTemp = temperature() while True: # Aktuelle Temperatur kontinuierlich lesen currentTemp = temperature() # Motorniveau anhand der Temperaturdifferenz anpassen if level != 0: if currentTemp - markTemp <= -2: level -= 1 markTemp = currentTemp elif currentTemp - markTemp >= 2: if level < 4: level += 1 markTemp = currentTemp # Motor auf angepasstem Niveau betreiben level = motor_run(level) #. Führt die Hauptfunktion aus und stellt sicher, dass der Motor stoppt, wenn das Skript unterbrochen wird. .. code-block:: python # Die Hauptfunktion ausführen und auf KeyboardInterrupt reagieren try: main() except KeyboardInterrupt: # Motor stoppen, wenn das Skript unterbrochen wird motor.stop()