.. nota::

    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
=============================================

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

   <run></run>

.. code-block:: 

    cd ~/raphael-kit/c/3.1.7/

**Passo 3**: Compila il codice.

.. raw:: html

   <run></run>

.. code-block:: 

    gcc 3.1.7_OverheatMonitor.c -lm -lwiringPi

**Passo 4**: Esegui il file eseguibile.

.. raw:: html

   <run></run>

.. 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