.. note:: 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 [|link_sf_facebook|] und tritt noch heute bei! .. _2.2.1_c_pi5_mcp3008: 2.2.1 Fotowiderstand (MCP3008) ============================== .. 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 ---------- Ein Fotowiderstand ist eine häufig verwendete Komponente zur Erfassung der Umgebungslichtintensität. Er hilft dem Controller, Tag und Nacht zu unterscheiden und Lichtsteuerungsfunktionen wie z. B. ein Nachtlicht zu realisieren. Dieses Projekt ähnelt sehr dem Potentiometer – nur dass hier die Spannung durch Licht beeinflusst wird. Benötigte Komponenten --------------------- In diesem Projekt benötigen wir die folgenden Komponenten. .. image:: ../img/list2_2.2.1_photoresistor.png Prinzip ------- Ein Fotowiderstand oder eine Fotozelle ist ein lichtgesteuerter, variabler Widerstand. Der Widerstand eines Fotowiderstands sinkt mit zunehmender Lichtintensität – mit anderen Worten: Er weist Photoleitfähigkeit auf. Ein Fotowiderstand kann in lichtempfindlichen Detektorschaltungen sowie in licht- und dunkelheitsgesteuerten Schaltkreisen eingesetzt werden. .. image:: ../img/image196.png :width: 200 :align: center Schaltplan ---------- .. list-table:: :widths: 30 30 30 30 :header-rows: 1 * - 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 .. image:: ../img/schematic_2.2.1_photoresistor_mcp3008.png Experimentelle Schritte ----------------------- **Schritt 1:** Baue die Schaltung auf. .. image:: ../img/july24_2.2.1_photoresistor_mcp3008.png **Schritt 2:** Wechsle in den Code-Ordner. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/2.2.1-2/ **Schritt 3:** Kompiliere den Code. .. raw:: html .. code-block:: gcc 2.2.1_Photoresistor.c -o photoresistor -lwiringPi -lm **Schritt 4:** Führe die ausführbare Datei aus. .. raw:: html .. code-block:: ./photoresistor Während der Code läuft, ändert sich die Helligkeit der LED entsprechend der vom Fotowiderstand erfassten Lichtintensität. .. note:: Falls es nach dem Ausführen nicht funktioniert oder die Fehlermeldung „wiringPi.h: No such file or directory“ erscheint, siehe :ref:`install_wiringpi`. **Code** .. code-block:: c #include #include #include #include #define SPI_CHANNEL 0 // SPI-Kanal 0 (CE0) verwenden #define SPI_SPEED 1000000 // 1 MHz SPI-Geschwindigkeit #define LedPin 3 // GPIO3 (WiringPi) für LED-PWM // ADC-Wert vom MCP3008 lesen, Kanal 0~7 int readMCP3008(int channel) { if (channel < 0 || channel > 7) return -1; unsigned char buffer[3]; buffer[0] = 1; // Startbit buffer[1] = (8 + channel) << 4; // SGL/DIF = 1, D2-D0 = Kanal buffer[2] = 0; wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3); // Ergebnis zusammenführen int result = ((buffer[1] & 3) << 8) | buffer[2]; return result; } int main(void) { if (wiringPiSetup() == -1) { printf("wiringPi-Initialisierung fehlgeschlagen!\n"); return 1; } if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { printf("SPI-Setup fehlgeschlagen!\n"); return 1; } softPwmCreate(LedPin, 0, 100); // Software-PWM initialisieren while (1) { int analogVal = readMCP3008(0); // Von CH0 lesen printf("ADC-Wert: %d\n", analogVal); // 10-Bit-ADC-Wert (0–1023) auf PWM-Bereich (0–100) skalieren int pwmVal = analogVal * 100 / 1023; softPwmWrite(LedPin, pwmVal); delay(100); } return 0; } **Code-Erklärung** Der Code ist derselbe wie in Abschnitt 2.1.4 Potentiometer. Wenn du weitere Fragen hast, siehe die Code-Erklärung unter :ref:`2.1.4_c_pi5_mcp3008` für Details.