Nota
Ciao, benvenuto nella community SunFounder per appassionati di Raspberry Pi, Arduino e ESP32 su Facebook! Approfondisci la tua conoscenza di Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
Perché unirti a noi?
Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.
Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.
Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.
Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni e omaggi: Partecipa a promozioni e omaggi speciali durante le festività.
👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi!
2.2.2 Termistore
Nota
A seconda della versione del kit, identifica se hai ADC0834 o MCP3008 e procedi con la sezione corrispondente.
Introduzione
Proprio come il fotoresistore può rilevare la luce, il termistore è un dispositivo elettronico sensibile alla temperatura che può essere utilizzato per funzioni di controllo della temperatura, come la realizzazione di un allarme termico.
Componenti
Principio
Un termistore è una resistenza sensibile al calore che mostra una variazione precisa e prevedibile della resistenza proporzionale a piccoli cambiamenti di temperatura. L’entità della variazione dipende dalla sua particolare composizione. I termistori appartengono al gruppo dei componenti passivi e, a differenza dei componenti attivi, non possono fornire amplificazione del segnale o guadagno di potenza in un circuito.
Il termistore è un elemento sensibile, esistono due tipi principali: con coefficiente di temperatura negativo (NTC) e con coefficiente di temperatura positivo (PTC), comunemente abbreviati come NTC e PTC. La resistenza del termistore NTC diminuisce all’aumentare della temperatura, mentre per il termistore PTC la resistenza aumenta. In questo esperimento utilizziamo un NTC.
Il principio è che la resistenza del termistore NTC varia con la temperatura dell’ambiente circostante, rilevando così la temperatura in tempo reale. Quando la temperatura aumenta, la resistenza del termistore diminuisce. I dati di tensione vengono quindi convertiti in valori digitali tramite un adattatore A/D. La temperatura in gradi Celsius o Fahrenheit viene quindi visualizzata tramite programmazione.
In questo esperimento, utilizziamo un termistore e una resistenza di pull-up da 10k. Ogni termistore ha una resistenza normale, qui pari a 10k ohm, misurata a 25 gradi Celsius.
Ecco la relazione tra resistenza e temperatura:
RT =RN expB(1/TK – 1/TN)
RT è la resistenza del termistore NTC alla temperatura TK.
RN è la resistenza del termistore NTC alla temperatura nominale TN. Qui, il valore numerico di RN è 10k.
TK è la temperatura in Kelvin, misurata in K. Qui, il valore numerico di TKè 273,15 + gradi Celsius.
TN è la temperatura nominale in Kelvin, misurata in K. Qui, il valore numerico di TN è 273,15 + 25.
E B(beta), la costante del materiale del termistore NTC, è anche chiamata indice di sensibilità termica e ha un valore numerico di 3950.
exp indica l’esponenziale, con il numero di base e, che è approssimativamente 2,7.
Converti questa formula TK= 1/(ln(RT/RN)/B + 1/TN) per ottenere la temperatura in Kelvin, sottraendo poi 273,15 per ottenere la temperatura in gradi Celsius.
Questa relazione è una formula empirica, accurata solo quando la temperatura e la resistenza sono entro un intervallo efficace.
Schema del Circuito
Procedure Sperimentali
Passo 1: Costruire il circuito.
Passo 2: Accedere alla cartella del codice.
cd ~/davinci-kit-for-raspberry-pi/c/2.2.2/
Passo 3: Compilare il codice.
gcc 2.2.2_Thermistor.c -lwiringPi -lm
Nota
-lm serve per caricare la libreria matematica. Non ometterlo, altrimenti si verificherà un errore.
Passo 4: Eseguire il file eseguibile.
sudo ./a.out
Dopo l’esecuzione del codice, il termistore rileverà la temperatura ambientale, che sarà visualizzata sullo schermo una volta terminato il calcolo del programma.
Nota
Se il programma non funziona dopo l’esecuzione o compare il messaggio di errore: "wiringPi.h: No such file or directory», fare riferimento a Il codice C non funziona?.
Codice
#include <wiringPi.h>
#include <stdio.h>
#include <math.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define ADC_CS 0
#define ADC_CLK 1
#define ADC_DIO 2
uchar get_ADC_Result(uint channel)
{
uchar i;
uchar dat1=0, dat2=0;
int sel = channel > 1 & 1;
int odd = channel & 1;
digitalWrite(ADC_CLK, 1);
delayMicroseconds(2);
digitalWrite(ADC_CLK, 0);
delayMicroseconds(2);
pinMode(ADC_DIO, OUTPUT);
digitalWrite(ADC_CS, 0);
// Bit di avvio
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Modalità a singolo terminale
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Bit dispari
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,odd); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Selezione
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,sel); delayMicroseconds(2);
digitalWrite(ADC_CLK,1);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
for(i=0;i<8;i++)
{
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
pinMode(ADC_DIO, INPUT);
dat1=dat1<<1 | digitalRead(ADC_DIO);
}
for(i=0;i<8;i++)
{
dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
}
digitalWrite(ADC_CS,1);
pinMode(ADC_DIO, OUTPUT);
return(dat1==dat2) ? dat1 : 0;
}
int main(void)
{
unsigned char analogVal;
double Vr, Rt, temp, cel, Fah;
if(wiringPiSetup() == -1){ // Se l'inizializzazione di wiring fallisce, stampa il messaggio sullo schermo
printf("setup wiringPi failed !");
return 1;
}
pinMode(ADC_CS, OUTPUT);
pinMode(ADC_CLK, OUTPUT);
while(1){
analogVal = get_ADC_Result(0);
Vr = 5 * (double)(analogVal) / 255;
Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
cel = temp - 273.15;
Fah = cel * 1.8 +32;
printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah);
delay(100);
}
return 0;
}
Spiegazione del Codice
#include <math.h>
Questa è una libreria numerica di C che dichiara un insieme di funzioni per calcolare operazioni e trasformazioni matematiche comuni.
analogVal = get_ADC_Result(0);
Questa funzione viene utilizzata per leggere il valore del termistore.
Vr = 5 * (double)(analogVal) / 255;
Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
cel = temp - 273.15;
Fah = cel * 1.8 +32;
printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah);
Questi calcoli convertono i valori del termistore in gradi Celsius.
Vr = 5 * (double)(analogVal) / 255;
Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
Queste due righe di codice calcolano la distribuzione della tensione in base al valore letto di analog per ottenere Rt (resistenza del termistore).
temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
Questo codice si riferisce all’inserimento di Rt nella formula TK=1/(ln(RT/RN)/B+1/TN) per ottenere la temperatura in Kelvin.
temp = temp - 273.15;
Converte la temperatura da Kelvin a gradi Celsius.
Fah = cel * 1.8 +32;
Converte la temperatura da gradi Celsius a Fahrenheit.
printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah);
Stampa sul display i valori in gradi Celsius, gradi Fahrenheit e le loro unità di misura.