I sensori di temperatura Onewire sono appunto dei sensori che si connettono ad 1 filo, o meglio 3 fili in quanto abbiamo:DS18S20-small

  • +5V
  • GND
  • SEGNALE

Per utilizzare con arduino questi sensori occorre però di caricare nel programma, non solo all'interno dello sketch, la libreria Onewire.zip.

Appena finito di scaricare il file non facciamo altro che aprire il file compresso ed a scaricarne il contenuto in "C:\Program Files (x86)\Arduino\libraries" (ovviamente l'indirizza varia a seconda di come avete installato arduino.

 

Nozioni base della libreria Onewire

 

OneWire myWire(pin)

Crea un oggetto OneWire che utilizza un Pin specifico. Anche se è possibile collegare diversi dispositivi 1 filo allo stesso pin, ma se si dispone di un numero elevato meglio suddividerli in gruppi più piccoli ed ognuno al proprio PIN che può aiutare a isolare i problemi di cablaggio. È possibile creare più oggetti OneWire, uno per ogni Pin.

myWire.search(addrArray)

Cercare il dispositivo successivo. Il addrArray è una matrice 8 byte. Se un dispositivo viene trovato, addrArray è riempito con l'indirizzo del dispositivo e viene restituito true. Se non si trovano più dispositivi, viene restituito false.

myWire.reset_search()

Inizia una nuova ricerca. Il prossimo uso di ricerca avrà inizio al primo dispositivo.

myWire.reset()

Resetta il bus 1-wire. Di solito questo è necessario prima di comunicare con qualsiasi dispositivo.

myWire.select(addrArray)

Selezionare un dispositivo in base al suo indirizzo. Dopo un reset, questo è necessario per scegliere quale dispositivo si intende utilizzare, e quindi tutte le comunicazioni sarà con quel dispositivo, fino a quando un altro reset.

myWire.skip()

Salta la selezione del dispositivo. Questo funziona solo se si dispone di un unico dispositivo, ma è possibile evitare la ricerca e utilizzare questo per accedere immediatamente il dispositivo.

myWire.write(num);

Scrive un byte

myWire.write(num, 1);

Scrive un byte, e lascia alimentato il bus 1 wire.

myWire.read()

Legge un byte.

myWire.crc8(dataArray, length)

Esegue e calcola il controllo CRC su una serie di dati.

 

 

 Esempio estrapolato dalla libreria Onewire

 

#include <OneWire.h>

/* DS18S20 Temperature chip i/o */

OneWire  ds(10);  // on pin 10

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  if ( !ds.search(addr)) {
    Serial.print("No more addresses.\n");
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("R=");
  for( i = 0; i < 8; i++) {
    Serial.print(addr[i], HEX);
    Serial.print(" ");
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n");
      return;
  }
  
  if ( addr[0] != 0x10) {
      Serial.print("Device is not a DS18S20 family device.\n");
      return;
  }

  // The DallasTemperature library can do all this work for you!

  ds.reset();
  ds.select(addr);
  ds.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 = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("P=");
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print( OneWire::crc8( data, 8), HEX);
  Serial.println();
}