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!

3.1.8 Überhitzungsmonitor (MCP3008)

Bemerkung

../_images/mcp3008_and_adc0834.jpg

Je nach deiner Kit-Version überprüfe bitte, ob du ADC0834 oder MCP3008 hast, und fahre mit dem entsprechenden Abschnitt fort.

Einführung

Vielleicht möchtest du ein Überhitzungsüberwachungsgerät bauen, das in verschiedenen Situationen einsetzbar ist – z. B. in einer Fabrik, wenn man einen Alarm und ein automatisches rechtzeitiges Abschalten der Maschine bei Überhitzung einer Schaltung benötigt. In diesem Projekt verwenden wir einen Thermistor, einen Joystick, einen Summer, eine LED und ein LCD, um ein intelligentes Temperaturüberwachungsgerät zu bauen, dessen Schwellenwert einstellbar ist.

Benötigte Komponenten

In diesem Projekt benötigen wir die folgenden Komponenten.

../_images/list2_Overheat_Monitor.png

Schaltplan

T-Board-Name

Physical

WiringPi

BCM

SPICE0

Pin 24

10

8

SPIMOSI

Pin 19

12

10

SPIMISO

Pin 21

13

9

SPISCLK

Pin 23

14

11

GPIO22

Pin 15

3

22

GPIO23

Pin 16

4

23

GPIO24

Pin 18

5

24

SDA1

Pin 3

SCL1

Pin 5

../_images/Schematic_three_one81.png

Experimentelle Schritte

Schritt 1: Baue die Schaltung auf.

../_images/july24_3.1.8_overheat_monitor_mcp3008.png

Schritt 2: Gehe in den Code-Ordner.

cd ~/davinci-kit-for-raspberry-pi/c/3.1.8-2/

Schritt 3: Kompiliere den Code.

gcc 3.1.8_OverheatMonitor.c -lm -lwiringPi

Schritt 4: Führe die erstellte Datei aus.

sudo ./a.out

Während der Code läuft, werden die aktuelle Temperatur und der Hochtemperatur-Schwellenwert 40 auf dem I2C LCD1602 angezeigt. Wenn die aktuelle Temperatur höher als der Schwellenwert ist, werden Summer und LED aktiviert, um dich zu warnen.

Der Joystick dient hier zur Einstellung des Hochtemperatur-Schwellenwerts. Durch Kippen des Joysticks entlang der X- und Y-Achse kannst du den aktuellen Schwellenwert erhöhen oder verringern. Durch erneutes Drücken des Joysticks wird der Schwellenwert auf den Anfangswert zurückgesetzt.

Bemerkung

  • Wenn die Fehlermeldung wiringPi.h: No such file or directory erscheint, siehe Installieren und Überprüfen von WiringPi.

  • Wenn die Fehlermeldung Unable to open I2C device: No such file or directory erscheint, musst du I2C aktivieren (siehe I²C-Konfiguration) und die Verkabelung überprüfen.

  • Wenn Code und Verkabelung korrekt sind, das LCD aber trotzdem nichts anzeigt, kannst du das Potentiometer auf der Rückseite drehen, um den Kontrast zu erhöhen.

Code-Erklärung

int read_ADC(int channel) {
    if (channel < 0 || channel > 7) return -1;
    unsigned char buffer[3];
    buffer[0] = 1;
    buffer[1] = (8 + channel) << 4;
    buffer[2] = 0;
    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
    return ((buffer[1] & 0x03) << 8) | buffer[2];
}

Liest einen 10-Bit-Analogwert vom MCP3008-Kanal (CH0–CH7) über SPI und gibt einen ganzzahligen Wert von 0 bis 1023 zurück.

int get_joystick_value() {
    int x = read_ADC(1);
    int y = read_ADC(2);

    if (x > 900)      return 1;   // Rechts
    else if (x < 100) return -1;  // Links
    else if (y > 900) return -10; // Hoch
    else if (y < 100) return 10;  // Runter
    else              return 0;
}

Liest die analogen X- und Y-Werte des Joysticks von CH1 und CH2. Gibt eine Ganzzahl zurück, die die Bewegungsrichtung anhand von Schwellwerten angibt.

void upper_tem_setting() {
    write_lcd(0,0, "Upper Adjust:");

    int change = get_joystick_value();

    if (change != 0 && change != lastJoystickChange) {
        upperTem += change;
        lastJoystickChange = change;
    }
    else if (change == 0) {
        lastJoystickChange = 0;
    }

    char str[6];
    snprintf(str, sizeof(str), "%d", upperTem);
    write_lcd(0,1, str);
    write_lcd(strlen(str),1, "            ");

    delay(100);
}

Ermöglicht dem Benutzer, den Hochtemperatur-Schwellenwert mit dem Joystick einzustellen. Verhindert wiederholte Änderungen, wenn die Richtung gehalten wird.

double temperature() {
    int raw = read_ADC(0);
    double Vr = 3.3 * ((double)raw / 1023.0);
    double Rt = 10000.0 * Vr / (3.3 - Vr);
    double tempK = 1.0 / ((log(Rt/10000.0)/3950.0) + 1.0/(273.15+25.0));
    return tempK - 273.15;
}

Liest den analogen Wert von CH0 (verbunden mit dem Thermistor). Verwendet die Steinhart–Hart-Gleichung, um die Temperatur in Grad Celsius zu berechnen.

void monitoring_temp() {
    char str[6];
    double cel = temperature();
    snprintf(str, sizeof(str), "%.2f", cel);
    write_lcd(0,0, "Temp: ");
    write_lcd(6,0, str);

    snprintf(str, sizeof(str), "%d", upperTem);
    write_lcd(0,1, "Upper: ");
    write_lcd(7,1, str);
    delay(100);

    if (cel >= upperTem) {
        digitalWrite(buzzPin, HIGH);
        digitalWrite(LedPin,  HIGH);
    } else {
        digitalWrite(buzzPin, LOW);
        digitalWrite(LedPin,  LOW);
    }
}

Liest kontinuierlich die aktuelle Temperatur und zeigt sie zusammen mit dem Schwellenwert an. Wenn die Temperatur den Schwellenwert überschreitet, werden Summer und LED aktiviert.

void setup_all() {
    fd = wiringPiI2CSetup(LCDAddr);
    lcd_init();
    if (wiringPiSetup() == -1 || wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
        printf("Setup failed!\n");
        return;
    }
    pinMode(Joy_BtnPin, INPUT);
    pullUpDnControl(Joy_BtnPin, PUD_UP);
    pinMode(buzzPin, OUTPUT);
    pinMode(LedPin,  OUTPUT);
}

Initialisiert LCD, SPI und die GPIO-Pins für Joystick-Taste, Summer und LED. Setzt außerdem einen Pull-up-Widerstand für die Joystick-Taste.

int main(void) {
    setup_all();

    int lastBtnState = HIGH;
    int stage = 0;

    while (1) {
        int curBtn = digitalRead(Joy_BtnPin);
        if (curBtn == HIGH && lastBtnState == LOW) {
            stage = (stage + 1) % 2;
            lastJoystickChange = 0;
            delay(100);
            lcd_clear();
        }
        lastBtnState = curBtn;

        if (stage == 1)
            upper_tem_setting();
        else
            monitoring_temp();
    }

    return 0;
}

Die Hauptschleife wechselt zwischen zwei Modi:

  1. Temperaturüberwachung.

  2. Einstellung des oberen Grenzwerts über den Joystick.

Der Moduswechsel erfolgt, wenn die Joystick-Taste losgelassen wird (Flanken-Trigger).