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!

2.2.2 Termistore (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

Così come la fotoresistenza può rilevare la luce, il termistore è un dispositivo elettronico sensibile alla temperatura che può essere utilizzato per realizzare funzioni di controllo della temperatura, come la realizzazione di un allarme termico.

Componenti necessari

In questo progetto sono necessari i seguenti componenti.

../_images/list2_2.2.2_thermistor.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

Termistore

ACQUISTA

MCP3008

-

Schema elettrico

Nome T-Board

fisico

WiringPi

BCM

SPICE0

pin24

10

8

SPIMOSI

pin19

12

10

SPIMISO

pin21

13

9

SPISCLK

pin23

14

11

../_images/schematic_2.2.2_thermistor_mcp3008.png

Procedure sperimentali

Passo 1: Monta il circuito.

../_images/july24_2.2.2_thermistor_mcp3008.png

Passo 2: Vai alla cartella del codice.

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

Passo 3: Compila il codice.

gcc 2.2.2_Thermistor.c -o Thermistor -lwiringPi -lm

Nota

-lm serve per caricare la libreria matematica. Non ometterlo, altrimenti si genererà un errore.

Passo 4: Esegui il file eseguibile.

./Thermistor

Quando il codice è in esecuzione, il termistore rileva la temperatura ambiente, che verrà stampata sullo schermo una volta completato il calcolo del programma.

Nota

Se non funziona dopo l’esecuzione o compare un errore del tipo: "wiringPi.h: No such file or directory", fai riferimento a Installa e Controlla wiringPi.

Codice

#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <math.h>

#define SPI_CHANNEL 0  // CE0
#define SPI_SPEED   1000000  // 1MHz

int read_ADC(int channel) {
    if (channel < 0 || channel > 7) return -1;

    unsigned char buffer[3];
    buffer[0] = 1;  // Bit di avvio
    buffer[1] = (8 + channel) << 4;  // Modalità single-ended + canale
    buffer[2] = 0;

    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);

    int value = ((buffer[1] & 3) << 8) | buffer[2];
    return value;
}

int main(void) {
    int analogVal;
    double Vr, Rt, temp, cel, Fah;

    if (wiringPiSetup() == -1) {
        printf("setup wiringPi fallito!\n");
        return 1;
    }

    if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
        printf("setup SPI fallito!\n");
        return 1;
    }

    while (1) {
        analogVal = read_ADC(0);  // Legge dal CH0

        // MCP3008 è un ADC a 10 bit (0–1023)
        Vr = 3.3 * analogVal / 1023.0;  // Si assume Vref = 3.3V
        Rt = 10000.0 * Vr / (3.3 - Vr); // Partitore di tensione, resistenza 10kΩ
        temp = 1 / ((log(Rt / 10000.0) / 3950.0) + (1 / (273.15 + 25.0)));
        cel = temp - 273.15;
        Fah = cel * 1.8 + 32;

        printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);
        delay(1000);
    }

    return 0;
}

Spiegazione del codice

#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <math.h>

Questi header file includono le librerie per il controllo GPIO (wiringPi.h), la comunicazione SPI (wiringPiSPI.h), le operazioni di I/O standard (stdio.h) e le funzioni matematiche (math.h) in C.

#define SPI_CHANNEL 0
#define SPI_SPEED   1000000

Definisce le costanti per il canale SPI e la velocità di comunicazione SPI. Qui viene utilizzato il canale SPI 0 (CE0) e una velocità di clock di 1 MHz.

int read_ADC(int channel)

Questa funzione legge dati analogici da un canale specifico dell’ADC MCP3008.

buffer[0] = 1;
buffer[1] = (8 + channel) << 4;
buffer[2] = 0;

Queste righe formattano il comando SPI in base al protocollo MCP3008: un bit di avvio, la configurazione per la modalità single-ended e il numero di canale.

wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);

Trasferisce il comando SPI e riceve i dati ADC a 10 bit dal MCP3008.

int value = ((buffer[1] & 3) << 8) | buffer[2];

Estrae e combina il risultato ADC a 10 bit dal buffer SPI ricevuto.

if (wiringPiSetup() == -1) { ... }
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { ... }

Queste righe inizializzano WiringPi e configurano l’SPI. Se l’inizializzazione fallisce, il programma termina.

analogVal = read_ADC(0);

Legge il segnale analogico dal canale 0 del MCP3008, dove è collegato il partitore di tensione con il termistore.

Vr = 3.3 * analogVal / 1023.0;

Converte il valore digitale dell’ADC in tensione analogica. L’intervallo dell’ADC è 0–1023 con tensione di riferimento di 3,3V.

Rt = 10000.0 * Vr / (3.3 - Vr);

Calcola la resistenza del termistore usando la formula del partitore di tensione. Si assume una resistenza in serie di 10kΩ.

temp = 1 / ((log(Rt / 10000.0) / 3950.0) + (1 / (273.15 + 25.0)));

Utilizza l’equazione del parametro B per convertire la resistenza del termistore in temperatura in Kelvin.

T(K) = 1 / [ln(Rt/R₀)/B + 1/T₀], dove - R₀ = 10kΩ - B = 3950 - T₀ = 25°C = 298,15K

cel = temp - 273.15;

Converte la temperatura da Kelvin a gradi Celsius.

Fah = cel * 1.8 + 32;

Converte la temperatura da gradi Celsius a gradi Fahrenheit.

printf("Celsius: %.2f C  Fahrenheit: %.2f F\n", cel, Fah);

Visualizza sul terminale la temperatura sia in gradi Celsius che in Fahrenheit con una precisione di due decimali.