ds18b20 ve ds18s20 kullanımı
  • EDITOR:konu başlığı düzeltildi. verilen konu başlıkları istenen şeyi açıklayıcı nitelikte olmalıdır. Yardım veya acil gibi başlıkların olduğu konular silinecektir bundan sonra.


    merhaba. bu konuda çok yeni olduğumu ve ilk çalışmam olduğunu belirterek başlayayım. arabam için hem iç hem dış sıcaklığı ölçmesi için arduino uno, ds18b20 ve ds18s20 kullanarak termometre yapmaya karar verdim. ve başardım. fakat ds18b20 den gelen derece 22.312 bunu değiştirip 22.3 yapmak istiyorum. kullandığım kod


    #include < LiquidCrystal.h>
    #include < OneWire.h>

    OneWire ds(2); // pin 2
    LiquidCrystal lcd(13,12,11,10,9,8);

    void setup(void) {
    lcd.begin(16,2);
    lcd.print("Temp 1 = ");
    lcd.setCursor(0,1);
    lcd.print("Temp 2 = ");

    lcd.setCursor(1,2);
    lcd.print("www.TheEngineering");
    lcd.setCursor(4,3);
    lcd.print("Projects.com");
    }


    void loop(void) {
    byte i = 0;
    byte data[9];
    byte addr[8];
    int temp;
    boolean type;

    //get the addresses of Temperature Sensors
    if(!ds.search(addr)){
    return;
    }

    switch(addr[0]){
    case 0x10: type = 1; break;//DS18S20
    case 0x22: type = 0; break;//DS1822
    case 0x28: type = 0; break;//DS18B20
    default: break;
    }

    ds.reset();
    ds.select(addr);
    ds.write(0x44);
    delay(750);

    ds.reset();
    ds.select(addr);
    ds.write(0xBE);

    //Leitura
    for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
    }

    if(!type){//DS18B20 ou DS1822

    lcd.setCursor(9,1);

    if((data[1]>>7)==1){
    data[1] = ~data[1];
    data[0] = (~data[0]) + 1;
    lcd.print("-");
    }
    else{
    lcd.print("+");
    }
    temp = (data[1]<<4) | (data[0]>>4);
    lcd.print(temp);
    lcd.print(".");
    temp = (data[0] & 0x0F) * 625;
    if(temp>625){
    lcd.print(temp);
    }
    else{
    lcd.print("0");
    lcd.print(temp);
    }
    }
    else{//DS18S20

    lcd.setCursor(9,0);

    if((data[1]>>7)==1){
    data[0] = ~data[0];
    lcd.print("-");
    }
    else{
    lcd.print("+");
    }
    temp = data[0]>>1;
    lcd.print(temp);
    lcd.print(".");
    lcd.print((data[0] & 0x01)*5);

    }
    lcd.print(" ");
    lcd.write(223);// degree symbol
    lcd.print("C ");
    }
  • evet temp 2 değerininde üstteki gibi olmasını istiyorum yardımcı olursanız sevinirim.
  • Sonuca ulaştım. data[0] & 0x0F) * 625;
       if(temp>625) Bu kısımları düzelttim oldu. Ama başka sorun çıktı. Probları buzdolabına koydum. İki prob arası fark arttı. Sanırım bir prob 1 birim okurken diğeri 0.625 okuyor. Tam anlayamadım okumayı 0.625 yaptırıp ekrandaki yazısını 22.549 yerine 22.5 olarak çıkartabilirmiyim teşekkürler
  • Bu konuda bilgi verebilecek kimse yokmu?
  • yanyana dipdibe 2 sensörün aynı değer üretiğini görmedim şimdiye kadar. ekrandaki görüntüyü kod ile kesip biçebilirsin

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.