Fórum témák

» Több friss téma
Fórum » DS18B20 hőmérő-szenzor
 
Témaindító: Korben, idő: Nov 16, 2005
Témakörök:
Lapozás: OK   19 / 39
(#) morgo válasza Kovidivi hozzászólására (») Ápr 27, 2015 1 /
 
Szia! Ha két szenzort akarok összehasonlítani, minden esetben egy fa ruhacsipesszel összefogatom őket. Másképpen soha nem fognak egyforma értéket mutatni. Sokat szórakoztam én is azzal, hogy közel rakom őket egymáshoz, de így szinte mindig volt eltérés. A csipeszelés óta nincs ilyen problémám.
(#) Kovidivi válasza morgo hozzászólására (») Ápr 27, 2015 /
 
Nekem nem gond az eltérés, hanem az a fura, hogy a hiba mértéke megváltozott. Normál esetben 0.5-0.6 fok a hiba, ha megcserélem a kettőt, akkor 0.1-0.2fok. Ha a hiba a szenzorban lenne, akkor a hibának mennie kellett volna a szenzorral együtt elméletileg. Most visszacseréltem a szenzorokat az eredeti felállásba, és maradt a 0.5-0.6fok hiba. Mindkettőnél ugyan az a függvény végzi a hőmérséklet kiolvasást, de szerintem itt nem lehet elrontani, hiszen bitekről van szó, az meg elég stabil dolog... Mindkettő IC-nél 4k7 ellenállás van. Megcseréltem a tápot, mert lehetséges, hogy az egyik 5V-ot, a másik meg 5.2V-ot ad, de így maradt a hiba, tehát a táp nem befolyásolja. Azért nem csipeszelném össze őket, mert akkor ha az egyik melegszik, akkor a hő átjut a másik IC-re, esetleg a csipesz felé eltávozik. Engem viszont a nyers hőmérséklet érdekelne, hogy melyiknek lehet hinni, vagy melyik pontos, esetleg melyik melegíti magát, stb. Annyi különbség van, hogy amelyik IC kevesebbet ír ki, annak 12cm a kábele, míg a melegebb IC-nek csak 6cm. De ha megcserélem a kettőt, és a hiba megváltozik, akkor nem a kábel hossza az ok.
A hozzászólás módosítva: Ápr 27, 2015
(#) kissi válasza Kovidivi hozzászólására (») Ápr 27, 2015 /
 
Szia!

A program ugyanaz mind a két eszközben ( nem csak a lekérdező függvény?!) ? Ha véletlenül nem, akkor a master lekérdezési idei is melegíthetik szerintem többé-kevésbé a chip-et... !
szerk.: persze, ez csak a kábel hossz miatti hűtés ellenőrzése után !
A hozzászólás módosítva: Ápr 27, 2015
(#) patrik81 hozzászólása Jún 27, 2015 /
 
Sziasztok!
A proteussal szimulálom a ds18B20 és egy PIC16F690 kommonikációját.Meg tudja mondani valaki,hogy miért nem világít a RC0 LED?Még csak ott tartok,hogy a PIC kiküldi a Master reset jelet,és várja,hogy kapjon egy jelenlét jelet.
A hozzászólás módosítva: Jún 27, 2015
(#) patrik81 válasza patrik81 hozzászólására (») Júl 12, 2015 /
 
Már világít Az idővel volt a gond.
(#) patrik81 hozzászólása Júl 14, 2015 /
 
Írtam egy ilyen programot,de a ds18b20-am nem akar kommunikálni.A jelenlétre reagál. Utána van gond.Nem tudom hol rontottam el,a main()-ben van a hiba,vagy az adatIras()-ban, vagy az adatOlvasas()-ban?Az LCD-re 8 db 1-est ír ki,ha lecsökkentem a delay-t,akkor 8db nullát.
(#) patrik81 válasza patrik81 hozzászólására (») Júl 14, 2015 /
 
Sokáig nézegettem,aztán rájöttem,hogy a main()-ben a for ciklusnál a homerseklet[i] helyett homerseklet[0]-t tettem.Most már majdnem jól kiírja a vett hőmérsékletet,csak az első bit mindig lemarad.
(#) morzsa15 hozzászólása Júl 19, 2015 /
 
Sziasztok!

Megépítettem ezt de olyan problémám lenne vele hogy 217C körüli értéket ír ki mi okozhat ilyen problémát?

Válaszotokat előre is köszönöm!
(#) Bakman válasza morzsa15 hozzászólására (») Júl 19, 2015 /
 
Amit megépítettél, az DS1820 szenzorra lett tervezve, te pedig valószínűleg DS18B20 -as szenzort használsz. Utóbbinak nagyobb a felbontása.

DS1820: 0,5 °C
DS18B20: 0,0625 °C

Az okosabb 8x pontosabban mér, mint a butább. Ha a 217 -et elosztod nyolccal, kijön 27.125 °C, ami perpillanat nagyon is valószínű érték.
(#) morzsa15 válasza Bakman hozzászólására (») Júl 19, 2015 /
 
Áhh értem és ezt a hibát hogyan tudom orvosolni?
(#) Bakman válasza morzsa15 hozzászólására (») Júl 19, 2015 /
 
1: Másik szenzort használsz. 2: Átírod a programot.
(#) morzsa15 válasza Bakman hozzászólására (») Júl 19, 2015 /
 
A programban mit kellene át írni?
(#) Bakman válasza morzsa15 hozzászólására (») Júl 19, 2015 /
 
Javaslom, kérdezz rá erre ebben a topikban: PIC kezdőknek. Én eddig tudtam segíteni.
(#) morzsa15 válasza Bakman hozzászólására (») Júl 19, 2015 /
 
Rendben nagyon szépen köszönöm!
(#) kukuri hozzászólása Aug 18, 2015 /
 
Üdvözletem!

Van 4db DS18B20 vízálló tokozású szenzorom. A szenzorok1m es kábeljét megtoldtam még 1.5 m-el. A szenzorokat így egy pontban külön ellenállásokkal kötöttem be.
Az a gond hogy ha mind a 4 szenzort felteszem akkor nem tudja kiolvasni őket.
Ha csak 2 van a rendszerben akkor minden gond nélkül megy az olvasás.
Hogyan javíthatom ki a hibát. Ha úgy nézm ez 2,5 m-es vezetékeken csillagpontos megoldás?
Daraboljam szét az összes kábelt és fűzzem fel egymás után őket.
Látványban nem annyira kultúrált ez a megoldás
(#) Bakman válasza kukuri hozzászólására (») Aug 18, 2015 /
 
Nem a legelegánsabb megoldás, de működnie kellene ilyen távon. Lehetséges, hogy az ellenállások párhuzamos kapcsolása miatt már túl kis értékű az eredő, már ha úgy vannak kötve, ahogy tippelem (szenzorok párhuzamosan). Négy szenzorhoz egy ellenállást, pl. 3,3 kOhm -ot használj.
(#) kukuri válasza Bakman hozzászólására (») Aug 18, 2015 /
 
4K7 ellenállások vannak. És ahogy sejted párhuzamos az eredő ha jobban megnézem. Így a 4db 4K7 1db 1.175 KOhm nak felel meg. Leveszem a jumpereket megnézem akkor mi történik.
(Az alap panelt úgy terveztem hogy az adatlábat jumperrel lehet VCC vagy GND-re kötni.)
(#) kukuri válasza kukuri hozzászólására (») Aug 18, 2015 /
 
Betetem mégegy ellenállást a többi mellé párhuzamosan. Így már ki is tudom olvasni a szenzorokat. Az eredő ellenállás 1K körül lehet.
(#) kukuri hozzászólása Aug 21, 2015 /
 
Üdv.
A szenzor kiolvasása megoldódni létszik. Át kellett tennem a felhúzó ellenállást a szezor csatlakozási pontjához.

Ami gondom most van az a felbontás.
Jelenleg átállítódott 9 bitesre a 12 ről.
Nekem meg a 12 bites kell.
Tudja valaki hogy tudom visszaállítani.
A leírás szerint a következő kóddal működniea kellene de nem sikerül.

  1. ds.write(0x4E);
  2.   ds.write(0xFF);
  3.   ds.write(0xFF);
  4.   ds.write(0x7F); // Ez állítaná a 9-12 bites felbontást
  5.   ds.reset();
  6.   ds.write(0x48);
  7.   delay(10);
  8.   ds.reset();
A hozzászólás módosítva: Aug 21, 2015
(#) potyo válasza kukuri hozzászólására (») Aug 21, 2015 /
 
Inkább 0xCC, 0x4E, 0xFF, 0xFF, 0x7F parancsok kellenének a felbontás 12 bitesre állításához, majd Reset után megint 0xCC és 0x48 a felbontás eltárolásához.
A hozzászólás módosítva: Aug 21, 2015
(#) Kovidivi válasza kukuri hozzászólására (») Aug 21, 2015 /
 
Az alap felbontás 12bit, ha nem állítasz semmit.
(#) kukuri válasza potyo hozzászólására (») Aug 21, 2015 /
 
Nem történik semmi.
  1. #include <OneWire.h>
  2.  
  3. // OneWire DS18S20, DS18B20, DS1822 Temperature Example
  4. //
  5. //
  6. // The DallasTemperature library can do all this work for you!
  7.  
  8. OneWire  ds(23);  // on pin 10 (a 4.7K resistor is necessary)
  9.  
  10. void setup(void) {
  11.   Serial.begin(9600);
  12. }
  13.  
  14. void loop(void) {
  15.   byte i;
  16.   byte present = 0;
  17.   byte type_s;
  18.   byte data[12];
  19.   byte addr[8];
  20.   float celsius, fahrenheit;
  21.  
  22.   if ( !ds.search(addr)) {
  23.     Serial.println("No more addresses.");
  24.     Serial.println();
  25.     ds.reset_search();
  26.     delay(250);
  27.     return;
  28.   }
  29.  
  30.   Serial.print("ROM =");
  31.   for( i = 0; i < 8; i++) {
  32.     Serial.write(' ');
  33.     Serial.print(addr[i], HEX);
  34.   }
  35.  
  36.   if (OneWire::crc8(addr, 7) != addr[7]) {
  37.       Serial.println("CRC is not valid!");
  38.       return;
  39.   }
  40.   Serial.println();
  41.  
  42.   // the first ROM byte indicates which chip
  43.   switch (addr[0]) {
  44.     case 0x10:
  45.       Serial.println("  Chip = DS18S20");  // or old DS1820
  46.       type_s = 1;
  47.       break;
  48.     case 0x28:
  49.       Serial.println("  Chip = DS18B20");
  50.       type_s = 0;
  51.       break;
  52.     case 0x22:
  53.       Serial.println("  Chip = DS1822");
  54.       type_s = 0;
  55.       break;
  56.     default:
  57.       Serial.println("Device is not a DS18x20 family device.");
  58.       return;
  59.   }
  60.  
  61.   ds.reset();
  62.   ds.select(addr);
  63.   ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  64.  
  65.   delay(1000);     // maybe 750ms is enough, maybe not
  66.   // we might do a ds.depower() here, but the reset will take care of it.
  67.  
  68.   present = ds.reset();
  69.   ds.select(addr);    
  70.   ds.write(0xBE);         // Read Scratchpad
  71.  Serial.println("Read Scratchpad 0xBE");
  72.   Serial.print("  Data = ");
  73.   Serial.print(present, HEX);
  74.   Serial.println(" ");
  75.   for ( i = 0; i < 9; i++) {           // we need 9 bytes
  76.     data[i] = ds.read();
  77.     Serial.print(i, DEC);
  78.     Serial.print(" : ");
  79.     Serial.print(data[i], BIN);Serial.print(" : ");Serial.println(data[i], HEX);
  80.     Serial.print(" ");
  81.   }
  82.   Serial.println("Write Scratchpad 0x4E");
  83.   ds.write(0xCC);
  84.   ds.write(0x4E);
  85.   ds.write(0xFF);
  86.   ds.write(0xFF);
  87.   ds.write(0x5F);
  88.   ds.reset();
  89.   ds.write(0xCC);
  90.   ds.write(0x48, 1);
  91.   delay(10);
  92.  
  93.  
  94.  
  95.  
  96.   Serial.print(" CRC=");
  97.   Serial.print(OneWire::crc8(data, 8), HEX);
  98.   Serial.println();
  99.  
  100.   // Convert the data to actual temperature
  101.   // because the result is a 16 bit signed integer, it should
  102.   // be stored to an "int16_t" type, which is always 16 bits
  103.   // even when compiled on a 32 bit processor.
  104.   int16_t raw = (data[1] << 8) | data[0];
  105.   if (type_s) {
  106.     raw = raw << 3; // 9 bit resolution default
  107.     if (data[7] == 0x10) {
  108.       // "count remain" gives full 12 bit resolution
  109.       raw = (raw & 0xFFF0) + 12 - data[6];
  110.     }
  111.   } else {
  112.     byte cfg = (data[4] & 0x60);
  113.     // at lower res, the low bits are undefined, so let's zero them
  114.     if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
  115.     else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
  116.     else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
  117.     //// default is 12 bit resolution, 750 ms conversion time
  118.   }
  119.   celsius = (float)raw / 16.0;
  120.   fahrenheit = celsius * 1.8 + 32.0;
  121.   Serial.print("  Temperature = ");
  122.   Serial.print(celsius);
  123.   Serial.print(" Celsius, ");
  124.   Serial.print(fahrenheit);
  125.   Serial.println(" Fahrenheit");
  126. }


Azért 5F mert most egy keveset használt szenzoron próbálom átállítani. Itt meg még alapból 12 bites.
A hozzászólás módosítva: Aug 21, 2015
(#) kukuri válasza Kovidivi hozzászólására (») Aug 21, 2015 /
 
Igen tudom. De volt egy kis gond a rendszerel és átállította magának 9 bitesre. Nem volt jó a felhúzó ellenállás. Hogy miként állította át lövésem sinycs.
(#) Kovidivi válasza kukuri hozzászólására (») Aug 22, 2015 /
 
Véletlenszerűen nem fog átállni. Ha mégis, következő tápelvételkor visszaáll az eredeti értékre. Ha el lett volna mentve az EEPROM-ba, azt hiszem akkor is mindig be kell tölteni a regiszterekbe az EEPROM tartalmát. De az biztos, hogy véletlen nem állítódik el úgy, hogy még el is menti. Miből gondolod, hogy csökkent a felbontás? Nem változtattál a programon is eközben?
(#) Kovidivi válasza kukuri hozzászólására (») Aug 22, 2015 /
 
Ez a rész szerintem butaság: raw = (raw & 0xFFF0) + 12 - data[6];
Ezzel mindig kb. fél fokkal többet kapok, adatlapban sem találtam erre való utalást.
az adat[7]-et vizsgálja, de az mindig 10h értékű (Reserved), tehát a feltétel mindig igaz. Erre hozzáad kicsit, meg kivon egy szintén Reserved regisztert. A hőmérséklet csak az első két byte-ban van eltárolva. Így is 16bit-ünk van, amiből 12bit a valós, ha lenne még valahol hőmérséklet eltárolva, az a maradék szabad 4ben simán elférne valószínűleg. Én kitöröltem a kódomból.
A hozzászólás módosítva: Aug 22, 2015
(#) potyo válasza kukuri hozzászólására (») Aug 22, 2015 /
 
Itt még mindig 0x5F szerepel 0x7F helyett
(#) Gabó hozzászólása Aug 23, 2015 /
 
Olyan kérdésem lenne, hogy van 1db ds18b20as szenzor, és ennek a jelét, 2db különálló arduinóval fel lehet e dolgoztatni? Ilyen tartalék rendszer lenne a második modul, ha az elsővel történne valami. Ezért lenne szükség erre a megoldásra.
(#) Bakman válasza Gabó hozzászólására (») Aug 23, 2015 /
 
Ha a tartalék kontroller nem húzza le vagy fel az adatlábat, akkor megoldható.
(#) Gabó válasza Bakman hozzászólására (») Aug 23, 2015 /
 
Köszi! Kell közé valami "elválasztó" elektronika, vagy a programba valami kiegészítés? Vagy mehet egyenesen a tartalékba is? A táp nem az unoról megy.
Mórickaábrát csatolom
A hozzászólás módosítva: Aug 23, 2015
(#) Bakman válasza Gabó hozzászólására (») Aug 23, 2015 /
 
Így működnie kell. Arra figyelj, hogy a tartalék Uno azon lába, amelyikre a hőmérő csatlakozik, nem terhelje le az adatvonalat egyik irányba se. Azt már tőlem ne kérdezd, hogyan lehet megcsinálni...
Következő: »»   19 / 39
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem