{"id":319091,"date":"2021-03-05T09:00:56","date_gmt":"2021-03-05T09:00:56","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=319091"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=319091","title":{"rendered":"\u041c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u043a\u0430\u0445"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041f\u0440\u043e \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u044e \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0435 \u0440\u0430\u0437 \u0438 \u043d\u0435 \u0434\u0432\u0430, \u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u043d\u0435 \u0441 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0440\u0430\u0437. \u0418 \u0432\u043e\u0442 \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u043c\u043e\u0451 \u0432\u0440\u0435\u043c\u044f. \u0420\u0435\u0448\u0438\u043b \u0441 \u0432\u0430\u043c\u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0435\u0439.&nbsp;<\/p>\n<p><iframe id=\"6041d76a8b25a4d2350c14a4\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/6041d76a8b25a4d2350c14a4\" class=\"embed_video embed__content\" allowfullscreen=\"true\"><\/iframe><\/p>\n<h2>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/h2>\n<p>\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u0430 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u044f? \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432 \u043c\u0438\u0440\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u043e\u0433\u043e\u0434\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0432\u043e\u0434\u043a\u0430\u043c\u0438 \u043f\u043e\u0433\u043e\u0434\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f. \u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439, \u0437\u043d\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \u0432 \u0434\u043e\u043c\u0435 \u0438 \u0441\u043d\u0430\u0440\u0443\u0436\u0438, \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u0442\u043b\u043e\u043c \u0438\u043b\u0438 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0435\u0439, \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u044b\u0439 \u043c\u0438\u043a\u0440\u043e\u043a\u043b\u0438\u043c\u0430\u0442 (\u043f\u043e\u0433\u043e\u0434\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u043a\u0430). \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0438 \u0438 \u0442\u0440\u0435\u043d\u0434\u044b \u043f\u043e\u0433\u043e\u0434\u044b \u043d\u0430 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0430\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0433\u043e\u0434-\u0434\u0432\u0430. \u0422\u043e \u0435\u0441\u0442\u044c, \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0433\u0434\u0435-\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u044b:<\/p>\n<ul>\n<li>\n<p>\u041d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0441\u0435\u0440\u0432\u0435\u0440)<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0449\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0439 (IoT)<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0435, \u0445\u043e\u0442\u044f \u0431\u044b \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u043a\u043e<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f<\/p>\n<\/li>\n<\/ul>\n<h2>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h2>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dc7\/cc4\/9f7\/dc7cc49f73a190d4e8499b4ee0bad03d.png\" width=\"700\" height=\"525\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Arduino, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c \u0441 \u0435\u0433\u043e \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0435\u0442\u044c\u044e &#8212; \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0432\u0430\u0439\u0441\u044b\\\u0448\u0438\u043b\u0434\u044b, \u043b\u0438\u0448\u043d\u0438\u0435 \u0434\u0435\u043d\u044c\u0433\u0438 \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 &#8212; \u0432\u0440\u0435\u043c\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043f\u0440\u043e\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0443\u0436\u0435 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c Wi-Fi, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 ESP8266 (NodeMCU) \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u0430\u043c\u0438. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043e\u043c\u0430, \u0438 \u0437\u0430 \u043e\u043a\u043d\u043e\u043c. \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.&nbsp;<\/p>\n<p>\u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0446\u0435\u043d\u0442\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0443\u0447\u0448\u0435 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043c\u043e\u0449\u043d\u0435\u0435? \u0411\u043b\u0430\u0433\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u044b\u043b\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u0434\u0435\u043b\u0430 Raspberry Pi \u043f\u0435\u0440\u0432\u043e\u0439 \u0440\u0435\u0432\u0438\u0437\u0438\u0438 (\u043d\u043e \u0438 \u043b\u044e\u0431\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442). \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0447\u0435\u0440\u0435\u0437 GPIO \u0438 \u043a \u043c\u0430\u043b\u0438\u043d\u043a\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u0440\u043e\u0443\u0442\u0435\u0440 \u0441 \u043c\u0430\u043b\u0438\u043d\u043a\u043e\u0439 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u0440\u0443\u0433\u0443\u044e. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u0442 &#8212; \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 NodeMCU \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f. \u041c\u0430\u043b\u0438\u043d\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u0445 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c. \u0422\u0430\u043a \u0436\u0435 \u043a GPIO Raspberry Pi \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c LoRa &#8212; \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0445 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 Wi-Fi \u0441\u0435\u0442\u0438 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 (\u0438 \u0432\u043e\u0442 \u043e\u043d\u0438 Arduino). \u041d\u0443, \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u0430\u043b\u0438\u043d\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0431\u043b\u0430\u043a\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7fc\/649\/196\/7fc649196caeca18c9933bb34b0956c7.jpg\" width=\"932\" height=\"704\"><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>Raspberry PI<\/p>\n<\/li>\n<li>\n<p>ESP8266 (2\u0448\u0442. + 1\u0448\u0442. \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>BME280 (2 \u0448\u0442.)<\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 DS1302 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>OLED-\u0434\u0438\u0441\u043f\u043b\u0435\u0439 128\u044564 \u043d\u0430 SH1106 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e) <\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a \u0434\u043e\u0436\u0434\u044f \u043d\u0430 \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u0435 LM373 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0423\u0424-\u0434\u0430\u0442\u0447\u0438\u043a  GY-VEML6070 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>Raspberry Pi Camera (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>Arduino Nano (2 \u0448\u0442., \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>SX1278 (3 \u0448\u0442., \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0433\u043d\u0438\u0442\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0430\u0441 \u0441 \u0447\u0438\u043f\u043e\u043c QMC5883L\/HMC5883L (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a \u043e\u0441\u0432\u0435\u0449\u0451\u043d\u043d\u043e\u0441\u0442\u0438 (\u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043d\u044b\u0439) \u0441 \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u043e\u043c LM737 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a\u0438 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u0434\u043e 25V (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a\u0438 \u0442\u043e\u043a\u0430 ACS712 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 SX1278 \u043a Raspberry Pi<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043a \u043c\u0430\u043b\u0438\u043d\u043a\u0435 \u0440\u0430\u0434\u0438\u043e\u043c\u043e\u0434\u0443\u043b\u044c.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\"><strong>Raspberry Pi<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>SX1278<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">3.3V<\/p>\n<\/td>\n<td>\n<p align=\"center\">3.3V<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GROUND<\/p>\n<\/td>\n<td>\n<p align=\"center\">GROUND<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO10<\/p>\n<\/td>\n<td>\n<p align=\"center\">MOSI<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO9<\/p>\n<\/td>\n<td>\n<p align=\"center\">MISO<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO11<\/p>\n<\/td>\n<td>\n<p align=\"center\">SCK<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO8<\/p>\n<\/td>\n<td>\n<p align=\"center\">NSS\/ENABLE<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO4<\/p>\n<\/td>\n<td>\n<p align=\"center\">DIO0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO22<\/p>\n<\/td>\n<td>\n<p align=\"center\">RST<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043f\u0438\u043d\u044b Raspberry Pi \u0438 SX1278 \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c47\/b91\/8eb\/c47b918eb3a6cbaa0445168336654c00.jpg\" width=\"921\" height=\"1527\"><figcaption><\/figcaption><\/figure>\n<blockquote>\n<p>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 Raspberry Pi \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0438\u043d\u043e\u0432, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0440\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0438, \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <a href=\"https:\/\/www.raspberrypi.org\/documentation\/usage\/gpio\/\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>.<\/p>\n<\/blockquote>\n<p>\u041f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f LoRa-\u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0445\u043e\u0447\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043f\u043e\u0434\u0430\u0447\u0435\u0439 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044c LoRa \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043a \u043d\u0435\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0430\u043d\u0442\u0435\u043d\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a, \u0447\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u0433\u043e\u0440\u0438\u0442!<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u043e\u043c\u0438\u043c\u043e \u0430\u043d\u0442\u0435\u043d\u043d\u044b \u0432\u043b\u0438\u044f\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0432\u0435\u0441\u044c\u043c\u0430 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438, \u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0431\u044b\u043b \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043d \u043e\u0442 \u0448\u0443\u043c\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0445 \u0440\u0430\u0434\u0438\u043e\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u043e\u043a)<\/p>\n<\/li>\n<\/ul>\n<h2>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h2>\n<p>\u041d\u0430 Raspberry Pi \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c <a href=\"https:\/\/downloads.raspberrypi.org\/raspios_lite_armhf\/images\/\" rel=\"noopener noreferrer nofollow\">Raspberry Pi OS Lite<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a57\/926\/e43\/a57926e4368358a2bcdf1663f0259dbe.png\" width=\"910\" height=\"361\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043c\u0430\u043b\u0438\u043d\u043a\u0438:<\/p>\n<pre><code class=\"bash\">sudo nano \/etc\/dhcpcd.conf<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\\\u043f\u0440\u0430\u0432\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430 \u043d\u0430\u0448 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 IP \u0438 IP \u043d\u0430\u0448 \u0440\u043e\u0443\u0442\u0435\u0440<\/p>\n<pre><code>interface&nbsp;eth0&nbsp;# \u0438\u043b\u0438 wlan0 \u0435\u0441\u043b\u0438 \u043c\u0430\u043b\u0438\u043d\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u043e Wi-Fi static&nbsp;ip_address=192.168.0.4\/24&nbsp; static&nbsp;routers=192.168.0.1&nbsp; static&nbsp;domain_name_servers=192.168.0.1. 8.8.8.8<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0447\u0435\u0440\u0435\u0437 SSH, SPI (\u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f LoRa), \u0430 \u0442\u0430\u043a \u0436\u0435 Camera, \u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<pre><code>sudo raspi-config<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d0b\/3cb\/4fb\/d0b3cb4fb1f0952630cd0662ec5d6621.png\" width=\"640\" height=\"360\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f34\/dff\/36d\/f34dff36dda80efda1f914a32b9b8953.png\" width=\"640\" height=\"360\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>SSH (\u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e SSH, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443)<\/p>\n<\/li>\n<li>\n<p>SPI (\u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c LoRa)<\/p>\n<\/li>\n<li>\n<p>Camera (\u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443)<\/p>\n<\/li>\n<\/ul>\n<p>\u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0430\u0432\u0442\u043e\u043b\u043e\u0433\u0438\u043d \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435:<\/p>\n<pre><code>Boot Options -&gt; Console Autologin<\/code><\/pre>\n<p>\u0412\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 raspi-config, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c:<\/p>\n<pre><code class=\"bash\">sudo shutdown -r now<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0430\u043b\u0438\u043d\u043a\u0435, \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 ssh \u0438\u043b\u0438 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443.<\/p>\n<p>&nbsp;\u0412\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 Python3, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e:<\/p>\n<pre><code class=\"bash\">sudo apt-get install python3.7<\/code><\/pre>\n<p>&nbsp;\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 H.O.M.E.:<\/p>\n<pre><code class=\"bash\">cd ~ git clone https:\/\/github.com\/wwakabobik\/home.git&nbsp;<\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u044f \u0432\u044b\u0431\u0440\u0430\u043b flask, \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f <a href=\"https:\/\/habr.com\/ru\/post\/346306\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u0445 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u0438\u043c.<\/p>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c:<\/p>\n<pre><code class=\"bash\">mkdir web-server cp -r home\/home_server\/* \/home\/pi\/web-server\/<\/code><\/pre>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"bash\">cd web-server sudo python3.7 -m pip install&nbsp;-r&nbsp;requirements.txt<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430:<\/p>\n<pre><code class=\"bash\">cat db\/schema.sql | sqlite3 flask_db<\/code><\/pre>\n<p>&nbsp;\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0451, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440:<\/p>\n<pre><code class=\"bash\">cd \/home\/pi\/web-server &amp;&amp; sudo python3.7 app.py<\/code><\/pre>\n<p>\u041d\u043e \u043c\u044b \u0436\u0435 \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 Raspberry Pi?<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 <em>\/etc\/rc.local<\/em>, \u043f\u0435\u0440\u0435\u0434 <em>exit 0<\/em>, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u044b\u0437\u043e\u0432 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<pre><code class=\"bash\">\/home\/pi\/flask_startup.sh &amp;<\/code><\/pre>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e:<\/p>\n<pre><code>cd ~ cp ~\/home\/bash\/flask_startup.sh .<\/code><\/pre>\n<p>\u042f \u0442\u0430\u043a \u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0438\u043c\u0435\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0436\u0438\u0432 \u043b\u0438 \u0435\u0449\u0451 \u0441\u0435\u0440\u0432\u0435\u0440, \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d \u043c\u0451\u0440\u0442\u0432, \u0442\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0435\u0433\u043e. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438 \u0435\u0433\u043e.<\/p>\n<pre><code>cp ~\/home\/bash\/check_health.sh .<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a cron:<\/p>\n<pre><code class=\"bash\">sudo crontab -e<\/code><\/pre>\n<p>\u0437\u0430\u0434\u0430\u043d\u0438\u0435:<\/p>\n<pre><code>1-59\/5 * * * * \/home\/pi\/check_health.sh<\/code><\/pre>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0441\u043e\u0444\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h2>\n<p>\u0417\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 <em>app.py<\/em>.<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python3.7  from multiprocessing.pool import ThreadPool  from flask import Flask  from db.db import init_app from lora_receiver import run_lora   app = Flask(__name__, template_folder='templates')  # firstly, start Flask  # import all routes import routes.api import routes.pages import routes.single_page   if __name__ == '__main__':     # Start LoRa receiver as subprocess     pool = ThreadPool(processes=1)     pool.apply_async(run_lora)     # Start Flask server     init_app(app)     app.run(debug=True, host='0.0.0.0', port='80')     # Teardown     pool.terminate()     pool.join() <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c LoRa \u0440\u0435\u0441\u0438\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/095\/c1b\/e23\/095c1be23d48ff8ba75a670c4d31bac9.png\" width=\"664\" height=\"1046\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u0430 \u0434\u043b\u044f flask\u2019a: \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 routes \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 pages, \u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0432 templates. \u041b\u043e\u0433\u0438\u043a\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0435\u0436\u0438\u0442 \u0432 db, \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438) \u0432 static, \u043d\u0443 \u0430 \u0432 camera \u0431\u0443\u0434\u0435\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ae9\/f6a\/85b\/ae9f6a85b6f21b81126f1e85d53eaee9.png\" width=\"2312\" height=\"1190\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 dashboard \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445,&nbsp;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f7\/b9a\/bd2\/7f7b9abd212eb26ea1bfdd3aa9250019.png\" width=\"2748\" height=\"1320\"><figcaption><\/figcaption><\/figure>\n<p>\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 (\u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0440\u0438\u0441\u0443\u0435\u0442 <strong>plotly<\/strong>).<\/p>\n<h2>\u0421\u043e\u0444\u0442 LoRa-\u0440\u0435\u0441\u0438\u0432\u0435\u0440\u0430<\/h2>\n<p><em>home_server\/lora_receiver.py<\/em><\/p>\n<pre><code class=\"python\">from time import sleep  import requests from SX127x.LoRa import * from SX127x.board_config import BOARD   endpoint = \"http:\/\/0.0.0.0:80\/api\/v1\"   class LoRaRcvCont(LoRa):     def __init__(self, verbose=False):         super(LoRaRcvCont, self).__init__(verbose)         self.set_mode(MODE.SLEEP)         self.set_dio_mapping([0] * 6)      def start(self):         self.reset_ptr_rx()         self.set_mode(MODE.RXCONT)         while True:             sleep(.5)             rssi_value = self.get_rssi_value()             status = self.get_modem_status()             sys.stdout.flush()      def on_rx_done(self):         self.clear_irq_flags(RxDone=1)         payload = self.read_payload(nocheck=True)         formatted_payload = bytes(payload).decode(\"utf-8\", 'ignore')         status = self.send_to_home(formatted_payload)         if status:             sleep(1)  # we got the data, force sleep for a while to skip repeats         self.set_mode(MODE.SLEEP)         self.reset_ptr_rx()         self.set_mode(MODE.RXCONT)      def send_to_home(self, payload):         if str(payload[:2]) == '0,':             requests.post(url=f'{endpoint}\/add_wind_data', json={'data': payload})         elif str(payload[:2]) == '1,':             requests.post(url=f'{endpoint}\/add_power_data', json={'data': payload})         else:             print(\"Garbage collected, ignoring\")  # debug             status = 1         return status   def run_lora():     BOARD.setup()     lora = LoRaRcvCont(verbose=False)     lora.set_mode(MODE.STDBY)     # Medium Range  Defaults after init are 434.0MHz, Bw = 125 kHz, Cr = 4\/5, Sf = 128chips\/symbol, CRC on 13 dBm     lora.set_pa_config(pa_select=1)     assert (lora.get_agc_auto_on() == 1)      try:         lora.start()     finally:         lora.set_mode(MODE.SLEEP)         BOARD.teardown() <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0438 on_rx_done &#8212; \u0435\u0441\u043b\u0438 \u043f\u0430\u043a\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d, \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432 send_to_home \u0447\u0442\u043e payload[:2] \u0440\u0430\u0432\u0435\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 (\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u00ab0,\u00bb \u0438 \u00ab1,\u00bb), \u0442\u043e \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043f\u0438\u043c \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b.\u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b.<\/p>\n<h2>API<\/h2>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 99% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u041d\u043e \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 1% \u043e\u043d \u043e\u0442\u0434\u0430\u0451\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u0437\u0430 \u044d\u0442\u043e, \u043f\u043e\u043c\u0438\u043c\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 API.&nbsp;<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Flask REST API \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432.<\/p>\n<p><em>home_server\/routes\/api.py<\/em><\/p>\n<pre><code class=\"python\">@app.route('\/api\/v1\/send_data') def send_weather_data():     return send_data()   @app.route('\/api\/v1\/add_weather_data', methods=['POST']) def store_weather_data():     if not request.json:         abort(400)     timestamp = str(datetime.now())     unix_timestamp = int(time())     data = request.json.get('data', \"\")     db_data = f'\"{timestamp}\", {unix_timestamp}, {data}'     store_weather_data(db_data)     return jsonify({'data': db_data}), 201  <\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 \u043b\u043e\u0433:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fd6\/425\/44a\/fd642544a1100afa194f24f3d58792b5.png\" width=\"1190\" height=\"326\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 (\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 POST \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0432\u0435\u0440\u043d\u044b\u043c JSON), \u0442\u043e \u043c\u044b \u0438\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0411\u0414. \u0422\u0430\u043a \u0436\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 GET \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 (send_data), \u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043e\u0431\u043b\u0430\u043a\u043e.<\/p>\n<p><em>home_server\/pages\/weather_station\/send_data.py<\/em><\/p>\n<pre><code class=\"python\">def send_data():     data = get_last_measurement_pack('0', '1')     image = take_photo()     wu_data = prepare_wu_format(data=data)     response = str(send_data_to_wu(wu_data))     response += str(send_data_to_pwsw(wu_data))     response += str(send_data_to_ow(data))     response += str(send_data_to_nardmon(data))     send_image_to_wu(image)     copyfile(image, f'{getcwd()}\/camera\/image.jpg')     return response<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/459\/08c\/889\/45908c889dd50050a8ae7f07f1208472.png\" width=\"600\" height=\"600\"><figcaption><\/figcaption><\/figure>\n<p>\u0410\u0445 \u0434\u0430, \u0437\u0430\u0431\u044b\u043b \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u043a\u0430\u043c\u0435\u0440\u0443 \u043a Raspberry Pi, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0433\u043e\u0434\u044b \u0437\u0430 \u043e\u043a\u043d\u043e\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<p><em>home_server\/pages\/shared\/tools.py<\/em><\/p>\n<pre><code class=\"python\">from picamera import PiCamera  &lt;...&gt; camera = PiCamera() &lt;...&gt;  def take_photo(): &nbsp; &nbsp; camera.resolution = (1280, 720)&nbsp; # lower resolution to fit in limits &nbsp; &nbsp; camera.start_preview() &nbsp; &nbsp; sleep(5) &nbsp; &nbsp; image = f'{getcwd()}\/camera\/image_{int(time())}.jpg' &nbsp; &nbsp; camera.capture(image) &nbsp; &nbsp; camera.stop_preview() &nbsp; &nbsp; return image   <\/code><\/pre>\n<h2>\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043a\u0438<\/h2>\n<blockquote>\n<p>\u043f\u043e\u043b\u043d\u044b\u0435 \u0441\u043a\u0435\u0442\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 home\/iot<\/p>\n<\/blockquote>\n<figure class=\"float bordered\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e5c\/225\/ccd\/e5c225ccd0dda8391dcdeb6308590ddd.jpg\" width=\"300\" height=\"300\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0430\u043c\u044b\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0434\u043b\u044f \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c BME280, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 \u0442\u0435\u0440\u043c\u043e\u043c\u0435\u0442\u0440, \u0434\u0430\u0442\u0447\u0438\u043a \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e I2C \u043a ESP8266:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4f4\/d98\/e01\/4f4d98e01296f9f9761407b2742c820e.jpg\" width=\"597\" height=\"744\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0448\u0438\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0447\u0435\u0440\u0435\u0437 Arduino IDE (\u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c ESP8266 &nbsp; \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/371853\/\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>).<\/p>\n<p>iot\/esp8266\/weather<em>station<\/em>_in\/weather<em>station<\/em>_in.ino<\/p>\n<pre><code class=\"cpp\">#include &lt;ESP8266WiFi.h&gt; #include &lt;ESP8266HTTPClient.h&gt; #include &lt;Wire.h&gt; #include &lt;SPI.h&gt; #include &lt;Adafruit_BME280.h&gt; #include &lt;Arduino_JSON.h&gt;  Adafruit_BME280 bme; \/\/ use I2C interface Adafruit_Sensor *bme_temp = bme.getTemperatureSensor(); Adafruit_Sensor *bme_pressure = bme.getPressureSensor(); Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();  \/\/ \u0414\u0430\u0442\u0447\u0438\u043a \u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u0447\u0435\u043d\u044c \u0442\u043e\u0447\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f float correction_temperature = -0.5;&nbsp; float correction_pressure = 15; float correction_humidity = 10;&nbsp;  \/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c Wifi void connect_to_WiFi() { &nbsp;&nbsp; WiFi.mode(WIFI_STA); &nbsp;&nbsp; WiFi.begin(wifi_ssid, wifi_password); &nbsp;&nbsp; while (WiFi.status() != WL_CONNECTED) &nbsp;&nbsp; { &nbsp; &nbsp; &nbsp; delay(500); &nbsp;&nbsp; } &nbsp;&nbsp; Serial.println(\"WiFi connected\"); &nbsp;&nbsp; Serial.print(\"IP address: \"); &nbsp;&nbsp; Serial.println(WiFi.localIP()); &nbsp;&nbsp; #endif  }  \/* &lt;\u2026&gt; *\/  \/\/ \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432  float get_temperature() { &nbsp; &nbsp; sensors_event_t temp_event, pressure_event, humidity_event; &nbsp; &nbsp; bme_temp-&gt;getEvent(&amp;temp_event); &nbsp; &nbsp; return temp_event.temperature + correction_temperature;  }  \/* &lt;\u2026&gt; *\/  \/\/ \u0442\u0430\u043a\u0436\u0435 \u0442\u043e\u0447\u043a\u0443 \u0440\u043e\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0434\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e: float get_dew_point()  { &nbsp; &nbsp; float dew_point; &nbsp; &nbsp; float temp = get_temperature(); &nbsp; &nbsp; float humi = get_humidity(); &nbsp; &nbsp; dew_point =&nbsp; (temp - (14.55 + 0.114 * temp) * (1 - (0.01 * humi)) - pow(((2.5 + 0.007 * temp) * (1 - (0.01 * humi))),3) - (15.9 + 0.117 * temp) * pow((1 - (0.01 * humi)), 14)); &nbsp; &nbsp; return dew_point; }  \/* &lt;\u2026&gt; *\/  \/\/ \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u0432 \u0441\u0442\u0440\u043e\u043a\u0443&nbsp; String get_csv_data() { &nbsp; &nbsp; String ret_string = DEVICE_ID; &nbsp; &nbsp; ret_string += delimiter + String(get_temperature()); &nbsp; &nbsp; ret_string += delimiter + String(get_humidity()); &nbsp; &nbsp; ret_string += delimiter + String(get_pressure()); &nbsp; &nbsp; ret_string += delimiter + String(get_dew_point()); &nbsp; &nbsp; return ret_string;&nbsp; }  \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0435\u0440\u0435\u0437 HTTP, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 JSON: void post_data() { &nbsp; &nbsp; check_connection(); &nbsp; &nbsp; HTTPClient http;&nbsp; &nbsp; \/\/Declare object of class HTTPClient &nbsp; &nbsp; String content = get_csv_data(); &nbsp; &nbsp; int http_code = 404; &nbsp; &nbsp; int retries = 0; &nbsp; &nbsp; while (http_code != 201) &nbsp; &nbsp; { &nbsp; &nbsp; &nbsp; &nbsp; http.begin(api_url); \/\/ connect to request destination &nbsp; &nbsp; &nbsp; &nbsp; http.addHeader(\"Content-Type\", \"application\/json\");&nbsp; &nbsp; &nbsp; &nbsp; \/\/ set content-type header &nbsp; &nbsp; &nbsp; &nbsp; http_code = http.POST(\"{\\\"data\\\": \\\"\" + content +\"\\\"}\"); &nbsp; \/\/ send the request &nbsp; &nbsp; &nbsp; &nbsp; http.end();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ close connection &nbsp; &nbsp; &nbsp; &nbsp; retries++; &nbsp; &nbsp; &nbsp; &nbsp; if (retries &gt; max_retries) &nbsp; &nbsp; &nbsp; &nbsp; {           \tSerial.println(\"Package lost!\"); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; } }  \/\/ c\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438: void loop() { &nbsp; &nbsp; post_data(); &nbsp; &nbsp; delay(cooldown); } <\/code><\/pre>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432 5 \u043c\u0438\u043d\u0443\u0442, \u0438 \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e DEVICE_ID = &#171;0&#187; \u2013 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0434\u0430\u0442\u0447\u0438\u043a, \u0430 DEVICE_ID = &#171;1&#187; \u2013 \u0432\u043d\u0435\u0448\u043d\u0438\u0439.<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e5e\/f53\/ea0\/e5ef53ea0e1e316d61381248c5696693.png\" alt=\"\u0414\u0430\u0442\u0447\u0438\u043a \u0434\u043e\u0436\u0434\u044f LM393+YL83\" title=\"\u0414\u0430\u0442\u0447\u0438\u043a \u0434\u043e\u0436\u0434\u044f LM393+YL83\" width=\"500\" height=\"398\"><figcaption>\u0414\u0430\u0442\u0447\u0438\u043a \u0434\u043e\u0436\u0434\u044f LM393+YL83<\/figcaption><\/figure>\n<p>\u041a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u0434\u0430\u0442\u0447\u0438\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u0443\u043b\u044c\u0442\u0440\u0430\u0444\u0438\u043e\u043b\u0435\u0442\u0430 (<br \/> GY-VEML6070) \u0438 \u0434\u0430\u0442\u0447\u0438\u043a \u0434\u043e\u0436\u0434\u044f (\u043d\u0430 \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u0435 LM393). YL-83 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f \u043e\u0441\u0430\u0434\u043a\u043e\u0432, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0431\u0435\u0437 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438, \u043d\u043e, \u043d\u0430 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044e \u043e\u0441\u0430\u0434\u043a\u0430\u043c \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442. \u041d\u0443, \u0442\u043e\u0447\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 &#171;\u043d\u0430 \u0443\u043b\u0438\u0446\u0435 \u0434\u043e\u0436\u0434\u044c&#187; \u0438\u043b\u0438 &#171;\u0441\u0443\u0445\u043e&#187;. \u0422\u0430\u043a \u0436\u0435, \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0439 \u0434\u0430\u0442\u0447\u0438\u043a \u0443\u043b\u044c\u0442\u0440\u0430\u0444\u0438\u043e\u043b\u0435\u0442\u0430 GY-8511, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c \u0438 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u043c \u0434\u043e\u0436\u0434\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u0439 \u0432\u0445\u043e\u0434 \u043d\u0430 NodeMCU \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d. \u0414\u0430\u0442\u0447\u0438\u043a \u0443\u043b\u044c\u0442\u0440\u0430\u0444\u0438\u043e\u043b\u0435\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u0445 \u043f\u0430\u043d\u0435\u043b\u0435\u0439. \u041d\u0443 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043b\u043d\u0446\u0435\u0437\u0430\u0449\u0438\u0442\u043d\u044b\u043c \u043a\u0440\u0435\u043c\u043e\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043a\u043e\u0441\u0430 \u0433\u0430\u0437\u043e\u043d\u0430.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a ESP8266 \u043d\u0438\u0436\u0435: <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6ba\/8fd\/74c\/6ba8fd74cb192be5fb273419ae05c7a0.jpg\" width=\"1401\" height=\"849\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p>iot\/esp8266\/weather<em>station<\/em>_out\/weather<em>station<\/em>_out.ino<\/p>\n<pre><code class=\"cpp\">#include \"Adafruit_VEML6070.h\"  Adafruit_VEML6070 uv = Adafruit_VEML6070(); #define VEML6070_ADDR_L &nbsp; &nbsp; (0x38) \/\/\/&lt; Low address RAIN_SENSOR_PIN = A0;  \/* &lt;...&gt; *\/  #ifdef UV_ANALOG_SENSOR void get_uv_level() {     int uv_level = averageAnalogRead(UV_PIN);     float uv_intensity = mapfloat(uv_level, 0.99, 2.8, 0.0, 15.0);     return uv_intensity; } #endif  #ifdef UV_I2C_SENSOR void get_uv_level() { \t\treturn uv.readUV(); } #endif  #ifdef RAIN_SENSOR void get_rain_level() {     int rain_level = averageAnalogRead(RAIN_SENSOR_PIN);     return rain_level; } #endif <\/code><\/pre>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"686\" width=\"686\">\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>NodeMCU \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 Wi-Fi \u0432 \u0437\u043e\u043d\u0435 \u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u0434\u043b\u044f \u043f\u043e\u0433\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u043d\u0430 \u043a\u0440\u044b\u043b\u044c\u0446\u0435 &#8212; \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f, \u043d\u043e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430, \u043e\u0442\u043d\u0435\u0441\u0451\u043d\u043d\u0430\u044f \u043f\u0430\u0440\u0443-\u0442\u0440\u043e\u0439\u043a\u0443 \u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u0442 \u0434\u043e\u043c\u0430 &#8212; \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0432 \u0434\u043e\u043c\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0437\u0430 \u0433\u043b\u0430\u0437\u0430. <\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u0433\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u043d\u0446\u0438\u0438<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0434 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0435\u043c\u043b\u0438 (\u0442\u0440\u0430\u0432\u0430, \u0433\u0440\u0443\u043d\u0442). \u0410\u0441\u0444\u0430\u043b\u044c\u0442\u0430, \u0431\u0435\u0442\u043e\u043d\u0430, \u0449\u0435\u0431\u043d\u044f, \u043a\u0430\u043c\u043d\u044f, \u043c\u0435\u0442\u0430\u043b\u043b\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 2 \u043c \u043d\u0430\u0434 \u0437\u0435\u043c\u043b\u0451\u0439 \u0432 \u043c\u0435\u0442\u0435\u043e\u0440\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0443\u0434\u043a\u0435: \u044d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u0435\u0440\u0435\u0432\u044f\u043d\u043d\u044b\u0439 \u0438\u043b\u0438 \u043f\u043b\u0430\u0441\u0442\u0438\u043a\u043e\u0432\u044b\u0439 \u044f\u0449\u0438\u043a (\u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e 40\u044540\u044540 \u0441\u043c) \u0441 \u0431\u0435\u043b\u044b\u043c\u0438, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u0432\u0435\u0442 \u043f\u0435\u0440\u0444\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043b\u0438 \u0436\u0430\u043b\u044e\u0437\u0438\u0439\u043d\u044b\u043c\u0438 \u0441\u0442\u0435\u043d\u043a\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u043b\u043d\u0446\u0435\u0432\u043e\u0434\u043e\u0437\u0430\u0449\u0438\u0442\u043d\u044b\u043c \u043a\u043e\u0437\u044b\u0440\u044c\u043a\u043e\u043c (\u043a\u0440\u044b\u0448\u043a\u0430 \u0431\u0443\u0434\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0433\u0435\u0440\u043c\u0435\u0442\u0438\u0447\u043d\u043e\u0439 \u0438 \u0438\u043c\u0435\u0442\u044c \u043d\u0430\u043a\u043b\u043e\u043d \u0434\u043b\u044f \u0441\u0442\u0435\u043a\u0430\u043d\u0438\u044f \u043e\u0441\u0430\u0434\u043a\u043e\u0432 \u0441 \u0431\u0443\u0434\u043a\u0438).<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a \u0432\u0435\u0442\u0440\u0430 &#8212; \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 10-12 \u043c \u043d\u0430\u0434 \u0437\u0435\u043c\u043b\u0451\u0439 (\u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u0434 \u0437\u0435\u043c\u043b\u0451\u0439, \u0430 \u043d\u0435 \u043d\u0430 \u043a\u0440\u044b\u0448\u0430\u0445 \u0437\u0434\u0430\u043d\u0438\u0439; \u0432 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u0447\u0442\u0438\u043a\u0430 \u0432\u0435\u0442\u0440\u0430 \u043d\u0430 \u043a\u0440\u044b\u0448\u0435 \u043e\u0434\u043d\u043e\u044d\u0442\u0430\u0436\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0430, \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u0447\u0438\u043a \u0432\u043e\u0437\u0432\u044b\u0448\u0430\u043b\u0441\u044f \u043d\u0430\u0434 \u0432\u0435\u0440\u0445\u043d\u0438\u043c \u043a\u0440\u0430\u0435\u043c \u043a\u0440\u044b\u0448\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 2-3 \u043c, \u0430 \u043d\u0430\u0434 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0435\u043c\u043b\u0438 \u043d\u0430 10-12 \u043c).<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0435\u043b\u0438\u043a \u0440\u0438\u0441\u043a \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0435\u0439, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u043d\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f) \u0434\u0430\u0442\u0447\u0438\u043a \u0422 \u0438 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0441 \u0442\u0435\u043d\u0435\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0437\u0434\u0430\u043d\u0438\u044f, \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 2 \u043c \u043d\u0430\u0434 \u0437\u0435\u043c\u043b\u0451\u0439, \u043d\u0430 \u0448\u0442\u0430\u043d\u0433\u0435 \u0434\u043b\u0438\u043d\u043e\u0439 \u043e\u0442 \u0441\u0442\u0435\u043d\u044b \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043c\u0435\u0442\u0440\u0430 3 , \u043d\u0430\u0434 \u0433\u0430\u0437\u043e\u043d\u043e\u043c (\u043d\u0435 \u043d\u0430\u0434 \u0430\u0441\u0444\u0430\u043b\u044c\u0442\u043e\u043c!). \u041d\u0438 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u0431\u043b\u0438\u0437\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u0433\u0440\u0435\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0440\u044b\u0448, \u0441\u0442\u0435\u043d \u0438 \u0442.\u043f.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u043d\u043e\u0433\u043e \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u0432\u0434\u0430\u043b\u0438 \u043e\u0442 \u043e\u043a\u043e\u043d \u0438 \u043e\u0442\u043e\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u0431\u043e\u0440\u043e\u0432. \u0410\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u043d\u043e\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u044b\u0441\u043e\u0442\u044b \u043d\u0430\u0434 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043c\u043e\u0440\u044f \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0430 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u0414\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0440\u0438\u0431\u043e\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u043c\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0431\u0430\u0440\u043e\u043c\u0435\u0442\u0440\u0430 \u0438\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0438 (\u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0441\u043e\u0442, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043f\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0442\u043e\u043f\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u0435; 10 \u043c \u043f\u043e\u0434\u044a\u0451\u043c\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044e \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 1 \u043c\u043c \u0440\u0442.\u0441\u0442. \u0438\u043b\u0438 1.3 \u0433\u041f\u0430 (\u043c\u0411)).<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u041a\u0430\u043a \u043e\u043f\u0446\u0438\u044f, \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430 ESP8266, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0438. \u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u0443\u0434\u043e\u0431\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c\u0443 \u0434\u0430\u0442\u0447\u0438\u043a\u0443, \u0430 \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0451 \u0434\u0435\u043b\u0430\u043b\u043e &#8212; \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043d\u0435\u043c\u0443 \u0447\u0430\u0441\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/604\/743\/085\/60474308539c7557d9e57fb3646ceab0.jpg\" width=\"696\" height=\"873\"><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u0442\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u043a\u0435\u0442\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f (\u0427\u0427:\u041c\u041c) \u0438 \u0432 \u0431\u0435\u0433\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0438:<\/p>\n<p><em>iot\/informer\/esp8266\/informer\/informer.ino<\/em><\/p>\n<pre><code class=\"cpp\">#include &lt;ESP8266WiFi.h&gt; #include &lt;ESP8266HTTPClient.h&gt; #include &lt;Wire.h&gt; #include &lt;U8g2lib.h&gt; #include &lt;virtuabotixRTC.h&gt;  \/\/ https:\/\/ampermarket.kz\/files\/rtc_virtualbotix.zip   \/\/ RTC virtuabotixRTC myRTC(14, 12, 13);   \/\/ OLED U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); u8g2_uint_t offset;            \/\/ current offset for the scrolling text u8g2_uint_t width;             \/\/ pixel width of the scrolling text (must be lesser than 128 unless U8G2_16BIT is defined const int string_length = 80;  \/\/ maximum count of symbols in marquee char text[string_length];      \/\/ text buffer to scroll  \/\/ Wi-Fi const char* wifi_ssid = \"YOUR_SSID\"; const char* wifi_password = \"YOUR_PASSWORD\";  \/\/ API const String ip_address = \"YOUR_IP_OF_SERVER\"; const String port = \"YOUR_PORT\"; const String api_endpoint = \"\/api\/v1\/add_weather_data\"; const String api_url = \"http:\/\/\" + ip_address + \":\" + port + api_endpoint; const int max_retries = 5;  \/\/ number of retries to send packet  \/\/ Timers and delays const long data_retrieve_delay = 300000; const int cycle_delay = 5; unsigned long last_measurement = 0;   void setup(void)  {     Serial.begin(9600);     init_OLED();     init_RTC(); }   \/* Init functions *\/ void init_OLED() {     u8g2.begin();       u8g2.setFont(u8g2_font_inb30_mr); \/\/ set the target font to calculate the pixel width     u8g2.setFontMode(0);              \/\/ enable transparent mode, which is faster }   void init_RTC() {     \/\/ seconds, minutes, hours, day of the week, day of the month, month, year     \/\/ \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u0440\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0435, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0430\u0442\u0443 \u0438 \u0432\u0440\u0435\u043c\u044f, \u0437\u0430\u0442\u0435\u043c \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0438 \u043f\u0440\u043e\u0448\u0435\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437     \/\/myRTC.setDS1302Time(30, 03, 22, 5, 19, 2, 2021); \/\/ set RTC time     myRTC.updateTime(); \/\/ update of variables for time or accessing the individual elements. }   \"\"\" &lt;...&gt; \"\"\"     String get_data() {     check_connection();      #ifdef DEBUG     Serial.println(\"Obtaining data from server\");     #endif     HTTPClient http;    \/\/Declare object of class HTTPClient        int http_code = 404;     int retries = 0;     String payload = \"Data retrieve error\";     while (http_code != 200)     {         http.begin(api_url);                \/\/ connect to request destination         http_code = http.GET();             \/\/ send the request         String answer = http.getString();   \/\/ get response payload         http.end();                         \/\/ close connection              retries++;         if (retries &gt; max_retries)         {             break;             #ifdef DEBUG             Serial.println(\"Couldn't get the data!\");             #endif         }                          if (http_code == 200)         {             payload = answer;         }     }     return payload; }   void loop(void)  {     \/\/ Check that new data is needed to be retrieved from server     if (((millis() - last_measurement) &gt; data_retrieve_delay) or last_measurement == 0)     {         String stext = get_data();         stext.toCharArray(text, string_length);         last_measurement = millis();         width = u8g2.getUTF8Width(text);    \/\/ calculate the pixel width of the text         offset = 0;     }      \/\/ Update RTC     myRTC.updateTime();       \/\/ Now update OLED     u8g2_uint_t x;     u8g2.firstPage();     do      {         \/\/ draw the scrolling text at current offset         x = offset;         u8g2.setFont(u8g2_font_inb16_mr);       \/\/ set the target font         do          {                                       \/\/ repeated drawing of the scrolling text...             u8g2.drawUTF8(x, 58, text);         \/\/ draw the scrolling text             x += width;                         \/\/ add the pixel width of the scrolling text         } while (x &lt; u8g2.getDisplayWidth());   \/\/ draw again until the complete display is filled              u8g2.setFont(u8g2_font_inb30_mr);       \/\/ choose big font for clock         u8g2.setCursor(0, 30);                  \/\/ set position of clock         char buf[8];                            \/\/ init bufer to formatted string         sprintf_P(buf, PSTR(\"%02d:%02d\"), myRTC.hours, myRTC.minutes); \/\/ format clock with leading zeros         u8g2.print(buf);                        \/\/ display clock     } while (u8g2.nextPage());        offset-=2;                       \/\/ scroll by two pixels     if ((u8g2_uint_t)offset &lt; ((u8g2_uint_t) - width))     {           offset = 0;                  \/\/ start over again     }       delay(cycle_delay);              \/\/ do some small delay } <\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5ac\/70e\/5f9\/5ac70e5f92c3765eab674b49e8c3cf4a.jpg\" width=\"1222\" height=\"968\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 Raspberry Pi:<\/p>\n<p><em>home_server\/routes\/api.py<\/em><\/p>\n<pre><code class=\"python\">@app.route('\/api\/v1\/get_weather_data', methods=['GET']) def store_wind_data():     return send_data_to_informer()   <\/code><\/pre>\n<p><em>pages\/weather_station\/send.data<\/em><\/p>\n<pre><code class=\"python\">def send_data_to_informer():     data_in = get_last_measurement_pack('weather_data', '0', '0')     data_out = get_last_measurement_pack('weather_data', '0', '1')     pressure = int((data_in['pressure']+data_out['pressure'])\/2)     formatted_string = f\"IN: T={data_in['temperature']}*C, \" \\                        f\"H={data_in['humidity']}% | \" \\                        f\"OUT: T={data_out['temperature']}*C, \" \\                        f\"H={data_out['humidity']}%, \" \\                        f\"DP={data_out['dew_point']}*C | \" \\                        f\"P={pressure} mmhg\"     return formatted_string <\/code><\/pre>\n<h2>\u0420\u0430\u0434\u0438\u043e\u0434\u0430\u0442\u0447\u0438\u043a\u0438<\/h2>\n<p>\u0422\u0430\u043c, \u0433\u0434\u0435 \u043d\u0435 \u0434\u043e\u0442\u044f\u043d\u0443\u0442\u044c\u0441\u044f Wi-Fi, \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 LoRa-\u043c\u043e\u0434\u0443\u043b\u0435\u0439 (\u0432 \u0441\u0432\u044f\u0437\u043a\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 Arduino Nano. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cdd\/cc3\/68c\/cddcc368cc1453224755c024f60e0e9b.jpg\" width=\"800\" height=\"800\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0430\u043a\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0443 \u043c\u0435\u043d\u044f \u0434\u0432\u0430 &#8212; \u044d\u0442\u043e \u0434\u0430\u0442\u0447\u0438\u043a \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0442\u0440\u0430 (\u043a\u043e\u043c\u043f\u0430\u0441). \u041f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 &#8212; \u043d\u0430\u043f\u0438\u0448\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0412\u0442\u043e\u0440\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e &#8212; \u044d\u0442\u043e \u0432\u043e\u043b\u044c\u0442\u043c\u0435\u0442\u0440 \u0438 \u0434\u0432\u0430 \u0430\u043c\u043f\u0435\u0440\u043c\u0435\u0442\u0440\u0430, \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0435\u0442\u0440\u044f\u043a\u0430, \u0437\u0430\u0440\u044f\u0434\u043a\u0438 \u0410\u041a\u0411 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/37d\/f9f\/b72\/37df9fb7261829448165045297217b95.jpg\" width=\"2049\" height=\"849\"><figcaption><\/figcaption><\/figure>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"350\" width=\"350\">\n<p align=\"center\"><strong>SX1278<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>Arduino Nano<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"350\" width=\"350\">\n<p align=\"center\">3.3V<\/p>\n<\/td>\n<td>\n<p align=\"center\">3.3V<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"350\" width=\"350\">\n<p align=\"center\">GROUND<\/p>\n<\/td>\n<td>\n<p align=\"center\">GROUND<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"350\" width=\"350\">\n<p align=\"center\">MOSI<\/p>\n<\/td>\n<td>\n<p align=\"center\">D10<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"350\" width=\"350\">\n<p align=\"center\">MISO<\/p>\n<\/td>\n<td>\n<p align=\"center\">D2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"350\" width=\"350\">\n<p align=\"center\">SCK<\/p>\n<\/td>\n<td>\n<p align=\"center\">D13<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"350\" width=\"350\">\n<p align=\"center\">NSS\/ENABLE<\/p>\n<\/td>\n<td>\n<p align=\"center\">D12<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"350\" width=\"350\">\n<p align=\"center\">DIO0<\/p>\n<\/td>\n<td>\n<p align=\"center\">D11<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"350\" width=\"350\">\n<p align=\"center\">RST<\/p>\n<\/td>\n<td>\n<p align=\"center\">D9<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0418, \u043a\u043e\u0434, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e:<\/p>\n<p>iot\/arduino\/*<em>_meter\/*<\/em>_meter.ino<\/p>\n<pre><code class=\"cpp\">\/\/ Required includes #include &lt;SPI.h&gt; #include &lt;LoRa.h&gt;  \/\/ LoRA config const int LORA_SEND_RETRIES = 5; \/\/ \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 const int LORA_SEND_DELAY = 20;  \/\/ \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 const int LORA_POWER = 20;       \/\/ \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c  const int LORA_RETRIES = 12;     \/\/ \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c const int LORA_DELAY = 500;      \/\/ \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438   \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c void init_LoRa()  {     bool success = false;     for (int i=0; i &lt; LORA_RETRIES; i++)          {         if (LoRa.begin(433E6)) \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c 433\u041c\u0433\u0446         {             success = true;             break;         }         delay(LORA_DELAY);     }     if (!success)     {         #ifdef DEBUG         Serial.println(\"LoRa init failed.\");         #endif         stop(4);     }          LoRa.setTxPower(LORA_POWER);  \/\/ aplify TX power     #ifdef DEBUG     Serial.println(\"LoRa started!\");     #endif   } #endif  \/\/ \u041f\u043e\u0441\u044b\u043b\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 void LoRa_send(power_data data) {     String packet = DEVICE_ID + \",\" + String(data.avg_voltage,2) + \",\";     packet += String(data.avg_current,2) + \",\" + String(data.avg_power,2) + \",\" +String(data.avg_consumption,2);     for (int i=0; i &lt; LORA_SEND_RETRIES; i++)     {         LoRa.beginPacket();  \/\/ just open packet         LoRa.print(packet);  \/\/ send whole data         LoRa.endPacket();    \/\/ end packet         delay(LORA_SEND_DELAY);     }   } <\/code><\/pre>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0435 \u043f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438?<\/p>\n<h2>\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b<\/h2>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u0446\u0435\u043b\u0438 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438, \u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043c\u044b\u0441\u043b\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043c\u0435\u0441\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0439, \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0432\u043e\u0435\u0439. \u041f\u0435\u0440\u0432\u044b\u043c, \u0438 \u0441 \u0441\u0430\u043c\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0435\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 API \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c <a href=\"https:\/\/www.wunderground.com\/\" rel=\"noopener noreferrer nofollow\">WeatherUnderground<\/a>. <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ce1\/0ed\/cc3\/ce10edcc3e94823db0197b25dc6fe5f1.png\" width=\"357\" height=\"280\"><figcaption><\/figcaption><\/figure>\n<pre><code class=\"python\">from wunderground_pws import WUndergroundAPI, units  from secure_data import wu_api_key, wu_reference_station_id  \"\"\" ... \"\"\"  wu_current = wu.current()  \"\"\" ... \"\"\"  wu_humidity=wu_current['observations'][0]['humidity'], wu_pressure=int(int(wu_current['observations'][0]['metric_si']['pressure'])\/1.33), wu_dew_point=wu_current['observations'][0]['metric_si']['dewpt'], wu_wind_speed=wu_current['observations'][0]['metric_si']['windSpeed'], wu_wind_gust=wu_current['observations'][0]['metric_si']['windGust'], wu_wind_direction=wu_current['observations'][0]['winddir'], wu_wind_heading=deg_to_heading(int(wu_current['observations'][0]['winddir'])) <\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438\u043c\u0438 \u043d\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u044f? \u0414\u0430\u043d\u043d\u044b\u0435 \u0432 WU \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 GET-\u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<pre><code class=\"python\">def prepare_wu_format(data, timestamp=None):     payload = f\"&amp;dateutc={timestamp}\" if timestamp else \"&amp;dateutc=now\"     payload += \"&amp;action=updateraw\"     payload += \"&amp;humidity=\" + \"{0:.2f}\".format(data['humidity'])     payload += \"&amp;tempf=\" + str(celsius_to_fahrenheit(data['temperature']))     payload += \"&amp;baromin=\" + str(mmhg_to_baromin(data['pressure']))     payload += \"&amp;dewptf=\" + str(celsius_to_fahrenheit(data['dew_point']))     payload += \"&amp;heatindex=\" + str(celsius_to_fahrenheit(heat_index(temp=data['temperature'], hum=data['humidity'])))     payload += \"&amp;humidex=\" + str(celsius_to_fahrenheit(humidex(t=data['temperature'], d=data['dew_point'])))     payload += \"&amp;precip=\" + str(data['precip'])     payload += \"&amp;uv\" + str(data['uv'])     return payload<\/code><\/pre>\n<p>\u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c:<\/p>\n<pre><code class=\"python\">import requests  \"\"\" ... \"\"\"  def send_data_to_wu(data):     wu_url = \"https:\/\/weatherstation.wunderground.com\/weatherstation\/updateweatherstation.php?\"     wu_creds = \"ID=\" + wu_station_id + \"&amp;PASSWORD=\" + wu_station_pwd     response = requests.get(f'{wu_url}{wu_creds}{data}')     return response.content<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a05\/48e\/ca0\/a0548eca0577f05c61e68ec320841d12.png\" width=\"1274\" height=\"942\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0443\u0442 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u043c\u0430\u0440\u043a\u0443, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f WU \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f API \u043a\u043b\u044e\u0447\u0435\u0439. \u0412\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 <em>secure_data.py<\/em><\/p>\n<pre><code class=\"python\"># Geo Data latitude = longitude = altitude = cur_location =  # WEATHER UNDERGROUND DATA wu_api_key = wu_station_id = wu_station_pwd = wu_reference_station_id =  # OPEN WEATHER DATA ow_api_key = ow_station_id =  # PWSWEATHER DATA pwsw_station_id = pwsw_api_key =  # NARODMON DATA narodmon_name =  narodmon_owner =  narodmon_mac =  narodmon_api_key = <\/code><\/pre>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \ud83d\ude42<\/p>\n<p>WeatherUnderground \u0443\u0432\u044b, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u0439 \u043a\u043b\u044e\u0447 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0433\u043e\u0434. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043f\u043e\u0438\u0441\u043a\u0430\u0432 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b, \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 <a href=\"https:\/\/www.pwsweather.com\/\" rel=\"noopener noreferrer nofollow\">PWS Weather<\/a>. <\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bd8\/7f0\/4a6\/bd87f04a69eba1153403506b0fb4866a.png\" width=\"512\" height=\"512\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043d\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API \u0434\u043b\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 (\u043d\u0435 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0439), \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043e\u0445\u043e\u0442\u043d\u043e \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u044e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u0437\u0430 \u043e\u0434\u043d\u0443 \u043d\u043e\u0447\u044c \u0438 \u0431\u0435\u0437 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u0438 \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0431\u043b\u0430\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0430\u0439\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0438 WU.<\/p>\n<pre><code class=\"python\">def send_data_to_pwsw(data):     pwsw_url = \"http:\/\/www.pwsweather.com\/pwsupdate\/pwsupdate.php?\"     pwsw_creds = \"ID=\" + pwsw_station_id + \"&amp;PASSWORD=\" + pwsw_api_key     response = requests.get(f'{pwsw_url}{pwsw_creds}{data}')     return response.content<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u044b\u043c, \u0432 \u043d\u0451\u043c \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0441 \u0438\u043c\u043f\u0435\u0440\u0441\u043a\u043e\u0439 \u043d\u0430 \u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u041f\u043b\u044e\u0441 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u044b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5d3\/f57\/c13\/5d3f57c1345f256bc3d7c088629936b7.png\" width=\"1798\" height=\"806\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/201\/16e\/e03\/20116ee03537e8d148d75d2756e457c0.png\" width=\"2676\" height=\"1312\"><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 <a href=\"https:\/\/openweathermap.org\/\" rel=\"noopener noreferrer nofollow\">OpenWeatherMap<\/a>. \u041f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0442\u0443\u0442 \u043d\u0435\u0442, \u0430 \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c &#171;\u0441\u0440\u0435\u0434\u043d\u0438\u0435&#187; \u043f\u043e \u0431\u043e\u043b\u044c\u043d\u0438\u0446\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442? \u042d\u043d\u0442\u0443\u0437\u0438\u0430\u0441\u0442\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c. \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u0443 OWM \u0434\u043b\u044f PWS (personal weather station) \u0441\u0432\u043e\u0451 <a href=\"https:\/\/openweathermap.org\/stations\" rel=\"noopener noreferrer nofollow\">API<\/a>, \u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u044f \u043d\u0435 \u043d\u0430\u0448\u0451\u043b \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0430 python, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <a href=\"https:\/\/pypi.org\/project\/openweather-pws\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u044e<\/a>. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/099\/d83\/b32\/099d83b32a32b50ede3cb9d0a5bb42f1.jpg\" width=\"600\" height=\"340\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0445 WeatherUnderground \u0438 PWS Weather, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0438\u043c\u043f\u0435\u0440\u0441\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0440\u0430\u0437\u0440\u0430\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 OpenWeatherMap \u0438\u0437 \u041b\u0430\u0442\u0432\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 (\u0421\u0438), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u0434\u043b\u044f \u043d\u0438\u0445 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b, \u0430 \u043f\u0438\u0448\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0440\u0430\u0437\u0443 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<pre><code class=\"python\">from openweather_pws import Station  def send_data_to_ow(data):     pws = Station(api_key=ow_api_key, station_id=ow_station_id)     response = pws.measurements.set(temperature=data['temperature'], humidity=data['humidity'],                                     dew_point=data['dew_point'], pressure=data['pressure'],                                     heat_index=fahrenheit_to_celsius(heat_index(temp=data['temperature'],                                                                                 hum=data['humidity'])),                                     humidex=humidex(t=data['temperature'], d=data['dew_point']))     return response<\/code><\/pre>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043a\u0430\u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <s>\u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0437\u0430\u043c\u0435\u0449\u0435\u043d\u0438\u044f<\/s> \u0441\u0430\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0435 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u043c\u0430) &#8212; <a href=\"https:\/\/narodmon.ru\/?invite=ilya877\" rel=\"noopener noreferrer nofollow\">Narodmon<\/a>. <\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8b4\/3fc\/1fc\/8b43fc1fccf98e54ca141749373abaa6.png\" width=\"816\" height=\"814\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u0433\u0430\u0442\u043e\u0435 API, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432, \u043d\u043e \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u0438, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0430\u043c\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e, \u0442\u0430\u043a \u0438 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u0448\u043a\u0438 \u0432\u0440\u043e\u0434\u0435 &#171;\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043b\u0430\u0439\u043a&#187; \u0438\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u041e\u0441\u043e\u0431\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u043e, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0448\u043b\u0451\u0442 email&#8217;\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u0442\u0447\u0438\u043a \u043d\u0435 \u0432\u044b\u0448\u0435\u043b \u043d\u0430 \u0441\u0432\u044f\u0437\u044c \u0447\u0430\u0441), \u0442\u0430\u043a \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 &#171;\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b&#187; \u0432\u0440\u043e\u0434\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043b\u0438\u043c\u0438\u0442\u0430 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0434\u0430\u0442\u0447\u0438\u043a\u0435. \u041d\u043e, \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 OWM \u044f \u043d\u0435 \u043d\u0430\u0448\u0451\u043b \u043f\u043e\u043b\u043d\u043e\u0433\u043e API-wrapper \u0434\u043b\u044f python, \u0438 \u043e\u043f\u044f\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/pypi.org\/project\/narodmon-python-api\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0432\u043e\u0439<\/a>. \u0422\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432, \u0437\u043e\u0432\u0451\u043c:<\/p>\n<pre><code class=\"python\">def send_data_to_nardmon(data):     nm = Narodmon(mac=narodmon_mac, name=narodmon_name, owner=narodmon_owner,                   lat=latitude, lon=longitude, alt=altitude)     temperature = nm.via_json.prepare_sensor_data(id_in=\"TEMPC\", value=data['temperature'])     pressure = nm.via_json.prepare_sensor_data(id_in=\"MMHG\", value=(data['pressure']))     humidity = nm.via_json.prepare_sensor_data(id_in=\"HUM\", value=data['humidity'])     dew_point = nm.via_json.prepare_sensor_data(id_in=\"DEW\", value=data['dew_point'])     sensors = [temperature, pressure, humidity, dew_point]     response = nm.via_json.send_short_data(sensors=sensors)     return response<\/code><\/pre>\n<p>\u0423 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 <s>\u0434\u0443\u0440\u0430\u0446\u043a\u0430\u044f<\/s> \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0430\u0449\u0435 \u0447\u0435\u043c \u0440\u0430\u0437 \u0432 \u043f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442. \u041d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0442\u043e \u043b\u0438 \u0443 \u043d\u0430\u0441 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442, \u0442\u043e \u043b\u0438 \u0441\u0430\u0439\u0442 \u043f\u043e\u0434\u0432\u0438\u0441\u0430\u0435\u0442, \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 10-15 \u043c\u0438\u043d\u0443\u0442. \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a35\/620\/eee\/a35620eee3f08a4c48177c20541fdccd.png\" width=\"638\" height=\"584\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 &#171;\u0434\u0451\u0440\u0433\u0430\u0442\u044c&#187; \u0440\u0443\u0447\u043a\u0443 <em>\/api\/v1\/send_data<\/em> \u043f\u0443\u0441\u0442\u044b\u043c GET-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0440\u0443\u0447\u0438\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c cron. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"bash\">*\/5 * * * * \/usr\/bin\/wget -O - -q -t 1 http:\/\/0.0.0.0:80\/api\/v1\/send_data<\/code><\/pre>\n<h2>\u0410 \u043a\u0430\u043a \u0436\u0435 \u043a\u0430\u043c\u0435\u0440\u0430?<\/h2>\n<p>\u041f\u043e\u043a\u0430 \u043d\u0438\u043a\u0430\u043a. \u0421\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0444\u043e\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 WeatherUnderground. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 ftp<\/p>\n<pre><code class=\"python\">from ftplib import FTP  def send_image_to_wu(image):     session = FTP('webcam.wunderground.com', wu_cam_id, wu_cam_pwd)     file = open(image, 'rb')     session.storbinary('image.jpg', file)     file.close()     session.quit()<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 WU \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0438 \u0440\u0430\u0437\u0443. \u0421\u0443\u0434\u044f \u043f\u043e \u0444\u043e\u0440\u0443\u043c\u0430\u043c \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438, \u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0438\u0447\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043b\u043e\u0445\u043e \u0438 \u0441\u0431\u043e\u0438\u0442.<\/p>\n<p>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 narodmon.ru, <\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u0440\u0430\u0437 \u0432 \u043f\u043e\u043b\u0447\u0430\u0441\u0430) \u0434\u0451\u0440\u0433\u0430\u0435\u043c \u0440\u0443\u0447\u043a\u0443 \/api\/v1\/capture_<em>photo (\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u043e\u0432\u0451\u0442 take_photo<\/em>). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0443\u0434\u0435\u043c \u0437\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 cron \u044d\u0442\u043e\u0442 bash-\u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash  PATH_TO_PHOTO=`\/usr\/bin\/wget -O - -q -t 1 http:\/\/0.0.0.0\/api\/v1\/capture_photo` REQUEST='curl -F YOUR_CAM_KEY=@'$PATH_TO_PHOTO' http:\/\/narodmon.ru\/post' RESULT=`$REQUEST` &gt;\/dev\/null 2&gt;&amp;1 <\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043d\u0438\u043c\u043e\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3e7\/9c4\/c3f\/3e79c4c3f01e083dc8989c3802813c94.png\" width=\"1250\" height=\"958\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043b\u044e\u0441, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043c\u044c \u0434\u043d\u0435\u0439) \u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"bash\">#!\/bin\/bash bash  # Notes: # This file will remove all files in camera folder older than 7 days, just run in via cron periodically (i.e. daily). find \/home\/pi\/web-server\/camera\/ -type f -mtime +7 -name '*.jpg' -execdir rm -- '{}' \\;<\/code><\/pre>\n<h2>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?<\/h2>\n<p>\u0412 \u043f\u043b\u0430\u043d\u0430\u0445 \u0434\u043e\u0432\u0435\u0441\u0442\u0438 \u0441\u0442\u0430\u043d\u0446\u0438\u044e \u0434\u043e \u0443\u043c\u0430, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u0435\u043e\u0431\u0443\u0434\u043a\u0443, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0439\u0434\u0451\u0442 \u0441\u043d\u0435\u0433, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0434\u0430\u0442\u0447\u0438\u043a \u0432\u0435\u0442\u0440\u0430 \u043f\u043e \u0432\u0435\u0441\u043d\u0435 \u043d\u0430 \u043d\u0443\u0436\u043d\u0443\u044e \u0432\u044b\u0441\u043e\u0442\u0443. \u0418\u0437 \u0441\u043e\u0444\u0442\u0430 \u044f\u0432\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0451 \u0434\u043e\u043f\u0438\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430. \u041d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0431\u043e\u0440\u0430\u043c\u0438 (\u0431\u0430\u043b\u043b\u0430\u0441\u0442 \u043d\u0430 \u0432\u0435\u0442\u0440\u044f\u043a\u0435, \u043e\u0442\u043e\u043f\u043b\u0435\u043d\u0438\u0435).<\/p>\n<blockquote>\n<p>\u041f\u0440\u0435\u0434\u0432\u043e\u0441\u0445\u0438\u0449\u0430\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0432 \u0434\u0443\u0445\u0435 &#171;\u0430 \u0433\u0434\u0435 \u0436\u0435 \u043a\u043e\u0440\u043f\u0443\u0441\u0430? \u043e\u043f\u044f\u0442\u044c \u043a\u043e\u043b\u0445\u043e\u0437&#187;. \u041a\u0430\u044e\u0441\u044c, \u043f\u043e\u043a\u0430 \u043d\u0438\u0447\u0435\u0433\u043e &#171;\u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e&#187; \u043d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0436\u0434\u0443 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0439\u0434\u0443\u0442 \u043c\u043e\u0440\u043e\u0437\u044b, \u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043d\u0443\u043b\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0439\u0442\u0438 \u0432 \u043c\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0443\u044e \u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u043a\u0443, \u043a\u043e\u0440\u043f\u0443\u0441\u0430 \u0438 \u043f\u0440\u043e\u0447\u0430\u044f.<\/p>\n<\/blockquote>\n<\/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\/post\/543146\/\"> https:\/\/habr.com\/ru\/post\/543146\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u041f\u0440\u043e \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u044e \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0435 \u0440\u0430\u0437 \u0438 \u043d\u0435 \u0434\u0432\u0430, \u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u043d\u0435 \u0441 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0440\u0430\u0437. \u0418 \u0432\u043e\u0442 \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u043c\u043e\u0451 \u0432\u0440\u0435\u043c\u044f. \u0420\u0435\u0448\u0438\u043b \u0441 \u0432\u0430\u043c\u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0435\u0439.&nbsp;<\/p>\n<p><iframe id=\"6041d76a8b25a4d2350c14a4\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/6041d76a8b25a4d2350c14a4\" class=\"embed_video embed__content\" allowfullscreen=\"true\"><\/iframe><\/p>\n<h2>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/h2>\n<p>\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u0430 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u044f? \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432 \u043c\u0438\u0440\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u043e\u0433\u043e\u0434\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0432\u043e\u0434\u043a\u0430\u043c\u0438 \u043f\u043e\u0433\u043e\u0434\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f. \u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439, \u0437\u043d\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \u0432 \u0434\u043e\u043c\u0435 \u0438 \u0441\u043d\u0430\u0440\u0443\u0436\u0438, \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u0442\u043b\u043e\u043c \u0438\u043b\u0438 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0435\u0439, \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u044b\u0439 \u043c\u0438\u043a\u0440\u043e\u043a\u043b\u0438\u043c\u0430\u0442 (\u043f\u043e\u0433\u043e\u0434\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u043a\u0430). \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0438 \u0438 \u0442\u0440\u0435\u043d\u0434\u044b \u043f\u043e\u0433\u043e\u0434\u044b \u043d\u0430 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0430\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0433\u043e\u0434-\u0434\u0432\u0430. \u0422\u043e \u0435\u0441\u0442\u044c, \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0433\u0434\u0435-\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u044b:<\/p>\n<ul>\n<li>\n<p>\u041d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0441\u0435\u0440\u0432\u0435\u0440)<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0449\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0439 (IoT)<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0435, \u0445\u043e\u0442\u044f \u0431\u044b \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u043a\u043e<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f<\/p>\n<\/li>\n<\/ul>\n<h2>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h2>\n<figure class=\"float full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Arduino, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c \u0441 \u0435\u0433\u043e \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0441\u0435\u0442\u044c\u044e &#8212; \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0432\u0430\u0439\u0441\u044b\\\u0448\u0438\u043b\u0434\u044b, \u043b\u0438\u0448\u043d\u0438\u0435 \u0434\u0435\u043d\u044c\u0433\u0438 \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 &#8212; \u0432\u0440\u0435\u043c\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043f\u0440\u043e\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0443\u0436\u0435 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c Wi-Fi, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 ESP8266 (NodeMCU) \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u0430\u043c\u0438. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043e\u043c\u0430, \u0438 \u0437\u0430 \u043e\u043a\u043d\u043e\u043c. \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.&nbsp;<\/p>\n<p>\u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0446\u0435\u043d\u0442\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0443\u0447\u0448\u0435 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043c\u043e\u0449\u043d\u0435\u0435? \u0411\u043b\u0430\u0433\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u044b\u043b\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u0434\u0435\u043b\u0430 Raspberry Pi \u043f\u0435\u0440\u0432\u043e\u0439 \u0440\u0435\u0432\u0438\u0437\u0438\u0438 (\u043d\u043e \u0438 \u043b\u044e\u0431\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442). \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0447\u0435\u0440\u0435\u0437 GPIO \u0438 \u043a \u043c\u0430\u043b\u0438\u043d\u043a\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u0440\u043e\u0443\u0442\u0435\u0440 \u0441 \u043c\u0430\u043b\u0438\u043d\u043a\u043e\u0439 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u0440\u0443\u0433\u0443\u044e. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u0442 &#8212; \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 NodeMCU \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f. \u041c\u0430\u043b\u0438\u043d\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u0445 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c. \u0422\u0430\u043a \u0436\u0435 \u043a GPIO Raspberry Pi \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c LoRa &#8212; \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0445 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 Wi-Fi \u0441\u0435\u0442\u0438 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 (\u0438 \u0432\u043e\u0442 \u043e\u043d\u0438 Arduino). \u041d\u0443, \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u0430\u043b\u0438\u043d\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0431\u043b\u0430\u043a\u043e.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>Raspberry PI<\/p>\n<\/li>\n<li>\n<p>ESP8266 (2\u0448\u0442. + 1\u0448\u0442. \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>BME280 (2 \u0448\u0442.)<\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 DS1302 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>OLED-\u0434\u0438\u0441\u043f\u043b\u0435\u0439 128\u044564 \u043d\u0430 SH1106 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e) <\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a \u0434\u043e\u0436\u0434\u044f \u043d\u0430 \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u0435 LM373 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0423\u0424-\u0434\u0430\u0442\u0447\u0438\u043a  GY-VEML6070 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>Raspberry Pi Camera (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>Arduino Nano (2 \u0448\u0442., \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>SX1278 (3 \u0448\u0442., \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0433\u043d\u0438\u0442\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0430\u0441 \u0441 \u0447\u0438\u043f\u043e\u043c QMC5883L\/HMC5883L (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a \u043e\u0441\u0432\u0435\u0449\u0451\u043d\u043d\u043e\u0441\u0442\u0438 (\u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043d\u044b\u0439) \u0441 \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u043e\u043c LM737 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a\u0438 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u0434\u043e 25V (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u0447\u0438\u043a\u0438 \u0442\u043e\u043a\u0430 ACS712 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 SX1278 \u043a Raspberry Pi<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043a \u043c\u0430\u043b\u0438\u043d\u043a\u0435 \u0440\u0430\u0434\u0438\u043e\u043c\u043e\u0434\u0443\u043b\u044c.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\"><strong>Raspberry Pi<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>SX1278<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">3.3V<\/p>\n<\/td>\n<td>\n<p align=\"center\">3.3V<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GROUND<\/p>\n<\/td>\n<td>\n<p align=\"center\">GROUND<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO10<\/p>\n<\/td>\n<td>\n<p align=\"center\">MOSI<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO9<\/p>\n<\/td>\n<td>\n<p align=\"center\">MISO<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO11<\/p>\n<\/td>\n<td>\n<p align=\"center\">SCK<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO8<\/p>\n<\/td>\n<td>\n<p align=\"center\">NSS\/ENABLE<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO4<\/p>\n<\/td>\n<td>\n<p align=\"center\">DIO0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">GPIO22<\/p>\n<\/td>\n<td>\n<p align=\"center\">RST<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043f\u0438\u043d\u044b Raspberry Pi \u0438 SX1278 \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<blockquote>\n<p>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 Raspberry Pi \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0438\u043d\u043e\u0432, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0440\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0438, \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <a href=\"https:\/\/www.raspberrypi.org\/documentation\/usage\/gpio\/\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>.<\/p>\n<\/blockquote>\n<p>\u041f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f LoRa-\u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0445\u043e\u0447\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043f\u043e\u0434\u0430\u0447\u0435\u0439 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044c LoRa \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043a \u043d\u0435\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0430\u043d\u0442\u0435\u043d\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a, \u0447\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u0433\u043e\u0440\u0438\u0442!<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u043e\u043c\u0438\u043c\u043e \u0430\u043d\u0442\u0435\u043d\u043d\u044b \u0432\u043b\u0438\u044f\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0432\u0435\u0441\u044c\u043c\u0430 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438, \u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0431\u044b\u043b \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043d \u043e\u0442 \u0448\u0443\u043c\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0445 \u0440\u0430\u0434\u0438\u043e\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u043e\u043a)<\/p>\n<\/li>\n<\/ul>\n<h2>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h2>\n<p>\u041d\u0430 Raspberry Pi \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c <a href=\"https:\/\/downloads.raspberrypi.org\/raspios_lite_armhf\/images\/\" rel=\"noopener noreferrer nofollow\">Raspberry Pi OS Lite<\/a>.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043c\u0430\u043b\u0438\u043d\u043a\u0438:<\/p>\n<pre><code class=\"bash\">sudo nano \/etc\/dhcpcd.conf<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\\\u043f\u0440\u0430\u0432\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430 \u043d\u0430\u0448 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 IP \u0438 IP \u043d\u0430\u0448 \u0440\u043e\u0443\u0442\u0435\u0440<\/p>\n<pre><code>interface&nbsp;eth0&nbsp;# \u0438\u043b\u0438 wlan0 \u0435\u0441\u043b\u0438 \u043c\u0430\u043b\u0438\u043d\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u043e Wi-Fi static&nbsp;ip_address=192.168.0.4\/24&nbsp; static&nbsp;routers=192.168.0.1&nbsp; static&nbsp;domain_name_servers=192.168.0.1. 8.8.8.8<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0447\u0435\u0440\u0435\u0437 SSH, SPI (\u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f LoRa), \u0430 \u0442\u0430\u043a \u0436\u0435 Camera, \u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<pre><code>sudo raspi-config<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>SSH (\u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e SSH, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443)<\/p>\n<\/li>\n<li>\n<p>SPI (\u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c LoRa)<\/p>\n<\/li>\n<li>\n<p>Camera (\u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443)<\/p>\n<\/li>\n<\/ul>\n<p>\u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0430\u0432\u0442\u043e\u043b\u043e\u0433\u0438\u043d \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435:<\/p>\n<pre><code>Boot Options -&gt; Console Autologin<\/code><\/pre>\n<p>\u0412\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 raspi-config, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c:<\/p>\n<pre><code class=\"bash\">sudo shutdown -r now<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0430\u043b\u0438\u043d\u043a\u0435, \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 ssh \u0438\u043b\u0438 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443.<\/p>\n<p>&nbsp;\u0412\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 Python3, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e:<\/p>\n<pre><code class=\"bash\">sudo apt-get install python3.7<\/code><\/pre>\n<p>&nbsp;\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 H.O.M.E.:<\/p>\n<pre><code class=\"bash\">cd ~ git clone https:\/\/github.com\/wwakabobik\/home.git&nbsp;<\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u044f \u0432\u044b\u0431\u0440\u0430\u043b flask, \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f <a href=\"https:\/\/habr.com\/ru\/post\/346306\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u0445 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u0438\u043c.<\/p>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c:<\/p>\n<pre><code class=\"bash\">mkdir web-server cp -r home\/home_server\/* \/home\/pi\/web-server\/<\/code><\/pre>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"bash\">cd web-server sudo python3.7 -m pip install&nbsp;-r&nbsp;requirements.txt<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430:<\/p>\n<pre><code class=\"bash\">cat db\/schema.sql | sqlite3 flask_db<\/code><\/pre>\n<p>&nbsp;\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0451, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440:<\/p>\n<pre><code class=\"bash\">cd \/home\/pi\/web-server &amp;&amp; sudo python3.7 app.py<\/code><\/pre>\n<p>\u041d\u043e \u043c\u044b \u0436\u0435 \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 Raspberry Pi?<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 <em>\/etc\/rc.local<\/em>, \u043f\u0435\u0440\u0435\u0434 <em>exit 0<\/em>, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u044b\u0437\u043e\u0432 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<pre><code class=\"bash\">\/home\/pi\/flask_startup.sh &amp;<\/code><\/pre>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e:<\/p>\n<pre><code>cd ~ cp ~\/home\/bash\/flask_startup.sh .<\/code><\/pre>\n<p>\u042f \u0442\u0430\u043a \u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0438\u043c\u0435\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0436\u0438\u0432 \u043b\u0438 \u0435\u0449\u0451 \u0441\u0435\u0440\u0432\u0435\u0440, \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d \u043c\u0451\u0440\u0442\u0432, \u0442\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0435\u0433\u043e. \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438 \u0435\u0433\u043e.<\/p>\n<pre><code>cp ~\/home\/bash\/check_health.sh .<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a cron:<\/p>\n<pre><code class=\"bash\">sudo crontab -e<\/code><\/pre>\n<p>\u0437\u0430\u0434\u0430\u043d\u0438\u0435:<\/p>\n<pre><code>1-59\/5 * * * * \/home\/pi\/check_health.sh<\/code><\/pre>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0441\u043e\u0444\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h2>\n<p>\u0417\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 <em>app.py<\/em>.<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python3.7  from multiprocessing.pool import ThreadPool  from flask import Flask  from db.db import init_app from lora_receiver import run_lora   app = Flask(__name__, template_folder='templates')  # firstly, start Flask  # import all routes import routes.api import routes.pages import routes.single_page   if __name__ == '__main__':     # Start LoRa receiver as subprocess     pool = ThreadPool(processes=1)     pool.apply_async(run_lora)     # Start Flask server     init_app(app)     app.run(debug=True, host='0.0.0.0', port='80')     # Teardown     pool.terminate()     pool.join() <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c LoRa \u0440\u0435\u0441\u0438\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u0430 \u0434\u043b\u044f flask\u2019a: \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 routes \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 pages, \u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0432 templates. \u041b\u043e\u0433\u0438\u043a\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0435\u0436\u0438\u0442 \u0432 db, \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438) \u0432 static, \u043d\u0443 \u0430 \u0432 camera \u0431\u0443\u0434\u0435\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 dashboard \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445,&nbsp;<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 (\u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0440\u0438\u0441\u0443\u0435\u0442 <strong>plotly<\/strong>).<\/p>\n<h2>\u0421\u043e\u0444\u0442 LoRa-\u0440\u0435\u0441\u0438\u0432\u0435\u0440\u0430<\/h2>\n<p><em>home_server\/lora_receiver.py<\/em><\/p>\n<pre><code class=\"python\">from time import sleep  import requests from SX127x.LoRa import * from SX127x.board_config import BOARD   endpoint = \"http:\/\/0.0.0.0:80\/api\/v1\"   class LoRaRcvCont(LoRa):     def __init__(self, verbose=False):         super(LoRaRcvCont, self).__init__(verbose)         self.set_mode(MODE.SLEEP)         self.set_dio_mapping([0] * 6)      def start(self):         self.reset_ptr_rx()         self.set_mode(MODE.RXCONT)         while True:             sleep(.5)             rssi_value = self.get_rssi_value()             status = self.get_modem_status()             sys.stdout.flush()      def on_rx_done(self):         self.clear_irq_flags(RxDone=1)         payload = self.read_payload(nocheck=True)         formatted_payload = bytes(payload).decode(\"utf-8\", 'ignore')         status = self.send_to_home(formatted_payload)         if status:             sleep(1)  # we got the data, force sleep for a while to skip repeats         self.set_mode(MODE.SLEEP)         self.reset_ptr_rx()         self.set_mode(MODE.RXCONT)      def send_to_home(self, payload):         if str(payload[:2]) == '0,':             requests.post(url=f'{endpoint}\/add_wind_data', json={'data': payload})         elif str(payload[:2]) == '1,':             requests.post(url=f'{endpoint}\/add_power_data', json={'data': payload})         else:             print(\"Garbage collected, ignoring\")  # debug             status = 1         return status   def run_lora():     BOARD.setup()     lora = LoRaRcvCont(verbose=False)     lora.set_mode(MODE.STDBY)     # Medium Range  Defaults after init are 434.0MHz, Bw = 125 kHz, Cr = 4\/5, Sf = 128chips\/symbol, CRC on 13 dBm     lora.set_pa_config(pa_select=1)     assert (lora.get_agc_auto_on() == 1)      try:         lora.start()     finally:         lora.set_mode(MODE.SLEEP)         BOARD.teardown() <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0438 on_rx_done &#8212; \u0435\u0441\u043b\u0438 \u043f\u0430\u043a\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d, \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432 send_to_home \u0447\u0442\u043e payload[:2] \u0440\u0430\u0432\u0435\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 (\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u00ab0,\u00bb \u0438 \u00ab1,\u00bb), \u0442\u043e \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043f\u0438\u043c \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b.\u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b.<\/p>\n<h2>API<\/h2>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 99% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u041d\u043e \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 1% \u043e\u043d \u043e\u0442\u0434\u0430\u0451\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u0437\u0430 \u044d\u0442\u043e, \u043f\u043e\u043c\u0438\u043c\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 API.&nbsp;<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Flask REST API \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u0432.<\/p>\n<p><em>home_server\/routes\/api.py<\/em><\/p>\n<pre><code class=\"python\">@app.route('\/api\/v1\/send_data') def send_weather_data():     return send_data()   @app.route('\/api\/v1\/add_weather_data', methods=['POST']) def store_weather_data():     if not request.json:         abort(400)     timestamp = str(datetime.now())     unix_timestamp = int(time())     data = request.json.get('data', \"\")     db_data = f'\"{timestamp}\", {unix_timestamp}, {data}'     store_weather_data(db_data)     return jsonify({'data': db_data}), 201  <\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 \u043b\u043e\u0433:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 (\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 POST \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0432\u0435\u0440\u043d\u044b\u043c JSON), \u0442\u043e \u043c\u044b<\/p>\n<\/p>\n<\/div>\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-319091","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/319091","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=319091"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/319091\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=319091"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=319091"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=319091"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}