[ pisac @ 16.07.2009. 07:02 ] @
Treba mi jednostavan mali digitalni termometar sa što manjim brojem žica, koji može jednostavno da se čita preko nekog PIC-a (npr: 16F877) prozivanjem adrese termometra.

Treba da postavim nekih 10-15 termometra (a možda i više) i sve bi ih povezao na jednu sabirnicu (bus), tako da treba da podržava takav rad. Znači, povežem ih paralelno, a onda sa PIC-a prozivam neki od njih i dobijam podatak o temperaturi.

Postoji li tako nešto? Ako postoji, da li postoji i vodootporna varijanta?

Sad baš čitam temu o DS1820, čini mi se (ovako na brzinu) da je to upravo to što tražim. Da li ima nešto jednostavnije/bolje/jeftinije od toga, ili neka slična alternativa?



P.S. Ako slučajno znate i gde to može da se kupi u Beogradu, pošaljite mi tu informaciju privatnom porukom. Može i informacija u inostranstvu (evo baš planiram put kroz Nemačku i Francusku, pa dajte informacije gde to tamo da potražim).

Poz.
[ Sepa011 @ 16.07.2009. 09:07 ] @
DS18B20 i, kao sti si sam napisao, 1 bus od 2/3 zice, sta ces manje?

Kada napises vodootporna da li mislis na potapajuce ili samo otporno na kisu... (waterresistant vs waterproof)?
[ pisac @ 16.07.2009. 13:13 ] @
Vodootporno u bilo kom pogledu. Što otpornije, to bolje.

Koliko se kreće cena tog DS18B20? Jel jeftiniji u Srbiji ili u inostranstvu (baš planiram put, pa sam mislio da kupim tamo gde je jeftiniji)?
[ Sepa011 @ 16.07.2009. 16:02 ] @
U Kelco (radio klub):
DS18B20+: 285,13 din (1-9 kom) | 256,62 din (10-99 kom) | 199,58 din ( 100 kom)
[ pisac @ 16.07.2009. 19:08 ] @
E, sad, zašto mi treba vodootpornost: Imam nameru da postavim više tih termometra na strateškim mestima tokom gradnje kuće. Jedan ide u betonski stub, jedan u ploču, nekoliko u sendvič zid (po slojevima), a nekoliko ide i u zemlju na određenim mestima (i dubinama). Biće tu i solarni kolektor i slične stvari. Ostatak ide po sobama :-)

Dakle, jeli ovaj DS18B20 vodootporan? Ako nije, kako da se napravi da bude (da ga zalijem u plastiku iz onog pištolja)?

Koliko često crkavaju, i koja je razlika medju modelima (vidim da ima DS1820, DS18B20, DS18B20+...)?
[ Sepa011 @ 16.07.2009. 21:54 ] @
Razlike?

Uradi domaci, poskidaj podatke o istima sa Maxim/Dallas sajta.
Generalno, razlika je u rezoluciji. Vodootpornost: kada zalemis zice na izvode, kao sto si i sam rekao, lepo zalijes vrucim lepkom iz pistolja i postaras se da vlaga ne dodje do spojeva koje si napravio, ali ni do izvoda senzora ('pojesce' ih korozija (pogotovu one u betonu) doks si reko keks).
[ rsinisa @ 16.07.2009. 23:42 ] @
Proveri prvo do koje dužine žica radi DS1820. Do sada sam ih stavljao na nekih 20-ak cm, ali sam jednom prilikom na brzinu probao na 10m i nije radilo. Nisam imao vremena, a ni potrebe da ustanovim tačnu dužinu, ali svakako obrati pažnju na to.

Pozdrav.
Sinisha
[ magnat @ 17.07.2009. 08:06 ] @
Evo i ja malo da se ukljucim

Uvek sa za takva merenja ostavlja mesto za sonde, znachi shira cevchica u zidu, podu ili negde drugde, a potom pri zavrsetku gradjevinskih
radova postavljaju se sonde i ozicenje.
Ako su veche daljine od 1m ne moze se meriti direktno, mora se koristiti neki prrenos npr 485, ali to poskupljuje i komplikuje.
Mozda meriti analogno neki ntc senzor sve zavisi od projektnog zadatka tj. zeljenih rezultata i tacnosti.
Pozdrav.
[ Stojan Trifunovic @ 19.07.2009. 22:23 ] @
DS18S20 je po datasheet-u tacna oznaka onoga sto mnogi (nepravilno)
zovu DS1820. Problem je u tome sto na samom kolu pise DS1820, pa otuda
greske. Rezolucija mu je 9 bitova (0,5 stepeni), ali se moze
softverskim trikovima (ocitavanjem COUNT_REMAIN registra) povecati na
cak 12 bitova. Potpuno isto koliko ima i DS18B20 koji je (uglavnom)
skuplji.

Glavna, u stvari sustinska razlika izmedju ova dva kola je sto je
programiranje mikrokontrolera za DS18B20 lakse od programiranja za
DS18S20. I sa jednim i sa drugim kolom moguce je postici temperaturnu
rezoluciju od 0,0625 stepeni.

DS18B20 ima jos jednu prednost. Ocitavanje temperature iz njega je
brze, jer je dovoljno ocitati samo dva, i to dva pocetna registra da
bi se doslo do rezultata, dok se kod DS18S20 moraju ocitati skoro svi
registri da bi se doslo do COUNT_REMAIN registra.

DS18S20 inace podnosi i oko 1,5m duzine. Bar primerak koji ja
posedujem. Nisam imao potrebe da ga probam na vecim daljinama.
[ rsinisa @ 20.07.2009. 09:46 ] @
Citat:
Stojan Trifunovic: DS18S20 je po datasheet-u tacna oznaka onoga sto mnogi (nepravilno) zovu DS1820. Problem je u tome sto na samom kolu pise DS1820, pa otuda greske.

