.. note:: Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati. **Perché unirti?** - **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 suggerimenti e tutorial per migliorare le tue competenze. - **Anteprime esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime. - **Sconti speciali**: Goditi sconti esclusivi sui nostri prodotti più recenti. - **Promozioni festive e omaggi**: Partecipa a concorsi e promozioni festive. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi! .. _3.1.7_c_pi5: 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 creare un dispositivo di monitoraggio del surriscaldamento applicabile a diverse situazioni, ad esempio, in una fabbrica, se desideriamo avere un allarme e lo spegnimento automatico della macchina quando si verifica un surriscaldamento del circuito. In questo progetto, utilizzeremo un termistore, joystick, cicalino, LED e LCD per creare un dispositivo intelligente di monitoraggio della temperatura con soglia regolabile. Componenti necessari ------------------------------ Per questo progetto, abbiamo 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 acquistarli separatamente dai link sottostanti. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE COMPONENTE - LINK PER L'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 Procedure sperimentali ----------------------------- **Passo 1:** Costruisci il circuito. .. image:: ../img/image258.png **Passo 2**: Vai alla 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 viene eseguito, la temperatura corrente e la soglia di alta temperatura **40** vengono visualizzate su **I2C LCD1602**. Se la temperatura corrente è superiore alla soglia, il cicalino e il LED si attivano per avvisarti. **Joystick** viene utilizzato per regolare la soglia di alta temperatura. Muovendo il **Joystick** lungo l'asse X e Y puoi regolare (aumentare o diminuire) la soglia di temperatura massima. Premi di nuovo il **Joystick** per resettare la soglia al valore iniziale. .. note:: * Se compare il messaggio di errore ``wiringPi.h: No such file or directory``, consulta :ref:`install_wiringpi_pi5`. * Se compare l'errore ``Unable to open I2C device: No such file or directory``, consulta :ref:`i2c_config` per abilitare I2C e controllare se il cablaggio è corretto. * Se il codice e il cablaggio sono corretti ma l'LCD non visualizza alcun contenuto, puoi regolare 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 degli assi X e Y. Se ``X>200``, restituisce ``1``; se ``X<50``, restituisce ``-1``; se ``Y>200``, restituisce ``-10``; e se ``Y<50``, restituisce ``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; } Legge il valore analogico di **CH0** (termistore) di **ADC0834** e lo converte 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 viene eseguito, la temperatura corrente e la soglia di alta temperatura **40** vengono visualizzate su **I2C LCD1602**. Se la temperatura corrente è superiore alla soglia, il cicalino 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 l'intero processo del programma come segue: 1) Quando il programma inizia, il valore iniziale di **stage** è **0**, e la temperatura corrente e la soglia di alta temperatura **40** vengono visualizzate su **I2C LCD1602**. Se la temperatura corrente è superiore alla soglia, il cicalino e il LED si attivano per avvisarti. 2) Premendo il Joystick, **stage** diventerà **1** e potrai regolare la soglia di alta temperatura. Muovendo il Joystick lungo l'asse X e Y puoi regolare (aumentare o diminuire) la soglia corrente. Premendo di nuovo il Joystick, la soglia verrà resettata al valore iniziale. Immagine del fenomeno ------------------------- .. image:: ../img/image259.jpeg :align: center