Bemerkung
Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauche tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.
Warum beitreten?
Expertenunterstützung: Löse Probleme nach dem Kauf 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 Zugang zu neuen Produktankündigungen und Vorschauen.
Sonderrabatte: Genieße exklusive Rabatte auf unsere neuesten Produkte.
Festliche Aktionen und Gewinnspiele: Nimm an Gewinnspielen und Feiertagsaktionen teil.
👉 Bereit, mit uns zu erkunden und zu kreieren? Klicke [hier] und tritt noch heute bei!
2.2.1 Fotowiderstand (MCP3008)
Bemerkung
Abhängig von deiner Kit-Version überprüfe bitte, ob du ADC0834 oder MCP3008 hast, und gehe entsprechend zum passenden Abschnitt.
Einführung
Der Fotowiderstand ist eine häufig verwendete Komponente zur Erfassung der Umgebungslichtintensität. Er hilft dem Controller, Tag und Nacht zu erkennen und Lichtsteuerungsfunktionen wie Nachtlampen zu realisieren. Dieses Projekt ist dem Potentiometer sehr ähnlich, und man kann sich vorstellen, dass es die Spannung ändert, um das Licht zu erfassen.
Benötigte Komponenten
Für dieses Projekt benötigen wir die folgenden Komponenten.
Es ist auf jeden Fall praktisch, ein komplettes Kit zu kaufen. Hier ist der Link:
Name |
ARTIKEL IN DIESEM KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Du kannst sie auch separat über die folgenden Links kaufen.
KOMPONENTENVORSTELLUNG |
KAUFLINK |
|---|---|
- |
|
Schaltplan
T-Board-Name |
physical |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
GPIO22 |
pin15 |
3 |
22 |
Experimentelle Schritte
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: Wechsle in den Code-Ordner.
cd ~/raphael-kit/python
Schritt 4: Führe die ausführbare Datei aus.
sudo python3 2.2.1-2_photoresistor.py
Während der Code ausgeführt wird, ändert sich die Helligkeit der LED entsprechend der vom Fotowiderstand erfassten Lichtintensität.
Warnung
Wenn die Fehlermeldung RuntimeError: Cannot determine SOC peripheral base address erscheint, siehe If gpiozero doesn’t work.
Code
Bemerkung
Du kannst den untenstehenden Code Bearbeiten/Zurücksetzen/Kopieren/Ausführen/Stoppen. Gehe zuvor in das Quellcodeverzeichnis wie raphael-kit/python. Nach Änderungen kannst du den Code direkt ausführen, um das Ergebnis zu sehen.
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import spidev
import time
# GPIO-Pin für PWM-LED
PWM_PIN = 22
# GPIO einrichten
GPIO.setmode(GPIO.BCM)
GPIO.setup(PWM_PIN, GPIO.OUT)
# PWM initialisieren (Frequenz = 1000Hz)
pwm = GPIO.PWM(PWM_PIN, 1000)
pwm.start(0) # Start mit 0% Tastverhältnis
# SPI initialisieren (MCP3008 auf Bus 0, CE0)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000 # 1 MHz
# Funktion zum Auslesen des MCP3008-ADC-Werts
def read_adc(channel):
"""
Liest analogen Wert vom MCP3008 (Kanal 0–7)
Rückgabe: 10-Bit-Wert (0–1023)
"""
if channel < 0 or channel > 7:
return -1
r = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((r[1] & 3) << 8) | r[2]
return value
# Hauptschleife zum Auslesen des ADC und Einstellen der PWM-Helligkeit
try:
while True:
analogVal = read_adc(0)
print(f"value = {analogVal}")
# Skaliere den ADC-Wert (0–1023) auf das Tastverhältnis (0–100)
duty_cycle = analogVal * 100 / 1023
pwm.ChangeDutyCycle(duty_cycle)
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
pwm.stop()
GPIO.cleanup()
spi.close()
Code-Erklärung
Importiere die benötigten Bibliotheken:
RPi.GPIOzur Steuerung der GPIO-Pins und Erzeugung von PWM-Signalen.spidevzur Kommunikation mit dem MCP3008-ADC über SPI.timezur Handhabung von Zeitverzögerungen.
#!/usr/bin/env python3 import RPi.GPIO as GPIO import spidev import time
Konfiguriere GPIO-Pin 22 als PWM-Ausgang im BCM-Modus. Initialisiere Software-PWM bei 1000 Hz mit einem Start-Tastverhältnis von 0 %.
# GPIO-Pin für PWM-LED PWM_PIN = 22 # GPIO einrichten GPIO.setmode(GPIO.BCM) GPIO.setup(PWM_PIN, GPIO.OUT) # PWM initialisieren (Frequenz = 1000Hz) pwm = GPIO.PWM(PWM_PIN, 1000) pwm.start(0) # Start mit 0% Tastverhältnis
Richte die SPI-Schnittstelle für die Kommunikation mit dem MCP3008 auf Bus 0, Chip Enable 0 (CE0) ein und konfiguriere die SPI-Geschwindigkeit auf 1 MHz.
# SPI initialisieren (MCP3008 auf Bus 0, CE0) spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000 # 1 MHz
Definiere eine Funktion
read_adc(channel), um analoge Werte vom MCP3008 auszulesen. Die Funktion sendet drei Bytes an den Chip und rekonstruiert einen 10-Bit-Analogwert (0–1023) aus der Antwort.# Funktion zum Auslesen des MCP3008-ADC-Werts def read_adc(channel): """ Liest analogen Wert vom MCP3008 (Kanal 0–7) Rückgabe: 10-Bit-Wert (0–1023) """ if channel < 0 or channel > 7: return -1 r = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((r[1] & 3) << 8) | r[2] return value
Dies ist die Hauptschleife, die: - den analogen Eingang von Kanal 0 des MCP3008 liest, - den Wert in ein PWM-Tastverhältnis (0–100 %) umwandelt, - die Helligkeit der LED mit
pwm.ChangeDutyCycle()anpasst - und dies alle 0,2 Sekunden wiederholt.# Hauptschleife zum Auslesen des ADC und Einstellen der PWM-Helligkeit try: while True: analogVal = read_adc(0) print(f"value = {analogVal}") # Skaliere den ADC-Wert (0–1023) auf das Tastverhältnis (0–100) duty_cycle = analogVal * 100 / 1023 pwm.ChangeDutyCycle(duty_cycle) time.sleep(0.2)
Wenn das Programm mit Strg+C unterbrochen wird, werden PWM und GPIO ordnungsgemäß beendet und die SPI-Schnittstelle geschlossen.
except KeyboardInterrupt: pass finally: pwm.stop() GPIO.cleanup() spi.close()