Nota

Ciao, benvenuto nella Community SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 con altri appassionati.

Perché unirsi?

  • Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Accedi in anticipo agli annunci dei nuovi prodotti e alle anteprime.

  • Sconti speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e giveaway: Partecipa a giveaway e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!

3.1.7 Monitor Surriscaldamento (MCP3008)

Nota

../_images/mcp3008_and_adc0834.jpg

A seconda della versione del tuo kit, identifica se hai ADC0834 o MCP3008 e procedi con la sezione corrispondente.

Introduzione

Potresti voler realizzare un dispositivo di monitoraggio del surriscaldamento applicabile a varie situazioni. Ad esempio, in una fabbrica, potremmo voler avere un allarme e lo spegnimento automatico della macchina quando c’è un surriscaldamento del circuito. In questo progetto utilizzeremo un termistore, un joystick, un buzzer, un LED e un display LCD per realizzare un dispositivo intelligente di monitoraggio della temperatura con soglia regolabile.

Componenti necessari

In questo progetto sono necessari i seguenti componenti.

../_images/list2_Overheat_Monitor.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTE

LINK DI ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

LED

ACQUISTA

Modulo Joystick

-

MCP3008

-

Transistor

ACQUISTA

I2C LCD1602

ACQUISTA

Termistore

ACQUISTA

Cicalino

-

Schema elettrico

Nome T-Board

fisico

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

Procedure sperimentali

Passo 1: Monta il circuito.

../_images/july24_3.1.8_overheat_monitor_mcp3008.png

Passo 2: Vai nella cartella del codice.

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

Passo 3: Compila il codice.

gcc 3.1.7_OverheatMonitor.c -lm -lwiringPi

Passo 4: Esegui il file compilato.

sudo ./a.out

Quando il codice è in esecuzione, la temperatura attuale e la soglia di alta temperatura 40 vengono visualizzate su I2C LCD1602. Se la temperatura corrente è superiore alla soglia, il buzzer e il LED vengono attivati per avvisarti.

Joystick: premendolo è possibile regolare la soglia di alta temperatura. Spostando il Joystick lungo l’asse X e Y è possibile aumentare o diminuire la soglia. Premendo di nuovo il Joystick si reimposta la soglia al valore iniziale.

Nota

  • Se viene visualizzato l’errore wiringPi.h: No such file or directory, fai riferimento a Installa e Controlla wiringPi.

  • Se appare l’errore Unable to open I2C device: No such file or directory, fai riferimento a Configurazione I²C per abilitare I2C e controllare i collegamenti.

  • Se il codice e il cablaggio sono corretti ma l’LCD non mostra nulla, regola il potenziometro sul retro per aumentare il contrasto.

Spiegazione del codice

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

Legge un valore analogico a 10 bit dal canale MCP3008 (CH0–CH7) utilizzando SPI e restituisce un intero da 0 a 1023.

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

    if (x > 900)      return 1;   // Destra
    else if (x < 100) return -1;  // Sinistra
    else if (y > 900) return -10; // Su
    else if (y < 100) return 10;  // Giù
    else              return 0;
}

Legge i valori analogici X e Y del joystick dai canali CH1 e CH2. Restituisce un numero intero che indica la direzione del movimento in base alle soglie.

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

Permette all’utente di regolare la soglia di temperatura utilizzando il joystick, evitando variazioni continue se la direzione viene mantenuta.

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

Legge il valore analogico dal CH0 collegato al termistore. Utilizza l’equazione di Steinhart–Hart per calcolare la temperatura in gradi Celsius.

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

Legge continuamente la temperatura corrente e la visualizza insieme alla soglia. Se la temperatura supera la soglia, vengono attivati buzzer e LED.

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

Inizializza l’LCD, SPI, i pin GPIO per il pulsante del joystick, buzzer e LED. Imposta anche la resistenza di pull-up per il pulsante del 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;
}

Il ciclo principale alterna due modalità:

  1. Monitoraggio della temperatura.

  2. Regolazione del limite superiore tramite joystick.

La modalità cambia quando il pulsante del joystick viene rilasciato (trigger sul fronte di salita).