Sei sulla pagina 1di 7

SENSORE DI TEMPERATURA - LM35

Datasheet:
http://www.google.it/url?sa=t&rct=j&q=lm35&source=web&cd=1&sqi=2&ved=0CDAQFjAA&url
=http%3A%2F%2Fwww.ti.com%2Flit%2Fds%2Fsymlink%2Flm35.pdf&ei=J56xUdXQBcfKPePf
gMgF&usg=AFQjCNEYRFMfIX0Uy2rBPHutCN0J7Z9Zvg&bvm=bv.47534661,d.ZWU&cad=rja
Laspetto di questo dispositivo simile a quello di un tipico transistor di bassa potenza. I
collegamenti sono molto semplici: i terminali esterni sono per lalimentazione, quello centrale
luscita. In particolare, guardando il dispositivo dal lato scritto con i terminali rivolti verso il basso
come indicato in figura:
il terminale a sinistra per lalimentazione positiva ( 5V sullArduino)
il terminale di destra per la massa (GND sullArduino)
il terminale centrale unuscita analogica in tensione, il cui valore corrisponde a 10mV per
ogni grado Celsius misurato (da collegare con uno degli ingressi analogici dellArduino, es.
A0 )

Utilizzo: basta leggere la tensione al pin di uscita e fare i calcoli! In pratica si moltiplica per 100 il
valore di tensione letto.
Attenzione: per misurare temperature negative i collegamenti cambiano (vedere datasheet)
altri link: http://arduino-info.wikispaces.com/LM35

SENSORE DI UMIDITA' - HIH-4030

Le informazioni utili per lutilizzo di questo sensore (con link al datasheet) si trovano sul sito:
https://www.sparkfun.com/products/9569
Lutilizzo di base molto semplice, come per LM 35, basta leggere il terminale di uscita analogica
per avere una tensione proporzionale allumidit relativa.
Tuttavia, la misura di umidit relativa influenzata dalla temperatura (il dispositivo calibrato a
25C) ; quindi opportuno compensare la lettura ottenuta impiegando le informazioni di
temperatura. Vedere per esempio:
http://bildr.org/2012/11/hih4030-arduino/
(in questo codice c qualche imprecisione sulle formule rispetto al datasheet, che comunque sono
una media: lideale sarebbe avere qualche lettura di tensione con umidit nota e ricavare la retta
interpolante)
float sensorRH = 161.29 * voltage / supplyVolt - 25.806;
float trueRH = sensorRH / (1.0546 - 0.00216 * degreesCelsius); //temperature
adjustment

Laccuratezza di +/- 3.5 % (interpolazione lineare) ; nel caso peggiore +/- 8 %


Sito del produttore: http://sensing.honeywell.com/index.php?ci_id=3108&la_id=1&pr_id=53969

SENSORE BAROMETRICO - MPL115A1

Le informazioni utili per lutilizzo di questo sensore (con link al datasheet) si trovano sul sito:
https://www.sparkfun.com/products/9721
L'uso di questo sensore un po pi complicato rispetto ai precedenti: in questo caso i dati letti dal
sensore sono trasferiti al microcontrollore attraverso un bus di comunicazione seriale chiamato SPI.
Per fortuna ci sono delle librerie software per Arduino che si occupano della gestione della
comunicazione SPI, di utilizzo abbastanza semplice, quindi basta sapere quali sono i messaggi da
scambiare (leggendo il datasheet)
Questo sensore ha anche una lettura ausiliaria di temperatura, che serve principalmente per
compensare la lettura della pressione (che dipende dalla temperatura)
Pu essere complicato interpretare i dati, che hanno formati numerici diversi, ma per questo scopo
c del codice gi pronto.
Per saperne di pi sul bus SPI: http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus

Sito del produttore: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MPL115A


Datasheet: http://cache.freescale.com/files/sensors/doc/data_sheet/MPL115A1.pdf?fpsp=1
Application Note AN3785 :
http://cache.freescale.com/files/sensors/doc/app_note/AN3785.pdf?fpsp=1

Esempio di codice in : https://forum.sparkfun.com/viewtopic.php?f=8&t=23965

Esempio (unione dei due precedenti esempi, con qualche modifica) :


/*
MPL115A1 sparkfun breakout baropressure meter
SDN
: pin 7
CSN
: pin 10
SDI/MOSI : pin 11
SDO/MISO : pin 12
SCK
: pin 13
*/
// the sensor communicates using SPI, so include the library:
#include <SPI.h>
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

PRESH
PRESL
TEMPH
TEMPL

0x80
0x82
0x84
0x86

//read pressure MSB


// read pressure LSB
// Read Temperature MSB
// REad Temperature LSB

A0MSB
0x88
//
A0LSB
0x8A
//
B1MSB
0x8C
B1LSB
0x8E
B2MSB
0x90
B2LSB
0x92
C12MSB
0x94
C12LSB
0x96

