{"id":430,"date":"2016-03-26T21:49:57","date_gmt":"2016-03-26T20:49:57","guid":{"rendered":"http:\/\/www.daniel.slask.pl\/?p=430"},"modified":"2021-02-12T21:11:52","modified_gmt":"2021-02-12T20:11:52","slug":"rejestrator-parametrow-u-i-t","status":"publish","type":"post","link":"https:\/\/daniel.slask.pl\/m\/rejestrator-parametrow-u-i-t\/","title":{"rendered":"Rejestrator parametr\u00f3w &#8211; U, I, T"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Przod_1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Przod_1-150x150.jpg\" alt=\"Przod_1\" class=\"wp-image-457\"\/><\/a><\/figure><\/div>\n\n\n\n<p>W ko\u0144cu uda\u0142o mi si\u0119 uko\u0144czy\u0107 projekt, kt\u00f3ry rozpocz\u0105\u0142em rok temu! Jest to rejestrator parametr\u00f3w &#8211; <strong>U<\/strong>,<strong>I<\/strong>,<strong>T<\/strong>. G\u0142\u00f3wnym celem wykonania urz\u0105dzenia, by\u0142a mo\u017cliwo\u015b\u0107 monitorowania zmian napi\u0119cia, pr\u0105du i temperatury w badanym uk\u0142adzie wraz z zapisem na kart\u0119 <em>SD<\/em>. Urz\u0105dzenie to b\u0119dzie mi umo\u017cliwia\u0142o \u0142atw\u0105 diagnoz\u0119 problem\u00f3w z wykonanymi uk\u0142adami &#8211; bo przewa\u017cnie nast\u0119puje jaka\u015b zmiana, gdy si\u0119 odejdzie od miernika na przys\u0142owiow\u0105 sekund\u0119. Du\u017cej dok\u0142adno\u015bci rejestrator mo\u017ce i nie ma, ale b\u0119d\u0119 wiedzia\u0142 gdzie w pewnym zakresie napi\u0119\u0107 i pr\u0105du, a tak\u017ce czasu mam szuka\u0107 problemu. Dodatkowo potrzebowa\u0142em te\u017c urz\u0105dzenia przeno\u015bnego do pomiaru i rejestracji temperatury w danym pomieszczeniu.<\/p>\n\n\n\n<p>Za\u0142o\u017cenia i koncepcja zmieni\u0142a si\u0119 nieznacznie w stosunku do tego co pisa\u0142em w temacie zwi\u0105zanym z realizacj\u0105 tego uk\u0142adu. Dla przypomnienia przedstawi\u0119 je jeszcze raz, ale ju\u017c w formie ostatecznej (uaktualnionej):<\/p>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Za\u0142o\u017cenia og\u00f3lne:<\/span><\/strong><\/p>\n\n\n\n<ul><li>Zapis danych na kart\u0119 <em>SD<\/em>;<\/li><li>Pomiar napi\u0119cia do <em>13VDC<\/em>;<\/li><li>Pomiar pr\u0105du, do 0,5A;<\/li><li>Pomiar temperatury z wykorzystaniem <em>DS18B20<\/em><\/li><li>Zasilanie bateryjne, b\u0105d\u017a z zasilacza <em>12VDC<\/em>;<\/li><li>Pod\u0142\u0105czenie przej\u015bci\u00f3wki <em>RS232<\/em>, modu\u0142u bluetooth &#8211; z\u0142\u0105cze RJ45 6P;<\/li><li>Interfejs u\u017cytkownika w postaci wy\u015bwietlacza i 4 przycisk\u00f3w;<\/li><li>Wy\u015bwietlanie pomiaru napi\u0119cia, pr\u0105du i temperatury na wy\u015bwietlaczu;<\/li><li>Diody sygnalizuj\u0105ce wykonywany pomiar, oraz zapis na kart\u0119 SD;<\/li><li>2 z\u0142\u0105cza 2 pinowe do pomiaru napi\u0119cia i pr\u0105du;<\/li><li>Czujnik temperatury pod\u0142\u0105czany poprzez z\u0142\u0105cze jack;<\/li><li>Pozosta\u0142e kana\u0142y wyprowadzone na z\u0142\u0105cze RJ46 8P;<\/li><li>Ma\u0142a, przeno\u015bna obudowa.<\/li><\/ul>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Za\u0142o\u017cenia programistyczne:<\/span><\/strong><\/p>\n\n\n\n<ul><li>Mo\u017cliwo\u015b\u0107 zmiany nazw zapisywanych plik\u00f3w z poziomu <em>UI<\/em>;<\/li><li>Zmiana czasu dokonywania pomiar\u00f3w (pr\u00f3bkowania);<\/li><li>W\u0142\u0105czenie\/wy\u0142\u0105czenia odpowiednich kana\u0142\u00f3w pomiarowych;<\/li><li>Dane konfiguracyjne zapisywane w pami\u0119ci <em>EEPROM<\/em>;<\/li><\/ul>\n\n\n\n<p>Czytaj\u0105c powy\u017csze za\u0142o\u017cenia, mo\u017cna sobie wyobrazi\u0107 ogrom pracy, jaki by\u0142, podczas wykonywania rejestratora. Gdy zabra\u0142em si\u0119 za wykonywanie projektu, my\u015bla\u0142em \u017ce nie uda mi si\u0119 wszystkich za\u0142o\u017ce\u0144 wykona\u0107 tak jak planuj\u0119. Jednak uda\u0142o mi si\u0119 i jestem z tego efektu bardzo zadowolony.<\/p>\n\n\n\n<p>Zapraszam do zapoznania si\u0119 z opisem urz\u0105dzenia &#8211; budowa oraz dzia\u0142anie.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Najpierw wspomn\u0119 o z\u0142\u0105czach jack, oraz <strong>RJ45<\/strong>.<\/p>\n\n\n\n<p>W projekcie tym zastosowa\u0142em dwa typy z\u0142\u0105cz, kt\u00f3rym odpowiednim pinom przypisa\u0142em konkretne zadanie. Dzi\u0119ki temu b\u0119d\u0119 m\u00f3g\u0142 je wykorzystywa\u0107 r\u00f3wnie\u017c w kolejnych projektach jako swoje standardy z\u0142\u0105czek. S\u0105 to z\u0142\u0105cza jack oraz modu\u0142owe <strong>RJ<\/strong> &#8211; pierwszy z nich b\u0119dzie mia\u0142 zastosowanie w pod\u0142\u0105czeniu czujnik\u00f3w komunikuj\u0105cych si\u0119 po <em>1-wire<\/em>. Natomiast z\u0142\u0105cze modu\u0142owe <strong>RJ<\/strong> z 6 pinami b\u0119dzie zastosowane mi\u0119dzy innymi do komunikacji po <em>RS232<\/em> a tak\u017ce <em>RS485<\/em> (<em>RS485<\/em> w chwili obecnej nie wykorzystuj\u0119 &#8211; jest to pomys\u0142 na przysz\u0142o\u015b\u0107). W projektach b\u0119d\u0119 wykorzystywa\u0142 r\u00f3\u017cnego rodzaju z\u0142\u0105cza modu\u0142owe <strong>RJ<\/strong>, w kt\u00f3rych dwa piny b\u0119d\u0105 mia\u0142y zawsze t\u0105 sam\u0105 polaryzacj\u0119 (1 jako <em>VCC<\/em>, ostatni jako <em>GND<\/em>).<\/p>\n\n\n\n\n\t\t<style type=\"text\/css\">\n\t\t\t#gallery-1 {\n\t\t\t\tmargin: auto;\n\t\t\t}\n\t\t\t#gallery-1 .gallery-item {\n\t\t\t\tfloat: left;\n\t\t\t\tmargin-top: 10px;\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: 20%;\n\t\t\t}\n\t\t\t#gallery-1 img {\n\t\t\t\tborder: 2px solid #cfcfcf;\n\t\t\t}\n\t\t\t#gallery-1 .gallery-caption {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t\t\/* see gallery_shortcode() in wp-includes\/media.php *\/\n\t\t<\/style>\n\t\t<div id='gallery-1' class='gallery galleryid-430 gallery-columns-5 gallery-size-thumbnail'><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Jack-jako-1-wire.png'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Jack-jako-1-wire-150x150.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" aria-describedby=\"gallery-1-483\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-483'>\n\t\t\t\tZ\u0142\u0105cze Jack jako z\u0142\u0105cze do 1-wire\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Rj45-jako-zlacze-rs232.png'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Rj45-jako-zlacze-rs232-150x150.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" aria-describedby=\"gallery-1-484\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-484'>\n\t\t\t\tZ\u0142\u0105cze modu\u0142owe RJ jako z\u0142\u0105cz do RS232\n\t\t\t\t<\/dd><\/dl>\n\t\t\t<br style='clear: both' \/>\n\t\t<\/div>\n\n\n\n\n<p>Zastosowanie powy\u017cszych z\u0142\u0105czek umo\u017cliwia pewne i sprawne pod\u0142\u0105czanie i od\u0142\u0105czanie danych modu\u0142\u00f3w z wykonanego urz\u0105dzenia. Gor\u0105co polecam tworzenie swoich &#8222;standard\u00f3w&#8221; z\u0142\u0105czek.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>W wykonanym urz\u0105dzeniu napi\u0119ciem pracy jest <strong>3.3V<\/strong>, wi\u0119c zastosowanie typowego wy\u015bwietlacza z sterownikiem <em>HD44780<\/em> mo\u017ce skutkowa\u0107 tym, \u017ce napisy mog\u0105 nie by\u0107 prawid\u0142owo wy\u015bwietlane z powodu zbyt ma\u0142ego napi\u0119cia kontrastu. Postanowi\u0142em wi\u0119c zastosowa\u0107 przetwornic\u0119 napi\u0119cia ujemnego i wykona\u0107 modu\u0142 do tych wy\u015bwietlaczy. Dodatkowo taki modu\u0142 wyposa\u017cy\u0142em w z\u0142\u0105czki kt\u00f3re u\u0142atwi\u0105 mi pod\u0142\u0105czanie tego wy\u015bwietlacza do docelowego uk\u0142adu. Modu\u0142 ten zosta\u0142 opisany w poprzednim wpisie. Zach\u0119cam do zapoznania si\u0119 z nim: <strong><a href=\"http:\/\/www.daniel.slask.pl\/?p=433\">Uniwersalny modu\u0142 wy\u015bwietlacza.<\/a><\/strong><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Schemat-ideowy.png\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Schemat-ideowy-150x150.png\" alt=\"Rejestrator U I T - schemat ideowy\" class=\"wp-image-481\"\/><\/a><figcaption>Rejestrator U I T &#8211; schemat ideowy<\/figcaption><\/figure><\/div>\n\n\n\n<p>Rejestrator mo\u017ce by\u0107 zasilany z dw\u00f3ch \u017ar\u00f3de\u0142 &#8211; z baterii (na chwil\u0119 obecn\u0105 jest to bateria <strong>9V<\/strong> &#8211; nie nadaj\u0105 si\u0119 one jednak do takiego zastosowania bo maj\u0105 zbyt ma\u0142\u0105 pojemno\u015b\u0107), b\u0105d\u017a z zasilacza zewn\u0119trznego. Napi\u0119cie jakie panuje w wykonanym uk\u0142adzie jak ju\u017c wcze\u015bniej wspomnia\u0142em wynosi <strong>3.3V<\/strong>, jest ono zapewniane przez stabilizator <em>LM1117DT-3.3<\/em>. Zastosowanie napi\u0119cie <strong>3.3V<\/strong> umo\u017cliwi\u0142o bezpo\u015brednie pod\u0142\u0105czenie karty <em>SD<\/em> do mikrokontrolera bez stosowania dodatkowych uk\u0142ad\u00f3w do translacji napi\u0119cia. Komunikacja po <em>RS232<\/em> jak i obs\u0142uga czujnika <em>DALLAS DS18B20<\/em> jest r\u00f3wnie\u017c mo\u017cliwa przy zastosowanym napi\u0119ciu. Jak ju\u017c pisa\u0142em we wcze\u015bniejszym akapicie &#8211; wy\u015bwietlacz <em>LCD<\/em> posiada modu\u0142 wraz z przetwornic\u0105 napi\u0119cia ujemnego dzi\u0119ki czemu nie ma r\u00f3wnie\u017c problemu z wy\u015bwietlaniem komunikat\u00f3w. Jedyny problem &#8211; raczej niedogodno\u015b\u0107 &#8211; dotyczy pomiaru r\u00f3\u017cnicowego napi\u0119cia oraz pr\u0105du, a dok\u0142adnie maksymalnego napi\u0119cia wyj\u015bciowego w zastosowanym wzmacniaczu operacyjnym. Wed\u0142ug noty katalogowej <em>LM358<\/em> napi\u0119cie wyj\u015bciowe wzmacniacza operacyjnego mo\u017ce wynie\u015b\u0107 maksymalnie <em>V+<\/em> &#8211;<strong>1,5V<\/strong> (<em>V+<\/em> napi\u0119cie zasilaj\u0105ce), czyli w moim przypadku dla napi\u0119cia zasilaj\u0105cego <strong>3.3V<\/strong> maksymalne napi\u0119cie wyj\u015bciowe wyniesie <strong>1,8V<\/strong> (po pomiarach w rzeczywisto\u015bci maksymalne napi\u0119cie wyj\u015bciowe wynosi <strong>2V<\/strong>). Znaj\u0105c ten parametr musia\u0142em tak dobra\u0107 wzmocnienie ka\u017cdego wzmacniacza aby przy maksymalnej mierzonej warto\u015bci nie przekroczy\u0107 tego napi\u0119cia.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Pomiar-r\u00f3\u017cnicowy.png\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Pomiar-r\u00f3\u017cnicowy-150x150.png\" alt=\"Pomiar r\u00f3\u017cnicowy pr\u0105du oraz napi\u0119cia\" class=\"wp-image-485\"\/><\/a><figcaption>Pomiar r\u00f3\u017cnicowy pr\u0105du oraz napi\u0119cia<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-image-481 size-thumbnail\">Urz\u0105dzenie umo\u017cliwia pomiar napi\u0119cia na 7 kana\u0142ach, oraz pojedynczy pomiar pr\u0105du. W tych 7 kana\u0142ach do pomiaru napi\u0119cia znajduje si\u0119 6 kana\u0142\u00f3w nieskonfigurowanych (nieposiadaj\u0105cych \u017cadnego pomiaru r\u00f3\u017cnicowego &#8211; napi\u0119cie podawane jest bezpo\u015brednio do uk\u0142adu scalonego i nie mo\u017ce ono przekroczy\u0107 napi\u0119cia <strong>2,56V<\/strong>), oraz jeden kana\u0142 umo\u017cliwiaj\u0105cy pomiar napi\u0119cia do <strong>13V<\/strong>. Do pomiaru napi\u0119cia jak i pr\u0105du wykorzysta\u0142em uk\u0142ad r\u00f3\u017cnicowy z wzmacniaczem operacyjnym. Uk\u0142ad ten umo\u017cliwia pomiar spadku napi\u0119cia na danym elemencie. Poprzez odpowiedni dob\u00f3r rezystor\u00f3w mo\u017cliwe jest uzyskanie wzmocnienia w du\u017cym zakresie &#8211; wi\u0119ksze jak i mniejsze od 1. Jedyny najwi\u0119kszy minus tego rozwi\u0105zania to niska rezystancja wej\u015b\u0107 wzmacniacza, co mo\u017ce powodowa\u0107 zak\u0142\u00f3cenia w badanym uk\u0142adzie. Dlatego stara\u0142em si\u0119 zastosowa\u0107 rezystancje jak najwi\u0119ksze, aby wp\u0142yw ten by\u0142 jak najmniejszy (im wi\u0119ksza rezystancja to tym mniejszy pr\u0105d p\u0142yn\u0105cy przez rezystory w uk\u0142adzie r\u00f3\u017cnicowym &#8211; pr\u0105d kt\u00f3ry jest &#8222;pobierany&#8221; z badanego uk\u0142adu). Wzmocnienie w tym uk\u0142adzie wynosi <strong>k=7<\/strong> (warto\u015b\u0107 wzmocnienia obliczonego na podstawie rezystancji wynosi <strong>6.67<\/strong>, natomiast poda\u0142em warto\u015b\u0107 wzmocnienia &#8222;rzeczywistego&#8221; &#8211; rezystancja \u015bcie\u017cek, dok\u0142adno\u015b\u0107 5% rezystor\u00f3w i lut\u00f3w w tym przypadku odegra\u0142a znacz\u0105c\u0105 rol\u0119).<\/p>\n\n\n\n<p class=\"size-thumbnail wp-image-485\">W pomiarze pr\u0105du zosta\u0142 zastosowany rezystor, tzw. bocznik. Pomiar spadku napi\u0119cia na tym rezystorze umo\u017cliwia obliczenie z prawa Ohma pr\u0105du jaki przez ten rezystor p\u0142ynie. Zastosowany rezystor posiada rezystancj\u0119 0.1ohma. Natomiast rezystory w uk\u0142adzie r\u00f3\u017cnicowym definiuj\u0105 wzmocnienie o warto\u015bci k=41 (zastosowa\u0142em rezystory o dok\u0142adno\u015bci 1%). Upraszczaj\u0105c &#8211; spadek napi\u0119cia jest wprost proporcjonalny do pr\u0105du p\u0142yn\u0105cego przez rezystor w proporcjach 1 do 4.<\/p>\n\n\n\n<p>Pr\u00f3bkowanie mo\u017cna ustali\u0107 na jednym z nast\u0119puj\u0105cych poziom\u00f3w (czas podany w sekundach):<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p style=\"text-align: justify;\"><code>0,1; 0,2; 0,3; 0,4; 0,6; 0,8; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 20; 25; 30; 40; 60; 90; 120; 150; 180<\/code><\/p><\/blockquote>\n\n\n\n<p>Zosta\u0142y r\u00f3wnie\u017c wykonane test uk\u0142adu, w celu sprawdzenia czy najmniejszy czas pr\u00f3bkowania nie powoduje jakich\u015b b\u0142\u0119d\u00f3w, lub nieprawid\u0142owo\u015bci w dzia\u0142aniu ca\u0142ego programu jak i urz\u0105dzenia. Testy wykona\u0142em przy w\u0142\u0105czonych wszystkich kana\u0142ach pomiarowych, oraz temperatury (czyli wykonywanych by\u0142o 9 pomiar\u00f3w). Aktywny by\u0142 zapis na kart\u0119 <em>SD<\/em> (maksymalna ilo\u015b\u0107 zapisywanych danych do pliku, czyli 100), oraz przesy\u0142anie pomiar\u00f3w przez <em>RS232<\/em>. Czas pomiaru wyni\u00f3s\u0142 oko\u0142o 4 minut (plus op\u00f3\u017anienie z w\u0142\u0105czeniem i wy\u0142\u0105czeniem pomiar\u00f3w). Wyniki test\u00f3w przedstawiaj\u0105 si\u0119 nast\u0119puj\u0105co:<\/p>\n\n\n\n<ul><li style=\"text-align: justify;\">ilo\u015b\u0107 plik\u00f3w &#8211; <strong>25<\/strong>;<\/li><li style=\"text-align: justify;\">ilo\u015b\u0107 pr\u00f3bek &#8211; <strong>2463<\/strong>;<\/li><li style=\"text-align: justify;\">czas wykonywania pomiar\u00f3w wed\u0142ug ilo\u015bci pr\u00f3bek &#8211;<strong> 4 minuty i 6,3 sekundy<\/strong>.<\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Poni\u017cej przedstawiam kr\u00f3tki algorytm z dzia\u0142ania ca\u0142ego programu &#8211; jest to algorytm og\u00f3lny, gdyby zasz\u0142a taka potrzeba mog\u0119 wykona\u0107 kolejne algorytmy, ale to w zale\u017cno\u015bci czy kto\u015b b\u0119dzie zainteresowany (prosz\u0119 o umieszczanie tego w komentarzach do tego wpisu).<\/p>\n\n\n\n<figure class=\"wp-block-image alignnone\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Algorytm-g\u0142\u00f3wny.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Algorytm-g\u0142\u00f3wny-150x150.jpg\" alt=\"\" class=\"wp-image-482\"\/><\/a><figcaption>Algorytm g\u0142\u00f3wny dzia\u0142ania programu<\/figcaption><\/figure>\n\n\n\n<p>Natomiast kod p\u0119tli g\u0142\u00f3wnej jest nast\u0119puj\u0105cy:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">while(1){\n\tbacklight();\n\treturn_screen();\n\tbutton_service();\n\tDISPLAY_EVENT(1);\n\twdt_reset();\n\tpomiary();\n\tADC_EVENT();\n\tzapisz_dane();\n\tUART_EVENT(uart_bufor);\n\tsygnalizacja_led();\n\twdt_reset();\n}<\/code><\/pre>\n\n\n\n<p>&nbsp;Jak mo\u017cna zauwa\u017cy\u0107, r\u00f3wnie\u017c i w poprzednich wpisach, g\u0142\u00f3wne p\u0119tle program\u00f3w staram si\u0119 pisa\u0107 w ten spos\u00f3b aby by\u0142y przedstawione w jak najprostszy spos\u00f3b, tzn zawiera\u0142y funkcje i zajmowa\u0142y jak najmniej miejsca. Ma to na celu lepsze analizowanie kodu w przysz\u0142o\u015bci. Ka\u017cda czynno\u015b\u0107 ma przypisan\u0105 swoj\u0105 funkcj\u0119, dzi\u0119ki czemu \u0142atwo mog\u0119 odnale\u017a\u0107 j\u0105 i dokona\u0107 ewentualnej modyfikacji. U\u0142atwia r\u00f3wnie\u017c to dodawanie nowych funkcjonalno\u015bci, szczeg\u00f3lnie tych, kt\u00f3re musz\u0105 zosta\u0107 wykonane po konkretnej czynno\u015bci. Ten program r\u00f3wnie\u017c cechuje si\u0119 brakiem blokuj\u0105cych funkcji (pomijam minimalny wp\u0142yw op\u00f3\u017anie\u0144 wynikaj\u0105cych z obs\u0142ugi magistrali 1-wire).<\/p>\n\n\n\n<p>Wykorzystanie zasob\u00f3w mikrokontrolera <em>ATmega32<\/em> przedstawia si\u0119 nast\u0119puj\u0105co:<\/p>\n\n\n\n<ul><li><strong>FLASH<\/strong> &#8211; 27,848 kb tj. 85%<\/li><li><strong>RAM<\/strong> &#8211; 1,372kb tj. 67%<\/li><li><strong>EEPROM<\/strong> &#8211; 24b tj. 2,3%<\/li><\/ul>\n\n\n\n<p>Mikrokontroler taktowany jest kwarcem o cz\u0119stotliwo\u015bci <em>16MHz<\/em>.<\/p>\n\n\n\n<p>Na potrzeby projektu, stworzy\u0142em w\u0142asne biblioteki do obs\u0142ugi przycisk\u00f3w jak i menu. Na razie przedstawi\u0119 tylko najciekawsze fragmenty biblioteki do obs\u0142ugi przycisk\u00f3w. W przysz\u0142o\u015bci, jak zajdzie taka potrzeba, w nowym wpisie przedstawi\u0119 swoj\u0105 bibliotek\u0119 wraz z opisem dzia\u0142ania.<\/p>\n\n\n\n<p>Rejestracj\u0119 nowych przycisk\u00f3w dokonuje si\u0119 poprzez wywo\u0142anie odpowiedniej funkcji. Wygl\u0105da to w ten spos\u00f3b:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">\/\/rejestracja klawiszy\nbutton_register(&amp;SW_UP, &amp;(PIN(BUTTON_PORT)), (1&lt;&lt;BUTTON_UP),1,20,up_menu_button,NULL);         \/\/1\nbutton_register(&amp;SW_DWN, &amp;(PIN(BUTTON_PORT)), (1&lt;&lt;BUTTON_DWN),1,20,down_menu_button,NULL);      \/\/4\nbutton_register(&amp;SW_OK, &amp;(PIN(BUTTON_PORT)), (1&lt;&lt;BUTTON_OK),2,200,ok_menu_button, start_button);   \/\/2\nbutton_register(&amp;SW_EXIT, &amp;(PIN(BUTTON_PORT)), (1&lt;&lt;BUTTON_EXIT),2,2,exit_menu_button, NULL);      \/\/3<\/code><\/pre>\n\n\n\n<p>Natomiast zdarzenie\/procedura obs\u0142uguj\u0105ca przyciski ma posta\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">\/\/obs\u0142uga przycisk\u00f3w\nvoid button_service(void){\n\n   uint8_t i=0;         \/\/i - numer obs\u0142ugiwanego przycisku,\n   enum b_st state=none;      \/\/ state stan dla danego przycisku\n\n   for(i=0 ; i &lt; MAX_BUTTON ; i++){\n      if(button_tab[i]) {\n         state = ds_button_serv(i);\n\n         if(state == procedure)\n            continue;\n\n         if(state == button_short){\n            if(button_tab[i]-&amp;short_push)         \/\/je\u017celi zosta\u0142a przydzielona funkcja\n               button_tab[i]-&amp;short_push();\n            break;\n         }\n         else if(state == button_long){\n            if(button_tab[i]-&amp;long_push)         \/\/je\u017celi zosta\u0142a przydzielona funkcja\n               button_tab[i]-&amp;long_push();\n            break;\n         }\n      }\n   }\n}<\/code><\/pre>\n\n\n\n<p>Struktura, kt\u00f3ra przechowuje informacj\u0119 o przyciskach wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c\">typedef struct {\n    volatile uint8_t *PORT;      \/\/port do kt\u00f3rego pod\u0142\u0105czony jest klawisz, np. PINB\n    uint8_t button_mask_pin;      \/\/pin\/maska pinu do kt\u00f3rego pod\u0142\u0105czony jest przycisk, np. (1&lt;&lt;PB0)\n    uint8_t repeat_wait_s;      \/\/czas oczekiwania na identyfikacj\u0119 d\u0142ugiego wcisniecia      w s\n    uint8_t repeat_time_ms;      \/\/czas pomi\u0119dzy powt\u00f3rzeniami   w 10ms\n    void (*short_push)(void);      \/\/funkcja obs\u0142uguj\u0105ca kr\u00f3tkie wcisnienie\n    void (*long_push)(void);      \/\/funkcja obsluguj\u0105ca d\u0142ugie wcisni\u0119cie\n} DS_BUTTON;\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Komunikacja z komputerem odbywa si\u0119 poprzez interfejs <em>RS232<\/em>, natomiast obs\u0142ug\u0119 wykonuje si\u0119 poprzez komendy <em>AT<\/em> z wykorzystaniem terminala. Poprzez komendy <em>AT<\/em> mo\u017cliwa jest ta sama zmiana i konfiguracja parametr\u00f3w co poprzez <em>UI<\/em>. Jedynie kalibracja wy\u015bwietlanych warto\u015bci napi\u0119cia i pr\u0105du na wy\u015bwietlaczu <em>LCD<\/em>, jest mo\u017cliwa poprzez komendy <em>AT<\/em> (polecenie <strong>AT+CAL<\/strong>) &#8211; nie ma takiej mo\u017cliwo\u015bci z poziomu menu na wy\u015bwietlaczu. Dodatkowo do mikrokontrolera jest wgrany <em>bootloader<\/em>, kt\u00f3ry umo\u017cliwia wgranie nowego programu poprzez <em>RS232<\/em> bez pod\u0142\u0105czania zewn\u0119trznego programatora. Poni\u017cej przedstawiam screeny z dzia\u0142ania komunikacji przez <em>RS232<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-5 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Komendy-AT.png\"><img loading=\"lazy\" decoding=\"async\" width=\"675\" height=\"441\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Komendy-AT.png\" alt=\"\" data-id=\"475\" class=\"wp-image-475\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Komendy-AT.png 675w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Komendy-AT-300x196.png 300w\" sizes=\"(max-width: 675px) 100vw, 675px\" \/><\/a><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Pomiary_terminal.png\"><img loading=\"lazy\" decoding=\"async\" width=\"675\" height=\"441\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Pomiary_terminal.png\" alt=\"\" data-id=\"476\" class=\"wp-image-476\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Pomiary_terminal.png 675w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Pomiary_terminal-300x196.png 300w\" sizes=\"(max-width: 675px) 100vw, 675px\" \/><\/a><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>W ostatniej kolumnie znajduje si\u0119 pomiar temperatury. Pierwsza warto\u015b\u0107 jest tak du\u017ca z tego wzgl\u0119du, \u017ce czujnik temperatury po inicjalizacji pierwszego pomiaru musi mie\u0107 pewien czas aby dokona\u0107 konwersji tej temperatury. Zostawi\u0142em ten odczyt bez op\u00f3\u017anienia, z tego wzgl\u0119du, \u017ceby mo\u017cna by\u0142o okre\u015bli\u0107 czy inicjalizacja przebieg\u0142a pomy\u015blnie.<\/p>\n\n\n\n<p>Wyniki odczytu napi\u0119cia i pr\u0105du s\u0105 podawane jako czyste warto\u015bci <em>ADC<\/em> (r\u00f3wnie\u017c w takiej formie s\u0105 zapisywane na karcie pami\u0119ci). Nie stosowa\u0142em konwersji warto\u015bci pomiarowych, aby zaoszcz\u0119dzi\u0107 na czasie podczas zapisu danych na kart\u0119 <em>SD<\/em>. Jedynie napi\u0119cie i pr\u0105d przedstawiane na wy\u015bwietlaczu s\u0105 na bie\u017c\u0105co przeliczane.<\/p>\n\n\n\n<p>Wykonane pomiary zapisywane s\u0105 r\u00f3wnie\u017c na karcie <em>SD<\/em>. Przed wykonywaniem pomiar\u00f3w mo\u017cliwa jest zmiana nazwy pliku do jakiego b\u0119d\u0105 zapisywane dane, znak oddzielaj\u0105cy kolumny, oraz ilo\u015b\u0107 pr\u00f3bek zapisanych w pliku. Maksymalna ilo\u015b\u0107 plik\u00f3w wynosi <strong>99<\/strong>. Po przerwaniu pomiar\u00f3w, a nast\u0119pnie rozpocz\u0119ciu nowej serii, nowe dane pomiarowe b\u0119d\u0105 zapisywane do kolejnego numeru pliku.<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-5 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Pliki-na-karcie-SD.png\"><img loading=\"lazy\" decoding=\"async\" width=\"630\" height=\"276\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Pliki-na-karcie-SD.png\" alt=\"\" data-id=\"478\" class=\"wp-image-478\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Pliki-na-karcie-SD.png 630w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Pliki-na-karcie-SD-300x131.png 300w\" sizes=\"(max-width: 630px) 100vw, 630px\" \/><\/a><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Przyk\u0142adowe-pomiary.png\"><img loading=\"lazy\" decoding=\"async\" width=\"707\" height=\"759\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Przyk\u0142adowe-pomiary.png\" alt=\"\" data-id=\"477\" class=\"wp-image-477\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Przyk\u0142adowe-pomiary.png 707w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/03\/Przyk\u0142adowe-pomiary-279x300.png 279w\" sizes=\"(max-width: 707px) 100vw, 707px\" \/><\/a><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>W plikach nie jest zapisywany czas pomiaru. Odst\u0119p pomi\u0119dzy pomiarami jest ustawiany wcze\u015bniej, wi\u0119c znane jest pr\u00f3bkowanie &#8211; pomin\u0105\u0142em ten parametr, aby nie traci\u0107 dodatkowe czasu podczas samego zapisu danych na kart\u0119 <em>SD<\/em>.<\/p>\n\n\n\n<p>W projekcie u\u017cy\u0142em bibliotek <em>FatFS<\/em> do obs\u0142ugi kart <em>SD<\/em>.<\/p>\n\n\n\n<p>Przed przyst\u0105pieniem do pisania programu okre\u015bli\u0142em kolejno\u015b\u0107 pisania kodu. Plan kodowania wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<ul><li>Obs\u0142uga <em>LCD<\/em><\/li><li>Menu i obs\u0142uga przycisk\u00f3w<\/li><li>Obs\u0142uga czujnika temperatury<\/li><li>Komunikacja poprzez <em>RS232<\/em><\/li><li>Obs\u0142uga karty <em>SD<\/em><\/li><li>Konfiguracja poprzez <em>UI<\/em><\/li><li>Konfiguracja poprzez komendy <em>AT<\/em><\/li><li>Obs\u0142uga <em>ADC<\/em><\/li><li><em>Bootloader<\/em><\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Tak si\u0119 przedstawia w ca\u0142o\u015bci wykonany uk\u0142ad:<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-5 is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Wnetrze_1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"2051\" height=\"2248\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Wnetrze_1.jpg\" alt=\"\" data-id=\"459\" class=\"wp-image-459\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Wnetrze_1.jpg 2051w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Wnetrze_1-274x300.jpg 274w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Wnetrze_1-956x1048.jpg 956w\" sizes=\"(max-width: 2051px) 100vw, 2051px\" \/><\/a><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Przod_2.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1820\" height=\"2074\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Przod_2.jpg\" alt=\"\" data-id=\"458\" class=\"wp-image-458\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Przod_2.jpg 1820w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Przod_2-263x300.jpg 263w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Przod_2-956x1089.jpg 956w\" sizes=\"(max-width: 1820px) 100vw, 1820px\" \/><\/a><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Gora_1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"2030\" height=\"964\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Gora_1.jpg\" alt=\"\" data-id=\"456\" class=\"wp-image-456\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Gora_1.jpg 2030w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Gora_1-300x142.jpg 300w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Gora_1-956x454.jpg 956w\" sizes=\"(max-width: 2030px) 100vw, 2030px\" \/><\/a><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Bok_1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"2233\" height=\"896\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Bok_1.jpg\" alt=\"\" data-id=\"455\" class=\"wp-image-455\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Bok_1.jpg 2233w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Bok_1-300x120.jpg 300w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Bok_1-956x384.jpg 956w\" sizes=\"(max-width: 2233px) 100vw, 2233px\" \/><\/a><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>Podczas wykonywania projektu przychodzi\u0142y mi nowe pomys\u0142y oraz rozwi\u0105zania, kt\u00f3re zastosuje w nast\u0119pnej wersji tego urz\u0105dzenia. Pomimo tych pomys\u0142\u00f3w i koncepcji kt\u00f3re mi przysz\u0142y do g\u0142owy, postanowi\u0142em doko\u0144czy\u0107 ten projekt g\u0142\u00f3wnie dlatego, aby przypomnie\u0107 sobie, oraz podszkoli\u0107 si\u0119 z programowania <em>AVR<\/em>, a tak\u017ce w celu poprawy umiej\u0119tno\u015bci w obr\u00f3bce obudowy (pomijam oczywi\u015bcie najwa\u017cniejszy pow\u00f3d &#8211; nie lubi\u0119 zostawia\u0107 niedoko\u0144czonych projekt\u00f3w).<\/p>\n\n\n\n<p>Zapraszam do oceniania i komentowania!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W ko\u0144cu uda\u0142o mi si\u0119 uko\u0144czy\u0107 projekt, kt\u00f3ry rozpocz\u0105\u0142em rok temu! Jest to rejestrator parametr\u00f3w &#8211; U,I,T. G\u0142\u00f3wnym celem wykonania urz\u0105dzenia, by\u0142a mo\u017cliwo\u015b\u0107 monitorowania zmian napi\u0119cia, pr\u0105du i temperatury w badanym uk\u0142adzie wraz z zapisem na kart\u0119 SD. Urz\u0105dzenie to&#8230;<br \/><a class=\"read-more-button\" href=\"https:\/\/daniel.slask.pl\/m\/rejestrator-parametrow-u-i-t\/\">Wi\u0119cej<\/a><\/p>\n","protected":false},"author":1,"featured_media":457,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5,6,24],"tags":[16,12,33,14,52,25,53,51,55,54,47,20],"views":1272,"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2016\/02\/Przod_1.jpg","jetpack_shortlink":"https:\/\/wp.me\/pcPgV3-6W","_links":{"self":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/430"}],"collection":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/comments?post=430"}],"version-history":[{"count":22,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/430\/revisions"}],"predecessor-version":[{"id":1645,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/430\/revisions\/1645"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media\/457"}],"wp:attachment":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media?parent=430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/categories?post=430"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/tags?post=430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}