1 Aralık 2014 Pazartesi

DS18B20 Dijital Sıcaklık Sensörünün Arduino ile Kullanımı

DS18B20 Dijital Sıcaklık Sensörünün  Arduino ile Kullanımı



Çevreden veri toplamamızı gerektiren projelerimizde sıcaklık, nem, rüzgar, gürültü sensörleri gibi sensörlere ihtiyaç duyarız. Bu yazıda tek dijital pinle sıcaklık bilgisi sağlayan DS18B20 sıcaklık sensörünü anlatmaya çalışacağım. Yine yazının devamında birden fazla sensörden nasıl veri alınabileceği ile ilgili örnek bir program paylaşacağım.
Gerekli Malzemeler:
  1. 1 adet DS18B20 Dijital Sıcaklık Sensörü
  2. 1 adet 4.7k direnç
  3. Bağlantılar için kablo
Yukarıdaki resimdeki gibi bağlantıları (Tek sensör için bağlantılar bu şekilde, birden fazla sensörü de aynı şekilde farklı dijital pinlere bağlayabilirsiniz.) yaptıktan sonra aşağıdaki bağlantılardan OneWire kütüphanesini indirip yüklüyoruz. (Arduino>libraries klasörüne OneWire klasörünü kopyalıyoruz.) Tek sensör ve birden fazla sensör kullanılan 2 örnek program ile birlikte geliyor kütüphane. Bu 2 örnek programı da anlatmaya çalışacağım burada.
Tek Sensör için Örnek Program
// Arduinoturkiye.com DS18B20 Dijital Sıcaklık Sensörü Kullanımı
// Tek Sensör Örnek Programı
// Düzenleme: İsmail BUÇGÜN

#include <OneWire.h> // OneWire kütüphanesini ekliyoruz.

// Sıcaklık sensörünü bağladığımız dijital pini 2 olarak belirliyoruz.
int DS18S20_Pin = 2; 

// Sıcaklık Sensörü Giriş-Çıkışı
OneWire ds(DS18S20_Pin);  // 2. Dijital pinde.

void setup(void) {
  Serial.begin(9600); // Seri iletişimi başlatıyoruz.
}

void loop(void) {
  // temperature değişkenini sıcaklık değerini alma fonksiyonuna bağlıyoruz.
  float temperature = getTemp();
  // Sensörden gelen sıcaklık değerini Serial monitörde yazdırıyoruz.
  Serial.print("Sicaklik: ");
  Serial.println(temperature);
  // 1 saniye bekliyoruz. Monitörde saniyede 1 sıcaklık değeri yazmaya devam edecek.
  delay(1000);

}

// Aşağıdaki fonksiyon DS18B20 sıcaklık sensörümüzden gelen verileri
// Celcius cinsinden sıcaklık değerlerine çevirmek için kullanılıyor.
// Herhangi bir değişiklik yapmamız gerekmiyor.

float getTemp(){
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad

  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }

  ds.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;

}
Çoklu Sensör için Örnek Program
// Arduinoturkiye.com DS18B20 Dijital Sıcaklık Sensörü Kullanımı
// Çoklu Sensör Örnek Programı
// Düzenleme: İsmail BUÇGÜN

#include <OneWire.h> // OneWire kütüphanesini ekliyoruz.

// 1. Sıcaklık sensörünü bağladığımız dijital pini 2 olarak belirliyoruz.
int DS18S20_1_Pin = 2;
// 2. Sıcaklık sensörünü bağladığımız dijital pini 3 olarak belirliyoruz.
int DS18S20_2_Pin = 3;
// 3. Sıcaklık sensörünü bağladığımız dijital pini 4 olarak belirliyoruz.
int DS18S20_3_Pin = 4;

// Sıcaklık Sensörleri Giriş-Çıkışları
OneWire ds1(DS18S20_1_Pin); // 1. sensör 2. Dijital pinde.
OneWire ds2(DS18S20_2_Pin); // 2. sensör 3. Dijital pinde.
OneWire ds3(DS18S20_3_Pin); // 3. sensör 4. Dijital pinde.

void setup(void) {
Serial.begin(9600); // Seri iletişimi başlatıyoruz.
}

void loop(void) {
  // 3 sensör için 3 farklı sıcaklık değişkeni oluşturup fonksiyonla bağlıyoruz.
  float temperature1 = getTemp(ds1); // 1. sensörden gelen sıcaklık değeri
  float temperature2 = getTemp(ds2); // 2. sensörden gelen sıcaklık değeri
  float temperature3 = getTemp(ds3); // 3. sensörden gelen sıcaklık değeri

  // Sensörlerden gelen sıcaklık değerlerini serial monitörde yazdırıyoruz.
  Serial.print("1.Sensor:");
  Serial.print(temperature1);
  Serial.print(" | ");
  Serial.print("2.Sensor:");
  Serial.print(temperature2); 
  Serial.print(" | ");
  Serial.print("3.Sensor:");
  Serial.print(temperature3); 
  Serial.println(" | ");
  // 1 saniye bekliyoruz. Monitörde saniyede 1 sıcaklık değerleri yazmaya devam edecek.
  delay(1000); 
}

// Aşağıdaki fonksiyon DS18B20 sıcaklık sensörümüzden gelen verileri
// Celcius cinsinden sıcaklık değerlerine çevirmek için kullanılıyor.
// Herhangi bir değişiklik yapmamız gerekmiyor.

float getTemp(OneWire sensor){
//returns the temperature from one DS18S20 in DEG Celsius

byte data[12];
byte addr[8];

if ( !sensor.search(addr)) {
   //no more sensors on chain, reset search
   sensor.reset_search();
   return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
   Serial.println("CRC is not valid!");
   return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
   Serial.print("Device is not recognized");
   return -1000;
}

sensor.reset();
sensor.select(addr);
sensor.write(0x44,1); // start conversion, with parasite power on at the end

byte present = sensor.reset();
sensor.select(addr);  
sensor.write(0xBE); // Read Scratchpad

for (int i = 0; i < 9; i++) { // we need 9 bytes
  data[i] = sensor.read();
}

sensor.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;

return TemperatureSum;

}
±0.5°C ölçüm hassasiyetine sahip DS18B20 sıcaklık sensörü ve röle devresi kullanarak dijital termostat yapabilir ya da sensörden aldığımız sıcaklık verilerini SD kart içerisinde depolayarak veritabanı oluşturabilirsiniz.
İyi çalışmalar…
Kaynaklar:
Gerekli Olabilecek Bağlantılar:



Hiç yorum yok:

Yorum Gönder