{"id":77338,"date":"2024-03-20T14:00:50","date_gmt":"2024-03-20T13:00:50","guid":{"rendered":"https:\/\/botland.com.pl\/blog\/?p=77338"},"modified":"2026-04-08T11:00:05","modified_gmt":"2026-04-08T09:00:05","slug":"kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje","status":"publish","type":"post","link":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/","title":{"rendered":"Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\"> 13<\/span> <span class=\"rt-label rt-postfix\">min.<\/span><\/span>\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"77338\" class=\"elementor elementor-77338\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-bc122e1 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"bc122e1\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4568949\" data-id=\"4568949\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-99a698f elementor-widget elementor-widget-text-editor\" data-id=\"99a698f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">W poprzednim artykule poznali\u015bmy kilka funkcjonalno\u015bci zwi\u0105zanych z mikrokontrolerem RP2040. Sterowali\u015bmy diod\u0105 LED za pomoc\u0105 modulowanego sygna\u0142u PWM, odczytali\u015bmy sygna\u0142 analogowy z fotorezystora oraz nawi\u0105zali\u015bmy komunikacj\u0119 z komputerem. W tym artykule skorzystamy z poznanych ju\u017c wcze\u015bniej funkcji i z ich pomoc\u0105 stworzymy nieco bardziej rozbudowany program, tak aby p\u00f3\u017aniej m\u00f3c go upro\u015bci\u0107. Zachowuj\u0105c jednocze\u015bnie jego funkcjonalno\u015b\u0107.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ef0689 elementor-widget elementor-widget-image\" data-id=\"0ef0689\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"4Gotowy Zestaw do nauki programowania z Raspberry Pi Pico W\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc2MTU2IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMVwvNEdvdG93eS1aZXN0YXctZG8tbmF1a2ktcHJvZ3JhbW93YW5pYS16LVJhc3BiZXJyeS1QaS1QaWNvLVcuanBnIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"109\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-1024x139.jpg\" class=\"attachment-large size-large wp-image-76156\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-1024x139.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-300x41.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-768x104.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W.jpg 1429w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-51aff18 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"51aff18\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-f25bfd9\" data-id=\"f25bfd9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-65e81f7 elementor-widget elementor-widget-image\" data-id=\"65e81f7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"24136_3\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc2MTYwIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMVwvMjQxMzZfMy5qcGcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"300\" height=\"273\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3-300x273.jpg\" class=\"attachment-medium size-medium wp-image-76160\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3-300x273.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3-1024x933.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3-768x700.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/24136_3.jpg 1080w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-2e02cc0\" data-id=\"2e02cc0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d09d11c elementor-widget elementor-widget-text-editor\" data-id=\"d09d11c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"font-weight: bolder\">Kup zestaw do\u00a0nauki programowania z\u00a0Raspberry Pi\u00a0Pico W\u00a0i\u00a0skorzystaj z\u00a0kursu dost\u0119pnego na\u00a0Blog Botland!<\/span><\/p><p>W\u00a0zestawie: modu\u0142 Raspberry Pi\u00a0Pico W, p\u0142ytka stykowa, przewody, diody LED, rezystory, przyciski, fotorezystory, cyfrowe czujniki \u015bwiat\u0142a, temperatury, wilgotno\u015bci i\u00a0ci\u015bnienia, wy\u015bwietlacz OLED i\u00a0przew\u00f3d USB-microUSB.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4d81675 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"4d81675\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/botland.com.pl\/moduly-i-zestawy-do-raspberry-pi-pico\/24136-zestaw-do-nauki-programowania-z-raspberry-pi-pico-w.html\" target=\"_blank\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">SPRAWD\u0179 W BOTLAND<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-260c252 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"260c252\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-419ecb1 elementor-widget elementor-widget-text-editor\" data-id=\"419ecb1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"font-weight: bolder;\">Spis tre\u015bci:<\/span><\/p>\n<ol style=\"background-color: #ffffff;\">\n<li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-1-zaczynamy\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico &#8211; #1<\/span>&nbsp;&#8211; zaczynamy&nbsp;<\/a><\/li>\n<li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-2-slow-kilka-o-programowaniu\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico &#8211; #2<\/span>&nbsp;&#8211; s\u0142\u00f3w kilka o programowaniu<\/a><\/li>\n<li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-3-pierwszy-program\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico &#8211; #3<\/span>&nbsp;&#8211; pierwszy program<\/a><\/li>\n<li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-4-zaczynamy-programowac\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico &#8211; #4<\/span>&nbsp;&#8211; zaczynamy programowa\u0107<\/a><\/li>\n<li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-5-petle-zmienne-i-instrukcje-warunkowe\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico &#8211; #5<\/span>&nbsp;&#8211; p\u0119tle, zmienne i instrukcje warunkowe&nbsp;<\/a><\/li>\n<li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/raspberry-pi-pico-6-pwm-adc-i-komunikacja-z-komputerem\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico \u2013 #6<\/span>&nbsp;\u2013 PWM, ADC i komunikacja z komputerem<\/a><\/li>\n<li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico \u2013 #7 <\/span>&nbsp;\u2013 Poprawki w kodzie i w\u0142asne funkcje&nbsp;<\/a><\/li>\n<li style=\"font-size: 16px;\"><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-8-przerwania-i-alarmy\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>Raspberry Pi Pico \u2013 #8 <\/strong>\u2013 Przerwania i alarmy<\/a><\/li>\n<li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico \u2013 #9<\/span>&nbsp;\u2013 Teoria wska\u017anik\u00f3w i timery<\/a><\/li>\n<li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-10-tablice-struktury-i-maszyna-stanow\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>Raspberry Pi Pico \u2013 #10<\/strong>&nbsp;\u2013 Tablice, struktury i maszyna stan\u00f3w<\/a><\/li>\n<li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico \u2013 #11<\/span>&nbsp;&#8211; Uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C<\/a><\/li>\n<li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>Raspberry Pi Pico \u2013 #12 \u2013<\/strong> Przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\/2<\/a><\/li><li><a href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>Raspberry Pi Pico \u2013 #13<\/strong> \u2013 Biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA<\/a><\/li>\n<\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6135474 elementor-widget elementor-widget-heading\" data-id=\"6135474\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Przed wyruszeniem w drog\u0119 nale\u017cy zebra\u0107 dru\u017cyn\u0119<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5d425e6 elementor-widget elementor-widget-image\" data-id=\"5d425e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-scaled.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"IMG_0647\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc0Nzk3IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMVwvSU1HXzA2NDctc2NhbGVkLmpwZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576.jpg\" class=\"attachment-large size-large wp-image-74797\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-300x169.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-768x432.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1536x864.jpg 1536w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-2048x1152.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Zestaw element\u00f3w do kursu Raspberry Pi Pico.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-47e46d3 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"47e46d3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/botland.com.pl\/moduly-i-zestawy-do-raspberry-pi-pico\/24136-zestaw-do-nauki-programowania-z-raspberry-pi-pico-w.html\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">SPRAWD\u0179<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-21f9653 elementor-widget elementor-widget-text-editor\" data-id=\"21f9653\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Chc\u0105c uczy\u0107 si\u0119 programowania, bazuj\u0105c na rzeczywistych projektach, potrzebny b\u0119dzie oczywi\u015bcie odpowiedni sprz\u0119t, ale bez obaw &#8211; nie musisz teraz skaka\u0107 mi\u0119dzy kolejnymi artyku\u0142ami i przygotowywa\u0107 list\u0119 niezb\u0119dnych elektronicznych element\u00f3w. W sklepie\u00a0<a style=\"background-color: #ffffff\" href=\"https:\/\/botland.com.pl\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder\">Botland<\/span><\/a>\u00a0dost\u0119pny jest\u00a0<a style=\"background-color: #ffffff\" href=\"https:\/\/botland.com.pl\/moduly-i-zestawy-do-raspberry-pi-pico\/24136-zestaw-do-nauki-programowania-z-raspberry-pi-pico-w.html\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder\">gotowy zestaw<\/span><\/a>, zawieraj\u0105cy wszystkie komponenty niezb\u0119dne do wykonania projekt\u00f3w opisanych w serii poradnik\u00f3w o Raspberry Pi Pico.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-abd3aaa elementor-widget elementor-widget-text-editor\" data-id=\"abd3aaa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>W\u00a0<a href=\"https:\/\/botland.com.pl\/moduly-i-zestawy-do-raspberry-pi-pico\/24136-zestaw-do-nauki-programowania-z-raspberry-pi-pico-w.html\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder\">gotowym zestawie<\/span><\/a>\u00a0element\u00f3w znajdziecie:<\/p><ul style=\"font-size: 16px;background-color: #ffffff\"><li style=\"font-size: 16px\">Raspberry Pi Pico W,<\/li><li style=\"font-size: 16px\">Przew\u00f3d microUSB,<\/li><li style=\"font-size: 16px\">P\u0142ytk\u0119 stykow\u0105,<\/li><li style=\"font-size: 16px\">Zestaw przewod\u00f3w po\u0142\u0105czeniowych w trzech rodzajach,<\/li><li style=\"font-size: 16px\">Zestaw diod LED w trzech kolorach,<\/li><li style=\"font-size: 16px\">Zestaw najczciej stosowanych w elektronice rezystor\u00f3w,<\/li><li style=\"font-size: 16px\">Przyciski Tact Switch,<\/li><li style=\"font-size: 16px\">Fotorezystory,<\/li><li style=\"font-size: 16px\">Cyfrowy czujnik \u015bwiat\u0142a,<\/li><li style=\"font-size: 16px\">Cyfrowy czujnik wilgotno\u015bci, temperatury i ci\u015bnienia,<\/li><li style=\"font-size: 16px\">Wy\u015bwietlacz OLED.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ded6e86 elementor-widget elementor-widget-spacer\" data-id=\"ded6e86\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a443f75 elementor-widget elementor-widget-heading\" data-id=\"a443f75\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Przygotowanie projektu<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-29db5d4 elementor-widget elementor-widget-image\" data-id=\"29db5d4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/obwod-scaled.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"obwod\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc3MzQwIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wM1wvb2J3b2Qtc2NhbGVkLmpwZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/obwod-1024x576.jpg\" class=\"attachment-large size-large wp-image-77340\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/obwod-1024x576.jpg 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/obwod-300x169.jpg 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/obwod-768x432.jpg 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/obwod-1536x864.jpg 1536w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/obwod-2048x1152.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Obw\u00f3d, znany z poprzednich projekt\u00f3w.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c8e62e2 elementor-widget elementor-widget-text-editor\" data-id=\"c8e62e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">W dzisiejszym projekcie ponownie skorzystamy z obwodu przygotowanego we wcze\u015bniejszych poradnikach. Tym razem skorzystamy te\u017c ze wszystkich jego element\u00f3w, czyli diod LED, przycisku oraz fotorezystora. Zadaniem programu, kt\u00f3ry napiszemy w dalszej cz\u0119\u015bci, b\u0119dzie sterowanie \u015bwiec\u0105cymi elementami, zale\u017cnie od nat\u0119\u017cenia \u015bwiat\u0142a. Je\u015bli jego warto\u015b\u0107 znajdzie si\u0119 w jednym z trzech zakres\u00f3w, kt\u00f3re stworzymy, uruchomiona zostanie konkretna dioda \u015bwiec\u0105ca. Poza tym skorzystamy te\u017c z przycisku, po kt\u00f3rego wci\u015bni\u0119ciu mikrokontroler odczyta warto\u015b\u0107 z czujnika temperatury umieszczonego wewn\u0105trz rdzenia procesora. Warto\u015b\u0107 t\u0105 przeliczymy na stopnie Celsjusza i prze\u015blemy przez USB, tak aby m\u00f3c odczyta\u0107 j\u0105 z ekranu komputera.<\/p><p style=\"font-weight: 400\">W tym artykule korzysta\u0107 b\u0119dziemy z projektu nazwanego functions_test. Przy jego przygotowaniu nale\u017cy pami\u0119ta\u0107 o aktywowaniu strumienia wyj\u015bciowego USB w pliku CMakeLists.txt.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8391329 elementor-widget elementor-widget-heading\" data-id=\"8391329\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Brzydki, ale dzia\u0142aj\u0105cy kod<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-530f310 elementor-widget elementor-widget-text-editor\" data-id=\"530f310\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>#include &lt;stdio.h&gt;<br \/>#include \"pico\/stdlib.h\"<br \/>#include \"hardware\/adc.h\"<br \/><br \/>#define RED_LED 2<br \/>#define YELLOW_LED 1<br \/>#define GREEN_LED 0<br \/>#define BUTTON 16<br \/><br \/>int main() {<br \/>    stdio_init_all();<br \/><br \/>    gpio_init(RED_LED);<br \/>    gpio_init(YELLOW_LED);<br \/>    gpio_init(GREEN_LED);<br \/>    gpio_init(BUTTON);<br \/><br \/>    gpio_set_dir(RED_LED, GPIO_OUT);<br \/>    gpio_set_dir(YELLOW_LED, GPIO_OUT);<br \/>    gpio_set_dir(GREEN_LED, GPIO_OUT);<br \/>    gpio_set_dir(BUTTON, GPIO_IN);<br \/><br \/>    gpio_pull_up(BUTTON);<br \/><br \/>    adc_init();<br \/>    adc_set_temp_sensor_enabled(true);<br \/>    adc_gpio_init(26);<br \/><br \/>    while(true) {<br \/><br \/>    adc_select_input(0);<br \/>    uint16_t photores_read = adc_read();<br \/>    float voltage_photores = photores_read * (3.3\/4095);<br \/>    printf(\"Photoresistor ADC: value = %d, voltage = %f V\\n\", photores_read, voltage_photores);<br \/><br \/>    if(photores_read &lt;= 2500){<br \/>        gpio_put(GREEN_LED, 1);<br \/>        gpio_put(YELLOW_LED, 0);<br \/>        gpio_put(RED_LED, 0);<br \/>    }<br \/>    else if(photores_read &gt; 2500 &amp;&amp; photores_read &lt;= 3500){<br \/>        gpio_put(GREEN_LED, 0);<br \/>        gpio_put(YELLOW_LED, 1);<br \/>        gpio_put(RED_LED, 0);<br \/>    }<br \/>    else if(photores_read &gt; 3500){<br \/>        gpio_put(GREEN_LED, 0);<br \/>        gpio_put(YELLOW_LED, 0);<br \/>        gpio_put(RED_LED, 1);<br \/>    }<br \/>    else<br \/>    {<br \/>    printf(\"Photoresistor error\");<br \/>    }<br \/><br \/><br \/>    bool button_state = gpio_get(BUTTON);<br \/><br \/>     if(button_state == false){ <br \/>        adc_select_input(4);<br \/>        uint16_t adc_temp = adc_read();<br \/>        float conversion_factor = 3.3 \/ (1&lt;&lt;12);<br \/>        float result = adc_temp * conversion_factor;<br \/>        float temp = 27 - (result -0.706)\/0.001721;<br \/>        printf(\"Temp = %f C\\n\", temp);<br \/><br \/>    }<br \/>    sleep_ms(500);<br \/>    }<br \/>}<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9b0b108 elementor-widget elementor-widget-text-editor\" data-id=\"9b0b108\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Na pierwszy ogie\u0144 przyjrzyjmy si\u0119 programowi, kt\u00f3ry dzia\u0142a, ale jak pewnie si\u0119 domy\u015blacie, w dalszej cz\u0119\u015bci artyku\u0142u b\u0119dziemy go poprawia\u0107. Kod z\u0142o\u017cony jest we wi\u0119kszo\u015bci ze znanych ju\u017c polece\u0144, cho\u0107 kilku z nich przyjrzymy si\u0119 ponownie. Poza tym warto jest przeanalizowa\u0107 program jako ca\u0142o\u015b\u0107, tak aby lepiej zrozumie\u0107 jego struktur\u0119 i p\u00f3\u017aniejsze kroki, kt\u00f3re wykonamy, aby go poprawi\u0107.<\/p><p style=\"font-weight: 400\">G\u0142\u00f3wna funkcja main zosta\u0142a jak zwykle poprzedzona bibliotekami oraz definicjami. W programie korzystamy z przetwornika analogowo-cyfrowego, tak wi\u0119c musimy uzupe\u0142ni\u0107 kod o hardware\/adc.h. Poza tym, aby nie musie\u0107 korzysta\u0107 z cyfrowych oznacze\u0144 poszczeg\u00f3lnych wyprowadze\u0144 przypisane do nich zosta\u0142y bardziej intuicyjne okre\u015blenia.<\/p><p style=\"font-weight: 400\">Pocz\u0105tek g\u0142\u00f3wnej cz\u0119\u015bci programu r\u00f3wnie\u017c mo\u017ce wygl\u0105da\u0107 znajomo. Znalaz\u0142y si\u0119 tutaj funkcje inicjalizuj\u0105ce piny mikrokontrolera, do kt\u00f3rych pod\u0142\u0105czone s\u0105 diody LED oraz przycisk. Dodatkowo uruchomiony zostaje przetwornik ADC wraz z przypisanym do niego wyprowadzeniem 26, do kt\u00f3rego pod\u0142\u0105czony jest fotorezystor. Nowo\u015bci\u0105 w tej cz\u0119\u015bci kodu jest funkcja adc_set_temp_sensor_enabled(true);, dzi\u0119ki niej aktywowany zostaje umieszczony we wn\u0119trzu procesora sensor temperatury. Warto zwr\u00f3ci\u0107 te\u017c uwag\u0119, \u017ce jak dot\u0105d nie pojawi\u0142o si\u0119 jeszcze polecenie adc_select_input(), definiuj\u0105ce, kt\u00f3ry z sygna\u0142\u00f3w przekazany zostanie do przetwornika analogowo-cyfrowego. Jest to \u015bwiadoma decyzja, poniewa\u017c jak ju\u017c wiecie RP2040 wyposa\u017cony jest tylko w jeden modu\u0142 ADC, do kt\u00f3rego pod\u0142\u0105czonych jest kilka wej\u015b\u0107. W typ projekcie korzysta\u0107 b\u0119dziemy z dw\u00f3ch, dla fotorezystora i czujnika temperatury, dlatego w dalszej cz\u0119\u015bci kodu b\u0119dziemy si\u0119 mi\u0119dzy nimi prze\u0142\u0105cza\u0107.<\/p><p style=\"font-weight: 400\">Na pocz\u0105tku niesko\u0144czonej p\u0119tli while pojawi\u0142\u00a0si\u0119 kod, kt\u00f3ry wykorzystywali\u015bmy ju\u017c w poprzednim projekcie. Odczytujemy tutaj warto\u015b\u0107 generowan\u0105 przez fotorezystor, aby przekszta\u0142ci\u0107 j\u0105 p\u00f3\u017aniej na napi\u0119cie i dzi\u0119ki funkcji printf wys\u0142a\u0107 na ekran komputera. Zauwa\u017ccie, \u017ce w\u0142a\u015bnie tutaj wybieramy te\u017c wej\u015bcie, z kt\u00f3rego sygna\u0142 przekazany zostanie do przetwornika ADC. Wyprowadzeniu o numerze 26 odpowiada zero, tak wi\u0119c w\u0142a\u015bnie t\u0105 cyfr\u0119 nale\u017cy umie\u015bci\u0107 wewn\u0105trz funkcji.<\/p><p style=\"font-weight: 400\">W kolejnej cz\u0119\u015bci kodu znalaz\u0142 si\u0119 kaskadowy warunek zale\u017cny od warto\u015bci photores_read, czyli zmiennej, w kt\u00f3rej zapisana jest liczba odpowiadaj\u0105ca sygna\u0142owi z fotorezystora. Jak ju\u017c wiecie, w 12 bitowym przetworniku odczytane dane mog\u0105 przyj\u0105\u0107 warto\u015b\u0107 z zakresu od 0 do 4095. Zakres ten postanowi\u0142em podzieli\u0107 na trzy cz\u0119\u015bci: od 0 do 2500, od 2501 do 3500 oraz od 3501 do 4095. Je\u015bli warto\u015b\u0107 photores_read znajdzie si\u0119 w pierwszym z nich, uruchomiana zostanie zielona dioda LED, przy drugim zakresie b\u0119dzie to \u017c\u00f3\u0142ty element \u015bwiec\u0105cy, a przy ostatnim czerwony. Poza tym w warunku umieszczone zosta\u0142o zabezpieczenie na wypadek, gdyby zmienna przyj\u0119\u0142a jak\u0105\u015b \u201einn\u0105\u201d warto\u015b\u0107. W\u00f3wczas na ekranie komputera pojawi si\u0119 komunikat Photoresistor error.<\/p><p style=\"font-weight: 400\">Om\u00f3wi\u0107 musimy te\u017c sam\u0105 konstrukcj\u0119 warunk\u00f3w. Do tej pory przyr\u00f3wnywali\u015bmy zmienn\u0105 do konkretnych warto\u015bci, dzi\u0119ki dw\u00f3m znakom r\u00f3wno\u015bci \u201e==\u201d. W tym przypadku jednak musimy por\u00f3wna\u0107 j\u0105 z wcze\u015bniej opisanymi zakresami. Innymi s\u0142owy, musimy sprawdzi\u0107, czy zmienna b\u0119dzie wi\u0119ksza lub mniejsza od konkretnej liczby. Podobnie jak w matematyce pos\u0142u\u017cy\u0107 mo\u017cemy si\u0119 tutaj znakami mniejszo\u015bci \u201e&lt;\u201d, wi\u0119kszo\u015bci \u201e&gt;\u201d, mniejszy r\u00f3wny \u201e&lt;=\u201d oraz wi\u0119kszy r\u00f3wny \u201e&gt;=\u201d. W pierwszym ifie sprawdzimy pierwszy zakres, tak wi\u0119c por\u00f3wnujemy czy photores_read jest mniejszy b\u0105d\u017a r\u00f3wny 2500. Trzeba jednak pami\u0119ta\u0107, \u017ce taki zapis nie jest idealny, poniewa\u017c warunek spe\u0142ni si\u0119 r\u00f3wnie\u017c przy okazji liczb ujemnych, kt\u00f3rych zakres nie obejmuje, ale tym zajmiemy si\u0119 p\u00f3\u017aniej. Bli\u017aniacz\u0105 sytuacj\u0119 mo\u017cemy zauwa\u017cy\u0107 przy okazji trzeciego warunku, gdy sprawdzany jest ostatni zakres. Je\u015bli warto\u015b\u0107 z fotorezystora b\u0119dzie wi\u0119ksza ni\u017c 3501, aktywowana zostanie czerwona dioda LED. Zauwa\u017ccie te\u017c, \u017ce sam warunek mo\u017cna zapisa\u0107 na dwa sposoby photores_read &gt; 3500 lub photores_read &gt;= 3501, s\u0105 one r\u00f3wnoznaczne i aktywowane zostan\u0105, gdy warto\u015b\u0107 zmiennej przyjmie co najmniej 3501. W drugim warunku, gdzie sprawdzamy \u015brodkowy zakres warto\u015b\u0107 dzieje si\u0119 zdecydowanie najwi\u0119cej. W tym przypadku opisa\u0107 trzeba konkretny zakres warto\u015bci i nie mo\u017cna przyjmowa\u0107 na wiar\u0119 wszystkich liczb poni\u017cej lub powy\u017cej jakiej\u015b warto\u015bci. Aby \u017c\u00f3\u0142ta dioda LED uruchamiana by\u0142a tylko, gdy warto\u015b\u0107 photores_read znajdzie si\u0119 w zakresie od 2501 do 3500, stworzy\u0107 musimy niejako dwa warunki, po\u0142\u0105czone tajemniczym \u201e&amp;&amp;\u201d. Pierwszy z nich sprawdza, czy zmienna jest wi\u0119ksza od 2500 &#8211;\u00a0 photores_read &gt; 2500, druga natomiast czy liczba nie przekroczy\u0142a 3500 &#8211; photores_read &lt;= 3500. Konstrukcja \u201e&amp;&amp;\u201d umieszczona mi\u0119dzy dwoma por\u00f3wnaniami jest operatorem logicznym AND. Operatory logiczne kojarzy\u0107 mo\u017cecie z matematyki lub bramek logicznych. W j\u0119zyku C poza AND dost\u0119pny jest te\u017c OR zapisywany jako \u201e||\u201d. Dzi\u0119ki takiemu zapisowi funkcja warunkowa zostanie spe\u0142niona tylko, gdy oba por\u00f3wnania b\u0119d\u0105 prawdziwe, innymi s\u0142owy warto\u015b\u0107 photores_read b\u0119dzie mie\u015bci\u0107 si\u0119 w opisanym zakresie. W przypadku, gdy przypisana do zmiennej liczba b\u0119dzie poza zakresem, spe\u0142niony zostanie tylko jeden z warunk\u00f3w, przez co if jako ca\u0142o\u015b\u0107 nie b\u0119dzie m\u00f3g\u0142 by\u0107 spe\u0142niony. Tak wi\u0119c mo\u017cna powiedzie\u0107, \u017ce dzi\u0119ki operatorowi AND funkcja warunkowa zostanie wykonana tylko, gdy wszystkie warunki zostan\u0105 spe\u0142nione. Logiczny OR dzia\u0142a nieco inaczej, gdyby\u015bmy umie\u015bcili go wewn\u0105trz funkcji, dioda \u015bwieci\u0142aby zawsze, poniewa\u017c w takim przypadku wystarczy, \u017ce jeden z warunk\u00f3w zostanie spe\u0142niony i funkcja warunkowa zostanie wykonana.<\/p><p style=\"font-weight: 400\">W drugiej cz\u0119\u015bci programu znalaz\u0142 si\u0119 kod obs\u0142uguj\u0105cy przycisk oraz odczyt temperatury. Pocz\u0105tkowo tworzymy zmienn\u0105 button_state, do kt\u00f3rej zapisany zostanie logiczny stan przycisku. Je\u015bli ten zostanie wci\u015bni\u0119ty, uruchomi si\u0119 kod umieszczony wewn\u0105trz funkcji warunkowej. W pierwszym etapie zmieniamy sygna\u0142 przekazywany do przetwornika ADC. Wcze\u015bniej wybrany by\u0142 fotorezystor, tym razem chcemy odczyta\u0107 warto\u015b\u0107 sensora temperatury, kt\u00f3ry przypisany jest do cyfry cztery. Nast\u0119pnie tworzymy zmienn\u0105 adc_temp, do kt\u00f3rej przypisana zostaje odczytana warto\u015b\u0107. Jednak, aby z czystej warto\u015bci ADC uzyska\u0107 temperatur\u0119 Celsjusza, musimy j\u0105 odpowiednio przekszta\u0142ci\u0107. Do tego celu potrzebna b\u0119dzie nam zmiennoprzecinkowa conversion_factor, w kt\u00f3rej zapisany zostanie wynik dzia\u0142ania 3.3\/(1&lt;&lt;12)-1. Ten do\u015b\u0107 tajemniczy zapis jest niczym innym, jak dzia\u0142aniem 3.3\/4095, z kt\u00f3rego korzystali\u015bmy ju\u017c wcze\u015bniej przy fotorezystorze. (1&lt;&lt;12) to operacja przesuni\u0119cia bitowego w lewo. Oznacza to, \u017ce w zerowej zmiennej przesuniemy jedynk\u0119 na dwunaste miejsce, uzyskuj\u0105c w ten spos\u00f3b liczb\u0119 4096, od kt\u00f3rej na ko\u0144cu odejmujemy jeden.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4963791 elementor-widget elementor-widget-text-editor\" data-id=\"4963791\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">1 = 00000000 00000000 = 1<\/p><p style=\"font-weight: 400\">1&lt;&lt;1 = 00000000 00000010 = 2<\/p><p style=\"font-weight: 400\">1&lt;&lt;8 = 00000001 00000000 = 256<\/p><p style=\"font-weight: 400\">1&lt;&lt;12 = 0010000 00000000 = 4096<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-311f6d0 elementor-widget elementor-widget-text-editor\" data-id=\"311f6d0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Przesuni\u0119cia bitowe do\u015b\u0107 \u0142atwo jest zobrazowa\u0107 sobie na powy\u017cszym przyk\u0142adzie. Przesuwaj\u0105c jedynk\u0119 o okre\u015blon\u0105 ilo\u015b\u0107 miejsc, mo\u017cna do\u015b\u0107 \u0142atwo uzyska\u0107 liczby b\u0119d\u0105ce kolejnymi pot\u0119gami dw\u00f3jki, kt\u00f3re w elektronice i programowaniu s\u0105 niezwykle przydatne. Bity przesuwa\u0107 mo\u017cna te\u017c w lewo, dzi\u0119ki operatorowi \u201e&gt;&gt;\u201d. Poza tym warto wiedzie\u0107, \u017ce przesuni\u0119cia bitowe tyczy\u0107 mog\u0105 si\u0119 zmiennej jako ca\u0142o\u015bci, ale takimi przyk\u0142adami zajmiemy si\u0119 innym razem.<\/p><p style=\"font-weight: 400\">Po uzyskaniu zmiennej result, kt\u00f3ra jest de facto warto\u015bci\u0105 napi\u0119cia odczytan\u0105 z czujnika temperatury, musimy przekszta\u0142ci\u0107 j\u0105 na stopnie Celsjusza. Zadanie to realizuje polecenie float temp = 27 &#8211; (result -0.706)\/0.001721;, dzi\u0119ki kt\u00f3remu w zmiennej temp zapisana zostanie zmiennoprzecinkowa warto\u015b\u0107 temperatury. Za wykorzystanym dzia\u0142aniem nie kryje si\u0119 \u017cadna szczeg\u00f3lna historia, jest to po prostu podstawiona do wzoru dost\u0119pnego w dokumentacji RP2040 warto\u015b\u0107. Dzi\u0119ki umieszczonemu na ko\u0144cu poleceniu printf, na monitorze portu szeregowego b\u0119dzie mo\u017cna zobaczy\u0107 odczytan\u0105 temperatur\u0119.<\/p><p style=\"font-weight: 400\">Jak by\u0107 mo\u017ce zauwa\u017cyli\u015bcie, w tym programie zmieni\u0142em nieco umiejscowienie komentarzy. W poprzednich projektach umieszcza\u0142em je po prawej stronie funkcji, jednak w tym przypadku znalaz\u0142y si\u0119 one ponad nimi.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-848d39f elementor-widget elementor-widget-text-editor\" data-id=\"848d39f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\/\/conditional function controlling LEDs<br \/>if(photores_read &lt;= 2500){<br \/>\u00a0 \u00a0 gpio_put(GREEN_LED, 1);<br \/>\u00a0 \u00a0 gpio_put(YELLOW_LED, 0);<br \/>\u00a0 \u00a0 gpio_put(RED_LED, 0);<br \/>}<\/p><p>if(photores_read &lt;= 2500){ \/\/conditional function controlling LEDs<br \/>\u00a0 \u00a0 gpio_put(GREEN_LED, 1);<br \/>\u00a0 \u00a0 gpio_put(YELLOW_LED, 0);<br \/>\u00a0 \u00a0 gpio_put(RED_LED, 0);<br \/>}<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6db1fe5 elementor-widget elementor-widget-text-editor\" data-id=\"6db1fe5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Tak naprawd\u0119 obie konwencje zapisu s\u0105 poprawne i od was zale\u017cy, kt\u00f3r\u0105 z nich b\u0119dziecie stosowa\u0107. Oczywi\u015bcie sposoby zapisu mo\u017cna te\u017c miesza\u0107, dodaj\u0105c komentarz raz obok, a raz ponad funkcj\u0105. Najwa\u017cniejsze jest jednak samo dodawanie komentarzy, tak aby czytaj\u0105cy m\u00f3g\u0142 w prosty spos\u00f3b zorientowa\u0107 si\u0119 w strukturze kodu.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-23ff5ee elementor-widget elementor-widget-video\" data-id=\"23ff5ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;video_type&quot;:&quot;hosted&quot;,&quot;controls&quot;:&quot;yes&quot;}\" data-widget_type=\"video.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"e-hosted-video elementor-wrapper elementor-open-inline\">\n\t\t\t\t\t<video class=\"elementor-video\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/lux_re.mov\" controls=\"\" preload=\"metadata\" controlsList=\"nodownload\"><\/video>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-78ebc7a elementor-widget elementor-widget-text-editor\" data-id=\"78ebc7a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Po kompilacji i wrzuceniu pliku .uf2 do pami\u0119ci RPI Pico W, sprawdzi\u0107 mo\u017cemy dwojak\u0105 funkcjonalno\u015b\u0107 przygotowanego programu. Na filmie mo\u017cecie zobaczy\u0107 jak stopniowo o\u015bwietlam fotorezystor. Im wi\u0119cej \u015bwiat\u0142a otrzymuje ten element, tym bardziej zmniejsza si\u0119 jego rezystancja, wp\u0142ywaj\u0105c na warto\u015b\u0107 napi\u0119cia odczytywanego przez Raspberry Pi Pico. Tym sposobem zmianie ulega te\u017c odczytywana zmienna i zale\u017cnie od jej warto\u015bci uruchamiana jest inna dioda LED. Je\u015bli \u015bwiat\u0142a jest wi\u0119cej, zmienna trafi do kolejnego zakresu opisanego w kaskadowej funkcji warunkowej.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a8c5451 elementor-widget elementor-widget-image\" data-id=\"a8c5451\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver1_photo_temp.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"ver1_photo_temp\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc3MzQ4IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wM1wvdmVyMV9waG90b190ZW1wLnBuZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"205\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver1_photo_temp-1024x263.png\" class=\"attachment-large size-large wp-image-77348\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver1_photo_temp-1024x263.png 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver1_photo_temp-300x77.png 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver1_photo_temp-768x197.png 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver1_photo_temp.png 1385w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Warto\u015b\u0107 temperatury wewn\u0119trznej procesora.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fc16d6d elementor-widget elementor-widget-text-editor\" data-id=\"fc16d6d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Poza tym, je\u015bli uruchomimy monitor portu szeregowego, mo\u017cemy zobaczy\u0107 warto\u015b\u0107 ADC oraz napi\u0119cie odczytane z wyprowadzenia fotorezystora. Tutaj te\u017c pojawi si\u0119 wewn\u0119trzna temperatura mikrokontrolera, wysy\u0142ana, gdy wci\u015bniemy umieszczony na p\u0142ytce stykowej przycisk. Trzymaj\u0105c palec na powierzchni mikrokontrolera, mo\u017cna obserwowa\u0107 rosn\u0105cy powoli odczyt, ale pami\u0119ta\u0107 trzeba, \u017ce w por\u00f3wnaniu do zewn\u0119trznych czujnik\u00f3w nie jest on zbyt dok\u0142adny i w \u017cadnym wypadku nie mo\u017cna traktowa\u0107 go jako czujnika temperatury zewn\u0119trznej. Chip sam w sobie mo\u017ce si\u0119 nagrzewa\u0107 zale\u017cnie od obci\u0105\u017cenia i czujnik ten s\u0142u\u017cy do odczytywania w\u0142a\u015bnie temperatury samego uk\u0142adu. We wi\u0119kszych projektach mo\u017cna powi\u0105za\u0107 j\u0105 z aktywnym ch\u0142odzeniem urz\u0105dzenia.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cee33e2 elementor-widget elementor-widget-heading\" data-id=\"cee33e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Niewielkie poprawki <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-47adf73 elementor-widget elementor-widget-text-editor\" data-id=\"47adf73\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Program, kt\u00f3ry przygotowali\u015bmy dzia\u0142a poprawnie, fotorezystor reaguje na padaj\u0105ce \u015bwiat\u0142o, a wciskaj\u0105c przycisk mo\u017cemy zobaczy\u0107 temperatur\u0119 uk\u0142adu RP2040. Czy w takim razie jest w og\u00f3le sens pr\u00f3bowa\u0107 poprawia\u0107 kod, skoro jest on funkcjonalny? Odpowied\u017a jest jak najbardziej pozytywna, w tym, jak i w innych przypadkach powinni\u015bmy wraca\u0107 do wcze\u015bniej napisanych program\u00f3w z kilku istotnych powod\u00f3w. Analizuj\u0105c wcze\u015bniejsze rozwi\u0105zania, ci\u0105gle doskonalimy swoje umiej\u0119tno\u015bci, a poza tym nie raz wpa\u015b\u0107 mo\u017cemy na lepszy spos\u00f3b rozwi\u0105zania jakiego\u015b problemu. Poza tym powinni\u015bmy stara\u0107 si\u0119 eliminowa\u0107 potencjalne b\u0142\u0119dy, jednocze\u015bnie usprawniaj\u0105c czytelno\u015b\u0107 samego kodu, tak aby by\u0142 on zrozumia\u0142y dla innych programist\u00f3w. Ostatecznie, regularne przygl\u0105danie si\u0119 i poprawianie wcze\u015bniej napisanego kodu stanowi nieod\u0142\u0105czny element procesu w\u0142asnego samodoskonalenia.<\/p><p style=\"font-weight: 400\">Przy tej okazji chcia\u0142bym te\u017c zwr\u00f3ci\u0107 uwag\u0119 na jedno z zagadnie\u0144 powi\u0105zanych z programowaniem, kt\u00f3re wielu pocz\u0105tkuj\u0105cych ignoruje, a znajomo\u015b\u0107 tematu bywa w wielu przypadkach przydatna. S\u0105 to algorytmy, b\u0119d\u0105ce w rzeczywisto\u015bci bardzo szerokim tematem, kt\u00f3rym warto si\u0119 zainteresowa\u0107. Na pewnym forum spotka\u0142em si\u0119 kiedy\u015b z okre\u015bleniem, \u017ce programista nieznaj\u0105cy algorytm\u00f3w jest jak \u201ecode stitcher\u201d, co mo\u017cna przet\u0142umaczy\u0107 jako \u201eklepacz kodu\u201d. C\u00f3\u017c, ci\u0119\u017cko si\u0119 z tym nie zgodzi\u0107. Temat ten jest bardzo szeroki, ale w skr\u00f3cie algorytmy mo\u017cemy okre\u015bli\u0107 jako zorganizowane i optymalne sposoby rozwi\u0105zywania problem\u00f3w. Z wieloma programistycznymi zagwozdkami tw\u00f3rcy program\u00f3w spotykali si\u0119 ju\u017c lata temu, tak wi\u0119c nie ma wi\u0119kszego sensu wynajdywanie ko\u0142a na nowo. Warto jest si\u0119gn\u0105\u0107 po ksi\u0105\u017ck\u0119 lub te\u017c przeszuka\u0107 internet pod k\u0105tem stosowanych w programowaniu algorytm\u00f3w, bo dzi\u0119ki tej wiedzy pisane w przysz\u0142o\u015bci programy b\u0119d\u0105 optymalniejsze. Poza tym algorytmy u\u0142atwiaj\u0105 rozwi\u0105zywanie problem\u00f3w, kt\u00f3re s\u0105 istot\u0105 programowania.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b7ca0fe elementor-widget elementor-widget-text-editor\" data-id=\"b7ca0fe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>#include &lt;stdio.h&gt;<br \/>#include &#8220;pico\/stdlib.h&#8221;<br \/>#include &#8220;hardware\/adc.h&#8221;<\/p><p>#define RED_LED 2<br \/>#define YELLOW_LED 1<br \/>#define GREEN_LED 0<br \/>#define BUTTON 16<\/p><p>const float conversion_factor = 3.3\/4095;<\/p><p>int main() {<br \/>\u00a0 \u00a0 stdio_init_all();<\/p><p>\u00a0 \u00a0 gpio_init(RED_LED);<br \/>\u00a0 \u00a0 gpio_init(YELLOW_LED);\u00a0<br \/>\u00a0 \u00a0 gpio_init(GREEN_LED);<br \/>\u00a0 \u00a0 gpio_init(BUTTON);<\/p><p>\u00a0 \u00a0 gpio_set_dir(RED_LED, GPIO_OUT);<br \/>\u00a0 \u00a0 gpio_set_dir(YELLOW_LED, GPIO_OUT);<br \/>\u00a0 \u00a0 gpio_set_dir(GREEN_LED, GPIO_OUT);<br \/>\u00a0 \u00a0 gpio_set_dir(BUTTON, GPIO_IN);<\/p><p>\u00a0 \u00a0 gpio_pull_up(BUTTON);<\/p><p>\u00a0 \u00a0 adc_init();<br \/>\u00a0 \u00a0 adc_set_temp_sensor_enabled(true);<br \/>\u00a0 \u00a0 adc_gpio_init(26);<\/p><p>\u00a0<\/p><p>\u00a0 \u00a0 while(true) {<\/p><p>\u00a0 \u00a0 adc_select_input(0);<br \/>\u00a0 \u00a0 uint16_t photores_read = adc_read();<br \/>\u00a0 \u00a0 const float voltage_photores = photores_read * conversion_factor;<br \/>\u00a0 \u00a0 printf(&#8220;Photoresistor ADC: value = %d, voltage = %f V\\n&#8221;, photores_read, voltage_photores);<br \/><br \/>\u00a0 \u00a0 if(photores_read &gt;= 0 &amp;&amp; photores_read &lt;= 2500){<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(GREEN_LED, 1);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(YELLOW_LED, 0);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(RED_LED, 0);<br \/>\u00a0 \u00a0 }<br \/>\u00a0 \u00a0 else if(photores_read &gt; 2500 &amp;&amp; photores_read &lt;= 3500){<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(GREEN_LED, 0);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(YELLOW_LED, 1);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(RED_LED, 0);<br \/>}<br \/>\u00a0 \u00a0 else if(photores_read &gt; 3500 &amp;&amp; photores_read &lt;= 4095){<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(GREEN_LED, 0);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(YELLOW_LED, 0);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(RED_LED, 1);<br \/>\u00a0 \u00a0 }<br \/>\u00a0 \u00a0 else<br \/>\u00a0 \u00a0{<br \/>\u00a0 \u00a0 \u00a0 \u00a0printf(&#8220;Photoresistor error&#8221;);<br \/>\u00a0 \u00a0}<\/p><p>\u00a0 \u00a0 bool button_state = gpio_get(BUTTON);<br \/><br \/>\u00a0 \u00a0 if(button_state == false){ <br \/>\u00a0 \u00a0 \u00a0 \u00a0 adc_select_input(4);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 uint16_t adc_temp = adc_read();<br \/>\u00a0 \u00a0 \u00a0 \u00a0 float temp = 27 &#8211; ((adc_temp * conversion_factor)-0.706)\/0.001721;<br \/>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;Temp = %f C, voltage = %f V\\n&#8221;, temp, (adc_temp * conversion_factor));<br \/>\u00a0 \u00a0 }<br \/>\u00a0 \u00a0 sleep_ms(500);<br \/>\u00a0 \u00a0 }<br \/>}<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-54af8b5 elementor-widget elementor-widget-text-editor\" data-id=\"54af8b5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Skoro wiemy ju\u017c, \u017ce warto wraca\u0107 do napisanych wcze\u015bniej kod\u00f3w, przyjrzyjmy si\u0119 napisanemu chwil\u0119 wcze\u015bniej programowi i spr\u00f3bujmy wprowadzi\u0107 do niego kilka niewielkich zmian.<\/p><p style=\"font-weight: 400\">Na pocz\u0105tek poprawmy kaskadow\u0105 funkcj\u0119 warunkow\u0105, kt\u00f3ra steruje diodami LED. Jak ju\u017c wcze\u015bniej wspomnia\u0142em, jej problemem by\u0142y niezbyt dok\u0142adnie opisane zakresy. Mog\u0142oby si\u0119 wydawa\u0107, \u017ce nie jest to jaki\u015b du\u017cy problem, bo przecie\u017c wiemy, \u017ce odczytana z fotorezystora warto\u015b\u0107 nie b\u0119dzie mniejsza ni\u017c zero i wi\u0119ksza ni\u017c 4095. Nie mamy jednak stuprocentowej pewno\u015bci czy we wn\u0119trzu mikrokontrolera nie pojawi si\u0119 jaki\u015b problem i czy zb\u0142\u0105kany elektron nie zmieni warto\u015bci zapisanej w kt\u00f3rym\u015b z rejestr\u00f3w. Oczywi\u015bcie, nawet gdyby tak si\u0119 sta\u0142o, to w przypadku obwodu na p\u0142ytce stykowej nie mia\u0142oby to wi\u0119kszego znaczenia. Trzeba jednak pami\u0119ta\u0107, \u017ce nie ka\u017cdy program uruchamiany jest tylko na p\u0142ytce stykowej &#8211; w systemach medycznych czy wojskowych b\u0142\u0119dy i nieprzewidywalne zachowania w programie s\u0105 niedopuszczalne. W\u0142a\u015bnie dlatego warto jest poprawi\u0107 warunki, nawet w tak prostym kodzie. Po modyfikacji, ka\u017cda z funkcji if odwo\u0142uje si\u0119 do konkretnego zakresu, a warunki zbudowane zosta\u0142y na om\u00f3wionym ju\u017c wcze\u015bniej operatorze AND.<\/p><p style=\"font-weight: 400\">Przyjrze\u0107 mo\u017cemy si\u0119 te\u017c funkcjom zwi\u0105zanym z odczytem warto\u015bci ADC z fotorezystora i sensora temperatury. W obu przypadkach korzystali\u015bmy ze zmiennej potrzebnej do konwersji, w kt\u00f3rej zapisany by\u0142 wynik dzia\u0142ania 3.3\/4095. Wykonywanie dwukrotnie tego samego obliczenia jest marnotrawstwem czasu i zasob\u00f3w. Dlatego zmienn\u0105 conversion_factor mo\u017cemy wyrzuci\u0107 na pocz\u0105tek programu i zrobi\u0107 z niej sta\u0142\u0105, dzi\u0119ki czemu przyjmie ona odpowiedni\u0105 warto\u015b\u0107, kt\u00f3ra nie mo\u017ce by\u0107 modyfikowana. Sta\u0142\u0105 definiujemy poprzez dodanie s\u0142owa kluczowego const przed okre\u015bleniem typu. Sta\u0142e podobnie jak zmienne mog\u0105 by\u0107 globalne lub lokalne, w tym przypadku deklaracj\u0119 conversion_factor umie\u015bci\u0142em powy\u017cej funkcji main, dzi\u0119ki czemu b\u0119dzie ona globalna, co przyda nam si\u0119 jeszcze p\u00f3\u017aniej.<\/p><p style=\"font-weight: 400\">Dzi\u0119ki dodaniu sta\u0142ej modyfikacji uleg\u0142y nieco obliczenia zwi\u0105zane z odczytywanymi sygna\u0142ami ADC. Przy fotorezystorze zmieni\u0142em tylko zapis 3.3\/4095 na deklaracj\u0119 sta\u0142ej, ale przy obliczeniach powi\u0105zanych z czujnikiem temperatury ca\u0142o\u015b\u0107 skr\u00f3ci\u0142a si\u0119 o dwie linijki. Pierwszym poleceniem, kt\u00f3re znikn\u0119\u0142o, jest oczywi\u015bcie wyznaczenie conversion_factor, obecnie ju\u017c w formie sta\u0142ej. Poza tym zrezygnowa\u0142em z wyznaczania warto\u015bci result, kt\u00f3ra umieszczona by\u0142a wewn\u0105trz dzia\u0142ania wyznaczaj\u0105cego temperatur\u0119. Zamiast tego pod wz\u00f3r podstawione zosta\u0142y odpowiednie zmienne, w ten spos\u00f3b uzyskali\u015bmy polecenie temp = 27 &#8211; ((adc_temp * conversion_factor)-0.706)\/0.001721. Jak mo\u017cecie zauwa\u017cy\u0107, operacj\u0119 mno\u017cenia umie\u015bci\u0142em w dodatkowym nawiasie, cho\u0107 z perspektywy kolejno\u015bci wykonywania dzia\u0142a\u0144 operacja ta wykona si\u0119 jako pierwsza. Jest on zb\u0119dny, ale osobi\u015bcie lubi\u0119 zapisywa\u0107 dzia\u0142ania w\u0142a\u015bnie w taki spos\u00f3b, podkre\u015blaj\u0105c niejako ci\u0105g kolejno wykonywanych operacji.<\/p><p style=\"font-weight: 400\">Dodatkowo na samym ko\u0144cu rozbudowane zosta\u0142o polecenie printf. Od teraz poza warto\u015bci\u0105 temperatury na ekranie komputera b\u0119dzie mo\u017cna zobaczy\u0107 te\u017c warto\u015b\u0107 napi\u0119cia odczytan\u0105 z czujnika temperatury. Jak mo\u017cecie zauwa\u017cy\u0107, zmienna podstawiana za drugi operator %f ma w rzeczywisto\u015bci form\u0119 dzia\u0142ania matematycznego. W j\u0119zyku C z powodzeniem mo\u017cemy tworzy\u0107 tego typu konstrukcje, w kt\u00f3rych konkretne zmienne maj\u0105 tak naprawd\u0119 form\u0119 innych dzia\u0142a\u0144 czy nawet w niekt\u00f3rych przypadkach ca\u0142ych funkcji. Trzeba jednak uwa\u017ca\u0107, aby przesadnie nie rozbudowa\u0107 jakie\u015b instrukcji i nie tworzy\u0107 swego rodzaju \u201etasiemc\u00f3w\u201d. D\u0142u\u017csze instrukcje mog\u0105 z czasem sta\u0107 si\u0119 znacznie trudniejsze do zrozumienia.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-69c49d9 elementor-widget elementor-widget-heading\" data-id=\"69c49d9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Przygotowanie w\u0142asnych funkcji<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b4d6165 elementor-widget elementor-widget-text-editor\" data-id=\"b4d6165\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>#include &lt;stdio.h&gt;<br \/>#include &#8220;pico\/stdlib.h&#8221;<br \/>#include &#8220;hardware\/adc.h&#8221;<\/p><p>#define RED_LED 2<br \/>#define YELLOW_LED 1<br \/>#define GREEN_LED 0<br \/>#define BUTTON 16<\/p><p>const float conversion_factor = 3.3\/4095;<\/p><p>void PhotoresRun();<br \/>uint8_t TempSensorRun(bool button_state);<\/p><p>int main() {<br \/>\u00a0 \u00a0 stdio_init_all();<\/p><p>\u00a0 \u00a0 gpio_init(RED_LED);<br \/>\u00a0 \u00a0 gpio_init(YELLOW_LED);<br \/>\u00a0 \u00a0 gpio_init(GREEN_LED);<br \/>\u00a0 \u00a0 gpio_init(BUTTON);<\/p><p>\u00a0 \u00a0 gpio_set_dir(RED_LED, GPIO_OUT);<br \/>\u00a0 \u00a0 gpio_set_dir(YELLOW_LED, GPIO_OUT);<br \/>\u00a0 \u00a0 gpio_set_dir(GREEN_LED, GPIO_OUT);<br \/>\u00a0 \u00a0 gpio_set_dir(BUTTON, GPIO_IN);<\/p><p>\u00a0 \u00a0 gpio_pull_up(BUTTON);<\/p><p>\u00a0 \u00a0 adc_init();<br \/>\u00a0 \u00a0 adc_set_temp_sensor_enabled(true);<br \/>\u00a0 \u00a0 adc_gpio_init(26);<\/p><p>\u00a0<\/p><p>\u00a0 \u00a0 while(true) {<\/p><p>\u00a0 \u00a0 PhotoresRun();<br \/><br \/>\u00a0 \u00a0 bool button_state = gpio_get(BUTTON);<br \/>\u00a0 \u00a0 uint8_t return_value = TempSensorRun(button_state);<br \/>\u00a0 \u00a0 printf(&#8220;return_value = %d \\n&#8221;, return_value);<br \/><br \/>\u00a0 \u00a0 sleep_ms(500);<br \/>\u00a0 \u00a0 }<br \/>}<\/p><p>void PhotoresRun(){<br \/>\u00a0 \u00a0 adc_select_input(0);<br \/>\u00a0 \u00a0 uint16_t photores_read = adc_read();<br \/>\u00a0 \u00a0 const float voltage_photores = photores_read * conversion_factor;<br \/>\u00a0 \u00a0 printf(&#8220;Photoresistor ADC: value = %d, voltage = %f V\\n&#8221;, photores_read, voltage_photores);<br \/><br \/>\u00a0 \u00a0 if(photores_read &gt;= 0 &amp;&amp; photores_read &lt;= 2500){<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(GREEN_LED, 1);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(YELLOW_LED, 0);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(RED_LED, 0);<br \/>\u00a0 \u00a0 }<br \/>\u00a0 \u00a0 else if(photores_read &gt; 2500 &amp;&amp; photores_read &lt;= 3500){<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(GREEN_LED, 0);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(YELLOW_LED, 1);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(RED_LED, 0);<br \/>\u00a0 \u00a0 }<br \/>\u00a0 \u00a0 else if(photores_read &gt; 3500 &amp;&amp; photores_read &lt;= 4095){<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(GREEN_LED, 0);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(YELLOW_LED, 0);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 gpio_put(RED_LED, 1);<br \/>\u00a0 \u00a0 }<br \/>\u00a0 \u00a0 else<br \/>\u00a0 \u00a0 {<br \/>\u00a0 \u00a0 printf(&#8220;Photoresistor error&#8221;);<br \/>\u00a0 \u00a0 }<br \/>}<\/p><p>uint8_t TempSensorRun(bool button_state){<br \/><br \/>if(button_state == false){ <br \/>\u00a0 \u00a0 adc_select_input(4);<br \/>\u00a0 \u00a0 uint16_t adc_temp = adc_read();<br \/>\u00a0 \u00a0 float temp = 27 &#8211; ((adc_temp * conversion_factor)-0.706)\/0.001721;<br \/>\u00a0 \u00a0 printf(&#8220;Temp = %f C, voltage = %f V\\n&#8221;, temp, (adc_temp * conversion_factor));<br \/>\u00a0 \u00a0 return 0;<br \/>\u00a0 \u00a0 }<br \/>return 1;<br \/>}<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a04b26c elementor-widget elementor-widget-text-editor\" data-id=\"a04b26c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Do tej pory w naszych programach korzystali\u015bmy z pojedynczej, g\u0142\u00f3wnej funkcji main oraz obszaru ponad ni\u0105, gdzie umieszczali\u015bmy deklaracje zmiennych, sta\u0142ych czy te\u017c do\u0142\u0105czone biblioteki. Tym razem spr\u00f3bujemy przygotowa\u0107 te\u017c w\u0142asn\u0105 funkcj\u0119, kt\u00f3r\u0105 b\u0119dziemy mogli umie\u015bci\u0107 wewn\u0105trz g\u0142\u00f3wnego main, tak jak wiele spo\u015br\u00f3d innych polece\u0144. Test przeprowadzimy na przygotowanym ju\u017c programie, kt\u00f3ry omawiamy w tym artykule. W przyk\u0142adzie spr\u00f3bujemy wyodr\u0119bni\u0107 bloki kodu odpowiedzialne za obs\u0142ug\u0119 fotorezystora i wewn\u0119trznego czujnika temperatury i zamkn\u0105\u0107 je w ramy pojedynczej funkcji.<\/p><p style=\"font-weight: 400\">Przyjrzyjmy si\u0119 przyk\u0142adowi powy\u017cej. Jak mo\u017cecie zauwa\u017cy\u0107, g\u0142\u00f3wna funkcja main, a w szczeg\u00f3lno\u015bci kod umieszczony wewn\u0105trz p\u0119tli while uleg\u0142 do\u015b\u0107 znacznemu odchudzeniu. Obecnie sk\u0142ada si\u0119 on ju\u017c tylko z pi\u0119ciu instrukcji, a kod, kt\u00f3ry jeszcze przed momentem si\u0119 w niej znajdowa\u0142, umieszczony jest teraz poni\u017cej w do\u015b\u0107 tajemniczo opisanych blokach. S\u0105 to w\u0142a\u015bnie nasze w\u0142asne funkcje nazwane PhotoresRun oraz TempSensorRun.<\/p><p style=\"font-weight: 400\">Podczas wykonywania kodu z p\u0119tli while mikrokontroler napotka polecenie PhotoresRun();, w\u00f3wczas przeskoczy on do kodu, kt\u00f3ry opisany zosta\u0142\u00a0w tej funkcji. Funkcje definiujemy jako \u2013 typ nazwa(opcjonalne operandy). W tym przypadku jest to void PhotoresRun(), czyli funkcja typu void o nazwie PhotoresRun, do kt\u00f3rej nie przekazujemy \u017cadnych zmiennych, poniewa\u017c nawias jest pusty. Typ funkcji okre\u015bla te\u017c to, co dana funkcja nam zwraca. Gdy korzystamy z dla przyk\u0142adu adc_read() funkcja zwraca nam cyfrow\u0105 reprezentacj\u0119 sygna\u0142u odczytanego z jednego ze \u017ar\u00f3de\u0142 przetwornika ADC. Je\u015bli chcemy, aby funkcja nie zwraca\u0142a nam \u017cadnej warto\u015bci, stosujemy w\u0142a\u015bnie typ void. Kod, kt\u00f3ry wykonany zostanie w ramach PhotoresRun, umieszczony jest mi\u0119dzy nawiasami klamrowymi i jest to kopia programu, kt\u00f3ry we wcze\u015bniejszych przyk\u0142adach obs\u0142ugiwa\u0142 fotorezystor.<\/p><p style=\"font-weight: 400\">Drug\u0105 funkcj\u0105 jest TempSensorRun, kt\u00f3rego deklaracja wygl\u0105da ju\u017c nieco bardziej skomplikowanie &#8211; uint8_t TempSensorRun(bool button_state). Jest to funkcja zwracaj\u0105ca dan\u0105 typu uint8_t o nazwie TempSensorRun, do kt\u00f3rej przekaza\u0107 mo\u017cemy zmienn\u0105 typu bool nazywan\u0105 dalej button_state. We wn\u0119trzu funkcji umieszczony zosta\u0142\u00a0warunek obs\u0142uguj\u0105cy wci\u015bni\u0119cie przycisku. Je\u015bli przekazana do funkcji zmienna przyjmie warto\u015b\u0107 false, innymi s\u0142owy, przycisk zostanie wci\u015bni\u0119ty, w\u00f3wczas wykona si\u0119 kod, kt\u00f3ry ju\u017c wcze\u015bniej stosowali\u015bmy do obs\u0142ugi wewn\u0119trznego czujnika temperatury. Poza tym w tej funkcji mo\u017cecie zobaczy\u0107 te\u017c s\u0142owa kluczowe return. To w\u0142a\u015bnie dzi\u0119ki nim funkcja mo\u017ce \u201eco\u015b\u201d zwr\u00f3ci\u0107. Je\u015bli przeskoczymy na moment do g\u0142\u00f3wnego bloku main, zobaczymy, \u017ce utworzona zosta\u0142a zmienna typu uint8_t o nazwie return_value, do kt\u00f3rej przypisana zostanie warto\u015b\u0107 zwracana przez TempSensorRun. Je\u015bli przycisk b\u0119dzie wci\u015bni\u0119ty, funkcja wykona obs\u0142uguj\u0105cy go kod, wysy\u0142aj\u0105c poprzez USB dane o temperaturze i napi\u0119ciu, ale poza tym zwr\u00f3ci te\u017c warto\u015b\u0107 zera, kt\u00f3ra przypisana zostanie do return_value. W przypadku, gdy przycisk nie b\u0119dzie wci\u015bni\u0119ty i na wyprowadzeniu RPI panowa\u0107 b\u0119dzie stan wysoki, funkcja zwr\u00f3ci warto\u015b\u0107 jeden, kt\u00f3ra r\u00f3wnie\u017c przypisana zostanie do zmiennej.<\/p><p style=\"font-weight: 400\">W ten w\u0142a\u015bnie spos\u00f3b mo\u017cemy tworzy\u0107 w\u0142asne funkcje, przy czym pami\u0119ta\u0107 trzeba te\u017c o ich prototypach, kt\u00f3re nale\u017cy umie\u015bci\u0107 powy\u017cej g\u0142\u00f3wnego bloku main. Jest to nic innego jak kr\u00f3tkie powt\u00f3rzenie deklaracji funkcji z jej typem, nazw\u0105 i opcjonalnymi operandami.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7a84925 elementor-widget elementor-widget-image\" data-id=\"7a84925\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver3_serial.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"ver3_serial\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc3MzUyIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wM1wvdmVyM19zZXJpYWwucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"148\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver3_serial-1024x190.png\" class=\"attachment-large size-large wp-image-77352\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver3_serial-1024x190.png 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver3_serial-300x56.png 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver3_serial-768x142.png 768w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/ver3_serial.png 1360w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Dane przesy\u0142ane przez RPI.<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6d3271e elementor-widget elementor-widget-text-editor\" data-id=\"6d3271e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Po uruchomieniu kodu na ekranie komputera mo\u017cna zobaczy\u0107 przesy\u0142ane przez Raspberry Pi Pico W dane z fotorezystora oraz warto\u015b\u0107 przypisan\u0105 do return_value. Gdy przycisk pozostaje swobodny, do zmiennej przypisana jest jedynka. Uk\u0142ad wykonuje funkcj\u0119 TempSensorRun, ale ze wzgl\u0119du na stan przycisku od razu zwraca liczb\u0119 jeden i wraca do g\u0142\u00f3wnej p\u0119tli. Sytuacja zmienia si\u0119, gdy wci\u015bniemy przycisk. W\u00f3wczas poza danymi z wewn\u0119trznego czujnika temperatury zobaczymy zmian\u0119 warto\u015bci return_value na zero.<\/p><p style=\"font-weight: 400\">Przygotowywanie w\u0142asnych funkcji jest niezwykle przydatne, zw\u0142aszcza w bardziej rozbudowanych kodach. Dzi\u0119ki nim g\u0142\u00f3wny main ulega znacznemu odchudzeniu, przez co program jest czytelniejszy. Chc\u0105c przyjrze\u0107 si\u0119 jakiej\u015b konkretnej funkcji, wystarczy, \u017ce odszukamy jej deklaracj\u0119, a nast\u0119pnie wr\u00f3cimy do g\u0142\u00f3wnej p\u0119tli. W\u0142asne funkcje mo\u017cna te\u017c umieszcza\u0107 w innych plikach, przez co kody staj\u0105 si\u0119 jeszcze bardziej optymalne, ale tym zagadnieniem zajmiemy si\u0119 innym razem.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3b3532f elementor-widget elementor-widget-heading\" data-id=\"3b3532f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Kilka s\u0142\u00f3w na koniec\u2026<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7cbfc1c elementor-widget elementor-widget-text-editor\" data-id=\"7cbfc1c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">W dzisiejszym materiale poznali\u015bmy kilka teoretycznych zagadnie\u0144 zwi\u0105zanych z optymalizacj\u0105 kodu. Poza tym wspomnia\u0142em te\u017c o dobrym nawyku wracania do wcze\u015bniej napisanych program\u00f3w. Na koniec pokaza\u0142em wam, w jaki spos\u00f3b budowa\u0107 mo\u017cna w\u0142asne funkcje, a wiedza ta przyda nam si\u0119 w przysz\u0142o\u015bci. Mimo bardziej teoretycznego charakteru tego materia\u0142u, poznali\u015bcie te\u017c spos\u00f3b obs\u0142ugi wewn\u0119trznego czujnika temperatury w RP2040. W projektach wykorzystali\u015bmy te\u017c operatory logiczne oraz przesuni\u0119cia bitowe. W kolejnym materiale przyjrzymy si\u0119 zagadnieniom zwi\u0105zanym z przerwaniami w mikrokontrolerze.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4d62b00 elementor-widget elementor-widget-spacer\" data-id=\"4d62b00\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5897caa elementor-widget elementor-widget-text-editor\" data-id=\"5897caa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">\u0179r\u00f3d\u0142a:<\/p><ul><li>https:\/\/datasheets.raspberrypi.com\/rp2040\/rp2040-datasheet.pdf<\/li><li>https:\/\/datasheets.raspberrypi.com\/picow\/pico-w-datasheet.pdf<\/li><li>https:\/\/www.raspberrypi.com\/products\/rp2040\/<\/li><li>https:\/\/www.raspberrypi.com\/documentation\/microcontrollers\/raspberry-pi-pico.html<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>W tym artykule skorzystamy z poznanych ju\u017c wcze\u015bniej funkcji i z ich pomoc\u0105 stworzymy nieco bardziej rozbudowany program, tak aby p\u00f3\u017aniej m\u00f3c go upro\u015bci\u0107, zachowuj\u0105c jednocze\u015bnie jego funkcjonalno\u015b\u0107.<\/p>\n","protected":false},"author":34,"featured_media":77402,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7,21,134],"tags":[],"class_list":["post-77338","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-elektronika","category-programowanie","category-raspberry-pi"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje - Botland<\/title>\n<meta name=\"description\" content=\"W tym artykule skorzystamy z poznanych ju\u017c wcze\u015bniej funkcji i z ich pomoc\u0105 stworzymy nieco bardziej rozbudowany program, tak aby p\u00f3\u017aniej m\u00f3c go upro\u015bci\u0107, zachowuj\u0105c jednocze\u015bnie jego funkcjonalno\u015b\u0107.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje - Botland\" \/>\n<meta property=\"og:description\" content=\"W tym artykule skorzystamy z poznanych ju\u017c wcze\u015bniej funkcji i z ich pomoc\u0105 stworzymy nieco bardziej rozbudowany program, tak aby p\u00f3\u017aniej m\u00f3c go upro\u015bci\u0107, zachowuj\u0105c jednocze\u015bnie jego funkcjonalno\u015b\u0107.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/\" \/>\n<meta property=\"og:site_name\" content=\"Botland\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/Botland\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-20T13:00:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-08T09:00:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/1-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1510\" \/>\n\t<meta property=\"og:image:height\" content=\"755\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Rafa\u0142 Bartoszak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rafa\u0142 Bartoszak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 minuty\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/\"},\"author\":{\"name\":\"Rafa\u0142 Bartoszak\",\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#\\\/schema\\\/person\\\/5a69e7f5db1f77c617f990e73bb83215\"},\"headline\":\"Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje\",\"datePublished\":\"2024-03-20T13:00:50+00:00\",\"dateModified\":\"2026-04-08T09:00:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/\"},\"wordCount\":4533,\"publisher\":{\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/1-1.png\",\"articleSection\":[\"Elektronika\",\"Programowanie\",\"Raspberry Pi\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/\",\"name\":\"Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje - Botland\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/1-1.png\",\"datePublished\":\"2024-03-20T13:00:50+00:00\",\"dateModified\":\"2026-04-08T09:00:05+00:00\",\"description\":\"W tym artykule skorzystamy z poznanych ju\u017c wcze\u015bniej funkcji i z ich pomoc\u0105 stworzymy nieco bardziej rozbudowany program, tak aby p\u00f3\u017aniej m\u00f3c go upro\u015bci\u0107, zachowuj\u0105c jednocze\u015bnie jego funkcjonalno\u015b\u0107.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/#primaryimage\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/1-1.png\",\"contentUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/1-1.png\",\"width\":1510,\"height\":755},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/botland.de\\\/blog\\\/\",\"name\":\"Botland\",\"description\":\"Blog Raspberry Pi, Arduino, elektronika i robotyka - Botland\",\"publisher\":{\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/botland.de\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#organization\",\"name\":\"Botland\",\"url\":\"https:\\\/\\\/botland.de\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/botland.store\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/logo_kolor_WP_2-1.png\",\"contentUrl\":\"https:\\\/\\\/botland.store\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/logo_kolor_WP_2-1.png\",\"width\":250,\"height\":57,\"caption\":\"Botland\"},\"image\":{\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/facebook.com\\\/Botland\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/botland.de\\\/blog\\\/#\\\/schema\\\/person\\\/5a69e7f5db1f77c617f990e73bb83215\",\"name\":\"Rafa\u0142 Bartoszak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/IMG_21531-300x300.jpg\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/IMG_21531-300x300.jpg\",\"contentUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/IMG_21531-300x300.jpg\",\"caption\":\"Rafa\u0142 Bartoszak\"},\"description\":\"Wsp\u00f3\u0142pracuj\u0105cy z Botlandem elektronik, kt\u00f3ry dzieli si\u0119 swoj\u0105 wiedz\u0105 w internecie. Entuzjasta system\u00f3w cyfrowych, uk\u0142ad\u00f3w programowalnych i mikroelektroniki. Pasjonat historii, ze szczeg\u00f3lnym naciskiem na wiek XX.\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/author\\\/rafal-bartoszak\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje - Botland","description":"W tym artykule skorzystamy z poznanych ju\u017c wcze\u015bniej funkcji i z ich pomoc\u0105 stworzymy nieco bardziej rozbudowany program, tak aby p\u00f3\u017aniej m\u00f3c go upro\u015bci\u0107, zachowuj\u0105c jednocze\u015bnie jego funkcjonalno\u015b\u0107.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/","og_locale":"pl_PL","og_type":"article","og_title":"Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje - Botland","og_description":"W tym artykule skorzystamy z poznanych ju\u017c wcze\u015bniej funkcji i z ich pomoc\u0105 stworzymy nieco bardziej rozbudowany program, tak aby p\u00f3\u017aniej m\u00f3c go upro\u015bci\u0107, zachowuj\u0105c jednocze\u015bnie jego funkcjonalno\u015b\u0107.","og_url":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/","og_site_name":"Botland","article_publisher":"https:\/\/facebook.com\/Botland\/","article_published_time":"2024-03-20T13:00:50+00:00","article_modified_time":"2026-04-08T09:00:05+00:00","og_image":[{"width":1510,"height":755,"url":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/1-1.png","type":"image\/png"}],"author":"Rafa\u0142 Bartoszak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Rafa\u0142 Bartoszak","Szacowany czas czytania":"22 minuty"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/#article","isPartOf":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/"},"author":{"name":"Rafa\u0142 Bartoszak","@id":"https:\/\/botland.de\/blog\/#\/schema\/person\/5a69e7f5db1f77c617f990e73bb83215"},"headline":"Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje","datePublished":"2024-03-20T13:00:50+00:00","dateModified":"2026-04-08T09:00:05+00:00","mainEntityOfPage":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/"},"wordCount":4533,"publisher":{"@id":"https:\/\/botland.de\/blog\/#organization"},"image":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/#primaryimage"},"thumbnailUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/1-1.png","articleSection":["Elektronika","Programowanie","Raspberry Pi"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/","url":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/","name":"Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje - Botland","isPartOf":{"@id":"https:\/\/botland.de\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/#primaryimage"},"image":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/#primaryimage"},"thumbnailUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/1-1.png","datePublished":"2024-03-20T13:00:50+00:00","dateModified":"2026-04-08T09:00:05+00:00","description":"W tym artykule skorzystamy z poznanych ju\u017c wcze\u015bniej funkcji i z ich pomoc\u0105 stworzymy nieco bardziej rozbudowany program, tak aby p\u00f3\u017aniej m\u00f3c go upro\u015bci\u0107, zachowuj\u0105c jednocze\u015bnie jego funkcjonalno\u015b\u0107.","breadcrumb":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/#primaryimage","url":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/1-1.png","contentUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/03\/1-1.png","width":1510,"height":755},{"@type":"BreadcrumbList","@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-7-poprawki-w-kodzie-i-wlasne-funkcje\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/botland.com.pl\/blog\/"},{"@type":"ListItem","position":2,"name":"Kurs Raspberry Pi Pico \u2013 #7 \u2013 Poprawki w kodzie i w\u0142asne funkcje"}]},{"@type":"WebSite","@id":"https:\/\/botland.de\/blog\/#website","url":"https:\/\/botland.de\/blog\/","name":"Botland","description":"Blog Raspberry Pi, Arduino, elektronika i robotyka - Botland","publisher":{"@id":"https:\/\/botland.de\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/botland.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/botland.de\/blog\/#organization","name":"Botland","url":"https:\/\/botland.de\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/botland.de\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/botland.store\/blog\/wp-content\/uploads\/2018\/04\/logo_kolor_WP_2-1.png","contentUrl":"https:\/\/botland.store\/blog\/wp-content\/uploads\/2018\/04\/logo_kolor_WP_2-1.png","width":250,"height":57,"caption":"Botland"},"image":{"@id":"https:\/\/botland.de\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/Botland\/"]},{"@type":"Person","@id":"https:\/\/botland.de\/blog\/#\/schema\/person\/5a69e7f5db1f77c617f990e73bb83215","name":"Rafa\u0142 Bartoszak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2023\/07\/IMG_21531-300x300.jpg","url":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2023\/07\/IMG_21531-300x300.jpg","contentUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2023\/07\/IMG_21531-300x300.jpg","caption":"Rafa\u0142 Bartoszak"},"description":"Wsp\u00f3\u0142pracuj\u0105cy z Botlandem elektronik, kt\u00f3ry dzieli si\u0119 swoj\u0105 wiedz\u0105 w internecie. Entuzjasta system\u00f3w cyfrowych, uk\u0142ad\u00f3w programowalnych i mikroelektroniki. Pasjonat historii, ze szczeg\u00f3lnym naciskiem na wiek XX.","url":"https:\/\/botland.com.pl\/blog\/author\/rafal-bartoszak\/"}]}},"_links":{"self":[{"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/posts\/77338","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/users\/34"}],"replies":[{"embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/comments?post=77338"}],"version-history":[{"count":0,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/posts\/77338\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/media\/77402"}],"wp:attachment":[{"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/media?parent=77338"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/categories?post=77338"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/tags?post=77338"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}