.. note::
Ciao, benvenuto nella Community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme agli 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 suggerimenti e tutorial per migliorare le tue competenze.
- **Anteprime esclusive**: Ottieni accesso anticipato ai nuovi annunci di prodotti e alle anteprime.
- **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni festive e omaggi**: Partecipa a omaggi e promozioni speciali durante le festività.
👉 Sei pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!
.. _3.1.7_c:
3.1.7 Monitoraggio del Surriscaldamento
=============================================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
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
che si applichi a varie situazioni, ad esempio, in una fabbrica, per avere un
allarme e lo spegnimento automatico della macchina in caso di surriscaldamento
del circuito. In questo progetto, utilizzeremo un termistore, joystick, buzzer,
LED e LCD per creare un dispositivo intelligente di monitoraggio della temperatura
il cui limite massimo è regolabile.
Componenti necessari
------------------------------
In questo progetto, avremo bisogno dei seguenti componenti.
.. image:: ../img/list_Overheat_Monitor.png
:align: center
È sicuramente conveniente acquistare un kit completo, ecco il link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nome
- ELEMENTI IN QUESTO KIT
- LINK
* - Kit Raphael
- 337
- |link_Raphael_kit|
Puoi anche acquistare i componenti separatamente dai link qui sotto.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUZIONE COMPONENTI
- LINK DI ACQUISTO
* - :ref:`cpn_gpio_extension_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_led`
- |link_led_buy|
* - :ref:`cpn_joystick`
- \-
* - :ref:`cpn_adc0834`
- \-
* - :ref:`cpn_transistor`
- |link_transistor_buy|
* - :ref:`cpn_i2c_lcd`
- |link_i2clcd1602_buy|
* - :ref:`cpn_thermistor`
- |link_thermistor_buy|
* - :ref:`cpn_buzzer`
- \-
Schema elettrico
--------------------------
============ ======== ======== ===
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
:align: center
Procedura sperimentale
-----------------------------
**Passo 1:** Costruisci il circuito.
.. image:: ../img/image258.png
**Passo 2**: Vai nella cartella del codice.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/3.1.7/
**Passo 3**: Compila il codice.
.. raw:: html
.. code-block::
gcc 3.1.7_OverheatMonitor.c -lm -lwiringPi
**Passo 4**: Esegui il file eseguibile.
.. raw:: html
.. code-block::
sudo ./a.out
Quando il codice è in esecuzione, la temperatura corrente e la soglia di
temperatura alta **40** vengono visualizzate su **I2C LCD1602**. Se la
temperatura corrente supera la soglia, il buzzer e il LED iniziano ad avvisarti.
**Joystick** qui è per la regolazione della soglia di temperatura alta. Muovendo
il **Joystick** lungo l'asse X e Y puoi regolare (alzare o abbassare) la soglia
di temperatura alta corrente. Premi di nuovo il **Joystick** per ripristinare la
soglia al valore iniziale.
.. note::
* Se appare un errore come ``wiringPi.h: Nessun file o directory``, fai riferimento a :ref:`install_wiringpi`.
* Se appare l'errore ``Impossibile aprire il dispositivo I2C: Nessun file o directory``, devi fare riferimento a :ref:`i2c_config` per abilitare I2C e controllare se il cablaggio è corretto.
* Se il codice e il cablaggio sono corretti, ma l'LCD non mostra contenuti, puoi ruotare il potenziometro sul retro per aumentare il contrasto.
**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``, verrà restituito ``1``;
``X<50``, verrà restituito ``-1``; ``y>200``, verrà restituito ``-10``, e ``y<50``,
verrà restituito ``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 serve per regolare la soglia e visualizzarla 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;
}
Leggi il valore analogico di **CH0** (termistore) di **ADC0834** e convertilo
in valore di 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 corrente e la soglia di
temperatura alta **40** sono visualizzate su **I2C LCD1602**. Se la temperatura
corrente supera la soglia, il buzzer e il LED si attivano per avvisarti.
.. 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()`` contiene tutto il processo del programma come mostrato:
1) Quando il programma si avvia, il valore iniziale di **stage** è **0**, e la
temperatura corrente e la soglia di temperatura alta **40** vengono visualizzate
su **I2C LCD1602**. Se la temperatura corrente supera la soglia, il buzzer e il
LED si attivano per avvisarti.
2) Premi il Joystick e **stage** sarà **1** e potrai regolare la soglia di
temperatura alta. Muovendo il Joystick lungo l'asse X e Y puoi regolare
(alzare o abbassare) la soglia corrente. Premi di nuovo il Joystick per
ripristinare la soglia al valore iniziale.
Foto del fenomeno
-------------------------
.. image:: ../img/image259.jpeg
:align: center