{"id":83763,"date":"2024-07-15T14:00:33","date_gmt":"2024-07-15T12:00:33","guid":{"rendered":"https:\/\/homebook.click\/blog\/?p=83763"},"modified":"2026-04-08T10:54:37","modified_gmt":"2026-04-08T08:54:37","slug":"kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c","status":"publish","type":"post","link":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/","title":{"rendered":"Kurs Raspberry Pi Pico \u2013 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C"},"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\"> 15<\/span> <span class=\"rt-label rt-postfix\">min.<\/span><\/span>\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"83763\" class=\"elementor elementor-83763\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c37de39 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c37de39\" 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-d34a722\" data-id=\"d34a722\" 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-137a153 elementor-widget elementor-widget-text-editor\" data-id=\"137a153\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">W poprzednim materiale poruszyli\u015bmy ca\u0142kiem sporo temat\u00f3w zwi\u0105zanych z j\u0119zykiem C. Przyjrzeli\u015bmy si\u0119 tablicom, zbudowali\u015bmy struktur\u0119 oraz nauczyli\u015bmy si\u0119 przekazywa\u0107 dane do funkcji poprzez wska\u017anik. Poza tym uruchomili\u015bmy projekt sygnalizatora \u015bwietlnego opartego na maszynie stan\u00f3w. W tym poradniku skorzystamy z do\u0142\u0105czonego do zestawu element\u00f3w cyfrowego czujnika \u015bwiat\u0142a. Postaramy si\u0119 go uruchomi\u0107 i sprawdzimy, czy jest on dobr\u0105 konkurencj\u0105 dla poznanego ju\u017c wcze\u015bniej fotorezystora.<\/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-a341039 elementor-widget elementor-widget-image\" data-id=\"a341039\" 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-cc42091 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"cc42091\" 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-6ace303\" data-id=\"6ace303\" 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-00e61f4 elementor-widget elementor-widget-image\" data-id=\"00e61f4\" 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-b2f0745\" data-id=\"b2f0745\" 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-150a653 elementor-widget elementor-widget-text-editor\" data-id=\"150a653\" 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-e674e28 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"e674e28\" 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-142c95e elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"142c95e\" 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-62876e3 elementor-widget elementor-widget-text-editor\" data-id=\"62876e3\" 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 style=\"font-size: 16px;\"><a href=\"https:\/\/homebook.click\/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:\/\/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-0f13124 elementor-widget elementor-widget-heading\" data-id=\"0f13124\" 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-a123d27 elementor-widget elementor-widget-image\" data-id=\"a123d27\" 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-1024x576-2.webp\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"IMG_0647-1024x576\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijc5NzA3IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wMVwvSU1HXzA2NDctMTAyNHg1NzYtMi53ZWJwIn0%3D\" 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-2.webp\" class=\"attachment-large size-large wp-image-79707\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576-2.webp 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/01\/IMG_0647-1024x576-2-300x169.webp 300w, https:\/\/homebook.click\/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-c458d91 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"c458d91\" 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-a2c6c37 elementor-widget elementor-widget-text-editor\" data-id=\"a2c6c37\" 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-5b078f6 elementor-widget elementor-widget-text-editor\" data-id=\"5b078f6\" 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-82f030b elementor-widget elementor-widget-spacer\" data-id=\"82f030b\" 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-fd3aafb elementor-widget elementor-widget-heading\" data-id=\"fd3aafb\" 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\">Dzisiejszy bohater, czyli cyfrowy czujnik \u015bwiat\u0142a <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-94e9afe elementor-widget elementor-widget-image\" data-id=\"94e9afe\" 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\/07\/Czujnik-VEML7700.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"Czujnik VEML7700\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzNzY1IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvQ3p1am5pay1WRU1MNzcwMC5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Czujnik-VEML7700-1024x576.png\" class=\"attachment-large size-large wp-image-83765\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Czujnik-VEML7700-1024x576.png 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Czujnik-VEML7700-300x169.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Czujnik-VEML7700-768x432.png 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Czujnik-VEML7700-1536x864.png 1536w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Czujnik-VEML7700.png 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\">Modu\u0142 DFRobot Gravity VEML7700.<\/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-0f200eb elementor-widget elementor-widget-text-editor\" data-id=\"0f200eb\" 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 zestawie element\u00f3w dedykowanego dla tego kursu znale\u017a\u0107 mo\u017cecie cyfrowy czujnik \u015bwiat\u0142a <a href=\"https:\/\/homebook.click\/gravity-czujnik-swiatla-i-koloru\/9528-dfrobot-gravity-veml7700-cyfrowy-czujnik-swiatla-otoczenia-i2c-6959420912575.html\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>VEML7700<\/strong><\/a> nale\u017c\u0105cy do serii Gravity brytyjskiego producenta <a href=\"https:\/\/homebook.click\/producent\/92-dfrobot\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\"><strong>DFRobot<\/strong><\/a>. Konstrukcja ta ma form\u0119 niewielkiego modu\u0142u, kt\u00f3ry nadaje si\u0119 wr\u0119cz idealnie do wszelakiego prototypowania.\u00a0<\/p><p style=\"font-weight: 400\">Na p\u0142ytce znajdziemy 4 pinowe z\u0142\u0105cze do zasilania napi\u0119ciem od 3,3V do 5V oraz komunikacji za pomoc\u0105 interfejsu I2C. Poza tym na p\u0142ytce znalaz\u0142o si\u0119 te\u017c kilka element\u00f3w elektronicznych \u2013 rezystory, kondensatory, stabilizator napi\u0119cia oraz dwa tranzystory. Zdecydowanie najciekawszym elementem modu\u0142u jest sam sensor VEML7700 zamkni\u0119ty w przezroczystej obudowie, tak aby \u015bwiat\u0142o mog\u0142o pada\u0107 na rdze\u0144 czujnika.<\/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-02bc201 elementor-widget elementor-widget-image\" data-id=\"02bc201\" 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\/07\/Image_340-scaled.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"Image_340\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzNzY5IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvSW1hZ2VfMzQwLXNjYWxlZC5qcGcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"600\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Image_340-1024x768.jpg\" class=\"attachment-large size-large wp-image-83769\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Image_340-1024x768.jpg 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Image_340-300x225.jpg 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Image_340-768x576.jpg 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Image_340-1536x1152.jpg 1536w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/Image_340-2048x1536.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\">Mikroskopowe zdj\u0119cie uk\u0142adu VEML7700.<\/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-a97a6c2 elementor-widget elementor-widget-text-editor\" data-id=\"a97a6c2\" 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\">Dzi\u0119ki tak specyficznej obudowie mo\u017cna do\u015b\u0107 \u0142atwo zajrze\u0107 do wn\u0119trza uk\u0142adu i przyjrze\u0107 si\u0119 bli\u017cej jego konstrukcji. Centraln\u0105 cz\u0119\u015b\u0107 krzemowego rdzenia zajmuje matryca szesnastu fotodiod pokrytych kolorowymi filtrami, kt\u00f3re polaryzuj\u0105 \u015bwiat\u0142o. Zale\u017cnie od ilo\u015bci padaj\u0105cych na fotoelementy foton\u00f3w zmienia si\u0119 warto\u015b\u0107 generowanego przez nie napi\u0119cia, kt\u00f3re po przetworzeniu przez analogowo-cyfrowy przetwornik mo\u017ce zosta\u0107 odczytane przez dowolny mikrokontroler. Cyfrowa warto\u015b\u0107 dostarczana przez czujnik jest ju\u017c praktycznie gotow\u0105 zmienn\u0105 warto\u015bci nat\u0119\u017cenia \u015bwiat\u0142a w jednostce Lux. Dzi\u0119ki temu obs\u0142uga VEML7700 jest stosunkowo prosta i nie powinna sprawi\u0107 wi\u0119kszych problem\u00f3w. Jak ju\u017c wspomnia\u0142em, z czujnikiem komunikujemy si\u0119 za pomoc\u0105 interfejsu I2C, kt\u00f3rego specyfik\u0119 r\u00f3wnie\u017c wypada\u0142oby kr\u00f3tko wyja\u015bni\u0107.\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-660be0e elementor-widget elementor-widget-image\" data-id=\"660be0e\" 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\/07\/i2c_block.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"i2c_block\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzNzczIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvaTJjX2Jsb2NrLnBuZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"251\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2c_block-1024x321.png\" class=\"attachment-large size-large wp-image-83773\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2c_block-1024x321.png 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2c_block-300x94.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2c_block-768x241.png 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2c_block.png 1091w\" 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\">Koncepcja komunikacji I2C.<\/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-4e5e01f elementor-widget elementor-widget-text-editor\" data-id=\"4e5e01f\" 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\">Interfejs I2C to dwu przewodowa metoda, kt\u00f3ra mo\u017ce \u0142\u0105czy\u0107 ze sob\u0105 dwa lub wi\u0119ksz\u0105 ilo\u015b\u0107 elektronicznych modu\u0142\u00f3w lub urz\u0105dze\u0144. Komunikacja tego typu bazuje na pojedynczym urz\u0105dzeniu nadrz\u0119dnym, tak zwanym masterze, do kt\u00f3rego pod\u0142\u0105czonych mo\u017ce by\u0107 nawet kilkana\u015bcie modu\u0142\u00f3w podrz\u0119dnych, okre\u015blanych jako slave. Do wymiany danych wykorzystywane s\u0105 przewody SCL \u2013 s\u0142u\u017cy do synchronizacji mi\u0119dzy urz\u0105dzeniami oraz SDA \u2013 linia danych, kt\u00f3r\u0105 przesy\u0142ane s\u0105 kolejne bity informacji. Interfejs I2C nie nale\u017cy do najszybszych metod transmisji danych, ale dzi\u0119ki swojej uniwersalno\u015bci stosowany jest do\u015b\u0107 powszechnie. Dzi\u0119ki niemu mo\u017cemy pod\u0142\u0105czy\u0107 do mikrokontrolera nie tylko r\u00f3\u017cnego rodzaju czujniki, ale i ekspandery wyprowadze\u0144, pozwalaj\u0105ce zwi\u0119kszy\u0107 fizyczn\u0105 ilo\u015b\u0107 pin\u00f3w jednostki centralnej.<\/p><p style=\"font-weight: 400\">Zadaniem mastera w komunikacji I2C jest kontrola i zarz\u0105dzanie przep\u0142ywem informacji. Jako \u017ce ka\u017cde z urz\u0105dze\u0144 pod\u0142\u0105czonych do magistrali ma sw\u00f3j w\u0142asny i unikatowy adres, mo\u017cliwa jest bezkolizyjna komunikacja, w kt\u00f3rej wydane przez nadrz\u0119dny uk\u0142ad polecenie trafia do konkretnego slava. W taki w\u0142a\u015bnie spos\u00f3b spr\u00f3bujemy skomunikowa\u0107 si\u0119 z cyfrowym czujnikiem \u015bwiat\u0142a, wysy\u0142aj\u0105c konkretne komendy pod adres czujnika.<\/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-35449d7 elementor-widget elementor-widget-heading\" data-id=\"35449d7\" 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\">Pod\u0142\u0105czenie czujnika do Raspberry Pi Pico<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b62ae19 elementor-widget elementor-widget-image\" data-id=\"b62ae19\" 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\/07\/IMG_1654-scaled.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"IMG_1654\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzNzc3IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvSU1HXzE2NTQtc2NhbGVkLmpwZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1654-1024x576.jpg\" class=\"attachment-large size-large wp-image-83777\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1654-1024x576.jpg 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1654-300x169.jpg 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1654-768x432.jpg 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1654-1536x864.jpg 1536w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1654-2048x1152.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Obw\u00f3d z pod\u0142\u0105czonym czujnikiem \u015bwiat\u0142a.<\/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-c0efa88 elementor-widget elementor-widget-text-editor\" data-id=\"c0efa88\" 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\">Jednak, aby zacz\u0105\u0107 korzysta\u0107 z interfejsu I2C, musimy pod\u0142\u0105czy\u0107 czujnik \u015bwiat\u0142a do Raspberry Pi Pico. W zestawie z modu\u0142em znale\u017a\u0107 mo\u017cna przew\u00f3d, z jednej strony zako\u0144czony specjalnym wtykiem PH4, z drugiej natomiast umieszczono klasyczne \u017ce\u0144skie gniazdo goldpin. Mogliby\u015bmy skorzysta\u0107 z tego przewodu, ale znacznie lepszym rozwi\u0105zaniem jest u\u017cycie \u0142\u0105cznika, kt\u00f3rego jedno z zako\u0144cze\u0144 wyposa\u017cono w m\u0119skie z\u0142\u0105cze goldpin, dzi\u0119ki niemu znacznie \u0142atwiej jest wpi\u0105\u0107 si\u0119 w p\u0142ytk\u0119 stykow\u0105. Poza tym na ko\u0144c\u00f3wkach tego przewodu umieszczone s\u0105 opisy konkretnych sygna\u0142\u00f3w. Czerwony przew\u00f3d VCC pod\u0142\u0105czmy do dodatniej magistrali 3,3V, czarny \u2013 GND \u0142\u0105czymy z mas\u0105. Ko\u0144c\u00f3wki sygna\u0142owe SDA i SCL pod\u0142\u0105czamy kolejno pod piny GP6 i GP7, fizycznie s\u0105 to wyprowadzenia numer 9 i 10. Je\u015bli spojrzycie na pinout RPI Pico, zobaczycie, \u017ce mi\u0119dzy innymi w tym miejscu wyprowadzone zosta\u0142y sygna\u0142y magistrali I2C1. Co warto zauwa\u017cy\u0107, RP2040 dysponuje dwoma tego typu interfejsami I2C0 i I2C1, w naszym projekcie skorzystamy z drugiej magistrali danych.<\/p><p style=\"font-weight: 400\">Gdy czujnik jest ju\u017c pod\u0142\u0105czony, mo\u017cemy przej\u015b\u0107 do jego uruchamiania. Jednak zanim zaczniemy odczytywa\u0107 cyfrowe warto\u015bci nat\u0119\u017cenia \u015bwiat\u0142a, musimy pozna\u0107 adres czujnika. Jak ju\u017c wspomina\u0142em interfejs I2C pozwala pod\u0142\u0105czy\u0107 do mikrokontrolera znacznie wi\u0119cej ni\u017c jeden czujnik, a ich obs\u0142uga bazuje na unikalnym adresie ka\u017cdego z urz\u0105dze\u0144. Informacje o adresie elektronicznych modu\u0142\u00f3w znale\u017a\u0107 mo\u017cna w wielu miejscach. Zdarza si\u0119, \u017ce ju\u017c na samym laminacie znajdziemy nadrukowane oznaczenie ADDR:0x01, wiemy w\u00f3wczas, \u017ce adres czujnika to w\u0142a\u015bnie 0x01. Poza tym wiele sensor\u00f3w pozwala w niewielkim stopniu manipulowa\u0107 adresami, zmieniaj\u0105c u\u0142o\u017cenie zworek (zazwyczaj rezystor\u00f3w o warto\u015bci 0\u03a9) i tym sposobem zmienia\u0107 adres czujnika. Jednak najbezpieczniej jest zawsze zajrze\u0107 do dokumentacji danego modu\u0142u.<\/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-6691354 elementor-widget elementor-widget-image\" data-id=\"6691354\" 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\/07\/i2caddr.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"i2caddr\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzNzgyIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvaTJjYWRkci5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"206\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2caddr-1024x264.png\" class=\"attachment-large size-large wp-image-83782\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2caddr-1024x264.png 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2caddr-300x77.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2caddr-768x198.png 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2caddr.png 1433w\" 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\">Dokumentacja czujnika VEML7700. (https:\/\/www.vishay.com\/docs\/84286\/veml7700.pdf)<\/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-a368a90 elementor-widget elementor-widget-text-editor\" data-id=\"a368a90\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Na sz\u00f3stej stronie dost\u0119pnej w internecie <a href=\"https:\/\/www.vishay.com\/docs\/84286\/veml7700.pdf\" data-wpel-link=\"external\" target=\"_blank\" rel=\"nofollow external noopener noreferrer\">nocie katalogowej<\/a> sensora VEML7700 znale\u017a\u0107 mo\u017cemy konkretne informacje o adresie urz\u0105dzenia. Z sekcji Device Address dowiadujemy si\u0119, \u017ce czujnik w trybie slave ma sta\u0142y, 7 bitowy adres o warto\u015bci 0x10 i tyle nam na ten moment wystarczy, wszak\u017ce w kolejnych programach korzysta\u0107 b\u0119dziemy w\u0142a\u015bnie z trybu slave, gdzie masterem b\u0119dzie Raspberry Pi Pico.<\/p><p style=\"font-weight: 400\">W przypadku czujnika VEML7700, znalezienie informacji o adresie jest do\u015b\u0107 proste, nie zawsze jednak tak jest. Musimy zdawa\u0107 sobie spraw\u0119, \u017ce w przysz\u0142o\u015bci mo\u017cemy natkn\u0105\u0107 si\u0119 na modu\u0142y b\u0105d\u017a czujniki, kt\u00f3rych adres b\u0119dzie nieznany. W takim przypadku nie b\u0119dziemy zgadywa\u0107 warto\u015bci, pod kt\u00f3r\u0105 zg\u0142osi\u0142o si\u0119 urz\u0105dzenie, a skorzystamy z prostego programu, kt\u00f3ry pozwala zidentyfikowa\u0107 wszystkie pod\u0142\u0105czone do magistrali i2C sprz\u0119ty. Tego typu kody nazywamy \u201eskanerami I2C\u201d, ich dzia\u0142anie jest do\u015b\u0107 proste. Program odpytuje kolejne adresy na magistrali i zale\u017cnie od odpowiedzi stwierdza, czy pod tym adresem widnieje jakie\u015b urz\u0105dzenie. Dzi\u0119ki temu nie musimy zna\u0107 adresu urz\u0105dzenia, bo poda nam je uruchomiony program. W kolejnym rozdziale uruchomimy tego typu kod i sprawdzimy, czy cyfrowy czujnik \u015bwiat\u0142a rzeczywi\u015bcie ma adres 0x10.\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-9bf2366 elementor-widget elementor-widget-heading\" data-id=\"9bf2366\" 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\">Skanowanie magistrali I2C<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fa3fa44 elementor-widget elementor-widget-text-editor\" data-id=\"fa3fa44\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Tak jak wspomnia\u0142em &#8211; pierwszym programem, kt\u00f3ry dzisiaj uruchomimy, b\u0119dzie skaner I2C, dzi\u0119ki kt\u00f3remu sprawdzimy, czy adres sensora VEML7700 zgodny jest z warto\u015bci\u0105 w dokumentacji. Kod ten pozwoli nam po raz pierwszy skorzysta\u0107 z magistrali I2C. Tak wi\u0119c, gdy czujnik jest ju\u017c pod\u0142\u0105czony do RPI Pico, zgodnie z wcze\u015bniejszym opisem mo\u017cemy przej\u015b\u0107 do projektu, kt\u00f3ry nazwa\u0142em I2C_scanner.<\/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-a33dd49 elementor-widget elementor-widget-text-editor\" data-id=\"a33dd49\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>#include &lt;stdio.h&gt;<br \/>#include \"pico\/stdlib.h\"<br \/>#include \"hardware\/i2c.h\"<br \/><br \/>\/\/ I2C definitions<br \/>#define I2C_PORT i2c1<br \/>#define SDA_PIN 6<br \/>#define SCL_PIN 7<br \/><br \/>void i2c_scan(); \/\/ prototype of the scanning function<br \/><br \/>int main() {<br \/>stdio_init_all();<br \/><br \/>\/\/ I2C initialization<br \/>i2c_init(I2C_PORT, 100 * 1000);<br \/>gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);<br \/>gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);<br \/>gpio_pull_up(SDA_PIN);<br \/>gpio_pull_up(SCL_PIN);<br \/><br \/>while(true) {<br \/>i2c_scan();<br \/>sleep_ms(3000);<br \/>}<br \/><br \/>}<br \/><br \/>void i2c_scan() {<br \/>printf(\"Scanning I2C bus...\\n\");<br \/><br \/>\/\/ bus scanning loop<br \/>for (uint8_t addr = 1; addr = 0) {<br \/>printf(\"Found I2C device at address 0x%02X\\n\", addr);<br \/>}<br \/>}<br \/>printf(\"Scanning done.\\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-3a9a312 elementor-widget elementor-widget-text-editor\" data-id=\"3a9a312\" 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 pierwszej fazie programu, jak to zwykle bywa, znalaz\u0142y si\u0119 biblioteki oraz odpowiednie definicje. Jako \u017ce b\u0119dziemy korzysta\u0107 z magistrali I2C, musimy do\u0142\u0105czy\u0107 bibliotek\u0119 \u201ehardweare\/i2c.h\u201d, w pliku tym znalaz\u0142y si\u0119 wszystkie podstawowe polecenia pozwalaj\u0105ce korzysta\u0107 z tego rodzaju transmisji danych. Dzi\u0119ki umieszczonym w dalszej cz\u0119\u015bci definicjom b\u0119dziemy mogli korzysta\u0107 z trzech makr: I2C_PORT, SDA_PIN oraz SCL_PIN. Jak \u0142atwo si\u0119 domy\u015bli\u0107 dwie ostatnie definicje odnosz\u0105 si\u0119 do numer\u00f3w wyprowadze\u0144, z kt\u00f3rych korzysta\u0107 b\u0119dzie cyfrowy czujnik \u015bwiat\u0142a, czyli GP6 i GP7. Natomiast I2C_PORT b\u0119dzie od tej chwili r\u00f3wnoznaczne z i2c1. Jak ju\u017c wspomina\u0142em, Raspberry Pi Pico W dysponuje dwiema magistralami w standardzie I2C: I2C0 i I2C1. Czujnik, kt\u00f3ry w dalszej cz\u0119\u015bci artyku\u0142u uruchamiamy, pod\u0142\u0105czyli\u015bmy do wyprowadze\u0144 odpowiadaj\u0105cych drugiej szynie danych, dlatego w kodzie umieszczamy i2c1.<\/p><p style=\"font-weight: 400\">Kolejnym krokiem jest do\u0142\u0105czenie prototypu funkcji i2c_scan. To w\u0142a\u015bnie ona b\u0119dzie g\u0142\u00f3wn\u0105 cz\u0119\u015bci\u0105 kodu, ale dla odmiany umie\u015bci\u0142em j\u0105 na samym ko\u0144cu programu, dlatego w takim przypadku, jak ju\u017c kiedy\u015b wspomina\u0142em do\u0142\u0105czamy prototyp. Funkcja ta ma typ void, tak wi\u0119c nie zwraca danych, dodatkowo tez nie przekazujemy do niej \u017cadnych argument\u00f3w.<\/p><p style=\"font-weight: 400\">Wewn\u0105trz g\u0142\u00f3wnej funkcji main inicjalizujemy standardowe polecenia biblioteki stdio.h, jak i sam interfejs I2C. S\u0142u\u017cy do tego instrukcja i2c_init, w kt\u00f3rej argumentach przekazujemy odpowiedni port, dzi\u0119ki definicji I2C_PORT jest to i2c1, a tak\u017ce tak zwany boudrate, b\u0119d\u0105cy w tym przypadku warto\u015bci\u0105 cz\u0119stotliwo\u015bci, z jak\u0105 przesy\u0142ane b\u0119d\u0105 dane. I2C wspiera kilka szybko\u015bci transmisji danych, gdzie podstawowymi s\u0105 100kHz (standard), 400kHz (fast mode), 1MHz (fast mode plus), 3,4MHz (high speed mode) oraz 5MHz (ultra fast mode). W naszym projekcie skorzystamy ze standardowej warto\u015bci 100kHz i tak\u0105 w\u0142a\u015bnie liczb\u0119 musimy poda\u0107 w argumencie funkcji i2c_init. Jednak zamiast wpisa\u0107 po prostu 100000 umie\u015bcimy tam dzia\u0142anie 100*1000, kt\u00f3rego wynikiem jest w\u0142a\u015bnie wspomniana warto\u015b\u0107. Taka konstrukcja nie ma wi\u0119kszego uzasadnienia, chcia\u0142bym jedynie przypomnie\u0107, \u017ce w j\u0119zyku C z \u0142atwo\u015bci\u0105 mo\u017cemy tworzy\u0107 tego typu konstrukcje, gdzie w argumencie funkcji podajemy dzia\u0142anie matematyczne, b\u0105d\u017a te\u017c nawet odwo\u0142anie do jeszcze innego polecenia. W kolejnych krokach korzystamy ze znanych ju\u017c polece\u0144 inicjalizuj\u0105cych porty RPI Pico, dzi\u0119ki GPIO_FUNC_I2C ustawiamy wyprowadzenia w tryb port\u00f3w magistrali dwuprzewodowej, a nast\u0119pnie podci\u0105gamy je do zasilania funkcj\u0105 gpio_pull_up. Jest to niezb\u0119dne, poniewa\u017c transmisja I2C bazuje na sygna\u0142ach logicznego zera. Innymi s\u0142owy, pojawienie si\u0119 na magistrali sygna\u0142u niskiego oznacza rozpocz\u0119cie transmisji danych i domy\u015blnie, gdy urz\u0105dzenia nie wymieniaj\u0105 mi\u0119dzy sob\u0105 informacji, sygna\u0142 SDA jest w stanie wysokim.<\/p><p style=\"font-weight: 400\">W g\u0142\u00f3wnej p\u0119tli while znalaz\u0142y si\u0119 tylko dwa polecenia. Dzi\u0119ki nim co trzy sekundy wywo\u0142ujemy funkcje i2c_scan, kt\u00f3ra skanuje magistral\u0119 danych w poszukiwaniu pod\u0142\u0105czonych do niej urz\u0105dze\u0144.<\/p><p style=\"font-weight: 400\">Funkcj\u0119 t\u0105 zaczynamy od klasycznego ju\u017c printf, kt\u00f3ry wy\u015bwietli w monitorze portu szeregowego informacj\u0119 o rozpocz\u0119tym skanowaniu. Nast\u0119pnie skorzystamy ze znanej ju\u017c p\u0119tli for, tak aby sprawdzi\u0107 ka\u017cdy adres, pod kt\u00f3rym zg\u0142osi\u0107 mo\u017ce si\u0119 pod\u0142\u0105czone urz\u0105dzenie. W jej argumentach tworzymy zmienn\u0105 addr odpowiadaj\u0105c\u0105 w\u0142a\u015bnie warto\u015bci adresu o pocz\u0105tkowym stanie 1, bo co wydaje mi si\u0119 intuicyjne, skanowanie zacz\u0105\u0107 chcemy w\u0142a\u015bnie od pierwszego adresu. Dalej okre\u015blamy, \u017ce p\u0119tla ma si\u0119 wykonywa\u0107 do czasu, gdy addr b\u0119dzie mniejsze od warto\u015bci 0x7F, w systemie dziesi\u0119tnym jest to 127, bo w\u0142a\u015bnie tyle pojedynczych urz\u0105dze\u0144 mo\u017cemy pod\u0142\u0105czy\u0107 do jednej magistrali I2C. Mo\u017cna by tutaj zastosowa\u0107 oczywi\u015bcie konstrukcj\u0119 addr&lt;127, jednak jak pewnie zauwa\u017cyli\u015bcie, do tej pory warto\u015b\u0107 adresu zawsze zapisywa\u0142em jako hex i niech tak pozostanie, bo jest to og\u00f3lnie przyj\u0119ty standard w elektronice.\u00a0 Ostatnim ju\u017c argumentem jest polecenie, dzi\u0119ki kt\u00f3remu przy ka\u017cdym przebiegu p\u0119tli addr zwi\u0119kszy sw\u0105 warto\u015b\u0107 o jeden.<\/p><p style=\"font-weight: 400\">Wewn\u0105trz p\u0119tli for tworzymy zmienn\u0105 rxdata, do kt\u00f3rej zapisywa\u0107 b\u0119dziemy odebrane z pod\u0142\u0105czonego urz\u0105dzenia dane. Z naszej perspektywy jednak zmienna ta nie jest wa\u017cna, a jedynie wymagana przez polecenie, kt\u00f3re za chwil\u0119 opisz\u0119. W programie nie oczekujemy odebrania \u017cadnych konkretnych danych, a jedynie sprawdzenia co pod\u0142\u0105czone jest do wyprowadze\u0144 Raspberry Pi Pico, dlatego aktualnie nie musimy po\u015bwi\u0119ca\u0107 tej zmiennej wi\u0119kszej uwagi. Wa\u017cna za to jest kolejna zmienna typu int8_t (liczba ze znakiem, b\u0119dzie to wa\u017cne p\u00f3\u017aniej), kt\u00f3r\u0105 generujemy, czyli result. Od razu przypisujemy do niej warto\u015b\u0107, kt\u00f3r\u0105 zwr\u00f3ci nam polecenie i2c_read_blocking. B\u0119dzie to liczba odczytanych z potencjalnego urz\u0105dzenia bajt\u00f3w, dzi\u0119ki temu do\u015b\u0107 \u0142atwo b\u0119dziemy mogli okre\u015bli\u0107, czy pod danym adresem jest jaki\u015b sprz\u0119t. Je\u015bli odczytamy cokolwiek, r\u00f3wnie\u017c zero, oznacza\u0107 to b\u0119dzie, \u017ce pod tym adresem zg\u0142osi\u0142 si\u0119 konkretny modu\u0142 i analogiczne, gdy funkcja nie zwr\u00f3ci \u017cadnej warto\u015bci oznacza\u0107 b\u0119dzie, \u017ce dany adres jest pusty. Wyja\u015bnieniu wymaga te\u017c okre\u015blenie funkcja blokuj\u0105ca. Oznacza to, \u017ce, gdy jest ona wykonywana, mikrokontroler niejako wstrzymuje swoje dzia\u0142anie i czeka na dopowiedz z drugiej strony.<\/p><p style=\"font-weight: 400\">Funkcja i2c_read_blocking, oczekuje od nas szeregu argument\u00f3w, kt\u00f3re musimy oczywi\u015bcie poda\u0107. Pierwszym z nich jest wybrany przez nas port, nast\u0119pnie adres, z kt\u00f3rym chcemy nawi\u0105za\u0107 kontakt. Podajemy tutaj warto\u015b\u0107 zmiennej addr, kt\u00f3ry tak jak wspomina\u0142em, zwi\u0119ksza si\u0119 o jeden przy ka\u017cdym przebiegu p\u0119tli. Nast\u0119pnie musimy poda\u0107 miejsce, pod kt\u00f3rym zapisane maj\u0105 zosta\u0107 potencjalnie odebrane dane, korzystamy tutaj ze wska\u017anika, na utworzon\u0105 chwile wcze\u015bniej zmienn\u0105 rxdata. \u201e1\u201d okre\u015bla ilo\u015b\u0107 bajt\u00f3w, kt\u00f3re chcemy odebra\u0107, w tym przypadku nie jest to tak naprawd\u0119 wa\u017cne, dlatego zak\u0142adamy, \u017ce oczekujemy tylko jednego bajta. Ostatnim argumentem jest logiczny fa\u0142sz, dzi\u0119ki niemu funkcja po ka\u017cdorazowej wymianie danych przywr\u00f3ci magistral\u0119 I2C do domy\u015blnego stanu. Je\u015bli umie\u015bciliby\u015bmy wewn\u0105trz funkcji warto\u015b\u0107 true, to po wymianie danych magistrala pozostawa\u0142aby w stanie gotowym do transmisji. Innymi s\u0142owy, transmisja nie by\u0142aby sko\u0144czona, a mikrokontroler by\u0142by nadal gotowy do komunikacji.<\/p><p style=\"font-weight: 400\">W dalszej cz\u0119\u015bci dzi\u0119ki funkcji warunkowej if sprawdzamy warto\u015b\u0107 zmiennej result, dla przypomnienia przechowuje ona liczb\u0119 odpowiadaj\u0105c\u0105 ilo\u015bci odebranych danych. Je\u015bli jest ona wi\u0119ksza b\u0105d\u017a r\u00f3wna zero oznacza to, \u017ce pod danym adresem pod\u0142\u0105czone jest jakie\u015b urz\u0105dzenie i mo\u017cna z nim wymienia\u0107 informacje. Do\u015b\u0107 nielogiczne mo\u017ce wydawa\u0107 si\u0119, \u017ce odebranie zerowej ilo\u015bci danych oznacza aktywne urz\u0105dzenia, ale tak w\u0142a\u015bnie jest. Gdy pod danym adresem nie ma niczego, do result nie zostanie przypisane \u201enic\u201d, przypisana zostanie w\u00f3wczas specyficzna warto\u015b\u0107 b\u0119d\u0105ca typem enumeracyjnym. Czyli specjaln\u0105 warto\u015bci\u0105 przewidzian\u0105 dla tego typu przypadk\u00f3w. W dalszej cz\u0119\u015bci sprawdzimy co dok\u0142adnie przypisywane jest do zmiennej result. Tak wi\u0119c, gdy result ma zgodn\u0105 z warunkiem warto\u015b\u0107, wykona\u0107 mo\u017cemy polecenie printf, kt\u00f3re wyrzuci nam na ekran komputera aktualn\u0105 warto\u015b\u0107 addr, czyli adresu, kt\u00f3ry chwile wcze\u015bniej sprawdzali\u015bmy za pomoc\u0105 i2c_read_blocking.<\/p><p style=\"font-weight: 400\">Spojrzyjmy teraz na kod jako ca\u0142o\u015b\u0107. Pocz\u0105tkowo inicjalizujemy magistral\u0119 I2C oraz podci\u0105gamy do napi\u0119cia zasilania wykorzystywane fizycznie wyprowadzenia. Wewn\u0105trz p\u0119tli while wywo\u0142ujemy funkcje i2c_scan, kt\u00f3rej zadaniem jest sprawdzi\u0107, czy do dwuprzewodowej magistrali pod\u0142\u0105czone s\u0105 jakie\u015b urz\u0105dzenia. Bazuje ona na wykonywanej 127 razy p\u0119tli for, kt\u00f3ra przy ka\u017cdym przebiegu pr\u00f3buje odczyta\u0107 dane spod adresu zapisanego w addr. Je\u015bli odebrane zostanie cokolwiek lub zero, kt\u00f3re te\u017c jest poprawn\u0105 warto\u015bci\u0105, wysy\u0142amy na ekran komputera aktualn\u0105 warto\u015b\u0107 spod addr.<\/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-e2d3840 elementor-widget elementor-widget-image\" data-id=\"e2d3840\" 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\/07\/cmake-i2c-scanner.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"cmake i2c scanner\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzNzg2IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvY21ha2UtaTJjLXNjYW5uZXIucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"603\" height=\"212\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/cmake-i2c-scanner.png\" class=\"attachment-large size-large wp-image-83786\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/cmake-i2c-scanner.png 603w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/cmake-i2c-scanner-300x105.png 300w\" sizes=\"(max-width: 603px) 100vw, 603px\" \/>\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\">Biblioteki dodane w pliku CMakeLists.txt.<\/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-c173578 elementor-widget elementor-widget-text-editor\" data-id=\"c173578\" 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 programie korzystamy z biblioteki \u201ehardweare\/i2c.h\u201d, dlatego pami\u0119tajcie, aby doda\u0107 j\u0105 w pliku CMakeLists.txt.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6adb917 elementor-widget elementor-widget-image\" data-id=\"6adb917\" 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\/07\/i2cscanner_serialmonitor.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"i2cscanner_serialmonitor\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzNzkwIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvaTJjc2Nhbm5lcl9zZXJpYWxtb25pdG9yLnBuZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"243\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2cscanner_serialmonitor.png\" class=\"attachment-large size-large wp-image-83790\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2cscanner_serialmonitor.png 866w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2cscanner_serialmonitor-300x91.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/i2cscanner_serialmonitor-768x233.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\">Odczytany przez program adres czujnika.<\/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-9789f51 elementor-widget elementor-widget-text-editor\" data-id=\"9789f51\" 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 i otwarciu monitora portu szeregowego mo\u017cemy zobaczy\u0107 pojawiaj\u0105c\u0105 si\u0119 co trzy sekundy informacj\u0119, \u017ce do magistrali I2C pod\u0142\u0105czone zosta\u0142o urz\u0105dzenie, kt\u00f3rego adres wynosi 0x10. Tak wi\u0119c jest to warto\u015b\u0107 zgodna z dokumentacj\u0105. Kod ten poza odczytaniem adrsu pozwala nam stwierdzi\u0107, \u017ce czujnik jest poprawnie pod\u0142\u0105czony i mo\u017cemy spr\u00f3bowa\u0107 nawi\u0105za\u0107 z nim nieco bardziej z\u0142o\u017con\u0105 wymian\u0119 danych, jednak zanim do tego przejdziemy, przyjrzyjmy si\u0119 dok\u0142adniej zmiennej result i przypisywanym jej warto\u015bci\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-0d71c4d elementor-widget elementor-widget-heading\" data-id=\"0d71c4d\" 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 w rzeczywisto\u015bci przechowuje zmienna result?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-237e49b elementor-widget elementor-widget-image\" data-id=\"237e49b\" 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\/07\/kursor-i2c-read.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"kursor i2c read\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzNzk0IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wva3Vyc29yLWkyYy1yZWFkLnBuZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"213\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/kursor-i2c-read-1024x272.png\" class=\"attachment-large size-large wp-image-83794\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/kursor-i2c-read-1024x272.png 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/kursor-i2c-read-300x80.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/kursor-i2c-read-768x204.png 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/kursor-i2c-read.png 1287w\" 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\">Rozwini\u0119cie funkcji, po najechaniu na ni\u0105 kursorem myszy.<\/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-1ac5188 elementor-widget elementor-widget-text-editor\" data-id=\"1ac5188\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Tak jak ju\u017c wcze\u015bniej wspomnia\u0142em, w zmiennej result przechowywana jest liczba odebranych bajt\u00f3w z potencjalnie pod\u0142\u0105czonego urz\u0105dzenia, przy czym zerowa warto\u015b\u0107 r\u00f3wnie\u017c jest poprawnym odczytem. Mo\u017ce wydawa\u0107 si\u0119 to nieco dziwne i prowokowa\u0107 do pytania, co w takim razie przechowywane jest w zmiennej result, gdy pod konkretnym adresem nie zg\u0142osi si\u0119 \u017cadne urz\u0105dzenie?<\/p><p style=\"font-weight: 400\">Odpowiedzi\u0105 to PICO_ERROR_GENERIC. Je\u015bli w Visual Studio Code najedziemy kursorem myszy na zapisan\u0105 funkcj\u0119, po chwili pojawi si\u0119 niewielkie okno, w kt\u00f3rym znajdziemy skr\u00f3towy opis tego\u017c polecenia. Tak te\u017c jest w tym przypadku, poza informacj\u0105 o argumentach funkcji znajdziemy tutaj opis zwracanych warto\u015bci. Jest to wspominana liczba odczytanych bajt\u00f3w danych oraz tajemnicze PICO_ERROR_GENERIC, gdy adres, z kt\u00f3rym pr\u00f3bujemy si\u0119 skomunikowa\u0107 jest nieosi\u0105galny. W rzeczywisto\u015bci jest to warto\u015b\u0107 typu enumeracyjnego o nazwie pico_error_codes.<\/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-21a8594 elementor-widget elementor-widget-image\" data-id=\"21a8594\" 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\/07\/error-enum.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"error enum\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzNzk4IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvZXJyb3ItZW51bS5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"518\" height=\"335\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/error-enum.png\" class=\"attachment-large size-large wp-image-83798\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/error-enum.png 518w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/error-enum-300x194.png 300w\" sizes=\"(max-width: 518px) 100vw, 518px\" \/>\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\">Enum pico_error_codes.<\/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-6071a26 elementor-widget elementor-widget-text-editor\" data-id=\"6071a26\" 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\">Wi\u0119cej informacji o tym enumie znale\u017a\u0107 mo\u017cemy w pliku error.h, kt\u00f3ry jest cz\u0119\u015bci\u0105 bazowych plik\u00f3w do\u0142\u0105czanych przez \u015brodowisko automatycznie do ka\u017cdego nowego projektu. Jak wida\u0107 na za\u0142\u0105czonym obrazku, kod\u00f3w b\u0142\u0119d\u00f3w jest ca\u0142kiem sporo i s\u0105dzi\u0107 mo\u017cemy, \u017ce w przypadku nieodczytania przez funkcj\u0119 skojarzon\u0105 z interfejsem I2C do zmiennej result przypisana zostanie warto\u015b\u0107 -2. Zmodyfikujmy nieco wcze\u015bniej napisan\u0105 funkcj\u0119 i2c_scan i sprawd\u017amy to.<\/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-f4d001e elementor-widget elementor-widget-text-editor\" data-id=\"f4d001e\" 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>void i2c_scan() {<br \/>printf(\"Scanning I2C bus...\\n\");<br \/><br \/>for (uint8_t addr = 1; addr &lt; 0x7F; addr++) {<br \/>uint8_t rxdata;<br \/>int8_t result = i2c_read_blocking(I2C_PORT, addr, &amp;rxdata, 1, false);<br \/><br \/>printf(\"address = 0x%02X, result = %d\\n\", addr, result);<br \/>}<br \/>\u00a0printf(\"Scanning done.\\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-8a24963 elementor-widget elementor-widget-text-editor\" data-id=\"8a24963\" 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 nowej formie funkcja i2c_scan b\u0119dzie wysy\u0142a\u0107 na monitor portu szeregowego warto\u015bci spod zmiennej result przy ka\u017cdym ze 127 adres\u00f3w. Tym samym sprawdzimy, czy w przypadku braku urz\u0105dzenia przypisane zostanie do niej -2, a tak\u017ce ile bajt\u00f3w danych jest odczytywane z pod\u0142\u0105czonego do Pico czujnika pod adresem 0x10.<\/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-8f66646 elementor-widget elementor-widget-image\" data-id=\"8f66646\" 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\/07\/result-serial-monitor.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"result serial monitor\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzODAyIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvcmVzdWx0LXNlcmlhbC1tb25pdG9yLnBuZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"440\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/result-serial-monitor.png\" class=\"attachment-large size-large wp-image-83802\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/result-serial-monitor.png 868w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/result-serial-monitor-300x165.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/result-serial-monitor-768x422.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\">Widoczne w monitorze portu szeregowego adresy.<\/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-0b2d477 elementor-widget elementor-widget-text-editor\" data-id=\"0b2d477\" 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 otrzymujemy list\u0119 wszystkich adres\u00f3w, kt\u00f3re skanuje mikrokontroler, wraz z warto\u015bciami spod result. Rzeczywi\u015bcie do zmiennej przypisywana jest warto\u015b\u0107 odpowiadaj\u0105ca PICO_ERROR_GENERIC, a gdy procesor sprawdza adres, pod kt\u00f3rym pod\u0142\u0105czony jest nasz czujnik \u015bwiat\u0142a, zwracan\u0105 warto\u015bci\u0105 jest jeden.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2736c21 elementor-widget elementor-widget-heading\" data-id=\"2736c21\" 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\">Uruchomienie cyfrowego czujnika \u015bwiat\u0142a <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1326820 elementor-widget elementor-widget-text-editor\" data-id=\"1326820\" 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\">Pierwsze kroki z I2C za nami, dlatego mo\u017cemy przej\u015b\u0107 do g\u0142\u00f3wnego tematu dzisiejszego materia\u0142u, czyli uruchamiania cyfrowego czujnika \u015bwiat\u0142a VEML7700. Do tego celu przygotowa\u0142em nowy projekt o nazwie veml7700_test. W kodzie, kt\u00f3ry ju\u017c za moment poznacie, spr\u00f3bujemy nawi\u0105za\u0107 komunikacj\u0119 z modu\u0142em i odczyta\u0107 warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a.<\/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-ef558d2 elementor-widget elementor-widget-image\" data-id=\"ef558d2\" 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\/07\/tabela-komendy-czujnika.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"tabela komendy czujnika\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzODA2IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvdGFiZWxhLWtvbWVuZHktY3p1am5pa2EucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"786\" height=\"284\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/tabela-komendy-czujnika.png\" class=\"attachment-large size-large wp-image-83806\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/tabela-komendy-czujnika.png 786w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/tabela-komendy-czujnika-300x108.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/tabela-komendy-czujnika-768x277.png 768w\" sizes=\"(max-width: 786px) 100vw, 786px\" \/>\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\">Tabela rejestr\u00f3w czujnika VEML7700. (https:\/\/www.vishay.com\/docs\/84286\/veml7700.pdf)<\/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-660fac0 elementor-widget elementor-widget-text-editor\" data-id=\"660fac0\" 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\">Jednak, aby uzyska\u0107 warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a, musimy zajrze\u0107 na moment do dokumentacji. Znajdziemy w niej tabele, w kt\u00f3rej opisane zosta\u0142y wszystkie dost\u0119pne rejestry, z kt\u00f3rymi mo\u017cemy si\u0119 skomunikowa\u0107. To w\u0142a\u015bnie na rejestrach bazuje komunikacja I2C, z poziomu mikrokontrolera b\u0119dziemy wybiera\u0107 konkretny z nich i zapisywa\u0107 lub odczytywa\u0107 dane w nim zawarte. Jak mo\u017cecie zauwa\u017cy\u0107, dost\u0119pnych rejestr\u00f3w jest osiem, ale na pocz\u0105tek skupimy si\u0119 tylko na dw\u00f3ch. Pierwszym z nich b\u0119dzie ALS_CONF_0, kt\u00f3ry s\u0142u\u017cy do konfiguracji czujnika, ju\u017c za moment przyjrzymy si\u0119 mu dok\u0142adnie, poniewa\u017c pierwszym krokiem w kodzie b\u0119dzie w\u0142a\u015bnie wpisanie do niego odpowiednich bit\u00f3w, tak aby zainicjalizowa\u0107 czujnik. Drugim rejestrem, kt\u00f3ry nas interesuje jest ALS, bo to w\u0142a\u015bnie w nim przechowywana jest cyfrowa warto\u015b\u0107 odpowiadaj\u0105ca nat\u0119\u017ceniu \u015bwiat\u0142a. Gdy wykonamy ju\u017c inicjalizacje, przejdziemy w\u0142a\u015bnie do tego rejestru i odczytamy zapisane w nim dane.<\/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-6775ef0 elementor-widget elementor-widget-image\" data-id=\"6775ef0\" 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\/07\/rejestr-konfiguracyjny.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"rejestr konfiguracyjny\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzODEwIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvcmVqZXN0ci1rb25maWd1cmFjeWpueS5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"489\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/rejestr-konfiguracyjny-1024x626.png\" class=\"attachment-large size-large wp-image-83810\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/rejestr-konfiguracyjny-1024x626.png 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/rejestr-konfiguracyjny-300x183.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/rejestr-konfiguracyjny-768x470.png 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/rejestr-konfiguracyjny.png 1107w\" 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\">Struktura rejestru ALS_CONF_0. (https:\/\/www.vishay.com\/docs\/84286\/veml7700.pdf)<\/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-d5eda46 elementor-widget elementor-widget-text-editor\" data-id=\"d5eda46\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Tak jak wspomnia\u0142em &#8211; pierwszym krokiem, kt\u00f3ry musimy wykona\u0107, aby uruchomi\u0107 czujnik, b\u0119dzie odpowiednie skonfigurowanie rejestru ALS_CONF_0. Sk\u0142ada si\u0119 on z 16 bit\u00f3w i analiz\u0119 rozpocznijmy od najm\u0142odszego z nich, czyli od do\u0142u tabeli. Pierwszy bit, zale\u017cnie od stanu uruchamia (0) lub wy\u0142\u0105cza (1) pomiar \u015bwiat\u0142a. Pod drugim bitem ukryte zosta\u0142o ustawienie wewn\u0119trznych przerwa\u0144 czujnika, tych nie musimy uruchamia\u0107, dlatego bit ten ustawimy na zero. Kolejne dwa bity s\u0105 zarezerwowane i powinny by\u0107 ustawione na zero. Nast\u0119pnymi danymi s\u0105 ustawienia dost\u0119pu, te ustawiamy na 1, zeruj\u0105c oba bity, a kolejnymi czterema bitami wybieramy czas trwania pojedynczego pomiaru. Wybierzemy tutaj warto\u015b\u0107 mniej wi\u0119cej ze \u015brodka stawki, czyli 100ms. Dalej trafiamy na kolejne zarezerwowane dane oraz decyzj\u0119 co chcemy zrobi\u0107 z warto\u015bci\u0105 pomiaru. Mo\u017cemy pomno\u017cy\u0107 j\u0105 przez odpowiednio 1, 2, 1\/8 i 1\/4. W naszym przypadku nie chcemy, aby dane by\u0142y w jakikolwiek spos\u00f3b modyfikowane, dlatego oba bity ustawimy na zero. Ostatnie trzy bity tego rejestru r\u00f3wnie\u017c s\u0105 zarezerwowane i nie powinni\u015bmy ich ustawia\u0107.<\/p><p style=\"font-weight: 400\">Tak wi\u0119c konfiguracja rejestru w pierwszym programie b\u0119dzie sk\u0142ada\u0107 si\u0119 z samych zer i tak\u0105 warto\u015b\u0107 w\u0142a\u015bnie ustawimy:<\/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-54a11c1 elementor-widget elementor-widget-text-editor\" data-id=\"54a11c1\" 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<ul><li>ALS_SD \u2013 0,<\/li><li>ALS_INT_EN \u2013 0,<\/li><li>ALS_PERS \u2013 00,<\/li><li>ALS_IT \u2013 0000,<\/li><li>ALS_GAIN \u2013 00.<\/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-b1c914e elementor-widget elementor-widget-text-editor\" data-id=\"b1c914e\" 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 pokr\u00f3tce co musimy zrobi\u0107, mo\u017cemy przej\u015b\u0107 do kodu, kt\u00f3ry to zrealizuje. Program obs\u0142uguj\u0105cy czujnik podzielimy niejako na dwie osobne funkcje, pierwsz\u0105 z nich b\u0119dzie inicjalizacja, w kt\u00f3rej wywalmy dane do rejestru ALS_CONF_0. Drug\u0105 funkcj\u0105 odczytamy rejestr ALS, w kt\u00f3rym ukryte s\u0105 dane odpowiadaj\u0105ce nat\u0119\u017ceniu \u015bwiat\u0142\u0105 i warto\u015b\u0107 t\u0105 wy\u015blemy na ekran komputera.<\/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-bd1c0aa elementor-widget elementor-widget-text-editor\" data-id=\"bd1c0aa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre>#include &lt;stdio.h&gt;<br \/>#include \"pico\/stdlib.h\"<br \/>#include \"hardware\/i2c.h\"<br \/><br \/>#define I2C_PORT i2c1<br \/>#define SDA_PIN 6<br \/>#define SCL_PIN 7<br \/>#define VEML7700_ADDR 0x10<br \/><br \/>void veml7700_init() {<br \/>uint8_t init_cmd[] = {0x00, 0x00};<br \/>i2c_write_blocking(I2C_PORT, VEML7700_ADDR, init_cmd, 2, false);<br \/>}<br \/><br \/>uint16_t veml7700_read_light() {<br \/>uint8_t reg = 0x04; \/\/ adres rejestru pomiaru<br \/>uint8_t buffer[2];<br \/>i2c_write_blocking(I2C_PORT, VEML7700_ADDR, &amp;reg, 1, true);<br \/>i2c_read_blocking(I2C_PORT, VEML7700_ADDR, buffer, 2, false);<br \/>return (buffer[1] &lt;&lt; 8) | buffer[0];<br \/>}<br \/><br \/>int main() {<br \/>stdio_init_all();<br \/>i2c_init(I2C_PORT, 100 * 1000); \/\/ pr\u0119dko\u015b\u0107 I2C 100kHz<br \/><br \/>gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);<br \/>gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);<br \/>gpio_pull_up(SDA_PIN);<br \/>gpio_pull_up(SCL_PIN);<br \/><br \/>veml7700_init();<br \/><br \/>while (true) {<br \/>uint16_t light = veml7700_read_light();<br \/>printf(\"Light value: %u\\n\", light);<br \/>sleep_ms(1000);<br \/>}<br \/><br \/>}<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d431549 elementor-widget elementor-widget-text-editor\" data-id=\"d431549\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Tak jak przy pierwszych pr\u00f3bach uruchomienia magistrali I2C, tak i tym razem program zaczynamy od do\u0142\u0105czenia odpowiednich bibliotek oraz definicji. Analogicznie znalaz\u0142y si\u0119 tutaj opisy port\u00f3w, ale te\u017c definicja adresu naszego czujnika, tak jak odczyta\u0107 mo\u017cemy z dokumentacji, ale te\u017c sprawdzi\u0107 empirycznie jest to warto\u015b\u0107 0x01, kt\u00f3ra od tej pory przypisana jest do VEML7700_ADDR.<\/p><p style=\"font-weight: 400\">W dalszej cz\u0119\u015bci znalaz\u0142y si\u0119 dwie funkcje obs\u0142uguj\u0105ce czujnik \u015bwiat\u0142a \u2013 inicjalizuj\u0105ca oraz odczytuj\u0105ca warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a. Zajmiemy si\u0119 nimi za chwil\u0119 w momencie, gdy polecenia te b\u0119d\u0105 wywo\u0142ywane.\u00a0<\/p><p style=\"font-weight: 400\">Pocz\u0105tek funkcji main, powinien by\u0107 ju\u017c nam znany. Tak jak w poprzednim projekcie uruchamiamy interfejs I2C oraz ustawiamy odpowiednio wyprowadzenia mikrokontrolera. Po tym zabiegu wywo\u0142ujemy funkcj\u0119 inicjalizuj\u0105c\u0105 modu\u0142\u00a0VEML7700. Jej konstrukcja jest do\u015b\u0107 prosta i sk\u0142ada si\u0119 tylko z dw\u00f3ch polece\u0144. Poza tym inicjalizacja ma typ void, tak wi\u0119c nie zwraca \u017cadnych danych. Jak pami\u0119tacie, w czasie inicjalizacji musimy wpisa\u0107 odpowiednie dane do rejestru ALS_CONF_0. W tym celu tworzymy dwuelementow\u0105 tablic\u0119 uint8_t o nazwie init_cmd. W jej wn\u0119trzu zapisujemy od razu dwa zerowe bajty. By\u0107 mo\u017ce zastanawiacie si\u0119, dlaczego tworzymy tutaj tablic\u0119 z dwoma elementami, zamiast pojedyncz\u0105 zmienn\u0105 uint16_t? Odpowied\u017a na to pytanie jest do\u015b\u0107 prosta i wynika ze specyfiki interfejsu I2C, kt\u00f3ry wysy\u0142a dane w jedno bajtowych paczkach. Dlatego informacje, kt\u00f3re b\u0119dziemy przesy\u0142a\u0107, r\u00f3wnie\u017c nale\u017cy podzieli\u0107 na jedno bajtowe elementy. Drug\u0105 funkcj\u0105 inicjalizacji jest wys\u0142anie danych, charakterystyka polecenia i2c_write_blocking jest niezwykle podobna do wcze\u015bniej omawianej funkcji odczytuj\u0105cej dane. W argumentach podajemy odpowiedni port, docelowy adres, miejsce, gdzie zapisane s\u0105 dane, kt\u00f3re b\u0119dziemy wysy\u0142a\u0107, ilo\u015b\u0107 bajt\u00f3w, kt\u00f3re nale\u017cy przes\u0142a\u0107 oraz logicznie zdefiniowany koniec transmisji po wykonaniu tej instrukcji. Tym sposobem w\u0142a\u015bnie pod adres 0x10 wy\u015blemy dwa zerowe bajty, w ten spos\u00f3b inicjalizuj\u0105c czujnik.<\/p><p style=\"font-weight: 400\">Wr\u00f3\u0107my jednak do miejsca, z kt\u00f3rego wywo\u0142ana zosta\u0142a funkcja inicjalizuj\u0105ca. Po jej wykonaniu przechodzimy do niesko\u0144czonej p\u0119tli while, w kt\u00f3rej \u0142atwo zauwa\u017cy\u0107 b\u0119dziemy co sekund\u0119 odczytywa\u0107 warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a i przypisywa\u0107 j\u0105 do zmiennej uint16_t o nazwie light. Tutaj te\u017c skaczemy do odpowiedniej funkcji, kt\u00f3rej dzia\u0142anie opisze poni\u017cej.<\/p><p style=\"font-weight: 400\">Wewn\u0105trz bloku kodu, kt\u00f3ry odczytuje warto\u015b\u0107 zapisan\u0105 w rejestrze czujnika o nazwie ALS, znalaz\u0142o si\u0119 kilka funkcji. Pocz\u0105tkowo tworzymy dwie zmienne, kt\u00f3re potrzebne b\u0119d\u0105 w trakcie komunikacji &#8211; reg, kt\u00f3ra przechowuje adres rejestru ASL, czyli 0x04. Drug\u0105 zmienn\u0105 jest w rzeczywisto\u015bci dwuelementowa tablica buffer, w kt\u00f3rej umie\u015bcimy odebran\u0105 z czujnika warto\u015b\u0107. Podobnie jak wcze\u015bniej rejestr ASL czujnika przechowuje dwa bajty danych, jednak ze wzgl\u0119du na specyfik\u0119 I2C informacj\u0119 musimy przesy\u0142a\u0107 w jedno bajtowych paczkach, dlatego te\u017c dane zapiszemy w tablicy. Gdy zmienne s\u0105 gotowe, mo\u017cemy przej\u015b\u0107 do samej komunikacji. W pierwszym kroku wysy\u0142amy wska\u017anik na zmienn\u0105 reg, tym samym informuj\u0105c czujnik, \u017ce b\u0119dziemy odczytywa\u0107 dane z rejestru ASL. Tutaj te\u017c warto zauwa\u017cy\u0107, \u017ce ostatnim argumentem funkcji jest true, poniewa\u017c nie jest to koniec transmisji. Zanim przejdziemy do kolejnego polecenia, chcia\u0142bym zwr\u00f3ci\u0107 uwag\u0119 na pewien szczeg\u00f3\u0142, kt\u00f3ry by\u0107 mo\u017ce zauwa\u017cyli\u015bcie. W funkcji inicjalizuj\u0105cej czujnik nie skorzystali\u015bmy ze wska\u017anika, mimo \u017ce polecenie i2c_write_blocking tego w\u0142a\u015bnie oczekuje. R\u00f3\u017cnic\u0105 mi\u0119dzy init_cmd a reg jest fakt, \u017ce pierwsza z konstrukcji jest tablic\u0105, a druga tylko zmienn\u0105. Wykorzystujemy tutaj pewn\u0105 unikaln\u0105 cech\u0119 tablic, kt\u00f3re same w sobie s\u0105 te\u017c wska\u017anikami i pokazuj\u0105 na pierwszy zapisany w nich element. W\u0142a\u015bnie dlatego przy funkcji inicjalizuj\u0105cej mogli\u015bmy w argumencie funkcji poda\u0107 tablic\u0119 w spos\u00f3b bezpo\u015bredni, a w przypadku zmiennej reg musimy dodatkowo skorzysta\u0107 z operatora wy\u0142uskania adresu.<\/p><p style=\"font-weight: 400\">Gdy czujnik otrzyma\u0142 ju\u017c adres rejestru, z kt\u00f3rego odczytywa\u0107 b\u0119dziemy dane, mo\u017cemy przej\u015b\u0107 do polecenia i2c_read_blocking. Argumenty tej funkcji s\u0105 ju\u017c nam znane, dlatego nie wymagaj\u0105 wi\u0119kszego wyja\u015bnienia. Warto jedynie zauwa\u017cy\u0107, \u017ce korzystamy tutaj z tablicy buffer, w kt\u00f3rej zapisane zostan\u0105 odczytane z sensora dane.<\/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-4f794eb elementor-widget elementor-widget-image\" data-id=\"4f794eb\" 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\/07\/tab_to_uint16.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"tab_to_uint16\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzODE0IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvdGFiX3RvX3VpbnQxNi5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"192\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/tab_to_uint16-300x192.png\" class=\"attachment-medium size-medium wp-image-83814\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/tab_to_uint16-300x192.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/tab_to_uint16.png 749w\" 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<figcaption class=\"widget-image-caption wp-caption-text\">Przekszta\u0142cenie tablicy na dane typu uint16_t.<\/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-ae14ed9 elementor-widget elementor-widget-text-editor\" data-id=\"ae14ed9\" 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\">Jak widzicie funkcja veml7700_read_light zwraca dane typu uint16_t, kt\u00f3re wewn\u0105trz funkcji while przypisywane s\u0105 do zmiennej light. Warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a zwracamy dzi\u0119ki poleceniu return, ale nie tak po prostu. Jak wida\u0107 warto\u015b\u0107 odczytana, przechowywana w buffer ma posta\u0107 dw\u00f3ch zmiennych uint8_t zapisanych w tablicy i \u017ceby odes\u0142a\u0107 je w formie jednej zmiennej musimy dokona\u0107 pewnej modyfikacji. Korzystamy tutaj ze sprytnej konstrukcji, kt\u00f3ra przesuwa o osiem miejsc w lewo drugi element tablicy i dzi\u0119ki logicznemu OR (|) \u0142\u0105czy j\u0105 z pierwszym elementem. W ten spos\u00f3b w\u0142a\u015bnie uzyskujemy pojedyncz\u0105 dwu bajtow\u0105 warto\u015b\u0107 przypisywan\u0105 do zmiennej light.<\/p><p style=\"font-weight: 400\">Zanim jeszcze przejdziemy do samego uruchomienia przygotowanego kodu, chcia\u0142bym zwr\u00f3ci\u0107 wasz\u0105 uwag\u0119 na pewien szczeg\u00f3\u0142. Zauwa\u017ccie, \u017ce w funkcji inicjalizuj\u0105cej czujnik nie podajemy adresu rejestru ALS_CONF_0 i niejako wysy\u0142amy dwa zerowe bajty w nico\u015b\u0107, podaj\u0105c tylko adres samego czujnika, czyli 0x10. Mo\u017ce to wygl\u0105da\u0107 do\u015b\u0107 dziwacznie, zw\u0142aszcza \u017ce w funkcji, kt\u00f3ra odczytuje warto\u015b\u0107 \u015bwiat\u0142a, podajemy wcze\u015bniej w argumencie funkcji warto\u015b\u0107 0x04, kt\u00f3ra jest adresem rejestru ASL. W wielu urz\u0105dzeniach wyposa\u017conych w interfejs I2C istnieje pewna funkcjonalno\u015b\u0107 okre\u015blana jako wysy\u0142anie danych bez specyfikacji rejestru. Oznacza to, \u017ce wys\u0142ane w ten spos\u00f3b dane s\u0105 zawsze warto\u015bciami konfiguracyjnymi i urz\u0105dzenie odbiorcze o tym wie. Tak te\u017c jest w naszym przypadku, gdy czujnik VEML7700 odbierze dane bez wskazanego adresu, zapisze je w\u0142a\u015bnie w rejestrze ALS_CONF_0.<\/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-5ae4ab2 elementor-widget elementor-widget-image\" data-id=\"5ae4ab2\" 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\/07\/sensor-serial-monitor.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"sensor serial monitor\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzODE4IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvc2Vuc29yLXNlcmlhbC1tb25pdG9yLnBuZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"359\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/sensor-serial-monitor.png\" class=\"attachment-large size-large wp-image-83818\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/sensor-serial-monitor.png 887w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/sensor-serial-monitor-300x135.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/sensor-serial-monitor-768x345.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\">Warto\u015bci nat\u0119\u017cenia \u015bwiat\u0142a odczytywane przez czujnik. <\/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-0a15b05 elementor-widget elementor-widget-text-editor\" data-id=\"0a15b05\" 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 na ekranie komputera zobaczy\u0107 mo\u017cemy odczyty z cyfrowego czujnika \u015bwiat\u0142a. Gdy go zas\u0142onimy, warto\u015bci b\u0119d\u0105 niewielkie, bliskie niemal zeru i analogicznie im wi\u0119cej \u015bwiat\u0142a b\u0119dzie pada\u0107 na ukryty w przezroczystej obudowie rdze\u0144, tym wy\u017cszy b\u0119dzie odczyt.<\/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-aa0f68e elementor-widget elementor-widget-heading\" data-id=\"aa0f68e\" 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 cyfrowy vs fotorezystor <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-85b808a elementor-widget elementor-widget-image\" data-id=\"85b808a\" 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\/07\/IMG_1679-scaled.jpg\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"IMG_1679\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6IjgzODIyIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wN1wvSU1HXzE2Nzktc2NhbGVkLmpwZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1679-1024x576.jpg\" class=\"attachment-large size-large wp-image-83822\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1679-1024x576.jpg 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1679-300x169.jpg 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1679-768x432.jpg 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1679-1536x864.jpg 1536w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/IMG_1679-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\">Por\u00f3wnanie czujnika \u015bwiat\u0142a z fotorezystorem.<\/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-c88e56f elementor-widget elementor-widget-text-editor\" data-id=\"c88e56f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Do tej pory mieli\u015bmy ju\u017c okazj\u0119 dokonywa\u0107 pomiaru nat\u0119\u017cenia \u015bwiat\u0142a, przy okazji test\u00f3w fotorezystora, kt\u00f3rego mo\u017cna powiedzie\u0107 zadanie jest identyczne, jak cyfrowego czujnika \u015bwiat\u0142a. Oba elementy mog\u0105 dostarczy\u0107 nam informacji o jego nat\u0119\u017ceniu, jednak powstaje pytanie, kt\u00f3ry z nich jest doskonalszy, i kt\u00f3ry lepiej stosowa\u0107. Odpowied\u017a nie jest do ko\u0144ca jednoznaczna i zale\u017cy g\u0142\u00f3wnie od tego, co chcemy osi\u0105gn\u0105\u0107. Przy fotorezystorze korzystamy ze wbudowanego w mikrokontroler przetwornika ADC, kt\u00f3rego rozdzielczo\u015b\u0107 wynosi 12 bit\u00f3w. Dzi\u0119ki temu uzyskujemy pomiary z zakresu od 0 do 4095. W tym por\u00f3wnaniu cyfrowy czujnik \u015bwiat\u0142a wypada znacznie lepiej. Jest to 16 bitowa jednostka, przez co odczyty s\u0105 znacznie bardziej dok\u0142adne i mieszcz\u0105 si\u0119 w zakresie od 0 do 65535. Z drugiej jednak strony obs\u0142uga takiego modu\u0142u jest nieco trudniejsza i bardziej wymagaj\u0105ca. Dlatego wyb\u00f3r mi\u0119dzy czujnikiem a fotorezystorem zale\u017cy g\u0142\u00f3wnie od tego, jakiego rodzaju pomiar potrzebujemy. Je\u015bli wymagana jest tylko orientacyjna warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a wystarczy zastosowa\u0107 fotorezystor. Jednak, gdy potrzebujemy jak najbardziej dok\u0142adnej warto\u015bci, w\u00f3wczas lepszym wyborem b\u0119dzie cyfrowy modu\u0142.<\/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-64dd787 elementor-widget elementor-widget-heading\" data-id=\"64dd787\" 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-4c79232 elementor-widget elementor-widget-text-editor\" data-id=\"4c79232\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">W dzisiejszym materiale przyjrzeli\u015bmy si\u0119 bli\u017cej funkcjonalno\u015bci mikrokontrolera, jak\u0105 jest interfejs I2C. Na pocz\u0105tku skorzystali\u015bmy z niego, aby sprawdzi\u0107, czy producent cyfrowego czujnika \u015bwiat\u0142a nie k\u0142amie w dokumentacji i adres tam zawarty jest zgodny z rzeczywisto\u015bci\u0105. Natomiast w drugiej cz\u0119\u015bci artyku\u0142u uruchamiali\u015bmy modu\u0142 VEML7700 i dzi\u0119ki niewielkiemu programowi poznali\u015bmy odczytywan\u0105 przez niego warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a. W kolejnym poradniku zostaniemy w temacie cyfrowego modu\u0142u z interfejsem I2C, jednak spr\u00f3bujemy zwi\u0119kszy\u0107 jego mo\u017cliwo\u015bci oraz pomy\u015ble\u0107 nad napisaniem w\u0142asnej biblioteki.<\/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-7f246ed elementor-widget elementor-widget-spacer\" data-id=\"7f246ed\" 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-cf564c0 elementor-widget elementor-widget-text-editor\" data-id=\"cf564c0\" 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 dalszej cz\u0119\u015bci kursu skorzystamy z do\u0142\u0105czonego do zestawu element\u00f3w cyfrowego czujnika \u015bwiat\u0142a. Postaramy si\u0119 go uruchomi\u0107 i sprawdzimy, czy jest on dobr\u0105 konkurencj\u0105 dla poznanego ju\u017c wcze\u015bniej fotorezystora.<\/p>\n","protected":false},"author":34,"featured_media":83888,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7,21,134],"tags":[],"class_list":["post-83763","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 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C - Botland<\/title>\n<meta name=\"description\" content=\"W dalszej cz\u0119\u015bci kursu skorzystamy z do\u0142\u0105czonego do zestawu element\u00f3w cyfrowego czujnika \u015bwiat\u0142a. Postaramy si\u0119 go uruchomi\u0107 i sprawdzimy, czy jest on dobr\u0105 konkurencj\u0105 dla poznanego ju\u017c wcze\u015bniej fotorezystora.\" \/>\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-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/\" \/>\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 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C - Botland\" \/>\n<meta property=\"og:description\" content=\"W dalszej cz\u0119\u015bci kursu skorzystamy z do\u0142\u0105czonego do zestawu element\u00f3w cyfrowego czujnika \u015bwiat\u0142a. Postaramy si\u0119 go uruchomi\u0107 i sprawdzimy, czy jest on dobr\u0105 konkurencj\u0105 dla poznanego ju\u017c wcze\u015bniej fotorezystora.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/\" \/>\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-07-15T12:00:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-08T08:54:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/11.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=\"29 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-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/\"},\"author\":{\"name\":\"Rafa\u0142 Bartoszak\",\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#\\\/schema\\\/person\\\/5a69e7f5db1f77c617f990e73bb83215\"},\"headline\":\"Kurs Raspberry Pi Pico \u2013 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C\",\"datePublished\":\"2024-07-15T12:00:33+00:00\",\"dateModified\":\"2026-04-08T08:54:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/\"},\"wordCount\":5269,\"publisher\":{\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/07\\\/11.png\",\"articleSection\":[\"Elektronika\",\"Programowanie\",\"Raspberry Pi\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/\",\"url\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/\",\"name\":\"Kurs Raspberry Pi Pico \u2013 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C - Botland\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/07\\\/11.png\",\"datePublished\":\"2024-07-15T12:00:33+00:00\",\"dateModified\":\"2026-04-08T08:54:37+00:00\",\"description\":\"W dalszej cz\u0119\u015bci kursu skorzystamy z do\u0142\u0105czonego do zestawu element\u00f3w cyfrowego czujnika \u015bwiat\u0142a. Postaramy si\u0119 go uruchomi\u0107 i sprawdzimy, czy jest on dobr\u0105 konkurencj\u0105 dla poznanego ju\u017c wcze\u015bniej fotorezystora.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/#primaryimage\",\"url\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/07\\\/11.png\",\"contentUrl\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/07\\\/11.png\",\"width\":1510,\"height\":755},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\\\/#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 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C\"}]},{\"@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 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C - Botland","description":"W dalszej cz\u0119\u015bci kursu skorzystamy z do\u0142\u0105czonego do zestawu element\u00f3w cyfrowego czujnika \u015bwiat\u0142a. Postaramy si\u0119 go uruchomi\u0107 i sprawdzimy, czy jest on dobr\u0105 konkurencj\u0105 dla poznanego ju\u017c wcze\u015bniej fotorezystora.","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-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/","og_locale":"pl_PL","og_type":"article","og_title":"Kurs Raspberry Pi Pico \u2013 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C - Botland","og_description":"W dalszej cz\u0119\u015bci kursu skorzystamy z do\u0142\u0105czonego do zestawu element\u00f3w cyfrowego czujnika \u015bwiat\u0142a. Postaramy si\u0119 go uruchomi\u0107 i sprawdzimy, czy jest on dobr\u0105 konkurencj\u0105 dla poznanego ju\u017c wcze\u015bniej fotorezystora.","og_url":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/","og_site_name":"Botland","article_publisher":"https:\/\/facebook.com\/Botland\/","article_published_time":"2024-07-15T12:00:33+00:00","article_modified_time":"2026-04-08T08:54:37+00:00","og_image":[{"width":1510,"height":755,"url":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/11.png","type":"image\/png"}],"author":"Rafa\u0142 Bartoszak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Rafa\u0142 Bartoszak","Szacowany czas czytania":"29 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/#article","isPartOf":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/"},"author":{"name":"Rafa\u0142 Bartoszak","@id":"https:\/\/botland.store\/blog\/#\/schema\/person\/5a69e7f5db1f77c617f990e73bb83215"},"headline":"Kurs Raspberry Pi Pico \u2013 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C","datePublished":"2024-07-15T12:00:33+00:00","dateModified":"2026-04-08T08:54:37+00:00","mainEntityOfPage":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/"},"wordCount":5269,"publisher":{"@id":"https:\/\/botland.store\/blog\/#organization"},"image":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/#primaryimage"},"thumbnailUrl":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/11.png","articleSection":["Elektronika","Programowanie","Raspberry Pi"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/","url":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/","name":"Kurs Raspberry Pi Pico \u2013 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C - Botland","isPartOf":{"@id":"https:\/\/botland.store\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/#primaryimage"},"image":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/#primaryimage"},"thumbnailUrl":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/11.png","datePublished":"2024-07-15T12:00:33+00:00","dateModified":"2026-04-08T08:54:37+00:00","description":"W dalszej cz\u0119\u015bci kursu skorzystamy z do\u0142\u0105czonego do zestawu element\u00f3w cyfrowego czujnika \u015bwiat\u0142a. Postaramy si\u0119 go uruchomi\u0107 i sprawdzimy, czy jest on dobr\u0105 konkurencj\u0105 dla poznanego ju\u017c wcze\u015bniej fotorezystora.","breadcrumb":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/#primaryimage","url":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/11.png","contentUrl":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/07\/11.png","width":1510,"height":755},{"@type":"BreadcrumbList","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-11-uruchomienie-cyfrowego-czujnik-swiatla-czyli-i2c\/#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 #11 \u2013 uruchomienie cyfrowego czujnika \u015bwiat\u0142a, czyli I2C"}]},{"@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\/83763","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=83763"}],"version-history":[{"count":0,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/posts\/83763\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/media\/83888"}],"wp:attachment":[{"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/media?parent=83763"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/categories?post=83763"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/tags?post=83763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}