C++ DallasTemperature library

programski jeziki in programiranje

Moderator: tilz0R

C++ DallasTemperature library

OdgovorNapisal/-a VolkD » 24 Jul 2022, 07:38

Pri izdelavi sw za krmiljenje ure se mi je zgodilo nekaj kar si ne znam razložiti. Prosil bi torej za pomoč.

Uporabljam knjižnico za DS18S20. Da bo bolj natančno, tole knjižnico.
Tu pripenjam del DallasTemperature.h z vsemi komentarji, ki so zraven.

Koda: Izberi vse
// sends command for all devices on the bus to perform a temperature conversion
   void requestTemperatures(void);

   // sends command for one device to perform a temperature conversion by address
   bool requestTemperaturesByAddress(const uint8_t*);

   // sends command for one device to perform a temperature conversion by index
   bool requestTemperaturesByIndex(uint8_t);

   // returns temperature raw value (12 bit integer of 1/128 degrees C)
   int16_t getTemp(const uint8_t*);

   // returns temperature in degrees C
   float getTempC(const uint8_t*);

   // returns temperature in degrees F
    float getTempF(const uint8_t*);

   // Get temperature for device index (slow)
   float getTempCByIndex(uint8_t);


V programu potem kličem ustrezne funkcije, ki mi potem to temperaturo odčitajo:
Del mojega programa:
Koda: Izberi vse
            sensors1.requestTemperatures();
            float temperatura = 0;
            if (deviceCount > 0)
            {
                temperatura = sensors1.getTempCByIndex(0);
            }
            Serial.println(temperatura);


To kar dobim na terminalu je povsem v redu:
Koda: Izberi vse
Temp:25.25
Temperatura je torej 25.25°C.
Če bi poklical funkcijo getTempFByIndex(0) bi dobil temperaturo v stopinjah Fahrenheita. Oboje preizkušeno deluje.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 58584
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 15937 krat
Prejel zahvalo: 9144 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C++ DallasTemperature library

OdgovorNapisal/-a VolkD » 24 Jul 2022, 07:49

Pregled zgornje kode pove, da imam vklučeno float knjižnico, ki pa ni ravno mala stvar. Ker ta float potrebujem samo tu in nikjer več v programu, bi se temu rad izognil.
DS18S20.pdf
(466.99 KiB) Prenešeno 2 krat

V zgornjem dokumentu je na strani 6 lepo razloženo kako so vpisani podatki v temperaturnem registru.
Nič hudo posebnega, vse je rešljivo z nekaj ukazi in to na nivoju integer logike.
Zatakne se že pri branju te vrednosti.

Moja koda:
Koda: Izberi vse
           sensors1.requestTemperatures();
            float temperatura = 0;
            uint16_t wtmp = 0;
            if (deviceCount > 0)
            {
                wtmp = sensors1.getTemp(0);
                temperatura = sensors1.getTempCByIndex(0);
            }
            Serial.println(wtmp);
            Serial.println(temperatura);

mi vrne sledeč rezultat:
Koda: Izberi vse
Temp:58496
25.25

Temperatura je čisto prava, čeprav visoka.
Številka, ki jo dobim pod wtmp je pa kar nekaj.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 58584
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 15937 krat
Prejel zahvalo: 9144 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C++ DallasTemperature library

OdgovorNapisal/-a VolkD » 24 Jul 2022, 07:55

Ker mi tole ni šlo v račun sem začel raziskovati.
S prstom sem prijel za senzor in ga nekaj časa grel.
Rezultat je tukaj:

Koda: Izberi vse
Temp:58496
29.62


Zdaj sem pa povsem zmeden. Številka, ki jo dobim se s spremembo temperature okolice sploh ne spremeni.

Tale knjižnica je že toliko časa objavljena, da ne verjamem, da bi bila to napaka v knjižnici, saj bi verjetno kdo že prej zajokal. Torej delam jaz nekaj narobe. Ali sem funkcijo uporabil narobe, ali pa sem kaj narobe razumel. Ampak kaj ?
Potrebujem torej pomoč.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 58584
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 15937 krat
Prejel zahvalo: 9144 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C++ DallasTemperature library

OdgovorNapisal/-a forest70 » 24 Jul 2022, 08:27

VolkD je napisal/-a:Ker mi tole ni šlo v račun sem začel raziskovati.
S prstom sem prijel za senzor in ga nekaj časa grel.
Rezultat je tukaj:

Koda: Izberi vse
Temp:58496
29.62


Zdaj sem pa povsem zmeden. Številka, ki jo dobim se s spremembo temperature okolice sploh ne spremeni.

Tale knjižnica je že toliko časa objavljena, da ne verjamem, da bi bila to napaka v knjižnici, saj bi verjetno kdo že prej zajokal. Torej delam jaz nekaj narobe. Ali sem funkcijo uporabil narobe, ali pa sem kaj narobe razumel. Ampak kaj ?
Potrebujem torej pomoč.

