
.. 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.4 Ventilatore Intelligente
=================================

Introduzione
---------------

In questo corso, utilizzeremo motori, pulsanti e termistori per creare un 
ventilatore intelligente manuale e automatico, con velocità regolabile.

Componenti
------------

.. image:: img/list_Smart_Fan.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       Pin 15   3        22
GPIO5        Pin 29   21       5
GPIO6        Pin 31   22       6
GPIO13       Pin 33   23       13
============ ======== ======== ===

.. image:: img/Schematic_three_one4.png
    :width: 500
    :align: center

Procedure Sperimentali
--------------------------

**Passo 1:** Costruisci il circuito.

.. image:: img/image245.png
   :width: 800
   :align: center

.. note::
    Il modulo di alimentazione può essere collegato a una batteria da 9V con 
    la clip per batteria inclusa nel kit. Inserisci il jumper del modulo di 
    alimentazione nelle strisce da 5V della breadboard.

.. image:: img/image118.jpeg
   :width: 2.80694in
   :height: 0.94375in
   :align: center

**Per gli utenti del linguaggio C**
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Passo 2:** Accedi alla cartella del codice.

.. raw:: html

   <run></run>

.. code-block:: 

    cd ~/davinci-kit-for-raspberry-pi/c/3.1.4/

**Passo 3:** Compila.

.. raw:: html

   <run></run>

.. code-block:: 

    gcc 3.1.4_SmartFan.c -lwiringPi -lm

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

.. raw:: html

   <run></run>

.. code-block:: 

    sudo ./a.out

Una volta eseguito il codice, avvia il ventilatore premendo il pulsante. 
Ogni pressione aumenta o diminuisce la velocità di 1 livello. Sono disponibili 
**5** livelli di velocità: **0~4**. Se raggiungi il **4°** livello e premi di 
nuovo, il ventilatore si ferma con velocità pari a **0**.

.. note::

    Se non funziona dopo l'esecuzione o compare un messaggio di errore: \"wiringPi.h: No such file or directory\", consulta :ref:`Il codice C non funziona?`.

Quando la temperatura aumenta o diminuisce di più di 2℃, la velocità aumenta 
o diminuisce automaticamente di 1 livello.


**Spiegazione del Codice**

.. code-block:: c

    int temperture(){
        unsigned char analogVal;
        double Vr, Rt, temp, cel, Fah;
        analogVal = get_ADC_Result(0);
        Vr = 5 * (double)(analogVal) / 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;
        int t=cel;
        return t;
    }

La funzione temperture() converte i valori del termistore letti da ADC0834 
in valori di temperatura. Consulta :ref:`2.2.2 Termistore` per ulteriori dettagli.

.. code-block:: c

    int motor(int level){
        if(level==0){
            digitalWrite(MotorEnable,LOW);
            return 0;
        }
        if (level>=4){
            level =4;
        }
        digitalWrite(MotorEnable,HIGH);
        softPwmWrite(MotorPin1, level*25);
        return level;    
    }

Questa funzione controlla la velocità di rotazione del motore. L’intervallo 
di **level** va da **0 a 4** (il livello **0** arresta il motore). 
Ogni livello rappresenta un aumento del **25%** della velocità del vento.

.. code-block:: c

    int main(void)
    {
        setup();
        int currentState,lastState=0;
        int level = 0;
        int currentTemp,markTemp=0;
        while(1){
            currentState=digitalRead(BtnPin);
            currentTemp=temperture();
            if (currentTemp<=0){continue;}
            if (currentState==1&&lastState==0){
                level=(level+1)%5;
                markTemp=currentTemp;
                delay(500);
            }
            lastState=currentState;
            if (level!=0){
                if (currentTemp-markTemp<=-2){
                    level=level-1;
                    markTemp=currentTemp;
                }
                if (currentTemp-markTemp>=2){
                    level=level+1;
                    markTemp=currentTemp;
                }
            }
            level=motor(level);
        }
        return 0;
    }

La funzione **main()** contiene l’intero processo del programma, come segue:

1) Legge costantemente lo stato del pulsante e la temperatura corrente.

2) Ad ogni pressione, il livello aumenta di **+1** e contemporaneamente la 
   temperatura viene aggiornata. L’intervallo di **Level** è da **1 a 4**.

3) Quando il ventilatore è in funzione (livello diverso da **0**), la temperatura 
   viene monitorata. Una variazione di **±2℃** causa un aumento o diminuzione del 
   livello.

4) Il motore cambia velocità di rotazione in base al **Level**.

