.: Pavolmaria :.

Teplomer na paralélny port so snímačom SMT160–30

K napísaniu toho članku ma išpiroval článok na serveri root.cz, ktorého autorom je pán Milan Ištok.

Pôvodný dizajn teplomera z článku uverejneného na serveri root.cz som upravil pridaním rezistorov R1 a R2 na piny 1 a 14 paralélneho portu. Predíde sa tým skratu v prípade, že na jednom pine je logická 1 a na druhom pine log 0. Vtedy je rozdiel potenciálov v najhoršom prípade +5V. Teda maximalný prúd tečúci z jedného pinu do druhého je cca 2,5mA (5V / 2000 Ohm = 2.5mA). Kondenzátor C by sa mal nachádzať čo najbližsie ku snímaču. V katalógovom liste je napájací prúd snímača uvádzaný v rozsahu od 160 do 200uA.

Snímač generuje obdĺžnikový signál s frekvenciou 1-4kHz v závislosti na teplote, so striedou podľa vzorca DC=0,32+0,0047*t , kde t je teplota v stupňoch Celsia.

Teplotu vypočítame podľa vzorca Teplota [st.C]=( ( (t2 / (t1 + t2) ) - 0.32) / 0.0047), kde t1 je počet meraní, keď bola na porte zistená logická 0 a t2 je počet meraní, keď bola na portu zistená logická 1.

Zdrojový kód

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/io.h>
  4.  
  5. #define DATA 0x378
  6. #define STATUS DATA+1
  7. #define CONTROL DATA+2
  8.  
  9. float ZmerTo (unsigned short naportu, unsigned char odkud, int stav)
  10.  
  11. // funkce vraci teplotu ve st. Celsia
  12. // parametry
  13. // naportu - port na kterem se provadi mereni
  14. // odkud - bite na ktery je pripojen teplomer
  15. // stav - urcuje zda je vstup negovan
  16.  
  17. #define DelkaCyklu 0xffff
  18.  
  19. {
  20. int t0, t1, t2;
  21. int mask = (1 << odkud);
  22. t1=0;
  23. t2=0;
  24. for (t0 = 0; t0 < DelkaCyklu; t0++)
  25. // vlastn mereni
  26. if ((inb (naportu) & mask) == 0) t1++ ;
  27. // negace mereni v pripade, ze je port negovan
  28. t2=DelkaCyklu-t1;
  29. if (stav!=0){
  30. t1=t2;
  31. t2=DelkaCyklu-t1;
  32. };
  33. // vlastn vypocet teploty
  34. return ((((double)t2 / ((double)DelkaCyklu)) - 0.32) / 0.0047);
  35. }
  36.  
  37. int main (void)
  38. {
  39. if (setuid (0) < 0)
  40. {
  41. printf ("Program musi byt spusten rootem\n");
  42. exit (1);
  43. }
  44. if (ioperm (STATUS, 3, 1))
  45. {
  46. printf ("Program musi byt spusten rootem\n");
  47. exit (1);
  48. }
  49. if (ioperm (CONTROL, 3, 1))
  50. {
  51. printf ("Neni pristup na port\n");
  52. exit (1);
  53. }
  54.  
  55. // nastaveni control portu na 1 tak aby na nem bylo +5V pro napajeni
  56. outb (52, CONTROL);
  57. // zmereni teploty
  58. //pro LPT port a pro teplomer zapojeny na PIN 15
  59. printf ("Teplota je %4.1f \n", ZmerTo (STATUS, 3, 0));
  60.  
  61. // nastaveni control portu na 0 tak aby bylo vypnute napajeni cidla
  62. outb (55, CONTROL);
  63.  
  64. return (0);
  65. }

Kompilácia sa spustí príkazom gcc -O6 smt160-30lpt.c -o teplomer

Ako je vidieť, program musí byť spustený rootom (alebo musí byť na programe nastavené SUID). Ďalej musím upozorniť na to, že na LPT porte sú niektoré vstupy a výstupy negované. Nevadí to, ale ak budete zapájať viac snímačov na jeden LPT port, je nutné s tím počítať.

Na stiahnutie

Anglický katalógový list
Český katalógový list
Zdrojový súbor smt160-30lpt.c

Linky

http://www.root.cz/clanky/nejjednodussi-online-teplomer/

Na vrch stránky