{"id":635,"date":"2016-11-10T10:22:08","date_gmt":"2016-11-10T09:22:08","guid":{"rendered":"http:\/\/www.daniel.slask.pl\/?p=635"},"modified":"2021-02-12T20:49:36","modified_gmt":"2021-02-12T19:49:36","slug":"obsluga-czujnikow-wilgotnosci-dht1122-biblioteka","status":"publish","type":"post","link":"https:\/\/daniel.slask.pl\/m\/obsluga-czujnikow-wilgotnosci-dht1122-biblioteka\/","title":{"rendered":"Obs\u0142uga czujnik\u00f3w wilgotno\u015bci DHT11\/22 &#8211; biblioteka."},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/DHT.png\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/DHT-150x150.png\" alt=\"AM2302\" class=\"wp-image-646\"\/><\/a><\/figure><\/div>\n\n\n\n<p>W projekcie kt\u00f3ry w chwili obecnej wykonuj\u0119 (opis z prac zostanie opublikowany wkr\u00f3tce) jest dokonywany pomiar wilgotno\u015bci. Czujnikiem dokonuj\u0105cym pomiar wilgotno\u015bci b\u0119dzie czujnik DHT22. Przedstawiony tutaj opis, oraz biblioteki dotyczy czujnik\u00f3w:<\/p>\n\n\n\n<ol><li>DHT11<\/li><li>DHT22<\/li><\/ol>\n\n\n\n<p>Na tych czujnikach biblioteka zosta\u0142a przetestowana, wi\u0119c je\u017celi posiadasz inny typ czujnika, a biblioteka razem z nim wsp\u00f3\u0142pracuje, daj zna\u0107 w komentarzach abym m\u00f3g\u0142 umie\u015bci\u0107 tutaj t\u0105 informacj\u0119. Mo\u017cliwe, \u017ce b\u0119dzie wsp\u00f3\u0142pracowa\u0107 r\u00f3wnie\u017c z innymi tego samego producenta, b\u0105d\u017a kod b\u0119dzie wymaga\u0142 kilku modyfikacji &#8211; nie daj\u0119 pewno\u015bci, \u017ce tak b\u0119dzie (pisa\u0107 w razie problem\u00f3w).<\/p>\n\n\n\n<p>Biblioteka nie posiada funkcji blokuj\u0105cych &#8211; w programie nie u\u017cyto op\u00f3\u017anie\u0144<strong><em> _delay<\/em><\/strong>, wszystko jest oparte o Timery sprz\u0119towe i programowe. Konfiguracja i opis biblioteki w dalszej &nbsp;cz\u0119\u015bci artyku\u0142u. Najpierw troch\u0119 informacji dotycz\u0105cych samych czujnik\u00f3w &#8211; spos\u00f3b dzia\u0142ania, konfiguracja i pod\u0142\u0105czenie.<\/p>\n\n\n\n<p>Alternatywne nazwy dla czujnik\u00f3w DHT wygl\u0105daj\u0105 nast\u0119puj\u0105co:<\/p>\n\n\n\n<ul><li><span class=\"wikiword\">DHT11<\/span> = <span class=\"wikiword\">RHT01<\/span><\/li><li><span class=\"wikiword\">DHT21<\/span> = <span class=\"wikiword\">RHT02<\/span>= <span class=\"wikiword\">AM2301<\/span> = <span class=\"wikiword\">HM2301<\/span><\/li><li><span class=\"wikiword\">DHT22<\/span> = <span class=\"wikiword\">RHT03<\/span>= <span class=\"wikiword\">AM2302<\/span><\/li><li><span class=\"wikiword\">DHT33<\/span> = <span class=\"wikiword\">RHT04<\/span> = <span class=\"wikiword\">AM2303<\/span><\/li><li><span class=\"wikiword\">DHT44<\/span> = <span class=\"wikiword\">RHT05<\/span><\/li><\/ul>\n\n\n\n<p>Ja u\u017cywam czujnika DHT11, oraz brata bli\u017aniaka DHT22, czujnik AM2302. Czujniki te posiadaj\u0105 4 wyprowadzenia z czego jedno nie jest u\u017cywane:<\/p>\n\n\n\n<ol><li>Vcc<\/li><li>Magistrala 1-przewodowa (podci\u0105gni\u0119ta do VCC przez rezystor, np. 5k1)<\/li><li>Niepod\u0142\u0105czone<\/li><li>GND<\/li><\/ol>\n\n\n\n<p>Czujniki mog\u0105 by\u0107 zasilane od oko\u0142o 3.3V do 5.5V (napi\u0119cia graniczne mog\u0105 si\u0119 r\u00f3\u017cni\u0107 od zastosowane czujnika &#8211; przed pod\u0142\u0105czeniem najpierw sprawd\u017a not\u0119 katalogow\u0105 zgodnie z posiadaj\u0105cym czujnikiem).<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/Pod\u0142\u0105czenie.png\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/Pod\u0142\u0105czenie-150x150.png\" alt=\"Zdj\u0119cie z noty katalogowej DHT\" class=\"wp-image-643\"\/><\/a><figcaption>Pod\u0142\u0105czenie czujnika DHT<\/figcaption><\/figure>\n\n\n\n<p>Komunikacja z czujnikiem odbywa si\u0119 przy u\u017cyciu magistrali jedno przewodowej. Nie jest to typowa 1-wire, lecz jej modyfikacja. Czasy dla stanu logicznego 1 i 0 s\u0105 inne ni\u017c np. dla czujnik\u00f3w DS18B20. Jedynka logiczna wyst\u0119puje gdy stan niski wynosi 50us, a stan wysoki 70us, natomiast zero logiczny w przypadku gdy stan niski wynosi r\u00f3wnie\u017c 50us, ale stan wysoki mie\u015bci si\u0119 w zakresie od 26 do 28us.<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/Przebiegi.png\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/Przebiegi-150x150.png\" alt=\"Dane z noty katalgowej DHT11\" class=\"wp-image-639\"\/><\/a><figcaption>Przebieg dla 0 i 1 logicznej<\/figcaption><\/figure>\n\n\n\n<p>Po podaniu zasilania do uk\u0142adu, nale\u017cy odczeka\u0107 co najmniej 1 sekund\u0119 na ustabilizowanie si\u0119 zasilania. Nast\u0119pnie nasz mikrokontroler ustawia lini\u0119 danych w stan niski, kt\u00f3ry powinien trwa\u0107 co najmniej 18ms, po czym stan wysoki powinien trwa\u0107 od 20us do 40us. Po starcie, uC przechodzi w tryb odbierania Uk\u0142ad DHT potwierdza gotowo\u015b\u0107 ustawiaj\u0105c 0, a nast\u0119pnie 1 logiczn\u0105 przez 80us. Po tej odpowiedzi, wysy\u0142ane s\u0105 dane, kt\u00f3rych pakiet wynosi 40bit\u00f3w. Na zako\u0144czenie transmisji uk\u0142ad trzyma stan niski przez 50ms po czym zwalnia lini\u0119.<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/Ramka-danych-dht.png\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/Ramka-danych-dht-150x150.png\" alt=\"Zdj\u0119cie z noty katalogowej - dht11\" class=\"wp-image-640\"\/><\/a><figcaption>Wygl\u0105d ramki danych dla czujnika DHT<\/figcaption><\/figure>\n\n\n\n<p>Pakiet odebranych danych wynosi 40bit\u00f3w &#8211; 5 bajt\u00f3w. Pierwsze dwa bajty dotycz\u0105 wilgotno\u015bci, kolejne dwa bajty temperatury, natomiast w ostatnim bajcie znajduje si\u0119 suma kontrolna. W zale\u017cno\u015bci od zastosowanego czujnika, warto\u015b\u0107 wilgotno\u015bci i temperatury zajmuje tylko 1 bajt (jak to mam miejsce w czujniku DHT11 ).<\/p>\n\n\n\n<p>Je\u017celi dane s\u0105 poprawnie odebrane to suma 4 pierwszy bajt\u00f3w jest r\u00f3wna sumie ostatniego bajtu.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>Teraz kolej na cz\u0119\u015b\u0107 programow\u0105:<\/strong><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Biblioteka nie korzysta z delay&#8217;\u00f3w tylko z timer\u00f3w sprz\u0119towych i programowych. Do tego celu zosta\u0142 wykorzystanie Timer0 kt\u00f3ry zg\u0142asza przerwanie co 20us (implementacja i konfiguracja wewn\u0105trz biblioteki), oraz dowolnego Timera konfigurowanego przez u\u017cytkownika &#8211; przerwanie musi by\u0107 zg\u0142aszane co 10ms.<br>Bibliotek\u0119 przystosowa\u0142em do mikrokontroler\u00f3w <span style=\"text-decoration: underline;\"><em>Atmega32<\/em> oraz <em>48<\/em>, <em>88<\/em>, <em>168<\/em><\/span> &#8230;<br>Mo\u017cliwa praca z kwarcami <span style=\"text-decoration: underline;\"><em>10MHz<\/em>, <em>11.0592MHz<\/em>, <em>14.7456MHz<\/em>, <em>16MHz<\/em><\/span><\/p>\n\n\n\n<p>Funkcja odczytu zwraca warto\u015b\u0107 \u015bredni\u0105 z obecnie dokonanego pomiaru, oraz ostatniej warto\u015bci \u015bredniej.<\/p>\n\n\n\n<p>Minimalny odst\u0119p mi\u0119dzy pomiarami wg producenta mo\u017ce wynie\u015b\u0107 2sekundy.<\/p>\n\n\n\n<p>W pliku nag\u0142\u00f3wkowym .h wybieramy do kt\u00f3rego pinu podpi\u0119ty jest nasz czujnik, oraz wybieramy rodzaj czujnika (poprzez wpisanie 1 b\u0105d\u017a 2 przy <em>#define DHT<\/em>).<\/p>\n\n\n\n<p>Na pocz\u0105tku programu przed p\u0119tl\u0105 g\u0142\u00f3wn\u0105 nale\u017cy wykona\u0107 inicjalizacj\u0119 biblioteki poprzez funkcj\u0119<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c\">ds_init_dht();<\/code><\/pre>\n\n\n\n<p>(oraz odblokowa\u0107 przerwania &#8211; <strong>sei()<\/strong> ). Natomiast odczyt z czujnika dokonujemy poprzez funkcj\u0119<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c\">ds_read_dht( &amp;wilg, &amp;temp);<\/code><\/pre>\n\n\n\n<p>, gdzie wilg i temp to zmienne do kt\u00f3rych b\u0119d\u0105 przepisana warto\u015b\u0107 wilgotno\u015bci i temperatury. U\u017cytkownik tej biblioteki musi skonfigurowa\u0107 we w\u0142asnym zakresie przerwanie co 10ms i wstawi\u0107 do obs\u0142ugi nast\u0119puj\u0105cy warunek:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c\">if(dht_ms)\n        dht_ms--;\n<\/code><\/pre>\n\n\n\n<p>Przyk\u0142adowe u\u017cycie:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;avr\/io.h>\n#include &lt;avr\/interrupt.h>\n#include &lt;avr\/pgmspace.h>;\n#include &lt;stdlib.h>\n\n#include \"DS_DHT\/ds_dht.h\"\n\n\/\/w\u0142asne biblioteki\n#include \"DS_uart\/uart.h\"\n\nchar uart_buf[10];\n\n\/\/ zmienne - timery programowe\nvolatile uint16_t Timer1;\n\nuint16_t wilg, temp;\n\n\/\/ obs\u0142uga timer\u00f3w programowych\nISR( TIMER2_COMP_vect ) {\n\t uint16_t n;\n\n\tn = Timer1;\t\t\/* 1ms Timer1 *\/\n\tif (n) Timer1 = --n;\n\n\tif(dht_ms)\n\t\tdht_ms--;\n}\n\nint main(void){\n\n\t\/\/ konfiguracja Timer2 \n\tTCCR2 |= (1&lt;&lt;WGM21);\t\t\t\t\/\/ tryb CTC\n\tTCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);\t\t\/\/ preskaler = 1024\n\tOCR2  = 96;\t\t\t\t\t\/\/ 10ms 155 dla16\n\tTIMSK |= (1&lt;&lt;OCIE2);\t\t\t\t\/\/ przerwanie Compare\n\n\tds_init_dht();\n\n\t\/\/konfiguracja rs232\n\tuart_init(RS_UBRR);\n\n\t\/\/wys\u0142anie powitania\n\tuart_text_P(PSTR(\"WITAM\\n\\r\"));\n\n\tsei();\n\n\t\/\/inicjalizacja dht11\n\tDHT_DDR |= (1 &lt;&lt; DHT_PIN);\n\tDHT_OUT |= (1 &lt;&lt; DHT_PIN);\n\n\tuint8_t ch = 0;\n\n\twhile(1){\n\n\t\tif(!Timer1){\n\t\t\tTimer1 = 200;\t\/\/co 2s\n\n\t\t\tch = ds_read_dht( &amp;wilg, &amp;temp);\n\n\t\t\t\/\/czy odebrane dane by\u0142y poprawne\n\t\t\tif(ch==1)\n\t\t\t\tuart_text_P(PSTR(\"OK!\\n\\r\"));\n\n\t\t\t\/\/wy\u015bwietlenie wilgotno\u015bci\n\t\t\titoa(wilg,uart_buf,10);\n\t\t\tuart_text(uart_buf);\n\t\t\tuart_text_P(PSTR(\"\\n\\r\"));\n\n\t\t\t\/\/wy\u015bwietlenie temperatury\n\t\t\titoa(temp,uart_buf,10);\n\t\t\tuart_text(uart_buf);\n\t\t\tuart_text_P(PSTR(\"\\n\\n\\r\"));\n\t\t}\n\t}\n}<\/code><\/pre>\n\n\n\n<p>Zach\u0119cam do pobierania biblioteki i komentowania. W razie jakich\u015b pyta\u0144 b\u0105d\u017a to uwag odno\u015bnie biblioteki, piszcie w komentarzach, b\u0105d\u017a przy u\u017cyciu formularza na stronie <a href=\"http:\/\/www.daniel.slask.pl\/?page_id=20\">Kontakt<\/a>.<\/p>\n\n\n\n<a  data-e-Disable-Page-Transition=\"true\" class=\"download-link download-button aligncenter\" title=\"Wersja v1.0\" href=\"https:\/\/daniel.slask.pl\/m\/download\/648\/?tmstv=1788162625\" rel=\"nofollow\" id=\"download-link-648\" >\n\t<p>\n\t\tPobierz &ldquo;DS_DHT.zip&rdquo;\t<\/p>\n\t<small>DS_DHT.zip\t\t&ndash; Pobrano 1507 razy\t\t&ndash; 3,55 KB<\/small>\n<\/a>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W projekcie kt\u00f3ry w chwili obecnej wykonuj\u0119 (opis z prac zostanie opublikowany wkr\u00f3tce) jest dokonywany pomiar wilgotno\u015bci. Czujnikiem dokonuj\u0105cym pomiar wilgotno\u015bci b\u0119dzie czujnik DHT22. Przedstawiony tutaj opis, oraz biblioteki dotyczy czujnik\u00f3w: DHT11 DHT22 Na tych czujnikach biblioteka zosta\u0142a przetestowana, wi\u0119c&#8230;<br \/><a class=\"read-more-button\" href=\"https:\/\/daniel.slask.pl\/m\/obsluga-czujnikow-wilgotnosci-dht1122-biblioteka\/\">Wi\u0119cej<\/a><\/p>\n","protected":false},"author":1,"featured_media":645,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6,7],"tags":[113,107,112,12,32,33,41,105,106,115,116,114,108,109,110,111,47,104],"views":2871,"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/11\/czujnik.png","jetpack_shortlink":"https:\/\/wp.me\/pcPgV3-af","_links":{"self":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/635"}],"collection":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/comments?post=635"}],"version-history":[{"count":10,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/635\/revisions"}],"predecessor-version":[{"id":1771,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/635\/revisions\/1771"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media\/645"}],"wp:attachment":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media?parent=635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/categories?post=635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/tags?post=635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}