Note

Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Approfondissez vos connaissances sur Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.

Pourquoi rejoindre ?

  • Support d’experts : Résolvez les problèmes après‑vente et les défis techniques avec l’aide de notre communauté et de notre équipe.

  • Apprendre et partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.

  • Aperçus exclusifs : Accédez en avant‑première aux annonces de nouveaux produits et aux aperçus.

  • Réductions spéciales : Profitez de réductions exclusives sur nos tout derniers produits.

  • Promotions et cadeaux festifs : Participez à des concours et promotions spéciales pendant les fêtes.

👉 Prêt à explorer et à créer avec nous ? Cliquez sur [Ici] et rejoignez‑nous dès aujourd’hui !

3.1.7 Moniteur de surchauffe (MCP3008)

Note

../_images/mcp3008_and_adc0834.jpg

Selon la version de votre kit, identifiez si vous disposez d’un ADC0834 ou d’un MCP3008 et suivez la section correspondante.

Introduction

Vous pouvez vouloir créer un dispositif de surveillance de surchauffe applicable à diverses situations, par ex. : dans une usine, pour déclencher une alarme et éteindre automatiquement la machine en cas de surchauffe d’un circuit. Dans ce projet, nous utiliserons une thermistance, un joystick, un buzzer, une LED et un écran LCD pour réaliser un dispositif intelligent de surveillance de la température dont le seuil est réglable.

Composants requis

Dans ce projet, nous avons besoin des composants suivants :

../_images/list2_Overheat_Monitor.png

Il est bien sûr pratique d’acheter un kit complet, voici le lien :

Nom

ÉLÉMENTS DANS CE KIT

LIEN

Kit Raphael

337

Raphael Kit

Vous pouvez également les acheter séparément via les liens ci‑dessous.

INTRODUCTION DU COMPOSANT

LIEN D’ACHAT

Carte d’extension GPIO

ACHETER

Plaque d’expérimentation (Breadboard)

ACHETER

Fils de Liaison

ACHETER

Résistance

ACHETER

LED

ACHETER

Module Joystick

-

MCP3008

-

Transistor

ACHETER

LCD1602 I2C

ACHETER

Thermistance

ACHETER

Buzzer

-

Schéma de câblage

Nom T‑Board

Physique

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_one8.png

Procédures expérimentales

Étape 1 : Construisez le circuit.

../_images/july24_3.1.8_overheat_monitor_mcp3008.png

Étape 2 : Accédez au dossier du code.

cd ~/raphael-kit/c/3.1.7-2/

Étape 3 : Compilez le code.

gcc 3.1.7_OverheatMonitor.c -lm -lwiringPi

Étape 4 : Exécutez l’exécutable.

sudo ./a.out

Pendant l’exécution du code, la température actuelle et le seuil de haute température 40 sont affichés sur l’écran I2C LCD1602. Si la température actuelle dépasse le seuil, le buzzer et la LED se déclenchent pour vous avertir.

Le joystick est utilisé ici pour ajuster le seuil de haute température. Déplacer le joystick sur l’axe X ou Y permet d’augmenter ou diminuer ce seuil. Appuyez à nouveau sur le joystick pour réinitialiser le seuil à sa valeur initiale.

Note

  • Si un message d’erreur wiringPi.h: No such file or directory s’affiche, veuillez vous référer à Installer et vérifier WiringPi.

  • Si vous obtenez l’erreur Unable to open I2C device: No such file or directory, vous devez vous référer à Configuration I²C pour activer I2C et vérifier le câblage.

  • Si le code et le câblage sont corrects mais que l’écran LCD ne s’affiche toujours pas, vous pouvez tourner le potentiomètre à l’arrière pour augmenter le contraste.

Explication du code

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];
}

Lit une valeur analogique 10 bits à partir du canal MCP3008 (CH0–CH7) via SPI et renvoie un entier entre 0 et 1023.

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

    if (x > 900)      return 1;   // Droite
    else if (x < 100) return -1;  // Gauche
    else if (y > 900) return -10; // Haut
    else if (y < 100) return 10;  // Bas
    else              return 0;
}

Lit les valeurs analogiques du joystick sur CH1 (X) et CH2 (Y). Retourne un entier indiquant la direction du mouvement selon les seuils.

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);
}

Permet à l’utilisateur d’ajuster le seuil de température maximale avec le joystick. Évite les changements répétés si la direction est maintenue.

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;
}

Lit la valeur analogique du canal CH0 connecté à la thermistance. Utilise l’équation de Steinhart–Hart pour calculer la température en °C.

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);
    }
}

Lit en continu la température actuelle et l’affiche avec le seuil. Si la température dépasse le seuil, le buzzer et la LED sont activés.

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);
}

Initialise l’écran LCD, le SPI, et configure les broches GPIO pour le bouton du joystick, le buzzer et la LED. Active également la résistance de tirage interne pour le bouton du joystick.

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;
}

La boucle principale bascule entre deux modes :

  1. Surveillance de la température.

  2. Réglage de la limite supérieure à l’aide du joystick.

Le changement de mode se fait lors du relâchement du bouton du joystick (détection de front montant).