{"id":86315,"date":"2024-08-21T09:13:26","date_gmt":"2024-08-21T07:13:26","guid":{"rendered":"https:\/\/botland.com.pl\/blog\/?p=86315"},"modified":"2026-04-08T10:52:58","modified_gmt":"2026-04-08T08:52:58","slug":"kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma","status":"publish","type":"post","link":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/","title":{"rendered":"Kurs Raspberry Pi Pico \u2013 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA"},"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=\"86315\" class=\"elementor elementor-86315\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-10f0079 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"10f0079\" 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-1542521\" data-id=\"1542521\" 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-ad49cad elementor-widget elementor-widget-text-editor\" data-id=\"ad49cad\" 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 uda\u0142o nam si\u0119 przygotowa\u0107 w pe\u0142ni funkcjonaln\u0105 bibliotek\u0119 dedykowan\u0105 cyfrowemu czujnikowi \u015bwiat\u0142a VEML7700. Poza tym podzielili\u015bmy j\u0105 na dwa osobne pliki, wydzielaj\u0105c g\u0142\u00f3wny kod do main.c. W dzisiejszym materiale spr\u00f3bujemy jeszcze bardziej ulepszy\u0107 program obs\u0142uguj\u0105cy sensor, dodatkowo przyjrzymy si\u0119 bli\u017cej funkcjonalno\u015bci RP2040, jak\u0105 jest bezpo\u015bredni dost\u0119p do pami\u0119ci \u2013 DMA.<\/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-d57bb8e elementor-widget elementor-widget-image\" data-id=\"d57bb8e\" 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%3DeyJpZCI6NzYxNTYsInVybCI6Imh0dHBzOlwvXC9ib3RsYW5kLmNvbS5wbFwvYmxvZ1wvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNFwvMDFcLzRHb3Rvd3ktWmVzdGF3LWRvLW5hdWtpLXByb2dyYW1vd2FuaWEtei1SYXNwYmVycnktUGktUGljby1XLmpwZyJ9\" 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-d027153 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d027153\" 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-4aa4d7b\" data-id=\"4aa4d7b\" 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-fc407a8 elementor-widget elementor-widget-image\" data-id=\"fc407a8\" 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%3DeyJpZCI6NzYxNjAsInVybCI6Imh0dHBzOlwvXC9ib3RsYW5kLmNvbS5wbFwvYmxvZ1wvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNFwvMDFcLzI0MTM2XzMuanBnIn0%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-e36d07f\" data-id=\"e36d07f\" 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-f665b61 elementor-widget elementor-widget-text-editor\" data-id=\"f665b61\" 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-045548e elementor-align-center elementor-widget elementor-widget-button\" data-id=\"045548e\" 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-251f74b elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"251f74b\" 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-62dd24f elementor-widget elementor-widget-text-editor\" data-id=\"62dd24f\" 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=\"background-color: #ffffff;\"><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>\u00a0&#8211; zaczynamy\u00a0<\/a><\/li><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>\u00a0&#8211; s\u0142\u00f3w kilka o programowaniu<\/a><\/li><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>\u00a0&#8211; pierwszy program<\/a><\/li><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>\u00a0&#8211; zaczynamy programowa\u0107<\/a><\/li><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>\u00a0&#8211; p\u0119tle, zmienne i instrukcje warunkowe\u00a0<\/a><\/li><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>\u00a0\u2013 PWM, ADC i komunikacja z komputerem<\/a><\/li><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\u00a0<\/span>\u00a0\u2013 Poprawki w kodzie i w\u0142asne funkcje\u00a0<\/a><\/li><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\"><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:\/\/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>\u00a0\u2013 Teoria wska\u017anik\u00f3w i timery<\/a><\/li><li style=\"font-size: 16px;\"><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\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico \u2013 #10<\/span>\u00a0\u2013 Tablice, struktury i maszyna stan\u00f3w<\/a><\/li><li style=\"font-size: 16px;\"><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>\u00a0&#8211; Uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C<\/a><\/li><li style=\"font-size: 16px;\"><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\"><span style=\"font-weight: bolder;\">Raspberry Pi Pico \u2013 #12 \u2013<\/span>\u00a0Przygotowujemy 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\"><span style=\"color: #ff0000;\"><strong>Raspberry Pi Pico \u2013 #13<\/strong> \u2013 Biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA<\/span><\/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-3e64d2f elementor-widget elementor-widget-heading\" data-id=\"3e64d2f\" 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-facd0ce elementor-widget elementor-widget-image\" data-id=\"facd0ce\" 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-1024x576-2.webp\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"IMG_0647-1024x576\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Nzk3MDcsInVybCI6Imh0dHBzOlwvXC9ib3RsYW5kLmNvbS5wbFwvYmxvZ1wvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNFwvMDFcL0lNR18wNjQ3LTEwMjR4NTc2LTIud2VicCJ9\" 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-2.webp\" class=\"attachment-large size-large wp-image-79707\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576-2.webp 1024w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576-2-300x169.webp 300w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576-2-768x432.webp 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\">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-f8df9be elementor-align-center elementor-widget elementor-widget-button\" data-id=\"f8df9be\" 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<\/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-cc130b4 elementor-widget elementor-widget-text-editor\" data-id=\"cc130b4\" 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-9b56836 elementor-widget elementor-widget-text-editor\" data-id=\"9b56836\" 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-2f769db elementor-widget elementor-widget-spacer\" data-id=\"2f769db\" 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-411c20b elementor-widget elementor-widget-heading\" data-id=\"411c20b\" 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\">Czujnik jako obiekt strukturalny <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4726ff2 elementor-widget elementor-widget-text-editor\" data-id=\"4726ff2\" 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 jednym z poprzednich materia\u0142\u00f3w poruszyli\u015bmy temat struktur w j\u0119zyku C. Zbudowali\u015bmy w\u00f3wczas prost\u0105 konstrukcj\u0119, sk\u0142adaj\u0105c\u0105 si\u0119 z kilku zmiennych r\u00f3\u017cnego typu, kt\u00f3ra opisywa\u0142a przyk\u0142adowego cz\u0142owieka. Tak jak jednak wspomina\u0142em, prawdziwa pot\u0119ga struktur ujawnia si\u0119 przy okazji r\u00f3\u017cnego rodzaju modu\u0142\u00f3w, kt\u00f3re mo\u017cemy pod\u0142\u0105czy\u0107 do mikrokontrolera. Zamiast sterowa\u0107 zewn\u0119trznym urz\u0105dzeniem za pomoc\u0105 dedykowanych tylko jemu polece\u0144, mo\u017cemy stworzy\u0107 tak zwany obiekt strukturalny, opisany szeregiem zmiennych, kt\u00f3re przekazywane b\u0119d\u0105 do \u201euniwersalnych\u201d funkcji steruj\u0105cych. Oczywi\u015bcie owa uniwersalno\u015b\u0107 jest pewnym uproszczeniem, polecenia te nadal b\u0119d\u0105 dedykowane konkretnej funkcjonalno\u015bci, ale b\u0119d\u0105 mog\u0142y sterowa\u0107 wieloma modu\u0142ami, innymi s\u0142owy wieloma obiektami.<\/p><p style=\"font-weight: 400;\">W taki w\u0142a\u015bnie spos\u00f3b spr\u00f3bujemy zmodyfikowa\u0107 kody obs\u0142uguj\u0105ce sensor \u015bwiat\u0142a. Stworzymy opisuj\u0105c\u0105 go struktur\u0119, kt\u00f3r\u0105 poprzez argument przekazywa\u0107 b\u0119dziemy do konkretnej funkcji. Pozwoli to te\u017c zbudowa\u0107 program, kt\u00f3ry b\u0119dzie m\u00f3g\u0142 dzia\u0142a\u0107 na wielu takich samych czujnikach, r\u00f3\u017cni\u0105cy si\u0119 miedzy sob\u0105 oczywi\u015bcie tylko adresem. Powo\u0142amy do \u017cycia uniwersaln\u0105 struktur\u0119 opisuj\u0105c\u0105 czujnik, na kt\u00f3rej podstawie utworzymy obiekt b\u0119d\u0105cy w\u0142a\u015bnie naszym sensorem VEML7700.<\/p><p style=\"font-weight: 400;\">Tak wi\u0119c, aby rozja\u015bni\u0107 ten mo\u017ce nieco mglisty opis przejd\u017amy od razu do kod\u00f3w. Nie b\u0119dziemy modyfikowa\u0107 wcze\u015bniej przygotowanego projektu, dlatego stworzymy kolejny o nazwie veml7700_struct, w jego sk\u0142ad wejd\u0105 podobnie jak ostatnio trzy pliki z kodem C \u2013 veml7700.h, veml7700.c oraz main.c. Dodatkowo niezb\u0119dny jest te\u017c plik CMakeFiles.txt, pami\u0119tajcie o jego poprawnym przygotowaniu i dodaniu obu plik\u00f3w z rozszerzeniem .c.<\/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-d6843c5 elementor-widget elementor-widget-heading\" data-id=\"d6843c5\" 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<h5 class=\"elementor-heading-title elementor-size-default\">veml7700.h<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4fd64ba elementor-widget elementor-widget-code-highlight\" data-id=\"4fd64ba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp>#include \"hardware\/i2c.h\"\r\n\r\n#define I2C_PORT i2c1\r\n#define SDA_PIN 6\r\n#define SCL_PIN 7\r\n\r\n\/\/ VEML7700 register\r\n#define VEML7700_ALS_CONF_0   0x00\r\n#define VEML7700_ALS_WH       0x01\r\n#define VEML7700_ALS_WL       0x02\r\n#define VEML7700_POWER_SAVING 0x03\r\n#define VEML7700_ALS          0x04\r\n#define VEML7700_WHITE        0x05\r\n#define VEML7700_ALS_INT      0x06\r\n#define VEML7700_ID_REG       0x07\r\n\r\ntypedef struct {\r\n    i2c_inst_t *i2c;\r\n    uint8_t address;\r\n} veml7700_t;\r\n\r\nvoid veml7700_i2c_init();\r\n\r\nvoid veml7700_init(veml7700_t *sensor, i2c_inst_t *i2c, uint8_t address);\r\nuint16_t veml7700_read_light(veml7700_t *sensor);\r\nuint16_t veml7700_read_white(veml7700_t *sensor);\r\nuint16_t veml7700_read_interrupt(veml7700_t *sensor);\r\nuint16_t veml7700_read_id(veml7700_t *sensor);\r\nvoid veml7700_set_integration_time(veml7700_t *sensor, uint16_t time);\r\nvoid veml7700_set_gain(veml7700_t *sensor, uint16_t gain);\r\nvoid veml7700_set_persistence(veml7700_t *sensor, uint8_t persistence);\r\nvoid veml7700_power_save(veml7700_t *sensor, uint16_t mode);\r\nvoid veml7700_set_high_threshold(veml7700_t *sensor, uint16_t threshold);\r\nvoid veml7700_set_low_threshold(veml7700_t *sensor, uint16_t threshold);\r\nvoid veml7700_enable_interrupt(veml7700_t *sensor);\r\nvoid veml7700_disable_interrupt(veml7700_t *sensor);\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\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-1881633 elementor-widget elementor-widget-text-editor\" data-id=\"1881633\" 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;\">Ca\u0142a magia zwi\u0105zana z utworzeniem struktury, kt\u00f3ra reprezentowa\u0107 b\u0119dzie sensor \u015bwiat\u0142a dzieje si\u0119 w pliku nag\u0142\u00f3wkowym. W swojej budowie przypomina on znan\u0105 z poprzedniego artyku\u0142u wersj\u0119, r\u00f3\u017cni si\u0119 jednak szczeg\u00f3\u0142ami.<\/p><p style=\"font-weight: 400;\">Warto zauwa\u017cy\u0107, \u017ce w tym przypadku potrzebujemy do\u0142\u0105czenia biblioteki hardware\/i2c.h, poniewa\u017c korzysta\u0107 b\u0119dziemy z instancji *i2c, kt\u00f3ra ukryta jest w tej bibliotece, ale o tym za chwil\u0119. W pierwszej cz\u0119\u015bci programu umieszczone zosta\u0142y definicje zwi\u0105zane z rejestrami VEML7700 oraz informacje o wybranym interfejsie i pinach SDA i SCL, poniewa\u017c kod nadal zostawia opcj\u0119 automatycznej lub manualnej inicjalizacji tego interfejsu, poprzez funkcj\u0119 veml7700_i2c_init. Co warto zauwa\u017cy\u0107, znikn\u0119\u0142a definicja okre\u015blaj\u0105ca adres czujnika, poniewa\u017c ten przekazywa\u0107 do funkcji b\u0119dziemy w nieco inny spos\u00f3b.<\/p><p style=\"font-weight: 400;\">W kolejnym kroku umieszczona zosta\u0142a definicja struktury o nazwie veml7700_t. Sk\u0142ada si\u0119 ona z dw\u00f3ch element\u00f3w, kt\u00f3re definiowa\u0107 b\u0119dziemy przy okazji powo\u0142ywania do \u017cycia obiektu w g\u0142\u00f3wnym pliku z kodem. Jest to adres czujnika w postaci uint8_t oraz nieco tajemniczo wygl\u0105daj\u0105ce i2c_inst_t *i2c. Rozbijaj\u0105c zapis ten na dwa elementy, mo\u017cna powiedzie\u0107, \u017ce mamy tutaj zmienn\u0105 typu i2c_inst_t wraz ze wska\u017anikiem na i2c. W praktyce jednak jest to sprytne odwo\u0142anie do funkcjonuj\u0105cej w bibliotece hardware\/i2c.h definicji. Naturalnym jest, ze w tym miejscu oczekiwa\u0107 b\u0119dziemy i2c0 lub i2c1, dlatego zamiast kombinowa\u0107 z tworzeniem dodatkowych, w\u0142asnych definicji mo\u017cemy odwo\u0142a\u0107 si\u0119 poprzez wska\u017anik do ju\u017c istniej\u0105cej struktury. W ten spos\u00f3b tworzymy wska\u017anik i2c na obiekt i2c_inst_t, innymi s\u0142owy, jest to wska\u017anik wewn\u0105trz struktury, wskazuj\u0105cy na inn\u0105 struktur\u0119.<\/p><p style=\"font-weight: 400;\">Ostatni fragment kodu zawiera prototypy wszystkich obs\u0142ugiwanych przez bibliotek\u0119 funkcji. Zasadniczo s\u0105 to identyczne funkcje, jak te, kt\u00f3re omawiali\u015bmy poprzednim razem, z t\u0105 r\u00f3\u017cnic\u0105, \u017ce teraz ka\u017cde polecenie oczekiwa\u0107 b\u0119dzie podania w argumencie wska\u017anika na struktur\u0119 veml7700_t, poniewa\u017c to w\u0142a\u015bnie tam zapisane b\u0119d\u0105 dane o porcie I2C i adresie czujnika. Wyj\u0105tkiem jest tutaj veml7700_init, bo jak mo\u017cna zauwa\u017cy\u0107, w argumentach tej funkcji przekazujemy nie tylko struktur\u0119, ale te\u017c wszystkie jej elementy, czyli *i2c oraz address. Jest to celowy zabieg, poniewa\u017c w jaki\u015b spos\u00f3b b\u0119dziemy musieli nakarmi\u0107 struktur\u0119 odpowiednimi danymi. W g\u0142\u00f3wnym pliku main.c, zamiast odwo\u0142ywa\u0107 si\u0119 do pojedynczych cement\u00f3w veml7700_t, przeka\u017cemy dane poprzez argumenty funkcji, a ta zajmie si\u0119 reszt\u0105 i zapisze dane w strukturze.<\/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-fd0d122 elementor-widget elementor-widget-heading\" data-id=\"fd0d122\" 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<h5 class=\"elementor-heading-title elementor-size-default\">veml7700.c<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9a4e189 elementor-widget elementor-widget-text-editor\" data-id=\"9a4e189\" 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 style=\"font-weight: 400\">#include &lt;stdio.h&gt;<br \/>#include \"pico\/stdlib.h\"<br \/>#include \"hardware\/i2c.h\"<br \/>#include \"veml7700.h\"<br \/><br \/>void veml7700_i2c_init(){<br \/>\u00a0\u00a0\u00a0 i2c_init(I2C_PORT, 100 * 1000); \/\/ I2C 100kHz<br \/><br \/> \u00a0\u00a0 gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);<br \/> \u00a0\u00a0 gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);<br \/> \u00a0\u00a0 gpio_pull_up(SDA_PIN);<br \/> \u00a0\u00a0 gpio_pull_up(SCL_PIN);<br \/>}<br \/><br \/>void veml7700_write_register(veml7700_t *sensor, uint8_t reg, uint16_t value) {<br \/> \u00a0\u00a0 uint8_t data[3] = {reg, value &amp; 0xFF, value &gt;&gt; 8};<br \/> \u00a0\u00a0 i2c_write_blocking(sensor-&gt;i2c, sensor-&gt;address, data, 3, false);<br \/>}<br \/><br \/>uint16_t veml7700_read_register(veml7700_t *sensor, uint8_t reg) {<br \/> \u00a0\u00a0 uint8_t buffer[2];<br \/> \u00a0\u00a0 i2c_write_blocking(sensor-&gt;i2c, sensor-&gt;address, &amp;reg, 1, true);<br \/> \u00a0\u00a0 i2c_read_blocking(sensor-&gt;i2c, sensor-&gt;address, buffer, 2, false);<br \/> \u00a0\u00a0 return (buffer[1] &lt;&lt; 8) | buffer[0];<br \/>}<br \/><br \/>void veml7700_init(veml7700_t *sensor, i2c_inst_t *i2c, uint8_t address) {<br \/> \u00a0\u00a0 sensor-&gt;i2c = i2c;<br \/> \u00a0\u00a0 sensor-&gt;address = address;<br \/> \u00a0\u00a0 veml7700_write_register(sensor, VEML7700_ALS_CONF_0, 0x0000);<br \/>}<br \/><br \/>uint16_t veml7700_read_light(veml7700_t *sensor) {<br \/> \u00a0\u00a0 return veml7700_read_register(sensor, VEML7700_ALS);<br \/>}<br \/><br \/>uint16_t veml7700_read_white(veml7700_t *sensor) {<br \/> \u00a0\u00a0 return veml7700_read_register(sensor, VEML7700_WHITE);<br \/>}<br \/><br \/>uint16_t veml7700_read_interrupt(veml7700_t *sensor) {<br \/> \u00a0\u00a0 return veml7700_read_register(sensor, VEML7700_ALS_INT);<br \/>}<br \/><br \/>uint16_t veml7700_read_id(veml7700_t *sensor) {<br \/> \u00a0\u00a0 return veml7700_read_register(sensor, VEML7700_ID_REG);<br \/>}<br \/><br \/>void veml7700_set_integration_time(veml7700_t *sensor, uint16_t time) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(sensor, VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(0x0F &lt;&lt; 6); \/\/ Clear previous integration time settings<br \/> \u00a0\u00a0 config |= (time &lt;&lt; 6);\u00a0 \/\/ Set a new integration time<br \/> \u00a0\u00a0 veml7700_write_register(sensor, VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_set_gain(veml7700_t *sensor, uint16_t gain) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(sensor, VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(0x03 &lt;&lt; 4); \/\/ Clear previous gain settings<br \/> \u00a0\u00a0 config |= (gain &lt;&lt; 4);\u00a0 \/\/ Set a new gain<br \/> \u00a0\u00a0 veml7700_write_register(sensor, VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_set_persistence(veml7700_t *sensor, uint8_t persistence) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(sensor, VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(0x03 &lt;&lt; 4); \/\/ Clear previous ALS_PERS settings<br \/> \u00a0\u00a0 config |= (persistence &lt;&lt; 4); \/\/ Set new ALS_PERS bits<br \/> \u00a0\u00a0 veml7700_write_register(sensor, VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_power_save(veml7700_t *sensor, uint16_t mode) {<br \/> \u00a0\u00a0 veml7700_write_register(sensor, VEML7700_POWER_SAVING, mode);<br \/>}<br \/><br \/>void veml7700_set_high_threshold(veml7700_t *sensor, uint16_t threshold) {<br \/> \u00a0\u00a0 veml7700_write_register(sensor, VEML7700_ALS_WH, threshold);<br \/>}<br \/><br \/>void veml7700_set_low_threshold(veml7700_t *sensor, uint16_t threshold) {<br \/> \u00a0\u00a0 veml7700_write_register(sensor, VEML7700_ALS_WL, threshold);<br \/>}<br \/><br \/>void veml7700_enable_interrupt(veml7700_t *sensor) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(sensor, VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config |= (1 &lt;&lt; 1); \/\/ Setting the bit responsible for interrupts<br \/> \u00a0\u00a0 veml7700_write_register(sensor, VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_disable_interrupt(veml7700_t *sensor) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(sensor, VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(1 &lt;&lt; 1); \/\/ Clearing the bit responsible for interrupts<br \/> \u00a0\u00a0 veml7700_write_register(sensor, VEML7700_ALS_CONF_0, config);<br \/>}<\/pre><p>\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-c64e1fc elementor-widget elementor-widget-text-editor\" data-id=\"c64e1fc\" 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;\">Wewn\u0105trz pliku veml7700.c, tak jak ostatnim razem znalaz\u0142y si\u0119 rozwini\u0119cia wszystkich prototyp\u00f3w funkcji umieszczonych w pliku nag\u0142\u00f3wkowym. Ich budowa nie r\u00f3\u017cni si\u0119 szczeg\u00f3lnie wzgl\u0119dem poprzedniej wersji, jednak wyja\u015bni\u0107 musimy sobie tajemnicze opisy przypominaj\u0105ce strza\u0142ki \u201e-&gt;\u201d, nierozerwalnie zwi\u0105zane ze strukturami.<\/p><p style=\"font-weight: 400;\">Przyjrzyjmy si\u0119 pierwszej funkcji, czyli veml7700_write_register, kt\u00f3ra zapisuje dane do rejestru sensora. Ostatnim razem korzystali\u015bmy z przekazywanych poprzez argumenty funkcji danych, jednak tym razem ich nie ma, za to umieszczony jest tam wska\u017anik na struktur\u0119 veml7700_t. Jak pami\u0119tacie funkcja i2c_write_blocking oczekuje podania konkretnego portu I2C oraz adresu, pod kt\u00f3ry zapisane maj\u0105 by\u0107 dane. Informacje te znajduj\u0105 si\u0119 wewn\u0105trz struktury, kt\u00f3ra w rozwini\u0119ciu funkcji okre\u015blana jest jako sensor. Dlatego chc\u0105c poda\u0107 odpowiedni port, odwo\u0142ujemy si\u0119 do struktury sensor (niejako pod spodem jest to veml7700_t) i wybieramy z niej element o nazwie i2c poprzez zastosowanie (strza\u0142ki) \u201e-&gt;\u201d. Analogicznie podaj\u0105c adres modu\u0142u, poprzez sensor, wybieramy dane zapisane pod address.<\/p><p style=\"font-weight: 400;\">Chwil\u0119 powinni\u015bmy po\u015bwi\u0119ci\u0107 tak\u017ce funkcji inicjalizuj\u0105cej czujnik. Tak jak wspomnia\u0142em, dane, kt\u00f3re b\u0119dziemy chcieli zapisa\u0107 w strukturze, przekazywa\u0107 b\u0119dziemy poprzez w\u0142a\u015bnie to polecenie. W argumentach umieszczamy informacj\u0119 o porcie i adresie, kt\u00f3re w kolejnych krokach poprzez poznan\u0105 ju\u017c konstrukcj\u0119 ze strza\u0142k\u0105 umieszczamy w strukturze. Z wn\u0119trza struktury, kt\u00f3re w tej funkcji przyjmuje nazw\u0119 sensor, a w rzeczywisto\u015bci jest to veml7700_t wybieramy element i2c i przypisujemy do niego argument o identycznej nazwie i2c, kt\u00f3ry umieszczony by\u0142 w argumencie. Podobnie w przypadku adresu, wybieramy element address i przypisujemy do niego warto\u015b\u0107 spod przekazanego w argumencie address.<\/p><p style=\"font-weight: 400;\">Przy tej okazji zastanowi\u0107 mo\u017cna si\u0119 te\u017c, czy warto by\u0142oby wrzuci\u0107 inicjalizacj\u0119 interfejsu I2C do rozwini\u0119cia w\u0142a\u015bnie tej funkcji, zamiast operowa\u0107 osobnym poleceniem. Mog\u0142oby tak by\u0107, poniewa\u017c przekazujemy tutaj ju\u017c port I2C, do kt\u00f3rego pod\u0142\u0105czony jest czujnik \u015bwiat\u0142a. Brakuj\u0105cym elementem jest tutaj tylko informacja o wyprowadzeniach, z kt\u00f3rych korzystamy. Jednak mimo to, nadal bardziej optymaln\u0105 opcj\u0105 wydaje mi si\u0119 pozostawienie mo\u017cliwo\u015bci wyboru i zdecydowania, gdzie inicjalizowany b\u0119dzie ten interfejs. Kto\u015b korzystaj\u0105cy z tego kodu mo\u017ce chcie\u0107 nieco inaczej rozwi\u0105za\u0107 proces inicjalizacji, dlatego kod pozostawi\u0119 w takiej formie. Jednak, je\u015bli chcecie, mo\u017cecie spr\u00f3bowa\u0107 umie\u015bci\u0107 ustawienie interfejsu I2C wewn\u0105trz veml7700_init.<\/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-c21b3fc elementor-widget elementor-widget-heading\" data-id=\"c21b3fc\" 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<h5 class=\"elementor-heading-title elementor-size-default\">main.c<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d89b87e elementor-widget elementor-widget-text-editor\" data-id=\"d89b87e\" 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 style=\"font-weight: 400\">#include &lt;stdio.h&gt;<br \/>#include \"pico\/stdlib.h\"<br \/>#include \"hardware\/i2c.h\"<br \/>#include \"veml7700.h\"<br \/><br \/>int main() {<br \/>\u00a0\u00a0\u00a0 stdio_init_all();<br \/><br \/>\u00a0\u00a0\u00a0 veml7700_i2c_init();<br \/><br \/> \u00a0\u00a0 veml7700_t sensor;<br \/>\u00a0\u00a0\u00a0 veml7700_init(&amp;sensor, i2c1, 0x10);<br \/><br \/> \u00a0\u00a0 veml7700_set_integration_time(&amp;sensor, 0x0001);<br \/> \u00a0\u00a0 veml7700_set_gain(&amp;sensor, 0x0000);<br \/> \u00a0\u00a0 veml7700_set_persistence(&amp;sensor, 0x0001);<br \/> \u00a0\u00a0 veml7700_set_high_threshold(&amp;sensor, 0x9C40);<br \/> \u00a0\u00a0 veml7700_set_low_threshold(&amp;sensor, 0x0FA0);<br \/> \u00a0\u00a0 veml7700_enable_interrupt(&amp;sensor);<br \/>\u00a0\u00a0\u00a0 veml7700_power_save(&amp;sensor, 0x01);<br \/><br \/> \u00a0\u00a0 while (true) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t device_id = veml7700_read_id(&amp;sensor);<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"Device ID: 0x%04X\\n\", device_id);<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t light = veml7700_read_light(&amp;sensor);<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"Ambient Light: %u\\n\", light);<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t white = veml7700_read_white(&amp;sensor);<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"White Light: %u\\n\", white);<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t als_int = veml7700_read_interrupt(&amp;sensor);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (als_int &amp; 0x4000) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Interruption of high threshold<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"High threshold interrupt! Light: %u\\n\", light);<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (als_int &amp; 0x8000) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Interruption of low threshold<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"Low threshold interrupt! Light: %u\\n\", light);<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sleep_ms(1000);<br \/> \u00a0\u00a0 }<br \/>}<\/pre><p>\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-395ccd9 elementor-widget elementor-widget-text-editor\" data-id=\"395ccd9\" 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;\">G\u0142\u00f3wny program zapisany w main.c r\u00f3wnie\u017c wygl\u0105da znajomo i zasadniczo nie zmieni\u0142o si\u0119 w nim wiele. Najwa\u017cniejsz\u0105 zmian\u0105 jest powo\u0142anie do \u017cycia struktury, a w zasadzie mo\u017cna nazwa\u0107 to polecenie deklaracj\u0105 obiektu (cho\u0107 pami\u0119tajcie, \u017ce C nie jest j\u0119zykiem obiektowym). Dzi\u0119ki veml7700_t sensor;, tworzymy obiekt, kt\u00f3rego nazwa to sensor i mo\u017cemy traktowa\u0107 go jako nasz czujnik. Od teraz w kolejnych funkcjach, kt\u00f3re jak pami\u0119tacie wymagaj\u0105 w argumencie wska\u017anika na odpowiedni\u0105 struktur\u0119, podawa\u0107 b\u0119dziemy w\u0142a\u015bnie sensor, a dok\u0142adniej &amp;sensor, poniewa\u017c przekazywa\u0107 b\u0119dziemy tylko adres a nie obiekt sam w sobie.<\/p><p style=\"font-weight: 400;\">Zauwa\u017cy\u0107 mo\u017cna to ju\u017c w kolejnym poleceniu, kt\u00f3re inicjalizuje czujnik. Przekazujemy wska\u017anik na sensor oraz dane, kt\u00f3re zapisane zostan\u0105 w tej strukturze, b\u0119d\u0105ce portem I2C oraz adresem modu\u0142u. Dzi\u0119ki temu, w kolejnych poleceniach podaj\u0105c tylko wska\u017anik, funkcja b\u0119dzie mog\u0142a wyci\u0105gn\u0105\u0107 zapisane tam dane i odpowiednio zaadresowa\u0107 miejsce, do kt\u00f3rego zapisane lub z kt\u00f3rego wyci\u0105gni\u0119te maj\u0105 by\u0107 dane.<\/p><p style=\"font-weight: 400;\">Dalsza cz\u0119\u015b\u0107 kodu jest ju\u017c wam znana, karmimy czujnik przyk\u0142adowymi danymi, a w niesko\u0144czonej p\u0119tli while odczytujemy warto\u015bci nat\u0119\u017cenia \u015bwiat\u0142a oraz flagi przerwa\u0144.<\/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-af55ea2 elementor-widget elementor-widget-image\" data-id=\"af55ea2\" 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\/08\/serial-struct.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"serial struct\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2NTY1IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvc2VyaWFsLXN0cnVjdC5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"667\" height=\"362\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/serial-struct.png\" class=\"attachment-large size-large wp-image-86565\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/serial-struct.png 667w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/serial-struct-300x163.png 300w\" sizes=\"(max-width: 667px) 100vw, 667px\" \/>\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 programu.<\/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-2ef4977 elementor-widget elementor-widget-text-editor\" data-id=\"2ef4977\" 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\">Pod wzgl\u0119dem dzia\u0142ania kod ten nie r\u00f3\u017cni si\u0119 od poprzedniego projektu, jednak jego g\u0142\u00f3wn\u0105 zalet\u0105 jest obiektowo\u015b\u0107. W tym przyk\u0142adzie powo\u0142ali\u015bmy do \u017cycia tylko jeden obiekt nazwany sensor, ale je\u015bli pod\u0142\u0105czyliby\u015bmy do Raspberry Pi Pico wi\u0119cej czujnik\u00f3w, mogliby\u015bmy tworzy\u0107 kolejne obiekty &#8211; sensor1, sensor2, sensor 3 itd. I z ka\u017cdym komunikowa\u0107 si\u0119 odr\u0119bnie, korzystaj\u0105c z tych samych funkcji, r\u00f3\u017cni\u0105cych si\u0119 miedzy sob\u0105 tylko wska\u017anikiem w argumencie. Pseudoobiektowo\u015b\u0107 program\u00f3w w j\u0119zyku C jest ich spor\u0105 zalet\u0105, dlatego, je\u015bli jeszcze nie do ko\u0144ca to czujesz, spr\u00f3buj przeanalizowa\u0107 kod ponownie.<\/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-b0bd20b elementor-widget elementor-widget-heading\" data-id=\"b0bd20b\" 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\">Czym jest bezpo\u015bredni dost\u0119p do pami\u0119ci?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d636f16 elementor-widget elementor-widget-text-editor\" data-id=\"d636f16\" 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;\">Przygotowuj\u0105c programy w j\u0119zyku C, naturalnym jest, \u017ce korzystamy z r\u00f3\u017cnego typu zmiennych, kt\u00f3rym przypisujemy odpowiednie warto\u015bci, mog\u0105ce reprezentowa\u0107 dowolny typ informacji. Mo\u017ce to by\u0107 informacja o warto\u015bci nat\u0119\u017cenia \u015bwiat\u0142a, temperaturze rdzenia procesora, czy te\u017c wewn\u0119trzna warto\u015b\u0107, z kt\u00f3rej korzystamy przy ka\u017cdorazowej iteracji licznika. Jednak niezale\u017cnie od typu czy przechowywanej przez zmienn\u0105 warto\u015bci, fizyczny proces przypisania wykonywany jest przez rdze\u0144 procesora. To jego dzie\u0142em jest zapisanie konkretnego ci\u0105gu zer i jedynek w z g\u00f3ry okre\u015blnym miejscu w pami\u0119ci. Trzeba jednak pami\u0119ta\u0107, \u017ce tego typu proces zapisu, czy te\u017c przesy\u0142ania danych, zajmuje czas i anga\u017cuje zasoby CPU, co w niekt\u00f3rych przypadkach mo\u017ce by\u0107 problematyczne.<\/p><p style=\"font-weight: 400;\">We wi\u0119kszo\u015bci program\u00f3w nie b\u0119dzie mia\u0142o to znaczenia, ale wyobra\u017acie sobie sytuacj\u0119, w kt\u00f3rej musimy sterowa\u0107 wy\u015bwietlaczem. Ka\u017cdy wy\u015bwietlacz ma w\u0142asn\u0105 rozdzielczo\u015b\u0107, kt\u00f3ra opisuje ilo\u015b\u0107 pikseli w pionie i poziomie, dla przyk\u0142adu mo\u017ce to by\u0107 128&#215;64. Mno\u017c\u0105c obie liczby, otrzymamy warto\u015b\u0107 pikseli, z kt\u00f3rej zbudowany jest wy\u015bwietlacz, w tym przypadku b\u0119dzie to 8192. Trzeba przyzna\u0107, \u017ce jest to do\u015b\u0107 sporo, a gdy dodamy do tego potrzeb\u0119 jak najcz\u0119stszego od\u015bwie\u017cania, oka\u017ce si\u0119, \u017ce procesor przynajmniej kilkana\u015bcie razy na sekund\u0119 musi generowa\u0107 paczki z\u0142o\u017cone z 8192 zmiennych, z kt\u00f3rej ka\u017cda okre\u015bla kolor pojedynczego piksela. A co z informacj\u0105 o jasno\u015bci?<\/p><p style=\"font-weight: 400;\">Tym wst\u0119pem chcia\u0142bym zwr\u00f3ci\u0107 wasz\u0105 uwag\u0119, \u017ce w pewnych okoliczno\u015bciach jednostki centralne musz\u0105 operowa\u0107 na naprawd\u0119 ogromnych ilo\u015bciach danych. Musz\u0105 je wygenerowa\u0107, a nast\u0119pnie przes\u0142a\u0107, a gdy w mi\u0119dzyczasie chcieliby\u015bmy zrobi\u0107 te\u017c co\u015b innego, mog\u0142oby si\u0119 okaza\u0107, \u017ce procesor sobie nie poradzi. I tu z pomoc\u0105 przychodzi nam bezpo\u015bredni dost\u0119p do pami\u0119ci, w skr\u00f3cie DMA (dynamic memory acces).<\/p><p style=\"font-weight: 400;\">Wsp\u00f3\u0142czesne procesory, jaki i mikrokontrolery wyposa\u017cane s\u0105 w modu\u0142y nazywane DMA. Dzi\u0119ki nim mo\u017cliwe jest przesy\u0142anie danych bez udzia\u0142u rdzenia logicznego. Innymi s\u0142owy, rdze\u0144 niejako zleca przes\u0142anie danych, wskazuj\u0105c miejsce, w kt\u00f3rym te s\u0105 umieszczone oraz to, gdzie maj\u0105 trafi\u0107, a reszt\u0119 zostawia modu\u0142owi DMA. W tym samym czasie realizowane mog\u0105 by\u0107 inne zadania, a gdy dane zostan\u0105 przes\u0142ane, jednostka DMA zg\u0142osi wykonanie zadania w postaci przerwania.<\/p><p style=\"font-weight: 400;\">Raspberry Pi Pico r\u00f3wnie\u017c wspiera ten rodzaj funkcjonalno\u015bci, dlatego w kolejnym przyk\u0142adzie, kt\u00f3ry nazwa\u0142em dma_test, spr\u00f3bujemy wykorzysta\u0107 DMA i z jego pomoc\u0105 przes\u0142a\u0107 dane z jednej tablicy do drugiej. Tak wi\u0119c bez zb\u0119dnego przed\u0142u\u017cania przejd\u017amy od razu do kodu, kt\u00f3ry om\u00f3wimy fragmentowo.<\/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-86589a5 elementor-widget elementor-widget-text-editor\" data-id=\"86589a5\" 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 style=\"font-weight: 400\">#include &lt;stdio.h&gt;<br \/>#include \"pico\/stdlib.h\"<br \/>#include \"hardware\/dma.h\"<br \/>#include \"hardware\/irq.h\"<br \/>#include \"hardware\/sync.h\"<br \/><br \/>#define DATA_SIZE 10<br \/><br \/>\/\/ Global data buffers<br \/>uint32_t source_data[DATA_SIZE];<br \/>uint32_t destination_data[DATA_SIZE];<\/pre><p>\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-f410952 elementor-widget elementor-widget-text-editor\" data-id=\"f410952\" 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\">Zaczynamy klasycznie od do\u0142\u0105czenia niezb\u0119dnych bibliotek. W ramach pracy z DMA skorzysta\u0107 musimy z hardware\/dma, hardware\/irq, w kt\u00f3rej umieszczone s\u0105 polecenia zwi\u0105zane z przerwaniami oraz hardware\/sync zawieraj\u0105cej tak zwane funkcje synchronizuj\u0105ce, r\u00f3wnie\u017c przydatne przy przesy\u0142aniu danych bez u\u017cycia rdzenia procesora.<\/p><p style=\"font-weight: 400\">Dodatkowo tworzymy dwa bufory dla danych, kt\u00f3rych rozmiar definiuje DATA_SIZE. To w\u0142a\u015bnie w nich znajdowa\u0107 b\u0119d\u0105 si\u0119 dane, kt\u00f3re b\u0119dziemy przesy\u0142a\u0107, w source_data umie\u015bcimy elementy do wys\u0142ania, natomiast w destination_data b\u0119dzie tablic\u0105 odbiorcz\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-c38c793 elementor-widget elementor-widget-text-editor\" data-id=\"c38c793\" 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 style=\"font-weight: 400\">\/\/ Interrupt handling function for DMA<br \/>void dma_complete_handler() {<br \/> \u00a0\u00a0 dma_hw-&gt;ints0 = 1u &lt;&lt; 0;<br \/> \u00a0\u00a0 printf(\"DMA transfer complete\\n\");<br \/>}<br \/><br \/>\/\/ Interrupt handling function for DMA<br \/>void dma_complete_handler() {<br \/> \u00a0\u00a0 dma_hw-&gt;ints0 = 1u &lt;&lt; 0;<br \/> \u00a0\u00a0 printf(\"DMA transfer complete\\n\");<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-a73e479 elementor-widget elementor-widget-text-editor\" data-id=\"a73e479\" 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;\">Kolejnym elementem jest funkcja, kt\u00f3ra wywo\u0142ana zostanie w momencie zg\u0142oszenia przerwania przez DMA. Jak ju\u017c wspomnia\u0142em, w taki w\u0142a\u015bnie spos\u00f3b zg\u0142aszane jest zako\u0144czenie transmisji danych i uruchamiana jest funkcja dma_complete_handler. W naszym przyk\u0142adnie nie musimy specjalnie reagowa\u0107 na to przerwanie, wszak\u017ce chcemy tylko testowo przes\u0142a\u0107 dane z jednego miejsca w drugie. Dlatego wystarczy, \u017ce ustawimy bit w strukturze dma_hw, kt\u00f3ry pe\u0142ni w\u0142a\u015bnie funkcj\u0119 flagi przerwania (zg\u0142oszone przerwanie realizowane jest zerem). Jak wida\u0107, zrealizowane jest to w do\u015b\u0107 dziwny spos\u00f3b, ale taki r\u00f3wnie\u017c chcia\u0142bym wam pokaza\u0107.<\/p><p style=\"font-weight: 400;\">Co warto podkre\u015bli\u0107, mogliby\u015bmy skorzysta\u0107 z dma_hw-&gt;ints0 = 1; i mia\u0142oby to ten sam efekt jak widoczny wy\u017cej zapis. Jego efektem r\u00f3wnie\u017c b\u0119dzie ustawienie jedynki na ints0, jednak zrealizowane jest to w nieco inny spos\u00f3b. Je\u015bli rozbijemy sobie widoczny kod, mo\u017cna doj\u015b\u0107 do wniosku, \u017ce jedynka przesuwana jest w lewo o zero krok\u00f3w, czyli znajdzie si\u0119 na zerowej pozycji w docelowej zmiennej. Tajemnicze \u201eu\u201d przy jedynce oznacza, \u017ce jest to liczba bez znaku (unsigned) i nie mo\u017ce w \u017cadnym przypadku przyj\u0105\u0107 warto\u015bci ujemnej. Stosowanie takiego zapisu mo\u017ce wydawa\u0107 si\u0119 nieco dziwne, ale jest ku temu kilka powod\u00f3w. Pierwszym jest czytelno\u015b\u0107 i fakt, \u017ce wiemy od razu, \u017ce jest to instrukcja dzia\u0142aj\u0105ca na bita. Teoretycznie \u201eprostszy\u201d zapis m\u00f3g\u0142by sugerowa\u0107, \u017ce jest to operacja liczbowa. Dodatkowo, dzi\u0119ki przesuni\u0119ciu o zero krok\u00f3w wiemy od razu, \u017ce ustawiamy bit zerowy, co mog\u0142oby by\u0107 przydatne zw\u0142aszcza w przypadku wi\u0119kszych zmiennych. Nie b\u0119d\u0119 tutaj sugerowa\u0107, kt\u00f3ry typ zapisu jest lepszy, warto jednak jest zna\u0107 oba, bo z jedn\u0105, jak i drug\u0105 form\u0105 mo\u017cna spotka\u0107 si\u0119 powszechnie.<\/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-8972a10 elementor-widget elementor-widget-text-editor\" data-id=\"8972a10\" 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 style=\"font-weight: 400\">int main() {<br \/>\u00a0\u00a0\u00a0 stdio_init_all();<br \/><br \/> \u00a0\u00a0 \/\/ Fill the source table with data<br \/> \u00a0\u00a0 for (uint8_t i = 0; i &lt; DATA_SIZE; i++) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 source_data[i] = i;<br \/>\u00a0\u00a0\u00a0 }<br \/><br \/> \u00a0\u00a0 \/\/ Initiate DMA channel<br \/> \u00a0\u00a0 uint8_t dma_chan = dma_claim_unused_channel(true);<br \/>\u00a0\u00a0\u00a0 dma_channel_config dma_cfg = dma_channel_get_default_config(dma_chan);<br \/><br \/> \u00a0\u00a0 \/\/ Configure the DMA channel<br \/> channel_config_set_transfer_data_size(&amp;dma_cfg, DMA_SIZE_32);\u00a0 \/\/ Transmission of 32-bit data<br \/> \u00a0\u00a0 channel_config_set_read_increment(&amp;dma_cfg, true);\u00a0 \/\/ Automatic incrementation of the source address<br \/>\u00a0\u00a0\u00a0 channel_config_set_write_increment(&amp;dma_cfg, true);\u00a0 \/\/ Automatic incrementation of the destination address<\/pre><p>\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-add1614 elementor-widget elementor-widget-text-editor\" data-id=\"add1614\" 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 g\u0142\u00f3wnej funkcji main pierwszym krokiem b\u0119dzie uzupe\u0142nienie \u017ar\u00f3d\u0142owej tablicy przyk\u0142adowymi danymi. Proces ten zrealizujemy za pomoc\u0105 p\u0119tli for, kt\u00f3ra wykona si\u0119 dziesi\u0119ciokrotnie, poniewa\u017c w\u0142a\u015bnie taka warto\u015b\u0107 umieszczona jest w DATA_SIZE. Poza tym przy ka\u017cdym przebiegu p\u0119tli pod element tablicy zgodny z aktualn\u0105 warto\u015bci\u0105 \u201ei\u201d przypisane zostanie w\u0142a\u015bnie \u201ei\u201d. Dzi\u0119ki temu uzyskamy paczk\u0119 danych z kolejnymi liczbami naturalnymi.<\/p><p style=\"font-weight: 400;\">Gdy dane, kt\u00f3re b\u0119dziemy chcieli przes\u0142a\u0107 s\u0105 ju\u017c gotowe, mo\u017cemy przej\u015b\u0107 do samej konfiguracji modu\u0142u DMA, poniewa\u017c tak jak wspomina\u0142em, to w\u0142a\u015bnie rdze\u0144 procesora, kt\u00f3ry wykonuje przygotowany kod, zg\u0142asza potrzeb\u0119 przes\u0142ana danych z punktu A do B. Na pocz\u0105tek tworzymy zmienn\u0105 dma_chan, do kt\u00f3rej za pomoc\u0105 polecenia dma_claim_unused_channel przypisujemy numer pierwszego wolnego kana\u0142u DMA. To w\u0142a\u015bnie z jego pomoc\u0105 przesy\u0142ane s\u0105 dane. Parametr \u201etrue\u201d w argumencie funkcji oznacza, \u017ce b\u0119dzie ona czeka\u0107 do momentu, a\u017c pojawi si\u0119 wolny kana\u0142. Innymi s\u0142owy, gdyby w momencie jej uruchamiania DMA przesy\u0142a\u0142o ju\u017c dane, funkcja wstrzyma\u0142aby program do momentu zako\u0144czenia tego procesu.<\/p><p style=\"font-weight: 400;\">Gdy znamy ju\u017c numer kana\u0142u, mo\u017cemy wykorzysta\u0107 go do pobrania jego domy\u015blnej konfiguracji, kt\u00f3r\u0105 zapiszemy w strukturze dma_channel_config. Zadanie to realizuje funkcja dma_channel_get_default_config, w kt\u00f3rej argumencie umieszczamy chwil\u0119 wcze\u015bniej pobrany numer dost\u0119pnego kana\u0142u, zapisany w dma_chan.<\/p><p style=\"font-weight: 400;\">Kolejnym krokiem b\u0119dzie ustawienie trzech szczeg\u00f3lnych element\u00f3w. channel_config_set_transfer_data_size okre\u015bla wielko\u015b\u0107 paczki, w kt\u00f3rej przesy\u0142ane b\u0119d\u0105 dane. Korzystaj\u0105c z DMA_SIZE_32 okre\u015blamy, \u017ce b\u0119d\u0105 to domy\u015blne 32 bity. Poza tym wskaza\u0107 musimy r\u00f3wnie\u017c kana\u0142 DMA, kt\u00f3rego tyczy si\u0119 ten parametr, dlatego jednym z argument\u00f3w jest uzyskany dzi\u0119ki \u201e&amp;\u201d adres dma_cfg. W kolejnych dw\u00f3ch funkcjach, dzi\u0119ki parametrowi \u201etrue\u201d uruchamiamy automatyczn\u0105 inkrementacj\u0119 adres\u00f3w w pami\u0119ci Pico, tak, aby ka\u017cdy kolejny element tablicy umieszczony by\u0142 w innym miejscu. Tutaj r\u00f3wnie\u017c korzystamy z operatora wy\u0142uskania adresu, celem wybrania konkretnego kana\u0142u DMA.<\/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-58dfee9 elementor-widget elementor-widget-text-editor\" data-id=\"58dfee9\" 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 style=\"font-weight: 400\"> \u00a0\u00a0 dma_channel_configure(<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dma_chan,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ DMA channel<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &amp;dma_cfg,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Channel configuration<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 destination_data,\u00a0\u00a0\u00a0\u00a0 \/\/ Destination address<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 source_data,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Source address<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA_SIZE,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Number of elements to be sent<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 false\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Don't run yet<br \/>\u00a0\u00a0\u00a0 );<\/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-5b2fc72 elementor-widget elementor-widget-text-editor\" data-id=\"5b2fc72\" 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\">Kolejno uzupe\u0142niamy pozosta\u0142e dane, kt\u00f3re musz\u0105 znale\u017a\u0107 si\u0119 w strukturze definiuj\u0105cej modu\u0142 DMA. S\u0105 to: wybrany kana\u0142 \u2013 dma_chan, adres do miejsca, w kt\u00f3rym umieszczone s\u0105 chwil\u0119 wcze\u015bniej ustawione parametry \u2013 dma_cfg, miejsce, z kt\u00f3rego b\u0119dziemy pobiera\u0107 dane \u2013 destination_data, docelowe miejsce dla danych \u2013 source_data, liczba element\u00f3w do wys\u0142ania \u2013 DATA_SIZE oraz parametr false, definiuj\u0105cy, \u017ce w tym momencie DMA nie powinno by\u0107 jeszcze uruchamiane.<\/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-69e8a97 elementor-widget elementor-widget-text-editor\" data-id=\"69e8a97\" 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 style=\"font-weight: 400\"> \u00a0\u00a0 \/\/ Register an interrupt for DMA<br \/> \u00a0\u00a0 irq_set_exclusive_handler(DMA_IRQ_0, dma_complete_handler);<br \/>\u00a0\u00a0\u00a0 irq_set_enabled(DMA_IRQ_0, true);<br \/><br \/> \u00a0\u00a0 \/\/ Start DMA transfer<br \/>\u00a0\u00a0\u00a0 dma_start_channel_mask(1u &lt;&lt; dma_chan);<\/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-1a10176 elementor-widget elementor-widget-text-editor\" data-id=\"1a10176\" 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\">Nast\u0119pnie poprzez irq_set_exclusive_handler okre\u015blamy, \u017ce w przypadku pojawienia si\u0119 przerwania DMA_IRQ_0, informuj\u0105cego o zako\u0144czeniu transmisji danych uruchamiana powinna by\u0107 funkcja dma_complete_handler, umieszczona na pocz\u0105tku programu. Kolejna instrukcja, irq_set_enabled, dzi\u0119ki parametrowi \u201etrue\u201d uruchamia przerwania dla flagi DMA_IRQ_0.<\/p><p style=\"font-weight: 400\">W tym momencie DMA jest ju\u017c w pe\u0142ni skonfigurowane, a przerwania uruchomione, tak\u017ce mo\u017cemy uruchomi\u0107 proces, kt\u00f3ry rozpocznie przesy\u0142ane danych. S\u0142u\u017cy do tego funkcja dma_start_channel_mask, oczekuj\u0105ca w argumencie podania maski bitowej odpowiadaj\u0105cej wybranemu kana\u0142owi DMA. Brzmi to skomplikowanie, ale w rzeczywisto\u015bci oznacza utworzenie warto\u015bci, w kt\u00f3rej logiczna jedynka znajdzie si\u0119 w miejscu odpowiadaj\u0105cym numerowi kana\u0142. Tak wi\u0119c wystarczy przesun\u0105\u0107 liczb\u0119 jeden w lew\u0105 stron\u0119, o warto\u015b\u0107 zapisan\u0105 w dma_chan. Dla przyk\u0142adu, je\u015bli korzysta\u0107 b\u0119dziemy z kana\u0142u numer dwa, przesuniemy jedynk\u0119 o dwa miejsca, uzyskuj\u0105c warto\u015b\u0107 \u201e10\u201d, a w\u0142a\u015bnie danych w takim formacie oczekuje polecenie dma_start_channel_mask.<\/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-957caff elementor-widget elementor-widget-text-editor\" data-id=\"957caff\" 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 style=\"font-weight: 400\"> \u00a0\u00a0 \/\/ Wait for the transfer to be completed<br \/> \u00a0\u00a0 while (dma_channel_is_busy(dma_chan)) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tight_loop_contents();<br \/>\u00a0\u00a0\u00a0 }<\/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-2b3d39b elementor-widget elementor-widget-text-editor\" data-id=\"2b3d39b\" 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;\">Nast\u0119pnie zwa\u017cywszy, \u017ce nasz program nie b\u0119dzie wykonywa\u0107 \u017cadnych innych operacji, mo\u017cemy poczeka\u0107 na zako\u0144czenie transmisji danych i pozna\u0107 kolejn\u0105 funkcj\u0119 skojarzon\u0105 z DMA. dma_channel_is_busy zwraca status zaj\u0119to\u015bci kana\u0142u, kt\u00f3rego numer podali\u015bmy w argumencie. Gdy dane s\u0105 przesy\u0142ane, b\u0119dzie to jeden i funkcja while b\u0119dzie ca\u0142y czas zap\u0119tlona. Dopiero po zako\u0144czeniu transmisji argument p\u0119tli b\u0119dzie fa\u0142szywy i RP2040 przejdzie do wykonywania kolejnych polece\u0144.<\/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-8fa7cc4 elementor-widget elementor-widget-text-editor\" data-id=\"8fa7cc4\" 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 style=\"font-weight: 400\"> \u00a0\u00a0 while(true){<br \/> \u00a0\u00a0 \/\/ Check out the results<br \/> \u00a0\u00a0 printf(\"Source Data: \");<br \/> \u00a0\u00a0 for (int i = 0; i &lt; DATA_SIZE; i++) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"%d \", source_data[i]);<br \/> \u00a0\u00a0 }<br \/>\u00a0\u00a0\u00a0 printf(\"\\n\");<br \/><br \/> \u00a0\u00a0 printf(\"Destination Data: \");<br \/> \u00a0\u00a0 for (int i = 0; i &lt; DATA_SIZE; i++) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"%d \", destination_data[i]);<br \/> \u00a0\u00a0 }<br \/> \u00a0\u00a0 printf(\"\\n\");<br \/> \u00a0\u00a0 sleep_ms(1000);<br \/> \u00a0\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-db27902 elementor-widget elementor-widget-text-editor\" data-id=\"db27902\" 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 momencie wiemy ju\u017c, \u017ce wszystko zosta\u0142o zrobione i mo\u017cemy sprawdzi\u0107 efekty dzia\u0142ania modu\u0142u DMA. W tym celu wy\u015blemy na ekran komputera warto\u015bci spod source_data oraz destination_data, oczekuj\u0105c \u017ce b\u0119d\u0105 one takie same. Zadanie to zrealizuj\u0105 dwie p\u0119tle niemal identyczne, jak ta, z kt\u00f3rej skorzystali\u015bmy w przypadku zapisywania danych do tablicy. Przy ka\u017cdym jej przebiegu skorzystamy z printf, skojarzonego z indeksem i. Kod ten umieszczony jest wewn\u0105trz niesko\u0144czonej p\u0119tli while i wykonywany b\u0119dzie co sekund\u0119.<\/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-a214bb1 elementor-widget elementor-widget-image\" data-id=\"a214bb1\" 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\/08\/dma-serial.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"dma serial\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2NTc0IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvZG1hLXNlcmlhbC5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"517\" height=\"203\" src=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/dma-serial.png\" class=\"attachment-large size-large wp-image-86574\" alt=\"\" srcset=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/dma-serial.png 517w, https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/dma-serial-300x118.png 300w\" sizes=\"(max-width: 517px) 100vw, 517px\" \/>\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\u015bci bazowe i przes\u0142ane przez DMA. <\/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-a59ddd2 elementor-widget elementor-widget-text-editor\" data-id=\"a59ddd2\" 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 uruchamianiu programu powinni\u015bmy zobaczy\u0107 identyczne ci\u0105gi liczb naturalnych zar\u00f3wno w tablicy \u017ar\u00f3d\u0142owej, jak i docelowej. Je\u015bli tak jest, oznacza to, \u017ce DMA przes\u0142a\u0142o dane poprawnie, a co najwa\u017cniejsze w procesie tym nie bra\u0142 udzia\u0142u rdze\u0144 procesora, a jego zadaniem by\u0142o tylko odpowiednio skonfigurowa\u0107 ten modu\u0142\u00a0i go uruchomi\u0107. Oczywi\u015bcie wykorzystywanie bezpo\u015bredniego dost\u0119pu do pami\u0119ci do tak prostego celu, jak przes\u0142anie danych mi\u0119dzy dwoma niewielkim tablicami jest przerostem formy nad tre\u015bci\u0105, ale dzi\u0119ki tak prostemu programowi mogli\u015bmy po raz pierwszy skorzysta\u0107 z DMA. Modu\u0142 ten ujawnia swoje mo\u017cliwo\u015bci dopiero w bardziej skomplikowanych programach takich jak sterowanie z\u0142o\u017conymi wy\u015bwietlaczami.<\/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-7818632 elementor-widget elementor-widget-heading\" data-id=\"7818632\" 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-55f7c33 elementor-widget elementor-widget-text-editor\" data-id=\"55f7c33\" 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 materiale zako\u0144czyli\u015bmy prac\u0119 nad bibliotek\u0105 dla cyfrowego czujnika \u015bwiat\u0142a VEML7700, czyni\u0105c z niego element obiektowy. Dodatkowo poznali\u015bmy te\u017c funkcjonalno\u015b\u0107, jak\u0105 jest DMA i dzi\u0119ki prostemu programowi sprawdzili\u015bmy jej dzia\u0142anie. Na ten moment jest to ostatni materia\u0142\u00a0z serii poradnik\u00f3w dla Raspberry Pi Pico, cho\u0107 pozosta\u0142o jeszcze sporo temat\u00f3w, kt\u00f3re mogliby\u015bmy om\u00f3wi\u0107: sterowanie wy\u015bwietlaczem OLED, komunikacja z czujnikiem warunk\u00f3w \u015brodowiskowych, wielordzeniowo\u015b\u0107 w RP2040 i wiele innych. Je\u015bli chcecie, aby seria poradnikowa by\u0142a kontynuowana, dajcie zna\u0107 w komentarzu pod tym artyku\u0142em.<\/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-9c96d11 elementor-widget elementor-widget-spacer\" data-id=\"9c96d11\" 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-afe8ecb elementor-widget elementor-widget-text-editor\" data-id=\"afe8ecb\" 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><li>https:\/\/www.vishay.com\/docs\/84286\/veml7700.pdf<\/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 tej cz\u0119\u015bci kursu ulepszymy program obs\u0142uguj\u0105cy sensor VEML7700 i przyjrzymy si\u0119 bli\u017cej funkcjonalno\u015bci RP2040, jak\u0105 jest bezpo\u015bredni dost\u0119p do pami\u0119ci \u2013 DMA.<\/p>\n","protected":false},"author":34,"featured_media":86641,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7,21,134],"tags":[],"class_list":["post-86315","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.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kurs Raspberry Pi Pico \u2013 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA - Botland<\/title>\n<meta name=\"description\" content=\"W tej cz\u0119\u015bci kursu ulepszymy program obs\u0142uguj\u0105cy sensor VEML7700 i przyjrzymy si\u0119 bli\u017cej funkcjonalno\u015bci RP2040, jak\u0105 jest bezpo\u015bredni dost\u0119p do pami\u0119ci \u2013 DMA.\" \/>\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-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/\" \/>\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 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA - Botland\" \/>\n<meta property=\"og:description\" content=\"W tej cz\u0119\u015bci kursu ulepszymy program obs\u0142uguj\u0105cy sensor VEML7700 i przyjrzymy si\u0119 bli\u017cej funkcjonalno\u015bci RP2040, jak\u0105 jest bezpo\u015bredni dost\u0119p do pami\u0119ci \u2013 DMA.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/\" \/>\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-08-21T07:13:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-08T08:52:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_13.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-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/\"},\"author\":{\"name\":\"Rafa\u0142 Bartoszak\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/#\\\/schema\\\/person\\\/5a69e7f5db1f77c617f990e73bb83215\"},\"headline\":\"Kurs Raspberry Pi Pico \u2013 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\\\/2, DMA\",\"datePublished\":\"2024-08-21T07:13:26+00:00\",\"dateModified\":\"2026-04-08T08:52:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/\"},\"wordCount\":4637,\"publisher\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/kurs_pico_13.png\",\"articleSection\":[\"Elektronika\",\"Programowanie\",\"Raspberry Pi\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/\",\"name\":\"Kurs Raspberry Pi Pico \u2013 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\\\/2, DMA - Botland\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/kurs_pico_13.png\",\"datePublished\":\"2024-08-21T07:13:26+00:00\",\"dateModified\":\"2026-04-08T08:52:58+00:00\",\"description\":\"W tej cz\u0119\u015bci kursu ulepszymy program obs\u0142uguj\u0105cy sensor VEML7700 i przyjrzymy si\u0119 bli\u017cej funkcjonalno\u015bci RP2040, jak\u0105 jest bezpo\u015bredni dost\u0119p do pami\u0119ci \u2013 DMA.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/#primaryimage\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/kurs_pico_13.png\",\"contentUrl\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/kurs_pico_13.png\",\"width\":1510,\"height\":755},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\\\/#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 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\\\/2, DMA\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/\",\"name\":\"Botland\",\"description\":\"Blog Raspberry Pi, Arduino, elektronika i robotyka - Botland\",\"publisher\":{\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/#organization\",\"name\":\"Botland\",\"url\":\"https:\\\/\\\/botland.com.pl\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/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.com.pl\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/facebook.com\\\/Botland\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/botland.com.pl\\\/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 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA - Botland","description":"W tej cz\u0119\u015bci kursu ulepszymy program obs\u0142uguj\u0105cy sensor VEML7700 i przyjrzymy si\u0119 bli\u017cej funkcjonalno\u015bci RP2040, jak\u0105 jest bezpo\u015bredni dost\u0119p do pami\u0119ci \u2013 DMA.","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-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/","og_locale":"pl_PL","og_type":"article","og_title":"Kurs Raspberry Pi Pico \u2013 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA - Botland","og_description":"W tej cz\u0119\u015bci kursu ulepszymy program obs\u0142uguj\u0105cy sensor VEML7700 i przyjrzymy si\u0119 bli\u017cej funkcjonalno\u015bci RP2040, jak\u0105 jest bezpo\u015bredni dost\u0119p do pami\u0119ci \u2013 DMA.","og_url":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/","og_site_name":"Botland","article_publisher":"https:\/\/facebook.com\/Botland\/","article_published_time":"2024-08-21T07:13:26+00:00","article_modified_time":"2026-04-08T08:52:58+00:00","og_image":[{"width":1510,"height":755,"url":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_13.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-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/#article","isPartOf":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/"},"author":{"name":"Rafa\u0142 Bartoszak","@id":"https:\/\/botland.com.pl\/blog\/#\/schema\/person\/5a69e7f5db1f77c617f990e73bb83215"},"headline":"Kurs Raspberry Pi Pico \u2013 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA","datePublished":"2024-08-21T07:13:26+00:00","dateModified":"2026-04-08T08:52:58+00:00","mainEntityOfPage":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/"},"wordCount":4637,"publisher":{"@id":"https:\/\/botland.com.pl\/blog\/#organization"},"image":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/#primaryimage"},"thumbnailUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_13.png","articleSection":["Elektronika","Programowanie","Raspberry Pi"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/","url":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/","name":"Kurs Raspberry Pi Pico \u2013 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA - Botland","isPartOf":{"@id":"https:\/\/botland.com.pl\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/#primaryimage"},"image":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/#primaryimage"},"thumbnailUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_13.png","datePublished":"2024-08-21T07:13:26+00:00","dateModified":"2026-04-08T08:52:58+00:00","description":"W tej cz\u0119\u015bci kursu ulepszymy program obs\u0142uguj\u0105cy sensor VEML7700 i przyjrzymy si\u0119 bli\u017cej funkcjonalno\u015bci RP2040, jak\u0105 jest bezpo\u015bredni dost\u0119p do pami\u0119ci \u2013 DMA.","breadcrumb":{"@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/#primaryimage","url":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_13.png","contentUrl":"https:\/\/botland.com.pl\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_13.png","width":1510,"height":755},{"@type":"BreadcrumbList","@id":"https:\/\/botland.com.pl\/blog\/kurs-raspberry-pi-pico-13-biblioteka-dla-cyfrowego-czujnika-swiatla-2-2-dma\/#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 #13 \u2013 biblioteka dla cyfrowego czujnika \u015bwiat\u0142a 2\/2, DMA"}]},{"@type":"WebSite","@id":"https:\/\/botland.com.pl\/blog\/#website","url":"https:\/\/botland.com.pl\/blog\/","name":"Botland","description":"Blog Raspberry Pi, Arduino, elektronika i robotyka - Botland","publisher":{"@id":"https:\/\/botland.com.pl\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/botland.com.pl\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/botland.com.pl\/blog\/#organization","name":"Botland","url":"https:\/\/botland.com.pl\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/botland.com.pl\/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.com.pl\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/Botland\/"]},{"@type":"Person","@id":"https:\/\/botland.com.pl\/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\/86315","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=86315"}],"version-history":[{"count":0,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/posts\/86315\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/media\/86641"}],"wp:attachment":[{"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/media?parent=86315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/categories?post=86315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/botland.com.pl\/blog\/wp-json\/wp\/v2\/tags?post=86315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}