Fórum témák

» Több friss téma
Fórum » DHT22 és PIC
 
Témaindító: Florianf4, idő: Jún 10, 2015
Lapozás: OK   1 / 1
(#) Florianf4 hozzászólása Jún 10, 2015 /
 
Sziasztok, már hónapok óta, kisérletezek, de nem igazán találok megoldást. Szeretnék építeni egy precíz páratartalom és hőmérséklet mérőt, naplózót keltetőgéphez. Van egy PIC16f876os kontrollerom és egy DHT22es szenzorom. Rengeteget túrtam neten, de nem igazán sikerült eddig senkinek (főleg nem assembly-ba). Szerintek a lehetetlennel próbálkozok?
A hozzászólás módosítva: Jún 10, 2015

P6100758.JPG
    
(#) abcdabcd válasza Florianf4 hozzászólására (») Jún 10, 2015 /
 
A szenzor adatlapját nézted? Digital e relative y humidity & & t t t t e emperature .../DHT22

Mi az amit nem tudtál megcsinálni, és mi az amit próbáltál? Mert, azt írod, hogy:
Idézet:
„Rengeteget túrtam neten, de nem igazán sikerült eddig senkinek (főleg nem assembly-ba). Szerintek a lehetetlennel próbálkozok?”

Szóval inkább valami kész megoldást keresnél?
Esetleg más procira se találtál?

Mert viszont az adatlapot átfutva nem biztos, hogy túl bonyolultnak tűnik, bár a puding próbája az evés mégha ez a mondás nem is illik teljesen ide, de szóval lehet hogy kipróbálva adódnak problémák... viszont nem írtad, hogy hol akadtál el...
(#) kokozo válasza Florianf4 hozzászólására (») Jún 10, 2015 /
 
Szia!
A pic más de azt könnyű módosítani : Bővebben: Link
(#) Florianf4 hozzászólása Jún 11, 2015 /
 
A gond:
A pic kell hogy mérje a jelek hosszúságát és el kell, hogy döntse, hogy a bit pozitív volt(1) vagy negatív(0). Én idáig itt akadtam el.
(#) Florianf4 válasza Florianf4 hozzászólására (») Jún 11, 2015 /
 
Szerintem a TMR regiszterekkel kell játszadozni.
(#) sirály12 válasza Florianf4 hozzászólására (») Jún 11, 2015 /
 
Nekem van ilyen érzékelőm, és sikerült is működésre bírni. Assemblyben nem tudok segíteni Én XC8-ban oldottam/másoltam le, egy 18f4550-en grafikus kijelzőre tette ki az értékeket. Ha kell ebben tudok segíteni, mármint a forráskód ezzel kapcsoltos részét oda tudom adni.
(#) Florianf4 hozzászólása Jún 11, 2015 /
 
Nagyon megköszönném. Lehet hogy ki tudok hozni belölle valamit.
(#) sirály12 válasza Florianf4 hozzászólására (») Jún 11, 2015 /
 
Íme:

A pic 20Mhz-es kavicsal megy.

  1. #include <18F4550.h>
  2. #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
  3. #use delay(clock=48000000)
  4. #INCLUDE <stdlib.h>
  5. #include <math.h>
  6. #define erzekelo PIN_B0
  7.  
  8. struct parts {
  9.     int8 LSB;
  10.     int8 MSB;
  11. };
  12.  
  13. union {
  14.     int16 wholething;
  15.     struct parts bytes;
  16. } value;
  17.  
  18.  
  19.  
  20.  
  21. volatile int16 humidity=0;
  22. volatile int16 temp=0;
  23. volatile int16 parity;
  24. volatile int16 jel=0;
  25. volatile int16 tip=0;
  26. volatile int1 ind=0;
  27. volatile int16 par1;
  28. volatile int8 par2;
  29. volatile int8 par3;
  30. volatile int8 par4;
  31. volatile int8 parr;
  32.  
  33. #int_ext
  34. void ext_isr() {
  35. if (ind == 0)
  36. {
  37. enable_interrupts(INT_TIMER1);
  38. set_timer1(0);
  39. ind = 1;
  40. }
  41. else{
  42. if (get_timer1() > 1198)
  43. {
  44. jel <<= 1;
  45. jel += 1;
  46. }
  47. else
  48. {
  49. jel <<= 1;
  50. }
  51. tip++;
  52. if (tip == 9) {par1 = jel;}
  53. if (tip == 17) { humidity = jel; par2 = jel >>= 8;    jel = 0;}
  54. if (tip == 25) {par3 = jel;}
  55. if (tip == 33) { temp = jel; par4 = jel >>= 8; jel = 0; }
  56. if (tip == 41) {
  57. parity = jel;
  58. value.wholething = humidity;
  59. par1 = value.bytes.MSB;
  60. par2 = value.bytes.LSB;
  61. value.wholething = temp;
  62. par3 = value.bytes.MSB;
  63. par4 = value.bytes.LSB;
  64. parr = 0;
  65. parr = par1 + par2 + par3 + par4;
  66. jel = 0; tip = 0; ind = 0;
  67. disable_interrupts(int_ext);
  68. disable_interrupts(INT_TIMER1);
  69. }
  70. set_timer1(0);
  71.  
  72. }
  73. }
  74.  
  75. #INT_TIMER1
  76. void timer1_isr()
  77. {
  78. }
  79.  
  80. void start()
  81. {
  82. set_tris_b(0xFE);
  83. output_low(erzekelo);
  84. delay_ms(1);
  85. output_high(erzekelo);
  86. delay_us(30);
  87. output_low(erzekelo);
  88. set_tris_b(0xFF);
  89. delay_us(30);
  90. enable_interrupts(int_ext);
  91. }


A mainban pedig ez van:
  1. setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);  
  2. disable_interrupts(INT_TIMER1);
  3. disable_interrupts(int_ext);  
  4. ext_int_edge(H_TO_L);    
  5.  
  6. enable_interrupts(global);
  7. for(;;)
  8. {
  9.  
  10. ide kell minimum 0.5 sec késleltetés
  11. start();
  12. if (parr == parity)
  13. {
  14. sprintf(text,"%3.1w C",temp);
  15. glcd_text57(120, 12, text, 1);
  16. sprintf(text,"%3.1w PT",humidity);
  17. glcd_text57(120, 45, text, 1);
  18. }
  19. }


Ha valamit kihagytam, akkor kérdezz, mert kiollóztam egy nagyobb projektből, lehetséges, hogy valamit kihagytam. Ebben a projektben, van még a picen egy pár dolog. BMP085, BH1750, HMC5883L, DS1624 és a DHT22-es.
(#) sirály12 válasza sirály12 hozzászólására (») Jún 11, 2015 /
 
Annyit még elfelejtettem írni, hogy ez a kód DHT21-el lett próbálva, de elvileg a kettő kompatibilis egymással, ha jól tudom.
(#) Lamprologus válasza sirály12 hozzászólására (») Okt 11, 2015 /
 
Ennek a program alapján próbálom feléleszteni a DHT22-őt ...
Kevés sikerrel ...

Találtam a kódodba egy részt amit nem értek ...

Idézet:
„3.#use delay(clock=48000000)”

Előtte meg azt írod hogy 20MHz az órajel

Én 8Mhz-s belső oszcival próbálom (PIC16F887), gondolom akkor a
Idézet:
„42. if (get_timer1() > 1198)”
részt módosítanom kell, ha jól számoltam akkor 479-re?
(#) silent15 hozzászólása Jún 23, 2017 /
 
Sziasztok!

Van egy PIC12F629 kontrollerem, amivel szeretnék egy DHT22 szenzort használni, viszont sehogy sem sikerül normálisan kiszednem bellőle az adatot. Annyi működik rendesen, hogy jelzem a szenzornak hogy kérném az adatot, ő pedig elkezdi küldeni, de ennyit sikerült 100%-ra megcsinálnom.

A data busz magasra van húzva. MCU-val lehúzom 2ms-ra majd fel és átteszem a lábat bemenetnek. A szenzor ezután 80us -ra alacsonyra majd 80us-ra magasra húzza. Ezután mikor már lehúzza elkezdi adni a jelet.

Keresgéltem kódokat XC8-ra de nekem nem teljesen érthetők, így pedig nem szeretném használni. Valaki fel tudna világosítani hogy miként is kéne ezt kezelni? A TMR0-m 1 lépést 1us alatt számlál, szóval azt gondoltam mérésre használni.

Az én ötletem:
Miután bemenetnek állítom a lábat, 80us-ra alacsonyra majd 80us-ra magasra húzza (itt ellenőrizhetem hogy reagált e a szenzor vagy se) Magas állapotban várok amíg magas, majd várok amíg alacsony, amikor ez megváltozik, elindítom a timert, amikor megint alacsony, leállítom a timert, megnézem mennyit számlált és eszerint eldöntöm hogy 0 vagy 1 volt a bit.
Ez elméletben mennyire helytálló?
Proteusban próbálgattam de nem igazán látnám hogy működne.

Köszönöm !
(#) Hp41C válasza silent15 hozzászólására (») Jún 23, 2017 /
 
A 1-wire buszon minden slot elején a lefutó élet a master állítja elő.
1-wire Communication with PIC
Következő: »»   1 / 1
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