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