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:

İsmail

Üniversite öğrencisi, Arduino meraklısı.

64 comments

  1. […] DS18B20 Dijital Sıcaklık Sensörünün Arduino ile Kullanımı 18 Ağustos 2012 // (0) yorum […]

  2. muhammet ali dedi ki:

    burdaki şemaya göre sensor çalışmadı…aşağıdaki bağlantıdaki şekle göre yapınca çalıştı…gnd ile 5 v kısadevre yaparak oldu..

    http://www.hobbytronics.co.uk/ds18b20-arduino

  3. Ömer Koman dedi ki:

    muhammed ben bu devreyi buradaki şekliyle kullanıyorum sorunsuz çalışıyor bir daha denermisin? dediğin gibi gnd ve +5v kısa devre ettiysen arduino komple çalışmaz ozaman. büyük ihtimal sensorun yönünü karıştırıyorsun ondan çalışmamıştır.

  4. muhammet ali dedi ki:

    abi senin dediğin gibi her yerdede ama dün çok uğraştım olmadı…ama verdiğim linkteki şekil ile denedim tak diye oldu..gnd ile 5 v kısa devre olarak sorunsuz çalışıyor…aldığımda su geçirmez olan sensor du..kılıfını söktüm sensore baktım bacaklarındakı kablo balı renklere..dediğim gibi sadece verdiğim linkteki şekilde bağlayınca çalışıyor..sizin kini tekrar denedim -1000 gibi saçma bir değer veriyor serial monitor..

  5. Ömer Koman dedi ki:

    ds18b20 3 bacaklı transistör gibi bir şeydir su geçirmez kılıfı filan olmaz sizinki başka bir sensor olabilir. sensorunuzun şuna benzemesi lazım https://www.sparkfun.com/products/245

  6. muhammet ali dedi ki:

    abi senin yolladığın linktekinin aynısı kılıfın içindeki..
    aldığım linki yolluyorum..
    http://www.aliexpress.com/item/5PCS-LOT-Waterproof-DS18b20-temperature-probe-temperature-sensor-Stainless-steel-package-100cm-wire/557650963.html

  7. Ömer Koman dedi ki:

    ilk verdiğin linkteki kod sensörü prazit power modunda kullanıyor önce 1sn ye yakın sensörü içinde şarj ediyor sonra okuma yapıyor verdiği kodda onu destekler. buradaki kod ve bağlantıyı yaparsan buradaki kod da çalışır. karıştırarark kullanma.

  8. Ahmet KAYA dedi ki:

    Ömer bey paylaşımınız için teşekkür ederim istifade ettim. Çok sensörlü kullanım mantığında hata var sayın hocam. oneWire ın çıkış mantığı mikrodenetleyicinin tek pinini kullanarak çok sayıda sensör ile haberleşerek diğer giriş çıkış pinlerini boşa çıkarmaktır. ds18b20 türevi sensörlerin imalatında kendine has 48 bitlik bir adres bilgisi vardır. başlangıçtaki CRC denetlemesi bunun için yapılır. hatta kaç adet CRC kodu olduğu başlangıçta belirlenir. daha sonra hangi adresteki veri okunmak isteniyorsa uygun kod yazılıyor. şu çok vaktim yok ama (Endüstriyel otomasyon Teknolojileri öğretmeniyim, okullar yeni açıldı yoğun bir tempo var) ilerleyen süreçte halledebilirsem çok sensörlü kullanımla ilgili bir örneği sizinle paylaşırım.
    Çalışmalarınızda başarılar.

    • Ömer Koman dedi ki:

      yazıyı yazan arkadaş yoğuluğundan yazıya cevap veremiyor kodları denemdim bir ara bu sensorden alıp denemeyi yapayım. hata varsa düzeltiriz. bilgi için teşekkürler…

  9. Çağdaş Kaya dedi ki:

    Merhaba öncelikle böylesi faydalı bir bilgi için (benim açımdan çok faydalı) çok teşekkür ederim. Aynı devreyi üniversitede proje ödevi olarak benim yapmam lazım ama aynı devreye ekran takmam lazım bunun için ne yapmam lazım yardımcı olurmusunuz ?

  10. Ömer Koman dedi ki:

    bu devrenin ekranlısı var sitede bakarsanız bulursunuz.

  11. Aytac Gul dedi ki:

    Bu kod DS18B20 icin mi DS18S20 icin mi ikisinin olcum değerlerinden geri döndürdügü sonuc farkli sanirim???

    • Ömer Koman dedi ki:

      ds18-s-20 farklı bir hesaplama yöntemi kullanıyor datasheete bakıp duzeltirsiniz. kutuphane 18-b-20 için

  12. tayfun dedi ki:

    elde edilen sicakli çevrimi 24.95 gibi değerler, acaba bu çözünürlüğü nasildüşrenbiliriz 24.9 yeterli bir birim .

  13. ibrahim dedi ki:

    merhaba;
    Öncelikle ilgili çalışmanız için teşekkür ederim. Program bende çalışmadı, birkaç sorum olacak müsaadenizle.
    1- Program DS18B20 için denmiş ancak kod içinde DS18S20 yazıyor acaba bu bir soruna sebebiyet verir mi?
    2- Muhammet bey’e katılıyorum. Devre bu şekilde kurulduğunda bende çalışmadı. Maxim’in datasheet’inden bakınca da pinlerde bir hata olduğu görülüyor. Sensörün isminin yazılı olduğu taraf yüzünüze dönükken sağ bacak toprak(GND) ancak sayfa başındaki şemada Vcc olarak gösterilmiş.
    Muhammet bey’in verdiği linkteki gibi devreyi düzenleyince çalıştı.
    Herkese iyi çalışmalar dilerim. Yazanın da ellerine sağlık

  14. Ömer Koman dedi ki:

    merhaba arkdaşlar,
    1) ds18-b-20 ile ds18-s-20 arasındaki farklar resmi sitelerinde var http://www.maximintegrated.com/en/app-notes/index.mvp/id/4377 kısaca en önemli fark 18-s-20 olanda data çıkışı 16 bit hesaplanıp 12 bit olarak sunulmasıdır, 18-b-20 de ise 9-10-11-12 bit olarak değiştirlebilmesidir. eğer bu çözünürlükleri kullanıyorsa program bu komutları kabul etse bile herzaman 12 bit lik çıktı verecektir. her iki sensore uyum isteniyorsa hezaman 12bit çözünürlükten gidip program içinde bunları daha düşük çözünürlüğe dönüştüğrmekte fayda var. ayrıca dönüşüm ve bit kaydırmalardada hesaplama farkları var yazıda bundan bahsedilmiş bakarsınız.

    2) yazının altında gerekli bağlantılar linkinde var ama hangi dataheete baktınız bilmiyorum yazıdaki resim resmi sensor sitesindeki DATASHEETLE TAM UYUMLUDUR http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf siz nerden baktıysanız bahsettiğiniz bağlantı şekline bir linkini verin ben de inceleyeyim.

    sensorun yazıları(duzgun yuzey) size baktığında bacak sıralaması GND-DATA-VDD(+) dir. ŞEMADA SORUN YOK.

  15. Elektrik dedi ki:

    Merhaba;

    DS18B20 üzeriden gelen sıcaklık bilgisini daha doğrusu one wire bus iletişimi Matlab ortamına nasıl aktarabilirim?

    Saygılarımla…

    • Ömer Koman dedi ki:

      matlab yazısı var sitede onun altında sorarsan matlabcı yazarımız bir şeyler söyler eminim…

      • Elektrik dedi ki:

        İlginiz için teşekkür ederim Ömer Bey. Arduino üzerinden gelen bir veriyi yani serial monitorden okuduğumuz değerleri real time olarak başka bir programa(örneğin matlab) nasıl aktarabileceğim konusunda bilginiz var mı?

        Saygılarımla…

  16. Ömer Koman dedi ki:

    seialmonitor aslında comm port üzerinden gelen verileri gösteren basit bir terminal programı. bilgisayardaki comm portları okuyabilen herhangi bir program buradan gelen verileri işleyebilir. matlab ı bilmiyorum commport okuyacak bir araüzü veya tanımı varsa okunabilmesi lazım. şu linke bir bakın http://forum.arduino.cc/index.php/topic,229143.0.html

    matlabı ne amaçla kullanıyorsunuz? arduinonun nasıl bir fonksiyonu olacak?

  17. Elektrik dedi ki:

    Ömer Bey Matlab’ı Arduino ile birlikte sürekli kullanmam gerekiyor. Bilgisayar üzerinden kontrol ve grafik çizimi için kullanıyorum. Sizin verdiğiniz linkteki gibi analog sensör okuma konusunda bir problem yaşamadım ancak ds18b20 gibi dijital çıkışlı sensörleri okuyamıyorum matlab üzerinden. Düşüncem şu Arduino üzerinden gelen sıcaklık bilgisini (dijital olarak gelen) serial monitorde gördüğüm gibi Matlab da görebilirsem sorun çözülmüş olacak. İnternette aradım ama çözüm bulamadım.
    Bildiğiniz hızlı tepki veren analog sıcaklık sensörü varsa onuda yazabilirseniz çok sevinirim.
    Saygılarımla…..

  18. Ömer Koman dedi ki:

    pt100 pt1000 gibi sensorler analog çalışır tepki süreleri hızlı oluyor onların, hassasiyet için iyi bir analog devre tasarlamak gerekebilir.

  19. erdem şen dedi ki:

    merhabalar ben kodu denemeye çalıştım fakat her derleme yaptığımda hata veriyor;
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp:85:24: error: WConstants.h: No such file or directory
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp: In constructor ‘OneWire::OneWire(uint8_t)’:
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp:93: error: ‘digitalPinToBitMask’ was not declared in this scope
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp:94: error: ‘digitalPinToPort’ was not declared in this scope
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp:94: error: ‘portInputRegister’ was not declared in this scope
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp: In member function ‘uint8_t OneWire::reset()’:
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp:127: error: ‘delayMicroseconds’ was not declared in this scope
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp:134: error: ‘delayMicroseconds’ was not declared in this scope
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp: In member function ‘void OneWire::write_bit(uint8_t)’:
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp:157: error: ‘delayMicroseconds’ was not declared in this scope
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp:165: error: ‘delayMicroseconds’ was not declared in this scope
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp: In member function ‘uint8_t OneWire::read_bit()’:
    C:\Users\PC\Documents\Arduino\libraries\OneWire\OneWire.cpp:185: error: ‘delayMicroseconds’ was not declared in this scope
    bu tarz hatalar alıyorum acaba çözümü nedir yardımcı olursanız çok sevinirim.

    • Ömer Koman dedi ki:

      yazıyı hiç okumamışınız ezbere bu işler olmaz ! onewrire kutuphanesi arduinoda yuklu gelmez şuradan http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip yuklameniz lazım. zipin içindekileri bilgisayarınızda C:\Users\PC\Documents\Arduino\libraries\ altına kopyalayın. yazıda zaten kutuphane nasıl kurulur yazıyor, yazının altında da ilgili dosyalar mevcut ama nedense bu kadar basit şeylere bile dikkat edemiyoruz.

  20. Erdi dedi ki:

    Merhabalar öncelikle bu işte çok yeniyim.Yukarıdaki kodları kullanarak sıcaklık değerlerini çok kolay şekilde serial monitörde gözlemleyebiliyorum. Benim yapmak istediğim şey bu sıcaklık değerlerine göre (if komutunu kullanarak) digital pin çıkışına 1 veya 0 göndererek röleyi kontrol edip bu şekilde de istediğim yükü kontrol etmek.Şöyle bir örnek vermem gerekirse elimde bulunan analog olarak çalışan toprak nem sensörüyle bu kontrölü;
    if(analogRead(5)>300) {
    Serial.println (“Su miktarı az”);
    digitalWrite (pompa, HIGH);
    delay(1000);} komutlarıyla çok rahat şekilde yapmaktayım.Aynı işlemi bu sıcaklık sensörü içinde “analogRead” yerine “digitalRead” kullanarak sıcaklık değerlerini istediğim gibi girerek yine if komutunu kullanarak röleyi kontrol etmek istiyorum fakat yapamıyorum derleyici bir hata vermiyor fakat upload ettiğimde sensörü ısıtsamda soğutsamda röle kapama yapmıyor.Nerede hata yapıyorum yardımcı olursanız sevinirim.Umarım mantıksız bir soru sormamısımdır şimdiden teşekkürler.

  21. Gökhan GÖL dedi ki:

    Merhaba, OnWire kütüphanesini indirip Libraries e kopyaladım. Fakat hep derlemede hata veriyor. Erdem Şen isimli arkadaşın hatasının aynısı. Kütüphane yüklemede hata olguğunu düşünüp belki 2 saat uğraştım ,otomatik yükle manuel yukle yok olmuyor.hep aynı hata…yardımcı olabilir misiniz

  22. serafettin dedi ki:

    elimde ardunio due var 7″ lcd dokunmatık ekrana görüntü vermek için ne yapmam lazım..sıcaklık sensöründen gelen bilgileri aktarmak için nasıl bi yazılım lazım . yardımcı olabilir misinz?

  23. SERAFETTİN dedi ki:

    Teşekkur ederim hocam. Bir sorum daha olacakta.4 sensörü tek direnç üzerinden bağladıgım da aldıgım veriler hep aynı oluyor.Hepsinin farklı göstermesi için ne yapmmam gerekli ? 0x44 ü 0xCC yaptım ama değişmedi.

  24. serafettin dedi ki:

    birde hocam her sensör için ayrı isim .
    1.sensör
    2.sensör
    3.sensör
    4.sensör
    gibi

    • Ömer Koman dedi ki:

      çoklu sensorle çalışmadım ama ben olsam sırayla ekleyerek kodumu geliştirirdim. genel olarak sensor kabloların mesafesi çok uzun olmamsı lazım. direnç değerlerii 4.7k ile dene olmazsa 3.3k ile dene gene olmazsa 2.2 k ile deneyin.

  25. füeem dedi ki:

    Merhaba ds18b20 yi arduino üzerinden programlayıp hc05 bluetooth modül ile sıcaklık bilgisini telefona göndermek istiyorum arduino programı nasıl olur ? Cevabınızı bekliyorum şimdiden teşekkürler

    • Ömer Koman dedi ki:

      önce yukarıdaki gibi kodu yaz yükle bağlantıları yap. serial monitorden sıcaklık değerlerini oku. bu noktaya geldiysen bluetooth modulu uno ya bağla ve telefondan bağlanmayı dene androidde bluetooth uzerınden haberleşecek bir yazılımın da olması gerekir. yada en kötü ihtimal bt uzerınde haberleşen bir terminal programı yuklemen lazım. en son aşamada okuduğun sıcaklık değerlerini bt modulden yollamaya kalıyor. foruma gel oradan sor yapan vardır daha çabuk ilerlersin.

  26. ömer mert dedi ki:

    ömer hocam ben 128×64 Graphic LCD ile yılan oyunu yapmaya ugraşıyorum joystick kontrollü ama joystick bir türlü çalıştıramadım işleme koyamadım yardımcı olursanız sevinirim kodları atsam size bi bakarmısınız acaba

  27. Sedat dedi ki:

    Merhabalar, vermiş olduğunuz kod ve bağlantı şekli ile sıcaklık değerlerini alabildim.

    Sormak istediğim bir soru var; şimdi ben istediğim ortam sıcaklığında lamba yakıp, lamba söndürmek istiyorum. Bunun için röle kullanmam yeterli olacaktır sanırım, fakat kod konusunda yardımınıza ihtiyacım var. İlginiz için teşekkür ederim.

  28. Sedat dedi ki:

    Merhaba Ömer bey, röle ile belli süre bekletiğimiz servo motor yüzünden üste kalan ve devamlı tekrarlanmasını istediğim kodlar çalışmıyor. Rölenin geri sayımı bittikten sonra devreye giriyor. Kod aşağıdaki gibi.

    void loop(void) {

    // Ortam ısısını denetel, 25 derecede sabit tut, başla.
    {
    float temperature = getTemp();

    Serial.print(“Sicaklik: “);
    Serial.println(temperature, 0);

    if (temperature <= 25)
    {
    digitalWrite(RELAY, HIGH);
    delay(500);

    }
    if (25 <= temperature)
    {
    digitalWrite(RELAY, LOW);
    delay(500);

    }

    }
    // Ortam ısısını denetel, 25 derecede sabit tut, bitti.

    // Kuluçka 45 derece sağa ve sola döndür, başla.
    digitalWrite(RELAY2, HIGH);

    for (angle = 60; angle 60; angle–) // 140-60 derece geri tarama
    {
    servo.write(angle);
    delay(90);
    }
    digitalWrite(RELAY2, LOW);
    delay(20000); // Bu süre tamamlanmadan yukarıkadi kodlar çalışmıyor.
    // Kuluçka 45 derece sağa ve sola döndür, bitti.

    }

    • Ömer Koman dedi ki:

      delay süresinde diğer adıma geçilmez evet ama bunu basit bir ifle geçebilirsiniz.
      mesela 20sn beklemek yerine 20 saniye dolduğunda bir işlemi yapın.

      delay(100);
      delaysay=delaysay+1;
      if(delaysay==200){digitalWrite(RELAY2, LOW);delaysay=0;} // 20000/100=200 20saniyede 200 tane 100ms ye var

      • Sedat dedi ki:

        Ömer Hocam verdiğiniz kodu her şekilde denedim, fakat sürekli hata alıyorum. Aldığım hata aşağıdaki gibidir.

        _5110_ekrani_isi_sensoru_ok.ino: In function ‘void servoKontrol()’:
        _5110_ekrani_isi_sensoru_ok.ino:83:3: error: ‘delaysay’ was not declared in this scope
        Derleme sırasında hata oluştu.

        Kodu aşağıdaki kodda olduğu gibi kullandım hocam.

        void servoKontrol(void)
        {

        digitalWrite(ROLE2, HIGH);

        for (angle = 60; angle 60; angle–) // 140-60 derece geri tarama
        {
        servo.write(angle);
        delay(90);
        }

        delay(100);
        delaysay = delaysay + 1;
        if (delaysay == 200) {
        digitalWrite(ROLE2, LOW);
        delaysay = 0;
        }

        }

        • Ömer Koman dedi ki:

          delaysay not declaret hatasi aliyorsunuz. programın başında değişken tanımlarının olduğu yere int delaysay; ekleyin.

        • Ömer Koman dedi ki:

          bu kod

          delay(100);
          delaysay = delaysay + 1;
          if (delaysay == 200) {
          digitalWrite(ROLE2, LOW);
          delaysay = 0;
          }

          sizin gecikme rutininizi çağırdığınız rutin içine yazmışınınz dolayısı ile bu rutini çağırdığınınzda burada takılı kalıyorsunuz. verdiğim gecikmeyi rutin dışında loop için olması gerekirdi.

          delay(100);
          delaysay = delaysay + 1;
          if (delaysay == 200) {
          servokontrol();
          delaysay = 0;
          }
          şeklinde olursa daha iyi olmaz mıydı? ilk yazdığınız kodda bu loop içindeydi daha sonra ayrı bir fonsiyona alınca işlemi gecikme mantığı bozulmuş oldu…

  29. Sedat dedi ki:

    Hocam ne yaptıysam olmuyor, istediğim gibi servo beklerken üst satırlar çalışmıyor.

    #include
    #include
    #include
    #define ROLE 5
    #define ROLE2 4

    Servo servo;
    LCD5110 myGLCD(8, 9, 10, 11, 12);
    extern uint8_t SmallFont[];
    extern uint8_t MediumNumbers[];
    extern uint8_t BigNumbers[];
    int delaysay = 0;
    int isi = 6;
    int servoPin = 3;
    int angle = 0;
    OneWire ds(isi);

    void setup()
    {

    servo.attach(servoPin);
    pinMode(6, INPUT);
    pinMode(ROLE, OUTPUT);
    pinMode(ROLE2, OUTPUT);
    pinMode(7, OUTPUT);
    digitalWrite(7, HIGH);
    myGLCD.InitLCD();
    myGLCD.setContrast(60);
    myGLCD.setFont(SmallFont);
    myGLCD.print(“SEDAT OKUTAN”, CENTER, 20);
    delay(5000);
    myGLCD.clrScr();
    }

    // Isı kontrol.

    void isiKontrol(void)
    {
    float isi = getTemp();

    {
    myGLCD.setFont(SmallFont);
    myGLCD.print(“SICAKLIK:”, 0, 0);
    myGLCD.printNumI(isi, 60, 0);
    myGLCD.print(“C”, 75, 0);
    // myGLCD.printNumF(float(isi)||3, 2, RIGHT, 0);
    //myGLCD.setFont(MediumNumbers);
    //myGLCD.printNumI(isi, 25, 20);
    }
    if (isi <= 25)
    {
    digitalWrite(ROLE, HIGH);
    delay(50);

    }
    if (25 <= isi)
    {
    digitalWrite(ROLE, LOW);
    delay(50);

    }
    }
    // Isı kontrol..

    // Servo kontrolü.

    /*void zamanKontrol()
    {
    delay(100);
    delaysay += 100;
    if (delaysay == 100)
    {
    digitalWrite(ROLE2, LOW);

    }
    else {
    digitalWrite(ROLE2, HIGH);
    }

    }
    */
    void servoKontrol()
    {
    //digitalWrite(ROLE2, HIGH);

    delay(100);
    delaysay = delaysay + 1;
    if (delaysay == 2000) {
    digitalWrite(ROLE2, HIGH);
    delaysay = 0;
    }

    for (angle = 60; angle 60; angle–) // 140-60 derece geri tarama
    {
    servo.write(angle);
    delay(90);
    }

    digitalWrite(ROLE2, LOW);
    //delay(2000);

    }
    // Servo kontrol..

    void loop()
    {

    isiKontrol();
    servoKontrol();
    //zamanKontrol();

    }

    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;

    }

  30. faruk dedi ki:

    ömer hocam iyi akşamlar . 128*64 grafik lcd kütüpanesini linkten
    ( https://db.tt/itk4CLwi ) indirdim fakat bir türlü örnekleri derliyemiyorum sürekli
    In file included from C:\Program Files (x86)\Arduino\libraries\glcd/glcd.h:38:0,
    from HelloWorld.pde:15:
    C:\Program Files (x86)\Arduino\libraries\glcd/fonts/SystemFont5x7.h:48:28: error: variable ‘System5x7’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
    static uint8_t System5x7[] PROGMEM = {
    ^
    C:\Program Files (x86)\Arduino\libraries\glcd/fonts/Arial14.h:55:27: error: variable ‘Arial_14’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
    static uint8_t Arial_14[] PROGMEM = {
    şeklinde devam eden hata alıyorum. forumda daha önce bu konuya cevap verilmiş fakat foruma ulaşılamıyor. acil yardımlarınızı bekliyorum.

  31. murat dedi ki:

    merhaba rkadaşlar
    forum kısmına ne oldu kaç gündür açılmıyor ?

    • Ömer Koman dedi ki:

      güncelleme yapılıyor açılacak kısa sure sonra, biraz daha beklemenizi rica edeceğiz…

  32. onur dedi ki:

    hocam void setup ve void loop’ dan sonraki parantez içinde ki “(void)” kullanımı neden?

    • Ömer Koman dedi ki:

      void loop(void) yerine void loop() da kullanabilirsiniz. (void) yazıldığında parametre yok anlamında düşünün.

  33. Emrah dedi ki:

    Merhaba Ömer Bey,
    ilgili sıcaklık sensörü ve servo motor ile program yazmaya çalışıyorum. servo.attach(..) komutu yokken sıcaklık sensörü istediğim gibi çalışıyor, ancak servo.attach komutunu kullandıktan sonra kod düzgün çalışmıyor, şöyle ki, düzgün değerler okurken sıklıkla -1000 görmeye başlıyorum. Serial.print ile baktığımda ise aşağıdaki adımda takıldığını gözlemliyorum. Bunun sebebi sizce ne olabilir?
    Teşekkürler
    if ( !sensor.search(addr)) {
    //no more sensors on chain, reset search
    sensor.reset_search();
    return -1000;
    }

  34. İsa dedi ki:

    Ömer bey ben dot matrix ve arduino ile saat yaptım.Acaba yukardaki sizin sıcaklık ölçen kodları kendi devremde nasıl eklemeliyim.Yani devremde ayrı bir display ekranda nereye kodlarım eKlemeliyim. Yani aynı arduino üzerinden yukardaki devreyi de nasıl çalıştırırım.

    • Ömer Koman dedi ki:

      dot matrix kullandığınıza gore vakit kaybetmeden ekranı devamlı tazeleme yapıyorsunuzdur, sensor çıktısınıda matrix ekrana sanki sensoru okumuş gibi sıcaklığıda yazın ve zamanlamaları once bir belirleyin, daha sonra kodunuzda gecikmeye sebeb olmayacak bir nokta tespit edip orada sensorden veriyi alıp matrixde gostereceksiniz. once yazıyı ve altındaki tartışmaları bir gozden gecirin ayrı bır yerde kodu ds18b20 kodunuçalıştırın bu kodunda çalıştıgından emin olduktan sonra bırleştirme yapacaksınız. kutuphaneyi ekleyip setup kısmını yapacaksınız sonra diğer donsum okuma kodlarını kendi programınıza ekleyeceksiniz…

  35. İss dedi ki:

    Ömer bey ilginiz için çok teşekkür ederim.Ben arduinonun acemisiyim.Ama dediklerinizi çok iyi anladım.Aynı matrix ekranda dereceyi de göstermek için dedikleriniz benim için önemli bilgiler oldu.Ama ben diyelimki matrixi çalıştırdığım arduinonun 2.digital çıkışına,matrixin ekranında değil de başka display ekranda da sıcaklığı göstermek için ne yapmalıyım?

    • Ömer Koman dedi ki:

      bağlayacağınız ekranı once tek başına takıp deneyın onun kodunu yazın testi bitsin daha sonra mevcut programınıza ekleyeceksiniz. diğer ekranı bağlayacak kadar pininiz kaldımıki o da ayrı konu.

  36. İsa dedi ki:

    Çok teşekkür ederim.Boşta pin çok var.Ahşap kasa içine yapıcam inşallah.Çok sağolun.

  37. Kemal dedi ki:

    Uno ile yapabilir miyiz

    • Ömer Koman dedi ki:

      zaten uno ile yapılmış bir proje yazıdaki resime bakmadınız mı üstünde kocaman uno yazıyor… elektronik projelerde once dikkatinizi geliştirmeniz lazım malzemenin üzerindeki bir çizgi işaretinin bile önemi vardır.

  38. gul dedi ki:

    iyi günler benim ekranımda getTemp was not declared hatası veriyor

    • Ömer Koman dedi ki:

      yazım hatası yapmış olabilirsiniz yada değişkeni eksik tanımlamışınız yada gerekli kutuphaneyı kurmamışınız bu kutuphanedeki getTemp fonkisyonunu bulamıyor compiler.

    • oktay oktay dedi ki:

      getTemp hatası bendede oluştu. Klasörlerin doğru eklendiğini kontrol ettim. ayrıca kodlar birebir yukardaki şekilde kopyaladım. Kontrol et dediğimde hiçbi sorun olmazken yükle dediğimde aşağıdaki şekilde hata alıyorum. ch340 cipli nano kullanıyorum.

      ayrıca harika ve referans bi site 🙂 başarılarınızın devamını dilerim.

      Arduino:1.6.13 (Windows 10), Kart:”Arduino Nano, ATmega328″

      C:\Users\admın\Documents\Arduino\ds18b20_sil\ds18b20_sil.ino: In function ‘void loop()’:

      ds18b20_sil:19: error: ‘getTemp’ was not declared in this scope

      exit status 1
      ‘getTemp’ was not declared in this scope

      This report would have more information with
      “Show verbose output during compilation”
      option enabled in File -> Preferences.

      • oktay oktay dedi ki:

        Dosya/Örnekler/OneWire/coklu_ds18b20 den seçilip yüklendiğinde sorunsuz olarak çalışıyo. Ama bu siteden kopyala yapıştır yapıldığı zaman “getTemp” hatası veriyor. işin kötüsü örneklerden alınan ve burdan kopyala/yapıştır yapılan metin metin karşılaştırma programlarında (WinMerge) karşılaştırıldığında hiçbir fark görünmuyor.

  39. Turgay Olgay dedi ki:

    Ömer bey
    Çalışmalarınızdan dolayı sizi kutlarım.

    Çoklu sensor bağlantılı kodu denediniz mi?
    Denediğinizde uyarıda bulunur musunuz.

    Saygılarımla

  40. Ömer Koman dedi ki:

    her sensoru ve her uygulamayı yapma ımkanımız olmayabılır ancak fikir verebılırız.
    ds18b20 onewire protokolu nu kullanır bu protokol bir hat uzerınden bır cok cıhazın haberleşmesi yapılabılır. hatta ornekde oldugu gıbı tek cıhaz varsa o cıhaza uygun kodu yollayıp cevap vermesı beklenır ama birden fazla sensor okunacaksa bu sefer sensor id si ie komut yollanır ve cevap beklenır. bu işlem için once discovery moda gecıp hatta baglı cıhazlarrın idleri ve ne ile ılgılı oldukları sorgulanır daha sonra bu id ile beraber komut yollanır.

    denemek istersenız şu kutuphane ve uygulamada 5 sensor okunmuş
    https://arduino-info.wikispaces.com/Brick-Temperature-DS18B20

    daha detaylı arama yapmak istiyorsanız googleda coık var şoyle aramayı deneyın
    https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=arduino%20multiple%20ds18b20

E-posta adresiniz gösterilmeyecek. Gerekli alanlar * ile işaretlidir.

*



Sosyal Ağlar