<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=16650&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-03-21T18:46:11+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16650&amp;mode</id>
<entry>
<author><name><![CDATA[jacekrv1]]></name></author>
<updated>2018-03-21T18:46:11+01:00</updated>
<published>2018-03-21T18:46:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=205848#p205848</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=205848#p205848"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=205848#p205848"><![CDATA[
Dzięki Adriang200 i danielos! Pięknie śmigają biblioteki. A jak przyjemnie się analizuje kod z taką ilością komentarzy. To mi przypomina działalność mirekk36 z czasów jak był młody <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8924">jacekrv1</a> — 21 mar 2018, o 18:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2017-06-04T00:54:37+01:00</updated>
<published>2017-06-04T00:54:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190259#p190259</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190259#p190259"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190259#p190259"><![CDATA[
<div class="quotetitle">Tomek86 napisał(a):</div><div class="quotecontent"><br />Sam jestem ciekaw który będzie wskazywał dokładnej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br /><br />DHT22 jest bardziej dokładny co wynika z noty katalogowej. Wystarzy porównać notę dla DHT11 i DHT22 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 4 cze 2017, o 00:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tomek86]]></name></author>
<updated>2017-06-03T12:08:16+01:00</updated>
<published>2017-06-03T12:08:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190229#p190229</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190229#p190229"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190229#p190229"><![CDATA[
<div class="quotetitle">Adriang200 napisał(a):</div><div class="quotecontent"><br />Jak byś miał kiedy DHT22 to napisz czy też są takie odchylenia względem stacji meteo.<br /></div><br /><br />Ok, dam znać. Posiadam w tej chwili tylko DTH11, pewnie przy kolejnym zamówieniu dołożę do zakupów DTH22.<br />Sam jestem ciekaw który będzie wskazywał dokładnej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Pozdrawiam,<br />Tomek.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12012">Tomek86</a> — 3 cze 2017, o 12:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adriang200]]></name></author>
<updated>2017-06-03T11:54:27+01:00</updated>
<published>2017-06-03T11:54:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190227#p190227</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190227#p190227"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190227#p190227"><![CDATA[
Pomiędzy DHT22 a DHT11 też zaobserwowałem podobną różnicę.<br />Zawsze można to skalibrować poprzez odjęcie lub dodanie tych 20 punktów by wartości były podobne.<br />Jak byś miał kiedy DHT22 to napisz czy też są takie odchylenia względem stacji meteo.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11732">Adriang200</a> — 3 cze 2017, o 11:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tomek86]]></name></author>
<updated>2017-06-02T21:22:45+01:00</updated>
<published>2017-06-02T21:22:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190209#p190209</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190209#p190209"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190209#p190209"><![CDATA[
dzięki @Adriang200<br /><br />zmodyfikowana biblioteka działa bardzo fajnie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Tak poza tematem, zastanawiam się, czemu pomiar wilgotności przez czujnik DTH11 wskazuje o 20punktów mniej niż stacjonarna stacja meteo (któryś z czujników źle wskazuje <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12012">Tomek86</a> — 2 cze 2017, o 21:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adriang200]]></name></author>
<updated>2017-06-01T19:28:58+01:00</updated>
<published>2017-06-01T19:28:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190150#p190150</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190150#p190150"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190150#p190150"><![CDATA[
Biblioteka automatycznie wykrywająca typ czujnika, powstała na podstawie kodów udostępnionych przez <span style="color: #0040FF">danielos</span><br />Pozdrawiam.<br /><br /><span style="color: #0000BF">cz_dht.h</span><br />[syntax=c]/* cz_dht.h */<br />/* Wybór PINu oraz PORTu na magistralę 1 przewodową dla DHT11/22*/<br />#define DHT_PIN  PB0<br />#define DHT_IN   PINB<br />#define DHT_OUT  PORTB<br />#define DHT_DDR  DDRB<br /><br />/*<br /> * BIBLIOTEKA AUTOMATYCZNIE WYKRYJE PODPIĘTY TYP CZUJNIKA<br /> * Obsługa czujnika DHT11 / RHT01 typ_dht = 0<br /> * Obsługa czujnika DHT22 / RHT03 / AM2302 typ_dht = 1<br /> *<br /> */<br />extern volatile uint8_t typ_dht;<br /><br />extern volatile uint8_t flaga_1s;<br /><br /><br />void init_dht (void);<br /><br />uint8_t odczyt_dht(uint16_t* humidity, uint16_t* temperature, uint8_t* znak);//odczyt danych&#91;/code&#93;[/syntax]<br /><br /><br /><span style="color: #0000BF">cz_dht.c</span><br />[syntax=c]/* cz_dht.c */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;cz_dht.h&quot;<br /><br /><br />#define DHT_GET_IN   ( DHT_IN &amp; (1 &lt;&lt; DHT_PIN))<br />#define DHT_OUT_LOW  ( DHT_OUT &amp;= (~(1 &lt;&lt; DHT_PIN)) )<br />#define DHT_OUT_HIGH ( DHT_OUT |= (1 &lt;&lt; DHT_PIN) )<br />#define DHT_DIR_IN   ( DHT_DDR &amp;= (~(1 &lt;&lt; DHT_PIN )) )<br />#define DHT_DIR_OUT  ( DHT_DDR |= (1 &lt;&lt; DHT_PIN) )<br /><br />#define AVERAGE    1<br />#define NEW        0<br /><br />#define TIMSK_CTC_ON    TIMSK |= (1&lt;&lt;OCIE2);   // zezwolenie na przerwanie Compare Match<br />#define TIMSK_CTC_OFF   TIMSK &amp;= ~(1&lt;&lt;OCIE2);  // zablokowanie przerwania Compare Match<br /><br /><br />volatile uint8_t flaga_1s;<br /><br /><br />volatile uint8_t dht_timer;<br />volatile uint8_t dht_ms;<br /><br />volatile uint8_t typ_dht = 0;<br /><br />typedef struct {<br />    uint8_t hum_int;<br />    uint8_t hum_dec;<br />    uint8_t temp_int;<br />    uint8_t temp_frac;<br />    uint8_t checksum;<br />}t_dht;<br /><br />typedef union {<br />    uint8_t indeks&#91;5&#93;;<br />    t_dht data;<br />}U_DHT;<br /><br />U_DHT read_dht;<br /><br /><br /><br />#if defined  (__AVR_ATmega48A__) || (__AVR_ATmega48PA__) || (__AVR_ATmega88A__) || (__AVR_ATmega88PA__) \<br />        || (__AVR_ATmega168A__) || (__AVR_ATmega168PA__) || (__AVR_ATmega328P__) || (__AVR_ATmega328__)<br /><br />#define TRYB_CTC            TCCR2A |= (1&lt;&lt;WGM21)            //Tryb CTC<br />#define COMPARE_MATCH_ON     TIMSK2 |= (1&lt;&lt;OCIE2A)          // zezwolenie na przerwanie Compare Match<br /><br /><br />#if F_CPU==11059200<br />#define PRE_SCALER            TCCR2B |= (1&lt;&lt;CS20)           //preskaler 1 CR<br />#define OCR_USTAW            OCR2A = 220                    // podział przez 220 dla uzyskania 20us<br />#elif F_CPU==16000000<br />#define PRE_SCALER            TCCR2B |= (1&lt;&lt;CS22)           //preskaler 64<br />#define OCR_USTAW            OCR2A = 4                      // podział przez 4 dla uzyskania 20us<br />#elif F_CPU==20000000<br />#define PRE_SCALER            TCCR2B |= (1&lt;&lt;CS21)           //preskaler 8<br />#define OCR_USTAW            OCR2A = 49                     // podział przez 49 dla uzyskania 20us<br />#endif<br /><br />/* ******************************************************************************************* */<br /><br />#elif defined (__AVR_ATmega32__)<br /><br />#define TRYB_CTC            TCCR2 |= (1&lt;&lt;WGM21)            //Tryb CTC<br />#define COMPARE_MATCH_ON     TIMSK |= (1&lt;&lt;OCIE2)           // zezwolenie na przerwanie Compare Match<br /><br /><br />#if F_CPU==11059200<br />#define PRE_SCALER            TCCR2 |= (1&lt;&lt;CS20)           //preskaler 1 CR<br />#define OCR_USTAW            OCR2 = 220                    // podział przez 220 dla uzyskania 20us<br />#elif F_CPU==16000000<br />#define PRE_SCALER            TCCR2 |= (1&lt;&lt;CS22)           //preskaler 64<br />#define OCR_USTAW            OCR2 = 4                      // podział przez 4 dla uzyskania 20us<br />#elif F_CPU==20000000<br />#define PRE_SCALER            TCCR2 |= (1&lt;&lt;CS21)           //preskaler 8<br />#define OCR_USTAW            OCR2 = 49                     // podział przez 49 dla uzyskania 20us<br />#endif<br /><br />/* ******************************************************************************************* */<br /><br />#elif defined (__AVR_ATmega8__)<br /><br />#define TRYB_CTC            TCCR2 |= (1&lt;&lt;WGM21)           //Tryb CTC<br />#define COMPARE_MATCH_ON     TIMSK |= (1&lt;&lt;OCIE2)          // zezwolenie na przerwanie Compare Match<br /><br /><br />#if F_CPU==11059200<br />#define PRE_SCALER            TCCR2 |= (1&lt;&lt;CS20)         //preskaler 1 CR<br />#define OCR_USTAW            OCR2 = 220                  // podział przez 220 dla uzyskania 20us<br />#elif F_CPU==16000000<br />#define PRE_SCALER            TCCR2 |= (1&lt;&lt;CS22)         //preskaler 64<br />#define OCR_USTAW            OCR2 = 4                    // podział przez 4 dla uzyskania 20us<br />#elif F_CPU==20000000<br />#define PRE_SCALER            TCCR2 |= (1&lt;&lt;CS21)         //preskaler 8<br />#define OCR_USTAW            OCR2 = 49                   // podział przez 49 dla uzyskania 20us<br />#endif<br /><br />/* ******************************************************************************************* */<br /><br />#endif<br /><br /><br /><br /><br />void init_dht( void ) {<br /><br /><br />    TRYB_CTC; //tryb CTC<br />    PRE_SCALER; //preskaler<br />    OCR_USTAW; // podział dla uzyskania 20us<br />    COMPARE_MATCH_ON; // zezwolenie na przerwanie Compare Match<br /><br /><br />}<br /><br /><br /><br />uint8_t odczyt_dht( uint16_t* humidity, uint16_t* temperature, uint8_t* znak ) {<br /><br />    uint8_t j = 0, i = 0;<br /><br />    //procedura startu<br />    DHT_DIR_OUT;<br />    DHT_OUT_HIGH;<br />    DHT_OUT_LOW;<br /><br />    //odczekanie więcej jak 18ms dla DHT11<br />    dht_ms = 35;<br /><br />    if ( !typ_dht ) { // DHT11<br />        while ( dht_ms );<br />    } else {           // DHT22<br />        //dla dht22 ma być 500us czyli 0,5ms<br />        _delay_us( 500 );<br />    }<br /><br /><br />    DHT_OUT_HIGH;<br /><br />    //ustawienie wejścia<br />    DHT_DIR_IN;<br /><br />    //czekanie na potwierdzenie z czujnika około 10us<br />    dht_timer = 0;<br />    while ( DHT_GET_IN ) {<br />        if ( dht_timer &gt; 10 )   //jeżeli w przeciągu 200us nie nastąpi wyjście<br />            return 0;            //zgłoś błąd<br />    }<br /><br />    //Potwierdzenie nadawania przez dht - stan niski i wysoki przez 80us<br />    dht_timer = 0;<br />    while ( !DHT_GET_IN ) {        //80us stan niski<br />        if ( dht_timer &gt; 10 )   //jeżeli w przeciągu 200us nie nastąpi wyjście<br />            return 0;            //zgłoś błąd<br />    }<br /><br />    while ( DHT_GET_IN ) {        //80us stam wysoki<br />        if ( dht_timer &gt; 20 )   //jeżeli w przeciągu 400us nie nastąpi wyjście (kolejne 200us)<br />            return 0;            //zgłoś błąd<br />    }<br /><br />    //odczyt danych<br />    //odbiór 5 pakietów danych<br />    for ( j = 0 ; j &lt; 5 ; j++ ) {<br /><br />        //wyzerowanie zmiennej<br />        read_dht.indeks&#91;j&#93; = 0x00;<br /><br />        for ( i = 8 ; i &gt; 0 ; ) {<br />            --i;                    //najpierw dekrementacja zmiennej<br /><br />            dht_timer = 0;            //wyzeruje licznik<br /><br />            while ( !DHT_GET_IN ) {    //najpierw stan niski<br />                if ( dht_timer &gt; 10 )    //jeżeli w przeciągu 200us nie nastąpi wyjście<br />                    return 0;        //zgłoś błąd<br />            }<br />            while ( DHT_GET_IN ) {    //następnie stan wysoki<br />                if ( dht_timer &gt; 20 )    //jeżeli w przeciągu 400us nie nastąpi wyjście (kolejne 200us)<br />                    return 0;        //zgłoś błąd<br />            }<br /><br />            //0 logiczne występuje gdy stan niski trwa 50us a stan wysoki 26-28us<br />            //czyli razem około 80us.<br />            //1 logiczna występuje gdy stan niski trwa 50us a stan wysoki 70us<br />            //czyli razem około 120us<br />            if (( dht_timer &gt;= 6 ) &amp;&amp; ( dht_timer &lt;= 8 ) ) {<br />                //jeżeli czas pomiaru stanu wysokiego i niskiego wyniósł<br />                // od 100us do 160 us to wpisz logiczną jedynkę<br />                read_dht.indeks&#91;j&#93; |= ( 1 &lt;&lt; i );<br />            }<br />        }<br />    }<br /><br />    dht_timer = 0;<br />    //Zakończenie transmisji sygnalizowane jest stanem niskim trwającym 50us,<br />    //ustawionym przez układ DHT<br />    while ( !DHT_GET_IN ) {    //najpierw stan niski<br />        if ( dht_timer &gt; 10 )    //jeżeli w przeciągu 200us nie nastąpi wyjście<br />            return 0;        //zgłoś błąd<br />    }<br /><br />    //Ustawienie pinu jako wyjście i ustawienie na nim stanu wysokiego<br />    DHT_DIR_OUT;<br />    DHT_OUT_HIGH;<br /><br />    //obliczenie sumy kontrolnej<br />    uint8_t checksum = (( read_dht.indeks&#91;0&#93; + read_dht.indeks&#91;1&#93; + read_dht.indeks&#91;2&#93; + read_dht.indeks&#91;3&#93; ) );<br /><br /><br /><br /><br />    /*****************    DHT11    ************************/<br />    if ( !typ_dht ) {<br />        //czy dane zostałe poprawnie odebrane<br />        if ( checksum == read_dht.indeks&#91;4&#93; ) {<br /><br />            //przepisanie do danych wejściowych<br />            *humidity = read_dht.data.hum_int;<br />            *temperature = read_dht.data.temp_int;<br />            *znak = 0;<br /><br />            return 1;<br /><br />        } else<br /><br />            return 0;<br /><br />    }//typdht<br />    /*****************    DHT11    ************************/<br /><br /><br /><br />    /*****************    DHT22    ************************/<br />    if ( typ_dht ) {<br />        //czy dane zostałe poprawnie odebrane<br />        if ( checksum == read_dht.indeks&#91;4&#93; ) {<br /><br />            //wilgotność<br />//        uint16_t wilg = (read_dht.indeks&#91;0&#93; &lt;&lt; 8) | read_dht.indeks&#91;1&#93;;<br />            *humidity = ( read_dht.indeks&#91;0&#93; &lt;&lt; 8 ) | read_dht.indeks&#91;1&#93;;<br /><br /><br />            //temperatura<br />            int16_t temp = ( read_dht.indeks&#91;2&#93; &lt;&lt; 8 )  | read_dht.indeks&#91;3&#93;;   // temperatura ze znakiem<br /><br />            //wyłuskanie znaku z wartości ujemnej<br />            if ( temp &amp; 0x8000 ) {<br />                *temperature = temp &amp; 0x7FFF;<br />                *znak = 1;    // wartość ujemna<br />            } else {<br />                *temperature = temp;<br />                *znak = 0;    // wartość dodatnia<br />            }<br /><br /><br />            return 1;<br />        } else<br />            return 0;<br />    }//typdht<br />    /*****************    DHT22    ************************/<br /><br />    return 0;<br />}<br /><br /><br /><br />#if defined (__AVR_ATmega8__)<br />ISR( TIMER2_COMP_vect )<br />#elif (__AVR_ATmega48A__) || (__AVR_ATmega48PA__) || (__AVR_ATmega88A__) || (__AVR_ATmega88PA__) \<br />        || (__AVR_ATmega168A__) || (__AVR_ATmega168PA__) || (__AVR_ATmega328P__) || (__AVR_ATmega328__)<br />ISR( TIMER2_COMPA_vect )<br />#elif defined (__AVR_ATmega32__)<br />ISR( TIMER2_COMP_vect )<br />#endif<br />{<br />    uint8_t us;<br /><br />    static uint16_t ss = 0;<br />    static uint8_t ms = 0;<br /><br />    if ( ss++ &gt; 49999 ) {<br /><br />        flaga_1s = 1;<br /><br />        ss = 0;<br />    }<br /><br /><br />    if ( ms++ &gt; 49 ) {<br /><br />        us = dht_ms;<br />        if ( us ) dht_ms = --us;<br />//        dht_ms--;<br /><br />        ms = 0;<br />    }<br /><br />    dht_timer++;<br />}[/syntax]<br /><br /><br /><br /><span style="color: #0000BF">main.c</span><br />[syntax=c]/* main.c */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br /><br />#include &quot;MK_USART/mkuart.h&quot;<br /><br />#include &quot;cz_dht.h&quot;<br /><br /><br />uint16_t wilg, temp;<br />uint8_t znak;<br /><br />uint8_t ch;<br /><br />int main( void ) {<br />    USART_Init( __UBRR );<br /><br />    init_dht();<br /><br /><br /><br />    sei();<br />    ch = odczyt_dht( &amp;wilg, &amp;temp, &amp;znak );<br />    uart_puts( &quot;START\r\n&quot; );<br /><br />    while ( 1 ) {<br /><br /><br />        if ( flaga_1s ) {<br />            static uint8_t stan = 1;  // co dwie sekundy jest odczytywana temperatura<br /><br />            if ( !stan ) {<br />                ch = odczyt_dht( &amp;wilg, &amp;temp, &amp;znak );<br /><br />            } else {<br />                if ( ch == 1 ) {    // sprawdzenie sumy kontrolnej<br /><br /><br />//     odebranie wartości z czujnika jest sygnalizowane mruganiem diody LED<br />                    PORTB ^= ( 1 &lt;&lt; PB5 );<br />                    DDRB ^= ( 1 &lt;&lt; PB5 );<br /><br />                    if ( stan ) {<br />                        uart_puts( &quot;\f&quot; );<br />                        uart_putint( wilg, 10 );<br />                        uart_puts( &quot;  wilg &quot; );<br />                        uart_puts( &quot;\r\n&quot; );<br /><br />                        if ( typ_dht ) {<br />                            uart_putint( znak, 10 );<br />                            uart_puts( &quot;    on/off znak minus &quot; );<br />                            uart_puts( &quot;\r\n&quot; );<br />                        }<br /><br />                        uart_putint( temp, 10 );<br />                        uart_puts( &quot;  temp &quot; );<br />                        uart_puts( &quot;\r\n**********\r\n&quot; );<br /><br />                        if ( !typ_dht ) uart_puts( &quot; typ czujnika DHT_11&quot; );<br />                        else uart_puts( &quot; typ czujnika DHT_22&quot; );<br />                    }<br /><br />                } else {<br />                    typ_dht ^= 1;    // przełączenie na inny typ czujnika<br />                    uart_puts( &quot; \f ERROR - brak czujnika \r\n &quot; );<br />//                _delay_ms(500);<br />                }<br /><br />            }<br /><br /><br />            stan ^= 1;<br />            flaga_1s = 0;<br />        }<br /><br /><br />    }<br />}[/syntax]<br /><br /><br /><br />Jeszcze potrzebna będzie biblioteka USART, ale to już w własnym zakresie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11732">Adriang200</a> — 1 cze 2017, o 19:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tomek86]]></name></author>
<updated>2017-05-30T17:03:30+01:00</updated>
<published>2017-05-30T17:03:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190006#p190006</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190006#p190006"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=190006#p190006"><![CDATA[
<div class="quotetitle">Adriang200 napisał(a):</div><div class="quotecontent"><br />Jeszcze troszeczkę dopieściłem i mam automatyczne wykrywanie podłączonego czujnika. Jak ktoś chce to podeślę kod po lekkich modyfikacjach.<br /></div><br /><br />Bardzo chętnie przetestuję biblioteczkę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />, jestem ciekawy jak wykonałeś wykrycie czujnika <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12012">Tomek86</a> — 30 maja 2017, o 17:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tomek86]]></name></author>
<updated>2017-05-30T17:39:30+01:00</updated>
<published>2017-05-29T19:45:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=189952#p189952</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=189952#p189952"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=189952#p189952"><![CDATA[
hmm a ja mam jakieś &quot;zaćmienie umysłu&quot;, mi ta biblioteka nie działa... właściwie to utyka na odczycie temperatury.<br />Myślałem, że może czujnik mam uszkodzony ale na arduino DHT11 działa poprawnie.<br /><br />Dane platformy testowej:<br /><br />Zestaw ATB-1.04b (Atmega32)<br />Czujnik DHT11<br /><br />Port pod czujnik PB0<br />[syntax=c]...<br />/* Wybór PINu oraz PORTu na magistralę 1 przewodową dla DHT11/22*/<br />#define DHT_PIN  PB0<br />#define DHT_IN   PINB<br />#define DHT_OUT  PORTB<br />#define DHT_DDR  DDRB<br /><br />/*<br /> * Obsługa czujnika DHT11 / RHT01 wybierz 1<br /> * Obsługa czujnika DHT22 / RHT03 / AM2302 wybierz 2<br /> *<br /> */<br />#define DHT1<br />...[/syntax]<br /><br />i jeszcze plik main.c<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 29.05.2017<br /> *      Author: Tomek<br /> */<br /><br /><br />/*<br /> * main.c<br /> *<br /> *  Created on: 29.05.2017<br /> *       Autor: Tomek<br /> *<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;DS_DHT/ds_dht.h&quot;<br /><br />//makra<br />#define PORT(X) XPORT(X)<br />#define XPORT(X) PORT##X<br /><br />#define DDR(X) XDDR(X)<br />#define XDDR(X) DDR##X<br /><br />#define PIN(X) XPIN(X)<br />#define XPIN(X) PIN##X<br /><br />#define LED_PORT B<br />#define LED_DEBUG (1&lt;&lt;PB7)<br /><br />#define LED_DEBUG_OFF PORT(LED_PORT) |= LED_DEBUG<br />#define LED_DEBUG_ON PORT(LED_PORT) &amp;= ~LED_DEBUG<br />#define LED_DEBUG_TOGGLE PORT(LED_PORT) ^= LED_DEBUG<br /><br />int main( void ) {<br /><br />DDRB |= LED_DEBUG;<br />LED_DEBUG_OFF;<br /><br />sei();// globalne odblokowanie przerwań<br />//cli();// globalne wyłączenie przerwań<br /><br />uint16_t pomiar&#91;2&#93;;<br /><br />lcd_init();<br />ds_init_dht();<br /><br />lcd_locate(0, 0);<br />lcd_str(&quot;Start...&quot;);<br />_delay_ms(2000);<br />lcd_cls();<br /><br />while( 1 ) {// główna pętla programu<br /><br />LED_DEBUG_TOGGLE;<br />_delay_ms(2000);<br />LED_DEBUG_TOGGLE;<br /><br />ds_read_dht(&amp;pomiar&#91;0&#93;, &amp;pomiar&#91;1&#93;);<br />lcd_locate(0, 0);<br />lcd_int(pomiar&#91;0&#93;);<br />lcd_locate(1, 0);<br />lcd_int(pomiar&#91;1&#93;);<br /><br />//LED_DEBUG_TOGGLE;<br /><br />}<br /><br />}[/syntax]<br /><br />ehh... wstyd się przyznać, gdybym wcześniej przeczytał...:<br /><br />[syntax=c]/*<br /> * ds_dht.c<br /> *<br /> *  Created on: 19 paź 2016<br /> *Edited on:28 paź 2016<br /> *      Author: Daniel<br /> *<br /> *<br /> *      Obsługa czujników DHT11 / RHT01 / DHT22 / RHT03 / AM2302<br /> *<br /> *      Obsługa AVR Atmega8, Atmega32<br /> *      Obsługa częstotliwości  10MHz, 11.0592MHz, 14.7456MHz, 16MHz<br /> *<br /> *      Biblioteka wykorzystuje przerwanie od timera 0 w trybie CTC co 20us -<br /> *      przerwanie skonfigurowane wewnątrz biblioteki.<br /> *      Dodatkowo, wykorzystywane jest przerwanie co 10ms, które należy skonfigurowac<br /> *      samodzielnie i w obsłudze przerwania umieścić następujący warunek:<br /> *<br /> *      if(dht_ms)<br /> *dht_ms--;<br /> *<br /> *<br /> *<br /> */[/syntax]<br /><br />plik: mina.c<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 29.05.2017<br /> *       Autor: Tomek<br /> *<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;DS_DHT/ds_dht.h&quot;<br /><br />//makra<br />#define PORT(X) XPORT(X)<br />#define XPORT(X) PORT##X<br /><br />#define DDR(X) XDDR(X)<br />#define XDDR(X) DDR##X<br /><br />#define PIN(X) XPIN(X)<br />#define XPIN(X) PIN##X<br /><br />#define LED_PORT B<br />#define LED_DEBUG (1&lt;&lt;PB7)<br /><br />#define LED_DEBUG_OFF PORT(LED_PORT) |= LED_DEBUG<br />#define LED_DEBUG_ON PORT(LED_PORT) &amp;= ~LED_DEBUG<br />#define LED_DEBUG_TOGGLE PORT(LED_PORT) ^= LED_DEBUG<br /><br />int main( void ) {<br /><br />DDRB |= LED_DEBUG;<br />LED_DEBUG_OFF;<br /><br /><br />//cli();// globalne wyłączenie przerwań<br /><br />TCCR2 |= (1 &lt;&lt; WGM21);<br />TCCR2 |= ((1 &lt;&lt; CS22) | (1 &lt;&lt; CS20));<br />TIMSK |= (1 &lt;&lt; OCIE2);<br />OCR2 = 107;<br /><br />sei();// globalne odblokowanie przerwań<br /><br />uint16_t pomiar&#91;2&#93;;<br /><br />lcd_init();<br />ds_init_dht();<br /><br />lcd_locate(0, 0);<br />lcd_str(&quot;Start...&quot;);<br />_delay_ms(2000);<br />lcd_cls();<br /><br />while( 1 ) {// główna pętla programu<br /><br />LED_DEBUG_TOGGLE;<br />_delay_ms(2000);<br /><br />ds_read_dht(&amp;pomiar&#91;0&#93;, &amp;pomiar&#91;1&#93;);<br />lcd_locate(0, 0);<br />lcd_int(pomiar&#91;0&#93;);<br />lcd_locate(1, 0);<br />lcd_int(pomiar&#91;1&#93;);<br />}<br /><br /><br />}<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />if(dht_ms)<br />dht_ms--;<br />}[/syntax]<br /><br />A więc tak &quot;coś tam się wykonuje&quot;, ale dodatkowo musiałem wyrzucić z biblioteki: z pliku ds_dth.c z lini 271: PORTA ^= (1&lt;&lt;PA0);<br />Bo w innym wypadku miałem znaki zapytania.<br />Tylko, że na lcd wyświetlają mi się dwie zmienne pomiar[0] o wartości 8709i pomiar[1] 8453, i te wartości się nie zmieniają nawet jak czujnik trzymam w palcach.<br /><br />Pozdrawiam,<br />Tomek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12012">Tomek86</a> — 29 maja 2017, o 19:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adriang200]]></name></author>
<updated>2017-05-28T21:15:16+01:00</updated>
<published>2017-05-28T21:15:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=189917#p189917</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=189917#p189917"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=189917#p189917"><![CDATA[
Super.<br />Wielkie dzięki za bibliotekę. Przetestowałem na DHT11 - działa, a na DHT22 po małych modyfikacjach kodu pięknie odczytuje wraz ze znakiem temperatury ujemnej.<br />Jeszcze troszeczkę dopieściłem i mam automatyczne wykrywanie podłączonego czujnika. Jak ktoś chce to podeślę kod po lekkich modyfikacjach.<br />Pozdrawiam wszystkich.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11732">Adriang200</a> — 28 maja 2017, o 21:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[danielos]]></name></author>
<updated>2017-05-02T18:13:57+01:00</updated>
<published>2017-05-02T18:13:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=188260#p188260</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=188260#p188260"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=188260#p188260"><![CDATA[
<div class="quotetitle">gordon10 napisał(a):</div><div class="quotecontent"><br />Bardzo fajna biblioteka i działa bez problemu na ATmega644PA (po minimalnych przeróbkach).<br /></div><br />Ciesze się, że przydała się kolejnej osobie.<br /><br /><div class="quotetitle">gordon10 napisał(a):</div><div class="quotecontent"><br />przerwaniach COMPx i PCINTx<br /></div><br />hmmm, na pewno ciekawy i niespotykany sposób. <br />Czekam na wyniki twoich wysiłków - życzę więc powodzenia i wytrwałości.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=898">danielos</a> — 2 maja 2017, o 18:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gordon10]]></name></author>
<updated>2017-04-30T21:22:06+01:00</updated>
<published>2017-04-30T21:22:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=188130#p188130</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=188130#p188130"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=188130#p188130"><![CDATA[
Bardzo fajna biblioteka i działa bez problemu na ATmega644PA (po minimalnych przeróbkach).<br />Ja próbowałem obsłużyć ten czujnik na przerwaniach COMPx i PCINTx, ale jakoś opornie mi to idzie... <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=968">gordon10</a> — 30 kwi 2017, o 21:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2016-10-29T20:07:26+01:00</updated>
<published>2016-10-29T20:07:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173140#p173140</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173140#p173140"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173140#p173140"><![CDATA[
10% kalafonii ?  <img src="https://forum.atnel.pl/images/smilies/icon_e_confused.gif" alt=":?" title="Boi się" /> <br />może dać nieprzewidziany efekt,<br />do resetu lepiej nie mieszać <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><br />Uwaga- restart może być uciążliwy.  <img src="https://forum.atnel.pl/images/smilies/icon_e_confused.gif" alt=":?" title="Boi się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11549">Daro69</a> — 29 paź 2016, o 20:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[majster]]></name></author>
<updated>2016-10-29T19:35:06+01:00</updated>
<published>2016-10-29T19:35:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173138#p173138</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173138#p173138"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173138#p173138"><![CDATA[
<div class="quotetitle">danielos napisał(a):</div><div class="quotecontent"><br />Trzeba się w końcu zresetować <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br /><br />Najlepszy reset elektronika:<br />10% kalafonii<br />90% spirytusu<br />Zmieszane w pojemniku 50ml <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Wysłane z mojego LIVE przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1628">majster</a> — 29 paź 2016, o 19:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[danielos]]></name></author>
<updated>2016-10-29T19:06:00+01:00</updated>
<published>2016-10-29T19:06:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173135#p173135</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173135#p173135"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173135#p173135"><![CDATA[
<div class="quotetitle">buz11 napisał(a):</div><div class="quotecontent"><br />No i jedna drobnostka - to jest czujnik wilgotności i temperatury a nie ciśnienia i temperatury<br /></div><br /><br />Hehehe... wiedziałem że gdzieś użyłem słowa 'ciśnienie' ale nie wiedziałem gdzie. Tak to już jest jak się ma mętlik w głowie. Trzeba się w końcu zresetować <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />W plikach zmienię jak będzie jakaś zmiana dot. działania programu. W wątku już zmieniam.<br /><br />Dzięki;)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=898">danielos</a> — 29 paź 2016, o 19:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[buz11]]></name></author>
<updated>2016-10-29T17:18:54+01:00</updated>
<published>2016-10-29T17:18:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173133#p173133</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173133#p173133"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173133#p173133"><![CDATA[
No i jedna drobnostka - to jest czujnik wilgotności i temperatury a nie ciśnienia i temperatury <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=686">buz11</a> — 29 paź 2016, o 17:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[danielos]]></name></author>
<updated>2016-10-29T16:14:22+01:00</updated>
<published>2016-10-29T16:14:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173130#p173130</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173130#p173130"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173130#p173130"><![CDATA[
<div class="quotetitle">MikieMan napisał(a):</div><div class="quotecontent"><br />Dziękuję za podzielenie się swoją pracą, przy okazji przetestuję.<br /></div><br /><br />No to czekam na opinię po testach.<br /><br /><div class="quotetitle">buz11 napisał(a):</div><div class="quotecontent"><br />Biblioteka działa, sprawdziłem na DHT11 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Trzeba tylko w pliku ds_dht.c w warunku:<br />(..)<br />dopisać sprawdzanie tej sumy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br /><br />Dzięki za opinię i testy, oraz za znalezienie błędu. Obliczanie tej sumy jest, ale w tym warunku który został troszeczkę źle sformułowany - coś źle musiałem przenieść. Dzięki za znalezieniu tego błędu.<br /><br />Już poprawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=898">danielos</a> — 29 paź 2016, o 16:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[buz11]]></name></author>
<updated>2016-10-29T15:33:53+01:00</updated>
<published>2016-10-29T15:33:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173129#p173129</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173129#p173129"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173129#p173129"><![CDATA[
Hej,<br /><br />Biblioteka działa, sprawdziłem na DHT11 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Trzeba tylko w pliku ds_dht.c w warunku:<br />[syntax=c]#if DHT == 1<br /> <br />        //czy dane zostałe poprawnie odebrane<br />        if(checksum){[/syntax]<br /><br /> dopisać sprawdzanie tej sumy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />[syntax=c]#if DHT == 1<br /><br />//sprawdzenie sumy kontrolnej<br />uint8_t checksum = ( (read_dht&#91;NEW&#93;.indeks&#91;0&#93; + read_dht&#91;NEW&#93;.indeks&#91;1&#93; + read_dht&#91;NEW&#93;.indeks&#91;2&#93; + read_dht&#91;NEW&#93;.indeks&#91;3&#93;) );<br /><br />//czy dane zostałe poprawnie odebrane<br />if(checksum){[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=686">buz11</a> — 29 paź 2016, o 15:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MikieMan]]></name></author>
<updated>2016-10-29T08:17:51+01:00</updated>
<published>2016-10-29T08:17:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173115#p173115</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173115#p173115"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173115#p173115"><![CDATA[
Bardzo ładnie napisana uniwersalna biblioteka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br />Dziękuję za podzielenie się swoją pracą, przy okazji przetestuję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3503">MikieMan</a> — 29 paź 2016, o 08:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gufim]]></name></author>
<updated>2016-10-29T07:16:24+01:00</updated>
<published>2016-10-29T07:16:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173114#p173114</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173114#p173114"/>
<title type="html"><![CDATA[Re: Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173114#p173114"><![CDATA[
Dzięki kawał dobrej roboty<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=126">gufim</a> — 29 paź 2016, o 07:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[danielos]]></name></author>
<updated>2016-10-29T19:08:24+01:00</updated>
<published>2016-10-28T21:07:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173093#p173093</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173093#p173093"/>
<title type="html"><![CDATA[Bibioteka dla czujnika wilgotności DHT11/22]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16650&amp;p=173093#p173093"><![CDATA[
Witam.<br /><br />Chciałbym wam przedstawić mój pomysł na obsługę czujnika wilgotności DHT11/DHT22 ( RHT01 / RHT03 / AM2302). <br /><br />Proszę również o przetestowanie, oraz o ewentualne podpowiedzi co dodać/zmienić.<br /><br />Biblioteka nie korzysta z delay'ów tylko z timerów sprzętowych i programowych. Do tego celu został wykorzystanie Timer0 który zgłasza przerwanie co 20us (implementacja i konfiguracja wewnątrz biblioteki), oraz dowolnego Timera konfigurowanego przez użytkownika - przerwanie musi być zgłaszane co 10ms. <br />Bibliotekę przystosowałem do mikrokontrolerów Atmega32 oraz 48, 88, 168 ...<br />Możliwa praca z kwarcami 10MHz, 11.0592MHz, 14.7456MHz, 16MHz<br /><br />Funkcja odczytu zwraca wartość średnią z obecnie dokonanego pomiaru, oraz ostatniej wartości średniej.<br /><br />Minimalny odstęp między pomiarami wg producenta może wynieść 2sekundy.<br /><br />W pliku nagłówkowym .h wybieramy do którego pinu podpięty jest nasz czujnik, oraz wybieramy rodzaj czujnika (poprzez wpisanie 1 bądź 2 przy #define DHT).<br /><br />[syntax=c]/*<br /> * ds_dht.h<br /> *<br /> *  Created on: 19 paź 2016<br /> *Edited on:28 paź 2016<br /> *      Author: Daniel<br /> *<br /> *      Obsługa czujników DHT11 / RHT01 / DHT22 / RHT03 / AM2302<br /> *<br /> *      Obsługa AVR Atmega8, Atmega32<br /> *      Obsługa częstotliwości  10MHz, 11.0592MHz, 14.7456MHz, 16MHz<br /> *<br /> *      Biblioteka wykorzystuje przerwanie od timera 0 w trybie CTC co 20us -<br /> *      przerwanie skonfigurowane wewnątrz biblioteki.<br /> *      Dodatkowo, wykorzystywane jest przerwanie co 10ms, które należy skonfigurowac<br /> *      samodzielnie i w obsłudze przerwania umieścić następujący warunek:<br /> *<br /> *      if(dht_ms)<br /> *dht_ms--;<br /> *<br /> *<br /> */<br /><br />#ifndef DS_DHT_DS_DHT_H_<br />#define DS_DHT_DS_DHT_H_<br /><br />/* Wybór PINu oraz PORTu na magistralę 1 przewodową dla DHT11/22*/<br />#define DHT_PIN  PB0<br />#define DHT_IN   PINB<br />#define DHT_OUT  PORTB<br />#define DHT_DDR  DDRB<br /><br />/*<br /> * Obsługa czujnika DHT11 / RHT01 wybierz 1<br /> * Obsługa czujnika DHT22 / RHT03 / AM2302 wybierz 2<br /> *<br /> */<br />#define DHT2<br /><br /><br /><br />//!!!!!NIE ZMIENIAĆ!!!!!<br />volatile uint8_t dht_timer;<br />volatile uint8_t dht_ms;<br /><br />void ds_init_dht(void);//inicjalizacja mikrokontrolera do obsługi czujnika wilgotności<br />uint8_t ds_read_dht(uint16_t* humidity, uint16_t* temperature);//odczyt danych<br /><br /><br />#endif /* DS_DHT_DS_DHT_H_ */[/syntax]<br /><br />Plik główny wygląda następująco:<br /><br />[syntax=c]/*<br /> * ds_dht.c<br /> *<br /> *  Created on: 19 paź 2016<br /> *Edited on:28 paź 2016<br /> *      Author: Daniel<br /> *<br /> *<br /> *      Obsługa czujników DHT11 / RHT01 / DHT22 / RHT03 / AM2302<br /> *<br /> *      Obsługa AVR Atmega8, Atmega32<br /> *      Obsługa częstotliwości  10MHz, 11.0592MHz, 14.7456MHz, 16MHz<br /> *<br /> *      Biblioteka wykorzystuje przerwanie od timera 0 w trybie CTC co 20us -<br /> *      przerwanie skonfigurowane wewnątrz biblioteki.<br /> *      Dodatkowo, wykorzystywane jest przerwanie co 10ms, które należy skonfigurowac<br /> *      samodzielnie i w obsłudze przerwania umieścić następujący warunek:<br /> *<br /> *      if(dht_ms)<br /> *dht_ms--;<br /> *<br /> *<br /> *<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;ds_dht.h&quot;<br /><br />#define DHT_GET_IN   ( DHT_IN &amp; (1 &lt;&lt; DHT_PIN))<br />#define DHT_OUT_LOW  ( DHT_OUT &amp;= (~(1 &lt;&lt; DHT_PIN)) )<br />#define DHT_OUT_HIGH ( DHT_OUT |= (1 &lt;&lt; DHT_PIN) )<br />#define DHT_DIR_IN   ( DHT_DDR &amp;= (~(1 &lt;&lt; DHT_PIN )) )<br />#define DHT_DIR_OUT  ( DHT_DDR |= (1 &lt;&lt; DHT_PIN) )<br /><br />#define AVERAGE1<br />#define NEW0<br /><br /><br />#if defined (__AVR_ATmega48A__) || (__AVR_ATmega48PA__) || (__AVR_ATmega88A__) || (__AVR_ATmega88PA__) \<br />|| (__AVR_ATmega168A__) || (__AVR_ATmega168PA__) || (__AVR_ATmega328P__) || (__AVR_ATmega328__)<br /><br />#define OCR_CTCOCR0A<br />#define TIMSK_CTC TIMSK0<br />#define OCIE_CTC OCIE0A<br /><br />#define TCCR_CTC(TCCR0A |= (1&lt;&lt;WGM01))//Tryb CTC<br />#define PRE_8(TCCR0B |= (1&lt;&lt;CS01))//preskaler 8<br />#define PRE_64(TCCR0B |= (1&lt;&lt;CS01) | (1&lt;&lt;CS00))//preskaler 64<br /><br />#elif defined (__AVR_ATmega32__)<br />#defineOCR_CTC OCR0<br />#define TIMSK_CTC TIMSK<br />#define OCIE_CTC OCIE0<br /><br />#define TCCR_CTC(TCCR0 |= (1&lt;&lt;WGM01))//Tryb CTC<br />#define PRE_8(TCCR0 |= (1&lt;&lt;CS01))//preskaler 8<br />#define PRE_64(TCCR0 |= (1&lt;&lt;CS01) | (1&lt;&lt;CS00))//preskaler 64<br /><br />#endif<br /><br />typedef struct{<br />uint8_t hum_int;<br />uint8_t hum_dec;<br />uint8_t temp_int;<br />uint8_t temp_frac;<br />uint8_t checksum;<br />}t_dht;<br /><br />typedef union{<br />uint8_t indeks&#91;5&#93;;<br />t_dht data;<br />}U_DHT;<br /><br />U_DHT read_dht&#91;2&#93;;//tablica 2 elementowa - wartosc średnia, ostatnia wartosc<br /><br />//inicjalizacja mikrokontrolera do obsługi czujnika wilgotności<br />void ds_init_dht(void){<br /><br />//konfiguracja Timera0 - 20us<br /><br />#if F_CPU&lt;=8000000<br />#error &quot;Zła częstotliwość!! Wybierz większą!!&quot;<br />#error &quot;Bad frequency!!&quot;<br />#elif F_CPU==10000000<br />PRE_8;//preskaler 8<br />TCCR_CTC;//Tryb CTC<br />OCR_CTC = 24;//co 20us, błąd 0%<br />#elif F_CPU==11059200<br />PRE_8;//preskaler 8<br />TCCR_CTC;//Tryb CTC<br />OCR_CTC = 26;//co 20us, błąd 2,4%<br />#elif F_CPU==14745600<br />PRE_8;//preskaler 8<br />TCCR_CTC;//Tryb CTC<br />OCR_CTC = 35;//co 20us, błąd 0,31%<br />#elif F_CPU==16000000<br />PRE_64;//preskaler 64<br />TCCR_CTC;//Tryb CTC<br />OCR_CTC = 4;//co 20us, błąd 0%<br />#endif<br /><br />}<br /><br />//odczyt wilgotności i temperatury, wynik pomiaru (średni z dwóch)<br />//umieszczany w danych wejściowych<br />uint8_t ds_read_dht(uint16_t* humidity, uint16_t* temperature){<br /><br />uint8_t j=0, i=0;<br /><br />TIMSK_CTC |= (1&lt;&lt;OCIE_CTC);//aktywacja przerwania<br /><br />//procedura startu<br />DHT_DIR_OUT;<br />DHT_OUT_HIGH;<br />DHT_OUT_LOW;<br /><br />//odczekanie więcej jak 18ms<br />dht_ms=2;<br />while(dht_ms);<br /><br />DHT_OUT_HIGH;<br /><br />//ustawienie wiejścia<br />DHT_DIR_IN;<br /><br />//czekanie na potwierdzenie z czujnika około 10us<br />dht_timer = 0;<br />while(DHT_GET_IN){<br />if(dht_timer&gt;10)//jeżeli w przeciągu 200us nie nastąpi wyjście<br />return 0;//zgłoś błąd<br />}<br /><br />//Potwierdzenie nadawania przez dht - stan niski i wysoki przez 80us<br />dht_timer = 0;<br />while(!DHT_GET_IN){//80us stan niski<br />if(dht_timer&gt;10)//jeżeli w przeciągu 200us nie nastąpi wyjście<br />return 0;//zgłoś błąd<br />}<br /><br />while(DHT_GET_IN){//80us stam wysoki<br />if(dht_timer&gt;20)//jeżeli w przeciągu 400us nie nastąpi wyjście (kolejne 200us)<br />return 0;//zgłoś błąd<br />}<br /><br />//odczyt danych<br />//odbiór 5 pakietów danych<br />for(j=0 ; j&lt;5 ; j++){<br /><br />//wyzerowanie zmiennej<br />read_dht&#91;NEW&#93;.indeks&#91;j&#93; = 0x00;<br /><br />for(i=8 ; i &gt; 0 ; ){<br />--i;//najpierw dekrementacja zmiennej<br /><br />dht_timer = 0;//wyzeruje licznik<br /><br />while(!DHT_GET_IN){//najpierw stan niski<br />if(dht_timer&gt;10)//jeżeli w przeciągu 200us nie nastąpi wyjście<br />return 0;//zgłoś błąd<br />}<br />while(DHT_GET_IN){//następnie stan wysoki<br />if(dht_timer&gt;20)//jeżeli w przeciągu 400us nie nastąpi wyjście (kolejne 200us)<br />return 0;//zgłoś błąd<br />}<br /><br />//0 logiczne występuje gdy stan niski trwa 50us a stan wysoki 26-28us<br />//czyli razem około 80us.<br />//1 logiczna występuje gdy stan niski trwa 50us a stan wysoki 70us<br />//czyli razem około 120us<br />if( (dht_timer &gt;= 6) &amp;&amp; (dht_timer &lt;=8) ){<br />//jeżeli czas pomiaru stanu wysokiego i niskiego wyniósł<br />// od 100us do 160 us to wpisz logiczną jedynkę<br />read_dht&#91;NEW&#93;.indeks&#91;j&#93; |= (1 &lt;&lt; i);<br />}<br />}<br />}<br /><br />dht_timer = 0;<br />//Zakończenie transmisji sygnalizowane jest stanem niskim trwającym 50us,<br />//ustawionym przez układ DHT<br />while(!DHT_GET_IN){//najpierw stan niski<br />if(dht_timer&gt;10)//jeżeli w przeciągu 200us nie nastąpi wyjście<br />return 0;//zgłoś błąd<br />}<br /><br />//Ustawienie pinu jako wyjście i ustawienie na nim stanu wysokiego<br />DHT_DIR_OUT;<br />DHT_OUT_HIGH;<br /><br />TIMSK_CTC &amp;= ~(1&lt;&lt;OCIE_CTC);//deaktywacja przerwania<br /><br /><br />//obliczenie sumy kontrolnej<br />uint8_t checksum = ( (read_dht&#91;NEW&#93;.indeks&#91;0&#93; + read_dht&#91;NEW&#93;.indeks&#91;1&#93; + read_dht&#91;NEW&#93;.indeks&#91;2&#93; + read_dht&#91;NEW&#93;.indeks&#91;3&#93;) );<br /><br />#if DHT == 1<br /><br />//czy dane zostałe poprawnie odebrane<br />if(checksum == read_dht&#91;NEW&#93;.indeks&#91;4&#93;){<br /><br />//obliczenie wartości średniej z nowych danych i z ostaniej średniej<br />for(i=0 ; i &lt; 4 ; i++){<br />read_dht&#91;AVERAGE&#93;.indeks&#91;i&#93; = (read_dht&#91;AVERAGE&#93;.indeks&#91;i&#93; + read_dht&#91;NEW&#93;.indeks&#91;i&#93;) / 2;<br />}<br /><br />//przepisanie do danych wejściowych<br />*humidity = read_dht&#91;AVERAGE&#93;.data.hum_int;<br />*temperature = read_dht&#91;AVERAGE&#93;.data.temp_int;<br /><br />return 1;<br /><br />}else<br />return 0;<br /><br />#elif DHT == 2<br /><br />//czy dane zostałe poprawnie odebrane<br />if(checksum == read_dht&#91;NEW&#93;.indeks&#91;4&#93;){<br /><br />//ciśnienie<br />uint16_t temp = (read_dht&#91;AVERAGE&#93;.indeks&#91;0&#93; &lt;&lt; 8) + read_dht&#91;AVERAGE&#93;.indeks&#91;1&#93;;<br /><br />//średnia z dwóch pomiarów<br />temp = ( temp + (read_dht&#91;NEW&#93;.indeks&#91;0&#93; &lt;&lt; 8) + read_dht&#91;NEW&#93;.indeks&#91;1&#93; ) / 2;<br /><br />//przepisanie do struktury<br />read_dht&#91;AVERAGE&#93;.indeks&#91;0&#93; = ( temp &gt;&gt; 8 ) &amp; 0x00ff;<br />read_dht&#91;AVERAGE&#93;.indeks&#91;1&#93; = ( temp ) &amp; 0x00ff;<br /><br />//temperatura<br />temp = ( (read_dht&#91;NEW&#93;.indeks&#91;2&#93; &lt;&lt; 8) &amp; 0x7f ) + read_dht&#91;NEW&#93;.indeks&#91;3&#93;;<br /><br />//zrobienie wartości ujemnej dla nowej wartości<br />if( read_dht&#91;NEW&#93;.indeks&#91;2&#93; &amp; 0x80){<br />temp = - temp;<br />}<br /><br />//średnia z dwóch pomiarów<br />temp = ( ( (int16_t)temp + (int16_t)(read_dht&#91;AVERAGE&#93;.indeks&#91;2&#93; &lt;&lt; 8) + (int16_t)read_dht&#91;AVERAGE&#93;.indeks&#91;3&#93; ) / 2);<br /><br />read_dht&#91;AVERAGE&#93;.indeks&#91;2&#93; = ( temp &gt;&gt; 8 ) &amp; 0x00ff;<br />read_dht&#91;AVERAGE&#93;.indeks&#91;3&#93; = ( temp ) &amp; 0x00ff;<br /><br />//przepisanie do danych wejściowych<br />*humidity = (read_dht&#91;AVERAGE&#93;.indeks&#91;0&#93; &lt;&lt; 8) + read_dht&#91;AVERAGE&#93;.indeks&#91;1&#93;;<br />*temperature = (read_dht&#91;AVERAGE&#93;.indeks&#91;2&#93; &lt;&lt; 8) + read_dht&#91;AVERAGE&#93;.indeks&#91;3&#93;;<br />//czy dane zostałe poprawnie odebrane<br />if(checksum == read_dht&#91;NEW&#93;.indeks&#91;4&#93;){<br /><br />return 1;<br />}else{<br />return 0;<br />}<br /><br />#endif<br /><br />return 0;<br />}<br /><br />//Obsługa przerwania co 20us od timera 0<br />#if defined (__AVR_ATmega48A__) || (__AVR_ATmega48PA__) || (__AVR_ATmega88A__) || (__AVR_ATmega88PA__) \<br />|| (__AVR_ATmega168A__) || (__AVR_ATmega168PA__) || (__AVR_ATmega328P__) || (__AVR_ATmega328__)<br />ISR(TIMER0_COMPA_vect){<br />#elif defined (__AVR_ATmega32__)<br />ISR(TIMER0_COMP_vect){<br /><br />#else<br />#error &quot;Wybierz inny uC&quot;<br />#endif<br />dht_timer++;<br />}[/syntax]<br /><br />Na początku programu przed pętlą główną należy wykonać inicjalizację biblioteki poprzez funkcję <br />[syntax=c]ds_init_dht();[/syntax]<br />(oraz odblokować przerwania - <strong>sei()</strong> )<br /><br />Natomiast odczyt z czujnika dokonujemy poprzez funkcję [syntax=c]ds_read_dht( &amp;wilg, &amp;temp);[/syntax], gdzie wilg i temp to zmienne do których będą przepisana wartość wilgotności i temperatury.<br /><br />Użytkownik tej biblioteki musi skonfigurować we własnym zakresie przerwanie co 10ms i wstawić do obsługi następujący warunek:<br /><br />[syntax=c]if(dht_ms)<br />dht_ms--;[/syntax]<br /><br />Przykładowe użycie:<br /><br />[syntax=c]char uart_buf&#91;10&#93;;<br /><br />// zmienne - timery programowe<br />volatile uint8_t Timer1;<br /><br />uint16_t wilg, temp;<br /><br /><br />// obsługa timerów programowych<br />ISR( TIMER2_COMP_vect ) {<br />uint8_t n;<br /><br />n = Timer1;/* 1ms Timer1 */<br />if (n) Timer1 = --n;<br /><br />//timer dla czujnika wilgotności dht<br />n = dht_ms;<br />if(n)<br />dht_ms = --n;<br /><br />}<br /><br />int main(void){<br /><br />// konfiguracja Timer2 - HeartBeat<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler = 1024<br />OCR2  = 96;// 10ms<br />TIMSK |= (1&lt;&lt;OCIE2);// przerwanie Compare<br /><br />ds_init_dht();<br /><br />//konfiguracja rs232<br />uart_init(RS_UBRR);<br /><br />sei();<br /><br />uint8_t ch;<br /><br />while(1){<br /><br />if(!Timer1){<br /><br />Timer1 = 200;//co 2s<br /><br />ch = ds_read_dht( &amp;wilg, &amp;temp);<br /><br />//czy odebrane dane były poprawne<br />if(ch==1)<br />uart_text_P(PSTR(&quot;OK!\n\r&quot;));<br /><br />//wyświetlenie wilgotności<br />itoa(wilg,uart_buf,10);<br />uart_text(uart_buf);<br />uart_text_P(PSTR(&quot;\n\r&quot;));<br /><br />//wyświetlenie temperatury<br />itoa(temp,uart_buf,10);<br />uart_text(uart_buf);<br />uart_text_P(PSTR(&quot;\n\n\r&quot;));<br /><br />}<br /><br />}<br /><br />}[/syntax]<br /><br />To by było chyba na tyle.<br />Proszę o opinie i testowanie. Jeżeli coś jest nie tak to pisać. Wszystkie informacje będą przydatne.<br /><br />Pozdrawiam.<br /><br />-----<br />Edytowano 29-10-2016: Poprawa kodu i uaktualnienie plików do pobrania<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=898">danielos</a> — 28 paź 2016, o 21:07</p><hr />
]]></content>
</entry>
</feed>