Seveda ne!
to kar dobiš je error code ....
// Error Codes
#define DEVICE_DISCONNECTED_C -127
#define DEVICE_DISCONNECTED_F -196.6
#define DEVICE_DISCONNECTED_RAW -7040
58496 = 1110 0100 1000 0000
-7040 = 1110 0100 1000 0000
If you pay in bananas, you got monkeys.
Uporabniški avatar
forest70
 
Prispevkov: 2710
Pridružen: 14 Jan 2015, 00:11
Kraj: Koper
Zahvalil se je: 483 krat
Prejel zahvalo: 618 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 132

Re: C++ DallasTemperature library

OdgovorNapisal/-a forest70 » 24 Jul 2022, 08:33

Tu je tvoj problem
Koda: Izberi vse
int16_t DallasTemperature::getTemp(const uint8_t* deviceAddress)

funkcija zahteva naslov, ne pa index kot ga ti vpišeš.
If you pay in bananas, you got monkeys.
Uporabniški avatar
forest70
 
Prispevkov: 2710
Pridružen: 14 Jan 2015, 00:11
Kraj: Koper
Zahvalil se je: 483 krat
Prejel zahvalo: 618 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 132

Re: C++ DallasTemperature library

OdgovorNapisal/-a forest70 » 24 Jul 2022, 08:44

Načeloma bi to moralo delovat.
bool result;
uint8_t* deviceAddress;
result=sensors1.getAddress(&deviceAddress, 0) ;
wtmp = sensors1.getTemp(deviceAddress);
If you pay in bananas, you got monkeys.
Uporabniški avatar
forest70
 
Prispevkov: 2710
Pridružen: 14 Jan 2015, 00:11
Kraj: Koper
Zahvalil se je: 483 krat
Prejel zahvalo: 618 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 132

Re: C++ DallasTemperature library

OdgovorNapisal/-a VolkD » 24 Jul 2022, 09:05

Nekaj ne bo šlo prav.
Koda: Izberi vse
            sensors1.requestTemperatures();
            float temperatura = 0;
            uint16_t wtmp = 0;
            if (deviceCount > 0)
            {
                uint8_t* deviceAddress;
 
                sensors1.getAddress(deviceAddress, 0) ;
                wtmp = sensors1.getTemp(deviceAddress);
//                wtmp = sensors1.getTemp(0);
                temperatura = sensors1.getTempCByIndex(0);
            }
            Serial.println(wtmp);
            Serial.println(temperatura);


Tole povzroči, da se zadeva obesi. Nekaj s temi naslovi ne bo v redu. Z &deviceAddress se ne prevede.
Ker result ne rabim, ga lahko izpustim. Drugače joka,...
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 58584
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 15937 krat
Prejel zahvalo: 9144 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C++ DallasTemperature library

OdgovorNapisal/-a mirkatmir » 24 Jul 2022, 09:46

Na tvojem linku za knjižnico je v read.me navedeno tole:
DS18S20.jpg
lp, Miran (Miro S51SK)
Uporabniški avatar
mirkatmir
 
Prispevkov: 1352
Pridružen: 14 Jan 2015, 21:05
Kraj: Ribnica - JN75IR
Zahvalil se je: 164 krat
Prejel zahvalo: 308 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 47

Re: C++ DallasTemperature library

OdgovorNapisal/-a forest70 » 24 Jul 2022, 09:48

Koda: Izberi vse
DeviceAddress  deviceAddress1;
 sensors1.getAddress(deviceAddress1, 0);
 wtmp = sensors1.getTemp(deviceAddress1);

Npačna deklaracija pointerja na address
Sedaj dela.
If you pay in bananas, you got monkeys.
Uporabniški avatar
forest70
 
Prispevkov: 2710
Pridružen: 14 Jan 2015, 00:11
Kraj: Koper
Zahvalil se je: 483 krat
Prejel zahvalo: 618 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 132

Re: C++ DallasTemperature library

OdgovorNapisal/-a VolkD » 24 Jul 2022, 09:59

Zdaj pa JA!
Koda: Izberi vse
Temp:3392
26.50


Če tole številko - 3392 podelim z 128 dobim 26. Ostanek je seveda 64, kar je natanko pol od 128. Nobene float matematike :)


Hvala vsem za pomoč!
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 58584
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 15937 krat
Prejel zahvalo: 9144 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: C++ DallasTemperature library

OdgovorNapisal/-a forest70 » 24 Jul 2022, 10:08

Saj ni čudno, da se je zaciklal ....
deklaracija DeviceAddress je ta:
typedef uint8_t DeviceAddress[8];
If you pay in bananas, you got monkeys.
Uporabniški avatar
forest70
 
Prispevkov: 2710
Pridružen: 14 Jan 2015, 00:11
Kraj: Koper
Zahvalil se je: 483 krat
Prejel zahvalo: 618 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 132


Vrni se na Software

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost