<?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=10210&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-01-14T16:07:18+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=10210&amp;mode</id>
<entry>
<author><name><![CDATA[janusz17]]></name></author>
<updated>2015-01-14T16:07:18+01:00</updated>
<published>2015-01-14T16:07:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10210&amp;p=114108#p114108</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10210&amp;p=114108#p114108"/>
<title type="html"><![CDATA[Re: obsługa wielu czujników dht22 - problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10210&amp;p=114108#p114108"><![CDATA[
Ja zmodyfikowałem funkcję dht_getdata() tak aby można było wybierać pin danego portu mikrokontrolera, do którego jest podłączony dany czujnik. Poniżej zamieszczam mój program, który wysyła dane przez RS232 na terminal z dwóch czujników.<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2 wrz 2014<br /> *      Author: Janusz M.<br /> */<br /><br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;AM2302/am2302.h&quot;<br />#include &quot;MKUART/mkuart.h&quot;<br />#include &quot;MK_TERMINAL/mk_term.h&quot;<br /><br />int main(void)<br />{<br />char printbuff&#91;4&#93;;<br /><br />//init uart<br />USART_Init(__UBRR);// 19200<br /><br />//init interrupt<br />sei();<br /><br /><br /><br />uint16_t temperature = 0;<br />uint16_t humidity = 0;<br /><br />tr_cls(1);<br />tr_attr( 0, TR_CYAN, TR_BLACK );<br />//tr_cursor_hide(1);<br /><br />//tr_attr( 0, TR_BLACK, TR_YELLOW );<br /><br />while(1)<br />{<br />if(AM2302_gettemperaturehumidity(&amp;temperature, &amp;humidity, AM2302_PIN1) != -1)<br />{<br /><br />tr_locate(5, 7);<br />itoa(temperature/10, printbuff, 10);<br />uart_puts(&quot;Temperatura 1:  &quot;);<br />if(AM2302_znak) uart_putc('-');<br />uart_puts(printbuff);<br />uart_putc('.');<br />itoa(temperature%10, printbuff, 10);<br />uart_puts(printbuff);<br />uart_puts(&quot; °C\r\n&quot;);<br /><br />tr_locate(8, 7);<br />itoa(humidity/10, printbuff, 10);<br />uart_puts(&quot;Wilgotność 1:     &quot;);<br />uart_puts(printbuff);<br />uart_puts(&quot;.&quot;);<br />itoa(humidity%10, printbuff, 10);<br />uart_puts(printbuff);<br />uart_puts(&quot; %\r\n&quot;);<br />}<br />else<br />{<br />uart_puts(&quot;AM2302 nr1: error\r\n&quot;);<br />}<br /><br />uart_puts(&quot;\r\n&quot;);<br /><br />_delay_ms(1500);<br /><br />if(AM2302_gettemperaturehumidity(&amp;temperature, &amp;humidity, AM2302_PIN2) != -1)<br />{<br />tr_locate(15, 7);<br />itoa(temperature/10, printbuff, 10);<br />uart_puts(&quot;Temperatura 2:  &quot;);<br />if(AM2302_znak) uart_putc('-');<br />uart_puts(printbuff);<br />uart_putc('.');<br />itoa(temperature%10, printbuff, 10);<br />uart_puts(printbuff);<br />uart_puts(&quot; °C\r\n&quot;);<br /><br />tr_locate(18, 7);<br />itoa(humidity/10, printbuff, 10);<br />uart_puts(&quot;Wilgotność 2:     &quot;);<br />uart_puts(printbuff);<br />uart_puts(&quot;.&quot;);<br />itoa(humidity%10, printbuff, 10);<br />uart_puts(printbuff);<br />uart_puts(&quot; %\r\n&quot;);<br />}<br />else<br />{<br />uart_puts(&quot;AM2302 nr2: error\r\n&quot;);<br />}<br /><br />uart_puts(&quot;\r\n&quot;);<br />}<br /><br />return 0;<br />}[/syntax]<br /><br />[syntax=c]/*<br /> * am2302.h<br /> *<br /> *  Created on: 2 wrz 2014<br /> *      Author: Janusz M.<br /> */<br />#ifndef AM2302_H_<br />#define AM2302_H_<br /><br /><br />//setup port<br />#define AM2302_PORTD<br />#define AM2302_PIN16<br />#define AM2302_PIN27<br /><br />//timeout retries<br />#define AM2302_TIMEOUT 200<br /><br />extern uint8_t AM2302_znak;<br /><br />//functions<br />extern int8_t AM2302_gettemperature(uint16_t *temperature, const uint8_t M2302_PIN);<br />extern int8_t AM2302_gethumidity(uint16_t *humidity, const uint8_t M2302_PIN);<br />extern int8_t AM2302_gettemperaturehumidity(uint16_t *temperature, uint16_t *humidity, const uint8_t M2302_PIN);<br /><br /><br />#endif /* AM2302_H_ */[/syntax]<br /><br />[syntax=c]/*<br /> * am2302.c<br /> *<br /> *  Created on: 2 wrz 2014<br /> *      Author: Janusz M.<br /> */<br /><br />/*<br />DHT Library 0x03<br />copyright (c) Davide Gironi, 2012<br />*/<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;am2302.h&quot;<br />#include &quot;../makra.h&quot;<br /><br />uint8_t AM2302_znak;// dla wartości dodatnich temperatury = 0, dla ujemnych = 1<br /><br />/*<br /> * get data from sensor<br /> */<br />int8_t AM2302_getdata(uint16_t *temperature, uint16_t *humidity, const uint8_t AM2302_PIN)<br />{<br />uint8_t AM2302_data&#91;5&#93;;<br />uint8_t i,j = 0;<br /><br />//reset port<br />DDR(AM2302_PORT) |= (1 &lt;&lt; AM2302_PIN); //output<br />PORT(AM2302_PORT) |= (1 &lt;&lt; AM2302_PIN); //high<br />_delay_ms(100);<br /><br />//send request<br />PORT(AM2302_PORT) &amp;= ~(1 &lt;&lt; AM2302_PIN); //low<br />_delay_us(500);<br /><br />PORT(AM2302_PORT) |= (1 &lt;&lt; AM2302_PIN); //high<br />DDR(AM2302_PORT) &amp;= ~(1 &lt;&lt; AM2302_PIN); //input<br />_delay_us(40);<br /><br />//check start condition 1<br />if((PIN(AM2302_PORT) &amp; (1 &lt;&lt; AM2302_PIN))) {<br />return -1;<br />}<br />_delay_us(80);<br />//check start condition 2<br />if(!(PIN(AM2302_PORT) &amp; (1 &lt;&lt; AM2302_PIN))) {<br />return -1;<br />}<br />_delay_us(80);<br /><br />//read the data<br />uint16_t timeoutcounter = 0;<br />for (j = 0; j &lt; 5; j++)<br />{ //read 5 byte<br />uint8_t result = 0;<br />for(i = 0; i &lt; 8; i++)<br />{//read every bit<br />timeoutcounter = 0;<br />while(!(PIN(AM2302_PORT) &amp; ( 1&lt;&lt; AM2302_PIN)))<br />{ //wait for an high input (non blocking)<br />timeoutcounter++;<br />if(timeoutcounter &gt; AM2302_TIMEOUT)<br />{<br />return -1; //timeout<br />}<br />}<br />_delay_us(30);<br />if(PIN(AM2302_PORT) &amp; (1 &lt;&lt; AM2302_PIN)) result |= (1 &lt;&lt; (7 - i));//if input is high after 30 us, get result<br />timeoutcounter = 0;<br />while(PIN(AM2302_PORT) &amp; (1 &lt;&lt; AM2302_PIN))<br />{ //wait until input get low (non blocking)<br />timeoutcounter++;<br />if(timeoutcounter &gt; AM2302_TIMEOUT) return -1; //timeout<br />}<br />}<br />AM2302_data&#91;j&#93; = result;<br />}<br /><br />//reset port<br />DDR(AM2302_PORT) |= (1 &lt;&lt; AM2302_PIN); //output<br />PORT(AM2302_PORT) |= (1 &lt;&lt; AM2302_PIN); //low<br />_delay_ms(100);<br /><br />//check checksum<br />if ((uint8_t)(AM2302_data&#91;0&#93; + AM2302_data&#91;1&#93; + AM2302_data&#91;2&#93; + AM2302_data&#91;3&#93;) == AM2302_data&#91;4&#93;)<br />{<br />//return temperature and humidity<br /><br />uint16_t rawhumidity = (AM2302_data&#91;0&#93; &lt;&lt; 8) | AM2302_data&#91;1&#93;;// wilgotność - wartość nieobrobiona<br />uint16_t rawtemperature = (AM2302_data&#91;2&#93; &lt;&lt; 8) | AM2302_data&#91;3&#93;;// temperatura - wartość nieobrobiona<br />if(rawtemperature &amp; 0x8000)<br />{<br />*temperature = rawtemperature &amp; 0x7FFF;<br />AM2302_znak = 1;<br />}<br />else<br />{<br />*temperature = rawtemperature;<br />AM2302_znak = 0;<br />}<br /><br />*humidity = rawhumidity;<br /><br />return 0;<br />}<br /><br />return -1;<br />}<br /><br />/*<br /> * get temperature<br /> */<br />int8_t AM2302_gettemperature(uint16_t *temperature, const uint8_t AM2302_PIN)<br />{<br />uint16_t humidity = 0;<br /><br />return AM2302_getdata(temperature, &amp;humidity, AM2302_PIN);<br />}<br /><br />/*<br /> * get humidity<br /> */<br />int8_t AM2302_gethumidity(uint16_t *humidity, const uint8_t AM2302_PIN)<br />{<br />uint16_t temperature = 0;<br /><br />return AM2302_getdata(&amp;temperature, humidity, AM2302_PIN);<br />}<br /><br />/*<br /> * get temperature and humidity<br /> */<br />int8_t AM2302_gettemperaturehumidity(uint16_t *temperature, uint16_t *humidity, const uint8_t AM2302_PIN)<br />{<br /><br />return AM2302_getdata(temperature, humidity, AM2302_PIN);<br />}[/syntax]<br /><br />[syntax=c]/*<br /> * makra.h<br /> *<br /> *  Created on: 2012-08-23<br /> *      Author: Janusz Mika<br /> */<br /><br />#ifndef MAKRA_H_<br />#define MAKRA_H_<br /><br />// Makra upraszczające dostęp do portów<br />// *** PORT<br />#define PORT(x) XPORT(x)<br />#define XPORT(x) (PORT##x)<br />// *** PIN<br />#define PIN(x) XPIN(x)<br />#define XPIN(x) (PIN##x)<br />// *** DDR<br />#define DDR(x) XDDR(x)<br />#define XDDR(x) (DDR##x)<br /><br />#define ROTATE_RIGHT(x) x=(x&gt;&gt;1)|(x&lt;&lt;7)<br />#define ROTATE_LEFT(x) x=(x&lt;&lt;1)|(x&gt;&gt;7)<br /><br />#endif /* MAKRA_H_ */[/syntax]<br /><br />Do obsługi UART-a i terminala wykorzystałem biblioteki z poradników Pana Mirka.<br />W układzie testowym miałem dwa czujniki podpięte do zestawu ATB z procesorem ATmega32.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1226">janusz17</a> — 14 sty 2015, o 16:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matjazz000]]></name></author>
<updated>2015-01-14T13:52:57+01:00</updated>
<published>2015-01-14T13:52:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10210&amp;p=114089#p114089</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10210&amp;p=114089#p114089"/>
<title type="html"><![CDATA[obsługa wielu czujników dht22 - problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10210&amp;p=114089#p114089"><![CDATA[
Witam szanownych forumowiczów,<br /><br />Mam problem z obsługą dwóch czujników dht22. Piszę program w języku C w programie avr studio (środowisko win avr). Do obsługi czujnika wykorzystuję biblioteki Davide Gironi dostępnej na stronie autora dht.h i dht.c<br /><a href="http://code.google.com/p/davidegironi/downloads/detail?name=avr_lib_dht_03.zip"  class="postlink">http://code.google.com/p/davidegironi/downloads/detail?name=avr_lib_dht_03.zip</a><br />Nie mam problemów z obsługą jednego czujnika, który jest podpięty do końcówki PA 3. Niestety problem mam z obsługą dodatkowego drugiego czujnika podłączonego do końcówki PA 2. <br /><br />Jak odczytywać wartości temperatury i wilgotności z dwóch czujników dht22?<br /><br />Czy mozna zrealizować odczyt naprzemienny?<br />Jak tak to jak ?<br /><br />Potrzebna mi jest jakaś rada, bo nie mogę ruszyć tematu  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />Pozdrawiam Mateusz J.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7862">matjazz000</a> — 14 sty 2015, o 13:52</p><hr />
]]></content>
</entry>
</feed>