Delimično si u pravu. Prvo jeste izbačen DS1820, ali je imao neku grešku (ne sećam se detalja, pravo je neku malu grešku oko nule, ako se dobro sećam), pa su prozveli verziju sa S kod koje je taj problem rešen.

Pozdrav.
Sinisha
[ Sepa011 @ 20.07.2009. 11:19 ] @
Citat:
Stojan Trifunovic: DS18S20 je po datasheet-u tacna oznaka onoga sto mnogi (nepravilno)
zovu DS1820. .

Jeste, al ima i DS18B20 koji ima 12-to bitnu rezoluciju (moze da se konfigurise i ka 9, 10 i 11-to bitni). Prema tome nije nepravilno napisati DS1820, posto i taj senzor postoji, kao i DS18S20 i DS18B20.
Ja preferiram ovaj poslednji
[ Stojan Trifunovic @ 20.07.2009. 13:04 ] @
Izgleda da im je ostao isti kalup za kuciste, pa su ga nastavili
upotrebljavati. Mrzelo ih je da mu dodaju ono slovo S. :(
[ pisac @ 01.08.2009. 20:53 ] @
Citat:
Sepa011: U Kelco (radio klub):
DS18B20+: 285,13 din (1-9 kom) | 256,62 din (10-99 kom) | 199,58 din ( 100 kom)


Nema ga trenutno (DS18B20). Dajte hitno drugo mesto gde ga ima.
[ zofr @ 01.08.2009. 21:54 ] @
Za ono sto ti treba, kako si opisao, ne racunaj na resenje koje je skoro dzabe. Ja bih na tvom mestu sve to uradio sa PT100. Jeste da trebas da imas jedan analogni multiplekser i prilagodjenje signala sa PT100, i da ces, sobzirom na udaljenost senzora, morati da vodis po 4 zice za svaki PT100, ali ces imati pouzdanije i trajnije resenje. Senzor je najbolje zaliti masom za zalivanje kablovskih glava. Ta masa je dvokomponentna i savrseno obezbedjuje vodootpornost.

Pozdrav.

[ VRadule @ 02.08.2009. 01:23 ] @
Uzmi ds18s20 to ti je skroz isto.

I "B" i "S" verziji je accuracy +/-0.5 stepeni, tako da je rezolucija veća od 0.5 stepeni pomalo bez smisla IMHO.

Ako već hoćeš da ih ubetoniraš, onda mislim dA bi ti bilo bolje da za svaki senzor izvučeš posebno žice, ako ti se negde ošteti žica na BUS sistemu
možeš izgubiti gomilu senzora, a ovako gubiš samo jedan.

Ja bih takođe na svaku OW žicu na servisno pristupačnom mestu postavio po jednu supresor diodu za 5,6V. (nisam probao - ko zna, možda ometa komunikaciju)

U svakom slučaju da ubetonirani senzor zaslužuje da bude zaštićen do kraja.

[ pisac @ 03.08.2009. 00:51 ] @
Koliko sam pročitao, kod 18s20 konvertovanje uvek traje 750ms, dok 18b20 konvertuje za samo 94ms pri najmanjoj tačnosti (9 bita, 0.5 stepeni). To je ipak drastična razlika, naročito kada imam mnogo senzora koje čitam uzastopno.

Tražim na netu ko ima 18b20, ali ne mogu da nadjem. Ako znate, dajte telefon neke dobro snabdevene radnje.
[ Stojan Trifunovic @ 03.08.2009. 09:33 ] @
Da, trajanje konverzije jeste duze, ali to trajanje odnosi se samo na
period merenja. Usteda u vremenu citanja senzora nije velika, ukoliko
napisete softver tako da svi senzori mere temperaturu istovremeno.

Napravite li tako kako zelite softver koji redom adresira pojedinacne
senzore (i daje im komandu za merenje), vreme cekanja za 10 senzora ce
biti duze od istovremenog merenja.

Napravite li softver tako da svim senzorima zadate da otpocnu merenje,
onda mozete samo da sacekate da svi zavrse sa merenjem (750mS) i da
iscitate podatke iz svih (redom, ali ovo vreme se moze zanemariti).
Vreme merenja bice nesto duze (zbog zadavanja komandi redom) od
merenja samo jednog senzora, ali ce se vreme merenja za sve senzore
smanjiti na vreme potrebno za merenje temperature samo jednog senzora
(otprilike).

I da, softver je opet slozeniji. Postupak bi za eksterno napajanje
(3-zicno vezivanje) isao otprilike ovako:

1. Reset (inicijalizacija svih senzora)
2. Skip ROM (adresira sve senzore)
3. Convert T (pocetak merenja za sve senzore)
4. Sacekati dok svi senzori ne zavrse konverziju i ne puste liniju

5. Reset (inicijalizacija svih senzora)
6. Match ROM (adresiranje samo zeljenog senzora)
7. Read scratchpad (citanje temperature samo iz zeljenog senzora)

Tacke od 5 do 7 ponavljaju se za svaki pojedinacni senzor.
Potrebno je naravno prilikom pocetne inicijalizacije mikrokontrolera
iscitati ROM kod svakog pojedinacnog senzora kako biste ih uopste
mogli pojedinacno adresirati.
[ pisac @ 03.08.2009. 10:35 ] @
Otkad sam zadnji put pisao program za PIC (u asembleru) prošlo je bogami jedno 8 godina. Tako da ću imati malo posla oko podsećanja :-)

Nego, mogu li ja da kombinujem na isti BUS obe vrste senzora?

