Hőmérséklet mérés

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
gabor
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2014. június 23. hétfő, 9:20

Hőmérséklet mérés

Hozzászólás Szerző: gabor »

Sziasztok,

adva van egy arduino uno. Ma vettem egy olcsó MCP9700 termométert. A három láb közül az egyik a +5V, a középső (nálam) A4-en, a harmadik a 0-n van. Nem ördöngösség az analóg porton lekérdezni, de rossz eredményeket kapok. A kódot nem én találtam ki, a következő lenne:

float temp;
temp = analogRead(A4)*5.0/1024.0;
temp = temp - 0.5;
temp = temp / 0.01;

És az eredmény:

34.47
34.47
35.94
35.45
34.96
34.96
34.96
35.94
35.45
34.96
34.96
35.94

Itt van az orrom előtt, a termisztor nem ér semmihez, kábeleken himbálózik a levegőben. Ha megfogom, és kézrátételt alkalmazok, akkor az eredmények így változnak:

40.82
41.80
41.80
43.26
42.29
42.29
42.29
42.77
41.31
41.80
42.29
40.82
41.80
41.80

Ugye több kérdés merül fel:
1. Jól alkalmazom-e az eszközt?
2. Ha minden ok, akkor hogyan lehet ezt bekalibrálni, hogy tényleg használni lehessen az eredményeket?
3. Van-e tapasztalat, hogy mennyire térnek el ugyanazon típusok működése? Tehát kell-e újrakalibrálni egy esetleges cserénél?

Előre is köszönöm
Gábor

Ps: az ember nem bíz semmit a véletlenre, így nem egyet, hanem 2-t vettem, de mindkettőnél ugyanaz az eredmény...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Hőmérséklet mérés

Hozzászólás Szerző: kapu48 »

Tedbe a setupba :

Kód: Egész kijelölése

analogReference (EXTERNAL) // the voltage applied to the AREF pin (0 to 5V only) is used as the reference.
És próbáld ezt a projectet:
https://books.google.hu/books?id=-304-N ... no&f=false

És ne várj pontos eredményt az Ardunio-tol!
gabor
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2014. június 23. hétfő, 9:20

Re: Hőmérséklet mérés

Hozzászólás Szerző: gabor »

Köszönöm,

tulajdonképpen megelégednék azzal, ha már fél fokos pontosság lenne.
Végeztem teszteket a javaslatod alapján. Nem voltam biztos benne, hogy az AREF lábat lehet-e direktben csatlakoztatni az 5 V-ra, ezért egy 680 ohm-os ellenálláson keresztül húztam fel. Ezek után is hasonló az eredmény:

analogReference(EXTERNAL)

Üres AREF
449.51
449.51
449.51

680 ohm Vref
35.45
35.94
35.45
35.94
35.94

analogReference(DEFAULT)
33.98
34.47
34.47
34.47


Közben kíváncsiságból kicseréltem az Atmega328p-t is, de bármit csinálok vele, ezek az eredmények maradnak.

A könyvben lévő projekt, amit írtál nagyon hasonlít az enyémhez. Ő egy egyenes képletéből indul ki és mV-okban számol, az én pedig a gyártói doksiból indultam ki és először egy konkrét feszültség egységet számolok ki és utána a helyiértékeknek megfelelően kapom meg az eredményt. Mind a két eset nagyon hasonló eredményű.

Itt az eredménye a második megoldásnak:
External
37.89
38.38
38.38
37.89
37.89

Default
35.45
34.96
34.96
34.96
34.96

De lehet hogy így kell elfogadni :) Csak az gyanús, hogy mindkét hőmérséklet érzékelőnél teljesen hasonló értékeket kapok.

Egyébként a kalibrálást roppant egyszerűen intézi el egy összeadással. Lehet hogy én is így fogom csinálni és kettévágom a gordiuszi csomót...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Hőmérséklet mérés

Hozzászólás Szerző: kapu48 »

De az AREF-en van legalább 10uF + 100n (Tantál) szűrés? 1V ingadozás sok!
És az eredmény sem helyes?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Hőmérséklet mérés

Hozzászólás Szerző: kapu48 »

Mérd meg az AREF-et, és a képletben a valódi értékkel számolj:
temp = analogRead(A4)*AREF V/1024.0;
gabor
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2014. június 23. hétfő, 9:20

Re: Hőmérséklet mérés

Hozzászólás Szerző: gabor »

Gondolkoztam én is azon, hogy a referenciának elég stabilnak kell lennie. A tápot a laptopom usb-jéről kapja, de ha ez nem elég stabil, érünk-e valamit azzal, ha csak a referenciát stabilizáljuk? De tény, hogy most nincs szűrés, csak egy ellenállás.

A feszültséget megmérem és módosítom a képletet. De már csak holnap... :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Hőmérséklet mérés

Hozzászólás Szerző: kapu48 »

Igen érdemes!

A legjobb példa ezen a kapcsoláson levő: 4,7uF 100uH 4,7uF AVCC – AREF Szűrést is beépíteném.
http://cryptomys.de/horo/V-USB-MIDI/V-U ... B-MIDI.png
gabor
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2014. június 23. hétfő, 9:20

Re: Hőmérséklet mérés

Hozzászólás Szerző: gabor »

Tekercs nincs itthon, ezért még el kell ugranom megvenni, azután kipróbálom a szűrt referenciával is.

Találtam olyan oldalt, ahol direktben kötötték a 3.3 V-ra az AREF lábat. Én is kipróbáltam az 5 V-on és úgy néz ki, hogy működik, de ugyanúgy nagyobb értéket mutat, mint kellene.
Egy másik oldalon 10-es ciklusokban mértek és azt átlagolták. Ezt én is beépítettem és így csökkenthető az eredmény ingadozása. Bár továbbra sem értem, hogy ha 1024 bit az AD átalakító felbontása és 5 V-tal dolgozunk és a termisztor lineáris karakterisztikájú, miért jön ki rossz eredmény.
Ami szintén elgondolkodtat, hogy rámértem a termisztor kimenetére és stabil 0,74 V-ot mértem. Ezzel szemben a programban a számított "fesz" értéke 0,86 volt. Itt is van már eltérés.

Megköszönöm, ha megnézitek a sketch-et, hátha találtok benne hibát:

// Hány cikluson keresztül átlagoljuk
int meresciklus = 10;
// Pillanatnyi feszültség
float fesz = 0.0;
// Pillanatnyi hőmérséklet
float temp = 0.0;
// Átlagok
float tempavg, feszavg;
// Korrekció - ez az érthetetlen tényező
float corr = -13.0;

void setup()
{
Serial.begin(9600);
analogReference(EXTERNAL);
}

void loop()
{
tempavg = 0.0;
feszavg = 0.0;
for(int i=0; i<meresciklus; i++)
{
// Pillanatnyi feszültség kiszámítása
fesz = analogRead(A5)*(5.0/1024.0);
// (Vout - 500mV) / 10 mV/C = eredmény C
temp = fesz - 0.5;
temp /= 0.01;
tempavg += temp;
feszavg += fesz;
delay(100);
}
// átlagolunk
feszavg /= (meresciklus * 1.0);
tempavg /= (meresciklus * 1.0);
// Korrekció a pontatlan eredmény miatt
tempavg += corr;

Serial.print(feszavg);
Serial.print("\t");
Serial.println(tempavg);

delay(500);
}
Válasz küldése