Na DS18B20 ma upozornil lubo1, keď spomenul, že ho používa ako meranie teploty pre OpenXSensor ( tá jeho verzia OXS sa dá stiahnuť na konci článku tu ). No a keďže ja nie som o nič horší… tak by som také chcel tiež – ale dvakrát.
Prečo dvakrát: lebo DS18B20 nie je až taký drahý, je to digitálne meranie teploty ( digitálne mám rád ) a … FrSky Hub protokol podporuje najviac dve merania teploty.
Hardware.
Ja som použil Arduino Mini Pro + 6 pinový konektor + servokábel + dva DS18B20 snímače + odpor 4k7 + nejaké zvyšky plochého kábla.
Datasheet k DS18B20 je tu. Ja som použil DS18B20 v puzdre TO-92.
Zapojenie servokábla ( výstup sériovej linky a napájanie Arduina ):
Samotné snímače DS18B20 sú zapojené paralelne.
Odpor 4k7 je zapojený na Arduine z pinu č. 3 na VCC.
Snímače DS18B20 som prispájkoval na nejaké zvyšky lepeného kábla. Vyzerá to nejako takto.
Ten Micro JST 1.25 4-Pin Male&Female Connector naľavo je pripravený na pripojenie GPS, pre meranie teploty nie je nutný.
Software.
Software som robil štandardne: opísal som ho 🙁
Prvé, čo som potreboval, bolo prečítanie adresy DS18B20. Výborný článok o meraní teploty s DS18B20 je tuná aj s výborným popisom a programami – vrátane programu na čítanie adresy.
Časť kódu som opísal od modifikácie OpenXSensor.
z jehoNo a komunikáciu do prijímača D8R som ponechal od od R.Schloßhan z predchádzajúceho článku o Model_QID.
Takže čo program vie: číta teplotu z dvoch DS18B20 senzorov + posiela Model_QID kód. Program samotný je možné stiahnuť tu: DS18B20 and ModelQID_for_FrSky_D_v01 .
Komentár k programu:
- pin č.3 Arduina pre komunikáciu s DS18B20 je nastavený na riadku 36
- adresy oboch DS18B20 sú na riadkoch 50, 51
- Model_QID = 12 na riadku 99. Nastavenie Model_QID je rovnaké, ako v predchádzajúcom článku.
- rozlíšenie DS18B20 je nastavené na 10bit – stačí, FrSky Hub protokol umožňuje prenášať teplotu len s rozlíšením 1ºC. Škoda 🙁
- samotné meranie a vysielanie je v troch cykloch: 0ms štart merania – 400ms – prečítanie teploty1 – 700ms – prečítanie teploty2 – 1000ms – odvysielanie dát a zase štart merania. Takže vysielanie je 1x za sekundu.
Skúšanie.
V mrazničke. Do -12ºC fungovalo, ďalej som nechcel trápiť baterku 🙂
Záver:
Funguje to.
.
.
Development zone: OpenXSensor & DS1820.
Actual code: openXsensor_15.
D1 - Code parts:
Temp1, Temp2, Alt - real measurement
AccX - fix value ( Model_QID = 12000)
...if ( ( millis() - lastTempRequest ) >= ds1820Delay ) // waited long enough??
{
lastTempRequest = millis();
ds1820Temp1 = sensors.getTempC(Probe01);
ds1820Temp2 = sensors.getTempC(Probe02);
sensors.requestTemperatures();
test1.value = Model_QID ;
test1.available = true ;
test2.value = ds1820Temp1 ;
test2.available = true ;
test3.value = ds1820Temp2 ;
test3.available = true ;
}
...
D1 – Data chart:
D2 - Code parts:
Alt - real measurement
Temp1, Temp2 - real measurement, but sent fix value.
AccX,Fuel - fix value
void calculateAllFields () {
...if (oXs_Voltage.voltageData.mVolt[0].available)
oXs_Voltage.voltageData.mVolt[0].value = Model_QID ;
} // end of calculate all fields
...
if ( ( millis() - lastTempRequest ) >= ds1820Delay ) // waited long enough??
{
lastTempRequest = millis();
ds1820Temp1 = sensors.getTempC(Probe01);
ds1820Temp2 = sensors.getTempC(Probe02);
sensors.requestTemperatures();
test1.value = Model_QID ;
test1.available = true ;
// test2.value = ds1820Temp1 ;
test2.value = 27 ;
test2.available = true ;
// test3.value = ds1820Temp2 ;
test3.value = 36 ;
test3.available = true ;
}
D2 – Data chart:
D3 - Code parts:
Alt - real measurement
Temp1, Temp2 - no measurement, sent fix value.
AccX,Fuel - fix value
void calculateAllFields () {
...if (oXs_Voltage.voltageData.mVolt[0].available)
oXs_Voltage.voltageData.mVolt[0].value = Model_QID ;
} // end of calculate all fields
...
if ( ( millis() - lastTempRequest ) >= ds1820Delay ) // waited long enough?? { lastTempRequest = millis(); // ds1820Temp1 = sensors.getTempC(Probe01); // ds1820Temp2 = sensors.getTempC(Probe02); // sensors.requestTemperatures(); test1.value = Model_QID ; test1.available = true ; // test2.value = ds1820Temp1 ; test2.value = 27 ; test2.available = true ; // test3.value = ds1820Temp2 ; test3.value = 36 ; test3.available = true ; }
D3 - Data chart:
Actual code: openXsensor_16.
D4 - Sync to data transmitt, 70ms: Temp1, Temp2, Alt - real measurement AccX, Fuel_Level - fix values ( Model_QID) D4 - Data chart:
X6R testing:
D8R testing:
Code:
Oscilloscope:
Communication on OneWire bus – data transmission detail.
Communication on OneWire bus – measurement period.
TIMING PROBLEM.
Legend: YELLOW – TX to receiver, BLUE – OneWire bus
Delay TX to OneWire = approx 130ms – CORRECT
DS1820 measurement period – approx 1.05sec – PROBLEM, SHOULD BE 1SEC
Start od OneWire communication to start of TX – PROBLEM, SHOULD BE 70MS, IS 98.7MS = 70ms + 27ms OneWire communication.
TX to TX time including OneWire communication – PROBLEM, SHOULD BE 200MS, IS 230MS – SEEMS SYSTEM TIME IS INFLUENCED BY ONEWIRE COMMUNICATION.
RPM PROBLEM.
RPM measurement with TLE4905L hall sensor
Green – current, the higher current, the higher RPM should be; Red – RPM,one peak to zero, several peaks up.
Example of peak in table.
Atlitude an RPM: on Alt there are no problems.
RPM test: if ds1820BusCommunication == 1 then RpmValue = RpmPreviousValue
RPM PROBLEM – additional comparement measurement.
A, RPM sensor and two DS18B20 sensors connected, 1s telemetry logs saving period:
B, RPM sensor and two DS18B20 sensors connected, 0.1s telemetry logs saving period:
C, RPM sensor connected, DS18B20 sensors disconnected, 0.1s telemetry logs saving period:
Conclusion: disturbance on RPM measurent was highly probably caused by HW inerference from DS18B20 communication bus to RPM measurement line.
RPM PROBLEM – test of RC filter 10nF + 680R.
Conclusion: necessary to be deeply analyzed 🙂
To be continued.