I uzgred, kakva su iskustva sa crkavanjem ovih senzora? Šta mi vredi da ga zalijem u beton, ako će da crkne posle par godina.
[ branko_g @ 03.08.2009. 11:13 ] @
Ja mislim da je ta ideja o zalivanju u beton prilično problematična jer če se sva naprezanja u
betonu prenositi direkto na senzor, ma kakav on bio, a on to ne voli.

Umesto toga bih u zid stavio neku bakarnu cevčicu koja je nekih dva-tri milimetra veća od samog senzora,
napunio je termoprovodnom silikonskom masti pa tek onda nagurao senzor.
A kao senzor bih uzeo nešto sasvim prizemno-> KTY81 ili nešto skuplji Pt1000,
i svaki posebno doveo do jedne razvodne kutije u koju bih stavio taj PIC(ili neki drugi uC) sa
RS232 interfejsom koji bi onda spajao na PC ili šta već.
Ovako može da se desi da senzor posle par dana , nedelja ili meseci prestane da radi i sav trud bi
bio uzaluda.

Pozdrav
[ Stojan Trifunovic @ 03.08.2009. 12:02 ] @
Ne vidim ikakav razlog zbog cega obe vrste senzora ne bi mogle raditi
na istom BUS-u. Stavise, zbog cega se SVE komponente sa 1-wire
interfejsom ne bi mogle raditi istovremeno. Znaci, na busu moze, ali
komande za senzore su nesto drugacije, tako da takvo kombinovanje ipak
ne bih preporucio (tezi i duzi program, nista drugo).

DS18S20 kod mene u bojleru radi mesecima bez ikakvih problema. Povezan
je trozicno. Ipak, direktno zalivanje u beton kao ni Branko ne bih
mogao preporuciti. Poslusajte njegov savet. Cevcica i senzor u nju.
Mozda bi bilo prakticnije da se cevcica ne puni pastom, vec da se samo
zapusi sa strane na kojoj izlaze provodnici (npr. sa malo gipsa ili
stiropora) kako bi se senzori mogli menjati u slucaju eventualnog
kvara. Takodje bi dobro bilo da se sa strane na kojoj izlaze
provodnici ne stavlja bakar, vec npr. da se bakarna cevcica nastavlja
na plasticnu kako ne bi prenosila unutrasnju toplotu do senzora.
Temperatura mozda nece biti toliko azurna kao uz direktno zalivanje u
beton, ali ne verujem da bi Vam odstupanje od par delova stepeni moglo
smetati.

Buduci da Vam je potrebna veca kolicina senzora sa duzim linijama, ne
verujem da cete moci proci bez ikakvog drajvera. Mislim da je sa
obzirom na cenu po senzoru (odnosno po senzoru i po drajveru)
jeftinije ici na analogno resenje.
[ pisac @ 03.08.2009. 12:38 ] @
Problem je u tome što sam ja digitalni tip, nešto slabo poznajem analognu elektroniku :-)

Zato mi digitalni senzor savršeno odgovara: Povežem, programiram, i uživam.
[ branko_g @ 03.08.2009. 13:17 ] @
Citat:
Problem je u tome što sam ja digitalni tip, nešto slabo poznajem analognu elektroniku :-)

Zato mi digitalni senzor savršeno odgovara: Povežem, programiram, i uživam.


Pa svaki uC, ako nije najjeftiniji ima ugrađen ADC, baš za te svrhe.
Analogna tehnika bi se u slučaju KTY81 svela na još jedan otpornik male tolerancije(1% i manje) i
po RC-kolo na ulazima ADC-a. Ostalo se svodi na "Povežem, programiram, i uživam".
Uostalom evo i linka:
http://www.sprut.de/electronic/temeratur/temp.htm#ptc

[ pisac @ 03.08.2009. 19:08 ] @
Ček, a kako da povežem 20 ili više analognih senzora na jedan PIC?
[ Sepa011 @ 03.08.2009. 20:10 ] @
Posto su se pojedine kolege vezale za analogne senzore, i pocele da pominju preciznost (+/- nesto), kada su duzine kablova za komunikaciju sa DS18x20 u pitanju, ima atacmenta u temi http://www.elitesecurity.org/t370986-DSS-duzina-kabla , samo treba malko procitati.

Sto se preciznosti tice, sve, ama bas sve, se moze kalibrisati (ni Pt-100 nije apsolutno tacan, a kamoli kojekakvi KTY,...)
[ branko_g @ 04.08.2009. 07:51 ] @
Citat:
Ček, a kako da povežem 20 ili više analognih senzora na jedan PIC?


Analognim multiplekserom? Uostalom puti Google na pašu(što bi rekao Odin_D).

Sad se ne bi upuštao u svrsishornost tog analognog rešenja u poređenju sa rešenjem na bazi BUS-veze.
Sigurno da taj princip umrežavanja više od 10 senzora preko BUS-a ima prednosti u odnosu na
čisto analogna rešenja.
Samo mi se čini da posatvljač teme(pisac) ima samo maglovitu predstavu o svom "projektu" i da nije
mislio o svim aspektima svog koncepta.
I sama predstava "Povežem, programiram, i uživam" je prilično smela, realistično je očekivati probleme,
pogotovu kada čovek veruje u sebe kao programer ali mu nedostaje znanje iz elektronike-elektrike.

Pozdrav.
Branko
[ pisac @ 04.08.2009. 08:55 ] @
Problema uvek ima, ali pošto sam ja digitalni tip :-) onda ću ih mnogo lakše rešiti ako su problemi samo digitalni.

Eto, šta recimo sa dužinom kabla kod analognih senzora? Kod digitalnih mi dužina nije bitna za izračunavanje temperature: ili radi ili ne radi. Kod analognih i dužina unosi neki otpor, i taj otpor se menja sa temperaturom, a tu ulaze i neke smetnje koje mogu da izmene merenje, itd...

