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