Ok, stavo facendo un pò di confusione.
Quindi ho compreso che questi sensori si possono usare solo connettendoli ad un' unica linea e non su ingressi digitali diversi.
Per trovare l' indirizzo delle mie sonde ho trovato questo:
#include
// inizializza il bus onewire sulla porta n°10
OneWire ow(10);
void setup(void)
{
Serial.begin(9600); // inizializza la porta seriale a 9600
lookUpSensors(); // avvia la ricerca delle sonde di temperatura
}
void lookUpSensors()
{
byte address[8]; // questo array conterrà l'indirizzo delle sonde
int i=0;
byte ok = 0, tmp = 0;
// avvia la ricerca
Serial.println("--Ricerca avviata--");
while (ow.search(address))
{
tmp = 0;
// Se il primo byte dell'indirizzo è 0x10, si tratta di una sonda DS18S20
if (address[0] == 0x10)
{
Serial.println("A questo indirizzo si trova una DS18S20 : ");
tmp = 1; // ricerca andata a buon fine
}
else
{
// Se il primo byte dell'indirizzo è 0x28, si tratta di una sonda DS18B20
if (address[0] == 0x28)
{
Serial.println("A questo indirizzo si trova una DS18B20 : ");
tmp = 1; // ricerca andata a buon fine
}
}
// Se il flag tmp si trova a 1, mostro l'indirizzo
if (tmp == 1)
{
if (OneWire::crc8(address, 7) != address[7]) // faccio il controllo del CRC8
{
Serial.println(" (ma CRC8 non valido)");
}
else
{
// tutto ok, mostro l'indirizzo in formato esadecimale
for (i=0;i<8;i++)
{
Serial.print("0x");
if (address[i] < 9)
{
Serial.print("0");
}
Serial.print(address[i],HEX);
if (i<7)
{
Serial.print(",");
}
}
Serial.println("");
ok = 1;
}
} //end if tmp
}//end while
if (ok == 0)
{
Serial.println("Non ho trovato sonde di temperatura");
}
Serial.println("--Ricerca terminata--");
}
void loop(void)
{
// non faccio niente... ho fatto tutto nel setup!
}
Poi con l'indirizzo che ho trovato carico quest'altro programma:
#include <OneWire.h>
int RHAnalogValue; // Lettura in uscita dal sensore HIH-4030
float RH; // Valore di Umidità Relativa espresso in percentuale
float T; // Valore di temperatura in °C dalla sonda DS18S20
#define RH_SENSOR 0 // Sensore umidità collegato su porta analogica n°0
OneWire ONE_WIRE_BUS(10); // Bus One-Wire (sonda DS18S20) sul pin 10
// Indirizzo della sonda DS18S20
// Nota: trova l'indirizzo della tua sonda col programma precedente e incollalo al posto di questo
byte T_SENSOR[8] = {0x10, 0xB5, 0x68, 0x01, 0x02, 0x08, 0x00, 0x8E};
void setup()
{
Serial.begin(9600); // Inizializzo la porta seriale
}
void writeTimeToScratchpad(byte* address)
{
ONE_WIRE_BUS.reset(); // Resetto il bus
ONE_WIRE_BUS.select(address); // Seleziono la mia sonda DS18S20
ONE_WIRE_BUS.write(0x44,1); // Richiamo la funzione di conversione temperatura (44h)
// che posiziona il valore di temperatura nello scratchpad (comando Convert T)
delay(1000); // Attendo un secondo che la scrittura sia completa
}
void readTimeFromScratchpad(byte* address, byte* data)
{
ONE_WIRE_BUS.reset(); // Resetto il bus
ONE_WIRE_BUS.select(address); // Seleziono la mia sonda DS18S20
ONE_WIRE_BUS.write(0xBE); // Comando di lettura dello scratchpad (comando Read Scratchpad)
for (byte i=0;i<9;i++)
{
data[i] = ONE_WIRE_BUS.read(); // Leggo i 9 bytes che compongono lo scratchpad
}
}
float getTemperature(byte* address)
{
int tr;
byte data[12];
writeTimeToScratchpad(address); // Richiamo conversione temperatura
readTimeFromScratchpad(address,data); // effettuo la lettura dello Scratchpad
tr = data[0]; // Posiziono in TR il byte meno significativo
// il valore di temperatura è contenuto nel byte 0 e nel byte 1
// Il byte 1 contiene il segno
if (data[1] > 0x80) // Se il valore è >128 allora la temperatura è negativa
{
tr = !tr + 1; // Correzione per complemento a due
tr = tr * -1; // Ottengo il valore negativo
}
int cpc = data[7]; // Byte 7 dello scratchpad: COUNT PER °C (10h)
int cr = data[6]; // Byte 6 dello scratchpad: COUNT REMAIN (0Ch)
tr = tr >> 1; // Rilascio il bit 0 come specificato dal datasheet per avere una risoluzione > di 9bit
// Calcolo la temperatura secondo la formula fornita sul datasheet:
// TEMPERATURA = LETTURA - 0.25 + (COUNT PER °C - COUNT REMAIN)/(COUNT PER °C)
return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}
// Conversione da Fahrenheit a Celsius
float f2c(float val)
{
float aux = val - 32;
return (aux * 5 / 9);
}
// COnversione da Celsius a Fahrenheit
float c2f(float val)
{
float aux = (val * 9 / 5);
return (aux + 32);
}
void loop()
{
// Lettura temperatura (la DS18S20 fornisce il valore in °C)
T = getTemperature(T_SENSOR);
// Lettura del valore analogico dalla sonda di umidità
RHAnalogValue = analogRead(RH_SENSOR);
// La funzione analogRead restituisce un valore tra 0 e 1023
// proporzionale alla tensione applicata sul pin
// per cui il valore di tensione è dato da:
// Vout=(analogRead/1023)*5
// Il valore di umidità relativa è invece dato da:
// RH = (Vout-0.8)/0.031
// come già spiegato nell'articolo: http://www.settorezero.com/wordpress/sensore-di-umidita-honeywell-hih-4030/
RH = ((((float)RHAnalogValue/1023)*5)-0.8)/0.031;
// Dato che abbiamo anche il valore di temperatura, effettuiamo anche
// la compensazione per avere un valore di umidità relativo preciso
RH = RH/(1.0546-(0.00216*T));
// Stampo i risultati su terminale seriale
Serial.print("Umidita relativa: ");
Serial.print(RH,1); // Scrivo il valore di umidità con un decimale
Serial.println("%");
Serial.print("Temperatura: ");
Serial.print(T,1); // Scrivo il valore di temperatura con un decimale
Serial.println(" C");
// Attendo 10 secondi per ricominciare
delay(10000);
}
ripetendo i calcoli che effettua per ogni sensore che ho messo e per ogni indirizzo che ho trovato.
Ho solo un dubbio. L' idirizzo è sempre uguale?