Nota
Ciao, benvenuto nella Community di appassionati di Raspberry Pi, Arduino ed ESP32 di SunFounder su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad 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 consigli e tutorial per migliorare le tue competenze.
Anteprime esclusive: Accedi in anticipo agli annunci di nuovi prodotti e alle anteprime.
Sconti speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.
Promozioni e giveaway festivi: Partecipa a giveaway e promozioni festive.
👉 Pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!
3.1.8 Monitor di surriscaldamento (MCP3008)
Nota
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 fabbrica, se desideriamo avere un allarme e lo spegnimento automatico tempestivo della macchina in caso di surriscaldamento di un circuito. In questo progetto utilizzeremo un termistore, un joystick, un buzzer, un LED e un LCD per creare un dispositivo intelligente di monitoraggio della temperatura con soglia regolabile.
Componenti richiesti
In questo progetto, abbiamo bisogno dei seguenti componenti.
Schema elettrico
T-Board Name |
physical |
wiringPi |
BCM |
SPICE0 |
Pin 24 |
10 |
8 |
SPIMOSI |
Pin 19 |
12 |
10 |
SPIMISO |
Pin 21 |
13 |
9 |
SPISCLK |
Pin 23 |
14 |
11 |
GPIO22 |
Pin15 |
3 |
22 |
GPIO23 |
Pin16 |
4 |
23 |
GPIO24 |
Pin18 |
5 |
24 |
SDA1 |
Pin 3 |
||
SCL1 |
Pin 5 |
Procedura sperimentale
Passo 1: Monta 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 nella cartella del codice.
cd ~/davinci-kit-for-raspberry-pi/python-pi5
Passo 4: Esegui il file eseguibile.
sudo python3 3.1.8-2_OverheatMonitor_zero.py
Quando il codice viene eseguito, la temperatura corrente e la soglia di alta temperatura 40 vengono visualizzate su I2C LCD1602. Se la temperatura corrente è superiore alla soglia, il buzzer e il LED iniziano ad avvisarti.
Il Joystick qui serve per regolare la soglia di alta temperatura. Muovendo il Joystick lungo l’asse X o Y puoi aumentare o diminuire la soglia di temperatura. Premendo nuovamente il Joystick puoi ripristinare la soglia al valore iniziale.
Nota
Se ricevi l’errore
FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1', devi fare riferimento a Configurazione I²C per abilitare l’I2C.Se ricevi l’errore
ModuleNotFoundError: No module named 'smbus2', eseguisudo apt install python3-smbus2.Se appare l’errore
OSError: [Errno 121] Remote I/O error, significa che il modulo è cablato in modo errato o è danneggiato.Se il codice e i collegamenti sono corretti ma l’LCD non mostra contenuti, puoi ruotare il potenziometro sul retro per aumentare il contrasto.
Avvertimento
Se appare il messaggio di errore RuntimeError: Cannot determine SOC peripheral base address, fai riferimento a Se gpiozero non funziona.
Codice
Nota
Puoi Modificare/Reimpostare/Copiare/Eseguire/Fermare il codice qui sotto. Ma prima, devi andare nel percorso del codice sorgente come davinci-kit-for-raspberry-pi/python. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.
#!/usr/bin/env python3
import LCD1602
from gpiozero import LED, Buzzer, Button
import spidev
import time
import math
# Inizializza pulsante joystick, buzzer e LED
Joy_BtnPin = Button(22) # GPIO22, Pin15
buzzPin = Buzzer(23) # GPIO23, Pin16
ledPin = LED(24) # GPIO24, Pin18
# Imposta la soglia di temperatura iniziale
upperTem = 40
# Inizializza SPI per MCP3008 (Bus 0, CE0 -> GPIO8 / Pin24)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000 # 1 MHz
# Inizializza LCD (indirizzo I2C 0x27, retroilluminazione attiva)
LCD1602.init(0x27, 1)
def read_adc(channel):
"""
Legge il valore analogico da 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
def get_joystick_value():
"""
Legge i valori del joystick e restituisce un valore di modifica in base alla posizione.
"""
x_val = read_adc(1)
y_val = read_adc(2)
if x_val > 800:
return 1
elif x_val < 200:
return -1
elif y_val > 800:
return -10
elif y_val < 200:
return 10
else:
return 0
def upper_tem_setting():
"""
Regola e visualizza la soglia di temperatura massima sull’LCD.
"""
global upperTem
LCD1602.write(0, 0, 'Upper Adjust: ')
change = int(get_joystick_value())
upperTem += change
strUpperTem = str(upperTem)
LCD1602.write(0, 1, strUpperTem)
LCD1602.write(len(strUpperTem), 1, ' ')
time.sleep(0.1)
def temperature():
"""
Legge la temperatura corrente dal sensore e la restituisce in Celsius.
"""
analogVal = read_adc(0)
Vr = 3.3 * analogVal / 1023.0 # Tensione sul resistore fisso
if Vr == 0:
return 0 # Previene divisione per zero
Rt = 10000.0 * Vr / (3.3 - Vr) # Formula corretta: tensione sul termistore = (3.3 - Vr)
temp = 1 / (((math.log(Rt / 10000.0)) / 3950.0) + (1 / (273.15 + 25.0)))
Cel = temp - 273.15
return round(Cel, 2)
def monitoring_temp():
"""
Monitora e visualizza la temperatura corrente e la soglia.
Attiva buzzer e LED se la temperatura supera il limite massimo.
"""
global upperTem
Cel = temperature()
LCD1602.write(0, 0, 'Temp: ')
LCD1602.write(0, 1, 'Upper: ')
LCD1602.write(6, 0, str(Cel))
LCD1602.write(7, 1, str(upperTem))
time.sleep(0.1)
if Cel >= upperTem:
buzzPin.on()
ledPin.on()
else:
buzzPin.off()
ledPin.off()
# Ciclo principale
try:
lastState = 1
stage = 0
while True:
currentState = Joy_BtnPin.value
if currentState == 1 and lastState == 0:
stage = (stage + 1) % 2
time.sleep(0.1)
LCD1602.clear()
lastState = currentState
if stage == 1:
upper_tem_setting()
else:
monitoring_temp()
except KeyboardInterrupt:
LCD1602.clear()
spi.close()
Spiegazione del codice
Questa sezione importa le librerie necessarie.
LCD1602è per il display LCD via I2C,gpiozerogestisce LED, buzzer e pulsante,spidevè usato per comunicare con l’ADC MCP3008 e le librerie standardtimeemathsono utilizzate per ritardi e calcoli della temperatura.#!/usr/bin/env python3 import LCD1602 from gpiozero import LED, Buzzer, Button import spidev import time import math
Inizializza i componenti hardware collegati ai pin GPIO:
Button(22)è collegato al pulsante del joystick.Buzzer(23)eLED(24)sono indicatori di temperatura elevata.
Joy_BtnPin = Button(22) # GPIO22, Pin15 buzzPin = Buzzer(23) # GPIO23, Pin16 ledPin = LED(24) # GPIO24, Pin18
Imposta la soglia di temperatura predefinita e inizializza sia SPI per MCP3008 che il display LCD1602.
upperTem = 40 spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000 LCD1602.init(0x27, 1)
Questa funzione legge il valore analogico da un canale specificato (0–7) dell’MCP3008 usando il protocollo SPI e restituisce un valore a 10 bit.
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
La posizione del joystick viene valutata leggendo i canali 1 e 2 dell’MCP3008. In base alla direzione X o Y, vengono restituiti valori diversi per la regolazione della soglia.
def get_joystick_value(): x_val = read_adc(1) y_val = read_adc(2) if x_val > 800: return 1 elif x_val < 200: return -1 elif y_val > 800: return -10 elif y_val < 200: return 10 else: return 0
Regola la soglia di temperatura massima usando il joystick. Visualizza la soglia corrente sull’LCD e mantiene la formattazione pulita.
def upper_tem_setting(): global upperTem LCD1602.write(0, 0, 'Upper Adjust: ') change = int(get_joystick_value()) upperTem += change strUpperTem = str(upperTem) LCD1602.write(0, 1, strUpperTem) LCD1602.write(len(strUpperTem), 1, ' ') time.sleep(0.1)
Questa funzione legge il valore analogico dal canale 0 dell’MCP3008 (collegato a un termistore), calcola tensione, resistenza e infine la temperatura in Celsius utilizzando l’approssimazione di Steinhart–Hart.
def temperature(): """ Legge la temperatura corrente dal sensore e la restituisce in Celsius. """ analogVal = read_adc(0) Vr = 3.3 * analogVal / 1023.0 # Tensione sul resistore fisso if Vr == 0: return 0 # Previene divisione per zero Rt = 10000.0 * Vr / (3.3 - Vr) # Formula corretta: tensione sul termistore = (3.3 - Vr) temp = 1 / (((math.log(Rt / 10000.0)) / 3950.0) + (1 / (273.15 + 25.0))) Cel = temp - 273.15 return round(Cel, 2)
Legge continuamente la temperatura corrente, la confronta con la soglia e visualizza entrambe sull’LCD. Se la temperatura supera la soglia, buzzer e LED vengono attivati.
def monitoring_temp(): global upperTem Cel = temperature() LCD1602.write(0, 0, 'Temp: ') LCD1602.write(0, 1, 'Upper: ') LCD1602.write(6, 0, str(Cel)) LCD1602.write(7, 1, str(upperTem)) time.sleep(0.1) if Cel >= upperTem: buzzPin.on() ledPin.on() else: buzzPin.off() ledPin.off()
Il ciclo principale alterna tra modalità di impostazione e modalità di monitoraggio usando il pulsante del joystick. Una pressione cambia la modalità. In modalità impostazione si regola la soglia; in modalità monitoraggio la temperatura viene verificata continuamente.
try: lastState = 1 stage = 0 while True: currentState = Joy_BtnPin.value if currentState == 1 and lastState == 0: stage = (stage + 1) % 2 time.sleep(0.1) LCD1602.clear() lastState = currentState if stage == 1: upper_tem_setting() else: monitoring_temp()
Garantisce che l’LCD venga svuotato e la comunicazione SPI venga chiusa correttamente quando il programma termina tramite interruzione da tastiera.
except KeyboardInterrupt: LCD1602.clear() spi.close()