• 1
  • info@lungolagocapodimonte.it

    Realizzazione di una stazione meteo con Arduino Uno o Duemilanove ( Sensore Temperatura TMP102 )

    Realizzazione di una stazione meteo con Arduino Uno o Duemilanove, 1° Parte Utilizzo Sensore di Temperatura TMP102

     

     

     

     

     

     

     

    Realizzazione di una stazione meteo con Arduino Uno o Duemilanove

    Utilizzo Sensore di Temperatura TMP102

     

    La mia idea è realizzare una stazione meteo professionale al modico costo dei sensori.

    Come prima tappa ho pensato di programmare un sensore di temperatura che spiegheremo successivamente nei dettagli.

    Su internet ci sono moltissime guide su come trasformare il valore letto in temperatura, ma nessuna che rilevi le basse temperature ( sotto lo zero ).

    Questo mi ha fatto ragionare, e attraverso calcoli in bit, ho scritto da zero il codice per rilevare temperature positive e negative. Ovviamente è una mia interpretazione.

    Qui sotto troverete la spiegazione ed il codice per il funzionamento del TMP102; con una piccola lettura del datasheet sarà possibile rendere il codice utilizzabile anche per altri sensori.

     

     

    Come si conta in binario (cenni alla teoria)

     

    In questa immagine sono rappresentati 8 bit, ossia un byte.

     

     

     

     

     

     

     

     

     

     

     

     

     

    Il numero massimo rappresentabile è di 256 valori.

    Ovvero sarebbe la base (i numeri in binario hanno base 2) elevata al numero di cifre:

    la base è 2 e il numero di cifre che sono 8 ( in questi caso tutti 0 ma potrebbero essere insieme a valori di 1), di conseguenza 28 = 256.

    Iniziamo ad apprendere il metodo di lettura del sistema Binario.

    Prendiamo in considerazione 1 0 0 1 1 0 0 1

    I numeri 0 non hanno valore.

    I numeri 1 hanno un valore corrispondente al loro posto, ossia:

     

     

    Sommo i valori decimali che ottengo = 153 è il risultato della conversione.

     

    Descrizione TMP102

     

     

    Controllo della temperatura con il sensore TMP102.

    Il TMP102 e' un sensore digitale “I2C, TWI” con un’accuratezza fino a 0,5°C e con una risoluzione di 0.0625°C quando la temperatura è compresa tra -25 a +85. Invece un’accuratezza di 1°C nei valori compresi tra -40 a +125.

     

    Metodo di lettura della temperatura positiva e negativa

     

    Il sensore da me utilizzato utilizza 12 bit ovvero 212 = 4096 valori.

    Suppongo di voler esaminare il caso di 0,25°C.

    Leggo nel datasheet che se la temperatura rilevata è di 0,25°C, il sensore invia ad arduino un valore binario corrispondente.

     

     

    0 0 0 0 0 0 0 0 0 0 1 0 0

    Il valore decimale è:

     

     

     

     

    Sapendo che il sensore ha una sensibilità di 0,0625°C posso ricavare la temperatura semplicemente moltiplicando il valore decimale restituito dal sensore per la sensiblità:

    4*0,0625 = 0,25°C

    Questa è la temperatura rilevata, a questo punto la posso stampare a video.

     

    Lettura dei valori Negativi

     

    Così come scritto nel datasheet, per i valori negativi si fa il complemento del numero binario ottenuto dal sensore e si aggiunge 1 al risultato, cerco di semplificarvi i conti con un altro metodo.

    Provo con - 0,25°C

    • Leggo nel datasheet il valore corrispondente alla temperatura scelta, quindi il valore restituito dal sensore è:

    1 1 1 1  1 1 1 1  1 1 0 0

    il datasheet dice che la cifra più significativa, ossia quella all’estrema sinistra, detta anche MSB, se ha valore 1 la temperatura è negativa.

    Calcolo il valore decimale corrispondente all’elevazione

     

     

     

     

     

    So che 12 bit rappresentano 4096 valori, la mia lettura negativa ha un valore di 4092 che noi sottrarremo dalla massima capacità di 12bit:

    4096 - 4092 = 4

    4 * 0,0625 = 0,25°C

    Il trucco della distinzione tra valori + e - sta nella chiave di lettura del dato restituito dal sensore.

    Dal datasheet so che dei 12 bit ricevuti il MSB ci fa capire il segno della temperatura rilevata, in particolare

    0 = Temperatura Positiva

    1 = Temperatura Negativa

    Se il valore letto è > 2048 significa che sto leggendo una temperatura negativa, perchè anche se il bit di posto 11 fosse l’unico con il valore 1, allora il decimale restituito è almeno uguale a 2048.

     

     

     

     

    Se il valore è < 2048 la temperatura letta è positiva perchè MSB è 0 e quindi non può mai superare il valore di 2048.

     

     

     

     

     

    Collegamento TMP102 su Arduino Uno o Duemilanove

     

    Lo schema sottostante è il modo giusto per collegare il TMP102.

    V+ = La tensione di operatività del componente è di 3.3V ( la board di Arduino ha un pin apposito per l’erogazione di tale tensione ).

    SDA = Collegato al pin analogico “ A4 “

    SCL = Collegato al pin analogico “ A5 “

    ADD0 = Questo pin serve, ad arduino, per il riconoscimento del sensore. In questo caso va collegato a GND.

    GND = Collegato a massa ( Se avete già troppi fili attaccati funziona lo stesso anche senza! però se POSSIBILE, attaccarlo è sempre meglio ).

     

     

     

     

     

     

     

    Codice/Sketch TMP102

     

     

     

    {codecitation class="brush:cpp"}

    #include <Wire.h>  // Includo la libreria Wire.h

    byte ValoreSignificativo; // Creo una costante byte per il valore MSB

    byte ValoreNonSignificativo; // Creo una costante byte per il valore LSB

    int Valore; // Creo un intero

    byte NByte; // Creo una costante per contenere 2 Byte

    float A = 0.0625; // Creo variabile per contenere valori a virgola mobile.

    void setup()

    {

    Serial.begin(9600); // Inizializzo al baud 9600

    Wire.begin(); // Inizializzo Wire

    }

    void loop()

    {

    NByte = Wire.requestFrom(72, 2);   // Salvo 2 Byte dall’indirizzo 72 del Sensore nella variabile NByte

    if (NByte == 2) // Se i Byte prelevati sono uguali a 2 esegui....

    {

    ValoreSignificativo = Wire.receive(); // Salvo il valore MSB sulla variabile

    ValoreNonSignificativo = Wire.receive();  // Salvo il valore LSB sulla varabile

    Valore = ((ValoreSignificativo) << 4); // Shifto i valori a sinistra

    Valore |= (ValoreNonSignificativo >> 4); // Shifto i valori a destra, ritorna il valore dell'or effettuato bit a bit sui valori ritornati dalle 2 espressioni.

    if(Valore >= 2048) // Se il valore è maggiore o uguale di 2048 allora ho un numero negativo

    {

    Serial.print("-"); // Scrivo sulla seriale il simbolo Negativo

    Serial.println((4096 - Valore)*A); // Scrivo sulla seriale la temperatura negativa

    }

    else if  (Valore <= 2048) // Altrimenti se il Valore è minore o uguale di 2048 ho un numero positivo

    {

    Serial.print("+"); // Scrivo sulla seriale il simbolo positivo

    Serial.println(Valore*A);  // Scrivo sulla seriale la temperatura positiva

    }

    else // Altrimenti se il sensore non è connesso

    {

    Serial.println("Sensore non connesso"); // Scrivo sulla seriale “Sensore non Connesso”

    }

    }

    delay(200); // Aspetto 200 ms prima del nuovo ciclo

    } {/codecitation}

    Spero che la spiegazione sia stata chiara, per problemi, dubbi o informazioni non esitate a commentare.

    Aggiungi commento


    Codice di sicurezza
    Aggiorna