Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Ez alapján jó közelítéssel elég, ha az
1/T = 1/T25 + TK*ln(R/R25) összefüggéssel számolsz, ahol TK(TC) 0.79 Bővebben: Link adatlap alapján. Szerintem a DS18B20-al kevesebb gond lenne A hozzászólás módosítva: Dec 12, 2015
Köszi ezt korábban olvastam már, de nem lettem okosabb tőle
![]()
Helló.
A lényeg, hogy meg kell határoznod a Steinhart-Hart képlethez a három NTC-függő állandót, az A,B,C-t. Ezt ezen a weblapon meg tudod tenni: Thermistor calculator. Ki kell tölteni itt három adatot, ehhez szükség lesz a termisztorod adatlapjára. A három adat a termisztor három különböző ellenállása 5, 25 és 45 fokon. Persze lehetnek más hőmérséklet értékek is, de a 25 fok mindenképpen legyen benne. Ez a termisztor adatlapján egy szép hosszú táblázatban benne van. Ebből a weblap kalkulál neked három Steinhart-Hart állandót, az A,B és C-t. Ezután ezt felhasználhatod az Arduino progidban: int temp0ADC; double temp0res,temp0celsius,A,B,C; temp0ADC=analogRead(TEMP_0_PIN); temp0res=4700.0/((1023.0/(double)temp0ADC)-1); temp0celsius=(1.0/(A+(B*(double)log(temp0res))+(C*pow((double)log(temp0res),3))))-273.15; A 4700 az annak az ellenállásnak az értéke amivel feszültségosztót alkot az NTC. A hozzászólás módosítva: Dec 13, 2015
Nincs mit.
![]() Még ügyelj arra, hogy a weblap tudományos alakban adja meg a három állandót. Tehát vagy te is ilyen alakban adod meg, vagy eltolod a tizedespontot a megfelelő helyre.
Ebbe gondoltam behelyettesíteni a számított értékeket.
Remélem jó az elképzelésem...
Hát ja, valami ilyesmi.
![]() Ha a szoba hőmérsékletét jól méri, akkor oké. Én higanyos hőmérővel meg a multiméter hőmérőjével teszteltem és 1-2 fokra nagyjából ott volt mind a három. Nekem 100K-s termisztorok vannak és fél fokon belül mindegyik jól mért, százados pontossággal írattam ki.
Viszont eddig fel sem tűnt, hogy ez a kty 81-222 PTC...
Eme ráeszmélés után találtam egy kapcsolást.
Hát végül is maga a kapcsolás elve ugyanaz, feszosztó. Itt már csak az a probléma, hogy a PTC működése és jelleggörbéje más mint az NTC-nek és nem tudom, hogy ez hogy illik az eredeti képletbe. Még sosem próbáltam PTC-vel.
De végül is az alapkérdés a Steinhart-Hart állandóinak meghatározása volt NTC esetén, az meg megvolt. ![]()
Ehhez stabil 5V is kell, esetleg külön 5V. Ha a mikrokontrollerben lenne belső erősítő (vagy differenciális erősítő), pl. Atmega128, akkor egy másik feszültségosztóval beállítod az 1.127V-ot, és ehhez képest mérsz. Ha még kalibrálod is, akkor egész pontos kis hőmérőt kapsz. De a DS18b20 még mindig egyszerűbb
![]()
Az a baj, hogy adott az érzékelő és egy analóg eszközzel is kompatibilis kell maradjon. Mellesleg nem egyszerű cserélni sem.
Viszont az áramköröm mindenképpen tartalmaz egy 7805 stabilizátort. Azt is lehetne esetleg megoldásként felvetni, hogy megcsinálom a feszültségosztót és programban kivonom az 1.127V-ot majd ennek az eredményét elosztom 7.59-cel. És meg is van a °C. Javítsatok ki, ha tévednék. Köszönöm.
Sziasztok!
Ha egy hőmérőnél nem kell tized-század kijelzés, akkor a float helyett használható az int?
Nem vagyok nagy zseni még, de szerintem simán... INTEGER annyit tesz, egész és 32 biten tárolja az adatot ami egy hőmérséklet kijelzéshez szerintem enyhén túlzás...
Értéke lehet előjelesként : −2 147 483 648 tól +2 147 483 647 -ig. Szóval szerintem a BYTE is megfelelő lenne neked 8 biten tárolja az adatot... Feltéve ha megelégszel a −128 -tól +127 -ig kijelzéssel... Adattípusok változók
Lehetséges, én általánosságban mondtam...
Próbáld ki... ![]()
Az integer nincs kőbe vésve, az átlag AVR (nem AVR32) 8 bites és az integer 16bites (és előjeles). Ha pontosan definiálni akarja az ember, hogy mekkora helyet foglaljon el, akkor pl. az int16_t (16 bit előjeles), uint16_t (16 bit előjel nélküli), (u)int8_t (8 bites), (u)int32_t (32 bites) típusokat kell használni. Különleges esetben (pl. platform hordozhatóság esetén, mondjuk jó legyen a kód AVR-en és ARM-on is) használhatók még a fast típusok is. Pl. uint_fast16_t. Ilyenkor azt a típust használja a fordító, ami legalább 16 bites de a leggyorsabb kódot eredményezi a CPU-n, amire a kód fordul (pl. egy 32 bites CPU általában a 32 bites változókat preferálja), azaz lehet hogy fordításkor 32 bites változónak fordul majd le az egyik CPU-ra de csak 16 bitesnek egy másikon (pl. az AVR sokkal lassabban dolgozik 32 bites változókkal mint 16bitesekkel).
atus1981 kérdésére válaszolva viszont nem helyettesítheted direktbe integer matematikával a lebegőpontos matekot, viszont pár apró trükkel (és némi pontosság feláldozásával) átültetheted a kódot integer matekra (ilyen pici 8bites uC-knél ez a helyes gyakorlat is, mivel a lebegőpontos számítások atomlassúak rajtuk). Pl. ha megszorzol minden számot mondjuk 1000-el és így számolsz velük, akkor a műveletektől függően (osztás nagyon pontatlan lehet) pár tizedes pontig nézve elfogadható értékeket kaphatsz (csak ne felejtsd el, hogy a végeredmény is 1000-ese a valódi értéknek). Ha elég jó felbontást választ az ember, akkor gyakran jobb eredményt is lehet kapni mint lebegőpontos számokkal (sokan elkövetik azt a kezdő hibát, hogy nagyon pici számokat adnak össze nagy számmal sokszor [pl. mérésösszegzéskor], ilyenkor gyakran óriási hibát generálnak a végeredményben)
Mit javasolsz? Nekem csak egész értékű adatok kellenek.
Több irány is van. Egyik lehetőség, ha a számításokat az uC-ben végzed el, és vannak nem egész konstansaid (vagy osztanod kell), akkor a már említett módon felszoroznám a számokat 1000-el vagy még nagyobbal és így végezném el a számításokat 16 vagy 32 bites integerekkel.
Egy másik lehetőség ún. lookup table (kereső táblázat) használata. Excelben vagy hasonlóban megírod a képletet. Behelyettesíted az értékeket a szükséges tartományra (mondjuk -20C-től 70C-ig). Majd kiszámoltatod az excellel a hozzájuk tartozó ADC értékét. Ezután fogod a végeredmény listát és berakod egy tömb értékének, amit aztán belefordítasz a kódba (lehetőleg a PROGMEM-ben tárolva a tömböt). Így már csak ezen a listán kell végigmenni lesz és megkeresni azt az elemet, ami legközelebb van az ADC jelenlegi értékéhez. Mivel a lista sorba rendezett lesz (folyamatosan csökkenő vagy növekvő), ezért a gyors keresésre is lehet találni nagyon jó algoritmusokat. Ez a megoldás nagyon jól működik mikrokontrollereknél, mivel sokkal gyorsabb kódot eredményez kisebb helyen mint a számításos. pl. logaritmus és egyéb számítások be se férnek egy kis 1k-s mikroba, ezzel a trükkel meg mégis lekezelhet egy NTC-s hőmérsékletmérést. A hozzászólás módosítva: Dec 14, 2015
Csak érdekesség hogy a P8X32A Parallax kontrollerbe a ROM-jába bele van írva a logaritmus, antilogaritmus meg a szinusz tábla.
Huhh, ezzel feladtad a leckét
![]() Lehet inkább maradok a float-nál...
Az a kis kütyü ágyúval verébre lenne egy ilyen egyszerű hőmérsékletmérés esetén.
![]()
Helló.
Azt megcsinálhatod, hogy veszel egy előjeles byte-ot: signed char valtozo=0; , és ebbe elmented a hőmérsékletet tizedesjegy nélkül: valtozo=(signed char)(homerseklet_floatban_vatlozo_neve); Ezzel egy a baj, hogy simán levágja a tizedeseket, ha 10,9 volt, akkor 10-et kapsz. Erre van egy trükk: valtozo=(signed char)(((homerseklet*10)+5)/10); ez kerekítést végez. Ha 10,3 volt, ebből lesz 103+5=108, 108/10=10. Ha 10,6 volt, akkor 106+5=111, 111/10=11. Kész.
Hali!
Egyetlen fok nem számít, de mindenképpen kipróbálom az ötletedet! Köszi mindenkinek!
Sziasztok.
Egy kis segítséget kérnék van egy ilyen lcd keypad-om. Bővebben: Link Az a gondom, hogy fel töltöm a minta programot működik rendesen. De van egy LM35-ösöm is és ha annak a programját meg próbálom össze írni a példa programmal akkor nem megy csak két gomb. Mi lehet vele a gond?
Mi miből tudnánk neked megmondani, hogy mi lehet a gondod?
Ha még a hibajelenséget sem közölted? Valószínűleg már a 2. értelmes sor sem jó! Ez van az első programban: 1. // the pins used on the LCD panel 2. LiquidCrystal lcd(8, 9, 4, 5, 6, 7); A másikban pedig: LiquidCrystal lcd(12, 13, 8, 9, 10, 11); Most fogalmunk nincsen! Hova is vannak bekötve az LCD pinjei? ![]()
Szia. Úgy van kötve a hogy a második van. A hiba jelenséget le írtam az a hiba ha össze van rakva a két program akkor csak két gomb működik.
Az első A0-án mér:
adc_key_in = analogRead(0); A második: int tempPin = A1;??? reading = analogRead(tempPin);
Hali!
Ugyan nem a problémádra a megoldás, de én tennék egy
![]()
Az A0 lenne a nyomógombok az A1 pedig az lm35.
Össze keveredik a két mérés? |
Bejelentkezés
Hirdetés |