DS18S20

Тема в разделе "Arduino & Shields", создана пользователем MAK, 28 мар 2018.

Метки:
  1. MAK

    MAK Нерд

    не спорю. просто я еще не ботанил, где подкрутить, и попытался спросить более опытных.
     
  2. MAK

    MAK Нерд

    "ой, все" ))
     
  3. Belkin

    Belkin Гик

    Что поддерживает ?
    "Это" - этот датчик или "это" - 12-битный режим ?
    Если первое, то любая библиотека, умеющая работать с DS18B20, будет работать и с DS18S20.

    Если второе, то parovoZZ уже сказал, почему в обычных условиях нет смысла его (12-бит режим) включать.
    Если таки хочется его включить - попробовать нетрудно, найдите нужные команды в даташите - и вперед. ;)
     
  4. MAK

    MAK Нерд

    да, только, если воткнуть S вместо B, то показывается некорректная температура. И насколько я понял 12-битный режим как раз свойство 18b20 и включен по умолчанию. А S-вариант как раз неизменяемо 9-и битный
     
  5. у 18б20 по умолчанию 9 битный режим

    в чем проблема открыть даташит?
     
  6. Код (C++):
    #include <OneWire.h>

    // OneWire DS18S20, DS18B20, DS1822 Temperature Example
    //
    // http://www.pjrc.com/teensy/td_libs_OneWire.html
    //
    // The DallasTemperature library can do all this work for you!
    // http://milesburton.com/Dallas_Temperature_Control_Library

    OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

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

    void loop(void) {
      byte i;
      byte present = 0;
      byte type_s;
      byte data[12];
      byte addr[8];
      float celsius, fahrenheit;
     
      if ( !ds.search(addr)) {
        Serial.println("No more addresses.");
        Serial.println();
        ds.reset_search();
        delay(250);
        return;
      }
     
      Serial.print("ROM =");
      for( i = 0; i < 8; i++) {
        Serial.write(' ');
        Serial.print(addr[i], HEX);
      }

      if (OneWire::crc8(addr, 7) != addr[7]) {
          Serial.println("CRC is not valid!");
          return;
      }
      Serial.println();
      // the first ROM byte indicates which chip
      switch (addr[0]) {
        case 0x10:
          Serial.println("  Chip = DS18S20");  // or old DS1820
          type_s = 1;
          break;
        case 0x28:
          Serial.println("  Chip = DS18B20");
          type_s = 0;
          break;
        case 0x22:
          Serial.println("  Chip = DS1822");
          type_s = 0;
          break;
        default:
          Serial.println("Device is not a DS18x20 family device.");
          return;
      }

      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("  Data = ");
      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();

      // Convert the data to actual temperature
      // because the result is a 16 bit signed integer, it should
      // be stored to an "int16_t" type, which is always 16 bits
      // even when compiled on a 32 bit processor.
      int16_t raw = (data[1] << 8) | data[0];
      if (type_s) {
        raw = raw << 3; // 9 bit resolution default
        if (data[7] == 0x10) {
          // "count remain" gives full 12 bit resolution
          raw = (raw & 0xFFF0) + 12 - data[6];
        }
      } else {
        byte cfg = (data[4] & 0x60);
        // at lower res, the low bits are undefined, so let's zero them
        if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
        else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
        else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
        //// default is 12 bit resolution, 750 ms conversion time
      }
      celsius = (float)raw / 16.0;
      fahrenheit = celsius * 1.8 + 32.0;
      Serial.print("  Temperature = ");
      Serial.print(celsius);
      Serial.print(" Celsius, ");
      Serial.print(fahrenheit);
      Serial.println(" Fahrenheit");
    }
    не ужели это не работает?
     
  7. MAK

    MAK Нерд

    нет проблем. особенно чтобы выяснить что вы врете:
     
  8. Belkin

    Belkin Гик

    Да одинаковы они ! На 98% одинаковы ! ;)
    Что значит "некорректная" ? Как долго она "некорректная" ?
    1. Первые измерения от этих датчиков можно смело игнорировать.
    2. Можно попробовать "поиграться" с номиналом резистора. Иногда помогает. Одна партия в 2016-м упорно хотела работать с резистором не более 2,2кОм.
    3. Сделать пореже опрос датчика. Не надо его "пулеметить" каждую секунду, они этого не любят. Вполне достаточно не чаще 1 раза в минуту.
     
  9. ИгорьК

    ИгорьК Гуру

    Друже, не надо так. Хоть у тебя и винтовка, не стоит ее применять.
    Человек может ошибаться. Не надо стрелять помидорами, пожалуйста.
     
  10. Belkin

    Belkin Гик

    Это некритично.
    Ну, прочитает программа "нули" вместо чего-то "девятого после запятой" - что-то сильно изменится ? ;)
     
  11. parovoZZ

    parovoZZ Гуру

    И что? Неужели в сети нет примеров работы с этим датчиком? Я за 5 минут нашёл, а через 10 минут снимал показания температуры. И это при том, что я не признаю никаких ардуино-овно-библиотек, программы пишу исключительно на сях.
     
  12. MAK

    MAK Нерд

    тема плавно перерастает из моего простого вопроса в нравоучитыв
    вы бох 89 левела, а я нет.
     
  13. MAK

    MAK Нерд

    тема плавно превращается из моего простого вопроса в назидательное прочтение даташита местным сокамерникам. Я этого не хотел.
     
  14. чтото же должно было сподвигнуть ))))
     
  15. MAK

    MAK Нерд

    базаранет)
     
  16. ИгорьК

    ИгорьК Гуру

  17. теперь хоть стало понятно для чего эта тема.
     
  18. parovoZZ

    parovoZZ Гуру

    Вообще работа с китайской отбраковкой выработала следующий не хитрый алгоритм:
    1. На этапе инициализации различного китайского барахла обязательно устанавливать все параметры и режимы работы, даже если кажется, что они выставлены по умолчанию.
     
    ИгорьК нравится это.
  19. ИгорьК

    ИгорьК Гуру

    +100500
     
  20. MAK

    MAK Нерд

    нет еще, не проверял.