{"id":86002,"date":"2024-08-20T14:00:32","date_gmt":"2024-08-20T12:00:32","guid":{"rendered":"https:\/\/homebook.click\/blog\/?p=86002"},"modified":"2026-04-08T10:53:00","modified_gmt":"2026-04-08T08:53:00","slug":"kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2","status":"publish","type":"post","link":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/","title":{"rendered":"Kurs Raspberry Pi Pico \u2013 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\/2"},"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\"> 18<\/span> <span class=\"rt-label rt-postfix\">min.<\/span><\/span>\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"86002\" class=\"elementor elementor-86002\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-925845e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"925845e\" 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-d34b7ba\" data-id=\"d34b7ba\" 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-0b4f21c elementor-widget elementor-widget-text-editor\" data-id=\"0b4f21c\" 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\">Ostatnim razem po raz pierwszy uruchomili\u015bmy cyfrowy czujnik \u015bwiat\u0142a VEML7700, poznaj\u0105c tym samym podstawowe zagadnienia zwi\u0105zane z magistral\u0105 I2C. W dzisiejszym materiale pozostaniemy w tym temacie i spr\u00f3bujemy nieco rozbudowa\u0107 program obs\u0142uguj\u0105cy ten sensor, tak aby mogli korzysta\u0107 z niego r\u00f3wnie\u017c inni u\u017cytkownicy.<\/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-0127e18 elementor-widget elementor-widget-image\" data-id=\"0127e18\" 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%3DeyJpZCI6NzYxNTYsInVybCI6Imh0dHBzOlwvXC9ib3RsYW5kLmNvbS5wbFwvYmxvZ1wvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNFwvMDFcLzRHb3Rvd3ktWmVzdGF3LWRvLW5hdWtpLXByb2dyYW1vd2FuaWEtei1SYXNwYmVycnktUGktUGljby1XLmpwZyJ9\" 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-4da959c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4da959c\" 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-0bee57a\" data-id=\"0bee57a\" 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-bdfea26 elementor-widget elementor-widget-image\" data-id=\"bdfea26\" 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%3DeyJpZCI6NzYxNjAsInVybCI6Imh0dHBzOlwvXC9ib3RsYW5kLmNvbS5wbFwvYmxvZ1wvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNFwvMDFcLzI0MTM2XzMuanBnIn0%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-c59e9fb\" data-id=\"c59e9fb\" 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-e89c963 elementor-widget elementor-widget-text-editor\" data-id=\"e89c963\" 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-ab01204 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"ab01204\" 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-f59a124 elementor-widget elementor-widget-spacer\" data-id=\"f59a124\" 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-5ad9c93 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"5ad9c93\" 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-51e7f75 elementor-widget elementor-widget-text-editor\" data-id=\"51e7f75\" 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<span style=\"font-weight: bolder;\">Spis tre\u015bci:<\/span>\n<ol style=\"background-color: #ffffff;\">\n \t<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>\n \t<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>\n \t<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>\n \t<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>\n \t<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>\n \t<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>\n \t<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>\n \t<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>\n \t<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>\n \t<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>\n \t<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>\n \t<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>\n \t<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>\n<\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-251e603 elementor-widget elementor-widget-heading\" data-id=\"251e603\" 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-fc69a63 elementor-widget elementor-widget-image\" data-id=\"fc69a63\" 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%3DeyJpZCI6Nzk3MDcsInVybCI6Imh0dHBzOlwvXC9ib3RsYW5kLmNvbS5wbFwvYmxvZ1wvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNFwvMDFcL0lNR18wNjQ3LTEwMjR4NTc2LTIud2VicCJ9\" 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-deacc62 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"deacc62\" 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-123f773 elementor-widget elementor-widget-text-editor\" data-id=\"123f773\" 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-cc2383d elementor-widget elementor-widget-text-editor\" data-id=\"cc2383d\" 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-55a80a6 elementor-widget elementor-widget-spacer\" data-id=\"55a80a6\" 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-3f7bc99 elementor-widget elementor-widget-heading\" data-id=\"3f7bc99\" 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\">Ile mo\u017cemy wyci\u0105gn\u0105\u0107 z czujnika VEML7700?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-30ba8f6 elementor-widget elementor-widget-text-editor\" data-id=\"30ba8f6\" 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, w poprzednim artykule przygotowali\u015bmy podstawowy kod obs\u0142uguj\u0105cy cyfrowy czujnik \u015bwiat\u0142a. Dzi\u0119ki niemu mogli\u015bmy obserwowa\u0107 zmieniaj\u0105ce si\u0119 liczbowe warto\u015bci reprezentuj\u0105ce poziom nat\u0119\u017cenia \u015bwiat\u0142a. Mo\u017cna by pomy\u015ble\u0107, \u017ce jest to ju\u017c pe\u0142na funkcjonalno\u015b\u0107 VEML7700, wszak\u017ce c\u00f3\u017c wi\u0119cej mo\u017ce robi\u0107 czujnik \u015bwiat\u0142a, jak nie tylko mierzy\u0107 jego warto\u015b\u0107. Jednak w rzeczywisto\u015bci mo\u017cliwo\u015bci sensora s\u0105 nieco wi\u0119ksze, sam pomiar jest konfigurowalny, poza tym, czujnik wspiera system przerwa\u0144 oraz pomiar nat\u0119\u017cenia \u015bwiat\u0142a bia\u0142ego. Tak wi\u0119c dost\u0119pna funkcjonalno\u015b\u0107 jest nieco wi\u0119ksza i w dalszej cz\u0119\u015bci spr\u00f3bujemy skorzysta\u0107 z tych funkcji. Najpierw jednak przejd\u017amy do dokumentacji i przeanalizujmy dok\u0142adnie mo\u017cliwo\u015bci VEML7700.<\/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-79d1c0b elementor-widget elementor-widget-image\" data-id=\"79d1c0b\" 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\/08\/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%3DeyJpZCI6Ijg2MDA0IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvdGFiZWxhLWtvbWVuZHktY3p1am5pa2EucG5nIn0%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\/08\/tabela-komendy-czujnika.png\" class=\"attachment-large size-large wp-image-86004\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/tabela-komendy-czujnika.png 786w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/tabela-komendy-czujnika-300x108.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/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-0b4e7b8 elementor-widget elementor-widget-text-editor\" data-id=\"0b4e7b8\" 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;\">Spis rejestr\u00f3w dost\u0119pnych w sensorze \u015bwiat\u0142a poznali\u015bmy ju\u017c wcze\u015bniej, jednak poprzednim razem korzystali\u015bmy tylko z dw\u00f3ch \u2013 ALS_CONF_0, w kt\u00f3rym umieszczone s\u0105 parametry konfiguracyjne oraz ALS, przechowuj\u0105cego odczytan\u0105 warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a. Poza nimi dost\u0119pnych jest jeszcze sze\u015b\u0107 rejestr\u00f3w, kt\u00f3rych znaczenie warto pozna\u0107.<\/p><p style=\"font-weight: 400;\">ALS_WH i ALS_WL s\u0105 dwoma szesnastobitowymi konstrukcjami zwi\u0105zanymi z systemem przerwa\u0144. Dok\u0142adniej przechowuj\u0105 one warto\u015bci niskiego i wysokiego progu, na kt\u00f3rych podstawie generowane s\u0105 sygna\u0142y przerwa\u0144. Dane o nat\u0119\u017ceniu \u015bwiat\u0142a mo\u017cemy monitorowa\u0107 w spos\u00f3b ci\u0105g\u0142y, ca\u0142y czas odczytuj\u0105c rejestr ALS, tak jak to mia\u0142o miejsce w poprzednim projekcie lub te\u017c skorzysta\u0107 z systemu przerwa\u0144. Dzi\u0119ki warto\u015bciom progowym mo\u017cemy ustawi\u0107 odpowiedni zakres, a gdy nat\u0119\u017cenie \u015bwiat\u0142a przekroczy jedn\u0105 ze skrajnych liczb, czujnik wygeneruje przerwanie. W ten spos\u00f3b mo\u017cemy niejako przenie\u015b\u0107 na czujnik analizowanie poziomu nat\u0119\u017cenia \u015bwiat\u0142a. Je\u015bli w projekcie potrzebna jest podstawowa analiza, bazuj\u0105ca na zerojedynkowym &#8211; czujnik jest o\u015bwietlony\/czujnik nie jest o\u015bwietlony, wystarczy odpowiednio ustawi\u0107 warto\u015bci progowe, a gdy te zostan\u0105 przekroczone, pojawi si\u0119 przerwanie. Tym samym mikrokontroler nie b\u0119dzie musia\u0142 non stop analizowa\u0107 konkretnej warto\u015bci, a tylko zareaguje na pojawiaj\u0105ce si\u0119 przerwanie.<\/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-61b12b0 elementor-widget elementor-widget-image\" data-id=\"61b12b0\" 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\/08\/rejestr-power.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"rejestr power\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2MDA4IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvcmVqZXN0ci1wb3dlci5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"728\" height=\"161\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-power.png\" class=\"attachment-large size-large wp-image-86008\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-power.png 728w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-power-300x66.png 300w\" sizes=\"(max-width: 728px) 100vw, 728px\" \/>\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 Power Saving. (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-d17b8a4 elementor-widget elementor-widget-text-editor\" data-id=\"d17b8a4\" 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 \u0142atwo si\u0119 domy\u015bli\u0107 rejestr Power Saving odpowiedzialny jest za zarz\u0105dzanie energi\u0105 w VEML7700. Innymi s\u0142owy zmieniaj\u0105c ustawienie bit\u00f3w PSM, mo\u017cemy wymusi\u0107 dzia\u0142anie w jednym z czterech tryb\u00f3w oszcz\u0119dzania energii. Poza tym mo\u017cliwe jest natywne wy\u0142\u0105cznie tej funkcjonalno\u015bci poprzez zmian\u0119 na zero bitu PSM_EN.<\/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-4741874 elementor-widget elementor-widget-image\" data-id=\"4741874\" 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\/08\/pobor-proadu.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"pobor proadu\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2MDEzIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvcG9ib3ItcHJvYWR1LnBuZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"724\" height=\"311\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/pobor-proadu.png\" class=\"attachment-large size-large wp-image-86013\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/pobor-proadu.png 724w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/pobor-proadu-300x129.png 300w\" sizes=\"(max-width: 724px) 100vw, 724px\" \/>\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 zale\u017cno\u015bci tryb\u00f3w oszcz\u0119dzania energii i poboru pr\u0105du. (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-5b9ed18 elementor-widget elementor-widget-text-editor\" data-id=\"5b9ed18\" 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 dokumentacji czujnika mo\u017cemy znale\u017a\u0107 te\u017c tabel\u0119 opisuj\u0105c\u0105 nieco dok\u0142adniej zale\u017cno\u015bci mi\u0119dzy poszczeg\u00f3lnymi trybami oszcz\u0119dzania energii, a warto\u015bci\u0105 nat\u0119\u017cenia pr\u0105du pobieran\u0105 przez czujnik. Modu\u0142 sam w sobie nie jest przesadnie pr\u0105do\u017cerny, ale w wymagaj\u0105cych tego aplikacjach warto\u015b\u0107 mo\u017cna zredukowa\u0107 nawet do poziomu 2\u00b5A. Poza tym warto zwr\u00f3ci\u0107 uwag\u0119 na czas pomiaru ALS_IT oraz czas, co kt\u00f3ry odczytywane b\u0119d\u0105 dane, bo od tych warto\u015bci r\u00f3wnie\u017c zale\u017cny jest pobierany przez sensor pr\u0105d.<\/p><p style=\"font-weight: 400\">Kolejnym rejestrem jest WHITE, podobnie jak ALS przechowuje on szesnastobitow\u0105 warto\u015b\u0107 odpowiadaj\u0105c\u0105 nat\u0119\u017ceniu \u015bwiat\u0142a. Tym razem jednak jest to liczba wskazuj\u0105ca tylko na \u015bwiat\u0142o bia\u0142e, tym samym mo\u017cna powiedzie\u0107, \u017ce VEML7700 mo\u017ce mierzy\u0107 nie tylko og\u00f3ln\u0105 warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a, ale te\u017c warto\u015b\u0107 \u015bwiat\u0142a bia\u0142ego.<\/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-41965f6 elementor-widget elementor-widget-image\" data-id=\"41965f6\" 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\/08\/rejestr-statusowy-przerwan.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"rejestr statusowy przerwan\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2MDE3IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvcmVqZXN0ci1zdGF0dXNvd3ktcHJ6ZXJ3YW4ucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"727\" height=\"122\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-statusowy-przerwan.png\" class=\"attachment-large size-large wp-image-86017\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-statusowy-przerwan.png 727w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-statusowy-przerwan-300x50.png 300w\" sizes=\"(max-width: 727px) 100vw, 727px\" \/>\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\">Rejestr statusu przerwa\u0144. (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-ed0814c elementor-widget elementor-widget-text-editor\" data-id=\"ed0814c\" 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;\">ALS_INT to kolejne miejsce zwi\u0105zane z obs\u0142ug\u0105 przerwa\u0144. Rejestr ten s\u0142u\u017cy tylko do odczytu i nie mo\u017cemy modyfikowa\u0107 zawartych w nim danych, przechowuje informacje o wyst\u0105pieniu przerwania. Je\u015bli warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a przekroczy kt\u00f3ry\u015b z ustawionych prog\u00f3w, w rejestrze tym ustawiony zostanie odpowiedni bit.<\/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-3a1a4ae elementor-widget elementor-widget-image\" data-id=\"3a1a4ae\" 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\/08\/rejestr-id.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"rejestr id\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2MDIxIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvcmVqZXN0ci1pZC5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"729\" height=\"150\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-id.png\" class=\"attachment-large size-large wp-image-86021\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-id.png 729w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-id-300x62.png 300w\" sizes=\"(max-width: 729px) 100vw, 729px\" \/>\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 ID. (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-4eff20d elementor-widget elementor-widget-text-editor\" data-id=\"4eff20d\" 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;\">Ostatnim rejestrem jest ID, kt\u00f3ry przechowuje unikalny identyfikator czujnika. Mo\u017ce si\u0119 wydawa\u0107, \u017ce identyfikator sensora nie jest szczeg\u00f3lnie przydatn\u0105 informacj\u0105, ale pozory myl\u0105 i mo\u017cna go wykorzysta\u0107 dla przyk\u0142adu do nieco bardziej rozbudowanej procedury inicjalizacji. Znaj\u0105c identyfikator, mo\u017cemy sprawdzi\u0107, czy jest on poprawny i tym samym zweryfikowa\u0107 poprawno\u015b\u0107 po\u0142\u0105czenia z czujnikiem i potwierdzi\u0107, \u017ce komunikacja dzia\u0142a prawid\u0142owo.<\/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-8fcd2d3 elementor-widget elementor-widget-image\" data-id=\"8fcd2d3\" 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\/08\/rejestr-konfiguracyjny.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"rejestr konfiguracyjny\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2MDI1IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvcmVqZXN0ci1rb25maWd1cmFjeWpueS5wbmcifQ%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\/08\/rejestr-konfiguracyjny-1024x626.png\" class=\"attachment-large size-large wp-image-86025\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-konfiguracyjny-1024x626.png 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-konfiguracyjny-300x183.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/rejestr-konfiguracyjny-768x470.png 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/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\">Budowa 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-ebd0945 elementor-widget elementor-widget-text-editor\" data-id=\"ebd0945\" 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\">Przypomnijmy sobie te\u017c struktur\u0119 konfiguracyjnego rejestru ALS_CONF_0. Z jego poziomu mo\u017cemy wprowadzi\u0107 czujnik w stan u\u015bpienia \u2013 ALS_SD, w\u0142\u0105czy\u0107 lub wy\u0142\u0105czy\u0107 funkcj\u0119 przerwa\u0144 \u2013 ALS_INT_EN, zmieni\u0107 liczb\u0119 pomiar\u00f3w, kt\u00f3ra przekroczy\u0107 musi warto\u015b\u0107 progow\u0105, aby wygenerowane zosta\u0142o przerwanie \u2013 ALS_PERS, zmodyfikowa\u0107 czas pojedynczego pomiaru \u2013 ALS_IT oraz zmieni\u0107 format warto\u015bci odczytanej przez sensor \u2013 ALS_GAIN.<\/p><p style=\"font-weight: 400\">Jak wida\u0107, VEML7700 oferuje ca\u0142kiem sporo funkcji, jak na tak prosty modu\u0142, kt\u00f3rego g\u0142\u00f3wnym zadaniem jest tylko mierzy\u0107 poziom \u015bwiat\u0142a. Jak wida\u0107 te\u017c, poprzednim razem wykorzystali\u015bmy modu\u0142\u00a0w naprawd\u0119 podstawowej formie, dlatego teraz zajmijmy si\u0119 nieco bardziej rozbudowan\u0105 wersj\u0105 programu, kt\u00f3ry pozwoli nam w pe\u0142ni skorzysta\u0107 z opcji, jakie oferuje cyfrowy czujnik \u015bwiat\u0142a. \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-0971871 elementor-widget elementor-widget-heading\" data-id=\"0971871\" 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\">Rozbudowana obs\u0142uga 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-b45e0ee elementor-widget elementor-widget-text-editor\" data-id=\"b45e0ee\" 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\">Zastan\u00f3wmy si\u0119 przez chwil\u0119, co powinno znale\u017a\u0107 si\u0119 w rozbudowanym kodzie obs\u0142uguj\u0105cym VEML7700. Potrzebowa\u0107 b\u0119dziemy tak jak ostatnio funkcji inicjalizuj\u0105cej czujnik, kt\u00f3ra uruchomi go w podstawowym trybie. Poza tym oczywi\u015bcie odczytamy warto\u015b\u0107 nat\u0119\u017cenia \u015bwiat\u0142a oraz nat\u0119\u017cenia \u015bwiat\u0142a bia\u0142ego. Dodatkowo przygotujemy funkcje obs\u0142uguj\u0105ce przerwania, odczyt ustawianych przez sensor bit\u00f3w, zapis warto\u015bci progowych oraz w\u0142\u0105czenie lub wy\u0142\u0105czenie samych przerwa\u0144. Przydatne mog\u0105 by\u0107 te\u017c funkcje uruchamiaj\u0105ce tryb oszcz\u0119dzania energii oraz odczyt numeru identyfikacyjnego czujnika. Poza tym, aby za ka\u017cdym razem nie wywo\u0142ywa\u0107 funkcji inicjalizuj\u0105cej w przypadku zmiany pojedynczych bit\u00f3w ASL_CONF_0 zbudujemy funkcje modyfikuj\u0105ce czas pomiaru, ilo\u015b\u0107 pomiar\u00f3w wywo\u0142uj\u0105cych przerwanie oraz format odczytywanych z sensora warto\u015bci nat\u0119\u017cenia \u015bwiat\u0142a.<\/p><p style=\"font-weight: 400\">Ka\u017cda z tych funkcji bazowa\u0107 b\u0119dzie na wysy\u0142aniu, b\u0105d\u017a odbieraniu danych poprzez interfejs I2C, dlatego warto b\u0119dzie napisa\u0107 te\u017c uniwersalne funkcje realizuj\u0105ce te procesy.\u00a0<\/p><p style=\"font-weight: 400\">Tak wi\u0119c gdy wiemy ju\u017c mniej wi\u0119cej, co musi znale\u017a\u0107 si\u0119 w naszym programie, przej\u015b\u0107 mo\u017cemy do jego napisania. W tym celu przygotowa\u0142em kolejny projekt nazwany veml7700 i to na nim b\u0119d\u0119 bazowa\u0142 w tym artykule, r\u00f3wnie\u017c was zach\u0119cam do przygotowania osobnego projektu, poniewa\u017c w dalszej cz\u0119\u015bci tego poradnika, b\u0119dzie si\u0119 w nim sporo dzia\u0107. Skorzystamy tutaj z przygotowanego ju\u017c wcze\u015bniej obwodu, tak\u017ce nie ma potrzeby dokonywania w nim \u017cadnych zmian. Poza tym sam kod, r\u00f3wnie\u017c przedstawi\u0119 w nieco inny spos\u00f3b, poniewa\u017c b\u0119dzie on nieco d\u0142u\u017cszy. Om\u00f3wimy go krok po kroku, w cz\u0119\u015bciach, kt\u00f3re trzeba b\u0119dzie z\u0142o\u017cy\u0107 w ca\u0142o\u015b\u0107.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8d41baa elementor-widget elementor-widget-text-editor\" data-id=\"8d41baa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre style=\"font-weight: 400\">#include &lt;stdio.h&gt;<br \/>#include \"pico\/stdlib.h\"<br \/>#include \"hardware\/i2c.h\"<br \/><br \/>#define I2C_PORT i2c1<br \/>#define SDA_PIN 6<br \/>#define SCL_PIN 7<br \/>#define VEML7700_ADDR 0x10<br \/><br \/>\/\/VEML7700 register<br \/>#define VEML7700_ALS_CONF_0\u00a0\u00a0 0x00<br \/>#define VEML7700_ALS_WH\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x01<br \/>#define VEML7700_ALS_WL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x02<br \/>#define VEML7700_POWER_SAVING 0x03<br \/>#define VEML7700_ALS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x04<br \/>#define VEML7700_WHITE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x05<br \/>#define VEML7700_ALS_INT\u00a0\u00a0\u00a0\u00a0\u00a0 0x06<br \/>#define VEML7700_ID_REG\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x07<\/pre><p>\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-922d3e2 elementor-widget elementor-widget-text-editor\" data-id=\"922d3e2\" 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 pocz\u0105tek obowi\u0105zkowo musimy do\u0142\u0105czy\u0107 niezb\u0119dne do dzia\u0142ania programu biblioteki, tak jak w poprzednim projekcie, b\u0119dzie to mi\u0119dzy innymi hardware\/i2c.h, poniewa\u017c to w\u0142a\u015bnie za pomoc\u0105 tego interfejsu komunikujemy si\u0119 z cyfrowym czujnikiem \u015bwiat\u0142a.<\/p><p style=\"font-weight: 400;\">Poza tym znalaz\u0142y si\u0119 tu deklaracje zwi\u0105zane z interfejsem I2C, oraz adresem samego sensora, kt\u00f3re ju\u017c znamy, ale umie\u015bci\u0142em tutaj te\u017c spis rejestr\u00f3w VEML7700 zgodnie z dost\u0119pnym w dokumentacji opisem. Dzi\u0119ki temu w dalszej cz\u0119\u015bci nie b\u0119dziemy musieli stosowa\u0107 cyfrowych oznacze\u0144 poszczeg\u00f3lnych rejestr\u00f3w i dla przyk\u0142adu, zamiast u\u017cywa\u0107 0x05, u\u017cyjemy VEML7700_WHITE, co jest znacznie bardziej przejrzyste.<\/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-ea66d1a elementor-widget elementor-widget-text-editor\" data-id=\"ea66d1a\" 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 veml7700_write_register(uint8_t reg, uint16_t value) {<br \/> \u00a0\u00a0 uint8_t data[3] = {reg, value &amp; 0xFF, value &gt;&gt; 8};<br \/> \u00a0\u00a0 i2c_write_blocking(I2C_PORT, VEML7700_ADDR, data, 3, false);<br \/>}<\/pre><pre style=\"font-weight: 400\">uint16_t veml7700_read_register(uint8_t reg) {<br \/> \u00a0\u00a0 uint8_t buffer[2];<br \/> \u00a0\u00a0 i2c_write_blocking(I2C_PORT, VEML7700_ADDR, &amp;reg, 1, true);<br \/> \u00a0\u00a0 i2c_read_blocking(I2C_PORT, VEML7700_ADDR, buffer, 2, false);<br \/> \u00a0\u00a0 return (buffer[1] &lt;&lt; 8) | buffer[0];<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-4356111 elementor-widget elementor-widget-text-editor\" data-id=\"4356111\" 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 miejscu mo\u017cemy przej\u015b\u0107 do napisania funkcji, kt\u00f3re obs\u0142ugiwa\u0107 b\u0119d\u0105 nasz czujnik, ale tak jak wspomnia\u0142em wcze\u015bniej, ka\u017cda z nich bazowa\u0107 b\u0119dzie na komunikacji I2C, a dok\u0142adniej na zapisie lub odczycie danych. Dlatego w\u0142a\u015bnie warto przygotowa\u0107 uniwersalne funkcje realizuj\u0105ce to zadanie, dzi\u0119ki czemu w kolejnych konstrukcjach skojarzonych stricte z czujnikiem, nie b\u0119dzie potrzeby dok\u0142adnego opisu komunikacji, a wystarczy tylko wywo\u0142a\u0107 odpowiedni fragment kodu.<\/p><p style=\"font-weight: 400\">Na pocz\u0105tek zajmijmy si\u0119 funkcj\u0105 wysy\u0142aj\u0105c\u0105 dane, poniewa\u017c jest ona nieco prostsza. Nazwiemy j\u0105 veml7700_write_register i nie b\u0119dzie ona zwraca\u0107 \u017cadnych danych, st\u0105d w\u0142a\u015bnie typ void. Chc\u0105c wys\u0142a\u0107 dane, potrzebowa\u0107 b\u0119dziemy dw\u00f3ch informacji \u2013 docelowego rejestru oraz samych danych do wys\u0142ania. Dlatego w argumentach funkcji umie\u015bci\u0142em dwie zmienne \u2013 uint8_t reg, kt\u00f3ry b\u0119dzie okre\u015bla\u0107 rejestr czujnika oraz uint16_t value, w kt\u00f3rym przechowywane b\u0119d\u0105 informacje do wys\u0142ania. Zauwa\u017ccie, \u017ce dane te maj\u0105 format 16 bit\u00f3w, poniewa\u017c w\u0142a\u015bnie takiej liczby bit\u00f3w mo\u017ce oczekiwa\u0107 sensor.<\/p><p style=\"font-weight: 400\">Jak pami\u0119tacie, magistrala I2C bazuje na 8 bitowych paczkach danych, dlatego wewn\u0105trz funkcji musimy utworzy\u0107 specjaln\u0105 tablic\u0119 o takiej w\u0142a\u015bnie wielko\u015bci, w kt\u00f3rej zapiszemy przekazan\u0105 do funkcji informacj\u0119 o docelowym rejestrze oraz samych danych. Z pierwszym elementem tablicy nie ma wi\u0119kszego problemu, poniewa\u017c reg ma format 8 bit\u00f3w i mo\u017cemy przekaza\u0107 go bezpo\u015brednio, ale z value jest pewna niedogodno\u015b\u0107.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c357e58 elementor-widget elementor-widget-image\" data-id=\"c357e58\" 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\/08\/maskowanie-bitor.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"maskowanie bitor\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2MDI5IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvbWFza293YW5pZS1iaXRvci5wbmcifQ%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\/08\/maskowanie-bitor-1024x576.png\" class=\"attachment-large size-large wp-image-86029\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/maskowanie-bitor-1024x576.png 1024w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/maskowanie-bitor-300x169.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/maskowanie-bitor-768x432.png 768w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/maskowanie-bitor-1536x864.png 1536w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/maskowanie-bitor.png 1920w\" 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\">Operacje przeprowadzane na zmiennej value.<\/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-c8117a9 elementor-widget elementor-widget-text-editor\" data-id=\"c8117a9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400;\">Warto\u015b\u0107 ta jest typu uint16_t, przez co tak naprawd\u0119 musimy podzieli\u0107 j\u0105 na dwie 8 bitowe cz\u0119\u015bci. Do tego celu wykorzystamy sprytn\u0105 konstrukcj\u0119, kt\u00f3r\u0105 mo\u017cecie zobaczy\u0107 na grafice powy\u017cej. Chc\u0105c wydzieli\u0107 osiem m\u0142odszych bit\u00f3w, musimy wykona\u0107 logiczn\u0105 operacj\u0119 AND, czyli innymi s\u0142owy przemno\u017cy\u0107 logicznie value, przez 0xFF, czyli 256. Taki proces nazywamy maskowaniem bit\u00f3w i do\u015b\u0107 dobrze obrazuje go grafika, kt\u00f3r\u0105 przygotowa\u0142em. Struktura 0xFF jest do\u015b\u0107 specyficzna, poniewa\u017c osiem starszych bit\u00f3w jest w tym przypadku zerami, pozwala to wyzerowa\u0107 r\u00f3wnie\u017c osiem starszych bit\u00f3w zmiennej value, dzi\u0119ki czemu w zmiennej wynikowej zawsze otrzymamy w tym miejscu zera. Z drugiej strony m\u0142odsza po\u0142owa 0xFF ma warto\u015b\u0107 jeden, przez co mamy pewno\u015b\u0107, \u017ce warto\u015bci value pozostan\u0105 w tym miejscu bez zmian. Maskowanie bit\u00f3w jest prostym sposobem, w kt\u00f3rym mo\u017cemy zerowa\u0107 wybrane przez siebie bity. Dla przyk\u0142adu mogliby\u015bmy wykona\u0107 instrukcj\u0119 value &amp; 0x0000, w takim przypadku wszystkie bity drugiej zmiennej s\u0105 zerami i tym sposobem, ca\u0142o\u015b\u0107 value zmieni\u0142aby si\u0119 w zero.<\/p><p style=\"font-weight: 400;\">By\u0107 mo\u017ce zastanawiacie si\u0119, czy maskowanie bit\u00f3w jest na pewno potrzebne i co by si\u0119 sta\u0142o, gdyby\u015bmy do elementu tablicy uint8_t przypisali warto\u015b\u0107 spod uint16_t. W przypadku procesora RP2040 nie sta\u0142oby si\u0119 nic, a lepszym okre\u015bleniem jest, \u017ce stanie si\u0119 to samo co w przypadku maskowania bit\u00f3w. Niezale\u017cnie od sytuacji mikrokontroler przypisze do elementu tablicy osiem m\u0142odszych bit\u00f3w zmiennej value. W takim razie, po co stosowa\u0107 maskowanie bit\u00f3w? Musimy pami\u0119ta\u0107, \u017ce programy w j\u0119zyku C uruchamiane mog\u0105 by\u0107 na naprawd\u0119 sporej liczbie platform, jedn\u0105 z nich s\u0105 te\u017c procesory sygna\u0142owe DSP, kt\u00f3rych dzia\u0142anie mo\u017ce by\u0107 do\u015b\u0107 specyficzne. Sam standard j\u0119zyka C zasadniczo nie przewiduje, aby do mniejszej zmiennej przypisane zosta\u0142o co\u015b innego ni\u017c okre\u015blona ilo\u015b\u0107 m\u0142odszych bit\u00f3w wi\u0119kszej zmiennej, ale pewno\u015bci czy tak b\u0119dzie nigdy nie mamy, przez r\u00f3\u017cnorodno\u015b\u0107 sprz\u0119towych rozwi\u0105za\u0144 we wsp\u00f3\u0142czesnych jednostkach centralnych, dlatego warto si\u0119 zabezpiecza\u0107 i stosowa\u0107 maskowanie bit\u00f3w.<\/p><p style=\"font-weight: 400;\">Ostatni element tablicy powinien przechowywa\u0107 osiem starszych bit\u00f3w zmiennej value, dlatego dzi\u0119ki operatorowi \u201e&gt;&gt;\u201d przesuwamy j\u0105 w prawo o osiem miejsc. Tym samym starsza cz\u0119\u015b\u0107 zmiennej zast\u0119puje m\u0142odszy fragment, a puste miejsca wype\u0142nione zostaj\u0105 zerami i nie ma potrzeby dodawania maskowania nowych bit\u00f3w.<\/p><p style=\"font-weight: 400;\">Tym sposobem przygotowali\u015bmy odpowiedni\u0105 tablic\u0119, w kt\u00f3rej umieszczone b\u0119d\u0105 kolejno informacje o docelowym rejestrze oraz dane do wys\u0142ania rozdzielone na dwa mniejsze elementy. Tak przygotowane informacje mo\u017cemy wys\u0142a\u0107, stosuj\u0105c poznan\u0105 ju\u017c wcze\u015bniej funkcj\u0119, realizuj\u0105c\u0105 to zadanie.<\/p><p style=\"font-weight: 400;\">Drug\u0105 uniwersaln\u0105 funkcj\u0105, kt\u00f3r\u0105 trzeba przygotowa\u0107, jest odczyt danych z czujnika. Nazwa\u0142em j\u0105 veml7700_read_register i jest to polecenie zwracaj\u0105ce 16 bit\u00f3w odczytanych z rejestru VEML7700. Poza tym w argumencie funkcji podawa\u0107 b\u0119dziemy te\u017c miejsce, z kt\u00f3rego b\u0119dziemy chcieli wyci\u0105gn\u0105\u0107 informacj\u0119.<\/p><p style=\"font-weight: 400;\">Wewn\u0105trz funkcji tworzymy dwuelementowy bufor, kt\u00f3ry przechowywa\u0107 b\u0119dzie odebrane informacje. Sk\u0142ada si\u0119 on z dw\u00f3ch element\u00f3w, poniewa\u017c jak ju\u017c wiecie, I2C operuje na 8 bitowych paczkach, a odebranych danych mo\u017ce by\u0107 wi\u0119cej. W kolejnym kroku wysy\u0142amy do sensora informacj\u0119 o rejestrze, z kt\u00f3rego za moment odczytamy dane, jak wida\u0107 korzystamy tutaj ze wska\u017anika, o czym wspomina\u0142em ju\u017c w poprzednim artykule, ale dla przypomnienia jest tak, poniewa\u017c przekazujemy tutaj pojedyncz\u0105 zmienn\u0105, a funkcja i2c_write_blocking zawsze wymaga wska\u017anika. W przypadku przekazywania do funkcji tablicy nie musimy stosowa\u0107 zapisu \u201e&amp;\u201d, poniewa\u017c tablica sama w sobie jest wska\u017anikiem, pokazuj\u0105cym na sw\u00f3j pierwszy element.<\/p><p style=\"font-weight: 400;\">Gdy czujnik otrzyma ju\u017c informacj\u0119 o rejestrze, z kt\u00f3rego chcemy odczyta\u0107 dane, przechodzimy do samego odczytu. Stosujemy tutaj poznan\u0105 ju\u017c wcze\u015bniej funkcj\u0119 i2c_read_blocking, kt\u00f3ra zapisze w tablicy buffer. Warto wspomnie\u0107, \u017ce instrukcja ta r\u00f3wnie\u017c wymaga wska\u017anika, do docelowego miejsca dla danych, ale korzystaj\u0105c z tablicy, nie musimy si\u0119 tym przejmowa\u0107. Funkcja odczyta pierwsze osiem bit\u00f3w i zapisze je w pierwszym elemencie tablicy, a nast\u0119pnie wyci\u0105gnie z czujnika kolejne dane i wrzuci je do kolejnego elementu tablicy.<\/p><p style=\"font-weight: 400;\">Gdy dane s\u0105 ju\u017c odebrane, mo\u017cemy je zwr\u00f3ci\u0107 dzi\u0119ki poleceniu return. Jako \u017ce s\u0105 one zapisane w dwuelementowej tablicy, a nasza funkcja zwraca pojedyncz\u0105 zmienn\u0105 w formacie uint16_t stosujemy poznan\u0105 ju\u017c wcze\u015bniej konstrukcj\u0119, kt\u00f3ra przesuwa o osiem miejsc w lewo drugi element tablicy i dzi\u0119ki logicznemu OR \u201e|\u201d \u0142\u0105czy j\u0105 z pierwszym elementem.<\/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-ffad749 elementor-widget elementor-widget-code-highlight\" data-id=\"ffad749\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp>void veml7700_init() {\r\n    veml7700_write_register(VEML7700_ALS_CONF_0, 0x0000);\r\n}\r\n\r\nuint16_t veml7700_read_light() {\r\n    return veml7700_read_register(VEML7700_ALS);\r\n}\r\n\r\nuint16_t veml7700_read_white() {\r\n    return veml7700_read_register(VEML7700_WHITE);\r\n}\r\n\r\nuint16_t veml7700_read_interrupt() {\r\n    return veml7700_read_register(VEML7700_ALS_INT);\r\n}\r\n\r\nuint16_t veml7700_read_id() {\r\n    return veml7700_read_register(VEML7700_ID_REG);\r\n}\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4e38144 elementor-widget elementor-widget-text-editor\" data-id=\"4e38144\" 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 przygotowaniu bazowych funkcji, dzi\u0119ki kt\u00f3rym mo\u017cliwa b\u0119dzie komunikacja poprzez I2C, mo\u017cemy przej\u015b\u0107 do przygotowania konkretnych polece\u0144 obs\u0142uguj\u0105cy tan modu\u0142. Na pierwszy ogie\u0144 we\u017amy kilka prostszych instrukcji, czyli inicjalizacj\u0119, odczyt warto\u015bci nat\u0119\u017cenia \u015bwiat\u0142a bia\u0142ego oraz og\u00f3lnego, sprawdzenie flag przerwa\u0144 oraz pobranie unikalnego numeru ID czujnika.<\/p><p style=\"font-weight: 400\">Inicjalizacj\u0119 czujnika przeprowadzali\u015bmy ju\u017c w poprzednim materiale, dlatego tym razem nie musimy wyja\u015bnia\u0107 jej sobie a\u017c tak dok\u0142adnie. Wewn\u0105trz funkcji veml7700_init znalaz\u0142o si\u0119 tylko jedno polecenie zapisuj\u0105ce do rejestru ALS_CONF_0 warto\u015b\u0107 zerow\u0105, tym samym ustawiaj\u0105c domy\u015blnie wszystkie parametry.<\/p><p style=\"font-weight: 400\">Konstrukcja pozosta\u0142ych funkcji jest bli\u017aniacza, ka\u017cda z nich zwraca warto\u015b\u0107 typu uint16_t, a w jej wn\u0119trzu znajdziemy polecenie odczytuj\u0105ce warto\u015b\u0107 spod rejestru, do kt\u00f3rego adres podajemy w argumencie. Dzi\u0119ki wcze\u015bniejszym deklaracj\u0105 nie musimy pami\u0119ta\u0107 konkretnych adres\u00f3w i wystarczy odwo\u0142a\u0107 si\u0119 do konkretnej nazwy.<\/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-e128f2c elementor-widget elementor-widget-text-editor\" data-id=\"e128f2c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre style=\"font-weight: 400\">void veml7700_set_integration_time(uint16_t time) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(0x0F &lt;&lt; 6); \/\/ Clear previous integration time settings<br \/> \u00a0\u00a0 config |= (time &lt;&lt; 6);\u00a0 \/\/ Set a new integration time<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_set_gain(uint16_t gain) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(0x03 &lt;&lt; 4); \/\/ Clear previous gain settings<br \/> \u00a0\u00a0 config |= (gain &lt;&lt; 4);\u00a0 \/\/ Set new gain<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_set_persistence(uint8_t persistence) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(0x03 &lt;&lt; 4); \/\/ Clear previous ALS_PERS settings<br \/> \u00a0\u00a0 config |= (persistence &lt;&lt; 4); \/\/ Set new ALS_PERS bits<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_CONF_0, config);<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-50ee21b elementor-widget elementor-widget-text-editor\" data-id=\"50ee21b\" 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 kolejnym kroku zajmijmy si\u0119 nieco bardziej z\u0142o\u017conymi funkcjami, b\u0119dzie to ustawienie czasu pomiaru nat\u0119\u017cenia \u015bwiat\u0142a, wyb\u00f3r formatu odczytywanych danych oraz ustawienie ilo\u015bci pomiar\u00f3w, po kt\u00f3rych przekroczeniu aktywowane zostanie przerwanie. Funkcje te s\u0105 do siebie do\u015b\u0107 podobne i r\u00f3\u017cni\u0105 si\u0119 tylko pojedynczymi szczeg\u00f3\u0142ami, dlatego mo\u017cemy przeanalizowa\u0107 je zbiorczo, na przyk\u0142adzie ustawiania czasu pojedynczego pomiaru.<\/p><p style=\"font-weight: 400\">Funkcja ta nie musi zwraca\u0107 \u017cadnych danych, dlatego jej typem jest void. W argumencie oczekiwa\u0107 b\u0119dziemy konkretnej warto\u015bci, zgodnej z dokumentacj\u0105, kt\u00f3ra okre\u015bla\u0107 b\u0119dzie czas trwania pr\u00f3bki. Dla przyk\u0142adu, je\u015bli b\u0119dziemy chcieli, aby pomiar trwa\u0142 200ms, w argumencie podamy 0x0001. Pierwszym krokiem wewn\u0105trz funkcji, jest odczytanie aktualnej warto\u015bci spod rejestru ALS_CONF_0 i zapisanie jej w zmiennej config. Jest to niezb\u0119dny zabieg, poniewa\u017c nie znamy aktualniej zawarto\u015bci rejestru konfiguracyjnego, a nie ma innego sposobu na modyfikacj\u0119 zawartych w nim danych, jak podmiana ich wszystkich. Innymi s\u0142owy, nie ma mo\u017cliwo\u015bci zmiany tylko kilku konkretnych bit\u00f3w, a nie chcemy te\u017c zmieni\u0107 warto\u015bci pozosta\u0142ych.<\/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-1dfabdd elementor-widget elementor-widget-image\" data-id=\"1dfabdd\" 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\/08\/maskowanie-funkcja-time.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"maskowanie funkcja time\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2MDMzIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvbWFza293YW5pZS1mdW5rY2phLXRpbWUucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"492\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/maskowanie-funkcja-time.png\" class=\"attachment-large size-large wp-image-86033\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/maskowanie-funkcja-time.png 960w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/maskowanie-funkcja-time-300x184.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/maskowanie-funkcja-time-768x472.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\">Maskowanie i zmiana warto\u015bci zmiennej config.<\/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-3c6f0ae elementor-widget elementor-widget-text-editor\" data-id=\"3c6f0ae\" 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 odczytaniu warto\u015bci rejestru konfiguracyjnego i zapisaniu go w config, mo\u017cemy wyczy\u015bci\u0107 bity od 6 do 9, czyli ALS_IT, warto\u015bci odpowiedzialne za czas pomiaru. Do tego celu wykorzystamy warto\u015b\u0107 0x0F, kt\u00f3rej cztery najm\u0142odsze bity maj\u0105 warto\u015b\u0107 jeden i przesuniemy je o sze\u015b\u0107 miejsc w lewo. W ten spos\u00f3b otrzymujemy bitowe 1111000000, kt\u00f3re nast\u0119pnie negujemy (operator \u201e~\u201d), czyli odwracamy warto\u015b\u0107 wszystkich bit\u00f3w na przeciwny otrzymuj\u0105c 0000111111. Tak przygotowana warto\u015b\u0107 mo\u017ce dzi\u0119ki logicznemu poleceniu AND wyzerowa\u0107 cztery bity, od 6 do 9 w zmiennej config. Proces ten jest niczym innym jak poznanym ju\u017c wcze\u015bniej maskowaniem bit\u00f3w. Gdy zmienna jest ju\u017c gotowa, mo\u017cemy umie\u015bci\u0107 w niej warto\u015b\u0107, kt\u00f3ra przekazywana jest w argumencie funkcji. W tym celu, korzystamy z logicznego OR i przesuwamy warto\u015b\u0107 spod time o sze\u015b\u0107 miejsc w lewo, tak aby znalaz\u0142a si\u0119 ona w przeznaczonej ALS_IT destynacji.<\/p><p style=\"font-weight: 400\">Tym sposobem zmodyfikowali\u015bmy warto\u015b\u0107 config, tak aby znalaz\u0142a si\u0119 tam nowa warto\u015b\u0107, odpowiadaj\u0105ca czasowi pomiaru, jednocze\u015bnie nie zmieniaj\u0105c pozosta\u0142ych bit\u00f3w. Dzi\u0119ki temu mo\u017cemy by\u0107 pewni, \u017ce po wys\u0142aniu danych do czujnika, co realizuje kolejne z polece\u0144, zmodyfikujemy tylko i wy\u0142\u0105cznie porz\u0105dn\u0105 warto\u015b\u0107, a pozosta\u0142e bity konfiguracyjne pozostan\u0105 bez zmian.<\/p><p style=\"font-weight: 400\">Pozosta\u0142e dwie funkcje z tego bloku kodu s\u0105 bardzo podobne, dlatego nie ma sensu ich dok\u0142adniej omawia\u0107. Zauwa\u017ccie tylko, \u017ce r\u00f3\u017cni\u0105 si\u0119 one warto\u015bci\u0105, kt\u00f3r\u0105 u\u017cywamy do maskowania config. 0x0F pozwala\u0142o wyzerowa\u0107 cztery bity, 0x03 umo\u017cliwia zrobienie tego samego na dw\u00f3ch bitach. Poza tym funkcje r\u00f3\u017cni\u0105 si\u0119 te\u017c warto\u015bci\u0105 przesuni\u0119\u0107, tak aby przekazana w argumencie zmienna umieszczona by\u0142a w odpowiednim miejscu.<\/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-35424f9 elementor-widget elementor-widget-code-highlight\" data-id=\"35424f9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp>void veml7700_power_save(uint16_t mode) {\r\n    veml7700_write_register(VEML7700_POWER_SAVING, mode);\r\n}\r\n\r\nvoid veml7700_set_high_threshold(uint16_t threshold) {\r\n    veml7700_write_register(VEML7700_ALS_WH, threshold);\r\n}\r\n\r\nvoid veml7700_set_low_threshold(uint16_t threshold) {\r\n    veml7700_write_register(VEML7700_ALS_WL, threshold);\r\n}\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-86d5621 elementor-widget elementor-widget-text-editor\" data-id=\"86d5621\" 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\">Kolejne obs\u0142uguj\u0105ce modu\u0142 VEML7700 funkcje bazuj\u0105 na poznanym ju\u017c wcze\u015bniej schemacie, w kt\u00f3rym korzystamy z uniwersalnej instrukcji zapisuj\u0105cej dane pod konkretny adres I2C. S\u0105 to polecenia pozwalaj\u0105ce uruchamia\u0107 tryb oszcz\u0119dzania energii oraz wprowadzi\u0107 odpowiednie dane do rejestr\u00f3w ALS_WH i ALS_WL, kt\u00f3re to definiuj\u0105 progowe warto\u015bci, przy kt\u00f3rych wyzwolone zostanie przerwanie. Podobnie jak wcze\u015bniej, dane wysy\u0142ane do czujnika podawane s\u0105 za pomoc\u0105 argumentu funkcji.<\/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-540db5d elementor-widget elementor-widget-text-editor\" data-id=\"540db5d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre style=\"font-weight: 400\">void veml7700_enable_interrupt() {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config |= (1 &lt;&lt; 1); \/\/ Set bit responsible for interrupts<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_disable_interrupt() {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(1 &lt;&lt; 1); \/\/ Clearing the bit responsible for interrupts<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_CONF_0, config);<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-0ad2d7a elementor-widget elementor-widget-text-editor\" data-id=\"0ad2d7a\" 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\">Ostatnimi funkcjami, kt\u00f3re musimy przygotowa\u0107, jest w\u0142\u0105czenie i wy\u0142\u0105cznie przerwa\u0144. Nie zwracaj\u0105 one \u017cadnych danych i bazuj\u0105 na procesie, kt\u00f3ry poznali\u015bmy ju\u017c wcze\u015bniej. Bity odpowiedzialne za uruchamianie lub dezaktywacj\u0119 przerwa\u0144 znajduj\u0105 si\u0119 w rejestrze ALS_CONF_0 dlatego w pierwszym kroku pobieramy jego zawarto\u015b\u0107 i umieszczamy w zmiennej config. W kolejnym kroku, musimy ustawi\u0107 lub wyzerowa\u0107 drugi bit rejestru ALS_CONF_0, zale\u017cnie od tego, czy chcemy w\u0142\u0105czy\u0107, czy wy\u0142\u0105czy\u0107 przerwania. Jako \u017ce operujemy tylko na jednym bicie, proces ten jest nieco prostszy ni\u017c w przypadku wcze\u015bniejszych manipulacji zawarto\u015bci\u0105 rejestru konfiguracyjnego. W tym przypadku nie musimy przejmowa\u0107 si\u0119 zawarto\u015bci\u0105 ALS_CONF_0 w ca\u0142o\u015bci, poniewa\u017c bity inne ni\u017c ALS_INT_EN nas nie interesuj\u0105, a zmiany, kt\u00f3rych za moment dokonamy, nie wp\u0142yn\u0105 na odczytan\u0105 zawarto\u015b\u0107 zapisan\u0105 w config. Innymi s\u0142owy, na koniec wy\u015blemy identyczn\u0105 zmienn\u0105, kt\u00f3ra r\u00f3\u017cni\u0107 mo\u017ce si\u0119 tylko bitem odpowiedzialnym za konfiguracj\u0119 przerwa\u0144.<\/p><p style=\"font-weight: 400\">Gdy chcemy w\u0142\u0105czy\u0107 system przerwa\u0144, musimy przeprowadzi\u0107 na zmiennej config logiczn\u0105 operacj\u0119 OR, kt\u00f3ra na drugim bicie tej zmiennej ustawi warto\u015b\u0107 jeden, dlatego w\u0142a\u015bnie czyst\u0105 warto\u015b\u0107 1 przesuwamy o jeden krok w lewo. Analogicznie, gdy chcemy wyzerowa\u0107 bit ALS_INT_EN stosujemy logiczny AND, a zmienn\u0105 maskuj\u0105c\u0105 dodatkowo negujemy, tak aby mie\u0107 pewno\u015b\u0107, \u017ce drugi bit zostanie wyzerowany.<\/p><p style=\"font-weight: 400\">W ten spos\u00f3b wszystkie funkcje pozwalaj\u0105ce zarz\u0105dza\u0107 cyfrowym czujnikiem temperatury s\u0105 gotowe. Od teraz b\u0119dziemy mogli w prosty spos\u00f3b inicjalizowa\u0107 modu\u0142, odczytywa\u0107 warto\u015bci nat\u0119\u017cenia \u015bwiat\u0142a, flag\u0119 przerwa\u0144 oraz indywidualny numer chipa. Poza tym mo\u017cemy dowolnie manipulowa\u0107 parametrami konfiguracyjnymi oraz ustawia\u0107 warto\u015bci progowe przerwa\u0144. Tak wi\u0119c, gdy ten fragment programu jest ju\u017c gotowy, mo\u017cemy przej\u015b\u0107 do g\u0142\u00f3wnej funkcji main i wykorzysta\u0107 przygotowane polecenia w rzeczywisto\u015bci.<\/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-db2dcc2 elementor-widget elementor-widget-code-highlight\" data-id=\"db2dcc2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp>int main() {\r\n    stdio_init_all();\r\n    i2c_init(I2C_PORT, 100 * 1000); \/\/ pr\u0119dko\u015b\u0107 I2C 100kHz\r\n\r\n    gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);\r\n    gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);\r\n    gpio_pull_up(SDA_PIN);\r\n    gpio_pull_up(SCL_PIN);\r\n\r\n    veml7700_init();\r\n    veml7700_set_integration_time(0x0001); \r\n    veml7700_set_gain(0x0000); \r\n    veml7700_set_persistence(0x0001); \r\n    veml7700_set_high_threshold(0x9C40); \r\n    veml7700_set_low_threshold(0x0FA0); \r\n    veml7700_enable_interrupt(); \r\n    veml7700_power_save(0x01); \r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cf1541e elementor-widget elementor-widget-text-editor\" data-id=\"cf1541e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-weight: 400\">Wewn\u0105trz g\u0142\u00f3wnej funkcji aktywujemy w poznany ju\u017c wcze\u015bniej spos\u00f3b magistral\u0119 I2C oraz ustawiamy odpowiednio piny SDA i SCL. Po tej operacji skorzysta\u0107 mo\u017cemy z przygotowanych wcze\u015bniej funkcji. Pierwszym krokiem jest inicjalizacja czujnika, kt\u00f3ra uruchamia go w podstawowej konfiguracji, a nast\u0119pnie za pomoc\u0105 konkretnych instrukcji mo\u017cemy zdefiniowa\u0107 poszczeg\u00f3lne parametry i funkcjonalno\u015bci modu\u0142u. W tym programie skorzystamy z wszystkich dost\u0119pnych mo\u017cliwo\u015bci, tak aby sprawdzi\u0107 dzia\u0142anie napisanych funkcji. Tak wi\u0119c za pomoc\u0105 kolejnych polece\u0144 zmieniamy czas pojedynczego pomiaru na 200ms, format danych definiujemy ponownie w bazowej konfiguracji, ustawiamy ALS_PERS, tak aby przerwanie aktywowane by\u0142o po dw\u00f3ch pomiarach, zmieniamy warto\u015bci progowe na 0x9C40 (40000) i 0x0FA0 (4000), w\u0142\u0105czamy system przerwa\u0144 oraz aktywujemy przyk\u0142adowy tryb oszcz\u0119dzania energii. Dane przekazujemy poprzez argumenty funkcji, kt\u00f3re jak ju\u017c wiemy,\u00a0 podzielone s\u0105 na dwie cz\u0119\u015bci i zapisywane w odpowiednich rejestrach 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-110e5d7 elementor-widget elementor-widget-text-editor\" data-id=\"110e5d7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre style=\"font-weight: 400\"> \u00a0\u00a0 while (true) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t device_id = veml7700_read_id();<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"Device ID: 0x%04X\\n\", device_id);<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t light = veml7700_read_light();<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"Ambient Light: %u\\n\", light);<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t white = veml7700_read_white();<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"White Light: %u\\n\", white);<br \/><br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t als_int = veml7700_read_interrupt();<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (als_int &amp; 0x4000) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"High threshold interrupt! Light: %u\\n\", light);<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (als_int &amp; 0x8000) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"Low threshold interrupt! Light: %u\\n\", light);<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sleep_ms(1000);<br \/>\u00a0\u00a0\u00a0 }<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a5ddb10 elementor-widget elementor-widget-text-editor\" data-id=\"a5ddb10\" 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 niesko\u0144czonej p\u0119tli while skorzystamy z kolejnych funkcji czujnika. Odczytamy jego uniwersalny numer identyfikacyjny, warto\u015b\u0107 og\u00f3lnego nat\u0119\u017cenia \u015bwiat\u0142a oraz \u015bwiat\u0142a bia\u0142ego, dodatkowo sprawdzimy te\u017c, czy pojawi\u0142o si\u0119 przerwanie wysokiego lub niskiego progu. W tym celu musimy sprawdzi\u0107, czy bit 14 lub 15 w ALS_INT jest jedynk\u0105. Mogliby\u015bmy sprawdza\u0107 go niejako pojedynczo, ale prostszym sposobem jest skorzystanie z logicznego AND. Poddaj\u0105c zmienn\u0105 takiej operacji, mo\u017cemy sprawi\u0107, \u017ce funkcja if wykona si\u0119, gdy w konkretnym jej miejscu pojawi si\u0119 logiczna prawda. O tym, kt\u00f3re b\u0119dzie to miejsce decyduje drugi wykorzystywany w dzia\u0142aniu argument. 0x4000 to nic innego jak bitowe 100000000000000, czyli jedynka na czternastym miejscu. Analogicznie 0x8000 odpowiada jedynce na pi\u0119tnastym miejscu. Tak wi\u0119c, gdy 14 bit w ALS_INT b\u0119dzie prawd\u0105, wykona si\u0119 pierwsza funkcja warunkowa, a gdy jedynka znajdzie si\u0119 na pi\u0119tnastym miejscu, wykonany zostanie drugi if.\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-0a997bb elementor-widget elementor-widget-image\" data-id=\"0a997bb\" 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\/08\/program1-serial.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"program1 serial\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2MDM3IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvcHJvZ3JhbTEtc2VyaWFsLnBuZyJ9\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"509\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/program1-serial.png\" class=\"attachment-large size-large wp-image-86037\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/program1-serial.png 858w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/program1-serial-300x191.png 300w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/program1-serial-768x489.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\">Monitor portu szeregowego po uruchomieniu programu. <\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0d0dbd5 elementor-widget elementor-widget-text-editor\" data-id=\"0d0dbd5\" 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 wrzuceniu programu do pami\u0119ci Raspberry Pi Pico, na ekranie monitora portu szeregowego obserwowa\u0107 mo\u017cemy odczytywane kolejno warto\u015bci nat\u0119\u017cenia \u015bwiat\u0142a wraz z towarzysz\u0105cym im numerem ID czujnika. Dodatkowo, gdy zas\u0142onimy czujnik i dwa odczyty z rz\u0119du b\u0119d\u0105 mia\u0142y warto\u015b\u0107 mniejsz\u0105 ni\u017c 4000, aktywowane zostanie przerwanie, kt\u00f3re odczytamy. Podobnie zdarzy si\u0119, gdy o\u015bwietlimy lico czujnika ostrym \u015bwiat\u0142e, tak aby jego warto\u015b\u0107 przekroczy\u0142a 40000, w\u00f3wczas r\u00f3wnie\u017c pojawi si\u0119 przerwanie, jednak jego \u017ar\u00f3d\u0142em, b\u0119dzie rejestr wysokiego progu.<\/p><p style=\"font-weight: 400\">W ten oto spos\u00f3b uda\u0142o si\u0119 nam uruchamia\u0107 program, kt\u00f3ry w pe\u0142nik korzysta z dost\u0119pnych w VEML7700 funkcji. Kod mo\u017ce wydawa\u0107 si\u0119 nieco skomplikowany, ale gdy spojrzymy na niego z szerszej perspektywy, wszystko si\u0119 rozja\u015bnia. Przygotowali\u015bmy szereg funkcji, kt\u00f3re mog\u0105 odczytywa\u0107 lub zapisywa\u0107 dane, a do samej komunikacji u\u017cywaj\u0105 dw\u00f3ch uniwersalnych polece\u0144. G\u0142\u00f3wna funkcja programu jest tutaj tylko formalno\u015bci\u0105, kt\u00f3ra pozwala sprawdzi\u0107, czy modu\u0142 dzia\u0142a poprawnie.<\/p><p style=\"font-weight: 400\">Mo\u017cemy tak naprawd\u0119 powiedzie\u0107, \u017ce wsp\u00f3lnymi si\u0142ami przygotowali\u015bmy namiastk\u0119 biblioteki, obs\u0142uguj\u0105cej cyfrowy czujnik \u015bwiat\u0142a VEML7700. Jednak, aby nasz program mo\u017cna by\u0142o nazwa\u0107 w pe\u0142ni funkcjonaln\u0105 bibliotek\u0105, musimy go nieco zmodyfikowa\u0107. Tak, aby w przypadku przygotowania wi\u0119kszego projektu m\u00f3c w prosty spos\u00f3b zaimplementowa\u0107 obs\u0142ug\u0119 modu\u0142u bez wi\u0119kszych ingerencji w g\u0142\u00f3wny kod. Jednak, aby by\u0142o to mo\u017cliwe, musimy podzieli\u0107 nasz program na osobne pliki.<\/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-f4da4ed elementor-widget elementor-widget-heading\" data-id=\"f4da4ed\" 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\">Podzia\u0142 projektu na pliki  <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9724e8c elementor-widget elementor-widget-text-editor\" data-id=\"9724e8c\" 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 projekty, kt\u00f3re budowali\u015bmy, sk\u0142ada\u0142y si\u0119 tylko z jednego pliku z rozszerzeniem .c, w kt\u00f3rym umieszczali\u015bmy wykonywany przez RPI kod. Musicie jednak wiedzie\u0107, \u017ce w przypadku wi\u0119kszych program\u00f3w powszechn\u0105, jak i wskazan\u0105 praktyk\u0105 jest dzielenie kodu na mniejsze cz\u0119\u015bci. Tym sposobem rozbijamy projekt na elementy sk\u0142adowe, skojarzone zazwyczaj z konkretn\u0105 funkcjonalno\u015bci\u0105 lub modu\u0142em zewn\u0119trznym. Pozwala to upro\u015bci\u0107 program i zmniejszy\u0107 obj\u0119to\u015b\u0107 g\u0142\u00f3wnego pliku, poniewa\u017c funkcje w nim zawarte odwo\u0142ywa\u0107 b\u0119d\u0105 si\u0119 do kodu, kt\u00f3ry umieszczony b\u0119dzie w innym miejscu.<\/p><p style=\"font-weight: 400\">Podzia\u0142 na pliki mo\u017cemy prze\u0107wiczy\u0107 w\u0142a\u015bnie na kodzie obs\u0142uguj\u0105cym cyfrowy czujnik \u015bwiat\u0142a. Spr\u00f3bujemy wyrzuci\u0107 przygotowane wcze\u015bniej polecenia do osobnego pliku, tak aby g\u0142\u00f3wny program by\u0142 jak najprostszy. Pozwoli to te\u017c w przysz\u0142o\u015bci do\u0142\u0105cza\u0107 obs\u0142ug\u0119 VEML7700 do innych projekt\u00f3w.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-21510d6 elementor-widget elementor-widget-image\" data-id=\"21510d6\" 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\/08\/podzial-na-pliki.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"podzial na pliki\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2MDQxIiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvcG9kemlhbC1uYS1wbGlraS5wbmcifQ%3D%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"396\" height=\"162\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/podzial-na-pliki.png\" class=\"attachment-large size-large wp-image-86041\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/podzial-na-pliki.png 396w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/podzial-na-pliki-300x123.png 300w\" sizes=\"(max-width: 396px) 100vw, 396px\" \/>\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\">Pliki w folderze 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-ed7caa7 elementor-widget elementor-widget-text-editor\" data-id=\"ed7caa7\" 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 dalszym ci\u0105gu korzysta\u0107 b\u0119dziemy z projektu veml7700, jednak teraz zmodyfikujemy nieco jego struktur\u0119. Klikaj\u0105c prawym przyciskiem myszy na nazw\u0119 projektu, nale\u017cy doda\u0107 do niego dwa pliki: main.c, kt\u00f3ry od teraz b\u0119dzie naszym g\u0142\u00f3wnym plikiem z kodem oraz veml7700.h, kt\u00f3ry b\u0119dzie pe\u0142ni\u0107 funkcj\u0119 pliku nag\u0142\u00f3wkowego.<\/p><p style=\"font-weight: 400\">Tego typu podzia\u0142 jest do\u015b\u0107 powszechnie stosowany we wi\u0119kszych projektach przygotowywanych w j\u0119zyku C. Poprzednio dysponowali\u015bmy tylko jednym plikiem z rozszerzeniem .c i buduj\u0105c projekt, \u015brodowisko uznawa\u0142o go za g\u0142\u00f3wny plik programu, cho\u0107 co warto zauwa\u017cy\u0107 za pomoc\u0105 #include, do\u0142\u0105czali\u015bmy ju\u017c inne biblioteki, niewidoczne tutaj, ale obecne w pico-examples. Od teraz naszym g\u0142\u00f3wnym plikiem b\u0119dzie main.c, kt\u00f3ry swoj\u0105 nazw\u0119 zawdzi\u0119cza bazowej funkcji programu w C. Do tego pliku do\u0142\u0105czymy veml7700.h, czyli plik nag\u0142\u00f3wkowy, w kt\u00f3rym znajd\u0105 si\u0119 wszystkie prototypy funkcji obs\u0142uguj\u0105cych cyfrowy czujnik \u015bwiat\u0142a. Cia\u0142o funkcji, czyli jej dok\u0142adne dzia\u0142alnie rozbite na pojedyncze polecenia umie\u015bcimy w veml7700.c. Tym sposobem przeniesiemy ca\u0142kowicie obs\u0142ug\u0119 sensora, do dw\u00f3ch osobnych plik\u00f3w i aby korzysta\u0107 z jego funkcjonalno\u015bci wystarczy, \u017ce do\u0142\u0105czymy do g\u0142\u00f3wnego pliku z kodem, plik nag\u0142\u00f3wkowy skojarzony z VEML7700.<\/p><p style=\"font-weight: 400\">Wydzielenie danej funkcjonalno\u015bci do osobnych plik\u00f3w ma jeszcze jedn\u0105 zalet\u0119. Dzi\u0119ki temu w przysz\u0142o\u015bci, gdy b\u0119dziemy chcieli skorzysta\u0107 z czujnika wystarczy, \u017ce do gotowego ju\u017c projektu wrzucimy dwa dodatkowe pliki. Innymi s\u0142owy, dodamy do projektu w\u0142asn\u0105, dodatkow\u0105 bibliotek\u0119.<\/p><p style=\"font-weight: 400\">Zanim jednak przejdziemy do omawiania poszczeg\u00f3lnych plik\u00f3w, zastan\u00f3wmy si\u0119 przez moment, jak ten proces b\u0119dzie wygl\u0105da\u0107. Mo\u017ce wydawa\u0107 si\u0119 to do\u015b\u0107 proste, ot przeniesiemy napisane funkcje do osobnego pliku, a w g\u0142\u00f3wnym main.c do\u0142\u0105czymy go jako bibliotek\u0119 i rzeczywi\u015bcie tak to wygl\u0105da. Zatrzyma\u0107 musimy si\u0119 jednak nad pewnym aspektem, kt\u00f3ry mo\u017cna powiedzie\u0107 niejako \u0142\u0105czy bibliotek\u0119, kt\u00f3r\u0105 przygotujemy i g\u0142\u00f3wny program, a jest to I2C. Czujnik korzysta z interfejsu I2C, kt\u00f3ry inicjujemy aktualnie na pocz\u0105tku g\u0142\u00f3wnej funkcji main i bez tej deklaracji nie b\u0119dzie on dzia\u0142a\u0142 poprawnie. Dlatego w\u0142a\u015bnie musimy zdecydowa\u0107 czy pozostawi\u0107 to w ten spos\u00f3b, aby to na barkach potencjalnego u\u017cytkownika spoczywa\u0142 obowi\u0105zek zadbania o interfejs I2C, czy te\u017c umie\u015bci\u0107 ten kod w naszej bibliotece.<\/p><p style=\"font-weight: 400\">Oba rozwi\u0105zania maj\u0105 swoje wady i zalety, u\u017cytkownik niekoniecznie musi chcie\u0107 zagl\u0105da\u0107 do biblioteki, aby zmienia\u0107 zawarte w niej dane, w sytuacji, gdy na przyk\u0142ad czujnik pod\u0142\u0105czony jest do innych wyprowadze\u0144 RPI Pico. Z drugiej jednak strony mo\u017cna powiedzie\u0107, \u017ce taka biblioteka nie jest do ko\u0144ca funkcjonalna, poniewa\u017c nie zosta\u0142a stworzona wed\u0142ug zasady \u201edo\u0142\u0105czam do projektu i dzia\u0142a, nie interesuje mnie co jest w \u015brodku\u201d.<\/p><p style=\"font-weight: 400\">Osobi\u015bcie sk\u0142aniam si\u0119 bardziej do drugiej opcji, wol\u0119, je\u015bli przygotowany przeze mnie kod jest nieco bardziej \u201ezamkni\u0119ty\u201d i nie wymaga od potencjalnego u\u017cytkownika dodawania dodatkowej funkcjonalno\u015bci, poniewa\u017c zak\u0142adam, \u017ce nie musi on zna\u0107 j\u0119zyka C na tym poziomie, aby pami\u0119ta\u0107 o inicjalizacji interfejsu.<\/p><p style=\"font-weight: 400\">Dlatego w\u0142a\u015bnie do pliku z opisem dzia\u0142ania VEML7700 do\u0142\u0105cz\u0119 dodatkow\u0105 funkcj\u0119 o nazwie veml7700_i2c_init, w kt\u00f3rej to znajdzie si\u0119 kod inicjalizuj\u0105cy magistral\u0119 I2C. B\u0119dzie to na sw\u00f3j spos\u00f3b po\u015brednie rozwi\u0105zanie, poniewa\u017c inicjalizacja interfejsu nie b\u0119dzie umieszczona wewn\u0105trz veml7700_init, a w osobnej funkcji. Domy\u015blnym b\u0119dzie jej u\u017cycie, ale je\u015bli kto\u015b chcia\u0142by zaj\u0105\u0107 si\u0119 przygotowaniem I2C w g\u0142\u00f3wnym programie, wystarczy, \u017ce nie skorzysta z tej funkcji.<\/p><p style=\"font-weight: 400\">Tak wi\u0119c przejd\u017amy do om\u00f3wienia poszczeg\u00f3lnych plik\u00f3w z kodem.<\/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-ec62cc3 elementor-widget elementor-widget-heading\" data-id=\"ec62cc3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">veml7700.h<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c8631b7 elementor-widget elementor-widget-code-highlight\" data-id=\"c8631b7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-c line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-c\">\n\t\t\t\t\t<xmp>#define I2C_PORT i2c1\r\n#define SDA_PIN 6\r\n#define SCL_PIN 7\r\n#define VEML7700_ADDR 0x10\r\n\r\n\/\/ VEML7700 register\r\n#define VEML7700_ALS_CONF_0   0x00\r\n#define VEML7700_ALS_WH       0x01\r\n#define VEML7700_ALS_WL       0x02\r\n#define VEML7700_POWER_SAVING 0x03\r\n#define VEML7700_ALS          0x04\r\n#define VEML7700_WHITE        0x05\r\n#define VEML7700_ALS_INT      0x06\r\n#define VEML7700_ID_REG       0x07\r\n\r\nvoid veml7700_write_register(uint8_t reg, uint16_t value);\r\nuint16_t veml7700_read_register(uint8_t reg);\r\n\r\nvoid veml7700_i2c_init();\r\n\r\nvoid veml7700_init();\r\nuint16_t veml7700_read_light();\r\nuint16_t veml7700_read_white();\r\nuint16_t veml7700_read_interrupt();\r\nuint16_t veml7700_read_id();\r\nvoid veml7700_set_integration_time(uint16_t time);\r\nvoid veml7700_set_gain(uint16_t gain);\r\nvoid veml7700_set_persistence(uint8_t persistence);\r\nvoid veml7700_power_save(uint16_t mode);\r\nvoid veml7700_set_high_threshold(uint16_t threshold);\r\nvoid veml7700_set_low_threshold(uint16_t threshold);\r\nvoid veml7700_enable_interrupt();\r\nvoid veml7700_disable_interrupt();\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1365436 elementor-widget elementor-widget-text-editor\" data-id=\"1365436\" 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 pliku nag\u0142\u00f3wkowym nale\u017cy umie\u015bci\u0107 wszystkie definicje i prototypy funkcji. W ten spos\u00f3b znalaz\u0142y si\u0119 tutaj informacje zwi\u0105zane z interfejsem I2C, adresy rejestr\u00f3w VEML7700 oraz prototypy wszystkich funkcji, kt\u00f3re opisane b\u0119d\u0105 w veml7700.c. Do\u0142\u0105czaj\u0105c plik nag\u0142\u00f3wkowy do g\u0142\u00f3wnego main.c, umo\u017cliwiamy mu dost\u0119p do tych w\u0142a\u015bnie funkcji, kt\u00f3re dok\u0142adniej opisane s\u0105 w pliku z rozszerzeniem .c.<\/p>\n<p style=\"font-weight: 400\">Jak mo\u017cecie zauwa\u017cy\u0107, struktura pliku .h jest nieco inna ni\u017c wcze\u015bniej przygotowywanych kod\u00f3w. Nie ma tutaj dodatkowych bibliotek lub standardowego podzia\u0142u na g\u0142\u00f3wn\u0105 funkcj\u0119 main i niesko\u0144czon\u0105 p\u0119tl\u0119 while. Jest to jednak naturalne, bo jak sama nazwa wskazuje plik nag\u0142\u00f3wkowy, ma zawiera\u0107 tylko nag\u0142\u00f3wki, wskazania innych funkcji, kt\u00f3re to umieszczone s\u0105 w innym pliku z kodem C.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-560ec18 elementor-widget elementor-widget-heading\" data-id=\"560ec18\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">veml7700.c<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c701d69 elementor-widget elementor-widget-text-editor\" data-id=\"c701d69\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre style=\"font-weight: 400\">#include &lt;stdio.h&gt;<br \/>#include \"pico\/stdlib.h\"<br \/>#include \"hardware\/i2c.h\"<br \/>#include \"veml7700.h\"<br \/><br \/>void veml7700_write_register(uint8_t reg, uint16_t value) {<br \/> \u00a0\u00a0 uint8_t data[3] = {reg, value &amp; 0xFF, value &gt;&gt; 8};<br \/> \u00a0\u00a0 i2c_write_blocking(I2C_PORT, VEML7700_ADDR, data, 3, false);<br \/>}<br \/><br \/>uint16_t veml7700_read_register(uint8_t reg) {<br \/> \u00a0\u00a0 uint8_t buffer[2];<br \/> \u00a0\u00a0 i2c_write_blocking(I2C_PORT, VEML7700_ADDR, &amp;reg, 1, true);<br \/> \u00a0\u00a0 i2c_read_blocking(I2C_PORT, VEML7700_ADDR, buffer, 2, false);<br \/> \u00a0\u00a0 return (buffer[1] &lt;&lt; 8) | buffer[0];<br \/>}<br \/><br \/>void veml7700_i2c_init(){<br \/> \u00a0\u00a0 i2c_init(I2C_PORT, 100 * 1000);<br \/> \u00a0\u00a0 gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);<br \/> \u00a0\u00a0 gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);<br \/> \u00a0\u00a0 gpio_pull_up(SDA_PIN);<br \/> \u00a0\u00a0 gpio_pull_up(SCL_PIN);<br \/>}<br \/><br \/>void veml7700_init() {<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_CONF_0, 0x0000);<br \/>}<br \/><br \/>uint16_t veml7700_read_light() {<br \/> \u00a0\u00a0 return veml7700_read_register(VEML7700_ALS);<br \/>}<br \/><br \/>uint16_t veml7700_read_white() {<br \/> \u00a0\u00a0 return veml7700_read_register(VEML7700_WHITE);<br \/>}<br \/><br \/>uint16_t veml7700_read_interrupt() {<br \/> \u00a0\u00a0 return veml7700_read_register(VEML7700_ALS_INT);<br \/>}<br \/><br \/>uint16_t veml7700_read_id() {<br \/> \u00a0\u00a0 return veml7700_read_register(VEML7700_ID_REG);<br \/>}<br \/><br \/>void veml7700_set_integration_time(uint16_t time) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(0x0F &lt;&lt; 6); \/\/ Clear previous integration time settings<br \/> \u00a0\u00a0 config |= (time &lt;&lt; 6);\u00a0 \/\/ Set a new integration time<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_set_gain(uint16_t gain) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(0x03 &lt;&lt; 4); \/\/ Clear previous gain settings<br \/> \u00a0\u00a0 config |= (gain &lt;&lt; 4);\u00a0 \/\/ Set new gain<br \/> \u00a0  veml7700_write_register(VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_set_persistence(uint8_t persistence) {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(0x03 &lt;&lt; 4); \/\/ Clear previous ALS_PERS settings<br \/> \u00a0\u00a0 config |= (persistence &lt;&lt; 4); \/\/ Set new ALS_PERS bits<br \/> \u00a0  veml7700_write_register(VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_power_save(uint16_t mode) {<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_POWER_SAVING, mode);<br \/>}<br \/><br \/>void veml7700_set_high_threshold(uint16_t threshold) {<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_WH, threshold);<br \/>}<br \/><br \/>void veml7700_set_low_threshold(uint16_t threshold) {<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_WL, threshold);<br \/>}<br \/><br \/>void veml7700_enable_interrupt() {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config |= (1 &lt;&lt; 1); \/\/ Setting the bit responsible for interrupts<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_CONF_0, config);<br \/>}<br \/><br \/>void veml7700_disable_interrupt() {<br \/> \u00a0\u00a0 uint16_t config = veml7700_read_register(VEML7700_ALS_CONF_0);<br \/> \u00a0\u00a0 config &amp;= ~(1 &lt;&lt; 1); \/\/ Clearing the bit responsible for interrupts<br \/> \u00a0\u00a0 veml7700_write_register(VEML7700_ALS_CONF_0, config);<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-4350c7b elementor-widget elementor-widget-text-editor\" data-id=\"4350c7b\" 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\">We wn\u0119trzu veml.c, tak jak wspomina\u0142em, znalaz\u0142y si\u0119 wszystkie funkcje, kt\u00f3re przygotowali\u015bmy ju\u017c wcze\u015bniej. Jedyn\u0105 nowo\u015bci\u0105 jest tutaj veml7700_i2c_init, czyli opcjonalne polecenie inicjalizuj\u0105ce magistral\u0119 I2C, kt\u00f3rego rozwini\u0119ciem s\u0105 instrukcje umieszczone wcze\u015bniej w g\u0142\u00f3wnej funkcji main.<\/p><p style=\"font-weight: 400\">Kod ten mo\u017ce ju\u017c nieco bardziej przypomina\u0107 standardowe programy w j\u0119zyku C, kt\u00f3re poznali\u015bmy do tej pory. Jak wida\u0107, znalaz\u0142o si\u0119 tu kilka dodatkowych bibliotek oraz do\u0142\u0105czony plik z rozszerzeniem .h, kt\u00f3ry przygotowali\u015bmy wy\u017cej. Zabrak\u0142o jednak tutaj funkcji main i p\u0119tli while, poniewa\u017c zadaniem tego pliku jest tylko rozwin\u0105\u0107 dost\u0119pne z poziomu veml7700.h funkcje, innymi s\u0142owy opisa\u0107 ich dzia\u0142anie.<\/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-216e6e7 elementor-widget elementor-widget-heading\" data-id=\"216e6e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">main.c<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d9f66a7 elementor-widget elementor-widget-text-editor\" data-id=\"d9f66a7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<pre style=\"font-weight: 400\">#include &lt;stdio.h&gt;<br \/>#include \"pico\/stdlib.h\"<br \/>#include \"hardware\/i2c.h\"<br \/>#include \"veml7700.h\"<br \/><br \/>int main() {<br \/>\u00a0\u00a0\u00a0 stdio_init_all();<br \/><br \/> \u00a0\u00a0 veml7700_i2c_init();<br \/>\u00a0\u00a0\u00a0 veml7700_init();<br \/><br \/> \u00a0\u00a0 veml7700_set_integration_time(0x0001);<br \/> \u00a0\u00a0 veml7700_set_gain(0x0000);<br \/> \u00a0\u00a0 veml7700_set_persistence(0x0001);<br \/> \u00a0\u00a0 veml7700_set_high_threshold(0x9C40);<br \/> \u00a0\u00a0 veml7700_set_low_threshold(0x0FA0);<br \/> \u00a0\u00a0 veml7700_enable_interrupt();<br \/>\u00a0\u00a0\u00a0 veml7700_power_save(0x01);<br \/><br \/> \u00a0\u00a0 while (true) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t device_id = veml7700_read_id();<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"Device ID: 0x%04X\\n\", device_id);<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t light = veml7700_read_light();<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"Ambient Light: %u\\n\", light);<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t white = veml7700_read_white();<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"White Light: %u\\n\", white);<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 uint16_t als_int = veml7700_read_interrupt();<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (als_int &amp; 0x4000) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"High threshold interrupt! Light: %u\\n\", light);<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (als_int &amp; 0x8000) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 printf(\"Low threshold interrupt! Light: %u\\n\", light);<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sleep_ms(3000);<br \/> \u00a0\u00a0 }<br \/>}<\/pre>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3c27119 elementor-widget elementor-widget-text-editor\" data-id=\"3c27119\" 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\">Struktura pliku main.c, kt\u00f3ry od tej pory b\u0119dzie naszym g\u0142\u00f3wnym plikiem z kodem C, jest znacznie bardziej odchudzona wzgl\u0119dem wcze\u015bniejszego programu, w kt\u00f3rym wszystko umieszczone by\u0142o w jednym miejscu. Dzi\u0119ki do\u0142\u0105czeniu veml.h, zyskujemy z jego poziomu dost\u0119p do funkcji opisanych w veml.c. Tym sposobem, po do\u0142\u0105czeniach mo\u017cemy od razu przej\u015b\u0107 do g\u0142\u00f3wnej funkcji main, w kt\u00f3rej umieszczona funkcja inicjalizuj\u0105ca magistral\u0119 I2C oraz polecenia zwi\u0105zane stricte z czujnikiem \u015bwiat\u0142a, kt\u00f3re poznali\u015bmy ju\u017c wcze\u015bniej. Niesko\u0144czona p\u0119tla while, r\u00f3wnie\u017c nie r\u00f3\u017cni si\u0119 znacz\u0105co wzgl\u0119dem poprzedniego programu. Jedyn\u0105 r\u00f3\u017cnic\u0105 jest tutaj trzy sekundowe odczekanie, przed kolejnym przebiegiem p\u0119tli. Poza tym, tak jak wcze\u015bniej, odczytujemy dane z sensora i wysy\u0142amy je na ekran komputera.<\/p><p style=\"font-weight: 400\">Tym sposobem podzielili\u015bmy projekt obs\u0142uguj\u0105cy cyfrowy czujnik \u015bwiat\u0142a na trzy osobne pliki, jednak, aby mo\u017cna by\u0142o go skompilowa\u0107, nale\u017cy dokona\u0107 niewielkiej zmiany z 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-ddea31b elementor-widget elementor-widget-image\" data-id=\"ddea31b\" 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\/08\/cmake.png\" data-elementor-open-lightbox=\"yes\" data-elementor-lightbox-title=\"cmake\" data-e-action-hash=\"#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6Ijg2MDQ1IiwidXJsIjoiaHR0cHM6XC9cL2JvdGxhbmQuY29tLnBsXC9ibG9nXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDI0XC8wOFwvY21ha2UucG5nIn0%3D\" data-wpel-link=\"internal\">\n\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"637\" height=\"327\" src=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/cmake.png\" class=\"attachment-large size-large wp-image-86045\" alt=\"\" srcset=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/cmake.png 637w, https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/cmake-300x154.png 300w\" sizes=\"(max-width: 637px) 100vw, 637px\" \/>\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 CMakeLists.txt dla projektu 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-8e95608 elementor-widget elementor-widget-text-editor\" data-id=\"8e95608\" 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\">Jako \u017ce aktualnie w strukturze projektu umieszczone s\u0105 dwa pliki z rozszerzeniem .c, tak\u0105 informacj\u0119 trzeba umie\u015bci\u0107 w CMakeLists.txt. Oba pliki dodajemy wewn\u0105trz add_executable, tak jak wida\u0107 na za\u0142\u0105czonym wy\u017cej obrazku.<\/p><p style=\"font-weight: 400\">Tak przygotowany projekt mo\u017cna skompilowa\u0107, a wygenerowany plik .uf2 wrzuci\u0107 do pami\u0119ci RPI Pico. Po uruchomieniu efekt powinien by\u0107 identyczny jak poprzednim razem. Na ekranie komputera zobaczymy zwracane przez sensor warto\u015bci nat\u0119\u017cenia \u015bwiat\u0142a wraz z informacj\u0105 o przerwaniu, je\u015bli takowe wyst\u0105pi.<\/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-7658d65 elementor-widget elementor-widget-heading\" data-id=\"7658d65\" 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-aaf12c0 elementor-widget elementor-widget-text-editor\" data-id=\"aaf12c0\" 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\">By\u0142 to pierwszy materia\u0142 po\u015bwi\u0119cony przygotowaniu biblioteki dla cyfrowego czujnika \u015bwiat\u0142a. Kod, kt\u00f3ry przygotowali\u015bmy, jest ju\u017c w pe\u0142ni funkcjonalny, a ponadto podzielony na pliki, dzi\u0119ki czemu mo\u017cna go w prosty spos\u00f3b do\u0142\u0105czy\u0107 do istniej\u0105cego ju\u017c projektu. Nie jest to jednak koniec, dlatego w kolejnym artykule spr\u00f3bujemy przerobi\u0107 program, tak aby czujnik sta\u0142 si\u0119 elementem obiektowym, a poza tym przyjrzymy si\u0119 jednemu z modu\u0142\u00f3w RP2040 o nazwie DMA.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-97c9a03 elementor-widget elementor-widget-spacer\" data-id=\"97c9a03\" 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-35fc7d0 elementor-widget elementor-widget-text-editor\" data-id=\"35fc7d0\" 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 tym materiale spr\u00f3bujemy nieco rozbudowa\u0107 program obs\u0142uguj\u0105cy cyfrowy czujnik \u015bwiat\u0142a VEML7700, tak aby mogli korzysta\u0107 z niego r\u00f3wnie\u017c inni u\u017cytkownicy.<\/p>\n","protected":false},"author":34,"featured_media":86212,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7,21,134],"tags":[],"class_list":["post-86002","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 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\/2 - Botland<\/title>\n<meta name=\"description\" content=\"W tym materiale spr\u00f3bujemy nieco rozbudowa\u0107 program obs\u0142uguj\u0105cy cyfrowy czujnik \u015bwiat\u0142a VEML7700, tak aby mogli korzysta\u0107 z niego r\u00f3wnie\u017c inni u\u017cytkownicy.\" \/>\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-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/\" \/>\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 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\/2 - Botland\" \/>\n<meta property=\"og:description\" content=\"W tym materiale spr\u00f3bujemy nieco rozbudowa\u0107 program obs\u0142uguj\u0105cy cyfrowy czujnik \u015bwiat\u0142a VEML7700, tak aby mogli korzysta\u0107 z niego r\u00f3wnie\u017c inni u\u017cytkownicy.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Botland\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/Botland\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-20T12:00:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-08T08:53:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_12.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=\"31 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-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/\"},\"author\":{\"name\":\"Rafa\u0142 Bartoszak\",\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#\\\/schema\\\/person\\\/5a69e7f5db1f77c617f990e73bb83215\"},\"headline\":\"Kurs Raspberry Pi Pico \u2013 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\\\/2\",\"datePublished\":\"2024-08-20T12:00:32+00:00\",\"dateModified\":\"2026-04-08T08:53:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/\"},\"wordCount\":5778,\"publisher\":{\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/kurs_pico_12.png\",\"articleSection\":[\"Elektronika\",\"Programowanie\",\"Raspberry Pi\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/\",\"url\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/\",\"name\":\"Kurs Raspberry Pi Pico \u2013 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\\\/2 - Botland\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/botland.store\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/kurs_pico_12.png\",\"datePublished\":\"2024-08-20T12:00:32+00:00\",\"dateModified\":\"2026-04-08T08:53:00+00:00\",\"description\":\"W tym materiale spr\u00f3bujemy nieco rozbudowa\u0107 program obs\u0142uguj\u0105cy cyfrowy czujnik \u015bwiat\u0142a VEML7700, tak aby mogli korzysta\u0107 z niego r\u00f3wnie\u017c inni u\u017cytkownicy.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/kurs_pico_12.png\",\"contentUrl\":\"https:\\\/\\\/homebook.click\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/kurs_pico_12.png\",\"width\":1510,\"height\":755},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/homebook.click\\\/blog\\\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\\\/#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 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\\\/2\"}]},{\"@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 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\/2 - Botland","description":"W tym materiale spr\u00f3bujemy nieco rozbudowa\u0107 program obs\u0142uguj\u0105cy cyfrowy czujnik \u015bwiat\u0142a VEML7700, tak aby mogli korzysta\u0107 z niego r\u00f3wnie\u017c inni u\u017cytkownicy.","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-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/","og_locale":"pl_PL","og_type":"article","og_title":"Kurs Raspberry Pi Pico \u2013 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\/2 - Botland","og_description":"W tym materiale spr\u00f3bujemy nieco rozbudowa\u0107 program obs\u0142uguj\u0105cy cyfrowy czujnik \u015bwiat\u0142a VEML7700, tak aby mogli korzysta\u0107 z niego r\u00f3wnie\u017c inni u\u017cytkownicy.","og_url":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/","og_site_name":"Botland","article_publisher":"https:\/\/facebook.com\/Botland\/","article_published_time":"2024-08-20T12:00:32+00:00","article_modified_time":"2026-04-08T08:53:00+00:00","og_image":[{"width":1510,"height":755,"url":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_12.png","type":"image\/png"}],"author":"Rafa\u0142 Bartoszak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Rafa\u0142 Bartoszak","Szacowany czas czytania":"31 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/#article","isPartOf":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/"},"author":{"name":"Rafa\u0142 Bartoszak","@id":"https:\/\/botland.store\/blog\/#\/schema\/person\/5a69e7f5db1f77c617f990e73bb83215"},"headline":"Kurs Raspberry Pi Pico \u2013 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\/2","datePublished":"2024-08-20T12:00:32+00:00","dateModified":"2026-04-08T08:53:00+00:00","mainEntityOfPage":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/"},"wordCount":5778,"publisher":{"@id":"https:\/\/botland.store\/blog\/#organization"},"image":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/#primaryimage"},"thumbnailUrl":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_12.png","articleSection":["Elektronika","Programowanie","Raspberry Pi"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/","url":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/","name":"Kurs Raspberry Pi Pico \u2013 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\/2 - Botland","isPartOf":{"@id":"https:\/\/botland.store\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/#primaryimage"},"image":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/#primaryimage"},"thumbnailUrl":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_12.png","datePublished":"2024-08-20T12:00:32+00:00","dateModified":"2026-04-08T08:53:00+00:00","description":"W tym materiale spr\u00f3bujemy nieco rozbudowa\u0107 program obs\u0142uguj\u0105cy cyfrowy czujnik \u015bwiat\u0142a VEML7700, tak aby mogli korzysta\u0107 z niego r\u00f3wnie\u017c inni u\u017cytkownicy.","breadcrumb":{"@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/#primaryimage","url":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_12.png","contentUrl":"https:\/\/homebook.click\/blog\/wp-content\/uploads\/2024\/08\/kurs_pico_12.png","width":1510,"height":755},{"@type":"BreadcrumbList","@id":"https:\/\/homebook.click\/blog\/kurs-raspberry-pi-pico-12-przygotowujemy-biblioteke-dla-cyfrowego-czujnika-swiatla-1-2\/#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 #12 \u2013 przygotowujemy bibliotek\u0119 dla cyfrowego czujnika \u015bwiat\u0142a 1\/2"}]},{"@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\/86002","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=86002"}],"version-history":[{"count":0,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/posts\/86002\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/media\/86212"}],"wp:attachment":[{"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/media?parent=86002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/categories?post=86002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/homebook.click\/blog\/wp-json\/wp\/v2\/tags?post=86002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}