Je zvolena metoda měření úbytku napětí na odporu při napájení konstantním proudem. Zdroj proudu je realizovaný pomocí LM334. Napětí měříme modulem HX711. Pomocí pár součástek získáme jednoduchý, levný (asi 100 Kč) a přesný převodník pro Pt100.

Schéma zapojení měření teploty pomocí PT100

Zdroj konstantního proudu vychází ze zapojení v datasheetu. Tam nalezneme vše potřebné pro případnou úpravu zapojení. Při hodnotách R1,R2 teče proud 168 µA. Zdroj proudu je napájený 5V.

U modulu HX711 jsou použity vstupy A a B. Napájení E+,E- není použito. Výstup je propojený se vstupy A0 a A1 modulu Arduino. Kanál B slouží pro měření proudu. Můžeme tak sledovat teplotní a časovou závislost zdroje proudu. Případný rozdíl mezi hodnotou uloženou při nastavení převodníku a hodnotou aktuální lze využít pro posun rozsahu. Kanál A používá zesílení 64 a měří úbytek napětí na Pt100. Tato hodnota je v programu převedena na ohmy a následně na teplotu. Na kanálu A při zesílení 64 lze měřit do 370 °C (238Ω * 168 µA = 0,0399mV).

K nastavení a testování slouží jednoduchý program. Nastavení pro rozsah 0 - 211°C provedeme pomocí odporu 100 Ω a 180 Ω(přesnost 0,1%). Při 100Ω zapíšeme konstanty proud a spodni. Při 180Ω konstantu horni. Hodnota privod je trvalý rozdíl mezi měřením Pt100 a senzorem DS18B20(při nastavení privod = 0).

Potřebná knihovna HX711 je ke stažení zde, návod pro její importování zde.

#include "HX711.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Nokia5110.h>

// nastavení čísla vstupního pinu
const int pinCidlaDS = 2;

// vytvoření instance oneWireDS z knihovny OneWire
OneWire oneWireDS(pinCidlaDS);
// vytvoření instance senzoryDS z knihovny DallasTemperature
DallasTemperature senzoryDS(&oneWireDS);

HX711 scale;

#define Ka 0.0039083
#define Kb -5.775E-07
#define proud 1679.5      //hodnota vst. B pri nastaveni   
#define spodni 3346.0     //hodnota vst. A pri 100 Ohmech
#define horni 6016.0      //hodnota vst. A pri 180 Ohmech
#define privod 0.4        //kompenzace privodu


// nastavení propojovacích pinů
#define RST 10
#define CE 9
#define DC 8
#define DIN 7
#define CLK 6

// inicializace LCD displeje z knihovny
LCDnokia5110 lcd(RST, CE, DC, DIN, CLK);

String zapis = "";
char tisk[10];
float spodni_a;
float horni_a;


void setup() {
 
 // zahájení komunikace s displejem
  lcd.LcdInitialise();
 // vymazání obsahu displeje
  lcd.LcdClear();
  // nastavení velikosti mezery mezi písmeny,
  // lze nastavit na 0, 1 či 2 body
  lcd.CharSpace = 1;

  lcd.GotoXY(20,0);
  lcd.LcdString("start");

  senzoryDS.begin();
  // parameter "gain" is ommited; the default value 128 is used by the library
  // HX711.DOUT	- pin #A1
  // HX711.PD_SCK	- pin #A0
  scale.begin(A1, A0,32);
  delay(2000);
  //zahrati systemu
  float z = scale.read_average(20);
  scale.set_gain(64);
  z = scale.read_average(20);
    
}



void loop() {
     
//***** teplota DS18B20 *********************************************
  
  senzoryDS.requestTemperatures();
  float teplota_DS = senzoryDS.getTempCByIndex(0);
  
//***** cteni proudu ************************************************
  scale.set_gain(32);
  float proud_a = scale.read_average(3)/1000.0;
  
  //omezeni na 1 des. misto o hodnote 0 nebo 0.5
  int prumer = int(proud_a);
  float zbytek = proud_a - float(prumer);
  if (zbytek < 0.5){
      proud_a = float(prumer);
  }
  else {
      proud_a = float(prumer) + 0.5;
  }
   
  float podil = proud_a / proud;
  
  //***** cteni odporu ***********************************************
  scale.set_gain(64);
  //uprava zacatku rozsahu podle zmeny proudu
  spodni_a = spodni * podil;
  //uprava konce rozsahu podle zmeny proudu
  horni_a = horni * podil;
  
  //omezeni des. míst
  prumer = int(scale.read_average(3)/1000.0);
  float x =float(prumer);
  
  //prepocet na odpor 100 - 180 ohmu
  float odpor = (x - spodni_a) * (180.0 - 100.0) / (horni_a - spodni_a) + 100.0 ;
  //prepocet na teplotu 0 - 211 st.
  float teplota  =  (( sqrt(Kb * odpor - 100.0 * Kb + 25.0 * pow(Ka,2)) - 5.0 * Ka) / (10.0 * Kb)) - privod;

  //***** zapis hodnot *************************************************
  //mereni proudu vstup B
  lcd.GotoXY(20,0);
  zapis = String(proud_a,DEC);
  zapis.toCharArray(tisk, 8);
  lcd.LcdString(tisk);
  
  //mereni Pt100 vstup A
  lcd.GotoXY(20,1);
  zapis = String(x,DEC);
  zapis.toCharArray(tisk, 8);
  lcd.LcdString(tisk);
  
  //prepocet na odpor
  lcd.GotoXY(20,2);
  zapis = String(odpor,DEC);
  zapis.toCharArray(tisk, 8);
  lcd.LcdString(tisk);
  
  //prepocet na teplotu
  lcd.GotoXY(20,3);
  zapis = String(teplota,DEC);
  zapis.toCharArray(tisk, 8);
  lcd.LcdString(tisk);
  
  //teplota DS18B20
  lcd.GotoXY(20,4);
  zapis = String(teplota_DS,DEC);
  zapis.toCharArray(tisk, 8);
  lcd.LcdString(tisk);

  delay(5000);
  
}

Seznam použitých komponent:

http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

http://dratek.cz/arduino/998-arduino-ad-prevodnik-24-bit-2-kanaly-hx711-1427807780.html

FB tw

Další podobné články