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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-02-24T17:31:51+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=10571&amp;mode</id>
<entry>
<author><name><![CDATA[qurek]]></name></author>
<updated>2015-02-24T17:31:51+01:00</updated>
<published>2015-02-24T17:31:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=120731#p120731</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=120731#p120731"/>
<title type="html"><![CDATA[Re: 2x DS18B20 na OLED z USART dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=120731#p120731"><![CDATA[
W przypadku regulacji dwustanowej (ON/OFF) koniecznie trzeba dodać histerezę - inaczej szybko się zajedzie zawór/przekaźnik. Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7774">qurek</a> — 24 lut 2015, o 17:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-02-09T13:28:29+01:00</updated>
<published>2015-02-09T13:28:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117995#p117995</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117995#p117995"/>
<title type="html"><![CDATA[Re: 2x DS18B20 na OLED z USART dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117995#p117995"><![CDATA[
Dziękuję bardzo i cieszę się, że się podoba! Szczerze to trochę się &quot;bałem&quot; to pokazać, ale chyba podjąłem słuszną decyzję dzieląc się z &quot;innymi&quot;. Niby nic wielkiego, ale strasznie cieszy!<br />Faktycznie warto było by dołożyć modół zegara na DS3231 (<!-- m --><a class="postlink" href="http://mirekk36.blogspot.co.uk/2013/11/rtc-ds3231-najdokadniejszy-zegarek-na.html" >http://mirekk36.blogspot.co.uk/2013/11/ ... ek-na.html</a><!-- m -->), a ponieważ będzie to chodziło z wpiętym modułem WiFi, więc będę mógł skorzystać z &quot;Dawcy czasu&quot;, by aktualizować czas np. raz na dobę! Przydałoby się również dopisać jakieś proste menu wyboru wyświetlania i obsługę nastaw temperatury dla termostatu, czy nawet do ustawiania czasu włączenie/wyłączenia nocnej lampki!  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 9 lut 2015, o 13:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[IUVOit]]></name></author>
<updated>2015-02-09T11:30:16+01:00</updated>
<published>2015-02-09T11:30:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117970#p117970</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117970#p117970"/>
<title type="html"><![CDATA[Re: 2x DS18B20 na OLED z USART dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117970#p117970"><![CDATA[
Fajny projekcik, podoba mi się - gratulacje! <br /><div class="quotetitle">anshar napisał(a):</div><div class="quotecontent"><br />Dodam, że dzięki ogromnej pracy pana Mirka (mirekk36), a mówię tutaj o książkach, blogu, poradnikom i forum zupełnie początkującemu od zera udało się to &quot;stworzyć&quot;. Jeszcze dwa miesiące temu nie byłem w stanie nawet zamigać diodą! Thanks to mirekk36!<br /></div><br />Jak 2 miesiące temu nie miałeś pojęcia jak mrugnąć diodką a teraz robisz takie projekty, to jestem pełen podziwu! Zazdroszczę, szybkiego przyswajania wiedzy! <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> <br /><br />Jak byś dodał kilka szczegółów, byś mógł zrobić prosty termostat, do regulacji temperatury np w pokoju. Umieścić OLED w obudowie i masz fajny termostacik pokojowy.<br /><a href="http://forum.atnel.pl/_obrazki/o/94/b1980570ff2beac6ffd310b0b2cbe7a5.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/94/b1980570ff2beac6ffd310b0b2cbe7a5.jpg" alt="Obrazek" /></a><br /><br />Większość pokojowych termostatów działa na zasadzie regulatora 2-stawnego (włącz/wyłącz). <br />- temperatura rzeczywista większa niż zadana, wyłącz elektrozawór sterujacy obwodem ogrzewania.<br />- temperatura rzeczywista mniejsza niż zadana, włącz elektrozawór sterujacy obwodem ogrzewania.<br /><br />Proponuję dodać do projektu, zegar czasu rzeczywistego DS3231, scalaczek bardzo dokładnie omówiony przez Mirka. Wówczas masz wypasiony termoregulator z harmonogramem tygodniowym, rocznym <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=94">IUVOit</a> — 9 lut 2015, o 11:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-02-08T23:46:09+01:00</updated>
<published>2015-02-08T23:46:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117929#p117929</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117929#p117929"/>
<title type="html"><![CDATA[Re: 2x DS18B20 na OLED z USART dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117929#p117929"><![CDATA[
W co nie wątpię wcale! Zresztą nie widziałem jeszcze poradnika w pana wykonaniu, który by czymś nie zaskoczył!  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 8 lut 2015, o 23:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-02-08T23:39:12+01:00</updated>
<published>2015-02-08T23:39:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117928#p117928</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117928#p117928"/>
<title type="html"><![CDATA[Re: 2x DS18B20 na OLED z USART dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117928#p117928"><![CDATA[
<div class="quotetitle">anshar napisał(a):</div><div class="quotecontent"><br />Nie mogę się doczekać kolejnego pradnika o serwerze bym mógł na przykład odczytywać temperaturę i nie tylko online!<br /></div><br />Już niedługo ... już niedługo .... mam nadzieję, że poradnik i sposób działania WEB servera na AVR + WIFI będzie niemałym zaskoczeniem dla wszystkich <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=54">mirekk36</a> — 8 lut 2015, o 23:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-02-08T23:13:38+01:00</updated>
<published>2015-02-08T23:13:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117920#p117920</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117920#p117920"/>
<title type="html"><![CDATA[Re: 2x DS18B20 na OLED z USART dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117920#p117920"><![CDATA[
<img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Dziękuję bardzo! Pozdrawiam serdecznie!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 8 lut 2015, o 23:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-02-08T23:10:07+01:00</updated>
<published>2015-02-08T23:10:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117917#p117917</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117917#p117917"/>
<title type="html"><![CDATA[Re: 2x DS18B20 na OLED z USART dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117917#p117917"><![CDATA[
eeeeh już dawno nie widziałem projekciku na OLED'ziku że tak powiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... oczywiście patrząc na kod - fajny kawałek roboty - gratulacje<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 lut 2015, o 23:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-02-08T22:48:28+01:00</updated>
<published>2015-02-08T22:48:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117912#p117912</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117912#p117912"/>
<title type="html"><![CDATA[2x DS18B20 na OLED z USART dla początkujących]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10571&amp;p=117912#p117912"><![CDATA[
Jest to mój pierwszy &quot;projekt&quot;, więc proszę o wyrozumiałość.<br /><a href="http://forum.atnel.pl/_obrazki/o/7157/c1fcfb9d555e63c90056bff1ae12d449.JPG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/7157/c1fcfb9d555e63c90056bff1ae12d449.JPG" alt="Obrazek" /></a><br />Wykorzystałem dwa czujniki DS18b20, wyświetlacz OLED i  bibliotekę USART do zdalnego odczytu temperatury i nie tylko. <br />Całość obecnie znajduje się na stykówce, wykorzystałem mikrokontroler ATmega328P taktowany rezonatorem kwarcowycm 11,0592 MHz, wyświetlacz OLED (SPI), dwa czujniki DS18B20, moduł ATNEL-WIFI232-T z ATNEL-AIR , przetwornica ATB-PWR3, kilka kondensatorów 100nF, rezystorów, garstka przewodów połączeniowych no i programator AVR ATB USBASP.<br />Wykorzystłem biblioteki z bluebooka i greenbooka, oraz bibliotekę z bloga o wyświetlaczach OLED.<br />Bluebook - biblioteka 1Wire (10_1Wire)<br />Greenbook - biblioteka USART (L21_UART_ASCII_AT)<br />Blog - biblioteka OLED:<br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.co.uk/2014/08/wyswietlacz-oled-c-library-part-01a.html" >http://mirekk36.blogspot.co.uk/2014/08/ ... t-01a.html</a><!-- m --><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.co.uk/2014/08/wyswietlacz-oled-i2c-library-part-02.html" >http://mirekk36.blogspot.co.uk/2014/08/ ... rt-02.html</a><!-- m --><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.co.uk/2014/08/dual-oled-czyli-part-03-ab.html" >http://mirekk36.blogspot.co.uk/2014/08/ ... 03-ab.html</a><!-- m --><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.co.uk/2014/08/wyswietlacz-oled-fonty-part-04a.html" >http://mirekk36.blogspot.co.uk/2014/08/ ... t-04a.html</a><!-- m --><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.co.uk/2014/08/oled-part-05-efekty-specjalne.html" >http://mirekk36.blogspot.co.uk/2014/08/ ... jalne.html</a><!-- m --><br />,oraz <br />Blog - cała reszta<br /><!-- m --><a class="postlink" href="http://www.mirekk36.blogspot.co.uk/2015/01/programowanie-wifi-platforma-testowa.html" >http://www.mirekk36.blogspot.co.uk/2015 ... stowa.html</a><!-- m --><br /><!-- m --><a class="postlink" href="http://www.mirekk36.blogspot.co.uk/2015/01/wifi232-programowanie-w-c-start.html" >http://www.mirekk36.blogspot.co.uk/2015 ... start.html</a><!-- m --><br /><br />Nie jest on jeszcze skończony, ale pomyślałem, że może się to komuś przydać (z myślą o początkujących takich jak ja). Docelowo termometr ten ma znaleść się u córki w pokoju, bym mógł od czasu do czasu sprawdzić temperaturę, jak również temperaturę na zewnątrz (za oknem) i wszystko pięknie (w razie potrzeby) odczytać zdalnie. Może zamiast diody LED zastosuję przekaźnik, którym zdalnie będę włączał/wyłączał lampkę nocną. W sumie pomysły są tutaj nieograniczone.<br /><br />Do pliku main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 7 Feb 2015<br /> *      Author: anshar<br /> */<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;avr/pgmspace.h&gt;<br />#include &lt;avr/wdt.h&gt;<br /><br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;OLED/oled.h&quot;<br />#include &quot;MK_USART/mkuart.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br /><br />#define LED (1&lt;&lt;PB1)// dioada LED podłączona<br />#define LED_ON PORTB |= LED<br />#define LED_OFF PORTB &amp;= ~LED<br />#define LED_TOG PORTB ^= LED<br /><br />#define KEY1 (1&lt;&lt;PB0)// klawisz<br /><br />char uart_buf&#91;100&#93;;<br />uint8_t key_lock;<br />uint8_t czujniki_cnt, czujniki_cnt_prev;// ilość czujników na magistrali<br />volatile uint8_t s1_flag, s2_flag;// flaga tyknięcia timera co 1 sekundę<br />volatile uint8_t sekundy;// licznik sekund 0-59<br />uint8_t subzero, cel, cel_fract_bits;// temperatura, dodatnia czy ujemna, stopnie i stopnie po przecinku<br /><br />void analizuj_dane_rs232(char * buf);<br />void button(void);<br />void sensors_init(void);<br />void sensors(void);<br />void timer0_init();<br />void display_temp(uint8_t x, uint8_t page, uint8_t number);<br />void dispaly_sensor(uint8_t number, uint8_t page);<br />void uart_dispaly_sensor(uint8_t number);<br /><br />int main(void)<br />{<br />DDRB |= LED;//dioda LED<br />PORTB |= (1&lt;&lt;PB0);<br /><br />timer0_init();//inicjalizacja timera - timer0 - dla przejrzystości kodu w funkcji void timer0_init();<br /><br />mk_ssd1306_init( SSD1306_SWITCHCAPVCC, REFRESH_MAX, 0);//inicjalizacja wyświetlacz OLED<br /><br />mk_ssd1306_puts( 2*6, page0*8, &quot;Thanks to mirekk36&quot;, 1, 1, 0);//specjalne podziękowanie dla mirekk36<br />mk_ssd1306_puts( 11*6, page7*8, &quot;Start...&quot;, 1, 1, 0);//wyświetlenie &quot;Start...&quot; w prawym dolnym rogu<br />mk_ssd1306_display();//wyświetlenie całego ekranu<br />//mk_ssd1306_refresh_pages( page0, 1, 0, 128);//wyświetlenie page0 - lini nr 0<br />//mk_ssd1306_refresh_pages( page7, 1, 0, 128);//wyświetlenie page7 - lini nr 7<br /><br />USART_Init(__UBRR);//inicjalizacja UART<br />register_uart_str_rx_event_callback( analizuj_dane_rs232 );//rejestracja zdarzenia &quot;analizuj_dane_rs232&quot;<br /><br />sensors_init();//inicjalizacja sensorów<br /><br />sei();//włączenie przerwan<br /><br />while(1)<br />{<br />UART_RX_STR_EVENT( uart_buf );//UART<br /><br />button();//przycisk<br /><br />sensors();//czujniki temperatury<br />}// koniec pętli nieskończonej<br />}// koneic int main(void)<br /><br /><br />void analizuj_dane_rs232(char * buf)<br />{<br />char * wsk;<br />wsk = strtok( buf, &quot;,&quot;);<br /><br />if( !strcmp(wsk, &quot;led&quot;) ) {     //led<br />wsk = strtok( NULL, &quot;,&quot;);//led,<br />uint8_t data = atoi(wsk);<br />if( 1 == data ){//led,1<br />wsk = strtok( NULL, &quot;,&quot;);//led,1,<br />data = atoi(wsk);<br />if( !data )//led,1,0<br />{<br />LED_ON;<br />mk_ssd1306_puts( 0, page7*8, &quot;    -- LED  ON --   &quot;, 1, 1, 0);<br />mk_ssd1306_refresh_pages( page7, 1, 0, 128);<br />}<br />else {//led,1,5<br />LED_OFF;<br />uint8_t i;<br />for(i=0; i&lt;data; i++ ){<br />LED_ON;<br />_delay_ms(500);<br />LED_OFF;<br />_delay_ms(500);<br />}<br />uart_puts(&quot;OK\r\n\n&quot;);<br />}<br />}<br />if( 2 == data )//led,2<br />{<br />LED_OFF;<br />mk_ssd1306_puts( 0, page7*8, &quot;    -- LED OFF --   &quot;, 1, 1, 0);<br />mk_ssd1306_refresh_pages( page7, 1, 0, 128);<br />}<br />}<br /><br />if(!strcmp(wsk, &quot;temp&quot;) ) {//temp<br />wsk = strtok( NULL, &quot;,&quot;);//temp,<br />uint8_t data = atoi(wsk);<br />if( 1 == data ) uart_dispaly_sensor(1);<br />else if( 2 == data ) uart_dispaly_sensor(2);<br />else {<br />uart_dispaly_sensor(1);//temp,1<br />uart_dispaly_sensor(2);//temp,2<br />}<br />}<br /><br /><br />if( !strcmp(wsk, &quot;test&quot;) ) {//test<br />uart_puts( &quot; -- ATmega328P --\r\n&quot; );<br />mk_ssd1306_puts( 0, page7*8, &quot;   -- ATmega328P --   &quot;, 1, 1, 0);<br />mk_ssd1306_refresh_pages( page7, 1, 0, 128);<br />}<br /><br />if( !strncasecmp(&quot;AT+RST?&quot;, buf, 7) ) {//at+rst?<br />cli();              // disable interrupts<br /><br />mk_ssd1306_puts( 0, page7*8, &quot;  Reset in 1.5 sec.  &quot;, 1, 1, 0);<br />mk_ssd1306_refresh_pages( page7, 1, 0, 128);<br />_delay_ms(1500);<br /><br />wdt_enable( 0 );  // set  watchdog<br />while(1);           // wait for RESET<br />}<br />}<br /><br />void button() {//prosta obsługa klawisza do zapalenia/zgaszenia diody LED i nie tylko<br />if( !key_lock &amp;&amp; !(PINB &amp; KEY1 ) ) {<br />key_lock=1;<br />LED_TOG;// reakcja na PRESS (wcinięcie przycisku)<br />uart_puts( &quot; -- Klawisz --\r\n&quot; );//wyświetlenie przez UART<br />mk_ssd1306_puts( 0, page7*8, &quot;    -- Klawisz --   &quot;, 1, 1, 0);//Wyświetlenie na OLED linia nr.7<br />mk_ssd1306_refresh_pages( page7, 1, 0, 128);<br />} else if( key_lock &amp;&amp; (PINB &amp; KEY1 ) ) key_lock++;<br />}<br /><br />void sensors_init() {<br />czujniki_cnt = search_sensors();// sprawdzamy ile czujników DS18xxx widocznych jest na magistrali<br /><br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );//wysyłamy rozkaz wykonania pomiaru temperatury<br /><br />_delay_ms(750);//czekamy 750ms na dokonanie konwersji przez podłączone czujniki<br /><br />dispaly_sensor(1, 2); //dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty, 1-czujnik pierwszy, 2-page2 na OLED<br />dispaly_sensor(2, 4);//dokonujemy odczytu temperatury z drugiego czujnika o ile został wykryty, 2-czujnik drugi, 4-page4 na OLED<br />}<br /><br />void sensors() {<br />if(s1_flag) {/* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br /><br />if( 0 == (sekundy%3) ) {//co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników<br /><br />//uint8_t *cl=(uint8_t*)gSensorIDs;// pobieramy wskaźnik do tablicy adresów czujników<br />//for( uint8_t i=0; i&lt;MAXSENSORS*OW_ROMCODE_SIZE; i++) *cl++ = 0; // kasujemy całą tablicę<br />//czujniki_cnt =search_sensors();// ponownie wykrywamy ile jest czujników i zapełniamy tablicę<br /><br />uint8_t czujnik_1;<br />uint8_t czujnik_2;<br /><br />if( DS18X20_OK != DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) czujnik_1 = 0;<br />else czujnik_1 = 1;//sprawdzamy obecność czujnika nr.1<br />if( DS18X20_OK != DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) czujnik_2 = 0;<br />else czujnik_2 = 1;//sprawdzamy obecność czujnika nr.2<br /><br />czujniki_cnt = czujnik_1 + czujnik_2;//ilość czujników<br /><br />mk_ssd1306_puts( 3*6, page7*8, &quot;Nr. of sensors:  &quot;, 1, 1, 0); // wyświetlamy ilość czujników na magistrali<br />mk_ssd1306_put_int( (2 + 16)*6, page7*8, czujniki_cnt, 1, 1, 0);<br />mk_ssd1306_refresh_pages( page7, 1, 0, 128);<br />}<br /><br />if( 1 == (sekundy%3) ) DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );//co trzy sekundy gdy reszta z dzielenia modulo 3 == 1 wysyłaj rozkaz pomiaru do czujników<br /><br />if( 2 == (sekundy%3) ) {//co trzy sekundy gdy reszta z dzielenia modulo 3 == 2 czyli jedną sekundę po rozkazie konwersji<br />dispaly_sensor(1, 2);//dokonujemy odczytu temperatury i wyświetlania z pierwszego czujnika o ile został wykryty, 1-czujnik pierwszy, 2-page2 na OLED<br />dispaly_sensor(2, 4);//dokonujemy odczytu temperatury i wyświetlania z drugiego czujnika o ile został wykryty, 2-czujnik drugi, 4-page4 na OLED<br />}<br /><br />s1_flag=0;//zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje<br />}//koniec sprawdzania flagi<br />}<br /><br />/* wyświetlanie temperatury na OLED */<br />void display_temp(uint8_t x, uint8_t page, uint8_t number) {<br /><br />mk_ssd1306_puts( x*12, page*8, &quot;T&quot;, 2, 1, 0);<br />mk_ssd1306_put_int( (x+1)*12, page*8, number, 2, 1, 0);<br />mk_ssd1306_puts( (x+2)*12, page*8, &quot;:&quot;, 2, 1, 0);<br /><br />if(subzero) mk_ssd1306_puts( (x+3)*12, page*8, &quot;-&quot;, 2, 1, 0);// jeśli subzero==1 wyświetl znak minus (temp. ujemna)<br />else mk_ssd1306_puts( (x+3)*12, page*8, &quot; &quot;, 2, 1, 0);// jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia)<br />mk_ssd1306_put_int( (x+4)*12, page*8, cel, 2, 1, 0);<br />mk_ssd1306_puts( (x+6)*12, page*8, &quot;.&quot;, 2, 1, 0);<br />mk_ssd1306_put_int( (x+7)*12, page*8, cel_fract_bits, 2, 1, 0);<br />mk_ssd1306_puts( (x+8)*12, page*8, &quot;C&quot;, 2, 1, 0);<br /><br />mk_ssd1306_refresh_pages( page, 2, 0, 128);<br />}<br /><br />/* wyświetlanie temperatury z formatowaniem poszczególnych czujników, numer-nr. czujnika, page- page2 lub page4 na OLED*/<br />void dispaly_sensor(uint8_t number, uint8_t page)<br />{<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;number - 1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) )<br />{<br />display_temp(1, page, number);//wyśwetlenie temperatury czujnika<br />}<br />else {//wyświetlenie błedu, gdy brak czujnika<br />mk_ssd1306_puts( 0, page*8, &quot;    -- error T&quot;, 1, 1, 0);<br />mk_ssd1306_put_int( 14*6, page*8, number, 1, 1, 0 );//wyświetlenie nr. czujnika (1 lub 2)<br />mk_ssd1306_puts( 15*6, page*8, &quot; --     &quot;, 1, 1, 0);<br />mk_ssd1306_puts( 0, (page+1)*8, &quot;                       &quot;, 1, 1, 0); //czyszczenie linii<br /><br />mk_ssd1306_refresh_pages( page, 2, 0, 128);<br />}<br />}<br /><br />/* wyświetlanie temperatury przez UART */<br />void uart_dispaly_sensor(uint8_t number)<br />{<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;number - 1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) {//wyśwetlenie temperatury czujnika<br />uart_puts( &quot; -- Temp&quot;);//wyświetlenie &quot;Temp&quot;<br />uart_putint(number,10);//wyświetlenie nr. czujnika (1 lub 2)<br />uart_puts(&quot;: &quot;);//wyświetlenie &quot;:&quot;<br />if(subzero) uart_puts(&quot;-&quot;);//jeśli subzero==1 wyświetl znak minus (temp. ujemna)<br />else uart_puts(&quot; &quot;);//jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia)<br />uart_putint(cel,10);//wyświetlenie temperatury<br />uart_puts(&quot;.&quot;);//wyświetlenie przecinka &quot;.&quot;<br />uart_putint(cel_fract_bits,10);//wyświetlenie temperatury po przecinku (części dziesiętnej)<br />uart_puts(&quot; --&quot;);//wyświetlenie &quot; --&quot;<br />uart_puts( &quot;\r\n&quot;);//przejście do początku i następnej linii<br />}<br />else {//wyświetlenie błedu, gdy brak czujnika<br />uart_puts(&quot; -- error T&quot;);//wyświetlenie &quot;error T&quot;<br />uart_putint(number, 10);//wyświetlenie  nr. czujnika (1 lub 2)<br />uart_puts(&quot; --&quot;);//wyświetlenie &quot; --&quot;<br />uart_puts( &quot;\r\n&quot;);//przejście do początku i następnej linii<br />}<br />}<br /><br />void timer0_init()<br />{<br />/* ustawienie TIMER0 dla F_CPU=11,0592MHz */<br />TCCR0A |= (1&lt;&lt;WGM01);/* tryb CTC */<br />TCCR0B |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);/* preskaler = 1024 */<br />OCR0A = 107;/* dodatkowy podział przez 108 (rej. przepełnienia) */<br />TIMSK0 |= (1&lt;&lt;OCIE0A);/* zezwolenie na przerwanie CompareMatch */<br />/* przerwanie wykonywane z częstotliwością ok 10ms (100 razy na sekundę) */<br />/* do naszych celów nie musi być to bardzo dokładne 10ms */<br />}<br /><br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER0_COMPA_vect)<br />{<br />static uint8_t cnt=0;/* statyczna zmienna cnt do odliczania setnych ms */<br /><br />if(++cnt&gt;99) {/* gdy licznik ms &gt; 99 (minęła 1 sekunda) */<br />s1_flag=1;/* ustaw flagę tyknięcia sekundy */<br />s2_flag=1;<br />sekundy++;/* zwiększ licznik sekund */<br />if(sekundy&gt;59) sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}[/syntax]<br /><br />należy oczywiście dołączyć biblioteki 1Wire, USART i OLED. Zamiast modułu WiFi można podłączyć dowolną przejściówkię RS232 TTL czy moduł Bluetooth.<br />W pliku źródłowym starałem się zamieścic jak najwięcej komentarzy, aby ułatwić jego zrozumienie (czytanie). <br />Nie załączam schematu, bo układ ten jest bardzo prosty. Można go zbudować na podstawie poradnika z bloga „programowanie-wifi-platforma-testowa” czy cyklu poradników: <!-- m --><a class="postlink" href="http://mirekk36.blogspot.co.uk/2012/12/avr-jak-zaczac.html" >http://mirekk36.blogspot.co.uk/2012/12/ ... aczac.html</a><!-- m -->  <br />Dodam tylko, że wyświetlacz OLED SPI (może być też I2C) podłączyłem do PORT (PC5:1), diodę LED podłączyłem anodą do PB1, przycisk do PB0, moduł WiFi do PD0 i PD1, a czujniki temperatury do PB2 (onewire.h) z rezystorem 2.2Kohm do Vcc (tryb normal).<br /><br />Komendy z terminala:<br />at+rst?   programowy reset procesora (watchdog) do wykorzystania z mkBootLoader'em<br />temp,1   odczyt temperatury z pierwszego czujnika<br />temp,2   odczyt temperatury z drugiego czujnika<br />temp      odczyt temperatury z czujników<br />led,1      włączenie diody LED (zaświecenie)<br />led,2      wyłączenie diody LED (zgaszenie)<br />led,1,x   mruganie diodą x-razy co 1 sec.<br />test        wyświetlenie tekstu<br /><br />Oczywiście wyświetlana jest informacja o błędzie któregokolwiek z czujników (np po wyjęciu czujnika). Po włożeniu go z powrotem temperatura wyświetlana jest ponownie. Nie następuje zmiana kolejności wyświetlania czujników.<br /><br />Dodam, że dzięki ogromnej pracy pana Mirka (mirekk36), a mówię tutaj o książkach, blogu, poradnikom i forum zupełnie początkującemu od zera udało się to &quot;stworzyć&quot;. Jeszcze dwa miesiące temu nie byłem w stanie nawet zamigać diodą! Thanks to mirekk36! <br />Nie mogę się doczekać kolejnego pradnika o serwerze bym mógł na przykład odczytywać temperaturę i nie tylko online! <br />Pozdrawiam!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 8 lut 2015, o 22:48</p><hr />
]]></content>
</entry>
</feed>