.. 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
=================================
.. 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
---------------
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
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.4/
**Passo 3:** Compila.
.. raw:: html
.. code-block::
gcc 3.1.4_SmartFan.c -lwiringPi -lm
**Passo 4:** Esegui il file eseguibile.
.. raw:: html
.. 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:`faq_c_nowork`.
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_thermistor_c_pi5` 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**.