.. note::
Ciao, benvenuto nella Community su Facebook per gli appassionati di SunFounder Raspberry Pi, Arduino e ESP32! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
**Perché unirti a noi?**
- **Supporto esperto**: Risolvi i problemi post-vendita e le 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 dei nuovi prodotti e anteprime esclusive.
- **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni e Giveaway Festivi**: Partecipa a concorsi e promozioni in occasione delle festività.
👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!
3.1.8 Monitor di Surriscaldamento
=================================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
A seconda della versione del kit, identifica se hai **ADC0834** o **MCP3008** e procedi con la sezione corrispondente.
Introduzione
--------------
Potresti voler realizzare un dispositivo di monitoraggio della temperatura
per rilevare il surriscaldamento in vari ambienti. Ad esempio, in fabbrica,
per attivare un allarme e spegnere automaticamente la macchina in caso di
surriscaldamento del circuito. In questa lezione, utilizzeremo un termistore,
un joystick, un cicalino, un LED e un LCD per creare un dispositivo intelligente
di monitoraggio della temperatura con soglia regolabile.
Componenti
-------------
.. image:: img/list_Overheat_Monitor.png
:align: center
.. image:: img/list_Overheat_Monitor2.png
:align: center
Schema di Collegamento
-------------------------
============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17 Pin 11 0 17
GPIO18 Pin 12 1 18
GPIO27 Pin 13 2 27
GPIO22 Pin15 3 22
GPIO23 Pin16 4 23
GPIO24 Pin18 5 24
SDA1 Pin 3
SCL1 Pin 5
============ ======== ======== ===
.. image:: img/Schematic_three_one8.png
:width: 700
:align: center
Procedure Sperimentali
----------------------
**Passo 1:** Costruisci il circuito.
.. image:: img/image258.png
:width: 800
**Passo 2:** Vai nella cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.8/
**Passo 3:** Compila il codice.
.. raw:: html
.. code-block::
gcc 3.1.8_OverheatMonitor.c -lwiringPi -lm
**Passo 4:** Esegui il file eseguibile.
.. raw:: html
.. code-block::
sudo ./a.out
Quando il codice è in esecuzione, la temperatura attuale e la soglia
di alta temperatura (**40**°C) vengono visualizzate su **I2C LCD1602**.
Se la temperatura attuale supera la soglia, il cicalino e il LED si
accendono per avvisare.
.. note::
Se non funziona dopo l'esecuzione o compare un messaggio di errore: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`.
**Joystick**: il joystick serve per regolare la soglia di alta temperatura.
Spostando il **Joystick** lungo gli assi X e Y si può aumentare o diminuire
la soglia. Premere il **Joystick** una volta per reimpostare la soglia al
valore iniziale.
**Spiegazione del Codice**
.. code-block:: c
int get_joystick_value(){
uchar x_val;
uchar y_val;
x_val = get_ADC_Result(1);
y_val = get_ADC_Result(2);
if (x_val > 200){
return 1;
}
else if(x_val < 50){
return -1;
}
else if(y_val > 200){
return -10;
}
else if(y_val < 50){
return 10;
}
else{
return 0;
}
}
Questa funzione legge i valori di X e Y. Se **X>200**, restituisce "**1**";
**X<50**, restituisce "**-1**"; **y>200**, restituisce "**-10**"; e **y<50**,
restituisce "**10**".
.. code-block:: c
void upper_tem_setting(){
write(0, 0, "Upper Adjust:");
int change = get_joystick_value();
upperTem = upperTem + change;
char str[6];
snprintf(str,3,"%d",upperTem);
write(0,1,str);
int len;
len = strlen(str);
write(len,1," ");
delay(100);
}
Questa funzione regola la soglia e la visualizza su **I2C LCD1602**.
.. code-block:: c
double temperature(){
unsigned char temp_value;
double Vr, Rt, temp, cel, Fah;
temp_value = get_ADC_Result(0);
Vr = 5 * (double)(temp_value) / 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;
return cel;
}
Legge il valore analogico di **CH0** (termistore) di **ADC0834** e lo
converte in temperatura.
.. code-block:: c
void monitoring_temp(){
char str[6];
double cel = temperature();
snprintf(str,6,"%.2f",cel);
write(0, 0, "Temp: ");
write(6, 0, str);
snprintf(str,3,"%d",upperTem);
write(0, 1, "Upper: ");
write(7, 1, str);
delay(100);
if(cel >= upperTem){
digitalWrite(buzzPin, HIGH);
digitalWrite(LedPin, HIGH);
}
else if(cel < upperTem){
digitalWrite(buzzPin, LOW);
digitalWrite(LedPin, LOW);
}
}
Quando il codice è in esecuzione, la temperatura attuale e la soglia
di alta temperatura (**40**°C) vengono visualizzate su **I2C LCD1602**.
Se la temperatura attuale supera la soglia, il cicalino e il LED si accendono
per avvisare.
.. code-block:: c
int main(void)
{
setup();
int lastState =1;
int stage=0;
while (1)
{
int currentState = digitalRead(Joy_BtnPin);
if(currentState==1 && lastState == 0){
stage=(stage+1)%2;
delay(100);
lcd_clear();
}
lastState=currentState;
if (stage==1){
upper_tem_setting();
}
else{
monitoring_temp();
}
}
return 0;
}
La funzione main() include l'intero processo del programma:
1) All’avvio del programma, il valore iniziale di **stage** è **0** e la
temperatura attuale insieme alla soglia di alta temperatura (**40**°C)
vengono visualizzate su **I2C LCD1602**. Se la temperatura supera la soglia,
il cicalino e il LED si attivano per avvisare.
2) Premendo il Joystick, **stage** diventa **1**, consentendo di regolare la
soglia di alta temperatura. Spostando il Joystick lungo gli assi X e Y si può
aumentare o diminuire la soglia corrente. Premere nuovamente il Joystick per
reimpostare la soglia al valore iniziale.