#define CONVERT

Read Coeff data A0 MSB


Read Coeff dara A0 LSB

0x24

#define chipSelectPin 10
#define shutDown 7
float
float
float
float

A0_;
B1_;
B2_;
C12_;

float supplyVolt =5;


float Temperatura=0.0;
void setup() {
Serial.begin(9600);
// start the SPI library:
SPI.begin();
// initalize the data ready and chip select pins:
pinMode(shutDown, OUTPUT);
digitalWrite(shutDown, HIGH);
pinMode(chipSelectPin, OUTPUT);
digitalWrite(chipSelectPin, HIGH);
delay (10);

// read registers that contain the chip-unique parameters to do


the math
unsigned int A0H = readRegister(A0MSB);
unsigned int A0L = readRegister(A0LSB);
Serial.print("AOH : ");
Serial.println(A0H);
Serial.print("AOL : ");
Serial.println(A0L);
A0_ = (A0H << 5) + (A0L >> 3) + (A0L & 0x07) / 8.0;
unsigned int B1H = readRegister(B1MSB);
unsigned int B1L = readRegister(B1LSB);
Serial.print("B1H : ");
Serial.println(B1H);
Serial.print("B1L : ");
Serial.println(B1L);
B1_ = ( ( ( (B1H & 0x1F) * 0x100)+B1L) / 8192.0) - 3 ;
unsigned int B2H = readRegister(B2MSB);
unsigned int B2L = readRegister(B2LSB);
Serial.print("B2H : ");
Serial.println(B2H);
Serial.print("B2L : ");
Serial.println(B2L);
B2_ = ( ( ( (B2H - 0x80) << 8) + B2L) / 16384.0 ) - 2 ;
unsigned int C12H = readRegister(C12MSB);
unsigned int C12L = readRegister(C12LSB);
Serial.print("C12H : ");
Serial.println(C12H);
Serial.print("C12L : ");
Serial.println(C12L);
C12_ = ( ( ( C12H * 0x100 ) + C12L) / 16777216.0 )

}
void loop() {
int sensorValue = analogRead(A0);
int sensorValue2 = analogRead(A1);
// Convert the analog reading (which goes from 0 - 1023) to a
voltage (0 - 5V):
float voltage = sensorValue * (5.0 / 1023.0);
float TempLM35= 100*sensorValue2 * (5.0 / 1023.0);
float pressione = baropPessure();
float sensorRH = 161.29 * voltage / supplyVolt - 25.806;
float trueRH = sensorRH / (1.0546 - 0.00216 * Temperatura);
//temperatureadj
// print out the value you read:
//Serial.println(voltage);
Serial.print("HR: ");
Serial.print(sensorRH);
Serial.print("% - pressione (mbar) : ");

Serial.print(10*pressione);
Serial.print(" Temp: ");
Serial.println(Temperatura);
Serial.print(" TempLM35: ");
Serial.println(TempLM35);
delay(3000);
}
//Read registers
unsigned int readRegister(byte thisRegister ) {
unsigned int result = 0;
// result to return
digitalWrite(chipSelectPin, LOW);
delay(10);
SPI.transfer(thisRegister);
result = SPI.transfer(0x00);
digitalWrite(chipSelectPin, HIGH);
return(result);
}
//read pressure
float baropPessure(){
digitalWrite(chipSelectPin, LOW);
delay(3);
SPI.transfer(0x24);
SPI.transfer(0x00);
digitalWrite(chipSelectPin, HIGH);
delay(3);
digitalWrite(chipSelectPin, LOW);
SPI.transfer(PRESH);
unsigned int presH = SPI.transfer(0x00);
delay(3);
SPI.transfer(PRESL);
unsigned int presL = SPI.transfer(0x00);
delay(3);
SPI.transfer(TEMPH);
unsigned int tempH = SPI.transfer(0x00);
delay(3);
SPI.transfer(TEMPL);
unsigned int tempL = SPI.transfer(0x00);
delay(3);
SPI.transfer(0x00);
delay(3);
digitalWrite(chipSelectPin, HIGH);
Serial.print("PRESH : ");
Serial.println(presH);
Serial.print("PRESL : ");
Serial.println(presL);
Serial.print("TEMPH : ");
Serial.println(tempH);
Serial.print("TEMPL : ");
Serial.println(tempL);

unsigned long press = ((presH *256) + presL)/64;


unsigned long temp = ((tempH *256) + tempL)/64;

Serial.print("TEMP : ");
Serial.println(temp);
float pressure = A0_+(B1_+C12_*temp)*press+B2_*temp;
float preskPa = pressure* (65.0/1023.0)+50.0;
// -5.35 counts per C, 472 counts is 25C
// corretta per 510 a 24C, -5.5 counts/C
Temperatura= 24.0 - (temp - 510.0) / (5.5);
Serial.print("TEMPERATURA : ");
Serial.println(Temperatura);
return(preskPa);
}