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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-01-02T15:12:17+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=1767&amp;mode</id>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-02T15:12:17+01:00</updated>
<published>2013-01-02T15:12:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23027#p23027</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23027#p23027"/>
<title type="html"><![CDATA[Re: Odp: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23027#p23027"><![CDATA[
Dziękuję za odpowiedz, nie mam aż takich ambicji i potrzeb <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to ma być po prostu system monitoringu temperatury w gospodarstwie, gdzie czasem trzeba dogrzac kurnik, psiarnie, itp. Dodatkowo jedynie chce jeszcze by była możliwość sprawdzenia temperatury na piecu i w domu<p>Statystyki: Napisane przez Gość — 2 sty 2013, o 15:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rayden]]></name></author>
<updated>2013-01-02T15:04:48+01:00</updated>
<published>2013-01-02T15:04:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23026#p23026</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23026#p23026"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23026#p23026"><![CDATA[
Ja skończyłem swój projekt na 60 czujnikach bezprzewodowych do monitorowania różnych warunków środowiskowych (wilgotność, temperatura, wilgotność drewna, wykrywanie obecności wody, poziomu wody i kilku innych, monitorowanie siły sygnału, stanu baterii czujnika itd.). Do czego zmierzam... jak już zacząłem zabawę z RFM12B to i dalej tak szło bo dużo zrobiłem płytek i sprzętu... ale... natrafiłem na problem zasilania i poboru energii... o ile w kilku czujnikach to problemu nie stanowiło... to w późniejszym etapie okazało się, że są problemy z oszczędzaniem energii w sieci na bazie czujników. Uczulam na ten fakt.<br />Teraz jakbym miał przerabiać od początku taką sieć, bo nie powiem pomysł był fajny z automatycznym identyfikowaniem, z siecią rozproszoną i dynamiczną ramką... wszystko ok, ale te scalaki nie mają funkcji wake on radio! <br />Mając sieć rozproszoną (w moim przypadku mówiąc w uproszczeniu tablicą routingu zapisaną w stacji bazowej i posczególnych węzłach w czujnikach (lokalne tablice routingu) czujniki musiały działać cały czas. Nie trudno sobie wyobrazić, że musiały analizować sporo danych... uwzględniając nawet dynamiczne ustawianie siły sygnału nadawania (żeby zaoszczędzić energię) za szybko padały baterie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. <br />Teraz zrobił bym to na RFM22B, RFM23B albo w ogóle na ZigBee.<br />Dlaczego od razu nie sięgnąłem po ZigBee wcześniej? proste: brakowało na to funduszy a wówczas to było masakrycznie drogie.<br /><br />Jeżeli Twoim celem jest zrobienie inteligentnej sieci (taki był mój kiedyś cel- nie koniecznie słuszny, ale spełniający swoje zadanie) to fajnie by było zrobić to na nowszych układach. Jakby zaimplementować jeszcze automatyczną aktualizację oprogramowania w każdym z czujników (co w ZigBee jest stosunkowo proste a w RFM'ach hm... ciekawe do zrealizowania <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ) to ja bym był pod wrażeniem motywacji i chęci.<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=682">rayden</a> — 2 sty 2013, o 15:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-02T14:49:15+01:00</updated>
<published>2013-01-02T14:49:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23020#p23020</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23020#p23020"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23020#p23020"><![CDATA[
Praktycznie ostatnio nic nie ruszałem w nim <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> bo nie bardzo miałem do tego czas i wenę.... pewnie w weekend posiedzę, ale ostatnio wyskoczył mi zarobkowy projekt regulatora na termoparze więc chwilowo ten jest zawieszony, ale na 100% do niego wrócę. <br /><br />Chwilowo zresztą postanowiłem skupić się na uczeniu teorii, oglądaniu kursów Mirka i przetrawianiu (*void), (void*), wszelkich rzutowań, wskaźników na funkcję itp. <br /><br />Parę koncepcji mi się wyklarowało, co zresztą już w kilku ostatnich tematach było przeze mnie pisane.<p>Statystyki: Napisane przez Gość — 2 sty 2013, o 14:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rayden]]></name></author>
<updated>2013-01-02T14:19:55+01:00</updated>
<published>2013-01-02T14:19:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23009#p23009</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23009#p23009"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=23009#p23009"><![CDATA[
Witam!<br />Na jakim etapie jest projekt w tej chwili?<br />Robiłem coś podobnego kilka lat temu może będę w stanie coś podpowiedzieć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=682">rayden</a> — 2 sty 2013, o 14:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-17T09:17:12+01:00</updated>
<published>2012-12-17T09:17:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21364#p21364</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21364#p21364"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21364#p21364"><![CDATA[
<div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />menu_sensors() to ślepy zaułek. W takich funkcjach to właśnie powinieneś ustawiać potrzebne flagi. Dobrze masz to że przyciski zmieniają swoją funkcję - to jedna flaga, ale cała realizacja wybranych procedur musi odbywać się w pętli głównej. Kolejna flaga ustawiana w funkcji menu_sensors() powinna odblokowywać warunek rysujący grafikę na potrzeby tej funkcji w pętli głównej. Dobrze zacząłeś, ale mam jeszcze uwagę do tamtego kodu:<br /><br />[syntax=c]if( !Timer4 ) { //sprawdzenie Timer4<br />//tu Timer4 = 0<br />   Timer4=100; //tu Timer4 = 100<br />//... tu Timer4 != 0<br />}<br />if(!flag_menu){ //w tym momencie Timer4 musi zostać wyzerowany inaczej powyższy kod go zmieni i już nie będzie 0<br />   if( !Timer4 ) {[/syntax]<br /></div><br /><br /><br />Coś mi nie pasowało <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> właśnie, bo nie do końca &quot;regularne&quot; było miganie diodą czyli pomiar, użyję po prostu drugiego Timera programowego bo mam 4 przecież <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br />Powoli mi się klaruje z tym menu, ale zacząłem myśleć, w jaki sposób zmienić nazwy pomieszczeń a to dla mnie na razie czarna magia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 17 gru 2012, o 09:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-14T14:29:32+01:00</updated>
<published>2012-12-14T14:29:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21143#p21143</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21143#p21143"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21143#p21143"><![CDATA[
Chwilowo się muszę uporać z widocznością zmiennych, itd. bo tak namieszałem po plikach, że mi co chwile wywala errory, albo multiplay definition <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />No odrobinę posprzątałem, ale łeb mi paruje <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />..... pół dnia siedzę by poprzesuwać deklaracje, definicje i tablice napisów by mi nie sypało multiplayami <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 14 gru 2012, o 14:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-14T14:16:04+01:00</updated>
<published>2012-12-14T14:16:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21142#p21142</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21142#p21142"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21142#p21142"><![CDATA[
menu_sensors() to ślepy zaułek. W takich funkcjach to właśnie powinieneś ustawiać potrzebne flagi. Dobrze masz to że przyciski zmieniają swoją funkcję - to jedna flaga, ale cała realizacja wybranych procedur musi odbywać się w pętli głównej. Kolejna flaga ustawiana w funkcji menu_sensors() powinna odblokowywać warunek rysujący grafikę na potrzeby tej funkcji w pętli głównej. Dobrze zacząłeś, ale mam jeszcze uwagę do tamtego kodu:<br /><br />[syntax=c]if( !Timer4 ) { //sprawdzenie Timer4<br />//tu Timer4 = 0<br />   Timer4=100; //tu Timer4 = 100<br />//... tu Timer4 != 0<br />}<br />if(!flag_menu){ //w tym momencie Timer4 musi zostać wyzerowany inaczej powyższy kod go zmieni i już nie będzie 0<br />   if( !Timer4 ) {[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 14 gru 2012, o 14:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-14T13:11:50+01:00</updated>
<published>2012-12-14T13:11:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21137#p21137</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21137#p21137"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21137#p21137"><![CDATA[
menu.c<br /><br />[syntax=c]<br />#include &quot;menu.h&quot;<br />#include &quot;..\LCD\lcd44780.h&quot;<br />#include &quot;../1Wire/ds18x20.h&quot;<br /><br />#include &lt;stddef.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define GET_ADDR(ptr, field) (void*)pgm_read_word(((uint8_t*)ptr)+offsetof(struct _menuitem, field))<br /><br /><br />const char PROGMEM txt_menu[] = &quot;MENU&quot;;<br />const char PROGMEM txt_start[] = &quot;Start Pomiaru&quot;;<br />const char PROGMEM txt_pomiar[] = &quot;Pomiar&quot;;<br />const char PROGMEM txt_setings[] = &quot;Ustawienia&quot;;<br />const char PROGMEM txt_alarms[] = &quot;Alarmy&quot;;<br />const char PROGMEM txt_sensors[] = &quot;Czujniki&quot;;<br />const char PROGMEM txt_rooms[] = &quot;Pomieszczenia&quot;;<br />const char PROGMEM txt_set_id_rooms[] = &quot;SetID2R&quot;;<br />const char PROGMEM txt_name_room[] = &quot;Zmien nazwy&quot;;<br />const char PROGMEM txt_menu_set_alarm_temp[] = &quot;Maks. Min.&quot;;<br />const char PROGMEM txt_tmpr[] = &quot;Temp.&quot;;<br />const char PROGMEM txt_alarm[] = &quot;Alarmy&quot;;<br />const char PROGMEM txt_on[] = &quot;Włącz&quot;;<br />const char PROGMEM txt_off[] = &quot;Wyłącz&quot;;<br />const char PROGMEM txt_param_trans[] = &quot;Transmisja&quot;;<br />const char PROGMEM txt_test_trans[] = &quot;Testuj Trans.&quot;;<br />const char PROGMEM txt_RS232[] = &quot;RS232&quot;;<br />const char PROGMEM txt_RF[] = &quot;RFM12B&quot;;<br />const char PROGMEM txt11[]=&quot;F: &quot;;<br />const char PROGMEM txt_back[]=&quot;z powrotem&quot;;<br /><br /><br />static const struct _menuitem *currMenuPtr=&amp;str_menu;<br />static int8_t menuindex;<br />static int8_t menufirstpos;<br /><br />const struct _menuitem *GetMenuItem(uint8_t index)<br />{<br />const struct _menuitem *tmpmenuitem=currMenuPtr;<br /><br />while((tmpmenuitem) &amp;&amp; (index&gt;0))<br />{<br /> tmpmenuitem=GET_ADDR(tmpmenuitem, next);<br /> index--;<br />}<br />return tmpmenuitem;<br />}<br /><br /><br />/*Funkcje Wyświetlające i obsługujące poszczególne pozycje MENU */<br />void menu_func(){// Menu Główne<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str_P(txt_menu);<br />_delay_ms(2000);<br />}<br />void menu_alarm(){// Menu Alarm<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str(&quot;alarm&quot;);<br />_delay_ms(2000);<br />}<br />void menu_setings(){// Menu Ustawienia<br /><br />}<br />void menu_on_off(){// Menu ustawienia alarmu<br /><br />}<br />void menu_param_trans(){// Menu Parametry Transmisji<br /><br />}<br />void menu_test_trans(){// Menu Testuj Transmisje<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str(&quot;test_transmisji&quot;);<br />_delay_ms(2000);<br />}<br />void menu_RS232(){// Menu transmisja RS232<br />lcd_cls();<br />lcd_locate(1,0);<br />lcd_str(&quot;Menu_RS&quot;);<br />_delay_ms(2000);<br />}<br />void menu_RF(){// Menu Transmisja RF12B<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str(&quot;Menu_RF&quot;);<br />_delay_ms(2000);<br />}<br />void menu_sensors(){// Wyświetl znalezione czujniki<br />menu_func_flag=1;<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str_P(txt11);<br />lcd_str(&quot;Menu_czujnik&quot;);<br />for(uint8_t i = 0;i &lt; czujniki_cnt;i++){<br />display_id(i);<br />lcd_locate(i,0);<br />}<br />_delay_ms(5000);<br />menu_func_flag=0;<br />}<br />void menu_rooms(){// Menu Pomieszczeń<br />lcd_cls();<br />lcd_locate(1,0);<br />lcd_str(&quot;Menu_&quot;);<br />_delay_ms(2000);<br />}<br />void menu_set_id_to_room(){// Menu przypisania ID czujników do pomieszczeń<br />lcd_cls();<br />lcd_locate(1,0);<br />lcd_str(&quot;Przypisz czuj&quot;);<br />_delay_ms(2000);<br />}<br />void menu_name_room(){// Menu zmiany nazwy Pomieszczeń<br />lcd_cls();<br />lcd_locate(1,0);<br />lcd_str(&quot;Nazwy Pomiesz.&quot;);<br />_delay_ms(2000);<br />}<br />void menu_set_default(){// Ustaw domyślne nazwy pomieszczeń<br /><br />}<br />void menu_set_alarm_temp(){// Ustaw Maksymalną temperaturę dla pomieszczenia<br />lcd_cls();<br />lcd_locate(1,0);<br />lcd_str(&quot;Ustaw Temp.&quot;);<br />_delay_ms(2000);<br />}<br /><br /><br />/*<br /> * bool Menu_isSubmenu(struct _menuitem *mi)<br />{<br />struct _menuitem *parent=GET_ADDR(mi, parent);<br />if(Menu_isOnList(parent, mi)==true)<br /> {<br />if(GET_ADDR(parent, parent)) return true;<br />     } else return true;<br />return false;<br />}*/<br /><br />void Menu_Show()<br />{<br /><br />const struct _menuitem *tmpmenuitem=GetMenuItem(menufirstpos);<br /><br />for(uint8_t i=0;i&lt;LCD_Y;i++)<br />{<br />uint8_t charcnt=1;<br />lcd_locate(i,0);// Dla bibliotek Mirka lcd_locate(y,x)<br /><br />if((i+menufirstpos)==menuindex) lcd_char('&gt;'); else lcd_char(' ');<br />if(GET_ADDR(tmpmenuitem, text)&amp;&amp;tmpmenuitem) // Modyfikacja dzięki koledze Krauser<br />{<br />lcd_str_P(GET_ADDR(tmpmenuitem, text));<br />charcnt+=strlen_P(GET_ADDR(tmpmenuitem, text));<br />}<br />if(GET_ADDR(tmpmenuitem, submenu) &amp;&amp; tmpmenuitem) // Modyfikacja dzięki koledze Krauser<br />{<br />lcd_char(0x7E);<br />charcnt++;<br />}<br />for(;charcnt&lt;LCD_X;charcnt++) lcd_char(' '); //Wyczyść resztę wyświetlanej linii<br />tmpmenuitem=GET_ADDR(tmpmenuitem, next);<br /><br />}<br />}<br /><br />void Menu_SelectNext()<br />{<br />if(GetMenuItem(menuindex+1)!=0)<br /> {<br />  menuindex++;<br />  if((menuindex-menufirstpos)&gt;=LCD_Y) menufirstpos++;<br /> } else<br /> {<br />  menuindex=0;<br />  menufirstpos=0;<br />     }<br />Menu_Show();<br />}<br /><br />void Menu_SelectPrev()<br />{<br />        if(menuindex&gt;0)<br />         {<br />          menuindex--;<br />          if(menuindex&lt;menufirstpos) menufirstpos--;<br />         }<br />         else<br />         {<br />          const struct _menuitem *tmpmenuitem=currMenuPtr;<br />          while(tmpmenuitem)<br />          {<br />           tmpmenuitem=GET_ADDR(tmpmenuitem,next);<br />           if(tmpmenuitem) menuindex++;<br />          }<br />          menufirstpos=menuindex-(LCD_Y-1); //drobna modyfikacja<br />          if(menufirstpos&lt;0) menufirstpos=0;<br />     }<br />        Menu_Show();<br />}<br /><br /><br />void Menu_Back()<br />{<br />const struct _menuitem *tmpMenuPtr=GET_ADDR(currMenuPtr, parent);<br />menufirstpos=0;<br />menuindex=0;<br />currMenuPtr=tmpMenuPtr;<br />}<br /><br />void Menu_Ok()<br />{<br />const struct _menuitem *tmpmenuitem=GetMenuItem(menuindex);<br />const struct _menuitem *submenu=GET_ADDR(tmpmenuitem, submenu);<br />    menuitemfuncptr mfptr=GET_ADDR(tmpmenuitem, menuitemfunc);<br /><br />    if(mfptr) (*mfptr)(); //wywołuje funkcję jeśli dostępna (tu można opcjonalnie zablokować wyświetlanie menu po zakończeniu funkcji, ale wtedy po każdej funkcji)<br />    if(submenu)  //podmienia menu na submenu jeśli dostępne<br />    {<br />       currMenuPtr=submenu;<br />       menuindex=0;<br />       menufirstpos=0;<br />    }<br />   Menu_Show();<br />}<br />void KeyUp(void){<br /><br />}<br />void KeyDown(void){<br /><br />}<br />/* Koniec - Funkcje Wyświetlające i obsługujące poszczególne pozycje MENU */<br /><br /><br />const struct _menuitem str_menu_setings;<br />const struct _menuitem str_menu_sensors;<br />const struct _menuitem str_menu_param_trans;<br />const struct _menuitem str_menu_set_RS232;<br />/*struct _menu_item {napis menu, wsk na funkcje menu,wsk poprzed menu, wsk pod menu, wsk next menu} */<br />const struct _menuitem str_menu_start PROGMEM = {txt_start, start_pomiaru, 0, 0, 0};<br /><br />const struct _menuitem str_menu_set_back PROGMEM = {txt_back, Menu_Back, &amp;str_menu, 0, 0};<br />const struct _menuitem str_menu_set_RF PROGMEM = {txt_RF, menu_RF, &amp;str_menu_set_RS232, 0, &amp;str_menu_set_back};<br />const struct _menuitem str_menu_set_RS232 PROGMEM = {txt_RS232, menu_RS232, &amp;str_menu_param_trans, 0, &amp;str_menu_set_RF};<br /><br />const struct _menuitem str_menu_back_sensor PROGMEM = {txt_back, Menu_Back, &amp;str_menu_sensors, 0, 0};<br />const struct _menuitem str_menu_set_id_to_room PROGMEM = {txt_set_id_rooms, menu_set_id_to_room, &amp;str_menu_sensors, 0, &amp;str_menu_back_sensor};<br />const struct _menuitem str_menu_sensors PROGMEM = {txt_sensors, menu_sensors, &amp;str_menu_setings, 0, &amp;str_menu_set_id_to_room};<br /><br />const struct _menuitem str_menu_back = {txt_back, Menu_Back, &amp;str_menu, 0, 0};<br />const struct _menuitem str_menu_test_trans = {txt_test_trans, menu_test_trans, &amp;str_menu, 0, &amp;str_menu_back};<br />const struct _menuitem str_menu_param_trans = {txt_param_trans, menu_param_trans, &amp;str_menu_setings, &amp;str_menu_set_RS232, &amp;str_menu_test_trans};<br />const struct _menuitem str_menu_setings PROGMEM = {txt_setings, menu_setings, &amp;str_menu, &amp;str_menu_sensors, &amp;str_menu_param_trans};<br /><br />const struct _menuitem str_menu_alarm PROGMEM = {txt_alarm, menu_set_alarm_temp, &amp;str_menu, 0, &amp;str_menu_start};<br />const struct _menuitem str_menu PROGMEM = {txt_menu, 0, &amp;str_menu_start, &amp;str_menu_setings, &amp;str_menu_alarm};<br /><br />[/syntax]<br /><br />PS. zrozumiałem też, że przez sam zamysł obsługi menu, przez klawisze w tym wypadku muszę rozdzielić jakoś obsługę klawiszami Up i down menu od obsługi np. wyświetlania w danych podprogramach jakiś danych, zmiany nazw itp. czyli by naciskając klawisz Up by np. w procedurze zmiany nazwy, nie przeskoczyło mi menu w main wprowadziłem niewielką modyfikację, oraz zmieniłem zamysł flagi menu<br /><br />main.c<br />[syntax=c]<br />SuperDebounce(&amp;ok, &amp;PINC, K_ok, 20, 500, Menu_Ok, Menu_Show);<br />if(!menu_func_flag){<br />SuperDebounce(&amp;up, &amp;PINC, K_up, 20, 500, Menu_SelectPrev, 0);<br />SuperDebounce(&amp;down, &amp;PINC, K_down, 20, 500, Menu_SelectNext, 0);<br />}<br />else{<br />SuperDebounce(&amp;up, &amp;PINC, K_up, 20, 500, KeyUp, 0);<br />SuperDebounce(&amp;down, &amp;PINC, K_down, 20, 500, KeyDown, 0);<br />}<br /><br />[/syntax]<p>Statystyki: Napisane przez Gość — 14 gru 2012, o 13:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-14T12:49:24+01:00</updated>
<published>2012-12-14T12:49:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21136#p21136</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21136#p21136"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21136#p21136"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Dalej klikając w OK, wchodzimy do ostatnio odwiedzanego MENU, a dopiero po przytrzymaniu klawisza OK wchodzimy prawidłowo do MENU głównego......<br /></div><br />Biorąc po uwagę 2 powyższe posty nie jest to możliwe. Jak wchodząc w menu uruchomisz funkcję start_pomiaru to zgodnie z jej kodem powinieneś mieć czysty ekran i dopiero wciśnięcie <strong>up/down</strong> spowoduje wyświetlenie menu z którego ta funkcja została wywołana. Natomiast wciśnięcie <strong>ok</strong> spowoduje ponowne wywołanie tej funkcji. Możesz jeszcze pokazać wszystkie zdefiniowane struktury _menuitem ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 14 gru 2012, o 12:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-14T11:59:56+01:00</updated>
<published>2012-12-14T11:59:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21134#p21134</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21134#p21134"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=21134#p21134"><![CDATA[
Niestety dalej nie udało mi się zmusić menu, do tego by po odpaleniu podprogramu start_pomiaru, menu nie wyświetlało się ponownie, przez co cały zamysł menu_flag nie sprawdza się <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />.<br /><br />Dalej klikając w OK, wchodzimy do ostatnio odwiedzanego MENU, a dopiero po przytrzymaniu klawisza OK wchodzimy prawidłowo do MENU głównego......<br /><br />Po 4secundach, zgodnie z ustawionym w Timerze = 400 czasem program wraca z powrotem do wyświetlania temperatur, niby to nie wada....hmmmm chyba to tak zostawię, bo już przynajmniej chwilowo nie mam siły z tym walczyć.<br /><br />Teraz czas na dalsze pisanie, pamiętania pomiarów, przypisywania czujników do pomieszczeń etc. to ważniejsze <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez Gość — 14 gru 2012, o 11:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-12T12:45:43+01:00</updated>
<published>2012-12-12T12:45:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20912#p20912</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20912#p20912"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20912#p20912"><![CDATA[
[syntax=c]void Menu_Ok()<br />{<br />const struct _menuitem *tmpmenuitem=GetMenuItem(menuindex);<br />const struct _menuitem *submenu=GetAddr(tmpmenuitem, submenu);<br /><br />    menuitemfuncptr mfptr=GetAddr(tmpmenuitem, menuitemfunc);<br />if(mfptr) (*mfptr)(); //wywołuje funkcję jeśli dostępna (tu można opcjonalnie zablokować wyświetlanie menu po zakończeniu funkcji, ale wtedy po każdej funkcji)<br />if(submenu)  //podmienia menu na submenu jeśli dostępne<br /> {<br />  currMenuPtr=submenu;<br />  menuindex=0;<br />  menufirstpos=0;<br />     }<br />    if (flag_menu) Menu_Show(); //wyświetla menu lub submenu, blokada wyświetlania menu - zablokowane w funkcji np. start pomiaru<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 12 gru 2012, o 12:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-11T14:32:25+01:00</updated>
<published>2012-12-11T14:32:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20823#p20823</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20823#p20823"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20823#p20823"><![CDATA[
Chwilowo mam tak....<br />[syntax=c]<br />while(1) {<br /><br /><br />uint8_t ok, up, down;<br />//SuperDebounce(&amp;menu, &amp;PINC, K_menu, 20, 500, Menu_Show, 0);<br /><br />SuperDebounce(&amp;up, &amp;PINC, K_up, 20, 500, Menu_SelectPrev, 0);<br />SuperDebounce(&amp;down, &amp;PINC, K_down, 20, 500, Menu_SelectNext, 0);<br />SuperDebounce(&amp;ok, &amp;PINC, K_ok, 20, 500, Menu_Ok, Menu_Show);<br /><br />if( !Timer4 ) {<br />Timer4=100;<br />PORTD ^= (1&lt;&lt;PD7); // i migamy Ledem co by widzieć, że program działa.<br />czujniki_cnt = search_sensors();<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />zapisz_tmpe(); // zapisuj pomiar do tablicy Tsens pod odpowiedni czujnik<br />}<br />if(!flag_menu){<br />if( !Timer4 ) {<br />Timer4=200;<br />display_tmpe(0,10,0); //display_temp(y,x,id_room)<br />lcd_locate(0,0);<br />display_id(0);<br />display_tmpe(1,10,1);<br />lcd_locate(1,0);<br />display_id(1);<br />display_tmpe(2,10,2);<br />lcd_locate(2,0);<br />display_id(2);<br />}<br />}<br /><br /><br /><br />} /* koniec pętli nieskończonej */[/syntax]<br /><br />Tylko nie wiem jak zmusić tą diabelska funkcję Menu_Show<br />[syntax=c]<br />void Menu_Show()<br />{<br />flag_menu=1;<br />const struct _menuitem *tmpmenuitem=GetMenuItem(menufirstpos);<br /><br />for(uint8_t i=0;i&lt;LCD_Y;i++)<br />{<br /> uint8_t charcnt=1;<br /> lcd_locate(i,0);// Dla bibliotek Mirka lcd_locate(y,x)<br /> if((i+menufirstpos)==menuindex) lcd_char('&gt;'); else lcd_char(' ');<br />if(GET_ADDR(tmpmenuitem, text)&amp;&amp;tmpmenuitem) // Modyfikacja dzięki koledze Krauser<br />{<br />lcd_str_P(GET_ADDR(tmpmenuitem, text));<br />charcnt+=strlen_P(GET_ADDR(tmpmenuitem, text));<br />}<br />if(GET_ADDR(tmpmenuitem, submenu) &amp;&amp; tmpmenuitem) // Modyfikacja dzięki koledze Krauser<br />{<br />lcd_char(0x7E);<br />charcnt++;<br />}<br />for(;charcnt&lt;LCD_X;charcnt++) lcd_char(' '); //Wyczyść resztę wyświetlanej linii<br />tmpmenuitem=GET_ADDR(tmpmenuitem, next);<br />}<br />}<br />[/syntax]<br />By po wywołaniu funkcji start_pomiaru<br />[syntax=c]<br />void start_pomiaru(void){<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str(&quot;zaczynamy.....&quot;);<br />_delay_ms(500);<br />flag_menu=0;<br />lcd_cls();<br />}<br />[/syntax]<br />Nie następowało ponowne wyświetlenie wywołanie Menu_Show...... nie rozumiem dlaczego program wraca, do Menu_Show?<br /><br />Jedna flaga załatwiała by sprawę, gdy by nie to iż po skończeniu funkcji start_pomiaru znowu na chwile się wyświetla menu.....jak to pieroństwo zmusić by zostawało w głównej pętli programu?<p>Statystyki: Napisane przez Gość — 11 gru 2012, o 14:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-11T11:06:14+01:00</updated>
<published>2012-12-11T11:06:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20804#p20804</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20804#p20804"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20804#p20804"><![CDATA[
Docelowo chcę uzyskać efekt jak Mirek w projekcie wielozadaniowym, muszę się pobawić flagami, by jak raz wejdziemy w menu, klawisz menu był nieaktywny, albo miał inne zadanie, a najlepiej przerobię opcję działania klawisza K_ok, by przy dłuższym kliku, działał jako menu_show, ale po wejściu w menu_show powinna być ta funkcja zablokowana, podobnie będąc w menu, teoretycznie pomiar temperatury powinien odbywać się niezależnie, aczkolwiek nie ma parcia na to........ Bo chcę zrobić (tylko jeszcze nie wiem jak, nawet nie mam zarysu koncepcji) by po jakimś czasie bezczynności po wejściu w menu program sam z niego wychodził do wyświetlania pomiaru.....<br />Nie wiem, może co jakiś czas dodawać jakąś zmienną w menu........a w obsłudze klawisza ją kasować?<p>Statystyki: Napisane przez Gość — 11 gru 2012, o 11:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[nixie]]></name></author>
<updated>2012-12-10T16:12:13+01:00</updated>
<published>2012-12-10T16:12:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20750#p20750</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20750#p20750"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20750#p20750"><![CDATA[
Ja bym umieścił pomiar w pętli głównej poza warunkiem menu_show:<br /><br />[syntax=c]if( !Timer4 ) {<br />Timer4=100;<br />PORTD ^= (1&lt;&lt;PD7); // i migamy Ledem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> co by widzieć, że program działa.<br />czujniki_cnt = search_sensors();<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />zapisz_tmpe(); // zapisuj pomiar do tablicy Tsens pod odpowiedni czujnik<br />}[/syntax]<br /><br />A z tego kawałka wywalił warunek z timerem, niech temperatura wyświetla się w każdym obiegu o ile nie jest wyświetlane menu<br /><br />[syntax=c]if( !Timer4 ) {<br />Timer4=200;<br />display_tmpe(0,10,0); //display_temp(y,x,id_room)<br />lcd_locate(0,0);<br />display_id(0);<br />display_tmpe(1,10,1);<br />lcd_locate(1,0);<br />display_id(1);<br />display_tmpe(2,10,2);<br />lcd_locate(2,0);<br />display_id(2);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=358">nixie</a> — 10 gru 2012, o 16:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-12-10T15:37:41+01:00</updated>
<published>2012-12-10T15:37:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20743#p20743</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20743#p20743"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=20743#p20743"><![CDATA[
Jak obiecałem tak zrobiłem, chwilowo to tylko menu i pomiar, oraz wyświetlanie danych z trzech czujników, cała reszta dopiero w fazie pisania (czyt. wymyślania jak to napisać). Zresztą całe to menu to jak to ładnie Mirek określa Koci program <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. <br />Na razie to mam problem, że po wywołaniu funkcji start pomiaru wyświetla się na chwile jeszcze menu, potem kawałek zostaje <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, oj szkoda gadać, głupi z tego jestem......<br />nie wiem, jak połączyć pseudo-wielowątkowość <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> z obsługa menu i głównego programu.....<br /><br />Zresztą oceńcie sami..... program w załączniku, oczywiście biblioteki 1wire i LCD w własnym zakresie należy sobie skopiować.<p>Statystyki: Napisane przez Gość — 10 gru 2012, o 15:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-11-27T14:12:36+01:00</updated>
<published>2012-11-27T14:12:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19626#p19626</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19626#p19626"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19626#p19626"><![CDATA[
Jeszcze nie, bo została mi obsługa klawiszy do przerobienia pod to, ale obsługę menu już wrzuciłem. Po wrzuceniu debounce od Mirka, będę powoli uruchamiał to <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br /><br />PS. Mam nadzieje, że ruszy bez większych problemów, menu może być trochę chaotyczne, ale mam nadzieje, że będzie działać zgodnie z założeniami..... Jeszcze muszę pomyśleć o spowolnieniu przeskakiwania między menu, by nie było na _delayach. Zapewne wykorzystam ten sam mechanizm co Mirek przy debouncigu z softwerowym timerem.<br /><br />PS2. Debouncig wrzucony, ale coś namieszałem w samych strukturach bo wyświetla się od razu menu RS232, można przejść do przodu do RFM12, odpalić program ale przypisany pod funkcję RS232, ale przy cofaniu menu idzie w maliny <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, program chyba też <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. <br />Chwilowo nic nowego nie wrzucam, przeanalizuję jeszcze raz struktury menu i jak będzie działać do dopiero wrzucę źródełka.<p>Statystyki: Napisane przez Gość — 27 lis 2012, o 14:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jachu]]></name></author>
<updated>2012-11-27T14:05:51+01:00</updated>
<published>2012-11-27T14:05:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19625#p19625</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19625#p19625"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19625#p19625"><![CDATA[
Masz to juz wyswietlone na lcd ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=110">jachu</a> — 27 lis 2012, o 14:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-11-27T13:35:24+01:00</updated>
<published>2012-11-27T13:35:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19624#p19624</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19624#p19624"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19624#p19624"><![CDATA[
Po kilku dniach walki, udało mi się w końcu stworzyć strukturę menu<br /><br />[syntax=c]<br />menu.c<br /><br />define GetAddr(ptr, field) (void*)pgm_read_word(((uint8_t*)ptr)+offsetof(struct _menu_item, field))<br /><br />static const struct _menu_item *currMenuPtr=&amp;menu;<br />//static uint8_t menuindex;<br />//static uint8_t menufirstpos;<br /><br />const struct _menu_item *GetMenuItem(uint8_t index)<br />{<br />const struct _menu_item *tmpmenuitem=currMenuPtr;<br /><br />while((tmpmenuitem) &amp;&amp; (index&gt;0))<br />{<br /> tmpmenuitem=GetAddr(tmpmenuitem, next);<br /> index--;<br />}<br />return tmpmenuitem;<br />}<br /><br />/*Funkcje Obsługujące Poruszanie Po MENU */<br />void menu_show(){// Funkcja wyświetlająca MENU<br /><br />}<br />void menu_select_next(){// Następny element MENU<br /><br />}<br />void menu_select_prev(){// Poprzedni element MENU<br /><br />}<br />void menu_back(){// Powróć do poprzedniego MENU<br /><br />}<br />void menu_ok(){// Wejdź do MENU - czyli wykonuj, inaczej enter<br /><br />}<br />/*Koniec - Funcji obsługujących MENU*/<br /><br />/*Funkcje Wyświetlające i obsługujące poszczególne pozycje MENU */<br />void menu_func(){// Menu Główne<br />lcd_cls();<br />lcd_str_P(txt11); lcd_str_P(txt_menu);<br />_delay_ms(2000);<br />}<br />void menu_start(){// start pomiaru<br /><br />}<br />void menu_alarm(){// Menu Alarm<br /><br />}<br />void menu_setings(){// Menu Ustawienia<br /><br />}<br />void menu_on_off(){// Menu ustawienia alarmu<br /><br />}<br />void menu_param_trans(){// Menu Parametry Transmisji<br /><br />}<br />void menu_RS232(){// Menu transmisja RS232<br /><br />}<br />void menu_RF(){// Menu Transmisja RF12B<br /><br />}<br />void menu_sensors(){// Wyświetl znalezione czujniki<br /><br />}<br />void menu_rooms(){// Menu Pomieszczeń<br /><br />}<br />void menu_set_id_rooms(){// Menu przypisania ID czujników do pomieszczeń<br /><br />}<br />void menu_name_room(){// Menu zmiany nazwy Pomieszczeń<br /><br />}<br />void menu_set_default(){// Ustaw domyślne nazwy pomieszczeń<br /><br />}<br />void menu_set_alarm_temp(){// Ustaw Maksymalną temperaturę dla pomieszczenia<br /><br />}<br />/* Koniec - Funkcje Wyświetlające i obsługujące poszczególne pozycje MENU */<br /><br />/* Deklaracje głównych menu */<br />struct _menu_item menu; // Menu Główne<br />struct _menu_item str_menu_setings;  // menu setings<br />struct _menu_item str_menu_sensors;<br />struct _menu_item str_menu_param_trans;<br />/*struct _menu_item {napis menu, wsk na funkcje menu,wsk poprzed menu, wsk pod menu, wsk next menu} */<br /><br />struct _menu_item str_menu_set_RF = {txt_RF, menu_RF, &amp;str_menu_param_trans, 0, 0};<br />struct _menu_item str_menu_set_RS232 = {txt_RS232, menu_RS232, &amp;str_menu_param_trans, 0, &amp;str_menu_set_RF};<br />struct _menu_item str_menu_param_trans = {txt_param_trans, menu_param_trans, &amp;str_menu_setings, 0, &amp;str_menu_set_RS232};<br /><br />struct _menu_item str_menu_name_room = {txt_name_room, menu_name_room, &amp;str_menu_sensors, 0,0};<br />struct _menu_item str_menu_set_id_rooms = {txt_set_id_rooms, menu_set_id_rooms, &amp;str_menu_sensors, 0,0};<br />struct _menu_item str_menu_set_alarm_temp = {txt_menu_set_alarm_temp, menu_set_alarm_temp, &amp;str_menu_setings, 0,0};<br />struct _menu_item str_menu_rooms = {txt_name_room, menu_name_room, &amp;str_menu_setings, &amp;str_menu_set_alarm_temp, &amp;str_menu_name_room};<br />struct _menu_item str_menu_sensors = {txt_sensors, menu_sensors, &amp;str_menu_setings, &amp;str_menu_rooms, &amp;str_menu_set_id_rooms};<br /><br />struct _menu_item str_menu_alarm PROGMEM = {txt_alarm, menu_alarm, &amp;menu, 0 ,0};<br />struct _menu_item str_menu_setings PROGMEM = {txt_setings, menu_setings, &amp;menu, &amp;str_menu_sensors, &amp;str_menu_param_trans};<br />struct _menu_item menu PROGMEM = {txt_menu,menu_func, 0, &amp;str_menu_alarm, &amp;str_menu_setings};<br />[/syntax]<br /><br />[syntax=c]<br />menu.h<br />/*<br /> * menu.h<br /> *<br /> *  Created on: 23-11-2012<br /> *      Author: Sylwester Taras<br /> */<br />#include &lt;stdint.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#ifndef MENU_H_<br />#define MENU_H_<br /><br />typedef void (*menu_item_func_ptr)();<br /><br />struct PROGMEM _menu_item{<br />prog_char *text;<br />menu_item_func_ptr menu_item_func;<br />const struct _menu_item *parent;<br />const struct _menu_item *submenu;<br />const struct _menu_item *next;<br />};<br /><br /><br /><br /><br />void menu_show();// Funkcja wyświetlająca MENU<br />void menu_select_next();// Następny element MENU<br />void menu_select_prev();// Poprzedni element MENU<br />void menu_back();// Powróć do poprzedniego MENU<br />void menu_ok();// Wejdź do MENU - czyli wykonuj, inaczej enter<br /><br />void menu_func();<br />void menu_setings();<br />void menu_alarm();<br />void menu_on_off();<br />void menu_param_trans();<br />void menu_RS232();<br />void menu_RF();<br />void menu_sensors();<br />void menu_rooms();<br />void menu_set_id_rooms();<br />void menu_name_room();<br />void menu_set_default();<br />void menu_set_alarm_temp();<br /><br />extern struct _menu_item PROGMEM menu;<br /><br /><br />#endif /* MENU_H_ */<br />[/syntax]<br /><br />[syntax=c]<br />napisy_menu.h<br />/*<br /> * napisy_menu.h<br /> *<br /> *  Created on: 23-11-2012<br /> *      Author: Sylwester Taras<br /> */<br /><br />#ifndef NAPISY_MENU_H_<br />#define NAPISY_MENU_H_<br /><br />prog_char txt_menu[] = &quot;MENU&quot;;<br />prog_char txt_pomiar[] = &quot;Pomiar&quot;;<br />prog_char txt_setings[] = &quot;Ustawienia&quot;;<br />prog_char txt_alarms[] = &quot;Alarmy&quot;;<br />prog_char txt_sensors[] = &quot;Czujniki&quot;;<br />prog_char txt_rooms[] = &quot;Pomieszczenia&quot;;<br />prog_char txt_set_id_rooms[] = &quot;Ustaw czuniki&quot;;<br />prog_char txt_name_room[] = &quot;Zmien nazwy pom.&quot;;<br />prog_char txt_menu_set_alarm_temp[] = &quot;Maks. Min.&quot;;<br />prog_char txt_tmpr[] = &quot;Temp.&quot;;<br />prog_char txt_alarm[] = &quot;Alarmy&quot;;<br />prog_char txt_on[] = &quot;Włącz&quot;;<br />prog_char txt_off[] = &quot;Wyłącz&quot;;<br />prog_char txt_param_trans[] = &quot;Transmisja&quot;;<br />prog_char txt_RS232[] = &quot;RS232&quot;;<br />prog_char txt_RF[] = &quot;RFM12B&quot;;<br />prog_char txt11[]=&quot;F: &quot;;<br /><br />#endif /* NAPISY_MENU_H_ */<br /><br />[/syntax]<br /><br />Teraz czeka mnie oprogramowanie poruszania się po menu, następnie wykonywanie działań właściwych w poszczególnych funkcjach menu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. Ależ te struktury dają popalić <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 27 lis 2012, o 13:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-11-22T13:29:10+01:00</updated>
<published>2012-11-22T13:29:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19324#p19324</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19324#p19324"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19324#p19324"><![CDATA[
Hmmm co by tu dużo mówić, pierwszy krok za mną, działa, co prawda nie sprawdzałem jeszcze samego odczytu z eeprom, ale same &quot;zarządzanie&quot; czujnikami do struktur i z struktur działa bez zarzutu<br /><br />[syntax=c]<br />/*<br /> * main_tx.c<br /> *<br /> *  Created on: 06-11-2012<br /> *      Author: Sylwester Taras na podstawie bibliotek ATNEL by Mirosław Kardaś<br /> *<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &lt;avr/eeprom.h&gt;<br />#include &quot;napisy.h&quot;<br /><br />uint8_t czujniki_cnt; // ilosc czujników na magistrali<br />volatile uint8_t s1_flag; // flaga tykniecia timera co 1 secunde<br />volatile uint8_t sekundy;// licznik sekund 0-99<br />uint8_t subzero, cel, cel_fract_bits; // definicja zmiennych do przechowywania pomiaru i znaku<br /><br />// definicja struktury ID czujników<br />typedef struct {<br />uint8_t sens_max;// Pomiar max/h<br />uint8_t sens_min;// Pomiar min/h<br />uint8_t srednia;// Srednia temp/24h<br />uint8_t id_sens[OW_ROMCODE_SIZE]; // tablica z ID czujników<br />char id_room[10];// nazwa pomieszczenia przypisana<br />uint8_t mark;// znacznik pomieszczenia<br />}sens_id;// do konkretnego czujnika<br /><br />// definicja struktury czujników pomiaru<br />typedef struct {<br /> uint8_t subzero;// znak (temp. dodatnia==0 ujemna==1<br /> uint8_t cel;// wartosc dziesietna temperatury<br /> uint8_t cel_fract_bits;// wartosc po przecinku<br /> sens_id id_sens;// przypisywanie struktury z id czujnika do struktury czujnika<br />} sens;    // masło maslane ale nie wiem jak inaczej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />void write_struct_to_eeprom(sens_id czujnik); // deklaracja funkcji zapisującej strukturę<br />// sens_id do EEPROM<br />void zapisz_id(void);// deklaracja funkcji zaspisującej ID czujnikow<br />// do tablicy ram_sens_id<br />sens Tsens [9]; // Tablica Tsens elementów struktur sens w ram<br />sens_id eem_sens_id[9] EEMEM; // definicja tablicy struktur sens_id w eeprom<br />sens_id ram_sens_id[9]; // definicja tablicy sens_id w ram, czyli nasza tablica sens_id<br />// na której pracujemy<br />//deklaracje funkcji obsługi czujnikow, wyswietlania itd<br />void zapisz_tmpe(void);<br />void display_tmpe(uint8_t y, uint8_t x, uint8_t id_room);<br />void display_id(uint8_t id);<br />//koniec deklaracji funkcji obsługi czujników itd.<br /><br />int main(void){<br />DDRA |= (1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7); // podswietlenie wyswietlacza chwilowo na stale<br />DDRD |= (1&lt;&lt;PD7);// wyjście diody LED<br /><br />/* Ustawienie Timera0 dla F_CPU=11,05920Mhz */<br />TCCR0 |= (1&lt;&lt;WGM01);// Tryb CTC<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// Preskaler = 1024<br />OCR0 = 108;// dodakowy podział przez 108 (rejestr przepełnienia)<br />TIMSK |= (1&lt;&lt;OCIE0);// zezwolenie na przerywanie CompareMatch<br /><br />/*Przerywanie wygonywane jest z czestotliwoscia ok 10ms (100 razy na secunde)*/<br /><br />lcd_init();<br />lcd_defchar(0x80,stopien); // definicja znaku stopnia w LCD<br /><br />//sprawdzamy ile czujników DS18xxx jest widocznych na magistrali<br />czujniki_cnt = search_sensors();<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Znaleziono&quot;));<br />lcd_locate(1,0);<br />lcd_int(czujniki_cnt);<br />lcd_str_P(PSTR(&quot; sensor(y)&quot;));// i wyswietlamy na wyswietlaczu<br />zapisz_id();// zapisz id czujnikow do tablicy struktur ram_sens_id<br />_delay_ms(2000); // czekamy by zauważyć ile nam wykryło czujników<br />lcd_cls(); // czyscimy wyświetlacz co by głupot nie pokazywał<br /><br />//write_struct_to_eeprom(*ram_sens_id);<br />//Wysyłamy rozkaz wykonania pomiaru temperatury do wszystkich wykrytych czujników<br />//W przypadku zasilania w trybie NORMAL, gdy tryb Parasite, należy użyć jako pierwszego<br />//argumentu DS18X20_POWER_PARASITE<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL);<br />//Oczekiwanie na konwersję 750ms<br />_delay_ms(750); // wrzucamy jakąs ciekawa animacje<br /><br />sei();/* włączamy globalne przerwania */<br /><br />/* pętla nieskończona */<br />while(1) {<br />if(s1_flag) {/* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników */<br />if( 0 == (sekundy%3) ) czujniki_cnt = search_sensors();<br /><br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 1 wysyłaj rozkaz pomiaru do czujników */<br />if( 1 == (sekundy%3) ){<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />zapisz_tmpe(); // zapisuj pomiar do tablicy Tsens pod odpowiedni czujnik<br />}<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 2 czyli jedną sekundę po rozkazie konwersji<br /> *  dokonuj odczytu i wyświetlania temperatur z 4 czujników jeśli są podłączone, jeśli nie<br /> *  to pokaż komunikat o błędzie<br /> */<br />if( 2 == (sekundy%3) ) {<br /><br />PORTD ^= (1&lt;&lt;PD7); // i migamy Ledem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> co by widzieć, że program działa.<br /><br />display_tmpe(0,10,0); //display_temp(y,x,id_room)<br />lcd_locate(0,0);<br />display_id(0);<br />display_tmpe(1,10,1);<br />lcd_locate(1,0);<br />display_id(1);<br />display_tmpe(2,10,2);<br />lcd_locate(2,0);<br />display_id(2);<br /><br />}<br />/* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />s1_flag=0;<br />} /* koniec sprawdzania flagi */<br />} /* koniec pętli nieskończonej */<br />}/*koniec main*/<br /><br />// wpisywanie ID czujników do tablicy Tsens struktury sens<br />//czujnniki_cnt==ilosc czujnikow na szynie 1wire<br />void zapisz_id(void){<br />for(uint8_t j=0; j&lt;czujniki_cnt; j++){<br />for(uint8_t i=0; i&lt;OW_ROMCODE_SIZE; i++){<br />//zapisujemy ID czyjnika do tablicy struktur sens_id<br />//j==czujnik, i==rozmiar ID, czyli po prostu przepisujemy ID<br />//wykrytego czujnika do tablicy id_sens<br />ram_sens_id[j].id_sens[i] = gSensorIDs[j][i];<br />}<br />}<br />}// koniec procedury wpisywania ID czujników<br /><br /><br />// fukcja zapisujaca tablice ram_sens_id do eeprom<br />void write_struct_to_eeprom(sens_id czujnik){<br />eeprom_update_block(&amp;czujnik, &amp;eem_sens_id, sizeof(sens_id));<br />}<br />// zapisuj temperature, oraz ID czujnika do tablicy Tsens<br />void zapisz_tmpe(void){<br />for(uint8_t j=0; j&lt;czujniki_cnt; j++){<br />DS18X20_read_meas(Tsens[j].id_sens.id_sens, &amp;subzero, &amp;cel, &amp;cel_fract_bits);<br />Tsens[j].subzero=subzero;<br />Tsens[j].cel=cel;<br />Tsens[j].cel_fract_bits=cel_fract_bits;<br />for(uint8_t i=0; i&lt;OW_ROMCODE_SIZE; i++){<br />//zapisujemy ID czyjnika do tablicy struktur sens_id<br />//j==czujnik, i==rozmiar ID, czyli po prostu przepisujemy ID<br />//wykrytego czujnika do tablicy id_sens<br />Tsens[j].id_sens.id_sens[i] = gSensorIDs[j][i];<br />}<br />}<br />}<br /><br />void display_tmpe(uint8_t y, uint8_t x, uint8_t id_room){<br />lcd_locate(y,x);<br />if(Tsens[id_room].subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(Tsens[id_room].cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;.&quot;);/* wyświetl kropkę */<br />lcd_int(Tsens[id_room].cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot;\x80&quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br /><br />void display_id(uint8_t nr_czujnika){<br />for(uint8_t i = 1; i &lt; 5; i++ ){<br />if(Tsens[nr_czujnika].id_sens.id_sens[i] &lt; 0x10) lcd_str(&quot;0&quot;);<br />lcd_hex(Tsens[nr_czujnika].id_sens.id_sens[i]);<br />}<br /><br />}<br /><br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER0_COMP_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 />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 />}<br />[/syntax]<br /><br />PS. Faktycznie 10elementowa tablica Tsens nie zajmuje aż tak wiele miejsca w eepromie, wrzucę ją całą do eeproma, uaktualniane będą ewentualnie tylko ID czujników w przypadku ich zmiany no i same id_room celem zadeklarowania własnych nazw pomieszczeń, na początku będą wrzucane standardowe napisy z flash, a potem można będzie ewentualnie edytować nazwy w eepromie.<br /><br />PS. Teraz czas na kolejny etap, czyli stworzenie jakiegoś menu pod to <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, potem dalsze przygody <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez Gość — 22 lis 2012, o 13:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-11-22T09:31:23+01:00</updated>
<published>2012-11-22T09:31:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19321#p19321</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19321#p19321"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19321#p19321"><![CDATA[
Masz rację, zresztą sam fakt rzutowania na typ pusty, niby jest zrozumiały, ale nie do końca i potem człowiek coś stosuje, a sam nie wie po co <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br />Chwilowo próbuję przetrawić te struktury bo to faktycznie fajna rzecz <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. Ale przykładów z tym biednie, a nic tak nie uczy jak &quot;życiowy&quot; przykład, a nie opisy samego zagadnienia. Dlatego męczę te zapisywania do eeprom by w końcu zatrybić o co w tym chodzi. <br />Tablice, wskaźniki fajna rzecz, ale struktury to jest to co tyrgryski lubią najbardziej, załatwiają wiele rzeczy, podobnie jak klasa vector, czyli kontenery itd.<br /><br />Faktycznie, może nie będzie aż takiej nadmiarowości, bo nie wiem, czy znam na tyle wskaźniki by to wrzucić tym sposobem do eeproma, szczerze mówiąc nawet nie bardzo wiem jak to od tej strony ugryźć.<p>Statystyki: Napisane przez Gość — 22 lis 2012, o 09:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-11-22T09:20:34+01:00</updated>
<published>2012-11-22T09:20:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19320#p19320</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19320#p19320"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19320#p19320"><![CDATA[
A wiem wiem - ja już z SunRiverem kiedyś rozmawiałem o tym (void*) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... rzeczywiście - on miał na to jakieś uzasadnienie chyba z kompilatorów dla PIC (nie wiem czy dobrze pamiętam) ... no ale to człowiek omnibus jak wiesz i pisze w dziesiątkach różnych kompilatorów<br /><br />dlatego tak jak ci mówiłem - stosowanie tego (void*) nie jest jakimś błędem okropnym bo jak widzisz działa poprawnie i nie ma warninga. Ale ja ze swojej strony to uzasadniłem podpowiadając o zagrożeniach szczególnie jak ktoś stawia pierwsze kroki - to pod tym kątem piszę. Sun to wiesz - sobie poradzi - jak on pisze (void*) przy tych argumentach to ja wiem że on sobie bardzo dobrze zdaje z tego sprawę.<br /><br />A z drugiej strony ja zawsze jestem zwolennikiem ułatwiania sobie życia podczas pisania kodu, zatem jeśli teraz już dokładnie rozumiesz o co chodzi z tym (void*) w tym konkretnym przykładzie to też sam sobie wybierzesz sposób <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />ale dodam że - moim zdaniem akurat w konstrukcji AVR GCC, która jest na prawdę fajnie przemyślana jeśli chodzi o kompilator - to stosowanie rzutowania na typ wskaźnikowy void* zostawiłbym na tzw czarną godzinę, jeśli można w innych przypadkach się tego pozbyć i poprawić nawet czytelność kodu. Tak chyba też zakończyła się nawet może w tamtym temacie czy w mailu nasza konkluzja z Sunem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 7 minutach ]</span></strong><br /><br />co do pytania twojego o te struktury, eeprom itp - to tak jak widzisz trzeba dobrze przemyśleć. Ale widzę, że piszesz i obawiasz się jakby że niepotrzebnie coś tam będziesz trzymał w eeprom. Z drugiej strony - czy planujesz wykorzystać cały eeprom po brzegi ? jeśli nie to w czym może przeszkadzać te parę bajtów nadmiaru ?<br /><br />Innym rozwiązaniem problemu może być przygotowanie wskaźników na poszczególne miejsca w strukturze i to je zapakować do struktury w eepromie ... eeeh wiem że jak się tak o tym pisze z marszu to wygląda jak masło maślane z potrójnym saltem ... no ale postaraj się jeszcze pokombinować i ew pokazać efekty - w kodzie to może coś się uda podpowiedzieć dalej - naprowadzić<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 22 lis 2012, o 09:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-11-22T08:46:30+01:00</updated>
<published>2012-11-22T08:46:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19319#p19319</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19319#p19319"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19319#p19319"><![CDATA[
OK, już wczoraj to czytałem, ale byłem zbyt zmęczony by cokolwiek przetrawić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. Dziękuję po pierwsze za pomoc.<br /><br />Po drugie mogłem faktycznie namieszać z tymi danymi przekazywanymi do sizeof, bo zmieniałem to tyle razy, że mogło mi umknąć, po za tym po napisaniu posta wprowadziłem kilka zmian, bo po co mi cała tablica struktur Tsens, jak w eepromie potrzebuje mieć tylko ID czujnika, nazwę pomieszczenia, ewentualnie max, min, i średnią temperaturę z całej doby.<br /><br />Po trzecie, sugerowałem się postem SurRivera (który chyba za bardzo jest skrzywiony C++, albo robi to z rozmysłem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />), bo w książkach do C było właśnie opisane bez void* i już potem zgłupiałem kogo mam słuchać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />;).<br />Zaraz będę walczył dalej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />....(luz w pracy czasem się przydaje <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />)<br /><br />Tylko, nie wiem, jak to ugryźć (w tej chwili), bo tak, mając strukturę sens_id, która wchodzi w skład struktury sens z której to tworzona jest tablica Tsens[9], czyli dziesięć elementów typu struct sens.... i teraz wrzucając strukturę sens_id do eeprom, przecież będzie wrzucona tylko dla jednego czujnika, wrzucając zaś tablicę Tsens niepotrzebnie zajmuję w eeprom pamięć. Robić kolejną tablicę 10elementówą struktur sens_id która będzie wrzucona do EEPROM, czy jest na to jakiś inny sposób, bo nie bardzo wiem, jak zmusić eeprom by przyjmował 10 struktur sens_id, bez stworzenia tablicy by łatwo było na tym operować.<p>Statystyki: Napisane przez Gość — 22 lis 2012, o 08:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-11-21T16:36:49+01:00</updated>
<published>2012-11-21T16:36:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19300#p19300</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19300#p19300"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19300#p19300"><![CDATA[
to jest potworek <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />[syntax=c]eeprom_update_block((const void*)&amp;czujnik, (void*)&amp;eem_sens_id, sizeof(sens));[/syntax]<br /><br />już tłumaczę dlaczego,<br /><br />1. pozbądź się tego rzutowania - ono jest tu ZUPEŁNIE niepotrzebnie ponieważ argumenty funkcji są już void* i zresztą po to są void*, żebyś nie musiał rzutować nawet innych typów. To już jest wbudowana zaleta a ty próbujesz ją jeszcze dodatkowo niepotrzebnie obejść. Oczywiście to niczemu nie zaszkodzi w tym przypadku ale niestety robi się potworek i po tym rozpoznałem że tu jeszcze nie wiesz o co chodzi - dlatego tłumaczę<br /><br />[syntax=c]eeprom_update_block( &amp;czujnik, &amp;eem_sens_id, sizeof(sens));[/syntax]<br /><br />2. jak już będziesz robił rzutowanie to UWAŻAJ! rzutowanie na typ wskaźnikowy (void*) może być dla ciebie dosyć niebezpieczne, dokąd ostatecznie i dobrze nie zrozumiesz zasad rzutowania a widać, że jeszcze troszkę kiepsko. Nawet jak się rozumie rzutowanie dobrze to - rzutowanie na typ void* robi się w ostateczności, gdy już INACZEJ (normalnie) się nie da<br /><br />3. patrz korzystasz ze struktury czujnik, korzystasz ze struktury eem_sens_id, tymczasem sizeof bierzesz z ??? sens ... a co to jest sens ... nawet dla oka ciężko później to analizować. nie lepiej dla oka jeśli byłoby tak?<br /><br />[syntax=c]eeprom_update_block( &amp;czujnik, &amp;eem_sens_id, sizeof(czujnik) );[/syntax]<br /><br />albo nawet jeśli struktury są równe i lecimy po całości to także<br /><br />[syntax=c]eeprom_update_block( &amp;czujnik, &amp;eem_sens_id, sizeof(eem_sens_id) );[/syntax]<br /><br />teraz to ja od razu widzę o jaki rozmiar chodzi do skopiowania/updejtowania<br /><br />to tyle tak na gorąco<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 21 lis 2012, o 16:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-11-21T14:07:40+01:00</updated>
<published>2012-11-21T14:07:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19287#p19287</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19287#p19287"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19287#p19287"><![CDATA[
Zgodnie z tym postem <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic1591.html#p15892" >topic1591.html#p15892</a><!-- l --> stworzyłem takiego potworka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />[syntax=c]// wpisywanie ID czujników do tablicy Tsens struktury sens i wreszcie struktury id_sens i tablicy id_sens[]<br />void zapisz_id(void){<br />for(uint8_t j=0; j&lt;czujniki_cnt; j++){<br />for(uint8_t i=0; i&lt;OW_ROMCODE_SIZE; i++){<br />Tsens[j].id_sens.id_sens[i] = gSensorIDs[j][i];<br />}<br />}<br />}// koniec procedury wpisywania ID czujników<br /><br />// fukcja zapisujaca tablice structur sens do eeprom<br />void write_struct_to_eeprom(sens czujnik){<br />eeprom_update_block((const void*)&amp;czujnik, (void*)&amp;eem_sens_id, sizeof(sens));<br />}<br />[/syntax]<br />mając zadeklarowane struktury<br /><br />[syntax=c]<br />// definicja struktury ID czujników<br />typedef struct {<br />uint8_t sens_max;// Pomiar max/h<br />uint8_t sens_min;// Pomiar min/h<br />uint8_t srednia;// Srednia temp/24h<br />uint8_t id_sens[8]; // tablica z ID czujników<br />char id_room[9];// nazwa pomieszczenia przypisana<br />// do konkretnego czujnika<br />}sens_id;<br /><br />sens_id eem_sens[9] EEMEM; // definicja  tablicy struktur sens w eeprom // chwilowo pusta definicja wiem, że nie można<br />sens_id ram_sens_id; // definicja struktury id w ram<br /><br />// definicja struktury czujników pomiaru<br />typedef struct {<br /> uint8_t   subzero;// znak (temp. dodatnia==0 ujemna==1<br /> uint8_t   cel;// wartosc dziesietna temperatury<br /> uint8_t   cel_fract_bits;// wartosc po przecinku<br /> sens_id id_sens;// przypisywanie struktury z id czujnika do struktury czujnika<br />} sens;    // masło maslane ale nie wiem jak inaczej<br />void write_struct_to_eeprom(sens czujnik); // deklaracja funkcji zapisującej strukturę<br />// sens do EEPROM<br />sens Tsens [9]; // Tablica Tsens elementów struktur sens w ram<br />[/syntax]<br /><br />Tylko że [syntax=c]<br />void write_struct_to_eeprom(sens czujnik){<br />eeprom_update_block((const void*)&amp;czujnik, (void*)&amp;eem_sens_id, sizeof(sens));<br />}[/syntax]<br />Zapisuje tylko strukturę do EEPROM, czy zamiast sens czujnik, dać sens *czujnik i przekazywać wskaźnik do tablicy, czy coś nie do końca zrozumiałem, bo chcę eeprom_update_block.... załatwić przepisywanie całej tablicy Tsense do eeprom, dzięki temu po pierwsze mam wszystkie dane potrzebne w eeprom, które niepotrzebnie nie są za każdym razem zapisywane na nowo, bo eeprom_update_block najpierw sprawdzi czy dane już istnieją w eeprom, ewentualnie zmieni tylko to co się zmieniło <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />Czy to jest prawidłowe wywołanie?<br />[syntax=c]write_struct_to_eeprom(*Tsens);[/syntax]<br />by całą tablicę struktur Tsens[] wrzucić do Tablicy struktur w eeprom?, w zasadzie potrzebuję mieć tylko tablicę struktry sens_id by była zachowana nazwa i ID czujnika, ale zaczyna mi wychodzić masło maślane.....<p>Statystyki: Napisane przez Gość — 21 lis 2012, o 14:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2012-11-20T13:58:23+01:00</updated>
<published>2012-11-20T13:58:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19183#p19183</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19183#p19183"/>
<title type="html"><![CDATA[Re: Pomiar temperatury DS18B20 ciąg dalszy...oraz RFM12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1767&amp;p=19183#p19183"><![CDATA[
Z racji iż istnieje już kilka podobnych tematów <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> tj. <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic1725.html" >topic1725.html</a><!-- l --> oraz <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic1784.html" >topic1784.html</a><!-- l --> no i <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/post17932.html?hilit=zapis%20eeprom#p17932" >post17932.html?hilit=zapis%20eeprom#p17932</a><!-- l --><br /><br />Po zapoznaniu się z w/w tematami doszedłem metodą wykluczeń (tj. wykluczania co wiem czego nie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />) do tego iż najlepiej będzie stworzyć dwie struktury, a w zasadzie trzy.<br /><br />[syntax=c]<br />// definicja struktury ID czujników w eeprom<br />typedef struct {<br />uint8_t id_sens_ee[8];<br />uint8_t sens_max;<br />uint8_t sens_min;<br />uint8_t srednia;<br />}sens_id;<br /><br />sens_id eem_sens_id EEMEM; // definicja struktury id w eeprom<br />sens_id ram_sens_id; // definicja struktury id w ram<br /><br />// definicja struktury czujników pomiaru<br />typedef struct {<br /> uint8_t   subzero;<br /> uint8_t   cel;<br /> uint8_t   cel_fract_bits;<br /> char   *id;// wskaźnik do tablicy z ID DS18x20<br /> char id_room[9];   // tablica z nazwą pomieszczenia<br /> sens_id id_sens;// przypisywanie struktury id do struktury czujnika<br />      // masło maslane ale nie wiem jak inaczej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />} sens;<br />[/syntax]<br /><br />w przypadku struktury czujników sens, bedzie stworzona tablica <br />[syntax=c]sens Tsens [9]; // Tablica Tsens elementów struktur sens[/syntax]<br />gdzie będą lądować ID czujnika, aktualny pomiar temperatury itd. wszystko w RAM, do tego<br />w eeprom będzie tablica eem_sens_id EEMEM;, czyli tablica samych ID, z paroma dodatkowymi zmiennymi, bo po co mi aktualny pomiar w eepromie.<br /><br />Czyli na początku robię funkcję (jeszcze przed main), która za pomocą bibliotek Mirka wykrywa czujniki na szynie 1wire, ich ID wrzuca do eeproma, następnie używając już tylko ID z eeprom wykonuję pomiary podobnie jak w temacie <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic1725.html?hilit=zapis%20eeprom#p18348" >topic1725.html?hilit=zapis%20eeprom#p18348</a><!-- l --> <br />Dzięki wykorzystaniu struktury struktur mogę przypisać dowolną nazwę do danego ID czujnika, nie tracąc przy okazji ID czujnika <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br />Dodatkowo (jeszcze nie wiem jak, ale w <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic1591.html#p15892" >topic1591.html#p15892</a><!-- l --> SunRiver opisał dosyć dobrze odwoływanie się do eeproma struktury itp), będę mógł pobierać i zmieniać poszczególne parametry tablicy struktur w eepromie (tak mi się przynajmniej wydaje).<br /><br />Docelowo będę miał 6 pomieszczeń do obczujnikowania, do tego jakieś alarmy max, min, temperatura na piecu z jakimś prostym sterowaniem, ale by było śmieszniej 2-3czujniki będą w bazie reszta po RFM12, albo nRF24L01, ale to później.<br /><br />Mirek tak fajnie opowiadał o swoim 4kanałowym sterowniku, czuję się jak &quot;krasnoludki&quot; z kingsize, cyt. &quot;bo z was dupy nie prowokatorzy...&quot; koniec cytatu.<br /><br />do tej pory miałem zrobione tak<br /><br />[syntax=c]<br />/*<br /> * main_tx.c<br />*/<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;sensory/sensory.h&quot;<br />#include &lt;avr/eeprom.h&gt;<br />#include &quot;napisy.h&quot;<br /><br /><br /> //  y kolumna, x wiersz,  id_temp ID czujnika (pomieszczenie)<br />void display_temp(uint8_t y, uint8_t x, uint8_t id_room);<br />void zapisz_temp(void);<br />void zapisz_id_eeprom(void);<br />uint8_t t_co[OW_ROMCODE_SIZE];//zmienna z przypisanym ID czujnika<br />uint8_t ee_t_co[OW_ROMCODE_SIZE] EEMEM; //zmienna w eeprom z przypisanym ID czujnika<br />void show_id(uint8_t *id, uint8_t nr_czujnika);<br />//enum room {psy = 1, kurnik, kurnikII, koza, piec, garaz };<br /><br />uint8_t czujniki_cnt; // ilosc czujników na magistrali<br />volatile uint8_t s1_flag; // flaga tykniecia timera co 1 secunde<br />volatile uint8_t sekundy;// licznik sekund 0-99<br /><br />/*<br /> * subzero-znak (temperatura dodatnia==0 lub ujemna==1<br /> * cel-wartosc dziesietna temperatury<br /> * cel_frac_bits-wartosc po przecinku<br /> */<br />uint8_t subzero, cel, cel_fract_bits;<br /><br /><br />int main(void){<br />DDRA |= (1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7); // podswietlenie wyswietlacza chwilowo na stale<br />DDRD |= (1&lt;&lt;PD7);// wyjście diody LED<br /><br />/* Ustawienie Timera0 dla F_CPU=11,05920Mhz */<br />TCCR0 |= (1&lt;&lt;WGM01);// Tryb CTC<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// Preskaler = 1024<br />OCR0 = 108;// dodakowy podział przez 108 (rejestr przepełnienia)<br />TIMSK |= (1&lt;&lt;OCIE0);// zezwolenie na przerywanie CompareMatch<br /><br />/*Przerywanie wygonywane jest z czestotliwoscia ok 10ms (100 razy na secunde)*/<br /><br />lcd_init();<br />lcd_defchar(0x80,stopien); // definicja znaku stopnia w LCD<br /><br />//sprawdzamy ile czujników DS18xxx jest widocznych na magistrali<br />czujniki_cnt = search_sensors();<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Znaleziono&quot;));<br />lcd_locate(1,0);<br />lcd_int(czujniki_cnt);<br />lcd_str_P(PSTR(&quot; sensor(y)&quot;));// i wyswietlamy na wyswietlaczu<br />zapisz_id_eeprom();<br />lcd_cls();<br />//Wysyłamy rozkaz wykonania pomiaru temperatury do wszystkich wykrytych czujników<br />//W przypadku zasilania w trybie NORMAL, gdy tryb Parasite, należy użyć jako pierwszego<br />//argumentu DS18X20_POWER_PARASITE<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL);<br />//Oczekiwanie na konwersję 750ms<br />_delay_ms(750); // wrzucamy jakąs ciekawa animacje<br /><br />sei();/* włączamy globalne przerwania */<br /><br />/* pętla nieskończona */<br />while(1) {<br />if(s1_flag) {/* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników */<br />if( 0 == (sekundy%3) ) czujniki_cnt = search_sensors();<br /><br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 1 wysyłaj rozkaz pomiaru do czujników */<br />if( 1 == (sekundy%3) ){<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />zapisz_temp();<br />}<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 2 czyli jedną sekundę po rozkazie konwersji<br /> *  dokonuj odczytu i wyświetlania temperatur z 4 czujników jeśli są podłączone, jeśli nie<br /> *  to pokaż komunikat o błędzie<br /> */<br />if( 2 == (sekundy%3) ) {<br /><br />PORTD ^= (1&lt;&lt;PD7); // i migamy Ledem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> co by widzieć, że program działa.<br /><br />display_temp(0,10,0); //display_temp(y,x,id_room)<br />lcd_locate(0,0);<br />display_id(0);<br />display_temp(1,10,1);<br />lcd_locate(1,0);<br />display_id(1);<br />display_temp(2,10,2);<br />lcd_locate(2,0);<br />display_id(2);<br /><br />}<br />/* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />s1_flag=0;<br />} /* koniec sprawdzania flagi */<br />} /* koniec pętli nieskończonej */<br />}/*koniec main*/<br /><br />void zapisz_id_eeprom(void){  // to jest jakaś genetyczna pomyłka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />// wpisywanie ID czujników do EEPROM<br /><br />for(uint8_t j=0; j&lt;czujniki_cnt; j++){<br />for(uint8_t i=0; i&lt;OW_ROMCODE_SIZE; i++){<br />Tsens[j].id_room[i] = gSensorIDs[j][i];<br />}<br />eeprom_write_block (Tsens[j].id_room, ee_t_co, OW_ROMCODE_SIZE);<br />}<br /><br />// koniec procedury wpisywania ID czujników do EEPROM<br /><br />}<br /><br /><br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER0_COMP_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 />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 />}<br /><br />[/syntax]<br />[syntax=c]<br />/*<br /> * sensory.c<br /> *<br /> *  Created on: 19-11-2012<br /> *      Author: sylwq<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;sensory.h&quot;<br />#include &lt;avr/eeprom.h&gt;<br />#include &quot;..\LCD\lcd44780.h&quot;<br />#include &quot;..\1Wire\ds18x20.h&quot;<br /><br />// definicja struktury ID czujników w eeprom<br />typedef struct {<br />uint8_t id_sens_ee[8];<br />uint8_t sens_max;<br />uint8_t sens_min;<br />uint8_t srednia;<br />}sens_id;<br /><br />sens_id eem_sens_id EEMEM; // definicja struktury id w eeprom<br />sens_id ram_sens_id; // definicja struktury id w ram<br /><br />// definicja struktury czujników pomiaru<br />typedef struct {<br /> uint8_t   subzero;<br /> uint8_t   cel;<br /> uint8_t   cel_fract_bits;<br /> char   *id;// wskaźnik do tablicy z ID DS18x20<br /> char id_room[9];   // tablica z nazwą pomieszczenia<br /> sens_id id_sens;// przypisywanie struktury id do struktury czujnika<br />      // masło maslane ale nie wiem jak inaczej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />} sens;<br /><br />sens Tsens [9]; // Tablica Tsens elementów struktur sens<br /><br />void zapisz_temp(void){<br />for(uint8_t i=0; i&lt;czujniki_cnt; i++){<br />DS18X20_read_meas(gSensorIDs[i], &amp;subzero, &amp;cel, &amp;cel_fract_bits);<br />Tsens[i].subzero=subzero;<br />Tsens[i].cel=cel;<br />Tsens[i].cel_fract_bits=cel_fract_bits;<br />show_id(&amp;gSensorIDs[i][0],i);<br />}<br />}<br /><br />void display_temp(uint8_t y, uint8_t x, uint8_t id_room){<br />lcd_locate(y,x);<br />if(Tsens[id_room].subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(Tsens[id_room].cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;.&quot;);/* wyświetl kropkę */<br />lcd_int(Tsens[id_room].cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot;\x80&quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br /><br />void show_id(uint8_t *id, uint8_t nr_czujnika){<br />for(uint8_t i = 1; i &lt; 5; i++ ){<br />     Tsens[nr_czujnika].id_room[i]=id[i];<br />     }<br />}<br /><br /><br />/*<br />void display_id(uint8_t id){<br />for(uint8_t i = 1; i &lt; 5; i++ ){<br />if(Tsens[id].id_room[i] &lt; 0x10) lcd_str(&quot;0&quot;);<br />lcd_hex(Tsens[id].id_room[i]);<br />}<br /><br />}<br />*/<br />[/syntax]<br /><br />Chyba będę musiał wywalić to wszystko i pisać od początku, bo już sam nie wiem jak do tego podejść <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" />...<p>Statystyki: Napisane przez Gość — 20 lis 2012, o 13:58</p><hr />
]]></content>
</entry>
</feed>