Ipak mi digitalno rešenje deluje mnogo jednostavnije.
[ branko_g @ 04.08.2009. 10:51 ] @
pisac wrote:
Citat:
Eto, šta recimo sa dužinom kabla kod analognih senzora?

Izmeri se otpor tog kabla i oduzme kao konstanta od izmerene vrednosti.
Citat:
Kod digitalnih mi dužina nije bitna za izračunavanje temperature: ili radi ili ne radi.

Za izračunavanje temperature ne, ali za stabilnost te serijske komunikacije je i te kako
bitno kakav kabel se koristi i kako i gde se polaže. Kažem još jednom za stabilnost veze,
jer se može desiti da veza radi mesecima i onda počinje da brlja , bez vidnog razloga, da bi posle nekog vremena potpuno "pukla".
Ili recimo radi sve lepo i ti se odlučiš da priključiš još jedan senzor, za recimo merenje spoljne temperature,
provučeš kabel, spojiš ga kad ono više ne funkcionira komunikacija ni sa jednim senzorom.

Ne kažem da do toga mora doći, ali je tvoja predstava o "digitalnom svetu" koji radi ili ne radi prilično optimistična.
Naprotiv, to što se dešava na BUS-u je čista analogna tehnika sa stojim karakteristikama: vreme uspona i pada
signala, specifični otpor induktivitet i kapacitet kablova, refleksija...
Ti singali na BUS-u su čisto analogni i tek se u PIC-u ili senzoru pretvaraju u digitalne i od tih
analognih vrednosti se onda rekonstruiše ne samo logički nivo nego i samo trajanje impulsa.
Sam 1-wire bus je prilično neotporan na spoljašnje smetnje i kao "kućni bus" ne predstavlja najbolje
rešenje, kao uostalom i TWI(I2C).
Za to je bolje koristiti BUS koji radi na principu diferencije napona signala(RS485, CAN) jer se kod
njih injektovane smetnje potiskuju za faktor 100 pa naviše.

Jeste da je rešenje sa analognim senzorima komplikovanjie, što se tiče polaganja kablova,
ali se sa druge strane injektovane smetnje daju eliminisati jednostavnim RC-kolima.
Kod BUS sistema(bilo koje vrsta) je to nemoguće.

Probaj da napraviš to sve "na otvorenom" pa se javi sa rezultatima.

Posdrav.

P.S. Da li je neko od vas i napravio takav sličan 1-wire sistem koji uspešno radi?

[ pisac @ 10.03.2012. 22:38 ] @
Evo da javim da od septembra prošle godine rade senzori, ali spojeni na PC, gde se i loguju temperature u MySQL.

Ima ih (za sada) aktivnih 35 komada, ali je samo 17 pravih senzora koji su u zidovima i podovima, a ostali su samo ubodeni na testnoj ploči i čekaju ugradnju dok u međuvremenu pune bazu sa temperaturama (taman da pratim kolike se razlike javljaju među senzorima).

Rade u parazitnom režimu, preko open source softvera i prostog adaptera koji se nalemi na bus i bocne u serijski port.

E, sada, greške u radu:

U početku je 35 senzora bilo maksimum koji je mogao da se nakači, jer je preko tog broja čitanje trajalo predugo i gazilo ga je sledeće čitanje (čita se iz cron-a svakih 5 minuta). Čitanje je naravno trajalo predugo zbog grešaka i ponavljanja, a ne zbog broja senzora. Međutim, mislim da je uzrok tome bila sama testna ploča (na kojoj je 18 senzora) a ne pravi senzori na kablu. Preraspoređivanjem senzora na testnoj ploči i boljim vezivanjem kabla koji je do nje vodio, izgleda da je taj problem rešen. Sada (već mesecima) čitanje svih 35 senzora traje 38-45 sekundi.

Posle par meseci dva senzora koja su blizu jedan drugog u betonu, izgubili su rezoluciju, odnosno umesto 16 koraka u jednom oC, sada rade samo na 8 koraka. Recimo: temperatura sa 20 skoči na 20.125 pa na 20.25, i tako dalje, umesto da ide 20->20.0625->20.125->20.1875->20.25.

Sem toga, u proseku se jednom dnevno dešava da neki (bilo koji) senzor očita 85oC (tj. ne očita temperaturu), Ali to i nije strašno, jer se čitanje obavlja svakih 5 minuta na 35 senzora, odnosno 10080 čitanja dnevno, pa je procenat pogrešnih čitanja dakle 0.1‰

Međutim, ima jedan senzor (u gipsanom zidu) koji je počeo da pravi ozbiljnije ispade. U Januaru je u jednom čitanju dao 52.125oC, iako je pre i posle radio sasvim tačno. U Februaru je već 3 puta zeznuo, i to gadnije: Prvo je 19.februara u jednom trenutku izmerio 530oC, pa je 20.februara izmerio -1511.25oC, a 27.februara -1638.25oC. Inače, i pre i posle svakog tog pogrešnog čitanja daje sasvim normalne vrednosti.

Inače, kada pustim neki uređaj u kući da varniči i pravi smetnje na električnoj mreži (recimo prekidač za svetlo držim na granici tako da varniči), onda se nekada dešavaju greškice u čitanju ponekog senzora koje se svode na to da temperatura bude veća za nekoliko koraka. Recimo umesto 20 očita se 20.1875
[ ZAS011 @ 11.03.2012. 08:43 ] @
@pisac
Cini mi se da imas povremenih problema sa komunikacijom.
Citat:
Prvo je 19.februara u jednom trenutku izmerio 530oC, pa je 20.februara izmerio -1511.25oC, a 27.februara -1638.25oC.

Ovo nisu moguce vrednosti koje DS18B20 moze da posalje na 1-wire bus. Pretresi malko program koji ti iscitava senzore i izfiltriraj sve sto ima vise od 12 bit-a u rezultatu.
A mozes i da skratis vreme iscitavanja senzora ,a nacin kako ti je to Stojan svojevremeno napisao
Citat:
1. Reset (inicijalizacija svih senzora)
2. Skip ROM (adresira sve senzore)
3. Convert T (pocetak merenja za sve senzore)
4. Sacekati dok svi senzori ne zavrse konverziju i ne puste liniju

5. Reset (inicijalizacija svih senzora)
6. Match ROM (adresiranje samo zeljenog senzora)
7. Read scratchpad (citanje temperature samo iz zeljenog senzora)

Tacke od 5 do 7 ponavljaju se za svaki pojedinacni senzor.
Potrebno je naravno prilikom pocetne inicijalizacije mikrokontrolera
iscitati ROM kod svakog pojedinacnog senzora kako biste ih uopste
mogli pojedinacno adresirati.

Inace, mnogo je lepse napojiti senzore trozicno, pasiva je ok za 1 senzor ali za vise od toga trozicno.
[ pisac @ 23.03.2012. 20:27 ] @
Ma ko će da kopa po sorsu, ne stižem ni ovo što radim za pare a kamoli ovo što mi je hobi

Evo svih pogrešno izmerenih vrednosti (ne računajući 85oC što sam izbacio iz spiska):

Code:

mysql> select * from T where (temp>"35" or temp<"-15") and temp!="85" order by vreme;
+---------------------+------------+-----------+
| vreme               | temp       | ime       |
+---------------------+------------+-----------+
| 2012-01-22 21:40:51 |    52.1250 | Sobica_Z2 |
| 2012-02-19 15:30:48 |   530.0000 | Sobica_Z2 |
| 2012-02-20 16:55:44 | -1511.2500 | Sobica_Z2 |
| 2012-02-27 17:20:46 | -1638.2500 | Sobica_Z2 |
| 2012-03-22 14:10:42 | -1217.1875 | Sobica_P2 |
+---------------------+------------+-----------+


Eto, u međuvremenu se pojavila čudna vrednosti i na podnom senzoru (Sobica_P2) koji je inače u istom delu prostorije kao zidni senzor (Sobica_Z2), samo u podu

Ne razumem baš tu logiku, u Sobi dva senzora koja su relativno blizu jedan drugome su izgubili rezoluciju, a ovde dva senzora (opet blizu jedan drugome) pokazuju čudne vrednosti. A pri tome ni na jednom mestu nema nekakvog zračenja, čak nisu ni blizu strujnih utičnica.

Jedina činjenica koja može da znači nešto, jeste da su ta dva senzora u Sobici spojena na isti čvor, i pri tome je taj čvor zadnji. Odnosno, tu je (za sada) kraj magistrale. A ova dva senzora koja su igubila rezoluciju su na drugom čvoru magistrale koji je oko 5m od prvog čvora. Na prvom čvoru je spojen kompjuter, jedan podni senzor, i probna ploča sa nabodenim ostalim senzorima.
[ ZAS011 @ 23.03.2012. 22:14 ] @
Ti ne citas sta ti se pise, ili nisi dobro procitao datasheet.

530 stepeni i -hiljaduikusur nisu moguce vrednosti koje senzor moze da posalje. Negde ti je matematika preracunavanja losa.

'Vako se cita senzor sa PIC-om

Code:
IscitajSenzor:
    OWrite Dq, 1, [$CC,$44]
    Repeat
        DelayMS 25
        ORead Dq, 4, [C]
    Until C <> 0
    OWrite Dq, 1, [$CC, $BE]
    ORead Dq, 2, [Temperature.LowByte,Temperature.HighByte]
    Temperature = Temperature & %0000111111111111     <=== Maskiranje 12 bitova
    If Temperature.11 = 1 Then
        Predznak = "-"
        Temperature = ~Temperature + 1
    Else
        Predznak = "+"
    EndIf
    Celo = Temperature >> 4
    Deci = (Temperature.LowByte & %00001111) * 100 / 16
Return


prikaz gornjega je sa 2 decimale.

Kao sto se moze videti, u "opticaju" je samo 12 bitova

[Ovu poruku je menjao ZAS011 dana 25.03.2012. u 13:13 GMT+1]
[ pisac @ 24.03.2012. 22:25 ] @
Heh, razumem ja tebe, ali je zanimljiva stvar što se to dešava samo na tom jednom senzoru (u stvari, sad su dva senzora, oba na istoj tački).

Sors je poveliki... samo glavni program ima 2900 linija, a ima i dodatnih fajlova.

Evo ovo je valjda suština, ako sam dobro utvrdio ovako na brzinu, pa ako imaš vremena i entuzijazma za kopanje po sorsu... :


Code:

/* -----------------------------------------------------------------------
   Read the temperature from one sensor

   Return the high-precision temperature value

   Calculated using formula from DS1820 datasheet

   Temperature   = scratchpad[1]
   Sign          = scratchpad[2]
   TH            = scratchpad[3]
   TL            = scratchpad[4]
   Count Remain  = scratchpad[7]
   Count Per C   = scratchpad[8]
   CRC           = scratchpad[9]
   
                   count_per_C - count_remain
   (temp - 0.25) * --------------------------
                       count_per_C

   If Sign is not 0x00 then it is a negative (Centigrade) number, and
   the temperature must be subtracted from 0x100 and multiplied by -1
   ----------------------------------------------------------------------- */
