DS18S20

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

Метки:
  1. MAK

    MAK Нерд

    для чего?:confused:
     
  2. ИгорьК

    ИгорьК Гуру

    Чтобы вам нашли ссылку. Вам ее нашли - проверяйте. Ни у кого из здесь присутствующих этого датчика нет, чтобы проверить.
     
  3. Belkin

    Belkin Гик

    Я с S-ками работал. Заказал как-то по ошибке.
    Еще раз повторяю - при условии "воткнул и работает" - они (датчики) практически одинаковы.
    Если возникает желание залезть поглубже - это уже другой вопрос.

    Даже датчики из одной партии могут иметь разброс в показаниях, порой больше градуса...
    Решал просто - вычитал или прибавлял "корректировку" к считанным данным для конкретного датчика (всегда использую чтение по ID), не залезая в "нутро"... ;)
     
  4. ИгорьК

    ИгорьК Гуру

    Ну дайте товарищу код - что мешает?
     
  5. MAK

    MAK Нерд

    вот, сейчас проверил, не работает. На изменение температуры реагирует, а само значение неверное.
    Код (Text):
    No more addresses.
    R=10 32 C1 62 0 8 0 76 P=1 B7 FF 0 0 FF FF 2 10 8D  CRC=8D
    LB= B7 HB= FF T = -36
    No more addresses.
    R=10 32 C1 62 0 8 0 76 P=1 BA FF 0 0 FF FF D 10 E9  CRC=E9
    LB= BA HB= FF T = -35
    No more addresses.
    R=10 32 C1 62 0 8 0 76 P=1 BA FF 0 0 FF FF C 10 2D  CRC=2D
    LB= BA HB= FF T = -35
    No more addresses.
    R=10 32 C1 62 0 8 0 76 P=1 BA FF 0 0 FF FF A 10 87  CRC=87
    LB= BA HB= FF T = -35
    No more addresses.
    R=10 32 C1 62 0 8 0 76 P=1 BA FF 0 0 FF FF A 10 87  CRC=87
    LB= BA HB= FF T = -35
    No more addresses.
    R=10 32 C1 62 0 8 0 76 P=1 BA FF 0 0 FF FF 9 10 D2  CRC=D2
    LB= BA HB= FF T = -35
    No more addresses.
    R=10 32 C1 62 0 8 0 76 P=1 BB FF 0 0 FF FF 8 10 55  CRC=55
    LB= BB HB= FF T = -34
     
     
  6. MAK

    MAK Нерд

    тоже не работает, с тем же результатом:
    Код (Text):
    No more addresses.

    ROM = 10 32 C1 62 0 8 0 76
      Chip = DS18S20
      Data = 1 BF FF 0 0 FF FF 6 10 9C  CRC=9C
      Temperature = -32.63 Celsius,
    No more addresses.

    ROM = 10 32 C1 62 0 8 0 76
      Chip = DS18S20
      Data = 1 BF FF 0 0 FF FF 8 10 40  CRC=40
      Temperature = -32.75 Celsius,
    No more addresses.
     
     
  7. ИгорьК

    ИгорьК Гуру

    Это проблема не датчика, а неправильного преобразования его значений скетчем.
    Не выбрасывайте датчики - они вполне работоспособны.
     
  8. MAK

    MAK Нерд

    ну и 18b20:
    Код (Text):
    No more addresses.

    ROM = 28 FF 7D 73 71 17 3 CD
      Chip = DS18B20
      Data = 1 52 1 4B 46 7F FF C 10 6E  CRC=6E
      Temperature = 21.12 Celsius,
    No more addresses.

    ROM = 28 FF 7D 73 71 17 3 CD
      Chip = DS18B20
      Data = 1 56 1 4B 46 7F FF C 10 7B  CRC=7B
      Temperature = 21.37 Celsius,
    No more addresses.

    ROM = 28 FF 7D 73 71 17 3 CD
      Chip = DS18B20
      Data = 1 5A 1 4B 46 7F FF C 10 44  CRC=44
      Temperature = 21.62 Celsius,
     
  9. MAK

    MAK Нерд

    Спасибо, родное сердце, именно об этом я твержу с первого поста...
     
  10. ИгорьК

    ИгорьК Гуру

    Вроде, все :)
     
  11. MAK

    MAK Нерд

    что все?
     
  12. parovoZZ

    parovoZZ Гуру

    CRC сумма совпадает. Значит всё верное. Неужели лупить нам по мозгам приносит больше удовольствия, чем прочтение даташита?
     
  13. ИгорьК

    ИгорьК Гуру

    Ну, вопрос исчерпан или нет?
     
  14. ИгорьК

    ИгорьК Гуру

    Все своеобразно, но забавно.
     
  15. MAK

    MAK Нерд

    нет конечно. мне нужно чтобы S-ка заработала.
     
  16. MAK

    MAK Нерд

    я не хочу изобретать велосипед, думал этот вопрос давно решен. А вы меня все в даташиты гоните...
     
  17. ИгорьК

    ИгорьК Гуру

    Ну, смотрите. Долгие переговоры выявили, что
    1. Правильного кода нет не у кого. Ну у меня точно нет, чеслово.
    2. Датчик - рабочий.
    Значит все таки кому-то придется лезть в даташит, так? И кто рискнет...
     
  18. ИгорьК

    ИгорьК Гуру

    Вот пока на память, кусок кода из Dallas Temperature про DS18S20:
    Код (C++):

    int16_t rawTemperature = (((int16_t)scratchPad[TEMP_MSB]) << 8) | scratchPad[TEMP_LSB];    
    case DS18S20MODEL:
    /*

          Resolutions greater than 9 bits can be calculated using the data from
          the temperature, COUNT REMAIN and COUNT PER �C registers in the
          scratchpad. Note that the COUNT PER �C register is hard-wired to 16
          (10h). After reading the scratchpad, the TEMP_READ value is obtained
          by truncating the 0.5�C bit (bit 0) from the temperature data. The
          extended resolution temperature can then be calculated using the
          following equation:

                                           COUNT_PER_C - COUNT_REMAIN
          TEMPERATURE = TEMP_READ - 0.25 + --------------------------
                                                   COUNT_PER_C
          */


          // Good spot. Thanks Nic Johns for your contribution
          return (float)(rawTemperature >> 1) - 0.25 +((float)(scratchPad[COUNT_PER_C] - scratchPad[COUNT_REMAIN]) / (float)scratchPad[COUNT_PER_C] );
          break;
      }
    }
     
  19. parovoZZ

    parovoZZ Гуру

    Ладно, не будем мучать.
    В коде есть проверка - в дополнительном формате значение или нет. У меня эта конструкция выглядит так

    Код (C++):
    if (receivePayload.temperature & 0xf800)
    Это для 12 бит.
    Для 9 бит будет так
    Код (C++):
    if (receivePayload.temperature & 0xff00)
    Ну а дальше стандартная конструкция извлечения дополнительного или прямого кода
    Код (C++):
    receivePayload.temperature = ~(receivePayload.temperature)+1;
            temperature = 0 -  (float)receivePayload.temperature / 16.0;
            }
        else
            {
            temperature = (float)receivePayload.temperature / 16.0;
            }
    Да, у меня через структуру, но удалять лень. Спать хочу)))
     
  20. parovoZZ

    parovoZZ Гуру

    Там написано, что это для повышения точности.