.. 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.8 Monitor di Surriscaldamento ================================= .. 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 -------------- Potresti voler realizzare un dispositivo di monitoraggio della temperatura per rilevare il surriscaldamento in vari ambienti. Ad esempio, in fabbrica, per attivare un allarme e spegnere automaticamente la macchina in caso di surriscaldamento del circuito. In questa lezione, utilizzeremo un termistore, un joystick, un cicalino, un LED e un LCD per creare un dispositivo intelligente di monitoraggio della temperatura con soglia regolabile. Componenti ------------- .. image:: img/list_Overheat_Monitor.png :align: center .. image:: img/list_Overheat_Monitor2.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 Pin15 3 22 GPIO23 Pin16 4 23 GPIO24 Pin18 5 24 SDA1 Pin 3 SCL1 Pin 5 ============ ======== ======== === .. image:: img/Schematic_three_one8.png :width: 700 :align: center Procedure Sperimentali ---------------------- **Passo 1:** Costruisci il circuito. .. image:: img/image258.png :width: 800 **Passo 2:** Vai nella cartella del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/3.1.8/ **Passo 3:** Compila il codice. .. raw:: html .. code-block:: gcc 3.1.8_OverheatMonitor.c -lwiringPi -lm **Passo 4:** Esegui il file eseguibile. .. raw:: html .. code-block:: sudo ./a.out Quando il codice è in esecuzione, la temperatura attuale e la soglia di alta temperatura (**40**°C) vengono visualizzate su **I2C LCD1602**. Se la temperatura attuale supera la soglia, il cicalino e il LED si accendono per avvisare. .. 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`. **Joystick**: il joystick serve per regolare la soglia di alta temperatura. Spostando il **Joystick** lungo gli assi X e Y si può aumentare o diminuire la soglia. Premere il **Joystick** una volta per reimpostare la soglia al valore iniziale. **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**, restituisce "**1**"; **X<50**, restituisce "**-1**"; **y>200**, restituisce "**-10**"; e **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 regola la soglia e la visualizza 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 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 attuale e la soglia di alta temperatura (**40**°C) vengono visualizzate su **I2C LCD1602**. Se la temperatura attuale supera la soglia, il cicalino e il LED si accendono per avvisare. .. 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() include l'intero processo del programma: 1) All’avvio del programma, il valore iniziale di **stage** è **0** e la temperatura attuale insieme alla soglia di alta temperatura (**40**°C) vengono visualizzate su **I2C LCD1602**. Se la temperatura supera la soglia, il cicalino e il LED si attivano per avvisare. 2) Premendo il Joystick, **stage** diventa **1**, consentendo di regolare la soglia di alta temperatura. Spostando il Joystick lungo gli assi X e Y si può aumentare o diminuire la soglia corrente. Premere nuovamente il Joystick per reimpostare la soglia al valore iniziale.