qui - Gianni

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <OneWire.h>
byte G_addr[10][8]; //qui memorizzo fino a 10 indirizzi
byte G_Devices; // variabile usata per tenere traccia del numero di sensori
riconosciuti nel bus
OneWire ow(8); // inizializza il bus onewire sulla porta n°8 (se avete
collegato i sensori su un'altro pin dovete modificare qui)
float GetTemp(OneWire *,byte *);
void PrintAddress(byte *);
void lookUpSensors();
int CheckSensor(byte *);
void setup(void)
{
Serial.begin(9600);// inizializza la porta seriale a 9600
G_Devices=0;
// imposta a 0 il numero di sensori attualmente
riconosciuti
lookUpSensors(); // avvia la ricerca delle sonde di temperatura
}
void loop(void)
{
float temperatura; // uso questa variabile per tenere la lettura della
temperatura
for(int num=0;num<G_Devices;num++) // vado a leggere tutti i sensori
registrati
{
temperatura=GetTemp(&G_addr[num][0]); // leggo la temperatura
PrintAddress(G_addr[num]);
Serial.print(" -> ");
Serial.print(num+1);
Serial.print(" -> ");
Serial.println(temperatura);
}
delay(5000); // aspetto 5 secondi prima di fare una nuova misurazione
}
// FUNZIONE RICERCA SENSORI
void lookUpSensors(){
byte address[8]; // questo array conterrà l'indirizzo locale dei sensori
Serial.print("--Ricerca avviata--"); // avvia la ricerca e lo scrive sulla
porta seriale
while (ow.search(address)) // loop finchè trova nuovi dispositivi
{
// Se il primo byte dell'indirizzo è 0x10, si tratta di una sonda DS18S20
// il primo byte dell'indirizzo identifica il tipo di sensore
// se 0x10 è un DS18S20, se è 0x28 è un DS18B20 (notare la S e B)
if (address[0] == 0x10 || address[0] == 0x28)
{
if(CheckSensor(address)==1) //crc ok
{
Serial.println("xxxxx");
if (address[0] == 0x10) Serial.print("Found DS18S20 : "); // notare che la S
invece che la B
else if (address[0] == 0x28) Serial.print("Found DS18B20 : ");
PrintAddress(address);
for(int aa=0;aa<8;aa++) G_addr[G_Devices][aa]=address[aa]; // copia
l'indirizzo
G_Devices++; // incrementa il numero di devices memorizzati
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
}
}
}//end while
Serial.println("");
Serial.print("Numero sensori rilevato:");
Serial.print(G_Devices);
Serial.println("");
Serial.println("--Ricerca terminata--");
}// END lookUpSensors()
// FUNZIONE LEGGI TEMPERATURA
float GetTemp(byte * addr){
byte present = 0;
byte data[12];
int i;
byte address[8];
for(i=0;i<8;i++) address[i]=*(addr+i); //copia l'indirizzo nella stringa
locale
ow.reset();
ow.select(addr);
ow.write(0x44,1);
// start conversion, with parasite power on at the
end
delay(1000);
// maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ow.reset();
ow.select(addr);
ow.write(0xBE);
// Read Scratchpad
for ( i = 0; i < 9; i++) data[i] = ow.read();// we need 9 bytes
//Serial.print(data[i], HEX);
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
double result;
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000; // test most sig bit
if (SignBit) TReading = (TReading ^ 0xffff) + 1; // 2's comp // negative
Tc_100 = (6 * TReading) + TReading / 4;
6.25
Whole = Tc_100 / 100;
Fract = Tc_100 % 100;
// multiply by (100 * 0.0625) or
// separate off the whole and fractional portions
result = Whole;
result += ((double)Fract/100);
if(SignBit) result *= -1;
return result;
} // END GetTemp
void PrintAddress(byte * address)
{
int i;
for (i=0;i<8;i++)
119
120
121
122
123
124
125
126
127
128
{
if (address[i] < 9) Serial.print("0");
Serial.print(address[i],HEX);
if (i<7) Serial.print("-");
}
}
int CheckSensor(byte * address)
{
if (OneWire::crc8(address, 7) != *(address+7)) return(-1);// faccio il
controllo del CRC8, se fallito ritorno -1
129 else return(1); // cr8 OK, ritorno 1
130 }