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

../_images/mcp3008_and_adc0834.jpg

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.

../_images/list2_2.2.1_photoresistor.png

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

../_images/schematic_2.2.1_photoresistor_mcp3008.png

Experimentelle Schritte

Schritt 1: Baue die Schaltung auf.

../_images/2.2.1_Photoresistor_bb.png

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.