Nota
Ciao, benvenuto nella community SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
Perché unirti?
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 anteprima ai nuovi annunci di prodotto e alle anticipazioni.
Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni e giveaway festivi: Partecipa a concorsi a premi e promozioni durante le festività.
👉 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, verifica 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, per avere un allarme e lo spegnimento automatico della macchina in caso di surriscaldamento di un circuito. In questo progetto, useremo termistore, joystick, buzzer, LED e LCD per realizzare un dispositivo intelligente di monitoraggio della temperatura con soglia regolabile.
Componenti necessari
In questo progetto, ci servono i 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: Vai alla cartella del codice.
cd ~/davinci-kit-for-raspberry-pi/c/3.1.8-2/
Passo 3: Compila il codice.
gcc 3.1.8_OverheatMonitor.c -lm -lwiringPi
Passo 4: Esegui il file compilato.
sudo ./a.out
Quando il codice viene eseguito, la temperatura attuale e la soglia di alta temperatura 40 vengono visualizzate su I2C LCD1602. Se la temperatura corrente supera la soglia, il buzzer e il LED si attivano per avvisarti.
Il joystick serve per regolare la soglia di alta temperatura: muovendolo lungo l’asse X o Y, puoi aumentare o diminuire la soglia. Premendo nuovamente il joystick, la soglia viene reimpostata al valore iniziale.
Nota
Se appare l’errore
wiringPi.h: No such file or directory, fai riferimento a Installazione e verifica di WiringPi.Se ricevi
Unable to open I2C device: No such file or directory, consulta Configurazione I²C per abilitare l’I2C e controllare il cablaggio.Se il codice e il cablaggio sono corretti, ma l’LCD non mostra nulla, regola il potenziometro sul retro per aumentare il contrasto.
Spiegazione del codice
int read_ADC(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1;
buffer[1] = (8 + channel) << 4;
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
return ((buffer[1] & 0x03) << 8) | buffer[2];
}
Legge un valore analogico a 10 bit dal canale MCP3008 (CH0–CH7) tramite SPI e restituisce un intero da 0 a 1023.
int get_joystick_value() {
int x = read_ADC(1);
int y = read_ADC(2);
if (x > 900) return 1; // Destra
else if (x < 100) return -1; // Sinistra
else if (y > 900) return -10; // Su
else if (y < 100) return 10; // Giù
else return 0;
}
Legge i valori analogici X e Y del joystick dai canali CH1 e CH2. Restituisce un intero che indica la direzione di movimento in base alle soglie.
void upper_tem_setting() {
write_lcd(0,0, "Upper Adjust:");
int change = get_joystick_value();
if (change != 0 && change != lastJoystickChange) {
upperTem += change;
lastJoystickChange = change;
}
else if (change == 0) {
lastJoystickChange = 0;
}
char str[6];
snprintf(str, sizeof(str), "%d", upperTem);
write_lcd(0,1, str);
write_lcd(strlen(str),1, " ");
delay(100);
}
Permette all’utente di regolare la soglia di temperatura massima con il joystick, evitando modifiche ripetute se la direzione viene mantenuta.
double temperature() {
int raw = read_ADC(0);
double Vr = 3.3 * ((double)raw / 1023.0);
double Rt = 10000.0 * Vr / (3.3 - Vr);
double tempK = 1.0 / ((log(Rt/10000.0)/3950.0) + 1.0/(273.15+25.0));
return tempK - 273.15;
}
Legge il valore analogico dal CH0 collegato al termistore. Usa l’equazione di Steinhart–Hart per calcolare la temperatura in gradi Celsius.
void monitoring_temp() {
char str[6];
double cel = temperature();
snprintf(str, sizeof(str), "%.2f", cel);
write_lcd(0,0, "Temp: ");
write_lcd(6,0, str);
snprintf(str, sizeof(str), "%d", upperTem);
write_lcd(0,1, "Upper: ");
write_lcd(7,1, str);
delay(100);
if (cel >= upperTem) {
digitalWrite(buzzPin, HIGH);
digitalWrite(LedPin, HIGH);
} else {
digitalWrite(buzzPin, LOW);
digitalWrite(LedPin, LOW);
}
}
Legge continuamente la temperatura attuale e la visualizza insieme alla soglia. Se la temperatura supera la soglia, il buzzer e il LED si attivano.
void setup_all() {
fd = wiringPiI2CSetup(LCDAddr);
lcd_init();
if (wiringPiSetup() == -1 || wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("Setup failed!\n");
return;
}
pinMode(Joy_BtnPin, INPUT);
pullUpDnControl(Joy_BtnPin, PUD_UP);
pinMode(buzzPin, OUTPUT);
pinMode(LedPin, OUTPUT);
}
Inizializza LCD, SPI, GPIO per pulsante del joystick, buzzer e LED. Imposta anche la resistenza di pull-up per il pulsante del joystick.
int main(void) {
setup_all();
int lastBtnState = HIGH;
int stage = 0;
while (1) {
int curBtn = digitalRead(Joy_BtnPin);
if (curBtn == HIGH && lastBtnState == LOW) {
stage = (stage + 1) % 2;
lastJoystickChange = 0;
delay(100);
lcd_clear();
}
lastBtnState = curBtn;
if (stage == 1)
upper_tem_setting();
else
monitoring_temp();
}
return 0;
}
Il ciclo principale alterna tra due modalità:
Monitoraggio della temperatura.
Regolazione del limite superiore tramite joystick.
La modalità cambia quando il pulsante del joystick viene rilasciato (trigger sul fronte di salita).