Измерение температуры с помощью rtd pt100 и max31865

Тема в разделе "Arduino & Shields", создана пользователем enclouder, 22 фев 2016.

  1. enclouder

    enclouder Нерд

    Всем привет.
    Купил плату max31865, да вот только она не от PlayingWithFusion, а другая.
    Подойдет ли к ней код от PlayingWithFusion?
    Слевая моя плата, справа от PlayingWithFusion.
    green.jpg blue.jpg

    Код (C++):
    #include <SPI.h>
    #include <MAX31865.h>


    #define RTD_CS_PIN   10


    MAX31865_RTD rtd( MAX31865_RTD::RTD_PT100, RTD_CS_PIN );


    void setup()
    {
      Serial.begin( 115200 );

      /* Initialize SPI communication. */
      SPI.begin( );
      SPI.setClockDivider( SPI_CLOCK_DIV16 );
      SPI.setDataMode( SPI_MODE3 );

      /* Allow the MAX31865 to warm up. */
      delay( 100 );

      /* Configure:
           V_BIAS enabled
           Auto-conversion
           1-shot disabled
           3-wire enabled
           Fault detection:  automatic delay
           Fault status:  auto-clear
           50 Hz filter
           Low threshold:  0x0000
           High threshold:  0x7fff
      */

      rtd.configure( true, true, false, true, MAX31865_FAULT_DETECTION_NONE,
                     true, true, 0x0000, 0x7fff );
    }



    void loop()
    {
      rtd.read_all( );

      if( rtd.status( ) == 0 )
      {
        double temperature = rtd.temperature( );
        Serial.print( " T = ");
        Serial.print( temperature, 1 );
        Serial.println(" deg C" );
      }
      else
      {
        Serial.print( "RTD fault register: " );
        Serial.print( rtd.status( ) );
        Serial.print( ": " );
        if( rtd.status( ) & MAX31865_FAULT_HIGH_THRESHOLD )
        {
          Serial.println( "RTD high threshold exceeded" );
        }
        else if( rtd.status( ) & MAX31865_FAULT_LOW_THRESHOLD )
        {
          Serial.println( "RTD low threshold exceeded" );
        }
        else if( rtd.status( ) & MAX31865_FAULT_REFIN )
        {
          Serial.println( "REFIN- > 0.85 x V_BIAS" );
        }
        else if( rtd.status( ) & MAX31865_FAULT_REFIN_FORCE )
        {
          Serial.println( "REFIN- < 0.85 x V_BIAS, FORCE- open" );
        }
        else if( rtd.status( ) & MAX31865_FAULT_RTDIN_FORCE )
        {
          Serial.println( "RTDIN- < 0.85 x V_BIAS, FORCE- open" );
        }
        else if( rtd.status( ) & MAX31865_FAULT_VOLTAGE )
        {
          Serial.println( "Overvoltage/undervoltage fault");
        }
        else
        {
          Serial.println( "Unknown fault; check connection" );
        }
      }

      delay( 3000 );
    }
     
     
    Последнее редактирование: 22 фев 2016
  2. noevile

    noevile Гик

    а что есть какая-то разница между чипом MAX31865 с PlayingWithFusion и той китайской подделкой? думаю чип один и тот же. значит они оба подчиняются мануалу от компании MAXIM. значит и код должен подойти.
     
  3. enclouder

    enclouder Нерд

    Начал использовать плату с pt100 и наткнулся на нюанс:
    ставлю 2 стакана с комнатной и горячей водой.
    Окунаю гильзу pt100 в горячую - показывает 66 градусов, окунаю в холодную и только спустя 7-9 секунд он выдает точную температуру холодной воды. Окунаю снова в горячую и опять - спустя 7-9 секунд он выдает точную температуру горячей воды.
    Я заказывал эту плату (max31865) только изза скорости измерения температуры. А скорость измерения не отличается от обычного Dallas 18b20.
    RTD pt100 заказывал на Aliexpress http://ru.aliexpress.com/item/Three...e-Shipping/2039115279.html?detailNewVersion=1

    это RTD такой хреновый, что так долго прогревается или так и должно быть? Просто, в чем смысл высокоскоростного измерения температуры если изза RTD он прогревается в среднем 7 сек.
     
  4. noevile

    noevile Гик

    в коде в конце стоит задержка 3 секунды .. ни на какие мысли не наталкивает ???
     
  5. noevile

    noevile Гик

    датчик DS18B20 измерение делает менее секунды .. но это время регулируется его точностью .. чем точнее тем дольше он определяет температуру .. плюс надо ждать пока капсула прогреется .. отсюда и время в пределах секунды двух на одно измерение .. в принципе это нормально .. синхронно ни один датчик не измеряет температуру .. особенно цифровой .. всегда будет лаг во времени на обработку результатов в миллисекундах - секундах
     
  6. enclouder

    enclouder Нерд

    ну само собой я изменил время с 3000 на 100. Тот код просто скопипастил.
     
  7. enclouder

    enclouder Нерд

    Получается по сути, что ds1820 за 200 рублей, что max31865 За 2 тыщи рублей работают одинаково?
    Что то мне кажется, вы ошибаетесь. Лаг во времени на обработку? Ну сколько времени займет обработка на МК? доли секунды.

    Мне кажется дела в капсуле. Дорогостоящая - быстрее прогревается. И, например, вместо 7 секунд дорогостояая будет за 1-2 сек прогреватся. Или я все таки не прав и ds18b20 ничем не отличается от времени преобразования температуры от max31865?
     
  8. noevile

    noevile Гик

    причём тут обработка на МК? МК получает уже готовое значение с преобразователя MAX31865.
    DS18B20 c 12бит точньстью если не ошибаюсь обрабатывает и выдаёт температуру примерно за 700мсек.
    вот тут и вопрос за какое время делает обработку измерений и выдачу числа температуры чип MAX31865?

    а вообще надо смотреть в монитор ком порта что там пишется .. согласно скопипастенного кода и изменения на 100мсек задержку в монитор ком порта должно каждые 100мсек выплёвываться или температура или если статус обнулился или другое отладочное сообщение .. так и можно подсчитать сколько проходит времени между статусом ==1 и статусом ==0 .. это и будет время затраченное преобразователем на измерение сопротивление ПТ100 и преобразование его в число

    так же не надо думать что если переложить датчик из стакана в стакан то мгновенно покажет температуру среды в стакане .. датчик лишь изменяет сопротивление остывая или нагреваясь на что нужно время соответственно будет видно изменение температуры от начальное и через пару таких изменений пока не прогреется капсула до температуры среды он не покажет ожидаемую температуру среды .. а будет показывать лишь температуру прогрева капсулы в данный момент запроса температуры

    так же не надо думать что раз есть ПТ100 датчик и преобразователь за 2 тыщи то это круто и он должен работать шустро .. это не так .. DS18B20 имеет диапазон температур всего -55 - +125 градусов по цельсию в то время как ПТ100 датчик может изменять сопротивление в пределах от -50 до +600 градусов в зависимости от типоисполнения облицовки сенсора .. другими словами сначала надо было определиться какой диапазон температур измерять .. потом уже датчик выбирать и преобразователь к нему .. и раз связались с ПТ100, то будьте так любезны для начала прочитать про этот тип датчика .. потом прочитать про этот преобразователь для этого датчика https://datasheets.maximintegrated.com/en/ds/MAX31865.pdf .. потом изучить работу библиотеки для этого преобразователя .. и уже только потом задавать вопросы про время потому как задержки могут стоять и в библиотеке

    и желательно ещё бы вам научиться пользоваться поиском .. потому как вот в этом видео

    вообще не используется преобразователь для RTD PT100 и объясняется как датчик подключить к ардуино без всяких преобразователей, библиотек и тому подобной фигни
     
    enclouder нравится это.
  9. NBO

    NBO Нуб

    Добрый день!

    Прошу помощи в подключении PT100, через MAX31865 к ардуино.
    На данном этапе мне нужно понять, как соединить все вместе. И, по возможности, ссылку на библиотеку для MAX. PT100 имеет 3 вывода.
    Буду крайне благодарен за советы.

    1.jpg 2.jpg 3.jpg
     
  10. DIYMan

    DIYMan Guest

  11. NBO

    NBO Нуб

    Спасибо Большое, DIY Man, - это то, что нужно - буду экспериментировать!
     
  12. DIYMan

    DIYMan Guest

    Гуглу спасибо, я просто поработал посредником между вами и им, раз вам было недосуг ввести парочку ключевых слов и ткнуть в первую ссылку. Понимаю, занятый человек, все дела...
     
  13. NBO

    NBO Нуб

    Добрый день!

    В продолжении темы MAX 31865 - PT 100. Возникает проблема. прошу помощи в решении.

    Основываясь на ссылке с сайта adafruit, проделал необходимые шаги в подготовке MAX 31865 - разрезал/запаял перемычки, что бы активировать 3х проводной режим подключения PT100. Собрал все вместе, как указано на сайте. (картинка ниже)

    подключил библиотеку <Adafruit_MAX31865.h> (в скетче, она не подсветилась цветом, как подсвечиваются другие библиотеки - не знаю, что это означает. В списке библиотек статус "installed" есть)

    Загрузил скетч из "Examples". Приведен ниже.

    После запуска, программа выдает в монитор порта от 1 до 3 измерений (на первый взгляд - точных), а затем начинает в строчку генерить псевдографику. Вывести из этого состояния ее может только перезаливка скетча. выключение питания не помогает. (после включения, программа вновь молотит в строчку псевдографику). Пробовал отключать питание от MAX. Результат тот же 2-3 результата измерений с "нулями". затем псевдографика. Пробовал менять плату Ардуино - тот же эффект.

    Скажите плиз, что не так?
    Заранее благодарен, Николай





    #include <Adafruit_MAX31865.h>

    // Use software SPI: CS, DI, DO, CLK
    Adafruit_MAX31865 max = Adafruit_MAX31865(7, 8, 9, 10);
    // use hardware SPI, just pass in the CS pin
    //Adafruit_MAX31865 max = Adafruit_MAX31865(10);

    // The value of the Rref resistor. Use 430.0!
    #define RREF 430.0


    void setup() {
    Serial.begin(115200);
    Serial.println("Adafruit MAX31865 PT100 Sensor Test!");

    max.begin(MAX31865_3WIRE); // set to 2WIRE or 4WIRE as necessary
    }


    void loop() {
    uint16_t rtd = max.readRTD();

    Serial.print("RTD value: "); Serial.println(rtd);
    float ratio = rtd;
    ratio /= 32768;
    Serial.print("Ratio = "); Serial.println(ratio,8);
    Serial.print("Resistance = "); Serial.println(RREF*ratio,8);
    Serial.print("Temperature = "); Serial.println(max.temperature(100, RREF));


    delay(1000);
    }

    13.jpg 14.png
     
  14. DIYMan

    DIYMan Guest

    Пожалуйста, ПОЛНЫЙ скетч в студию. И вставлять его надо правильно - есть кнопочка "<>" для вставки кода.
     
  15. NBO

    NBO Нуб

    Век живи - век учись!

    Приведенный код - сокращенный вариант примера из библиотеки, из которого я руками выкинул шапку и часть относящуюся к обработке различных ошибок, что бы сделать его более читаем. "Обрезанный результат" и полный дают один и тот же эффект. Ниже привожу полный вариант скетча:
    И большое спасибо Вам за участие - боюсь один я не справлюсь...
    Код (C++):
    /***************************************************
      This is a library for the Adafruit PT100/P1000 RTD Sensor w/MAX31865

      Designed specifically to work with the Adafruit RTD Sensor
      ----> https://www.adafruit.com/products/3328

      This sensor uses SPI to communicate, 4 pins are required to
      interface
      Adafruit invests time and resources providing this open source code,
      please support Adafruit and open-source hardware by purchasing
      products from Adafruit!

      Written by Limor Fried/Ladyada for Adafruit Industries.
      BSD license, all text above must be included in any redistribution
    ****************************************************/


    #include <Adafruit_MAX31865.h>

    // Use software SPI: CS, DI, DO, CLK
    Adafruit_MAX31865 max = Adafruit_MAX31865(7, 8, 9, 10);
    // use hardware SPI, just pass in the CS pin
    //Adafruit_MAX31865 max = Adafruit_MAX31865(10);

    // The value of the Rref resistor. Use 430.0!
    #define RREF 430.0


    void setup() {
      Serial.begin(115200);
      Serial.println("Adafruit MAX31865 PT100 Sensor Test!");

      max.begin(MAX31865_3WIRE);  // set to 2WIRE or 4WIRE as necessary
    }


    void loop() {
      uint16_t rtd = max.readRTD();

      Serial.print("RTD value: "); Serial.println(rtd);
      float ratio = rtd;
      ratio /= 32768;
      Serial.print("Ratio = "); Serial.println(ratio,8);
      Serial.print("Resistance = "); Serial.println(RREF*ratio,8);
      Serial.print("Temperature = "); Serial.println(max.temperature(100, RREF));

      // Check and print any faults
      uint8_t fault = max.readFault();
      if (fault) {
        Serial.print("Fault 0x"); Serial.println(fault, HEX);
        if (fault & MAX31865_FAULT_HIGHTHRESH) {
          Serial.println("RTD High Threshold");
        }
        if (fault & MAX31865_FAULT_LOWTHRESH) {
          Serial.println("RTD Low Threshold");
        }
        if (fault & MAX31865_FAULT_REFINLOW) {
          Serial.println("REFIN- > 0.85 x Bias");
        }
        if (fault & MAX31865_FAULT_REFINHIGH) {
          Serial.println("REFIN- < 0.85 x Bias - FORCE- open");
        }
        if (fault & MAX31865_FAULT_RTDINLOW) {
          Serial.println("RTDIN- < 0.85 x Bias - FORCE- open");
        }
        if (fault & MAX31865_FAULT_OVUV) {
          Serial.println("Under/Over voltage");
        }
        max.clearFault();
      }
      Serial.println();
      delay(1000);
    }
     
  16. DIYMan

    DIYMan Guest

    На аппаратном SPI пробовали? И да, заметил в вашем предыдущем посте, в котором скрины приведены: в скетче указана скорость Serial 115200, а на скрине монитора порта - вижу скорость 9600. Это чего такое?

    Давайте договоримся, что информацию надо предоставлять комплексно и системно, чтобы никто не гадал, что вы там делаете и откуда берутся такие вот разногласия по скоростям тех же портов. А то не знаешь, на что ориентироваться - то ли лыжи не едут, то ли...
     
  17. NBO

    NBO Нуб

    Договорились!

    Большое Вам спасибо- погарел на ерунде, скорость порта была проблемой! Поставил 9600 - все заработало.

    Буду продолжать . Следующий шаг- подключение 3х датчиков и вывод на lcd.