{"id":313087,"date":"2020-11-13T15:01:00","date_gmt":"2020-11-13T15:01:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=313087"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=313087","title":{"rendered":"\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Raspberry Pi 4, \u0434\u0430\u0442\u0447\u0438\u043a\u0430 Sensirion SPS30 \u0438 Microsoft Azure"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0412 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435, \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0451\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u0442\u0447\u0438\u043a \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 Sensirion Particulate Matter Sensor SPS30 \u043a Raspberry Pi 4, \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 Microsoft Azure, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u0432\u0438\u0434\u0435.<\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/527234\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pe\/jm\/me\/pejmmejj-gqniil1-9vkqwq15p0.png\"><\/a><br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2><font color=\"#3AC1EF\">\u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435<\/font><\/h2>\n<p>  <\/p>\n<ul>\n<li>\u0414\u0430\u0442\u0447\u0438\u043a \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 Sensirion Particulate Matter Sensor SPS30.<\/li>\n<li>\u041e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 Raspberry Pi 4 Model B.<\/li>\n<li>\u041c\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0430.<\/li>\n<li>\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0430.<\/li>\n<li>\u0414\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 Linux, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Yocto Project.<\/li>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 Rust \u0438 Python.<\/li>\n<li>\u041e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 Microsoft Azure.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u0421\u0431\u043e\u0440\u043a\u0430 \u041e\u0421<\/font><\/h2>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Raspberry Pi 4 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 Linux \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Yocto Project.<\/p>\n<p>  \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c Yocto-\u0441\u043b\u043e\u0439 BSP \u0434\u043b\u044f Raspberry Pi <a href=\"https:\/\/github.com\/agherzan\/meta-raspberrypi\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a> \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u043c\u0438\u0442 <code>497a90a<\/code>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c <code>35364c0ce<\/code> <a href=\"https:\/\/github.com\/openembedded\/meta-openembedded\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a> \u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c <code>ca701cb92d<\/code> <a href=\"https:\/\/git.yoctoproject.org\/git\/poky\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>. \u0421\u043e\u0431\u0435\u0440\u0451\u043c \u043e\u0431\u0440\u0430\u0437 \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u043d\u0430 SD-\u043a\u0430\u0440\u0442\u0443, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u0430.<\/p>\n<p>  \u041c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0437, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u0444\u0430\u0439\u043b <code>rpi-build\/conf\/local.conf<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ol>\n<li><code>IMAGE_ROOTFS_EXTRA_SPACE = \u00ab8388608\u00bb<\/code> \u2014 \u0434\u043b\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430;<\/li>\n<li><code>ENABLE_I2C = \u00ab1\u00bb<\/code> \u0438 <code>KERNEL_MODULE_AUTOLOAD_rpi += \u00abi2c-dev i2c-bcm2708\u00bb<\/code> \u2014 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f I2C;<\/li>\n<li><code>CORE_IMAGE_EXTRA_INSTALL += \u00abbash nano tar zip openssh curl ca-certificates ntp tzdata packagegroup-core-buildessential python3 python3-pip i2c-tools git startup-script rustup\u00bb<\/code> \u2014 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/li>\n<\/ol>\n<p>  \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0437\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0443\u0442\u044c \u043a \u0441\u043b\u043e\u044e <a href=\"https:\/\/github.com\/david-gherghita\/meta-mylayer\">meta-mylayer<\/a> \u0432 \u0441\u043f\u0438\u0441\u043e\u043a <code>BBLAYERS<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <code>rpi-build\/conf\/bblayers.conf<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0446\u0435\u043f\u0442\u044b:<\/p>\n<ol>\n<li><code>ntp<\/code> \u2014 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/li>\n<li><code>rustup<\/code> \u2014 \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Rust \u0432 rootfs.<\/li>\n<li><code>startup-script<\/code> \u2014 \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a WiFi-\u0441\u0435\u0442\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 <code>ntp<\/code>.<\/li>\n<li><code>tzdata<\/code> \u2014 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0447\u0430\u0441\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u044f\u0441\u0430. \u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043d\u0443\u0436\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u0447\u0430\u0441\u043e\u0432\u044b\u043c \u043f\u043e\u044f\u0441\u043e\u043c.<\/li>\n<li><code>wpa_supplicant<\/code> \u2014 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 WiFi-\u0441\u0435\u0442\u0438. \u0412 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/li>\n<\/ol>\n<p>  \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u043e\u0431\u0440\u0430\u0437 \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u043d\u0430 SD-\u043a\u0430\u0440\u0442\u0443.<\/p>\n<h2><font color=\"#3AC1EF\">\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u043a Raspberry Pi<\/font><\/h2>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u043a Raspberry Pi \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u043e\u0439 \u0438 \u0434\u0432\u0443\u043c\u044f \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440\u0430\u043c\u0438 \u043d\u0430 10 \u043a\u041e\u043c. \u0421\u043e\u0431\u0435\u0440\u0451\u043c \u0432\u0441\u0451 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0445\u0435\u043c\u043e\u0439, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0439 \u043d\u0430 \u0441. 16 <a href=\"https:\/\/www.sensirion.com\/fileadmin\/user_upload\/customers\/sensirion\/Dokumente\/9.6_Particulate_Matter\/Datasheets\/Sensirion_PM_Sensors_SPS30_Datasheet.pdf\">\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f<\/a> \u0434\u0430\u0442\u0447\u0438\u043a\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7b5\/53b\/3f3\/7b553b3f371a476ee7f36544d0c01a40.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 SPS30 \u043a Raspberry Pi<\/font><\/i><\/p>\n<p>  \u0412 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/www.raspberrypi.org\/documentation\/usage\/gpio\/\">\u0441\u0445\u0435\u043c\u0430<\/a> \u0432\u044b\u0432\u043e\u0434\u043e\u0432 GPIO Raspberry Pi 4.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/67e\/4ee\/d09\/67e4eed09a0f1115f07f0d1563003a26.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u0421\u0445\u0435\u043c\u0430 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 GPIO Raspberry Pi 4<\/font><\/i><\/p>\n<p>  \u0412\u043e\u0442 \u043a\u0430\u043a \u0434\u0430\u0442\u0447\u0438\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a Raspberry Pi:<\/p>\n<ol>\n<li>\u041f\u0438\u043d <code>VDD (1)<\/code> SPS30 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a \u043f\u0438\u043d\u0443 <code>4 (5V power)<\/code> Raspberry Pi.<\/li>\n<li>\u041f\u0438\u043d <code>SDA (2)<\/code> SPS30 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a \u043f\u0438\u043d\u0443 <code>3 (GPIO 2 (SDA))<\/code> Raspberry Pi.<\/li>\n<li>\u041f\u0438\u043d <code>SCL (3)<\/code> SPS30 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a \u043f\u0438\u043d\u0443 <code>5 (GPIO 3 (SCL))<\/code> Raspberry Pi.<\/li>\n<li>\u041f\u0438\u043d <code>SEL (4)<\/code> SPS30 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a \u043f\u0438\u043d\u0443 <code>6 (Ground)<\/code> Raspberry Pi.<\/li>\n<li>\u041f\u0438\u043d <code>GND (5)<\/code> SPS30 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a \u043f\u0438\u043d\u0443 <code>6 (Ground)<\/code> Raspberry Pi.<\/li>\n<\/ol>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043d\u0430 Raspberry Pi \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>i2cdetect -y 1<\/code> \u0438 \u0443\u0437\u043d\u0430\u0432, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c <code>0x69<\/code>.<\/p>\n<h2><font color=\"#3AC1EF\">\u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/font><\/h2>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043d\u0430 Raspberry Pi Rust, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c <code>rustup<\/code>.<\/p>\n<p>  \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u0430:<\/p>\n<pre><code class=\"plaintext\">git clone https:\/\/github.com\/david-gherghita\/sps30-i2c-rs.git <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"plaintext\">cargo run --example linux <\/code><\/pre>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u043a\u043e<\/font><\/h2>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 <a href=\"http:\/\/azure.microsoft.com\/en-us\">Microsoft Azure<\/a>.<\/p>\n<p>  \u041d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 Azure Services \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (Resource Group).<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/293\/b54\/ff0\/293b54ff0be01e893441bf3b78a7d35e.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/font><\/i><\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u043e\u0432\u044b\u0439 IoT-\u0445\u0430\u0431 (IoT Hub) \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043d\u0430 \u0435\u0433\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.<\/p>\n<p>  \u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 <code>Explorers<\/code> \u0449\u0451\u043b\u043a\u043d\u0435\u043c \u043f\u043e <code>IoT Devices<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0422\u0443\u0442 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u043b\u0435 <code>Primary Connection String<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u044b \u043a \u043e\u0431\u043b\u0430\u043a\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5e3\/23f\/f49\/5e323ff49c0b5b336d029853c07a52f0.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/font><\/i><\/p>\n<p>  \u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 Rust (\u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u041a\u043e\u0434\u00bb), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>cargo<\/code>, \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"plaintext\">linux-embedded-hal = &quot;0.3.0&quot; sps30-i2c = &quot;0.1.0&quot; <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f (Primary Connection String), \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u0443\u0442\u044c \u043a Rust-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c Python-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 (\u0435\u0451 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u041a\u043e\u0434\u00bb).<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u2014 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a \u0432 IoT-\u0445\u0430\u0431 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/457\/438\/410\/457438410b878ce0f1fcfd0fc131e3f3.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0432 IoT-\u0445\u0430\u0431<\/font><\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0432 Microsoft Azure, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 <code>Stream Analytics<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 IoT-\u0445\u0430\u0431\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0432, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>Event serialization format<\/code> \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d <code>JSON<\/code>.<\/p>\n<p>  \u041d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 <code>Input Preview<\/code> \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0c0\/5a6\/64b\/0c05a664b6a1d03c9809a51000b60987.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u0414\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0441 Raspberry Pi<\/font><\/i><\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u0432 \u0444\u043e\u0440\u043c\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0437\u0430\u0434\u0430\u043d\u0438\u044e <code>Stream Analytics<\/code> \u0432\u044b\u0445\u043e\u0434 \u0442\u0438\u043f\u0430 <code>Power Bi<\/code>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>Authentication Mode<\/code> \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>User Token<\/code>. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u0430 \u0431\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0432 \u0440\u043e\u043b\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 <code>Power Bi<\/code>.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043f\u0440\u0438\u0432\u0435\u0434\u044f \u0435\u0451 \u043a \u0432\u0438\u0434\u0443, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043d\u0438\u0436\u0435. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Power Bi.<\/p>\n<pre><code class=\"plaintext\">SELECT \u00a0\u00a0\u00a0\u00a0&quot;mass_pm1.0&quot;, \u00a0\u00a0\u00a0\u00a0&quot;mass_pm2.5&quot;, \u00a0\u00a0\u00a0\u00a0&quot;mass_pm4.0&quot;, \u00a0\u00a0\u00a0\u00a0&quot;mass_pm10&quot;, \u00a0\u00a0\u00a0\u00a0&quot;number_pm0.5&quot;, \u00a0\u00a0\u00a0\u00a0&quot;number_pm1.0&quot;, \u00a0\u00a0\u00a0\u00a0&quot;number_pm2.5&quot;, \u00a0\u00a0\u00a0\u00a0&quot;number_pm4.0&quot;, \u00a0\u00a0\u00a0\u00a0&quot;number_pm10&quot;, \u00a0\u00a0\u00a0\u00a0&quot;typical_size&quot;, \u00a0\u00a0\u00a0\u00a0CAST (&quot;sensor_time&quot; AS datetime) &quot;sensor_time&quot; INTO \u00a0\u00a0\u00a0\u00a0&quot;AQS-PowerBI&quot; FROM \u00a0\u00a0\u00a0\u00a0IoT <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 Power Bi, \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0432\u043e\u0439\u0442\u0438 \u0432 \u0441\u0432\u043e\u0451 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0447\u0451\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u044f <code>Stream Analytics<\/code>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1b3\/21f\/e28\/1b321fe2898f5a5c60b74232195c669d.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/font><\/i><\/p>\n<h2><font color=\"#3AC1EF\">\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432<\/font><\/h2>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b29\/454\/e15\/b29454e150695ef9c52534dc80eff0e8.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432<\/font><\/i><\/p>\n<h2><font color=\"#3AC1EF\">\u041a\u043e\u0434<\/font><\/h2>\n<p>  \u0412\u043e\u0442 \u043a\u043e\u0434 Rust-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 Python-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u0430.<\/p>\n<pre><code class=\"python\">use linux_embedded_hal::{Delay, I2cdev}; use sps30_i2c::Sps30;  fn main() { \u00a0\u00a0\u00a0\u00a0let dev = I2cdev::new(&quot;\/dev\/i2c-1&quot;).unwrap(); \u00a0\u00a0\u00a0\u00a0let delay = Delay; \u00a0\u00a0\u00a0\u00a0let mut sensor = Sps30::new_sps30(dev, delay);  \u00a0\u00a0\u00a0\u00a0let result = sensor.read_measured_values().unwrap();  \u00a0\u00a0\u00a0\u00a0println!(&quot;{}&quot;, result.mass_pm1_0); \u00a0\u00a0\u00a0\u00a0println!(&quot;{}&quot;, result.mass_pm2_5); \u00a0\u00a0\u00a0\u00a0println!(&quot;{}&quot;, result.mass_pm4_0); \u00a0\u00a0\u00a0\u00a0println!(&quot;{}&quot;, result.mass_pm10);  \u00a0\u00a0\u00a0\u00a0println!(&quot;{}&quot;, result.number_pm0_5); \u00a0\u00a0\u00a0\u00a0println!(&quot;{}&quot;, result.number_pm1_0); \u00a0\u00a0\u00a0\u00a0println!(&quot;{}&quot;, result.number_pm2_5); \u00a0\u00a0\u00a0\u00a0println!(&quot;{}&quot;, result.number_pm4_0); \u00a0\u00a0\u00a0\u00a0println!(&quot;{}&quot;, result.number_pm10);  \u00a0\u00a0\u00a0\u00a0println!(&quot;{}&quot;, result.typical_size); } <\/code><\/pre>\n<p>  \u0412\u043e\u0442 Python-\u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u043d\u0430 Rust, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0432 Microsoft Azure.<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python3.8  import os import asyncio from azure.iot.device.aio import IoTHubDeviceClient from azure.iot.device import Message import time import subprocess  async def main(): \u00a0\u00a0# \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043a IoT-\u0445\u0430\u0431\u0443 \u00a0\u00a0conn_str = &quot;TODO&quot; \u00a0\u00a0device_client = IoTHubDeviceClient.create_from_connection_string(conn_str) \u00a0\u00a0await device_client.connect()  \u00a0\u00a0while True: \u00a0\u00a0\u00a0\u00a0# \u0427\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u00a0\u00a0\u00a0\u00a0cmd = ['sensor-read\/target\/release\/sensor-read'] \u00a0\u00a0\u00a0\u00a0process = subprocess.Popen(cmd, stdout=subprocess.PIPE)  \u00a0\u00a0\u00a0\u00a0results = [] \u00a0\u00a0\u00a0\u00a0for line in process.stdout: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0results.append(float(line))  \u00a0\u00a0\u00a0\u00a0# \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u00a0\u00a0\u00a0\u00a0msg = Message('{\\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;mass_pm1.0&quot;: %f,\\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;mass_pm2.5&quot;: %f,\\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;mass_pm4.0&quot;: %f,\\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;mass_pm10&quot;: %f,\\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;number_pm0.5&quot;: %f,\\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;number_pm1.0&quot;: %f,\\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;number_pm2.5&quot;: %f,\\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;number_pm4.0&quot;: %f,\\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;number_pm10&quot;: %f,\\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;typical_size&quot;: %f,\\ \u00a0\u00a0\u00a0\u00a0}' % tuple(results)) \u00a0\u00a0\u00a0\u00a0await device_client.send_message(msg)  \u00a0\u00a0\u00a0\u00a0time.sleep(15)  if __name__ == &quot;__main__&quot;: \u00a0\u00a0asyncio.run(main()) <\/code><\/pre>\n<p>  \u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430, \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043d\u0430 \u0442\u0443, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0448\u043b\u0430 \u0440\u0435\u0447\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435?<\/p>\n<p>  <a href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=perevod&amp;utm_content=monitoring_kachestva_vozduxa_s_ispolzovaniem_raspberry_pi_4__datchika_sensirion_sps30_i_microsoft_azure#order\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ou\/g5\/kh\/oug5kh6sjydt9llengsiebnp40w.png\"><\/a><\/p>\n<p>  <a href=\"http:\/\/ruvds.com\/ru-rub\/news\/read\/123?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=perevod&amp;utm_content=monitoring_kachestva_vozduxa_s_ispolzovaniem_raspberry_pi_4__datchika_sensirion_sps30_i_microsoft_azure\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/3p\/iw\/1j\/3piw1j3wd_cgmzq9sefgferaumu.png\"><\/div>\n<p><\/a><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/527234\/\"> https:\/\/habr.com\/ru\/company\/ruvds\/blog\/527234\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0412 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435, \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0451\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u0442\u0447\u0438\u043a \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 Sensirion Particulate Matter Sensor SPS30 \u043a Raspberry Pi 4, \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 Microsoft Azure, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u0432\u0438\u0434\u0435.<\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/527234\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pe\/jm\/me\/pejmmejj-gqniil1-9vkqwq15p0.png\"><\/a>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-313087","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313087","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=313087"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313087\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=313087"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=313087"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=313087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}