int read_temperature( int sensor_family, int sensor )
{
  char    temp[1024];              /* For output string                    */
  unsigned char lastcrc8,
                scratchpad[30],    /* Scratchpad block from the sensor     */
                TempSN[8];
  int     x,
          j,
          try,                     /* Number of tries at reading device    */
          strong_err,              /* Error with strong pullup?            */
          ds1820_try,              /* Allow ds1820 glitch 1 time           */
          ds18s20_try;             /* Allow DS18S20 error 1 time           */
  float   temp_c,                  /* Calculated temperature in Centigrade */
          hi_precision;

  x = 0;  
  ds1820_try = 0;
  ds18s20_try = 0;  
  temp_c = 0;
  
  for( try = 0; try < MAX_READ_TRIES; try++ )
  {
    if( owAccess(0) )
    {
      /* Convert Temperature */
      if( !owWriteBytePower( 0, 0x44 ) )
      {
        return FALSE;
      }

      /* Sleep for conversion second */
      msDelay( read_time );
      
      /* Turn off the strong pullup */
      if( owLevel( 0, MODE_NORMAL ) != MODE_NORMAL )
      {
        strong_err = 2;
      }


      /* Now read the scratchpad from the device */
      if( owAccess(0) )
      {
/* Use Read_Scratchpad instead? */
        /* Build a block for the Scratchpad read */
        scratchpad[0] = 0xBE;
        for( j = 1; j < 10; j++ )
          scratchpad[j] = 0xFF;

        /* Send the block */
        if( owBlock( 0, FALSE, scratchpad, 10 ) )
        {
          /* Calculate the CRC 8 checksum on the received data */
          setcrc8(0, 0);
          for( j = 1; j < 10; j++ )
            lastcrc8 = docrc8( 0, scratchpad[j] );

          /* If the CRC8 is valid then calculate the temperature */
          if( lastcrc8 == 0x00 )
          {
            /* DS1822 and DS18B20 use a different calculation */
            if( (sensor_family == DS18B20_FAMILY) ||
                (sensor_family == DS1822_FAMILY) ||
                (sensor_family == DS28EA00_FAMILY) ||
                (sensor_family == DS1923_FAMILY) )
            {
              short int temp2 = (scratchpad[2] << 8) | scratchpad[1];
              temp_c = temp2 / 16.0;
            }

            /* Handle the DS1820 and DS18S20 */
            if( sensor_family == DS1820_FAMILY )
            {
              /* Check for DS1820 glitch condition */
              /* COUNT_PER_C - COUNT_REMAIN == 1 */
              if( ds1820_try == 0 )
              {
                if( (scratchpad[7] - scratchpad[6]) == 1 )
                {
                  ds1820_try = 1;
                  continue;
                } /* DS1820 error */
              } /* ds1820_try */
            
              /* Check for DS18S20 Error condition */
              /*  LSB = 0xAA
                  MSB = 0x00
                  COUNT_REMAIN = 0x0C
                  COUNT_PER_C = 0x10
              */
              if( ds18s20_try == 0 )
              {
                if( (scratchpad[4]==0xAA) &&
                    (scratchpad[3]==0x00) &&
                    (scratchpad[7]==0x0C) &&
                    (scratchpad[8]==0x10)
                  )
                {
                  ds18s20_try = 1;
                  continue;
                } /* DS18S20 error condition */
              } /* ds18s20_try */
          
              /* Convert data to temperature */
              if( scratchpad[2] == 0 )
              {
                temp_c = (int) scratchpad[1] >> 1;
              } else {
                temp_c = -1 * (int) (0x100-scratchpad[1]) >> 1;
              } /* Negative temp calculation */
              temp_c -= 0.25;
              hi_precision = (int) scratchpad[8] - (int) scratchpad[7];
              hi_precision = hi_precision / (int) scratchpad[8];
              temp_c = temp_c + hi_precision;
            } /* DS1820_FAMILY */
            
            /* Log the temperature */
            switch( log_type )
            {
              /* Multiple Centigrade temps per line */
              case 2:     sprintf( temp, "\t%3.2f", temp_c );
                          log_string( temp );
                          break;

              /* Multiple Fahrenheit temps per line */
              case 3:     sprintf( temp, "\t%3.2f", c2f(temp_c) );
                          log_string( temp );
                          break;

              default:    owSerialNum( 0, &TempSN[0], TRUE );
                          log_temp( sensor, temp_c, TempSN );
                          break;
            } /* switch( log_type ) */

            /* Show the scratchpad if verbose is seelcted */
            if( opts & OPT_VERBOSE )
            {
              show_scratchpad( scratchpad, sensor_family );              
            } /* if OPT_VERBOSE */

            /* Good conversion finished */
            return TRUE;
          } else {
            fprintf( stderr, "CRC Failed. CRC is %02X instead of 0x00\n", lastcrc8 );

            if (try == MAX_READ_TRIES - 1)
            {
              /* need to output something (0,-,NaN?) to keep columns consistent */
              switch( log_type )
              {
                /* Multiple Centigrade temps per line */
                case 2:
                 /* Multiple Fahrenheit temps per line */
                 case 3:     sprintf( temp, "\t%3.2f", (double) 0 );
                             log_string( temp );
                             break;
             
                 default:
                             break;
               } /* switch( log_type ) */
            } /* if tries == max_read_tries */

            if( opts & OPT_VERBOSE )
            {
              show_scratchpad( scratchpad, sensor_family );              
            } /* if OPT_VERBOSE */
          } /* CRC 8 is OK */
        } /* Scratchpad Read */
      } /* owAccess failed */
    } /* owAccess failed */
    
    /* Failed to read, rest the network, delay and try again */
    owTouchReset(0);
    msDelay( read_time );
  } /* for try < 3 */
  
  /* Failed, no good reads after MAX_READ_TRIES */
  return FALSE;
}
[ ZAS011 @ 25.03.2012. 07:53 ] @
@pisac: Napisi koju varijantu senzora koristis (mislim na srednje slovo :) S ili B) ne vidi se iz ovog parceta sorsa sto si prikacio.
[ goran_68 @ 25.03.2012. 10:34 ] @
Da li nekad dobijes poruku da je crc los "CRC Failed. CRC is %02X instead of 0x00"? Posle tog dela koda sledi:

