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
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.
È sicuramente conveniente acquistare un kit completo, ecco il link:
Nome |
ELEMENTI IN QUESTO KIT |
LINK |
|---|---|---|
Kit Raphael |
337 |
Puoi anche acquistarli separatamente dai link sottostanti.
INTRODUZIONE COMPONENTE |
LINK DI ACQUISTO |
|---|---|
- |
Schema elettrico
Nome T-Board |
fisico |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
Procedure sperimentali
Passo 1: Monta il circuito.
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.