{"id":3667,"date":"2025-05-20T08:49:47","date_gmt":"2025-05-20T08:49:47","guid":{"rendered":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=3667"},"modified":"2025-05-23T09:25:28","modified_gmt":"2025-05-23T09:25:28","slug":"sterowanie-serwem-za-pomoca-joysticka-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-3-3-2-2-2-2-2-2-2-2-3-2-3-3-2-3-2-2-2-2-2-2-3-2-2-2-2-2-2-2-2-3-2-2-2-2-2-2-2-2-2-2-2-2-2-3-2-2-2-2-3-3-2","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=3667","title":{"rendered":"\u015awiat\u0142olub: OCZY &#8211; dob\u00f3r rezystora do dzielnika napi\u0119cia &#8211; OCZYWISTY?"},"content":{"rendered":"\n<p>\u015awiat\u0142olub ma oczy&#8230; fotorezystory! Ale Arduino nie odczytuje rezystancji, tylko napi\u0119cia. Dlatego wykorzystujemy <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Dzielnik_napi%C4%99cia\" data-type=\"link\" data-id=\"https:\/\/pl.wikipedia.org\/wiki\/Dzielnik_napi%C4%99cia\" target=\"_blank\" rel=\"noreferrer noopener\">dzielnik napi\u0119cia<\/a> wed\u0142ug schematu:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"897\" height=\"589\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko00.png\" alt=\"\" class=\"wp-image-3674\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko00.png 897w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko00-300x197.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko00-768x504.png 768w\" sizes=\"auto, (max-width: 897px) 100vw, 897px\" \/><\/figure>\n\n\n\n<p>Analizujemy prosty dzielnik napi\u0119cia, wykorzystywany do odczytu warto\u015bci z czujnika za pomoc\u0105 Arduino. Napi\u0119cie odczytywane na pinie A0 b\u0119dzie dane wzorkiem V_A0 (kolor czarny na obrazku powy\u017cej). Celem jest znalezienie takiej warto\u015bci rezystora sta\u0142ego (R_fixed), kt\u00f3ra zapewni najlepsze rozr\u00f3\u017cnienie mi\u0119dzy warunkami jasnymi a ciemnymi, tak aby Arduino mog\u0142o <strong>najlepiej<\/strong> wykrywa\u0107 r\u00f3\u017cnic\u0119. Chcemy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zmierzy\u0107 opory R_foto w warunkach jasnych i ciemnych &#8211; miernik (multimetr)<\/li>\n\n\n\n<li>Obliczy\u0107 V_A0 dla r\u00f3\u017cnych warto\u015bci R_fixed w dw\u00f3ch przypadkach: jasno i ciemno<\/li>\n\n\n\n<li>Okre\u015bli\u0107 r\u00f3\u017cnic\u0119 napi\u0119\u0107 (\u0394V)<\/li>\n\n\n\n<li>Przeskalowa\u0107 t\u0119 r\u00f3\u017cnic\u0119 do zakresu analogRead() Arduino (0\u20131023)<\/li>\n\n\n\n<li>Narysowa\u0107 odpowiednie wykresy, aby okre\u015bli\u0107, kt\u00f3ra warto\u015b\u0107 rezystora dzia\u0142a najlepiej<\/li>\n<\/ul>\n\n\n\n<p>Mierzymy op\u00f3r czujnika w warunkach jasnych i ciemnych &#8211; nast\u0119pnie definiujemy sta\u0142e: napi\u0119cie wej\u015bciowe (5V)&nbsp;oraz op\u00f3r czujnika w warunkach jasnych i ciemnych warunkach.<\/p>\n\n\n\n<p><code>import matplotlib.pyplot as plt<br># Sta\u0142e<br>V_in = 5 # Napi\u0119cie wej\u015bciowe w woltach<br>R_sensor_light = 60 # Op\u00f3r czujnika w jasno\u015bci (kiloomy)<br>R_sensor_dark = 180 # Op\u00f3r czujnika w ciemno\u015bci (kiloomy)<\/code><\/p>\n\n\n\n<p>Przygotowujemy tablice (czyli listy w j\u0119zyku Python) do przechowywania wynik\u00f3w dla ka\u017cdej testowanej warto\u015bci rezystora.<\/p>\n\n\n\n<p><code># Listy do przechowywania wynik\u00f3w<br>R_fixed_values = list(range(1, 1000))<br>V_out_light_values = []<br>V_out_dark_values = []<br>delta_V_values = []<\/code><\/p>\n\n\n\n<p>Przechodzimy p\u0119tl\u0105 przez warto\u015bci R_fixed (od 1 do 999 kiloomy) i obliczamy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Napi\u0119cie wyj\u015bciowe, gdy czujnik jest w jasno\u015bci (V_out_light)<\/li>\n\n\n\n<li>Napi\u0119cie wyj\u015bciowe, gdy czujnik jest w ciemno\u015bci (V_out_dark)<\/li>\n\n\n\n<li>R\u00f3\u017cnic\u0119 napi\u0119\u0107 mi\u0119dzy tymi dwoma warto\u015bciami (delta_V)<\/li>\n<\/ul>\n\n\n\n<p><code>for R_fixed in R_fixed_values:<br>      V_out_light = V_in * (R_sensor_light \/ (R_sensor_light + R_fixed))<br>      V_out_dark = V_in * (R_sensor_dark \/ (R_sensor_dark + R_fixed))<br>      delta_V = V_out_dark - V_out_light<br>      V_out_light_values.append(V_out_light)<br>      V_out_dark_values.append(V_out_dark)<br>      delta_V_values.append(delta_V)<\/code><\/p>\n\n\n\n<p>Znajdujemy tak\u0105 warto\u015b\u0107 R_fixed, kt\u00f3ra daje najwi\u0119ksz\u0105 r\u00f3\u017cnic\u0119 napi\u0119\u0107 (\u0394V). Oznacza to, \u017ce czujnik b\u0119dzie w tym punkcie najbardziej \u201eczu\u0142y\u201d.<\/p>\n\n\n\n<p># Szukanie optymalej warto\u015bci R_fixed (maksymalna delta_V)<br>max_delta = max(delta_V_values)<br>max_delta_index = delta_V_values.index(max_delta)<br><code>optimal_R = R_fixed_values[max_delta_index]<\/code><\/p>\n\n\n\n<p>Rysujemy napi\u0119cie wyj\u015bciowe dla warunk\u00f3w jasnych i ciemnych oraz &#8222;cieniujemy&#8221; obszar mi\u0119dzy dwiema funkcjami napi\u0119cia. To pokazuje w kt\u00f3rym miejscu i jak bardzo zmienia si\u0119 sygna\u0142 z czujnika.<\/p>\n\n\n\n<p><code># Wykres 1: V_out dla jasno\u015bci i ciemno\u015bci<br>plt.figure(figsize=(10, 5))<br>plt.plot(R_fixed_values, V_out_light_values, '--b', label='V_out (Jasno\u015b\u0107)')<br>plt.plot(R_fixed_values, V_out_dark_values, '--r', label='V_out (Ciemno\u015b\u0107)')<\/code><\/p>\n\n\n\n<p><code><br># Wype\u0142nienie obszaru mi\u0119dzy dwiema krzywymi<br>where_condition = [dark &gt; light for dark, light in zip(V_out_dark_values, _out_light_values)]<br>plt.fill_between(R_fixed_values, V_out_light_values, V_out_dark_values,where=where_condition,color='gray', alpha=0.3, label='Obszar \u0394V')<br>plt.title('Napi\u0119cie wyj\u015bciowe dzielnika w warunkach jasnych i ciemnych')<br>plt.xlabel('R_fixed (kiloomy)')<br>plt.ylabel('V_out (V)')<br>plt.legend()<br>plt.grid(True)<br>plt.tight_layout()<br>plt.show()<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1013\" height=\"483\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko1.png\" alt=\"\" class=\"wp-image-3669\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko1.png 1013w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko1-300x143.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko1-768x366.png 768w\" sizes=\"auto, (max-width: 1013px) 100vw, 1013px\" \/><\/figure>\n\n\n\n<p>Rysujemy r\u00f3\u017cnic\u0119 napi\u0119\u0107 (\u0394V) i zaznaczamy rezystor, kt\u00f3ry daje najwi\u0119ksze rozdzielenie sygna\u0142u<\/p>\n\n\n\n<p><code># Wykres 2: \u0394V z zaznaczon\u0105 optymaln\u0105 warto\u015bci\u0105 R_fixed<br>plt.figure(figsize=(10, 5))<br>plt.plot(R_fixed_values, delta_V_values, color='red', label='\u0394V (Jasno\u015b\u0107 - Ciemno\u015b\u0107)')<br>plt.axvline(optimal_R, color='gray', linestyle=':', label=f'Optymalne R_fixed = {optimal_R} k\u03a9')<br>plt.scatter([optimal_R], [max_delta], color='black', zorder=5)plt.text(optimal_R + 10, max_delta, f'Max \u0394V \u2248 {max_delta:.2f} V\\nprzy R = {optimal_R} k\u03a9', fontsize=9)<br>plt.title('R\u00f3\u017cnica napi\u0119\u0107 (\u0394V) w zale\u017cno\u015bci od R_fixed')<br>plt.xlabel('R_fixed (kiloomy)')<br>plt.ylabel('\u0394V (V)')<br>plt.legend()<br>plt.grid(True)<br>plt.tight_layout()<br>plt.show()<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1014\" height=\"484\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko2.png\" alt=\"\" class=\"wp-image-3670\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko2.png 1014w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko2-300x143.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko2-768x367.png 768w\" sizes=\"auto, (max-width: 1014px) 100vw, 1014px\" \/><\/figure>\n\n\n\n<p>Mapujemy r\u00f3\u017cnic\u0119 napi\u0119\u0107 \u0394V do skali analogRead() Arduino (0\u20131023)<\/p>\n\n\n\n<p><code># Szukanie najlepszej warto\u015bci R_fixed pod wzgl\u0119dem r\u00f3\u017cnicy odczytu ADC<br>delta_ADC_values = [(v \/ V_in) * 1023 for v in delta_V_values]<br>max_delta_ADC = max(delta_ADC_values)<br>max_adc_index = delta_ADC_values.index(max_delta_ADC)<br>optimal_R_adc = R_fixed_values[max_adc_index]<\/code><\/p>\n\n\n\n<p>Rysujemy \u0394V przeskalowan\u0105 do zakresu analogRead oraz zaznaczamy rezystor daj\u0105cy najwi\u0119ksz\u0105 r\u00f3\u017cnic\u0119 odczytu cyfrowego<\/p>\n\n\n\n<p><code># Wykres \u0394ADC<br>plt.figure(figsize=(10, 5))<br>plt.plot(R_fixed_values, delta_ADC_values, color='purple', label='\u0394ADC (przeskalowane z \u0394V)')<br>plt.axvline(optimal_R_adc, color='gray', linestyle=':', label=f'Optymalne R_fixed = {optimal_R_adc} k\u03a9')<br>plt.scatter([optimal_R_adc], [max_delta_ADC], color='black', zorder=5)<br>plt.text(optimal_R_adc + 10, max_delta_ADC, f'Maks. \u0394ADC \u2248 {max_delta_ADC:.0f}\\nprzy R = {optimal_R_adc} k\u03a9', fontsize=9)<br>plt.title('R\u00f3\u017cnica odczytu analogRead (\u0394ADC) w zale\u017cno\u015bci od R_fixed')<br>plt.xlabel('R_fixed (kiloomy)')<br>plt.ylabel('\u0394ADC (0\u20131023)')<br>plt.legend()<br>plt.grid(True)<br>plt.tight_layout()<br>plt.show()<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"498\" src=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko3-1024x498.png\" alt=\"\" class=\"wp-image-3671\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko3-1024x498.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko3-300x146.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko3-768x373.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2025\/05\/oko3.png 1035w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Wy\u015bwietlamy optymaln\u0105 warto\u015b\u0107 rezystora dla skali Arduino, gdzie r\u00f3\u017cnica odczyt\u00f3w analogRead() jest najwi\u0119ksza.<\/p>\n\n\n\n<p><code>print(f\"Optymalne R_fixed = {optimal_R_adc} k\u03a9, przy kt\u00f3rym maks. \u0394ADC \u2248 {max_delta_ADC:.0f}\")<\/code><br>Optymalne R_fixed = 104 k\u03a9, przy kt\u00f3rym maks. \u0394ADC \u2248 274<\/p>\n\n\n\n<p class=\"has-text-align-right\">(c) Przemys\u0142aw Baj, K.G. 2025<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u015awiat\u0142olub ma oczy&#8230; fotorezystory! Ale Arduino nie odczytuje rezystancji, tylko napi\u0119cia. Dlatego wykorzystujemy dzielnik napi\u0119cia wed\u0142ug schematu: Analizujemy prosty dzielnik napi\u0119cia, wykorzystywany do odczytu warto\u015bci z czujnika za pomoc\u0105 Arduino. Napi\u0119cie odczytywane na pinie A0 b\u0119dzie dane wzorkiem V_A0 (kolor czarny na obrazku powy\u017cej). Celem jest znalezienie takiej warto\u015bci rezystora sta\u0142ego (R_fixed), kt\u00f3ra zapewni najlepsze [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":3672,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52],"tags":[67,75,74,476],"class_list":{"0":"post-3667","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-fibot","8":"tag-analogread","9":"tag-dzielnik-napiec","10":"tag-fotorezystor","11":"tag-swiatlolub","13":"post-with-thumbnail","14":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/3667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3667"}],"version-history":[{"count":5,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/3667\/revisions"}],"predecessor-version":[{"id":3680,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/3667\/revisions\/3680"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/3672"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}