if (try == MAX_READ_TRIES - 1)
{
/* need to output something (0,-,NaN?) to keep columns consistent */
switch( log_type )
{
/* Multiple Centigrade temps per line */
case 2:
/* Multiple Fahrenheit temps per line */
case 3: sprintf( temp, "\t%3.2f", (double) 0 ); izvrsice se ovo, a to bi mogla da bude greska
log_string( temp );
break;

default:
break;
} /* switch( log_type ) */
} /* if tries == max_read_tries */
[ ZAS011 @ 25.03.2012. 13:32 ] @
Deo koda koji je pisac prikacio mi deluje kao Copy/Paste iz nekog drugog programa ili primera, bez da je sredjen kako bi trebalo.

Normalnom matematikom nije moguce dobiti -1638.2500, to je vise od 12 bitova ukupno, odnosno 7 bitova celobrojne temperature!

Evo jednog kostura programa kako bi to ja odradio (nedostaju komunikacione rutine, i jos svastanesto)

Code:
Device 16F877A
Xtal 4
All_Digital True
PortB_Pullups False

Symbol Dq            PORTA.0

' DS 18B20 Commands
Dim ReadROM            As $33
Dim MatchRom        As $55
Dim SkipROM            As $CC
Dim DearchROM        As $F0
Dim SearchAlarm        As $EC

Dim StartConversion    As $44
Dim WriteScratchPad As $4E
Dim ReadScratchPad    As $BE
Dim CopyScratchPad    As $48
Dim RecallEE        As $B8
Dim ReadPowerSupply    As $B4

Dim StartData        As $1E00

Dim SensorPos        As Word
Dim C                As Byte
Dim Predznak        As Byte
Dim Temperature        As Word
Dim Celo            As Byte
Dim Deci            As Byte
Dim SN[8]            As Byte
Dim i                As Byte




Clear
GoTo Glavni
'****************************************************************
'* Podprogrami                                                  *
'****************************************************************
IscitajSenzor:
    OWrite Dq, 1, [MatchRom, SN[0], SN[1], SN[2], SN[3], SN[4], SN[5],SN[6], SN[7], ReadScratchPad]
    ORead Dq, 2, [Temperature.LowByte,Temperature.HighByte]
    Temperature = Temperature & $0FFF    ' Maskiranje 12 potrebnih bitova
    If Temperature.11 = 1 Then
        Predznak = "-"
        Temperature = ~Temperature + 1    ' ukoliko je temperatura negativna, drugi komplement
    Else
        Predznak = "+"
    EndIf
    Celo = Temperature >> 4
    Deci = (Temperature.LowByte & %00001111) * 100 / 16
Return

StartujMerenje:
    OWrite Dq, 1, [SkipROM, StartConversion]
Return

PosaljiPodatak:

Return
'****************************************************************
'* Glavna programska petlja                                     *
'****************************************************************
Glavni:
SensorPos = StartData

GoSub StartujMerenje
DelayMS 1000
For i = 1 To 40
    SN[0] = CRead SensorPos
    Inc SensorPos
    SN[1] = CRead SensorPos
    Inc SensorPos
    SN[2] = CRead SensorPos
    Inc SensorPos
    SN[3] = CRead SensorPos
    Inc SensorPos
    SN[4] = CRead SensorPos
    Inc SensorPos
    SN[5] = CRead SensorPos
    Inc SensorPos
    SN[6] = CRead SensorPos
    Inc SensorPos
    SN[7] = CRead SensorPos
    If i < 40 Then
        Inc SensorPos
    Else
        SensorPos = StartData
    EndIf
    GoSub IscitajSenzor
    GoSub PosaljiPodatak
Next i
End

' Blok sa Serijskim brojevima senzora, sa sve CRC bajtom
Org StartData
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0
CData 0, 0, 0, 0, 0, 0, 0, 0


Pisano u Proton+
[ pisac @ 25.03.2012. 14:18 ] @
To parče sorsa je iz digitemp.c iz softvera digitemp-3.6.0

Koristim 18B20

CRC greške su se vrlo retko javljale ranije, dok je bilo poteškoća sa očitavanjem u 5 minuta, ali tada nije bilo ovakvih vrednosti. Očitavanje se vrši iz cron-a, i sada je stavljeno &2>1 tako da i kada bi bilo CRC greški ne bih znao za njih. Evo sad sam stavio da mi prikazuje greške, da vidim da li ih ima.
[ ZAS011 @ 25.03.2012. 15:11 ] @
Aux, dobar ti taj mikrokontroler zvani PC

hebote, sto ne napisa odmah da je PC a ne PIC, izlomi' mozak za nista
[ goran_68 @ 25.03.2012. 15:44 ] @
Pogresio sam u vezi onog dela koda. Nisam pazljivo gledao. Sad sam skinuo ceo sors pa sam detaljnije pogledao.
[ pisac @ 25.03.2012. 18:49 ] @
Citat:
ZAS011: Aux, dobar ti taj mikrokontroler zvani PC

hebote, sto ne napisa odmah da je PC a ne PIC, izlomi' mozak za nista


Pa napisao sam , eno pogledaj prvi post iz ove godine. Zbunio te naslov... na početku trebalo je da bude PIC, ali trenutno je samo PC
[ ZAS011 @ 25.03.2012. 19:07 ] @
Mmmm da, PIC/PC slicno se pise

