Termometras panaudojant 10K termistoriu (nepamirštant Arduino Uno bei Siemens M55 LCD)

27 06 2012

Bute niekada neturėjau termometro. Nusprendžiau kad reikia toki pasigaminti. Temperatūrą nuskaitysiu iš termistoriaus (tai toks rezistorius, kuris savo varžos sąvybes keičia priklausomai nuo jo aplinkos temperatūros). Termistorius bus jungiamas kaip analoginis įėjimas tad papildomai teks skaičiuoti temperatūros reikšmę priklausomai nuo įėjime nuskaityto paprametro. Žinoma pagrindas termometro bus Arduino Uno, o vaizdavimas bus atliekamas Siemens M55 LCD ekrane. Šiuo atveju pasirikau M55 ekraną o ne TM1638 modelį todėl, kad pastarasis kaip tik pajungtas į ekspermentų plokštę, o ir norisis su juo kokį realų dalyką sukurti.

Pajungimas

Sekančioje schemoje rasite pajugtą Siemens M55 LCD ekraną bei 10K termistorių prieArduino Uno:

atsisiųsti

Kaip matote, termistorius jungiamas panašiai kaip šviesos rezistorius ar poteciometraspanaudojant papildomą 10K rezistorių.

Programavimas

Pirmoji skirta apskaičiuoti realią temperatūrą iš termistoriaus parodymų. Ši funkcija skirta konkrečiai 10K termistoriui, tad jei naudosite kitokio nominalo reiktu kažkaip perdaryti funkcijos papametrus. Pati funcija pariimta iš šio puslapio. Štai ji:

float Thermistor(int RawADC) {
long Resistance;
float Temp; // Dual-Purpose variable to save space.
Resistance=((1024 * pad / RawADC) – pad);
Temp = log(Resistance); // Saving the Log(resistance) so not to calculate it 4 times later
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp *
Temp * Temp));
Temp = Temp – 273.15; // Convert Kelvin to Celsius
return Temp; // Return the Temperature
}

Šiai funcijai papildomai reikalingas papametras, kuris galimai atitinka termistoriaus nominalą:

float pad = 9850;

Sekanti pagalbinė funkcija skirta transformuoti float kintamajį į char masyvą. Pastarasis masyvas bus
siunčiamas į LCD ekraną pavaizdavimui. Funkcija:

char *ftoa(char *a, double f, int precision)
{
long p[] = {
0,10,100,1000,10000,100000,1000000,10000000,100000000 };
char *ret = a;
long heiltal = (long)f;
itoa(heiltal, a, 10);
while (*a != ”) a++;
*a++ = ‘.’;
long desimal = abs((long)((f – heiltal) * p[precision]));
itoa(desimal, a, 10);
return ret;
}

Generuojamas tekstas turės nurodytą skaičių skaitmenų po kablelio, kas mūms ir yra aktualu. Programoje bus naudojami keli lokalūs kintamieji:

int t=0; – paskutinis analoginio šėjimo parametras.
char tempC[4] ; – nauja temperatūra kuri turi būti pavaizduota ekrane
char tempL[4] ; – sena temperatūra kuri dabar vaizduojama ekrane

Naujos ir senios reiksmės man reikalingos dėl labai paprastos priežasties – kadangi spausdinamas ekrane skaičius bus labai didelės rezoliucijos, jų perpiešimas be reikalo užtrunka daug laiko. Kad išvengtume to aš tikrinsiu ar naujas simbolis nesutampa su senuoju ir jei sutampa tiesiog jo neperpiešiu. Kitu atveju bus vykdomas jo perpiešimas. Visa ši makalynė yra suprogramuota LOOP cikle:

void loop()
{
int tN = analogRead(THERM_PIN);
if (tN!=t)
{
float temp=Thermistor(tN);
ftoa(tempC,temp,1);
int i;
for (i=0;i<4;i++)
{
if (tempC[i]!=tempL[i])
{
lcd.chr_lcd(tempC[i],i+1,1, 4, BLUE, WHITE);
tempL[i]=tempC[i];
}
}
Serial.println(tempC);
t=temp;
}
delay(100);
}

Paanalizavus kodą manau suprasite, kad gavus naują temperatūrą mes ja pasiverčiame į Char masyva ir pastarąjį masyva tikriname su senuoju. Tikrinimo metu atsinaujine sumboliai spausdinami LCD ektrane būtent jo pozicijoje naudojant 4 dydžio šriftą. Pastarasis šriftas beja yra pats didžiausias LCD bibiotekoje (plačiau apie ją čia) ir jis ekrane pavaizduoti gali tik viso labo 4 simbolius. Dėl to mano termometras pavaizduos tik vieną laipsnį po kablelio esant pliusinei temperatūrai.

Deja bet kodas yra neišbaigtas mat taip ir neištestavau kas vyksta ekrane su minusine ar žema pliusine temperatūra (kai yra tik vienas skaičius prieš kablelį). Esant šiomssm sąlygoms termometras tiesiog turėtu rodyti negerumus paskutiniame simbolyje. Sekatis blogis –
visgi nekintantys simboliai kažkodėl yra dažnai perpiešiami. Kodėl – tiesiog neisivaizduoju. Kodas veikia, simboliai dažniausiai neperpiešiami, tačiau atsitiktiniai atvejai atsiranda ir programa pakartotinai perpiešia simbolius.

Video

Dabar Jūsų teismui termometro video:

Tas pats termometras tik iš arčiau:

Resurasai

Programos kodas čia: http://www.files.com/shared/4feac5e31ae01/Termometer-111102a.zip


Veiksmai

Information

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti / Keisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti / Keisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti / Keisti )

Google+ photo

Jūs komentuojate naudodamiesi savo Google+ paskyra. Atsijungti / Keisti )

Connecting to %s




%d bloggers like this: