DS18B20 Dijital Sıcaklık Sensörünün Arduino ile Kullanımı
İsmail // 18 Ağustos 2012 // 85 yorum // kategori: Arduino Eklentileri(Shield)Ç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 adet DS18B20 Dijital Sıcaklık Sensörü
- 1 adet 4.7k direnç
- 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:
- One Wire Digital Temperature. DS18B20 + Arduino
- Single wire digital temperature. DS18B20 + Arduino-Forum
Gerekli Olabilecek Bağlantılar:
Etiketler: arduino > Arduino ile Dijital Termostat > Arduino ile Sıcaklık Ölçümü > Arduino ve Sıcaklık Sensörü > Çoklu DS18B20 > Dijital Termostat > DS18B20 > DS18B20 Sıcaklık Sensörü > DS18B20 ve Arduino > OneWire > Sıcaklık Sensörü
[…] DS18B20 Dijital Sıcaklık Sensörünün Arduino ile Kullanımı 18 AÄŸustos 2012 // (0) yorum […]
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
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.
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..
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
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
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.
Ö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.
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…
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 ?
bu devrenin ekranlısı var sitede bakarsanız bulursunuz.
Bu kod DS18B20 icin mi DS18S20 icin mi ikisinin olcum değerlerinden geri döndürdügü sonuc farkli sanirim???
ds18-s-20 farklı bir hesaplama yöntemi kullanıyor datasheete bakıp duzeltirsiniz. kutuphane 18-b-20 için
elde edilen sicakli çevrimi 24.95 gibi değerler, acaba bu çözünürlüğü nasildüşrenbiliriz 24.9 yeterli bir birim .
http://arduino.cc/en/Serial/Print (biraz merak ve araştırma bekliyoruz kullanıcıdan)
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
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.
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…
matlab yazısı var sitede onun altında sorarsan matlabcı yazarımız bir ÅŸeyler söyler eminim…
İ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…
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?
Ö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…..
pt100 pt1000 gibi sensorler analog çalışır tepki süreleri hızlı oluyor onların, hassasiyet için iyi bir analog devre tasarlamak gerekebilir.
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.
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.
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.
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
şurada anlatmışım http://arduinoturkiye.com/ds18b20-dijital-sicaklik-sensorunun-arduino-ile-kullanimi/#comment-6306 şimdi kontrol ettim yukledim ekledim çalıştırdım sorunsuz çalışıyor. arduino programından çıkın. zipli dosyayı indirin içindeki OneWire klasörünü kulağından tutup olduğu gibi arduinonun yuklu olduğu yerde Libraries klasörüne kopyalın. daha sonra arduino ide yi çalıştırın file/exeamples altında OneWire görneiz lazım oradaki örneklerden herhangi birini açın compile edin çalışır !
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?
arduinoturkiye.com sitesinde sıcaklık sensörü yazısı var ayrıca baÅŸka bir yazıda c# ile arduino pc arasında veri iletimi anlatılıyor kablosuz isterseniz rf yazılarımız var ethernet isterseniz ethernet yazıları da mevcut. 7″ ekran ve dokunmatiÄŸi için google amcadan arayınca geliyor(araÅŸtırma kültürü bunu gerektiriyor) tr de pek bulamazsın tabiki. ayrıca lcd satın alırken arduino due ye de extradan uyumlu olmasına dikkat edeceksiniz. https://www.google.com.tr/search?q=arduibo+due+lcd7%22&ie=utf-8&oe=utf-8&gws_rd=cr&ei=NOWgVJnFD-H-ywPEl4HgCw#q=arduino+due+lcd+7%22&spell=1
lcd ebay linki http://www.ebay.com/itm/7-7-0-inch-TFT-LCD-module-Font-IC-800×480-SSD1963-arduino-DUE-MEGA2560-3-5-4-3-/111008432389
aynı lcd nin arduino due eklentisi http://www.ebay.com/itm/TFT-SD-Shield-for-Arduino-DUE-TFT-LCD-Module-SD-Card-Adapter-2-8-3-2-inch-Mega-/121057447668?
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.
birde hocam her sensör için ayrı isim .
1.sensör
2.sensör
3.sensör
4.sensör
gibi
ç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.
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
ö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.
ö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
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.
şu programı inceleyin gerekli düzenlemeyi yaparsınız http://arduinoturkiye.com/arduino-ile-role-kontrolu/
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.
}
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
Ö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;
}
}
delaysay not declaret hatasi aliyorsunuz. programın başında değişken tanımlarının olduğu yere int delaysay; ekleyin.
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…
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;
}
ö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.
merhaba rkadaÅŸlar
forum kısmına ne oldu kaç gündür açılmıyor ?
güncelleme yapılıyor açılacak kısa sure sonra, biraz daha beklemenizi rica edeceÄŸiz…
hocam void setup ve void loop’ dan sonraki parantez içinde ki “(void)” kullanımı neden?
void loop(void) yerine void loop() da kullanabilirsiniz. (void) yazıldığında parametre yok anlamında düşünün.
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;
}
şuradaki forumda birşeyler var. kodunuzda sıralamaları değiştirmeyi deneyin
şöyle yapın diyor
Get a number from the temperature sensor.
Convert the temperature into a servo position.
Make the servo move to the calculated position.
http://forum.arduino.cc/index.php?topic=219695.0
Ö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.
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…
Ö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?
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.
Çok teşekkür ederim.Boşta pin çok var.Ahşap kasa içine yapıcam inşallah.Çok sağolun.
Uno ile yapabilir miyiz
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.
iyi günler benim ekranımda getTemp was not declared hatası veriyor
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.
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.
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.
Ö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
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
arduıno uno r3 kit ve 12v 4lü röle kartı var
ben zamanlama kullanarak röle nın calısmasını istiyorum fakat her seferınde karsılastıgım tek sorun röle hıc bır sekılde cekmıyor .röle kartı uzerındekı ledler programa gore yanıp sonuyor fakan rölelerı aç kapa yapmıyor .ne yapmam lazım .farklı bır yazılımmı olması gerekıyor . örn gonderırsenız sevınırım
role kartında roleler ıcın ayrı bır besleme olması gerekebılır guc yetmiyordur. kartın ustundekı roleler çlışıyorsı tık tık diye kontak sesi gelmesi lazım bu ses var ise role kontaklarındaki baglantıyı yanlış yapıyor da olabilirsiniz. foruma gelin
Merhaba hocam ds18b20 yi aşağıdaki kodlarla kullanabiliyorum ancak bu seferde daha önce kullandığım bluetooth modulünü kullanamıyorum. Kodlarda bir hata var sanırım ama ben çözemedim yardımcı olursanız memnun olurum.
#include
SoftwareSerial mySerial(10, 11);
#include
Servo myservo;
int pos = 0;
#include
int DS18S20_Pin = 2;
OneWire ds(DS18S20_Pin);
int fan = 9;
#define Lamp1 4
#define Lamp2 5
#define Lamp3 6
#define Lamp4 7
char val;
String statusLamp1,statusLamp2,statusLamp3,statusLamp4;
void setup() {
Serial.begin(9600);
pinMode(Lamp1,OUTPUT);
pinMode(Lamp2,OUTPUT);
pinMode(Lamp3,OUTPUT);
pinMode(Lamp4,OUTPUT);
pinMode(fan, OUTPUT);
myservo.attach(3);
mySerial.begin(9600);
}
void loop() {
float temperature = getTemp();
Serial.print(“Sicaklik: “);
Serial.println(temperature);
delay(1000);
}
float getTemp(){
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
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 <0 ) {
val = mySerial.read();
Serial.println(val);
{
while (Serial.available() > 0){
}
if( val == ‘a’ ) {
digitalWrite(Lamp1,HIGH); statusLamp1=”4″; }
else if( val == ‘b’ ) {
digitalWrite(Lamp2,HIGH); statusLamp2=”5″; }
else if( val == ‘c’ ) {
digitalWrite(Lamp3,HIGH); statusLamp3=”6″; }
else if( val == ‘d’ ) {
digitalWrite(Lamp4,HIGH); statusLamp4=”7″; }
else if( val == ‘e’ ) {
digitalWrite(Lamp1,HIGH); statusLamp1=”4″;
digitalWrite(Lamp2,HIGH); statusLamp2=”5″;
digitalWrite(Lamp3,HIGH); statusLamp3=”6″;
digitalWrite(Lamp4,HIGH); statusLamp4=”7″;
}
else if( val == ‘f’ ) {
for(pos = 0; pos =0; pos-=1);
myservo.write(pos);
delay(5);
}else if( val == ‘G’ )
{
delay(500);
mySerial.println(statusLamp1+statusLamp2+statusLamp3+statusLamp4+”J”); //delay(500);
val=’ ‘;
}
}
} }
bluetooth sorunu nedir buradan tam belli olmaz genelde bt için ön bir takım setup kodları filan yollanır siz direk bt serialı açıp datayı basmışınız bence temiz bir sayfada sadece bt yi test edin çalışıyorsa pwm i ekleyin ben pwm den şüphelendim sanki softserial ile pwm biraz sıkıntı olabilir gibi geldi. foruma gelin sorun birde.
Sıcaklık sensörünü çıkardığımda bluetooth sorunsuz çalışıyor. Ancak DS18b20 yi eklediğimde bluetooth modulu veri gönderememeye başladı.
şu forumlarda birşeyler var bir bakın isterseniz onewire ile softserialin birlikte kullanılınca çıkan problemlerden bahsediyor. bazı kod paylaşanlarda var beliki dikkatinizi birşey çeker. ben bt ile ds18b20 birlikte kullanmadığım için sorun yaşamamıştım. foruma da sorun
http://forum.arduino.cc/index.php?topic=293448.0
http://forum.arduino.cc/index.php?topic=457213.0
Ömer bey merhaba. Sensörden -1000 gibi bir değer okunuyor. Neden acaba?
bağlantılar çok uzun olmasın direnç değerleri önemli onları kontrol edin yukarıdaki kod ve şemayı uygulamaya çalışın ek herhangi bir şey yapmayın
tek hattan 6 tane sensörün sıcaklık bilgilerini okumak istiyorum ayrı ayrı pinlerden değil. bunu nasıl yapa bilirim yada bunun anlatıldıgı bi yazının linkini mail atabilirmisiniz.
hattın uzunluÄŸu ne kadar olacak tahminen. one wire protkolu ıle olcebılmen lazım her onewire cıhazın id si ile sorgulama yapacağın ornek kodları gormustum bulamazsan yaz bakalım tekrar…
Hocam paylaşım için çok teşekkür ederim öncelikle. Verdiğiniz şemayı oluşturdum sistem sorunsuz çalıştı. Hatta LCD ekrana da yazdırdım. Ama benim sensörü 35 metre hat ile kullanmam gerekiyor. Sistemi seranın sıcaklığını ölçmek için kullanıyorum. Sistemin çalışması fena değil. Küçük bir sorunum var ama. O da LCD deki virgülden sonraki değerin dalgalanması. Yani şöyle; mesela değer önce 12.50 sonra da 12.44 oluyor. Bu durum yarım saniyede bir tekrarlanıyor. Virgülden önceki değer gayet stabil. Bu sorunun çözümü için sizden yardım istiyorum. ŞİMDİDEN TEŞEKKÜRLER.
ds18b20 sensorunu 35mt ileri koyarsanız çalışırmı bilmiyor mesafe fazla uzak çalışmayabilir yada 35 mt lik koaksiyel kablo denenebilir ama tavsiye etmem, arduıno nano ve wifi veya rf bır modul kullanıp okudugunuz degerı içeri yollarsınız alıcıda ıse mevcut sistemi kullanıp alıcı olarak wifi veya rf modulle okumanız lazım. virgulden sonraki değerler lazım değilse noktadan sonrasını gostermeyın olsun bitsin.
Abdurahman bey,
DS18B20 hassasiyetini (TEMPERATURE_PRECISION = 12; ) değilde 9 kullanırsanız sanırım sorunuz ortadan kalkar. Defaut 12 olabilir. 9 da hassasiyet 0.5, 12 de 0.1 diye hatırlıyorum..
Suyun sıcaklık değerini ölçebilecegimiz bir arduino sensörü var mı?
ds18b20 sesnsorünün su geçirmez versiyonlarını yapıyorlar, kendinizde yapabilirsiniz, metal bir ince tüpün içine silikon yağı doldurup içine ds18b20 sensörünü koyup sıcaklık ölçersiniz aynı şekilde.
Arkadaslar selamlar.
18ds20 modeli thermocouple ile arduino kullanarak sicaklik olcebiliyorum, fakat birden fazla thermocouple kullanarak nasil sicaklik olculecegini bir turlu cikaramadim. Internette denemedigim code, ve devre kalmadi. Herseyi denedim. Daha once deneyipte basaran arkadas varsa lutfen yardimci olsun.
Simdiden tesekkur ederim
*****DUZELTME****
Arkadaslar selamlar.
“18DS20” modeli thermocouple ile arduino kullanarak sicaklik olcebiliyorum, fakat birden fazla thermocouple kullanarak nasil sicaklik olculecegini bir turlu cikaramadim. Internette denemedigim code, ve devre kalmadi. Herseyi denedim. Daha once deneyipte basaran arkadas varsa lutfen yardimci olsun.
Simdiden tesekkur ederim
Ds18b20 sensörünü kullanıyorum 4.7k direnç ile ama ölçüm sürekli olarak -127 nedeni ne olabilir
sensör bozuk olabilir, uçları hatalı bağlamış olabilirsiniz, kodunuzda hata olabilir yada kodunuzdaki pinlerle arduinodaki pinler aynımı kontrol edin..
merhaba ..hocam ben bir ÅŸey soracağım 18b20 bir sıcaklık panom var bunun datasını kablosuz olarak 30 metreye nasıl taşıyabilirim .ne önerirsiniz hc 11…RF433 ..veya baÅŸka bir ÅŸekilde nasıl yapabilirim . elinizde benzer bir proje varmı bana yardımcı olursanız çok sevinirim
wifi ile taşı esp32 ile.