Nota
Ciao, benvenuto nella Community Facebook di appassionati di SunFounder Raspberry Pi & Arduino & ESP32! 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: Ottieni l’accesso anticipato agli annunci di 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
Proprio come il fotoresistore può rilevare la luce, il termistore è un dispositivo elettronico sensibile alla temperatura che può essere utilizzato per realizzare funzioni di controllo della temperatura, come ad esempio un allarme di calore.
Componenti richiesti
In questo progetto, ci servono i seguenti componenti.
È sicuramente conveniente acquistare un kit completo, ecco il link:
Nome |
ARTICOLI IN QUESTO KIT |
LINK |
|---|---|---|
Raphael Kit |
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: Costruisci il circuito.
Passo 2: Configura l’interfaccia SPI e installa la libreria spidev (vedi Configurazione SPI per istruzioni dettagliate). Se hai già completato questi passaggi, puoi saltarli.
Passo 3: Vai alla cartella del codice.
cd ~/raphael-kit/python
Passo 4: Esegui il file eseguibile.
sudo python3 2.2.2-2_thermistor.py
Con il codice in esecuzione, il termistore rileva la temperatura ambiente che verrà stampata sullo schermo una volta completato il calcolo del programma.
Avvertimento
Se compare il messaggio di errore RuntimeError: Cannot determine SOC peripheral base address, fai riferimento a If gpiozero doesn’t work.
Codice
Nota
Puoi Modificare/Resettare/Copiare/Eseguire/Fermare il codice qui sotto.
Prima però devi andare nel percorso del codice sorgente come raphael-kit/python.
Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import spidev
import time
import math
import RPi.GPIO as GPIO
# Imposta la modalità GPIO
GPIO.setmode(GPIO.BCM)
# Inizializza SPI per MCP3008 (Bus 0, CE0)
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, Device 0 (CE0)
spi.max_speed_hz = 1000000 # 1 MHz
def read_adc(channel):
"""
Legge il valore analogico dal canale MCP3008 (0–7)
"""
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
try:
while True:
# Legge il valore analogico dal CH0 di MCP3008
analogVal = read_adc(0)
# Converte in tensione (supponendo un riferimento di 3,3V)
Vr = 3.3 * analogVal / 1023.0
# Calcola la resistenza del termistore (R2 nel partitore di tensione è 10kΩ)
Rt = 10000.0 * Vr / (3.3 - Vr)
# Calcolo Steinhart–Hart
tempK = 1.0 / (((math.log(Rt / 10000.0)) / 3950.0) + (1.0 / (273.15 + 25.0)))
# Converte in Celsius e Fahrenheit
Cel = tempK - 273.15
Fah = Cel * 1.8 + 32
# Stampa il risultato
print('Celsius: %.2f °C Fahrenheit: %.2f °F' % (Cel, Fah))
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
spi.close()
GPIO.cleanup()
Spiegazione del codice
Questa sezione importa le librerie richieste:
spidevper la comunicazione SPI con MCP3008timeper le funzionalità di ritardomathper le operazioni logaritmiche nella formula di temperatura Steinhart–HartRPi.GPIOper inizializzare e pulire i GPIO (incluso per completezza strutturale)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import spidev import time import math import RPi.GPIO as GPIO
Inizializza la modalità GPIO come BCM e configura l’interfaccia SPI sul bus 0 e dispositivo 0 (CE0), con una velocità di 1 MHz.
GPIO.setmode(GPIO.BCM) spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000
Definisce una funzione
read_adc(channel)per leggere valori analogici da un canale specifico MCP3008 (0–7). Invia un comando SPI di 3 byte e riceve un risultato analogico a 10 bit (0–1023).def read_adc(channel): if channel < 0 or channel > 7: return -1 adc = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((adc[1] & 0x03) << 8) | adc[2] return value
Ciclo principale: legge la tensione analogica da un termistore sul canale 0, la converte in resistenza, quindi usa l’equazione di Steinhart–Hart per stimare la temperatura in gradi Celsius e Fahrenheit. Gli aggiornamenti vengono stampati ogni 0,2 secondi.
try: while True: analogVal = read_adc(0) Vr = 3.3 * analogVal / 1023.0 Rt = 10000.0 * Vr / (3.3 - Vr) tempK = 1.0 / (((math.log(Rt / 10000.0)) / 3950.0) + (1.0 / (273.15 + 25.0))) Cel = tempK - 273.15 Fah = Cel * 1.8 + 32 print('Celsius: %.2f °C Fahrenheit: %.2f °F' % (Cel, Fah)) time.sleep(0.2)
Il blocco
finallygarantisce una chiusura corretta. Chiude l’interfaccia SPI ed esegue la pulizia dei GPIO per rilasciare tutte le risorse hardware.except KeyboardInterrupt: pass finally: spi.close() GPIO.cleanup()