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 }
© Copyright 2024 ExpyDoc