Bemerkung
Hallo und 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 Verlosungen: Nimm an Verlosungen und Feiertagsaktionen teil.
👉 Bereit, mit uns zu entdecken und zu erschaffen? Klicke auf [hier] und tritt noch heute bei!
2.2.1 Fotowiderstand (MCP3008)
Bemerkung
Je nach Kit-Version bitte prüfen, ob ADC0834 oder MCP3008 enthalten ist, und mit dem entsprechenden Abschnitt fortfahren.
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 z. B. ein Nachtlicht zu realisieren. Dieses Projekt ähnelt stark dem Potentiometer-Beispiel – hier wird jedoch die Spannung durch Lichteinfall beeinflusst.
Benötigte Komponenten
In diesem Projekt benötigen wir die folgenden Komponenten.
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: Gehe in den Code-Ordner.
cd ~/davinci-kit-for-raspberry-pi/nodejs/
Schritt 3: Führe den Code aus.
sudo node photoresistor-2.js
Code
const Gpio = require('pigpio').Gpio;
const mcpadc = require('mcp-spi-adc');
// Öffne MCP3008-Kanal 0 (analoger Eingang CH0)
const adc = mcpadc.openMcp3008(0, { speedHz: 1350000 }, (err) => {
if (err) {
console.error("Fehler beim Öffnen des MCP3008:", err);
process.exit(1);
}
console.log("MCP3008 auf SPI0/CE0 initialisiert.");
// Initialisiere LED an GPIO22 (PWM-fähig)
const led = new Gpio(22, { mode: Gpio.OUTPUT });
// Intervall zum Lesen des ADC und Anpassen der LED-Helligkeit alle 100 ms
const interval = setInterval(() => {
adc.read((err, reading) => {
if (err) {
console.error("Fehler beim Lesen des ADC:", err);
return;
}
const adcValue = reading.value; // Wert zwischen 0.0 und 1.0 (Float)
const pwmValue = Math.round(adcValue * 255); // Skaliere auf 0–255
console.log(`ADC = ${adcValue.toFixed(4)}, PWM = ${pwmValue}`);
led.pwmWrite(pwmValue); // LED-Helligkeit anpassen
});
}, 100);
// Beende das Programm bei Ctrl+C (SIGINT) sauber
process.on('SIGINT', () => {
console.log('\nBeende Programm...');
clearInterval(interval); // Intervallschleife stoppen
led.digitalWrite(0); // LED ausschalten
process.exit(0);
});
});
Code-Erklärung
const Gpio = require('pigpio').Gpio;
Diese Zeile importiert das Modul pigpio, das zur Steuerung der GPIO-Pins auf dem Raspberry Pi verwendet wird.
Es unterstützt PWM-Ausgabe, die für die LED-Dimmung erforderlich ist.
const mcpadc = require('mcp-spi-adc');
Diese Zeile importiert die Bibliothek mcp-spi-adc, die die Kommunikation mit dem MCP3008-Analog-Digital-Wandler über die Hardware-SPI-Schnittstelle des Raspberry Pi ermöglicht.
const adc = mcpadc.openMcp3008(0, { speedHz: 1350000 }, (err) => { ... });
Öffnet den analogen Eingangskanal 0 des MCP3008-Chips unter Verwendung von Hardware-SPI. Die SPI-Taktrate wird auf 1,35 MHz gesetzt. Tritt beim Öffnen des Kanals ein Fehler auf, wird dieser protokolliert und das Programm beendet.
const led = new Gpio(22, { mode: Gpio.OUTPUT });
Initialisiert GPIO-Pin 22 als Ausgang.
Dieser Pin wird verwendet, um die Helligkeit einer LED mithilfe von PWM über die pigpio-Bibliothek zu steuern.
setInterval(() => {
adc.read((err, reading) => {
...
});
}, 100);
Richtet eine wiederkehrende Schleife ein, die alle 100 ms ausgeführt wird. In jedem Zyklus wird der analoge Wert von MCP3008-Kanal 0 gelesen. Das Ergebnis ist ein Gleitkommawert zwischen 0,0 und 1,0, der das Verhältnis von Eingangsspannung zu Referenzspannung darstellt.
const pwmValue = Math.round(adcValue * 255);
led.pwmWrite(pwmValue);
Wandelt den analogen Wert in einen 8-Bit-PWM-Wert im Bereich 0–255 um und schreibt ihn auf GPIO22, um die LED-Helligkeit proportional anzupassen.
process.on('SIGINT', () => {
clearInterval(interval);
led.digitalWrite(0);
process.exit(0);
});
Fügt einen Signal-Handler hinzu, um das Programm bei Drücken von Ctrl+C sauber zu beenden.
Die Intervallschleife wird gestoppt, die LED ausgeschaltet und das Programm ordnungsgemäß beendet.