{"id":80390,"date":"2024-05-30T14:00:03","date_gmt":"2024-05-30T12:00:03","guid":{"rendered":"https:\/\/homebook.click\/blog\/?p=80390"},"modified":"2026-04-08T10:56:59","modified_gmt":"2026-04-08T08:56:59","slug":"kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery","status":"publish","type":"post","link":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/","title":{"rendered":"Kurs Raspberry Pi Pico \u2013 #9 \u2013 Teoria wska\u017anik\u00f3w i timery"},"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\"> 11<\/span> <span class=\"rt-label rt-postfix\">min.<\/span><\/span>\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"80390\" class=\"elementor elementor-80390\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-55aba11 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"55aba11\" 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-8d07f31\" data-id=\"8d07f31\" 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-af5cf09 elementor-widget elementor-widget-text-editor\" data-id=\"af5cf09\" 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 ostatnim materiale po\u015bwi\u0119conym Raspberry Pi Pico przyjrzeli\u015bmy si\u0119 bli\u017cej jednemu z najprostszych rodzaj\u00f3w przerwa\u0144 dost\u0119pnych w mikrokontrolerze. Poza tym opowiedzia\u0142em wam o do\u015b\u0107 ciekawej funkcji alarmu, problemie drgaj\u0105cych styk\u00f3w przycisku oraz kr\u00f3tko wspomnia\u0142em o czym\u015b takim jak wska\u017aniki. Nimi w\u0142a\u015bnie zajmiemy si\u0119 w pierwszej cz\u0119\u015bci tego materia\u0142u, a nast\u0119pnie przejdziemy do zagadnie\u0144 zwi\u0105zanych z timerami.<\/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-dc10acc elementor-widget elementor-widget-image\" data-id=\"dc10acc\" 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:\/\/homebook.click\/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:\/\/homebook.click\/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:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-1024x139.jpg 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-300x41.jpg 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/4Gotowy-Zestaw-do-nauki-programowania-z-Raspberry-Pi-Pico-W-768x104.jpg 768w, https:\/\/homebook.click\/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-cf68f2a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"cf68f2a\" 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-0a51ae3\" data-id=\"0a51ae3\" 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-32137c2 elementor-widget elementor-widget-image\" data-id=\"32137c2\" 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:\/\/homebook.click\/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:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/24136_3-300x273.jpg\" class=\"attachment-medium size-medium wp-image-76160\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/24136_3-300x273.jpg 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/24136_3-1024x933.jpg 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/24136_3-768x700.jpg 768w, https:\/\/homebook.click\/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-bd2fe07\" data-id=\"bd2fe07\" 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-7ebbc8d elementor-widget elementor-widget-text-editor\" data-id=\"7ebbc8d\" 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-467bb66 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"467bb66\" 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:\/\/homebook.click\/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-5066b4f elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"5066b4f\" 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-1ee434f elementor-widget elementor-widget-text-editor\" data-id=\"1ee434f\" 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><ol style=\"font-size: 16px; background-color: #ffffff;\"><li style=\"font-size: 16px;\"><a href=\"https:\/\/homebook.click\/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>\u00a0&#8211; zaczynamy\u00a0<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/homebook.click\/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>\u00a0&#8211; s\u0142\u00f3w kilka o programowaniu<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/homebook.click\/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>\u00a0&#8211; pierwszy program<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/homebook.click\/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>\u00a0&#8211; zaczynamy programowa\u0107<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/homebook.click\/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>\u00a0&#8211; p\u0119tle, zmienne i instrukcje warunkowe\u00a0<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/homebook.click\/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>\u00a0\u2013 PWM, ADC i komunikacja z komputerem<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/homebook.click\/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\u00a0<\/span>\u00a0\u2013 Poprawki w kodzie i w\u0142asne funkcje\u00a0<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-8-przerwania-i-alarmy\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico \u2013 #8<\/span>\u00a0\u2013 Przerwania i alarmy<\/a><\/li><li style=\"font-size: 16px;\"><a href=\"https:\/\/homebook.click\/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>\u00a0\u2013 Teoria wska\u017anik\u00f3w i timery<\/a><\/li><li><a href=\"https:\/\/homebook.click\/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>\u00a0\u2013 Tablice, struktury i maszyna stan\u00f3w<\/a><\/li><li><a href=\"https:\/\/homebook.click\/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>\u00a0&#8211; Uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C<\/a><\/li><li><a href=\"https:\/\/homebook.click\/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:\/\/homebook.click\/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><\/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-9c8383d elementor-widget elementor-widget-spacer\" data-id=\"9c8383d\" 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-c7a7b7b elementor-widget elementor-widget-heading\" data-id=\"c7a7b7b\" 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-6d0e536 elementor-widget elementor-widget-image\" data-id=\"6d0e536\" 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:\/\/homebook.click\/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:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576.jpg\" class=\"attachment-large size-large wp-image-74797\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576.jpg 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-300x169.jpg 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-768x432.jpg 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1536x864.jpg 1536w, https:\/\/homebook.click\/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-600f221 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"600f221\" 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:\/\/homebook.click\/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<\/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-c4916ba elementor-widget elementor-widget-text-editor\" data-id=\"c4916ba\" 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:\/\/homebook.click\/\" 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:\/\/homebook.click\/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-2defe8f elementor-widget elementor-widget-text-editor\" data-id=\"2defe8f\" 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:\/\/homebook.click\/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-40046ff elementor-widget elementor-widget-spacer\" data-id=\"40046ff\" 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-c188983 elementor-widget elementor-widget-heading\" data-id=\"c188983\" 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\">Czy wska\u017aniki rzeczywi\u015bcie s\u0105 trudne?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-72a425a elementor-widget elementor-widget-text-editor\" data-id=\"72a425a\" 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\u015b\u0107 powszechnie przyj\u0119\u0142o si\u0119, \u017ce wska\u017aniki w j\u0119zyku C to temat niezwykle trudny, sprawiaj\u0105cy wiele trudno\u015bci nawet do\u015bwiadczonym programistom. Zwarzywszy na ilo\u015b\u0107 materia\u0142\u00f3w omawiaj\u0105cych ten aspekt programowania, jak i ci\u0105gle pojawiaj\u0105ce si\u0119 w\u0105tki na forach mo\u017cemy uzna\u0107, \u017ce rzeczywi\u015bcie tak jest. Cho\u0107 wed\u0142ug mnie wska\u017aniki nie powinny by\u0107 przesadnie demonizowane, a w\u0142a\u015bnie w taki spos\u00f3b s\u0105 one cz\u0119sto przedstawiane, nawet w artyku\u0142ach, w kt\u00f3rych autor stara si\u0119 opisa\u0107 je w jak najbardziej przyst\u0119pny spos\u00f3b. Z moich obserwacji wynika, \u017ce najcz\u0119stszym b\u0142\u0119dem wielu poradnik\u00f3w jest skupienie si\u0119 tylko i wy\u0142\u0105cznie na kwestii kodu. Stosowaniu odpowiednich operator\u00f3w i ich podstawowym wykorzystaniu bez wcze\u015bniejszego wyja\u015bnienia, czym w rzeczywisto\u015bci s\u0105 wska\u017aniki. Dlatego zaczniemy w\u0142a\u015bnie od tej kwestii.<\/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-31864fc elementor-widget elementor-widget-image\" data-id=\"31864fc\" 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:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/tabela-pamiec.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"tabela pamiec\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgwMzkzIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wNVwvdGFiZWxhLXBhbWllYy5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"333\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/tabela-pamiec.png\" class=\"attachment-large size-large wp-image-80393\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/tabela-pamiec.png 697w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/tabela-pamiec-300x143.png 300w\" sizes=\"(max-width: 697px) 100vw, 697px\" \/>\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\">Przyk\u0142adowa struktura pami\u0119ci w mikrokontrolerze.<\/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-719b01b elementor-widget elementor-widget-text-editor\" data-id=\"719b01b\" 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 programach, kt\u00f3re uruchamiali\u015bmy do tej pory, korzystali\u015bmy z r\u00f3\u017cnego rodzaju zmiennych. Ka\u017cda z nich mia\u0142a sw\u00f3j typ i nie raz warto\u015b\u0107 pocz\u0105tkow\u0105. Jednak z perspektywy mikrokontrolera wszystkie one s\u0105 tylko ci\u0105giem zer i jedynek umieszczonym w pami\u0119ci. Tego typu sytuacj\u0119 mo\u017cecie zobaczy\u0107 w pierwszej tabeli na grafice powy\u017cej. Umie\u015bci\u0142em tam przyk\u0142adow\u0105 struktur\u0119 pami\u0119ci z zapisanymi w niej zmiennymi A, B, C i D. Ka\u017cda z nich ma pewn\u0105 warto\u015b\u0107, jednak tym, co w kontek\u015bcie wska\u017anik\u00f3w interesowa\u0107 b\u0119dzie nas najbardziej to ich adresy. Podobnie jak budynki w rzeczywisto\u015bci, tak i zmienne ukryte w pami\u0119ci mikrokontrolera musz\u0105 mie\u0107 sw\u00f3j unikalny adres. Bez niego pami\u0119\u0107 by\u0142aby tylko zbiorem losowych warto\u015bci i musieliby\u015bmy zgadywa\u0107 czy 0x05 to zmienna A, B, czy co\u015b zupe\u0142nie innego.<\/p><p style=\"font-weight: 400\">Gdy wiemy ju\u017c, \u017ce adresy odgrywaj\u0105 bardzo wa\u017cn\u0105 rol\u0119, przyjrze\u0107 mo\u017cemy si\u0119 drugiej tabeli symbolizuj\u0105cej pami\u0119\u0107. Zapisane s\u0105 w niej te same zmienne A, B, C i D, ale poza tym umie\u015bci\u0142em tam te\u017c co\u015b takiego jak \u201eWska\u017anik na C\u201d i \u201eWska\u017anik na B\u201d. Pierwszy z nich umieszczony zosta\u0142 pod adresem 0x00 i przechowuje warto\u015b\u0107 0x1C. Jak \u0142atwo zauwa\u017cy\u0107 warto\u015b\u0107 ta jest identyczna jak adres zmiennej C. Analogicznie \u201eWska\u017anik na B\u201d umieszczony pod adresem 0x1D przechowuje warto\u015b\u0107 0x03, kt\u00f3ra jest identyczna jak adres zmiennej B. By\u0107 mo\u017ce ju\u017c w tym momencie, wiecie o co chodzi we wska\u017anikach. S\u0105 to pewne specyficzne zmienne, kt\u00f3re nazywamy <strong>zmiennymi wska\u017anikowymi<\/strong>. One r\u00f3wnie\u017c maj\u0105 sw\u00f3j typ nazywany typem wska\u017anikowym i przechowuj\u0105 warto\u015bci odpowiadaj\u0105ce adresom innych zmiennych, mo\u017cna powiedzie\u0107, \u017ce w pewien spos\u00f3b wskazuj\u0105 na nie. I tak w przyk\u0142adzie z powy\u017cszej grafiki \u201eWska\u017anik na C\u201d wskazuje miejsce w pami\u0119ci, w kt\u00f3rym zapisana jest zmienna C. Podobnie \u201eWska\u017anik na B\u201d przechowuje adres zmiennej B.<\/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-d943e16 elementor-widget elementor-widget-image\" data-id=\"d943e16\" 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:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskaznik-na-wskaznik.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"wskaznik na wskaznik\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgwMzk3IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wNVwvd3NrYXpuaWstbmEtd3NrYXpuaWsucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"447\" height=\"339\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskaznik-na-wskaznik.png\" class=\"attachment-large size-large wp-image-80397\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskaznik-na-wskaznik.png 447w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskaznik-na-wskaznik-300x228.png 300w\" sizes=\"(max-width: 447px) 100vw, 447px\" \/>\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\">Struktura pami\u0119ci z wieloma wska\u017anikami.<\/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-ff6fa29 elementor-widget elementor-widget-text-editor\" data-id=\"ff6fa29\" 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\">Warto wiedzie\u0107, \u017ce wska\u017aniki same w sobie te\u017c zajmuj\u0105 pewne miejsce w pami\u0119ci mikrokontrolera i maj\u0105 sw\u00f3j unikalny adres. Dlatego nic nie stoi na przeszkodzie, aby tworzy\u0107 wska\u017aniki wskazuj\u0105ce na inny wska\u017anik, kt\u00f3ry te\u017c mo\u017ce wskazywa\u0107 na kolejny wska\u017anik, tak jak na grafice powy\u017cej. W rzeczywisto\u015bci jednak takie konstrukcje stosowane s\u0105 do\u015b\u0107 rzadko, zazwyczaj wystarczaj\u0105cy jest ju\u017c pojedynczy wska\u017anik wywo\u0142uj\u0105cy jak\u0105\u015b zmienn\u0105.<\/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-880e829 elementor-widget elementor-widget-heading\" data-id=\"880e829\" 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\">Wska\u017aniki w rzeczywisto\u015bci<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-12e0281 elementor-widget elementor-widget-text-editor\" data-id=\"12e0281\" 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\">Gdy wiemy ju\u017c mniej wi\u0119cej, czym \u201efizycznie\u201d s\u0105 wska\u017aniki mo\u017cemy przej\u015b\u0107 do ich rzeczywistego wykorzystania i sprawdzenia jak dzia\u0142aj\u0105. W tym celu utworzy\u0142em projekt o nazwie pointers, obw\u00f3d, z kt\u00f3rego korzystali\u015bmy przy okazji poprzednich materia\u0142\u00f3w, mo\u017ce pozosta\u0107 bez zmian. W tym przypadku wykorzystywa\u0107 b\u0119dziemy przede wszystkim serial monitor wbudowany w Visual Studio Code, tak wi\u0119c pami\u0119tajcie, aby umie\u015bci\u0107 odpowiednie komendy aktywuj\u0105ce tak zwany strumie\u0144 wyj\u015bciowy USB w pliku CMakeLists.txt. W pierwszym programie, kt\u00f3ry ju\u017c za moment om\u00f3wimy, stworzymy pojedynczy wska\u017anik, kt\u00f3ry przechowywa\u0107 b\u0119dzie adres typowej zmiennej.<\/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-f494f76 elementor-widget elementor-widget-text-editor\" data-id=\"f494f76\" 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 \/><br \/>uint8_t variable = 167;<br \/>uint8_t *pointer; \/\/declaration of pointer<br \/><br \/>int main() {<br \/>\u00a0 \u00a0 stdio_init_all();<br \/><br \/>\u00a0 \u00a0 pointer = &amp;variable; \/\/address assignment to the pointer<br \/><br \/>  \u00a0 while(true) {<br \/>\u00a0 \u00a0 \u00a0 \u00a0 printf(\"variable value: 0x%X, variable addr: %p \\n\\r\", variable, pointer);<br \/><br \/>  \u00a0 \u00a0 \u00a0 sleep_ms(1000);<br \/>  \u00a0 }<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-3fea25e elementor-widget elementor-widget-text-editor\" data-id=\"3fea25e\" 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\">Tym razem tworzymy w kodzie typow\u0105 zmienn\u0105 typu uint8_t o nazwie variable i warto\u015bci pocz\u0105tkowej 167 i to w\u0142a\u015bnie z tego elementu spr\u00f3bujemy w dalszej cz\u0119\u015bci wyci\u0105gn\u0105\u0107 adres. Kolejno tworzymy wska\u017anik o nazwie pointer. Tego typu konstrukty tworzymy poprzez dodanie przed jego nazw\u0105 znaku gwiazdki \u201e*\u201d. Poza tym, jak mo\u017cecie zauwa\u017cy\u0107 przed definicj\u0105 wska\u017anika \u201e*pointer\u201d znalaz\u0142 si\u0119 typ uint8_t, a przecie\u017c jeszcze przed momentem pisa\u0142em, \u017ce wska\u017aniki maj\u0105 sw\u00f3j w\u0142asny typ, czyli po prostu typ wska\u017anikowy. Sk\u0105d w takim razie wzi\u0105\u0142 si\u0119 tutaj typowy dla zmiennych uint8_t? W przypadku wska\u017anik\u00f3w typ umieszczony przed jego zdefiniowaniem okre\u015bla, na jaki typ danych b\u0119dzie on wskazywa\u0107. W naszym przypadku b\u0119dziemy chcieli wyci\u0105gn\u0105\u0107 adres zmiennej typu uint8_t, dlatego w\u0142a\u015bnie ten typ nale\u017cy umie\u015bci\u0107 przed wska\u017anikiem. Do\u015b\u0107 cz\u0119sto mo\u017cna spotka\u0107 si\u0119 ze skr\u00f3tem my\u015blowym typu \u201etworzymy wska\u017anik typu uint16_t\u201d. Trzeba w\u00f3wczas pami\u0119ta\u0107, \u017ce nie jest to typ wska\u017anika, bo te maj\u0105 sw\u00f3j w\u0142asny typ, a jedynie informacja, na jaki typ danych b\u0119dzie pokazywa\u0107 wska\u017anik.<\/p><p style=\"font-weight: 400\">Gdy stworzyli\u015bmy ju\u017c odpowiedni\u0105 zmienn\u0105 oraz wska\u017anik mo\u017cemy przypisa\u0107 do niego adres. Operacja ta wykonywana jest wewn\u0105trz g\u0142\u00f3wnej funkcji main. Do wska\u017anika pointer, dzi\u0119ki tak zwanemu operatorowi wy\u0142uskania adresu \u201e&amp;\u201d przypisujemy miejsce w pami\u0119ci, kt\u00f3re przypad\u0142o zmiennej variable.<\/p><p style=\"font-weight: 400\">W niesko\u0144czonej p\u0119tli while skorzystamy z poznanego ju\u017c wcze\u015bniej polecenia printf, dzi\u0119ki kt\u00f3remu prze\u015blemy dane z RP2040 na ekran komputera. Funkcja ta wymaga jednak pewnego wyja\u015bnienia, poniewa\u017c zastosowa\u0142em tutaj dwa do tej pory niewykorzystywane specyfikatory. Pierwszym z nich jest \u201e%X\u201d, w jego miejsce wpadnie variable, jednak do tej pory, gdy chcieli\u015bmy wy\u015bwietli\u0107 warto\u015b\u0107 zmiennej, korzystali\u015bmy z \u201e%d\u201d lub \u201e%f\u201d. Tutaj r\u00f3wnie\u017c mogliby\u015bmy wstawi\u0107 \u201e%d\u201d, w\u00f3wczas w serial monitorze pojawi\u0142oby si\u0119 167, czyli warto\u015b\u0107 variable. Jednak dzi\u0119ki specyfikatorom \u201e%x\u201d oraz \u201e%X\u201d, zmienna przedstawiona zostanie jako warto\u015b\u0107 heksadecymalna. R\u00f3\u017cnica mi\u0119dzy ma\u0142ym i du\u017cym znakiem \u201ex\u201d, definiuje form\u0119 tej warto\u015bci. 167 w systemie szesnastkowym to 0xA7 i w\u0142a\u015bnie w taki spos\u00f3b zmienna powinna by\u0107 wy\u015bwietlana na ekranie komputera. Je\u015bli w kodzie umieszczony by\u0142by ma\u0142y znak \u201e%x\u201d, warto\u015b\u0107 variable ukazana by\u0142aby jako 0xa7. Drugi ze specyfikator\u00f3w, czyli \u201e%p\u201d r\u00f3wnie\u017c jest nowo\u015bci\u0105. Jest to specjalny zapis dedykowany w\u0142a\u015bnie dla wska\u017anik\u00f3w lub szerzej adres\u00f3w w pami\u0119ci. W jego miejsce wstawiona zostanie warto\u015b\u0107 przechowywana w pointer.<\/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-df16173 elementor-widget elementor-widget-image\" data-id=\"df16173\" 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:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskazniki1_png.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"wskazniki1_png\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgwNDAxIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wNVwvd3NrYXpuaWtpMV9wbmcucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"636\" height=\"143\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskazniki1_png.png\" class=\"attachment-large size-large wp-image-80401\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskazniki1_png.png 636w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskazniki1_png-300x67.png 300w\" sizes=\"(max-width: 636px) 100vw, 636px\" \/>\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\">Okno serial monitora po uruchomieniu kodu.<\/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-bfe93c9 elementor-widget elementor-widget-text-editor\" data-id=\"bfe93c9\" 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 i otwarciu serial monitora mo\u017cemy zobaczy\u0107, \u017ce RPI wysy\u0142a zebrane informacje o zmiennej variable. Jej warto\u015b\u0107 w postaci heksadecymalnej \u2013 0xA7 oraz adres, pod jakim zmienna ta umieszczona zosta\u0142a w pami\u0119ci mikrokontrolera, czyli 20000BB0.<\/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-fdde43f elementor-widget elementor-widget-heading\" data-id=\"fdde43f\" 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\">Wska\u017aniki na wska\u017aniki <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b454587 elementor-widget elementor-widget-text-editor\" data-id=\"b454587\" 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\">Spr\u00f3bujmy nieco rozbudowa\u0107 program, kt\u00f3ry uruchomili\u015bmy przed chwil\u0105. Dodamy do niego kolejny wska\u017anik, dzi\u0119ki kt\u00f3remu sprawdzimy, w jakim miejscu umieszczony zosta\u0142 nasz pierwotny wska\u017anik. Poza tym dodamy te\u017c sta\u0142\u0105 i tutaj r\u00f3wnie\u017c sprawdzimy, w kt\u00f3rym miejscu pami\u0119ci zosta\u0142a ona umieszczona.<\/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-8122eba elementor-widget elementor-widget-text-editor\" data-id=\"8122eba\" 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 \/><br \/>uint8_t variable = 167;<br \/>uint8_t *pointer; \/\/declaration of pointer<br \/>uint8_t **pointer_to_pointer; \/\/declaration of pointer to pionter<br \/><br \/>const float conversion_factor = 3.3\/4095;<br \/>const float *conversion_factor_pointer; \/\/declaration of pointer<br \/><br \/>int main() {<br \/>\u00a0 \u00a0 stdio_init_all();<br \/><br \/>  \u00a0 \/\/address assignment to the pointer<br \/>  \u00a0 pointer = &amp;variable;<br \/>  \u00a0 pointer_to_pointer = &amp;pointer;<br \/>  \u00a0 conversion_factor_pointer = &amp;conversion_factor;<br \/><br \/>  \u00a0 while(true) {<br \/>  \u00a0 \u00a0 \u00a0 printf(\"variable value: 0x%X, variable addr: %p \\n\\r\", variable, pointer);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 printf(\"pointer addr: %p \\n\\r\", pointer_to_pointer);<br \/>  \u00a0 \u00a0 \u00a0 printf(\"conversion_factor value: %f, conversion_factor addr: %p\\n\\r\", conversion_factor, conversion_factor_pointer);<br \/><br \/>  \u00a0 \u00a0 \u00a0 sleep_ms(1000);<br \/>  \u00a0 }<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-90a5dea elementor-widget elementor-widget-text-editor\" data-id=\"90a5dea\" 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\">Tym razem kod jest ju\u017c nieco d\u0142u\u017cszy, doda\u0142em do niego deklaracj\u0119 drugiego wska\u017anika, kt\u00f3ry wskazywa\u0107 b\u0119dzie na wcze\u015bniej stworzony wska\u017anik. Jest to w\u0142a\u015bnie konstrukcja wska\u017anika na wska\u017anik, czyli pierwszy wska\u017anik \u201epointer\u201d przechowuje adres zmiennej variable, natomiast pod drugim wska\u017anikiem \u201epointer_to_pointer\u201d kry\u0107 b\u0119dzie si\u0119 adres pierwszego wska\u017anika. Taki tw\u00f3r, kt\u00f3ry nazwa\u0107 mo\u017cemy wska\u017anikiem drugiego stopnia, deklarujemy przez dodanie drugiej gwiazdki, przy nazwie wska\u017anika \u201e**pointer_to_pointer. Poza tym w kodzie doda\u0142em sta\u0142\u0105 conversion_factor, z kt\u00f3rej korzystali\u015bmy ju\u017c w poprzednich artyku\u0142ach. Przechowuje ona zmiennoprzecinkowy wynik dzia\u0142ania 3,3\/4095. Wska\u017anik, kt\u00f3ry przechowywa\u0107 b\u0119dzie adres tej zmiennej, deklarujemy podobnie jak poprzednio, uwag\u0119 trzeba zwr\u00f3ci\u0107 jedynie, \u017ce w przypadku sta\u0142ych, przy wska\u017aniku r\u00f3wnie\u017c musi znale\u017a\u0107 si\u0119 s\u0142owo kluczowe \u201econst\u201d.<\/p><p style=\"font-weight: 400\">W pocz\u0105tkowej cz\u0119\u015bci funkcji main, dzi\u0119ki operatorowi wy\u0142uskania adresu przypisujemy warto\u015bci do kolejnych wska\u017anik\u00f3w. Na pocz\u0105tku do pointer przydzielamy adres zmiennej variable, nast\u0119pnie w pointer_to_pointer zapisujemy adres wska\u017anika pointer i na ko\u0144cu do conversion_factor_pointer przypisujemy miejsce w pami\u0119ci, w kt\u00f3rym zapisano zmienn\u0105 conversion_factor.<\/p><p style=\"font-weight: 400\">W g\u0142\u00f3wnej p\u0119tli while dzi\u0119ki poleceniom printf wy\u015bwietlimy kolejne warto\u015bci zapisane w zmiennych i wska\u017anikach. Pierwsza instrukcja jest ju\u017c nam zanana, prze\u015ble ona na ekran komputera warto\u015bci ukryte w variable oraz pointer. Nast\u0119pnie wy\u015bwietlimy adres wska\u017anika pointer i w ostatnim kroku dane zapisane w conversion_factor i conversion_factor_pointer.<\/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-3c7251c elementor-widget elementor-widget-image\" data-id=\"3c7251c\" 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:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskazniki2_png.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"wskazniki2_png\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgwNDA1IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wNVwvd3NrYXpuaWtpMl9wbmcucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"695\" height=\"119\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskazniki2_png.png\" class=\"attachment-large size-large wp-image-80405\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskazniki2_png.png 695w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskazniki2_png-300x51.png 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/>\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\">Adresy zmiennych i wska\u017anik\u00f3w z drugiego przyk\u0142adu.<\/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-9d14b57 elementor-widget elementor-widget-text-editor\" data-id=\"9d14b57\" 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 zobaczy\u0107 mo\u017cemy liczbow\u0105 reprezentacj\u0119 miejsc w pami\u0119ci, w kt\u00f3rych zapisane zosta\u0142y zmienne oraz wska\u017anik. Jak wida\u0107, adres variable pozosta\u0142 bez zmian i nadal jest to 20000BB0. Co ciekawe wska\u017anik pointer zapisany zosta\u0142\u00a0w jej okolicy pod adresem 200017E4. Z drugiej strony sta\u0142a z naszego programu umieszczona zosta\u0142a w ca\u0142kowicie innej cz\u0119\u015bci pami\u0119ci pod adresem 10006E0C.<\/p><p style=\"font-weight: 400\">Tym sposobem prze\u0107wiczyli\u015bmy pierwsze u\u017cycie wska\u017anik\u00f3w, podgl\u0105daj\u0105c adresy w pami\u0119ci RP2040. Jednak tego typu programy s\u0105 jedynie pewn\u0105 ciekawostk\u0105 i nie wykorzystuj\u0105 one pe\u0142nego potencja\u0142u wska\u017anik\u00f3w. We wi\u0119kszo\u015bci kod\u00f3w nikt nie podgl\u0105da adres\u00f3w, pod kt\u00f3rymi umieszczone zosta\u0142y zmienne, bo taka wiedza jest potencjalnemu u\u017cytkownikowi sprz\u0119tu zb\u0119dna. Dlatego w\u0142a\u015bnie przejd\u017amy do bardziej praktycznego aspektu wska\u017anik\u00f3w.<\/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-b30a36e elementor-widget elementor-widget-heading\" data-id=\"b30a36e\" 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\">Co mo\u017cna robi\u0107 na wska\u017anikach?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e7194a6 elementor-widget elementor-widget-text-editor\" data-id=\"e7194a6\" 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\">Wiemy ju\u017c, \u017ce wska\u017anik to specjalny typ zmiennej, kt\u00f3ra przechowywa\u0107 mo\u017ce adres w pami\u0119ci, pod kt\u00f3rym znajdowa\u0107 mog\u0105 si\u0119 inne dane. Dzi\u0119ki temu operacje wykonywa\u0107 mo\u017cemy zar\u00f3wno na zapisanym adresie, jak i warto\u015bci, na kt\u00f3r\u0105 ten adres wskazuje. \u00a0\u00a0\u00a0<\/p><p style=\"font-weight: 400\">Na pierwszy ogie\u0144 we\u017amy operacj\u0119, kt\u00f3re wykona\u0107 mo\u017cemy na samym adresie wska\u017anika, bo z nim mo\u017cemy zrobi\u0107 w gruncie rzeczy niewiele. Dane adresowe mo\u017cemy tylko dodawa\u0107 i odejmowa\u0107, przy czym nie jest to do ko\u0144ca zwyczajne dodawanie i odejmowanie. Dodatkowo co nie jest zapewne wi\u0119kszym zaskoczeniem, adresy mo\u017cemy przypisywa\u0107 te\u017c do innych zmiennych. Zatrzymajmy si\u0119 jednak na moment przy \u201eniezwyczajnych\u201d operacjach dodawania i odejmowania. Dla przyk\u0142adu przeanalizujmy sobie tak\u0105 sytuacj\u0119. Mamy trzy wska\u017aniki wskazuj\u0105ce na r\u00f3\u017cne typy danych, do kt\u00f3rych oddajemy jeden, dla uproszczenia za\u0142\u00f3\u017cmy, \u017ce adres ka\u017cdego ze wska\u017anik\u00f3w jest zerem.<\/p><p>uint8_t *pointer1;<br \/>uint16_t *pointer2;<br \/>uint32_t *pointer3;<br \/><br \/>pointer1 ++;<br \/>pointer2 ++;<br \/>pointer3 ++;<\/p><p style=\"font-weight: 400\">Jak wygl\u0105da\u0107 b\u0119d\u0105 adresy po takiej operacji? Mo\u017ce by\u0107 to nieco zaskakuj\u0105ce, ale warto\u015b\u0107 pointer1 r\u00f3wna b\u0119dzie 0x01, pointer2 = 0x02, a pointer3 = 0x04. Ju\u017c na pierwszy rzut oka mo\u017cna powiedzie\u0107, \u017ce co\u015b tu jest nie tak.<\/p><p>pointer1 ++;\u00a0\u00a0\u00a0\u00a0 \/\/0x00 + 1 = 0x01<br \/>pointer2 ++;\u00a0\u00a0\u00a0\u00a0 \/\/0x00 + 1 = 0x02<br \/>pointer3 ++;\u00a0\u00a0\u00a0\u00a0 \/\/0x00 + 1 = 0x04<\/p><p style=\"font-weight: 400\">Mimo \u017ce wyniki te s\u0105 do\u015b\u0107 nieintuicyjne, to s\u0105 jak najbardziej poprawne, poniewa\u017c musimy pami\u0119ta\u0107, \u017ce dzia\u0142ania wykonujemy na adresach, a nie zwyczajnych liczbach. Uwag\u0119 trzeba zwr\u00f3ci\u0107 te\u017c na typ danych, na jakie wskazuje wska\u017anik. Pojedyncza zmienna typu uint8_t umieszczona jest w pami\u0119ci pod pojedynczym adresem, wszak\u017ce z\u0142o\u017cona jest ona z o\u015bmiu pojedynczych bit\u00f3w. Jednak uint16_t zbudowany jest ju\u017c z szesnastu bit\u00f3w, dlatego chc\u0105c przeskoczy\u0107 o jeden adres, musimy w rzeczywisto\u015bci przej\u015b\u0107 dwa kroki. Analogicznie pojedynczy uint32_t umieszczony jest w pami\u0119ci pod czterema adresami, dlatego dodaj\u0105c jedynk\u0119, przeskakujemy o cztery kom\u00f3rki w pami\u0119ci, tak aby zmienna wska\u017anikowa wskazywa\u0142a na najm\u0142odsze osiem bit\u00f3w kolejnej zmiennej.<\/p><p style=\"font-weight: 400\">Znacznie wi\u0119ksze mo\u017cliwo\u015bci zyskujemy, gdy za pomoc\u0105 wska\u017anik\u00f3w odwo\u0142ywa\u0107 b\u0119dziemy si\u0119 do danych, na kt\u00f3re wska\u017anik pokazuje. Przeanalizujmy sobie teraz prosty przyk\u0142ad, w kt\u00f3rym w\u0142a\u015bnie taka okr\u0119\u017cn\u0105 drog\u0105 odwo\u0142amy si\u0119 do warto\u015bci zmiennej. Skorzysta\u0107 mo\u017cemy z wcze\u015bniej uruchamianego kodu, ale wprowadzimy w nim oczywi\u015bcie pewne modyfikacje.<\/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-4b3bb0d elementor-widget elementor-widget-text-editor\" data-id=\"4b3bb0d\" 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 \/><br \/>uint8_t variable = 167;<br \/>uint8_t *pointer; \/\/declaration of pointer<br \/>uint8_t **pointer_to_pointer; \/\/declaration of pointer to pointer<br \/><br \/>const float conversion_factor = 3.3\/4095;<br \/>const float *conversion_factor_pointer; \/\/declaration of pointer<br \/><br \/>int main() {<br \/>\u00a0 \u00a0 stdio_init_all();<br \/><br \/>  \u00a0 \/\/address assignment to the pointer<br \/>  \u00a0 pointer = &amp;variable;<br \/>  \u00a0 pointer_to_pointer = &amp;pointer;<br \/>  \u00a0 conversion_factor_pointer = &amp;conversion_factor;<br \/><br \/>  \u00a0 while(true) {<br \/>  \u00a0 \u00a0 \u00a0 printf(\"variable value: 0x%X, variable addr: %p \\n\\r\", variable, pointer);<br \/>  \u00a0 \u00a0 \u00a0 (*pointer)++;<br \/>  \u00a0 \u00a0 \u00a0 printf(\"variable value: 0x%X, variable addr: %p \\n\\r\", variable, pointer);<br \/>  \u00a0 \u00a0 \u00a0 printf(\"pointer addr: %p \\n\\r\", pointer_to_pointer);<br \/>\u00a0 \u00a0 \u00a0 \u00a0 printf(\"conversion_factor value: %f, conversion_factor addr: %p\\n\\r\", conversion_factor, conversion_factor_pointer);<br \/><br \/>  \u00a0 \u00a0 \u00a0 sleep_ms(1000);<br \/>  \u00a0 }<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-e8b20dd elementor-widget elementor-widget-text-editor\" data-id=\"e8b20dd\" 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\">Poprzednim razem wy\u015bwietlali\u015bmy warto\u015b\u0107 oraz adres zmiennej variable. W tym programie b\u0119dziemy z ka\u017cdym przebiegiem niesko\u0144czonej p\u0119tli while dodawa\u0107 do zmiennej jeden. Tego typu funkcjonalno\u015b\u0107 mogliby\u015bmy zrealizowa\u0107 oczywi\u015bcie poprzez komend\u0119 variable++;, ale skoro omawiamy wska\u017aniki, to do wn\u0119trza zmiennej dosta\u0144my si\u0119 w\u0142a\u015bnie z jego pomoc\u0105. W kodzie dodane zosta\u0142o polecenie (*pointer)++;, kt\u00f3re jest w\u0142a\u015bnie niczyim innym, jak odwo\u0142aniem do zmiennej variable i zwi\u0119kszenie jej warto\u015bci o jeden. Korzystamy tutaj ze wska\u017anika, kt\u00f3ry dzi\u0119ki operatorowi wy\u0142uskania adresu przechowuje adres zmiennej. Tym sposobem odwo\u0142ali\u015bmy si\u0119 do danych okr\u0119\u017cn\u0105 drog\u0105, poprzez zmienn\u0105 wska\u017anikow\u0105. Dodatkowo w kodzie podwoi\u0142em polecenie printf, tak aby na monitorze portu szeregowego widzie\u0107 jedn\u0105 pod drug\u0105, poprzedni\u0105 i aktualn\u0105 warto\u015b\u0107 variable.<\/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-223d33b elementor-widget elementor-widget-image\" data-id=\"223d33b\" 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:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskaxniki3_png.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"wskaxniki3_png\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgwNDA5IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wNVwvd3NrYXhuaWtpM19wbmcucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"315\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskaxniki3_png.png\" class=\"attachment-large size-large wp-image-80409\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskaxniki3_png.png 888w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskaxniki3_png-300x118.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/wskaxniki3_png-768x303.png 768w\" 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\">Zwi\u0119kszaj\u0105ca si\u0119 warto\u015b\u0107 variable z przyk\u0142adu.<\/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-6100112 elementor-widget elementor-widget-text-editor\" data-id=\"6100112\" 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 i otwarciu monitora portu szeregowego mo\u017cemy zobaczy\u0107 zmieniaj\u0105c\u0105 si\u0119 warto\u015b\u0107 zmiennej variable, z 0xB7 na 0xB8, z 0xB8 na 0xB9 i tak dalej. Oczywi\u015bcie operacji, kt\u00f3re wykona\u0107 mo\u017cemy na danych spod wska\u017anika, jest znacznie wi\u0119cej, a w zasadzie s\u0105 to wszystkie operacje, kt\u00f3re poznali\u015bmy do tej pory, poniewa\u017c odwo\u0142anie si\u0119 poprzez wska\u017anik do danych mo\u017cemy traktowa\u0107 identycznie jak odwo\u0142anie do zwyk\u0142ej zmiennej.<\/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-ec7423d elementor-widget elementor-widget-heading\" data-id=\"ec7423d\" 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\">Timery w RPI Pico W<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-774f2a1 elementor-widget elementor-widget-text-editor\" data-id=\"774f2a1\" 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\">RP2040 jak ka\u017cdy wsp\u00f3\u0142czesny mikrokontroler wyposa\u017cony jest w sprz\u0119towe timery. Z ich pomoc\u0105 mo\u017cemy generowa\u0107 precyzyjne interwa\u0142y czasowe oraz wywo\u0142ywa\u0107 funkcje zwrotne zwane <strong>callbackami<\/strong>. Ten rodzaj funkcji poznali\u015bmy ju\u017c przy okazji wywo\u0142ywania przerwa\u0144 i alarm\u00f3w. Timer\u00f3w w Raspberry Pi Pico jest kilka i wykorzystuje si\u0119 je przede wszystkim do odmierzania czasu. Je\u015bli w budowanym projekcie chcemy, aby konkretna funkcjonalno\u015b\u0107 wykonywa\u0142a si\u0119 cyklicznie, mo\u017cemy w\u00f3wczas skorzysta\u0107 z timera. Mo\u017ce to by\u0107 przyk\u0142adowo synchroniczny odczyt temperatury, od kt\u00f3rego zale\u017cy pr\u0119dko\u015b\u0107 obrot\u00f3w pod\u0142\u0105czonego do RPI wentylatora. W poprzednim artykule poznali\u015bmy ju\u017c funkcj\u0119 alarmu, kt\u00f3ra wywo\u0142ywa\u0142a wykonywany raz fragment kodu. Pod tym wzgl\u0119dem timery s\u0105 do\u015b\u0107 podobne, z t\u0105 r\u00f3\u017cnic\u0105, \u017ce wywo\u0142uj\u0105 odpowiedni callback cyklicznie, co okre\u015blony czas.<\/p><p style=\"font-weight: 400\">Funkcj\u0119 timera sprawdzimy na podstawie prostego programu, w kt\u00f3rym b\u0119dziemy mruga\u0107 diod\u0105 LED, podobnie jak w pierwszym uruchamianym programie. W\u00f3wczas korzystali\u015bmy z blokuj\u0105cej procesor funkcji sleep_ms, tym razem jednak naprzemienne w\u0142\u0105czanie i wy\u0142\u0105cznie diody b\u0119dzie bardziej finezyjne. Do test\u00f3w przygotowa\u0142em nowy projekt o nazwie blink_timer.<\/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-41fdf21 elementor-widget elementor-widget-text-editor\" data-id=\"41fdf21\" 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\"<\/pre><p>\u00a0<\/p><p>#define GREEN_LED 0<\/p><p>bool led_status = false;<\/p><p>\/\/function called after an interrupt from the timer<br \/>bool tCallback(repeating_timer_t *timer){<br \/>\u00a0 led_status = !led_status;<br \/>\u00a0 gpio_put(GREEN_LED, led_status);<br \/>}<\/p><p>int main() {<br \/>\u00a0 \u00a0 stdio_init_all();<\/p><p>\u00a0 gpio_init(GREEN_LED);<br \/>\u00a0 gpio_set_dir(GREEN_LED, GPIO_OUT);<br \/>\u00a0 \u00a0 gpio_put(GREEN_LED, false);<\/p><p>\u00a0 struct repeating_timer timer; \/\/structure declaration<br \/>add_repeating_timer_ms(500,tCallback,NULL,&amp;timer); \/\/starting the timer<\/p><p>\u00a0 while(true) {<br \/>\u00a0 \u00a0 \u00a0 tight_loop_contents(); \/\/do nothing functions<br \/>\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-c517004 elementor-widget elementor-widget-text-editor\" data-id=\"c517004\" 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\">Aby dobrze zrozumie\u0107 dzia\u0142anie timer\u00f3w, przeanalizujmy widoczny powy\u017cej program. Przypomina on nieco kod uruchamiany przy okazji omawiania przerwa\u0144 i nic w tym dziwnego, bo jego struktura jest do\u015b\u0107 podobna. Warto wiedzie\u0107, \u017ce w rzeczywisto\u015bci bazuj\u0105 na przerwaniach. Gdy modu\u0142 ten przekroczy okre\u015blony przez u\u017cytkownika czas, generowane jest przerwanie, kt\u00f3rego efektem jest wywo\u0142anie callbacka, w kt\u00f3rego wn\u0119trzu umieszczony powinien by\u0107 odpowiedni kod reaguj\u0105cy na powsta\u0142\u0105 sytuacj\u0119.<\/p><p style=\"font-weight: 400\">W pocz\u0105tkowej cz\u0119\u015bci programu, jak zwykle znalaz\u0142y si\u0119 deklaracje bibliotek, definicja zielonej diody LED oraz utworzenie zmiennej led_status, kt\u00f3ra jak sam nazwa wskazuje, b\u0119dzie przechowywa\u0107 stan, w jakim aktualnie powinna znajdowa\u0107 si\u0119 dioda. Domy\u015bln\u0105 warto\u015bci\u0105 tej zmiennej jest false, czyli stan niski.<\/p><p style=\"font-weight: 400\">Nast\u0119pnie tworzymy callback, kt\u00f3ry uruchomiany zostanie, gdy timer zostanie przepe\u0142niony. Innymi s\u0142owy, osi\u0105gnie on warto\u015b\u0107 odpowiadaj\u0105c\u0105 konkretnej jednostce czasu, okre\u015blonej przez u\u017cytkownika. W argumencie tej funkcji przekazujemy wska\u017anik na *timer, jest on cz\u0119\u015bci\u0105 pewnej struktury, o kt\u00f3rej wi\u0119cej wspomn\u0119 ju\u017c za moment. We wn\u0119trzu callbacka znalaz\u0142\u00a0si\u0119 kod, kt\u00f3ry zmienia status diody LED. W pierwszym kroku zmieniamy stan zmiennej led_status na przeciwny, a nast\u0119pnie przypisujemy go do diody LED.<\/p><p style=\"font-weight: 400\">W g\u0142\u00f3wnej funkcji main, poza znanymi ju\u017c poleceniami zwi\u0105zanymi z inicjalizacj\u0105 diody LED, znalaz\u0142a si\u0119 te\u017c deklaracja struktury repeating_timer oraz funkcja uruchamiaj\u0105ca timer. Struktury s\u0105 pewnym specyficznym poj\u0119ciem w j\u0119zyku C i na ten moment nie b\u0119dziemy si\u0119 nimi zajmowa\u0107. G\u0142\u00f3wnie przez fakt, \u017ce tutaj wykorzystana zosta\u0142a ona w do\u015b\u0107 specyficzny spos\u00f3b. W tym momencie musicie wiedzie\u0107 tylko, \u017ce struktury pozwalaj\u0105 grupowa\u0107 pewne zmienne we wi\u0119ksze \u201epaczki\u201d i w tym przypadku struktura zawiera tylko jeden o nazwie timer. Jej zastosowanie jest tutaj niestety niezb\u0119dne, dlatego wr\u00f3cimy do niej w kolejnym artykule, gdy przedstawi\u0119 wam struktury w nieco szerszym spektrum.<\/p><p style=\"font-weight: 400\">Poleceniem uruchamiaj\u0105cym timer jest add_repeating_timer_ms, w argumentach podajmy kolejno: czas, jaki odmierza\u0107 ma timer, w tym przypadku jest to 500ms, nazw\u0119 funkcji callback, kt\u00f3ra ma by\u0107 wywo\u0142ana po odliczeniu czasu, kolejnym argumentem mog\u0105 by\u0107 tak zwane dane u\u017cytkownika, my jednak ich nie przekazujemy, dlatego w tym miejscu wstawiamy zerowy argument NULL. Ostatnim argumentem jest adres elementu wcze\u015bniej wspomnianej struktury. Stworzony dzi\u0119ki operatorowi wy\u0142uskania adresu.<\/p><p style=\"font-weight: 400\">W ten spos\u00f3b kod jest gotowym, ale aby dzia\u0142a\u0142 poprawnie do niesko\u0144czonej p\u0119tli while trzeba wrzuci\u0107 poznane ju\u017c wcze\u015bniej polecenie \u201enie r\u00f3b nic\u201d, czyli tight_loop_contents.<\/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-e9be9ee elementor-widget elementor-widget-video\" data-id=\"e9be9ee\" 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:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/IMG_1294.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-c1f66e8 elementor-widget elementor-widget-text-editor\" data-id=\"c1f66e8\" 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 programu mo\u017cemy zobaczy\u0107, \u017ce zielona dioda LED jest synchronicznie w\u0142\u0105czana i wy\u0142\u0105czana, co 500ms, tak jak zadeklarowali\u015bmy w poleceniu uruchamiaj\u0105cym timer. Co warto wspomnie\u0107, w tym przypadku procesor nie jest blokowany, gdy odmierzany jest czas. Je\u015bli chcieliby\u015bmy, w p\u0119tli while mo\u017cemy realizowa\u0107 inne zadania. Zach\u0119cam Ci\u0119 do takiego eksperymentu, mo\u017cesz spr\u00f3bowa\u0107 odczytywa\u0107 wewn\u0119trzn\u0105 temperatur\u0119 rdzenia procesora i wysy\u0142a\u0107 j\u0105 na ekran komputera, sprawdzaj\u0105c jednocze\u015bnie, czy wp\u0142ynie to na mruganie diody LED.<\/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-28e2769 elementor-widget elementor-widget-heading\" data-id=\"28e2769\" 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-41ec322 elementor-widget elementor-widget-text-editor\" data-id=\"41ec322\" 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 tym poradniku po raz pierwszy skorzystali\u015bmy ze wska\u017anik\u00f3w, na razie by\u0142y to proste testy, ale dzi\u0119ki nim wiemy ju\u017c co nieco o ich dzia\u0142aniu. W kolejnych poradnikach b\u0119dziemy do nich wraca\u0107. Poza tym uruchomili\u015bmy klasyczny blink led, ale w nieco innej ods\u0142onie. Skorzystali\u015bmy z timera, dzi\u0119ki czemu pozbyli\u015bmy si\u0119 blokuj\u0105cej procesor funkcji sleep_ms. Poza tym wspomnia\u0142em te\u017c o czym\u015b takim jak struktury, ale konceptem tym zajmiemy si\u0119 w kolejnym artykule. Dodatkowo w kolejnym poradniku porusz\u0119 kwesti\u0119 \u201emaszyny stan\u00f3w\u201d.<\/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-987177c elementor-widget elementor-widget-spacer\" data-id=\"987177c\" 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-44c1542 elementor-widget elementor-widget-text-editor\" data-id=\"44c1542\" 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>\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 ostatnim materiale kr\u00f3tko wspomnia\u0142em o czym\u015b takim jak wska\u017aniki. Nimi w\u0142a\u015bnie zajmiemy si\u0119 w pierwszej cz\u0119\u015bci tego materia\u0142u, a nast\u0119pnie przejdziemy do zagadnie\u0144 zwi\u0105zanych z timerami.<\/p>\n","protected":false},"author":34,"featured_media":81291,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7,21,134],"tags":[],"class_list":["post-80390","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 v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kurs Raspberry Pi Pico \u2013 #9 \u2013 Teoria wska\u017anik\u00f3w i timery - Botland<\/title>\n<meta name=\"description\" content=\"W ostatnim materiale kr\u00f3tko wspomnia\u0142em o czym\u015b takim jak wska\u017aniki. Nimi w\u0142a\u015bnie zajmiemy si\u0119 w pierwszej cz\u0119\u015bci tego materia\u0142u, a nast\u0119pnie przejdziemy do zagadnie\u0144 zwi\u0105zanych z timerami.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/\" \/>\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 #9 \u2013 Teoria wska\u017anik\u00f3w i timery - Botland\" \/>\n<meta property=\"og:description\" content=\"W ostatnim materiale kr\u00f3tko wspomnia\u0142em o czym\u015b takim jak wska\u017aniki. Nimi w\u0142a\u015bnie zajmiemy si\u0119 w pierwszej cz\u0119\u015bci tego materia\u0142u, a nast\u0119pnie przejdziemy do zagadnie\u0144 zwi\u0105zanych z timerami.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/\" \/>\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-05-30T12:00:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-08T08:56:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/pico_9.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=\"20 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/\"},\"author\":{\"name\":\"Rafa\u0142 Bartoszak\",\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#\\\/schema\\\/person\\\/5a69e7f5db1f77c617f990e73bb83215\"},\"headline\":\"Kurs Raspberry Pi Pico \u2013 #9 \u2013 Teoria wska\u017anik\u00f3w i timery\",\"datePublished\":\"2024-05-30T12:00:03+00:00\",\"dateModified\":\"2026-04-08T08:56:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/\"},\"wordCount\":3664,\"publisher\":{\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/pico_9.png\",\"articleSection\":[\"Elektronika\",\"Programowanie\",\"Raspberry Pi\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/\",\"url\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/\",\"name\":\"Kurs Raspberry Pi Pico \u2013 #9 \u2013 Teoria wska\u017anik\u00f3w i timery - Botland\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/pico_9.png\",\"datePublished\":\"2024-05-30T12:00:03+00:00\",\"dateModified\":\"2026-04-08T08:56:59+00:00\",\"description\":\"W ostatnim materiale kr\u00f3tko wspomnia\u0142em o czym\u015b takim jak wska\u017aniki. Nimi w\u0142a\u015bnie zajmiemy si\u0119 w pierwszej cz\u0119\u015bci tego materia\u0142u, a nast\u0119pnie przejdziemy do zagadnie\u0144 zwi\u0105zanych z timerami.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/#primaryimage\",\"url\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/pico_9.png\",\"contentUrl\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/pico_9.png\",\"width\":1510,\"height\":755},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\\\/\\\/homebook.click\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kurs Raspberry Pi&nbsp;Pico \u2013 #9 \u2013 Teoria wska\u017anik\u00f3w i&nbsp;timery\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/botland.store\\\/blog\\\/\",\"name\":\"Botland\",\"description\":\"Blog Raspberry Pi, Arduino, elektronika i robotyka - Botland\",\"publisher\":{\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/botland.store\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#organization\",\"name\":\"Botland\",\"url\":\"https:\\\/\\\/botland.store\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/botland.store\\\/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.store\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/facebook.com\\\/Botland\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#\\\/schema\\\/person\\\/5a69e7f5db1f77c617f990e73bb83215\",\"name\":\"Rafa\u0142 Bartoszak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/IMG_21531-300x300.jpg\",\"url\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/IMG_21531-300x300.jpg\",\"contentUrl\":\"https:\\\/\\\/homebook.click\\\/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:\\\/\\\/homebook.click\\\/blog\\\/author\\\/rafal-bartoszak\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kurs Raspberry Pi Pico \u2013 #9 \u2013 Teoria wska\u017anik\u00f3w i timery - Botland","description":"W ostatnim materiale kr\u00f3tko wspomnia\u0142em o czym\u015b takim jak wska\u017aniki. Nimi w\u0142a\u015bnie zajmiemy si\u0119 w pierwszej cz\u0119\u015bci tego materia\u0142u, a nast\u0119pnie przejdziemy do zagadnie\u0144 zwi\u0105zanych z timerami.","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:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/","og_locale":"pl_PL","og_type":"article","og_title":"Kurs Raspberry Pi Pico \u2013 #9 \u2013 Teoria wska\u017anik\u00f3w i timery - Botland","og_description":"W ostatnim materiale kr\u00f3tko wspomnia\u0142em o czym\u015b takim jak wska\u017aniki. Nimi w\u0142a\u015bnie zajmiemy si\u0119 w pierwszej cz\u0119\u015bci tego materia\u0142u, a nast\u0119pnie przejdziemy do zagadnie\u0144 zwi\u0105zanych z timerami.","og_url":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/","og_site_name":"Botland","article_publisher":"https:\/\/facebook.com\/Botland\/","article_published_time":"2024-05-30T12:00:03+00:00","article_modified_time":"2026-04-08T08:56:59+00:00","og_image":[{"width":1510,"height":755,"url":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/pico_9.png","type":"image\/png"}],"author":"Rafa\u0142 Bartoszak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Rafa\u0142 Bartoszak","Szacowany czas czytania":"20 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/#article","isPartOf":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/"},"author":{"name":"Rafa\u0142 Bartoszak","@id":"https:\/\/botland.store\/blog\/#\/schema\/person\/5a69e7f5db1f77c617f990e73bb83215"},"headline":"Kurs Raspberry Pi Pico \u2013 #9 \u2013 Teoria wska\u017anik\u00f3w i timery","datePublished":"2024-05-30T12:00:03+00:00","dateModified":"2026-04-08T08:56:59+00:00","mainEntityOfPage":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/"},"wordCount":3664,"publisher":{"@id":"https:\/\/botland.store\/blog\/#organization"},"image":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/#primaryimage"},"thumbnailUrl":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/pico_9.png","articleSection":["Elektronika","Programowanie","Raspberry Pi"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/","url":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/","name":"Kurs Raspberry Pi Pico \u2013 #9 \u2013 Teoria wska\u017anik\u00f3w i timery - Botland","isPartOf":{"@id":"https:\/\/botland.store\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/#primaryimage"},"image":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/#primaryimage"},"thumbnailUrl":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/pico_9.png","datePublished":"2024-05-30T12:00:03+00:00","dateModified":"2026-04-08T08:56:59+00:00","description":"W ostatnim materiale kr\u00f3tko wspomnia\u0142em o czym\u015b takim jak wska\u017aniki. Nimi w\u0142a\u015bnie zajmiemy si\u0119 w pierwszej cz\u0119\u015bci tego materia\u0142u, a nast\u0119pnie przejdziemy do zagadnie\u0144 zwi\u0105zanych z timerami.","breadcrumb":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/#primaryimage","url":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/pico_9.png","contentUrl":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/05\/pico_9.png","width":1510,"height":755},{"@type":"BreadcrumbList","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-9-teoria-wskaznikow-i-timery\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/homebook.click\/blog\/"},{"@type":"ListItem","position":2,"name":"Kurs Raspberry Pi&nbsp;Pico \u2013 #9 \u2013 Teoria wska\u017anik\u00f3w i&nbsp;timery"}]},{"@type":"WebSite","@id":"https:\/\/botland.store\/blog\/#website","url":"https:\/\/botland.store\/blog\/","name":"Botland","description":"Blog Raspberry Pi, Arduino, elektronika i robotyka - Botland","publisher":{"@id":"https:\/\/botland.store\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/botland.store\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/botland.store\/blog\/#organization","name":"Botland","url":"https:\/\/botland.store\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/botland.store\/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.store\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/Botland\/"]},{"@type":"Person","@id":"https:\/\/botland.store\/blog\/#\/schema\/person\/5a69e7f5db1f77c617f990e73bb83215","name":"Rafa\u0142 Bartoszak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2023\/07\/IMG_21531-300x300.jpg","url":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2023\/07\/IMG_21531-300x300.jpg","contentUrl":"https:\/\/homebook.click\/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:\/\/homebook.click\/blog\/author\/rafal-bartoszak\/"}]}},"_links":{"self":[{"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/posts\/80390","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/users\/34"}],"replies":[{"embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/comments?post=80390"}],"version-history":[{"count":0,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/posts\/80390\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/media\/81291"}],"wp:attachment":[{"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/media?parent=80390"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/categories?post=80390"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/tags?post=80390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}