DS18B20 не правильно показывает температуру

Тема в разделе "Arduino & Shields", создана пользователем Dany11, 17 авг 2019.

  1. SergeiL

    SergeiL Оракул Модератор

    Уверен!
    Код (C++):
    bool ds18b20_read(int *raw_temp_value) {
      if (!DS18B20_init())                     // Отправить начальный импульс
        return(0);                              // Вернуть 0, если ошибка
      ds18b20_write_byte(0xCC);                 // Проверка кода датчика
      ds18b20_write_byte(0x44);                 // Запуск температурного преобразования

    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      while(ds18b20_read_byte() == 0);          // Подождать, пока оно закончится
    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

      if (!DS18B20_init())                     // Отправить начальный импульс
        return(0);                              // Вернуть 0, если ошибка
      ds18b20_write_byte(0xCC);                 // Проверка кода датчика
      ds18b20_write_byte(0xBE);                 // Считываем содержимое ОЗУ
      *raw_temp_value = ds18b20_read_byte();    // Read temperature LSB byte and store it on raw_temp_value LSB byte
      *raw_temp_value |= (unsigned int)(ds18b20_read_byte() << 8);     // Read temperature MSB byte and store it on raw_temp_value MSB byte
      return(1);                                // OK --> return 1
    }
     
    Вы запустили преобразование, и ждете его окончания, в цикле. длительность преобразования около 750мс. Больше ничего не работает, только цикл.
    (цикл между // !!!!! )
     
    Aleksander1997 и b707 нравится это.
  2. b707

    b707 Гуру

    да, так прерывания использовать нельзя,
    Александр, это значительно хуже delay()
    никогда не используйте while в циклах ожидания - цикл получается блокирующим.
     
    Aleksander1997 нравится это.
  3. Да, вы правы. b707, SergeiL cпасибо за совет. Буду исправлять