Fórum témák

» Több friss téma
Fórum » BMP085 és BMP180 Digitális Nyomásérzékelő Alkalmazása AVR-rel
Lapozás: OK   1 / 2
(#) Max26 hozzászólása Jún 24, 2015 /
 
Sziasztok!

Ezt a témát azért hoztam létre, mert szükséges volna légnyomás mérést végeznem. A szenzor adott, de sehol nem találok ezekkel a szenzorokkal foglalkozó témát a HE-án. Ha van valakinek működő kódja BMP180-hoz megosztaná velünk?
(#) Droot válasza Max26 hozzászólására (») Jún 24, 2015 /
 
Persze: Bővebben: Link
(#) Medve válasza Max26 hozzászólására (») Jún 24, 2015 /
 
Avagy a GitHub, vagy az Adafruit oldaláról teljesen jól működő példaprogramok tölthetők le. A 180 elmegy a 085-ös könyvtáraival.
(#) Max26 válasza Droot hozzászólására (») Jún 25, 2015 /
 
Nekem sajnos ez a projekt nem működik: Projekt_1: Link
Lassan tölt be az lcd kijelző, lassan frissülnek a mérési adatok és egy rövid idő után az egész MCU lefagy. Több restart után sem 'éled föl'. Egyszer csak fogja magát és megint működik.

Próbáltam ezt a kódot is (ez egy másik projekt) Projekt_2: Link
Igen, ezzel működik: több órát futott a program reset nélkül, már boldog is voltam, de mégis lefagyott. És reset után sem éledt föl szint úgy. Ez a kód gyorsan frissül ellenben az előzővel. Ha működés közben resetelek, arra reagál.

Lehet az LCD library-mal van a hiba?

Mi lehet az oka a lefagyásnak?
A hozzászólás módosítva: Jún 25, 2015
(#) Bakman hozzászólása Jan 17, 2016 /
 
Sziasztok!

Épp egy BMP180-as légnyomásmérővel játszok. Egy részlet az adatlapból:

  1. if (B7 < 0x80000000)
  2. {p=(B7 * 2)/B4}
  3. else
  4. {p=(B7/B4)*2}


Én jártam régen matekórára vagy a feltétel mindkét ága ugyan azt az eredményt adja? Nem teljesen értem, mi értelme ennek.
(#) eSDi hozzászólása Jan 4, 2017 /
 
Sziasztok!

BMP/BME280-al van tapasztalatotok? Hardverileg rendben vagyok, a nyers adatokat ki tudom olvasni. A konverzióhoz keresek BASIC példákat (hogy AVR, PIC, vagy akármi az teljesen mindegy), sajnos az adatlapban lévő C kód eléggé távol áll tőlem. Esetleg az is segíthet, ha valaki leírja, hogyan kell értelmezni.
Adatlap 23. oldal 4.2.3-as bekezdés.

Kösz előre is!
(#) Bakman válasza eSDi hozzászólására (») Jan 4, 2017 /
 
Hasonló (lásd melléklet) leírásnak én is örülnék.

BMP180.jpg
    
(#) eSDi válasza Bakman hozzászólására (») Jan 4, 2017 /
 
Kösz!

Ezen talán már el tudok indulni.
(#) Bakman válasza eSDi hozzászólására (») Jan 4, 2017 /
 
Ez a BMP180-as adatlapja!
(#) eSDi válasza Bakman hozzászólására (») Jan 8, 2017 /
 
Nos! A BME280 adatlapja végén van még számítás. Ezzel sikerült eredményt elérnem:
  1. // Returns temperature in DegC, double precision. Output value of “51.23” equals 51.23 DegC.
  2. // t_fine carries fine temperature as global value
  3. BME280_S32_t t_fine;
  4. double BME280_compensate_T_double(BME280_S32_t adc_T)
  5. {
  6. double var1, var2, T;
  7. var1 = (((double)adc_T)/16384.0((double)dig_T1)/1024.0) * ((double)dig_T2);
  8. var2 = ((((double)adc_T)/131072.0((double)dig_T1)/8192.0) *
  9. (((double)adc_T)/131072.0((double) dig_T1)/8192.0)) * ((double)dig_T3);
  10. t_fine = (BME280_S32_t)(var1 + var2);
  11. T = (var1 + var2) / 5120.0;
  12. return T;
  13. }
  14. // Returns pressure in Pa as double. Output value of “96386.2” equals 96386.2 Pa = 963.862 hPa
  15. double BME280_compensate_P_double(BME280_S32_t adc_P)
  16. {
  17. double var1, var2, p;
  18. var1 = ((double)t_fine/2.0)64000.0;
  19. var2 = var1 * var1 * ((double)dig_P6) / 32768.0;
  20. var2 = var2 + var1 * ((double)dig_P5) * 2.0;
  21. var2 = (var2/4.0)+(((double)dig_P4) * 65536.0);
  22. var1 = (((double)dig_P3) * var1 * var1 / 524288.0 + ((double)dig_P2) * var1) / 524288.0;
  23. var1 = (1.0 + var1 / 32768.0)*((double)dig_P1);
  24. if (var1 == 0.0)
  25. {
  26. return 0; // avoid exception caused by division by zero
  27. }
  28. p = 1048576.0(double)adc_P;
  29. p = (p – (var2 / 4096.0)) * 6250.0 / var1;
  30. var1 = ((double)dig_P9) * p * p / 2147483648.0;
  31. var2 = p * ((double)dig_P8) / 32768.0;
  32. p = p + (var1 + var2 + ((double)dig_P7)) / 16.0;
  33. return p;
  34. }
  35. // Returns humidity in %rH as as double. Output value of “46.332” represents 46.332 %rH
  36. double bme280_compensate_H_double(BME280_S32_t adc_H);
  37. {
  38. double var_H;
  39. var_H = (((double)t_fine)76800.0);
  40. var_H = (adc_H – (((double)dig_H4) * 64.0 + ((double)dig_H5) / 16384.0 * var_H)) *
  41. (((double)dig_H2) / 65536.0 * (1.0 + ((double)dig_H6) / 67108864.0 * var_H *
  42. (1.0 + ((double)dig_H3) / 67108864.0 * var_H)));
  43. var_H = var_H * (1.0((double)dig_H1) * var_H / 524288.0);
  44. if (var_H > 100.0)
  45. var_H = 100.0;
  46. else if (var_H < 0.0)
  47. var_H = 0.0;
  48. return var_H;
  49. }

Sajnos az egyszerűbb ide-oda bitshiftelős változattal nem tudtam megoldani a fordító korlátai miatt (Signed Integer híján, a negatív hőmérséklet mérés nem volt jó). Így maradt a Floating Point, megizzad tőle a 8bites mikrovezérlő és zabálja is a programmemóriát, de működik. Legalábbis részben. A hőmérséklet és páratartalom jónak tűnik, de a légnyomásra mindig 1500hPa körüli értéket ad vissza. Ez elvileg nem lehet, mert 1100hPa a mérés felső határa, az időjárásjelentés és a telefonom szerint is 1020hPa körül van általában. Szóval van még mit átrágni rajta.
(#) SBahadurD válasza Bakman hozzászólására (») Jan 9, 2017 /
 
Én ugyan nem tudom, mi a kód célja, de ha az operandusok egész számok, akkor nem mindegy, hogy milyen sorrendben végzed el a műveletet. Ugyanis az osztásnál eltűnik a maradék. Vagyis pl. 10/4 = 2. Tehát (10/4)*2 = 2*2 = 4; míg (10*2)/4 = 20/4 = 5.
Alapjában véve a második adja a pontosabb eredményt. És azért vizsgálja meg, hogy B7 < 0x80000000, mert ha nem, akkor a kétszeres szorzás már túl csordulna a 32 biten. Vagyis, ha a szám túl nagy, akkor kénytelen előbb az osztást elvégezni, és utána szorozni. Még akkor is, ha ez a pontatlanabb.
(#) Bakman válasza SBahadurD hozzászólására (») Jan 9, 2017 /
 
Idézet:
„ha az operandusok egész számok, akkor nem mindegy”
Ez nem esett le. Köszönöm!
(#) pont hozzászólása Jan 28, 2017 /
 
Sziasztok!

Mivel a demo bascom fordító csak 4k-ig enged, ezért "kiheréltem" egy Német BMP280 programot a netről, oly módon, hogy mivel nekem csak a légnyomás kell, a hőmérséklet, páratartalom, stb dolgot kivágtam. És már se lcd, se spi programrész, nem fér el még így sem, az rx tx -et egy BT05 modullal androidra küldöm. Tulajdonképpen működik, tendenciára mindenképp, de az abszolút pontossághoz, gondolom meg kellene adni a hőmérsékletet, de a programban a T_fine értéket hiába változtatom nem történik semmi....
A hozzászólás módosítva: Jan 28, 2017
(#) Bakman válasza pont hozzászólására (») Jan 28, 2017 /
 
Nem teljesen értem a kérdést. Az a baj, hogy kevesebbet mutat, mint amennyit pl. az Időkép oldalán látsz? Ha igen, akkor mindössze annyi a gond, hogy a kapott értéket át kell számolni tengerszint feletti magasságra.
(#) eSDi válasza pont hozzászólására (») Jan 28, 2017 /
 
Üdv!

A pontos légnyomáshoz kell tudni a pontos hőmérsékletet, ehhez a szenzorból kell kiolvasnod a nyers hőmérsékleti adatot és azt kompenzálni kell az előzőlegesen kiolvasott kalibrációs adatokkal. Ekkor már tudod a T_fine értékét is, ami kell. Lásd még adatlap.
(#) pont válasza Bakman hozzászólására (») Jan 28, 2017 /
 
A baj ahogy eSDi is írja hőmérséklettel (is) kell kompenzálni.

eSDi: Nincs több helyem a memóriában, nem tudom kiolvasni ebből a modulból, de kézzel beírnám, hogy hány fok van a szobában (beírtam a programba T_fine-t), de mégsem változik a kiírt érték, az általam kézzel megadott értéktől.
A hozzászólás módosítva: Jan 28, 2017
(#) Bakman válasza pont hozzászólására (») Jan 28, 2017 /
 
A hőmérséklet mennyit változtat rajta? Állítsd össze aszámolási folyamatot pl. egy Excel táblázatban és ott próbálgasd a paramétereket.
(#) pont válasza Bakman hozzászólására (») Jan 28, 2017 /
 
Én csak lemásoltam a programrészeket, nem látom át a számítások menetét, igazából Tőletek kérdezném, hogy előfordulhat, hogy 20 fok hőmérsékletváltozás csak tizedeket változtat a nyomás értéken? A tengerszinttel való korrigálás lehet úgy hogy az eredeti végeredményhez, egyszerűen hozzáadom ami az időkép szerint hiányzik?
(#) Bakman válasza pont hozzászólására (») Jan 28, 2017 /
 
A BMP180 adatlapjában benne van, hogyan lehet átszámolni tengerszintre a légnyomásértéket. Az egyenletből kifejezhető a tengerszintre vetített légnyomás. Ha a magasságod nem változik, akkor ez egy állandó paraméter lesz.

Érdekes, hogy a BMP180 adatlapjában a mért légnyomás nem függ a hőmérséklettől.
(#) eSDi válasza pont hozzászólására (») Jan 28, 2017 /
 
A T_fine még nem hőmérséklet érték, még ebből is kell számolni, hogy azt megkapd.
Nekem pl 30.6°C-nál 156677. Szóval elég nagy határok között lehet mivel ez egy 32bit-es Signed Integer típus kell hogy legyen.
(#) eSDi válasza Bakman hozzászólására (») Jan 28, 2017 /
 
Idézet:
„Érdekes, hogy a BMP180 adatlapjában a mért légnyomás nem függ a hőmérséklettől”


Dehogynem. B5-öt ki kell számolni a hőmérsékletnél és ezt fel is használja a nyomás kiszámításánál, mindjárt az első sorban.
(#) Bakman válasza eSDi hozzászólására (») Jan 28, 2017 /
 
Valóban, azt a részt nem is néztem.
(#) Medve válasza pont hozzászólására (») Feb 1, 2017 / 1
 
Lehet, hogy kitérő válasz, de használj HP206C típusú szenzort, abban már megtörténik a számolás és a kompenzált légnyomás, magasság és hőmérséklet olvasható ki, csupán a wire könyvtár I2C rutinjait használva.
(#) Bakman válasza Medve hozzászólására (») Feb 1, 2017 /
 
Jó a tipp!
(#) pont válasza Medve hozzászólására (») Feb 1, 2017 /
 
Most hirtelen nem is igen találom hol lehetne olyat venni, az ebay-en volt egy 3000 ft-os találat, a bmp annak a tizede, de egyébként úgy tűnik megoldódott a dolog. Valójában nagyon is hőmérsékletfüggő a mérés, majd egy fokonként egy hPa. A hőmérséklet mérésnek bent kell megtörténnie a modulban, mert nem egyezik a külső hőmérséklettel, általában 7-10 fokkal magasabb annál, gondolom ennyi a saját hőtermelése a modulnak. Úgyhogy a 4k-ba sehogy sem fér bele, de fórumtársak segítettek a fordításban. Viszont az eredeti program amivel próbálkoztam kiderült hibás volt, és így kézzel sem tudtam kompenzálni, de a javított változat szépen működik. Ha a légnyomás nem változik, akkor egy század hPa az ide oda ugrálás. Most próbálok különféle felhasználásokat írni a légnyomásadattal, pl. magasságmérő (kb. 100méter=12hPa), légnyomásváltozás tendencia és grafikon stb.
(#) Medve válasza pont hozzászólására (») Feb 1, 2017 /
 
Ja, drágácska még, 7.3$. Majd ha jó idő lesz, próbáld ki, mit mutat akkor, ha rásüt a nap a szenzorra a korrekt magasságmérés bonyolultabb, ha győzi a proci, használd a barometrikus magasságformulát.
A hozzászólás módosítva: Feb 1, 2017
(#) FuGyuri hozzászólása Nov 15, 2017 /
 
Kedves Kollegák!
Az ebay-n vásároltam 4db BMP180-as modult és azt tapasztalom, hogy mindegyik kb. 10C fokkal kevesebbet mér a tényleges hőmérsékletnél. A modulok kalibrációs értékei jelentősen eltérnek a doksiban feltüntetett értékektől.
Pl: MC a doksiban -8711, modulé: -20982
AC5 32757 25723
stb....
A számítási algoritmus jól működik, a példa szerinti értékekkel helyes végeredményt ad.
Ha valakinek van ötlete a hibával kapcsolatban, köszönettel veszem a válaszát.
(#) eSDi válasza FuGyuri hozzászólására (») Nov 15, 2017 /
 
Üdv!

A kalibrációs adatok el is fognak térni, azért az a nevük! Minden modulra egyedileg van meghatározva. Ki kell olvasnod mindet és ezeket behelyettesíteni a képletbe. Jól kell mérjen, nekem BME280-al nem volt túl nagy gondom.
(#) Bakman válasza FuGyuri hozzászólására (») Nov 15, 2017 /
 
Az én tapasztalatom is hasonló a hőmérsékletek ügyében, így azt akörnyezeti értéket inkább DS18B20 -as IC-vel mérem. A légnyomás stimmelt mindig de a hőmérséklet mérésére egyszerűen alkalmatlan a BMP180. Szerintem.
(#) Medve válasza FuGyuri hozzászólására (») Nov 15, 2017 /
 
Maximum 1.5 fokot hibázhat, nekem nem volt vele gondom. A páramérős BME280 is fél fokot tévedett. Azt viszont meg kell figyelnünk, hogy a gyártó szerint az eszköz megnevezésében nincs ott hogy "hőmérő". Más dolog, hogy a nyomásmérés kompenzációjához ismerni kell a hőmérsékletet, ami kiolvasható.
A hozzászólás módosítva: Nov 15, 2017
Következő: »»   1 / 2
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