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.
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