i dalje stojim iza tvrdnje da pre nego sto pocnes da radis bilokakvu matematiku sa RAW podacima sa senzora, prvo AND-ujes te RAW podatke sa 0x0FFF kako bi eliminisao najvisa 4 bita.
Video si da ja to radim i kada je PIC u pitanju.
[ goran_68 @ 26.03.2012. 07:27 ] @
'De ćeš bolji PC od PIC-a :)
Odakle je onaj tvoj prikaz sa greškama? Iz log_file pretpostavljam. Ukoliko je tako onda postoji mogućnost da da te ipak zeza onaj deo sa:
if (try == MAX_READ_TRIES - 1)
{
.
log_string( temp );
.

}

[Ovu poruku je menjao goran_68 dana 26.03.2012. u 11:44 GMT+1]
[ pisac @ 31.03.2012. 16:59 ] @
Prikaz grešaka je direktno iz MySQL baze, sa upitom koji je i naveden. Evo upravo sad sam napravio novi upit, i u međuvremenu su se pojavile još 2 greške (na istim senzorima):

Code:

mysql> select * from T where (temp>"35" or temp<"-15") and temp!="85" order by vreme;
+---------------------+------------+-----------+
| vreme               | temp       | ime       |
+---------------------+------------+-----------+
| 2012-01-22 21:40:51 |    52.1250 | Sobica_Z2 |
| 2012-02-19 15:30:48 |   530.0000 | Sobica_Z2 |
| 2012-02-20 16:55:44 | -1511.2500 | Sobica_Z2 |
| 2012-02-27 17:20:46 | -1638.2500 | Sobica_Z2 |
| 2012-03-22 14:10:42 | -1217.1875 | Sobica_P2 |
| 2012-03-24 10:10:46 | -1199.2500 | Sobica_Z2 |
| 2012-03-25 00:50:50 | -1536.6250 | Sobica_P2 |
+---------------------+------------+-----------+


Inače, pošto sam pre 6 dana uključio prikaz CRC grešaka, stigli su mi mailovi sa greškama u četvrtak uveče (29.mart), i to 5 uzastopnih čitanja:

Code:

20:05:56
CRC Failed. CRC is F0 instead of 0x00
CRC Failed. CRC is BC instead of 0x00
CRC Failed. CRC is 81 instead of 0x00
CRC Failed. CRC is 53 instead of 0x00
CRC Failed. CRC is 07 instead of 0x00

20:10:56
CRC Failed. CRC is 08 instead of 0x00
CRC Failed. CRC is 9C instead of 0x00
CRC Failed. CRC is 2C instead of 0x00
CRC Failed. CRC is D8 instead of 0x00
CRC Failed. CRC is F8 instead of 0x00
CRC Failed. CRC is 40 instead of 0x00

20:15:56
CRC Failed. CRC is 9B instead of 0x00
CRC Failed. CRC is BC instead of 0x00
CRC Failed. CRC is 0C instead of 0x00
CRC Failed. CRC is B6 instead of 0x00
CRC Failed. CRC is 92 instead of 0x00

20:20:56
CRC Failed. CRC is 1A instead of 0x00
CRC Failed. CRC is E9 instead of 0x00
CRC Failed. CRC is 6F instead of 0x00
CRC Failed. CRC is 57 instead of 0x00

20:25:46
CRC Failed. CRC is A4 instead of 0x00


Može se primetiti da gornje greške sa pogrešnim očitavanjima nisu povezane sa donjim CRC greškama, jer su potpno različiti datumi u pitanju.

Dalje, ispitujem da li neki od senzora nije pročitan tog dana. Stavio sam upit za ceo dan, a dobio rezultat samo za upravo taj vremenski period, i to bez zadnjeg čitanja u 20:25 koje je dalo samo jednu CRC grešku koja je očigledno uspešno popravljena ponovnim čitanjem:
Code:

mysql> select left(vreme,16), count(*) from T where vreme>"2012-03-29 00:00:00" and vreme<"2012-03-30 00:00:00" group by left(vreme,16) having count(*)!="33" order by vreme;
+------------------+----------+
| left(vreme,16)   | count(*) |
+------------------+----------+
| 2012-03-29 20:05 |       31 |
| 2012-03-29 20:10 |       31 |
| 2012-03-29 20:15 |       31 |
| 2012-03-29 20:20 |       31 |
+------------------+----------+


I na kraju, listanjem pročitanih senzora utvrdio sam koji su to senzori koji su pravili greške:

Upravo Sobica_Z2, i Sobica_P2 koji su jedini na zadnjem čvoru od kompjutera.
[ pisac @ 31.03.2012. 17:16 ] @
Pazite sad ovo: razmišljam šta sam radio u četvrtak u vreme u kome su se dešavale te CRC greške. I setio sam se!

U to vreme sam uključio produžnu lampu sa (inače odličnom) Vito štedljivom sijalicom od 25W, baš u produžni kabl u kome je uboden i kompjuter koji vrši očitavanja senzora, a taj produžni kabl se nalazi i u neposrednoj blizini one probne ploče sa neugrađenim senzorima. A sve to je vrlo daleko od senzora na kojima su se pojavile CRC greške.

Lampa uopšte nije bila blizu svega toga (ni kompjutera ni onih senzora), bila je nekih 5-10m dalje kroz 2-3 zida. Ključno je dakle to što je bila štedljiva i što je ubodena blizu kompjutera...
[ niksic @ 07.05.2012. 12:23 ] @
Mozda malo skrecem sa teme ali interesuje me da li je potrebna neka obrada podatka koji se dobije od senzora(konkretno DS 1820) da bi se prikazao na LCD.
Posto dobijam neku vrednost 118 za recimo sobnu temp koja se dalje povecava do 127 kada zagrevam senzor pa onda ide na 93 pa se dalje povecava dok ne dostigne neku vrednost.

Unapred zahvalan.
[ ZAS011 @ 07.05.2012. 12:32 ] @
http://www.elitesecurity.org/p3080835

Procitaj sta je napisano umesto da samo postavljas pitanja bez citanja cele teme.