{"id":345499,"date":"2023-02-16T09:03:41","date_gmt":"2023-02-16T09:03:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=345499"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2023-02-16T09:03:41","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=345499","title":{"rendered":"<span>\u0414\u0435\u043b\u0430\u0435\u043c \u0434\u0430\u0442\u0447\u0438\u043a \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0441 Modbus RTU \u043d\u0430 ESP8266 \u0438 Arduino<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a86\/ae9\/62b\/a86ae962b86fefa39033af6ee4881037.png\" width=\"780\" height=\"440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a86\/ae9\/62b\/a86ae962b86fefa39033af6ee4881037.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c<\/h2>\n<p>\u0414\u0430\u0432\u043d\u043e \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0443 \u0441\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u0449\u0438\u043a\u043e\u0432 \u0441\u0435\u043d\u0441\u043e\u0440 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 <a href=\"https:\/\/www.sciosense.com\/wp-content\/uploads\/documents\/SC-001232-DS-3-CCS811B-Datasheet-Revision-2.pdf\" rel=\"noopener noreferrer nofollow\">CCS811<\/a> \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0441 SGP30 \u0438\u043b\u0438 SGPC3. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0435\u043d\u0441\u043e\u0440 TVOC \u0438 \u043d\u043e\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 eCO2 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c \u0443\u0433\u043b\u0435\u043a\u0438\u0441\u043b\u043e\u0433\u043e \u0433\u0430\u0437\u0430.<\/p>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 Wiren Board \u0441 \u0440\u043e\u0434\u043d\u044b\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c Modbus RTU, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043c\u043e\u0451 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443.<\/p>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 Modbus RTU \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043e\u043a.<\/p>\n<p>\u041f\u043e\u0442\u043e\u043c \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0441\u0435\u043d\u0441\u043e\u0440 CCS811 \u0438 \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<p>\u0418 \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 Wiren Board: \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 wb-mqtt-serial \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0437\u044f\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u043a\u0435\u0442\u0447\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430 \u043b\u044e\u0431\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u044e \u043f\u0440\u043e\u0439\u0442\u0438 \u0441\u043e \u043c\u043d\u043e\u0439 \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u043e\u0442 \u0438\u0434\u0435\u0438 \u0434\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430.<\/p>\n<h2>\u0427\u0442\u043e \u0437\u0430 \u0437\u0432\u0435\u0440\u044c Modbus RTU<\/h2>\n<p>Modbus RTU \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u0448\u0438\u043d\u044b RS-485.<\/p>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c, \u0430 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u044f \u2014 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438. \u0415\u0449\u0451 \u0433\u043e\u0434\u0430 \u0434\u0432\u0430 \u043d\u0430\u0437\u0430\u0434 \u043a\u043b\u0438\u0435\u043d\u0442 \u0431\u044b\u043b \u043c\u0430\u0441\u0442\u0435\u0440\u043e\u043c (master), \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043b\u0435\u0439\u0432\u043e\u043c (slave), \u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 <a href=\"https:\/\/www.modbus.org\/docs\/Client-ServerPR-07-2020-final.docx.pdf\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u043c\u0435\u043d\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f<\/a>.<\/p>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0448\u0438\u043d\u044b \u0438 \u043c\u043d\u043e\u0433\u043e modbus-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u044f\u0447\u0435\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0441\u043d\u0430\u0440\u0443\u0436\u0438.<\/p>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u043d\u0438\u0445 \u0441\u0432\u043e\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u043b\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e88\/6a8\/918\/e886a8918e62d1e3182524f1b23e83b3.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u041a\u043b\u0438\u0435\u043d\u0442-\u0421\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Modbus\" title=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u041a\u043b\u0438\u0435\u043d\u0442-\u0421\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Modbus\" width=\"1550\" height=\"500\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e88\/6a8\/918\/e886a8918e62d1e3182524f1b23e83b3.png\"\/><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u041a\u043b\u0438\u0435\u043d\u0442-\u0421\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Modbus<\/figcaption><\/figure>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043d\u0430\u043c \u0442\u0438\u043f\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>Coils (1 \u0431\u0438\u0442, \u0447\u0442\u0435\u043d\u0438\u0435-\u0437\u0430\u043f\u0438\u0441\u044c, 1 \u0438\u043b\u0438 0) \u2014 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0432\u044b\u0445\u043e\u0434, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c.<\/p>\n<\/li>\n<li>\n<p>Discrete Input (1 \u0431\u0438\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435, 1 \u0438\u043b\u0438 0) \u2014 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0432\u0445\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>Input Register (16 \u0431\u0438\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435, 0&#8230;65535) \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0432\u0432\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>Holding (16 \u0431\u0438\u0442, \u0447\u0442\u0435\u043d\u0438\u0435-\u0437\u0430\u043f\u0438\u0441\u044c, 0&#8230;65535) \u2014 \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>0x02 \u2014 \u0447\u0442\u0435\u043d\u0438\u0435 Discrete Input.<\/p>\n<\/li>\n<li>\n<p>0x03 \u2014 \u0447\u0442\u0435\u043d\u0438\u0435 Holding.<\/p>\n<\/li>\n<li>\n<p>0x04 \u2014 \u0447\u0442\u0435\u043d\u0438\u0435 Input Register<\/p>\n<\/li>\n<li>\n<p>0x06 \u2014 \u0437\u0430\u043f\u0438\u0441\u044c Holding.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/mcs.mail.ru\/blog\/modbus-dlya-m2m-vzaimodejstviya\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<\/p>\n<h2>\u0416\u0435\u043b\u0435\u0437\u043a\u0438<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0436\u0435\u043b\u0435\u0437\u043a\u0438.<\/p>\n<p>\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u0435\u043d\u0441\u043e\u0440 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 (TVOC) \u2014 \u044f \u0432\u043e\u0437\u044c\u043c\u0443 CCS811.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u044f \u0432\u043e\u0437\u044c\u043c\u0443 ESP8266 \u2014 \u043e\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0434\u043e\u0440\u043e\u0433\u043e\u0439, \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438, \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u043e\u043d \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f, \u044f \u0432\u043e\u0437\u044c\u043c\u0443 \u043f\u043b\u0430\u0442\u043a\u0443 NodeMCU \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c ESP12F (ESP8266), \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u0440\u0443\u0436\u0443 GPIO.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e26\/83c\/8af\/e2683c8af570779927b1096b05e05fbb.png\" alt=\"\u0420\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0430 NodeMCU, \u0432\u0437\u044f\u0442\u043e \u0441 lastminuteengineers.com\" title=\"\u0420\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0430 NodeMCU, \u0432\u0437\u044f\u0442\u043e \u0441 lastminuteengineers.com\" width=\"595\" height=\"528\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e26\/83c\/8af\/e2683c8af570779927b1096b05e05fbb.png\"\/><figcaption>\u0420\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0430 NodeMCU, \u0432\u0437\u044f\u0442\u043e \u0441 lastminuteengineers.com<\/figcaption><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c ESP8266 \u043a \u0448\u0438\u043d\u0435 RS-485, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0440\u043e\u0432\u043d\u0435\u0439 UART \u2192 RS-485, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0445\u0435\u043c\u0435 MAX485 HW-97 \u0438 \u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0435 \u0431\u0440\u0430\u0442\u044c\u044f.<\/p>\n<p>\u0415\u0449\u0451 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c USB-RS485, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0443. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043b\u044e\u0431\u043e\u0439 \u0441 Aliexpress, \u044f \u0432\u043e\u0437\u044c\u043c\u0443 WB-USB485. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043b\u0430\u0442\u0443 \u044f \u0431\u0443\u0434\u0443 \u043f\u0438\u0442\u0430\u0442\u044c \u043e\u0442 USB-\u043f\u043e\u0440\u0442\u0430 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435\u043c 5 \u0412.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043b\u044e\u0431\u0430\u044f \u0442\u0430\u043a\u0442\u043e\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430, \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043e\u043d\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<p>\u0416\u0435\u043b\u0435\u0437\u043a\u0438 \u0441\u043e\u0431\u0440\u0430\u043b\u0438, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u043d\u0438\u0436\u0435 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0421\u0435\u043d\u0441\u043e\u0440 CCS811 \u043f\u043e\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043a\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ee\/aaf\/9a0\/0eeaaf9a00b091725738ff3db3c6b6bb.png\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\" title=\"\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\" width=\"1700\" height=\"940\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0ee\/aaf\/9a0\/0eeaaf9a00b091725738ff3db3c6b6bb.png\"\/><figcaption>\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/71a\/ef0\/447\/71aef0447774f874d28f7782cf2e47fd.jpg\" alt=\"\u041c\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0430 \u043d\u0430 \u0441\u0442\u043e\u043b\u0435\" title=\"\u041c\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0430 \u043d\u0430 \u0441\u0442\u043e\u043b\u0435\" width=\"1588\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/71a\/ef0\/447\/71aef0447774f874d28f7782cf2e47fd.jpg\" data-blurred=\"true\"\/><figcaption>\u041c\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0430 \u043d\u0430 \u0441\u0442\u043e\u043b\u0435<\/figcaption><\/figure>\n<h2>\u041f\u0440\u043e\u0448\u0438\u0432\u043a\u0430<\/h2>\n<p>\u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442-\u0441\u0430\u043c\u043e\u0437\u0432\u0430\u043d\u0435\u0446, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0443 \u0432 \u0441\u0440\u0435\u0434\u0435 Arduino, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u0441\u043a\u0435\u0442\u0447\u0438) \u0434\u043b\u044f Embedded \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 C++.<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0441\u0440\u0435\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h3>\n<p>\u041f\u0438\u0441\u0430\u0442\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434 ESP8266, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0441\u0440\u0435\u0434\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0448\u0430\u0433\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Arduino.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u043b\u0430\u0442 ESP8266, <a href=\"https:\/\/wiki.iarduino.ru\/page\/wemos_start\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043b\u0430\u0442\u0443 \u0432 \u043c\u0435\u043d\u044e \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u2192 \u041f\u043b\u0430\u0442\u0430 \u2192 Generic ESP8266 Module \u0438\u043b\u0438 \u043f\u043b\u0430\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443 \u0432\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0418 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443: \u043c\u0435\u043d\u044e \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u2192 \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438. \u0412 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u0449\u0435\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/github.com\/emelianov\/modbus-esp8266\" rel=\"noopener noreferrer nofollow\">modbus-esp8266<\/a>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0441\u0451, \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0442\u0432\u043e\u0440\u0438\u0442\u044c. \u0412 \u043a\u043e\u0434\u0435 \u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043d\u043e\u043c\u0435\u0440\u0430 GPIO, \u0430 \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u043f\u043b\u0430\u0442\u044b \u0438\u043c\u0435\u043d\u0430 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u2014 \u043f\u043e \u0437\u0430\u0434\u0443\u043c\u043a\u0435, \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043b\u0430\u0442.<\/p>\n<h3>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 Modbus-\u0441\u0435\u0440\u0432\u0435\u0440<\/h3>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c modbus-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c 1, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f 9600 8N2, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 holding-\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c 3.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0441\u043a\u0435\u0442\u0447\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0417\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u0435\u043c, \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043d\u0430\u0448\u0430 \u043f\u043b\u0430\u0442\u0430 \u0432 \u043c\u0435\u043d\u044e \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0435\u0441\u0442\u044c \u043a\u043e\u0434 \u0432 \u043e\u043a\u043d\u0435.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0435\u0442\u0447 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f.<\/p>\n<pre><code class=\"cpp\">\/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 modbus-esp8266 #include &lt;ModbusRTU.h>  \/\/ \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Modbus #define SLAVE_ID 1 \/\/ \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 #define PIN_FLOW 4 \/\/ \u043f\u0438\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0451\u043c\u0430\/\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, \/\/ \u0435\u0441\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 UART-RS485 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442 \u2014 \/\/ \u0437\u0430\u043a\u043e\u043c\u0435\u043d\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u043e\u043a\u0443  \/\/ \u041d\u043e\u043c\u0435\u0440\u0430 Modbus \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 #define REG_TEST 0       \/\/ \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c 0  ModbusRTU mb;  void setup() {   modbus_setup(); }  void loop() {   mb.task(); }  void modbus_setup() {   Serial.begin(9600, SERIAL_8N2); \/\/ \u0437\u0430\u0434\u0430\u0451\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0440\u044b \u0441\u0432\u044f\u0437\u0438   mb.begin(&amp;Serial);   mb.begin(&amp;Serial, PIN_FLOW); \/\/ \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0451\u043c\u0430\/\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438   mb.slave(SLAVE_ID); \/\/ \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430    mb.addHreg(REG_TEST); \/\/ \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 REG_TEST \u0442\u0438\u043f\u0430 Holding   mb.Hreg(REG_TEST, 3); \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043d\u0430\u0448 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 REG_TEST \u0447\u0438\u0441\u043b\u043e 3 \u2014   \/\/ \u0435\u0433\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u0438 \u043e\u043f\u0440\u043e\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 }<\/code><\/pre>\n<p>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0444\u0430\u0439\u043b <a href=\"https:\/\/github.com\/aadegtyarev\/esp-modbusrtu-demo\/tree\/main\/habr-article\/ver1\" rel=\"noopener noreferrer nofollow\">ver1.ino<\/a>.<\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0432\u043e\u044e \u043f\u043b\u0430\u0442\u0443 \u043a \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Ctrl+U \u2014 \u044d\u0442\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0435\u0442\u0447 \u0438 \u0437\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p>\u0412\u043e\u0442 \u043e\u043d\u0438, \u0437\u0430\u0432\u0435\u0442\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430:<\/p>\n<pre><code class=\"bash\">Leaving... Hard resetting via RTS pin...<\/code><\/pre>\n<p>\u0410 \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435? \u0421\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043c\u044b \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438, \u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0435\u0442 \u2014 \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u0414\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u043e Modbus \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Modbus RTU. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u0433\u0443 \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>Windows: Rilheva Modbus Poll.<\/p>\n<\/li>\n<li>\n<p>Linux: \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 modbus_client \u0438\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 QMaster.<\/p>\n<\/li>\n<li>\n<p>MacOS \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <code>cu<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043e\u0434\u0438\u043d: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435 \u043a \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u0438\u043a USB-RS485, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u043e\u043c\u0435\u0440 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0434\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u0438\u043a\u0438.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u2014 9600 8N2<\/p>\n<\/li>\n<li>\n<p>\u0410\u0434\u0440\u0435\u0441 \u2014 1<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440 Holding \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c 0.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u043d\u0430\u0434\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430. \u0414\u043b\u044f holding-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u044d\u0442\u043e 0x03 \u2014 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 0x06 \u0437\u0430\u043f\u0438\u0441\u044c.<\/p>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Linux, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0447\u0435\u0440\u0435\u0437 modbus_client, \u043e\u043d\u043e \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 <code>dev\/ttyACM0<\/code> \u2014 \u0443 \u0432\u0430\u0441 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>\u0421\u0447\u0438\u0442\u0430\u0435\u043c \u043d\u0430\u0448 \u0440\u0435\u0433\u0438\u0441\u0442\u0440:<\/p>\n<pre><code class=\"bash\">$ modbus_client -mrtu -b9600 -d8 -pnone -s2 \/dev\/ttyACM0 -a1 -t0x03 -r0  SUCCESS: read 1 of elements:         Data: 0x0003 <\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0443\u0434\u0430 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0432\u043e\u0451, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0438\u0441\u043b\u043e 1 \u0438 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 0x03 (\u0447\u0442\u0435\u043d\u0438\u0435 holding) \u043d\u0430 0x06 (\u0437\u0430\u043f\u0438\u0441\u044c holding):<\/p>\n<pre><code class=\"bash\">$ modbus_client -mrtu -b9600 -d8 -pnone -s2 \/dev\/ttyACM0 -a1 -t0x06 -r0 1                           SUCCESS: written 1 elements!<\/code><\/pre>\n<p>\u0418 \u0441\u043d\u043e\u0432\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u043c:<\/p>\n<pre><code class=\"bash\">modbus_client -mrtu -b9600 -d8 -pnone -s2 \/dev\/ttyACM0 -a1 -t0x03 -r0                                         SUCCESS: read 1 of elements:         Data: 0x0001<\/code><\/pre>\n<p>\u0423\u0440\u0430! \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0434\u0438\u043d\u0438\u0447\u043a\u0430. \u0422\u0430\u043a\u0438\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0430\u0440\u043e\u0439 \u0441\u043e\u0442\u0435\u043d \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u0448\u0438\u043d\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e5f\/332\/887\/e5f3328874a7835903a018f22a6a27af.png\" alt=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver1.ino\" title=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver1.ino\" width=\"2104\" height=\"1263\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e5f\/332\/887\/e5f3328874a7835903a018f22a6a27af.png\"\/><figcaption>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver1.ino<\/figcaption><\/figure>\n<h3>\u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438<\/h3>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439 \u0441\u0435\u043d\u0441\u043e\u0440 \u0438 \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e! \u041d\u043e \u043d\u0435\u0442, \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0438 \u044d\u0442\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043c\u0443\u0447\u0438\u043b\u0441\u044f, \u0434\u0430\u0434\u0438\u043c \u0435\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438 \u0447\u0435\u0440\u0435\u0437 Modbus-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b. \u0422\u0430\u043a \u043e\u043d \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0448\u0438\u043d\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438.<\/p>\n<p>\u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 \u0438 \u0430\u0434\u0440\u0435\u0441, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0440\u0438 holding-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u0434\u0430\u0434\u0438\u043c \u0438\u043c \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0438\u0445 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0410\u0434\u0440\u0435\u0441\u0430 Modbus-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0441\u0432\u044f\u0437\u0438 #define REG_MB_ADDRESS    100 \/\/ \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0448\u0438\u043d\u0435 #define REG_MB_STOP_BITS  101 \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 #define REG_MB_BAUDRATE   102 \/\/ \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u2014 EEPROM:<\/p>\n<pre><code class=\"cpp\">#define EEPROM_SIZE           6 \/\/ \u043c\u044b \u0437\u0430\u0439\u043c\u0451\u043c 6 \u044f\u0447\u0435\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438: 3*2=6 #define EEPROM_MB_ADDRESS     0 \/\/ \u043d\u043e\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 #define EEPROM_MB_STOP_BITS   2 \/\/ \u043d\u043e\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u043f-\u0431\u0438\u0442\u0430\u043c\u0438 #define EEPROM_MB_BAUDRATE    4 \/\/ \u043d\u043e\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 EEPROM \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0447\u0438\u0441\u043b\u0430 \u0442\u0438\u043f\u0430 uint16_t, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 ESP8266\/ESP32 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 4 \u0431\u0430\u0439\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0439\u043c\u0451\u0442 \u0434\u0432\u0435 \u044f\u0447\u0435\u0439\u043a\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e 6 \u044f\u0447\u0435\u0435\u043a.<\/p>\n<p>\u0415\u0449\u0451 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0443 \u043c\u0435\u043d\u044f \u0431\u0443\u0434\u0435\u0442 9600 8N2:<\/p>\n<pre><code class=\"cpp\">#define DEFAULT_MB_ADDRESS    1  \/\/ \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 #define DEFAULT_MB_STOP_BITS  2  \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 #define DEFAULT_MB_BAUDRATE   96 \/\/ \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/100<\/code><\/pre>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 115200 \u2014 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0440\u0435\u0433\u0438\u0441\u0442\u0440: 65535. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u043f\u043e\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043d\u0430 100, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 9600 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f 9600\/100 = 96.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u0443\u0434\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438 \u0438\u0437 EEPROM \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0438\u0445 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 modbus-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">uint16_t mbAddress = DEFAULT_MB_ADDRESS; \/\/ modbus \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 uint16_t mbStopBits = DEFAULT_MB_STOP_BITS; \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 uint16_t mbBaudrate = DEFAULT_MB_BAUDRATE; \/\/ \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f modbus<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u0440\u0438 \u0448\u0430\u0433\u0430: \u0447\u0442\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u0437 EEPROM, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 holding-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432 EEPROM \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c EEPROM \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">void eeprom_setup() {   EEPROM.begin(EEPROM_SIZE); }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 EEPROM \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>read_modbus_settings()<\/code>, \u0435\u0441\u043b\u0438 \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445 EEPROM \u043f\u0443\u0441\u0442\u043e, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"cpp\">void read_modbus_settings() {   EEPROM.get(EEPROM_MB_ADDRESS, mbAddress);   if (mbAddress == 0xffff) {     mbAddress = DEFAULT_MB_ADDRESS;   }    EEPROM.get(EEPROM_MB_STOP_BITS, mbStopBits);   if (mbStopBits == 0xffff) {     mbStopBits = DEFAULT_MB_STOP_BITS;   }    EEPROM.get(EEPROM_MB_BAUDRATE, mbBaudrate);   if (mbBaudrate == 0xffff) {     mbBaudrate = DEFAULT_MB_BAUDRATE;   }; }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e get, \u0430 \u043d\u0435 read \u2014 \u044d\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438. \u041e\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u044f\u0447\u0435\u0435\u043a, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 modbus <code>modbus_setup()<\/code>:<\/p>\n<pre><code class=\"cpp\">void modbus_setup() {   Serial.begin(convert_baudrate(mbBaudrate), convert_stop_bits_to_config(mbStopBits)); \/\/ \u0437\u0430\u0434\u0430\u0451\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0440\u044b \u0441\u0432\u044f\u0437\u0438   mb.begin(&amp;Serial);   mb.begin(&amp;Serial, PIN_FLOW); \/\/ \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0451\u043c\u0430\/\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438   mb.slave(mbAddress); \/\/ \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430    \/\/ \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0440\u0438 holding \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430   mb.addHreg(REG_MB_ADDRESS);   \/\/ \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0448\u0438\u043d\u0435   mb.addHreg(REG_MB_STOP_BITS); \/\/ \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u0431\u0438\u0442\u044b   mb.addHreg(REG_MB_BAUDRATE);  \/\/ \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f    \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0430\u0434\u0440\u0435\u0441\u0430, \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438   mb.Hreg(REG_MB_ADDRESS, mbAddress);   mb.Hreg(REG_MB_STOP_BITS, mbStopBits);   mb.Hreg(REG_MB_BAUDRATE, mbBaudrate);    \/\/ \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0431\u0435\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432   \/\/ \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f   mb.onSetHreg(REG_MB_ADDRESS, callback_set_mb_reg);   mb.onSetHreg(REG_MB_STOP_BITS, callback_set_mb_reg);   mb.onSetHreg(REG_MB_BAUDRATE, callback_set_mb_reg); }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 holding-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0432 \u043d\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>read_modbus_settings()<\/code>.<\/p>\n<p><code>convert_stop_bits_to_config<\/code> \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u044e \u043b\u0435\u043d\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0421\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Serial \u0432 Adruino \u043d\u0435 \u0434\u0430\u0451\u0442 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e (\u0438\u043b\u0438 \u044f \u043d\u0435 \u043d\u0430\u0448\u0451\u043b), \u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0451, \u043a\u0440\u043e\u043c\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0442\u0438\u043f\u0430 SerialConfig. \u0410 \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0447\u0451\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0438\u0442\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442, \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">SerialConfig convert_stop_bits_to_config(uint16_t stopBits) {   return (stopBits == 2) ? SERIAL_8N2 : SERIAL_8N1; }<\/code><\/pre>\n<p>\u0415\u0449\u0451 \u0432\u044b\u0448\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0442\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430: \u0430\u0434\u0440\u0435\u0441, \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u0431\u0438\u0442\u044b \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u0438 \u044d\u0442\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u043a\u043e\u043b\u0431\u0435\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">uint16_t callback_set_mb_reg(TRegister* reg, uint16_t val) {   switch (reg->address.address) {     case REG_MB_ADDRESS: \/\/ \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c       if (val > 0 &amp;&amp; val &lt; 247) { \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e         write_eeprom(EEPROM_MB_ADDRESS, val); \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 EEPROM       } else {         val = reg->value; \/\/ \u044d\u0442\u043e\u0442 \u0442\u0440\u044e\u043a \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0438, \u0447\u0442\u043e \u043d\u0430\u043c \u0438 \u043d\u0443\u0436\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435       }       break;     case REG_MB_STOP_BITS: \/\/ \u0435\u0441\u043b\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0441\u043e \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u043c\u0438 \u0431\u0438\u0442\u0430\u043c\u0438       if (val == 1 || val == 2) {         write_eeprom(EEPROM_MB_STOP_BITS, val);       } else {         val = reg->value;       }       break;     case REG_MB_BAUDRATE: \/\/ \u0435\u0441\u043b\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e       uint16_t correctBaudRates[] = {12, 24, 48, 96, 192, 384, 576, 1152};       if (contains(val, correctBaudRates, 8)) {         write_eeprom(EEPROM_MB_BAUDRATE, val);       } else {         val = reg->value;       }       break;   }   return val; }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u0447\u0438\u0441\u043b\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435. \u042d\u0442\u043e \u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0438\u0442 \u043d\u0430\u0441 \u043e\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443.<\/p>\n<p>\u041d\u0443 \u0438 \u0432 \u043a\u043e\u0434\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a modbus \u0435\u0449\u0451 \u0437\u0430\u0441\u0432\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043f\u0430\u0440\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439: \u0437\u0430\u043f\u0438\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 EEPROM \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432.<\/p>\n<pre><code class=\"cpp\">\/\/ \u0417\u0430\u043f\u0438\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 EEPROM void write_eeprom(uint8_t eepromm_address, uint16_t val) {   EEPROM.put(eepromm_address, val);   EEPROM.commit(); }  \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 bool contains(uint16_t a, uint16_t arr[], uint8_t arr_size) {   for (uint8_t i = 0; i &lt; arr_size; i++) if (a == arr[i]) return true;   return false; }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u0441\u0435\u0433\u043e \u0438 \u0432\u0441\u044f \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043b\u0438 \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443 \u043d\u0430\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">void setup() {   eeprom_setup(); \/\/ \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c EEPROM   modbus_setup();  \/\/ \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Modbus }<\/code><\/pre>\n<p>\u0424\u0443\u0445, \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0451, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c: \u0447\u0438\u0442\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0441 100 \u043f\u043e 102, \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 102 \u0447\u0438\u0441\u043b\u043e 1152 (\u043c\u044b \u0434\u0435\u043b\u0438\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043d\u0430 100 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0432 EEPROM) \u0438 \u0441\u043d\u043e\u0432\u0430 \u0447\u0438\u0442\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b. \u0412 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 102 \u0447\u0438\u0441\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u0430\u043c 0x0480 \u2014 \u044d\u0442\u043e 1152 \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u041d\u043e\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc5\/f9a\/afe\/bc5f9aafe4abf59ed2b1a7d23bbc6ee5.png\" alt=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver2.ino\" title=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver2.ino\" width=\"2100\" height=\"1305\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bc5\/f9a\/afe\/bc5f9aafe4abf59ed2b1a7d23bbc6ee5.png\"\/><figcaption>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver2.ino<\/figcaption><\/figure>\n<p>\u0421\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0449\u0438\u0442\u0435 \u043d\u0438\u0436\u0435, \u0430 \u044f \u043f\u043e\u043a\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043c\u044b \u0447\u0438\u0442\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437 EEPROM \u0438, \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0442, \u0442\u043e \u0434\u043b\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c holding-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u043a\u043e\u043b\u0431\u0435\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432 \u044f\u0447\u0435\u0439\u043a\u0438 EEPROM.<\/p>\n<p>\u041e\u0431\u0435\u0449\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435 <a href=\"https:\/\/github.com\/aadegtyarev\/esp-modbusrtu-demo\/tree\/main\/habr-article\/ver2\" rel=\"noopener noreferrer nofollow\">ver2.ino<\/a>.<\/p>\n<h3>\u0427\u0435\u0440\u043d\u044b\u0439 \u0445\u043e\u0434 \u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435<\/h3>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2014 \u0435\u0441\u043b\u0438 \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u0437\u0430\u0431\u044b\u043b\u0438 \u0438\u0445, \u0442\u043e \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0448\u0438\u0442\u044c. \u042d\u0442\u043e \u0436\u0443\u0442\u043a\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043b\u0430\u0437\u0435\u0439\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0442\u0430\u043a\u0430\u044f: \u0437\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u043f\u043e\u0434\u0430\u0451\u043c \u043f\u0438\u0442\u0430\u043d\u0438\u0435 \u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0441 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u043d\u0430\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u043f\u043e \u043d\u0438\u043c. \u041f\u0440\u043e\u0441\u0442\u043e \u0438 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e.<\/p>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 GPIO14 \u2014 \u0435\u0451 \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0430\u0439\u043b\u0430, \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 define:<\/p>\n<pre><code class=\"cpp\">#define BTN_SAFE_MODE 14 \/\/ D5 \u043d\u0430 NodeMCU. \u041a\u043d\u043e\u043f\u043a\u0430 \u0441\u0431\u0440\u043e\u0441\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/code><\/pre>\n<p>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u0432\u0445\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">void io_setup() {   pinMode(BTN_SAFE_MODE, INPUT_PULLUP); }<\/code><\/pre>\n<p>\u041f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u043d\u0430\u0436\u0430\u0442\u0430, \u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437 EEPROM:<\/p>\n<pre><code class=\"cpp\">void check_safe_mode() {   if (digitalRead(BTN_SAFE_MODE)) { \/\/ \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0436\u0430\u0442\u0430, \u0442\u043e \u0447\u0438\u0442\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437 EEPROM, \u0438\u043d\u0430\u0447\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e     read_modbus_settings(); \/\/ \u0447\u0442\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a   } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043d\u043e\u043f\u043a\u0430 \u0443 \u043d\u0430\u0441 \u0437\u0430\u043c\u044b\u043a\u0430\u0435\u0442 GPIO \u043d\u0430 \u0437\u0435\u043c\u043b\u044e, \u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0435\u043d\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d 1, \u0447\u0442\u043e \u043c\u044b \u0438 \u0443\u0447\u043b\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0431\u043b\u043e\u043a\u0435 if.<\/p>\n<p>\u0412\u0441\u0451, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438:<\/p>\n<pre><code class=\"cpp\">void setup() {   io_setup();  \/\/ \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0432\u0445\u043e\u0434\u044b\/\u0432\u044b\u0445\u043e\u0434\u044b   eeprom_setup(); \/\/ \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c EEPROM   check_safe_mode(); \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043d\u0435 \u043d\u0430\u0434\u043e \u043b\u0438 \u043d\u0430\u043c \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438   modbus_setup();  \/\/ \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Modbus }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u2014 \u043f\u043e\u043b\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043a\u0435\u0442\u0447\u0430 <a href=\"https:\/\/github.com\/aadegtyarev\/esp-modbusrtu-demo\/tree\/main\/habr-article\/ver3\" rel=\"noopener noreferrer nofollow\">ver3.ino<\/a>.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f modbus-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043b\u044e\u0431\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0438\u0436\u0435 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b04\/d6d\/4b3\/b04d6d4b305e5ae0ba9826f5d267fe9b.png\" alt=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver3.ino\" title=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver3.ino\" width=\"1800\" height=\"800\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b04\/d6d\/4b3\/b04d6d4b305e5ae0ba9826f5d267fe9b.png\"\/><figcaption>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver3.ino<\/figcaption><\/figure>\n<h2>\u0414\u0435\u043b\u0430\u0435\u043c \u0434\u0430\u0442\u0447\u0438\u043a \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430<\/h2>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 modbus-\u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u043c\u0435\u0435\u0442, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 EEPROM. \u0428\u0442\u0443\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f, \u043d\u043e \u043f\u043e\u043a\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c CCS811. \u0421\u0430\u043c \u0441\u0435\u043d\u0441\u043e\u0440 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u043f\u043b\u0430\u0442\u043a\u0443 \u0441 \u044d\u0442\u0438\u043c \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7fa\/dab\/04f\/7fadab04fe7038a0768bde18c8b7cf1f.png\" alt=\"CJMCU-811 \u2014 \u043f\u043b\u0430\u0442\u0430 \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c CCS811\" title=\"CJMCU-811 \u2014 \u043f\u043b\u0430\u0442\u0430 \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c CCS811\" width=\"1247\" height=\"819\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7fa\/dab\/04f\/7fadab04fe7038a0768bde18c8b7cf1f.png\"\/><figcaption>CJMCU-811 \u2014 \u043f\u043b\u0430\u0442\u0430 \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c CCS811<\/figcaption><\/figure>\n<h3>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0435\u043d\u0441\u043e\u0440 \u043a ESP8266<\/h3>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e I2C \u0443 \u043d\u0430\u0441 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u043d\u0430 \u043f\u0438\u043d\u044b GPIO5 (D1) \u0438 GPIO4 (D2), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u044e\u0434\u0430 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043d\u0430\u0448 \u0434\u0430\u0442\u0447\u0438\u043a. GPIO4 \u0443 \u043d\u0430\u0441 \u0437\u0430\u043d\u044f\u0442 \u0432\u044b\u0445\u043e\u0434\u043e\u043c Flow Control, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u043c \u0435\u0433\u043e. \u0422\u0435\u043f\u0435\u0440\u044c Flow Control \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u0443 \u043d\u0430\u0441 \u043d\u0430 GPIO12 (D6).<\/p>\n<p>\u041d\u043e\u0432\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0438\u0436\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8dc\/df5\/6d2\/8dcdf56d2259f6bebe442de30dff2bc2.png\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u0430 CCS811 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f UART-RS485\" title=\"\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u0430 CCS811 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f UART-RS485\" width=\"1700\" height=\"940\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8dc\/df5\/6d2\/8dcdf56d2259f6bebe442de30dff2bc2.png\"\/><figcaption>\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u0430 CCS811 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f UART-RS485<\/figcaption><\/figure>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 CCS811<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0447\u0442\u0451\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0441\u0445\u0435\u043c\u0435: Flow Control \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u0443 \u043d\u0430\u0441 \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0432\u044b\u0445\u043e\u0434\u0443, \u043c\u0435\u043d\u044f\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u0445 GPIO4 \u043d\u0430 GPIO12.<\/p>\n<pre><code class=\"cpp\">#define PIN_FLOW 12 \/\/ GPIO12(D6)<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u00abSparkFun CCS811 Arduino library\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0434\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 \u043a\u043e\u0434\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 Wire:<\/p>\n<pre><code class=\"cpp\">#include &lt;Wire.h>            \/\/ Wire #include &lt;SparkFunCCS811.h>  \/\/ SparkFun CCS811 Arduino library<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 Modbus-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">#define REG_SENSOR_ERROR  0 \/\/ \u043e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 CCS811 #define REG_SENSOR_ECO2   1 \/\/ eCO2 #define REG_SENSOR_TVOC   2 \/\/ TVOC #define REG_SENSOR_BL     3 \/\/ Baseline<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0437\u0430\u0434\u0430\u043b\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0441 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u043c\u0438: eCO2 \u0438 TVOC, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0432\u0430 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445: Baseline \u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u0430. Baseline \u2014 \u044d\u0442\u043e \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0430\u0432\u0442\u043e\u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>modbus_setup()<\/code> \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">  mb.addIsts(REG_SENSOR_ERROR); \/\/ \u043e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u0430   mb.addIreg(REG_SENSOR_ECO2);  \/\/ eCO2   mb.addIreg(REG_SENSOR_TVOC);  \/\/ TVOC   mb.addIreg(REG_SENSOR_BL);    \/\/ Baseline      mb.Ists(REG_SENSOR_ERROR, 0); \/\/ \u043e\u0448\u0438\u0431\u043a\u0430   mb.Ireg(REG_SENSOR_ECO2, 0);  \/\/ eCO2   mb.Ireg(REG_SENSOR_TVOC, 0);  \/\/ TVOC   mb.Ireg(REG_SENSOR_BL, 0);    \/\/ Baseline<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 \u043d\u0430 \u0448\u0438\u043d\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">#define CCS811_ADDR 0x5A \/\/ \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 I2C, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0x5A, \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 0x5B  CCS811 ccs811(CCS811_ADDR);  \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c CCS811<\/code><\/pre>\n<p>\u0421\u0430\u043c \u0441\u0435\u043d\u0441\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0435\u043a\u0443\u043d\u0434\u0443.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a: \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0441\u0435\u043d\u0441\u043e\u0440 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0448\u0438\u043d\u0435 I2C. \u041d\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445. \u0414\u0430, \u043d\u0430 \u0441\u0435\u043d\u0441\u043e\u0440\u0435 \u0435\u0441\u0442\u044c \u0432\u044b\u0445\u043e\u0434 INT, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u043d\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e \u043d\u0435\u043c\u0443 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0435\u043d\u0441\u043e\u0440, \u043d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0439\u0442\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0451\u043c \u0438 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u043d\u043e\u0433\u0443.<\/p>\n<p>\u0420\u0430\u0437 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438, \u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0430\u0439\u043c\u0435\u0440, \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 SimpleTimer (\u0432\u0442\u043e\u0440\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0443\u043a\u0432\u044b) \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0435\u0451 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 \u0441\u043a\u0435\u0442\u0447\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c 10 \u043c\u0441:<\/p>\n<pre><code class=\"cpp\">#include &lt;SimpleTimer.h>  \/\/ \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0430\u0439\u043c\u0435\u0440  SimpleTimer sysTimer(10); \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c 10 \u043c\u0441<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0438\u043d\u0443 i2c, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445:<\/p>\n<pre><code class=\"cpp\">void i2c_setup() {   Wire.begin();  \/\/ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f i2c    if (!ccs811.begin()) {  \/\/ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f CCS811     mb.Ists(REG_SENSOR_ERROR, 1); \/\/ \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u2014 \u043e\u0448\u0438\u0431\u043a\u0430, \u043f\u0438\u0448\u0435\u043c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043e\u0448\u0438\u0431\u043e\u043a   } else {     mb.Ists(REG_SENSOR_ERROR, 0);   }; }<\/code><\/pre>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>setup()<\/code>:<\/p>\n<pre><code class=\"cpp\">void setup() {   .....   i2c_setup();          \/\/ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f i2c }<\/code><\/pre>\n<p>\u0422\u0430\u0439\u043c\u0435\u0440 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438, \u0448\u0438\u043d\u0443 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430.<\/p>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"cpp\">\/\/ \u041e\u043f\u0440\u043e\u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 void read_sensor() {   unsigned int baseLine;      if (ccs811.dataAvailable()) {                 \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u043d\u0432\u043e\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435     ccs811.readAlgorithmResults();              \/\/ \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c     mb.Ireg(REG_SENSOR_ECO2, ccs811.getCO2());  \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 eCO2     mb.Ireg(REG_SENSOR_TVOC, ccs811.getTVOC()); \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 TVOC      baseLine = ccs811.getBaseline();     mb.Ireg(REG_SENSOR_BL, baseLine);    \/\/ Baseline   } }<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u0430\u0439\u043c\u0435\u0440 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>yield()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 <code>loop()<\/code>:<\/p>\n<pre><code class=\"cpp\">void yield() {   if (sysTimer.isReady()) { \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 10 \u043c\u0441     read_sensor(); \/\/ \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u0435\u043d\u0441\u043e\u0440     sysTimer.reset(); \/\/ \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440   } }  void loop() {   mb.task();   yield();  }<\/code><\/pre>\n<p>\u041f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438, \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0435\u0442\u0447 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 <a href=\"https:\/\/github.com\/aadegtyarev\/esp-modbusrtu-demo\/tree\/main\/habr-article\/ver4\" rel=\"noopener noreferrer nofollow\">ver4.ino<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6c3\/60e\/075\/6c360e075377751ba8094a97744bd1fc.png\" alt=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver4.ino. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Baseline \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\" title=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver4.ino. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Baseline \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\" width=\"1696\" height=\"735\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6c3\/60e\/075\/6c360e075377751ba8094a97744bd1fc.png\"\/><figcaption>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver4.ino. \u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Baseline \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/figcaption><\/figure>\n<h3>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 Baseline \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/h3>\n<p>Baseline \u2014 \u044d\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438. \u041d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441 \u2014 \u043e\u043d\u043e \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u0438\u0442\u0430\u043d\u0438\u044f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0441\u0435\u043d\u0441\u043e\u0440 \u0442\u0435\u0440\u044f\u0435\u0442 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0443 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0446\u0438\u043a\u043b \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Baseline \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0435\u043d\u0441\u043e\u0440\u0430, \u0430 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c. \u0417\u0434\u0435\u0441\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Baseline \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e, \u0430 \u0441\u0430\u043c\u0430 \u0430\u0432\u0442\u043e\u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0440\u0430\u0437 \u0432 \u0441\u0443\u0442\u043a\u0438.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 EEPROM \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 Modbus, \u043d\u043e \u0435\u0451 \u0441\u0440\u043e\u043a \u0441\u043b\u0443\u0436\u0431\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u0434\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u0434\u0435-\u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435.<\/p>\n<p>\u0412 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 ESP8266 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438 \u0441\u0440\u043e\u043a \u0435\u0451 \u0441\u043b\u0443\u0436\u0431\u044b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439. \u0422\u0443\u0434\u0430 \u0442\u043e \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Baseline \u0432 \u0444\u0430\u0439\u043b\u0435 JSON.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u0435 Arduino \u043e\u0431 \u044d\u0442\u043e\u043c, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432 \u043c\u0435\u043d\u044e <em>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/em> \u2192 <em>Flash Size<\/em> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u043e\u0442 <code>FS:None<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>FS:1MB<\/code>;. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043d\u0430\u0439\u0434\u0451\u0442\u0435 <a href=\"https:\/\/arduino-esp8266.readthedocs.io\/en\/latest\/filesystem.html\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 ArduinoJson, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0435\u0451 \u0432 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:<\/p>\n<pre><code class=\"cpp\">#include &lt;FS.h> \/\/ SPIFFS \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c #include &lt;ArduinoJson.h>        \/\/\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0437 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/code><\/pre>\n<p>\u0413\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e SPIFFS \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0430, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0441 \u043d\u0435\u0439 \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u043e\u0431\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0435\u0451. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u0430\u0440\u0443 \u0432\u044b\u0432\u043e\u0437\u043e\u0432 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u0433\u0434\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:<\/p>\n<pre><code class=\"cpp\">#define REG_FS_ERROR      4 \/\/ \u043e\u0448\u0438\u0431\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0438\u0448\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0444\u043b\u0430\u0433\u0438:<\/p>\n<pre><code class=\"cpp\">uint16_t sensorBaseLine = 0; \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 BaseLine String configFile = \"\/config.json\"; \/\/ \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/code><\/pre>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438\u043c\u0435\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c, \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0444\u0430\u0439\u043b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438. \u0417\u0430\u0432\u0435\u0434\u0451\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0442\u0430\u0439\u043c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437 \u0432 10 \u0441\u0435\u043a\u0443\u043d\u0434 (1000 \u043c\u0441):<\/p>\n<pre><code class=\"cpp\">SimpleTimer blTimer(1000);   \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c 10 \u0441<\/code><\/pre>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043a\u043b\u0430\u0434\u0451\u043c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0444\u043b\u0430\u0433 \u043e\u0448\u0438\u0431\u043a\u0438, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b void fs_setup() {   if (SPIFFS.begin()) {     mb.Ists(REG_FS_ERROR, 0);   } else {     mb.Ists(REG_FS_ERROR, 1);   } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>yield()<\/code>:<\/p>\n<pre><code class=\"cpp\">void yield() {   if (sysTimer.isReady()) {     read_sensor(); \/\/ \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u0435\u043d\u0441\u043e\u0440     sysTimer.reset(); \/\/ \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440   }    if (blTimer.isReady()) {     write_config(); \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Baseline \u0432 \u0444\u0430\u0439\u043b     blTimer.reset();   } }<\/code><\/pre>\n<p>\u0418 \u043e\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f-\u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0430:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0427\u0442\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 void read_config() {   DynamicJsonDocument doc(200);   String jsonConfig = \"\";    File cfgFile = SPIFFS.open(configFile, \"r\");    if (cfgFile) {     while (cfgFile.available()) {       jsonConfig += (char)cfgFile.read();     }   }   cfgFile.close();    deserializeJson(doc, jsonConfig);   sensorBaseLine = doc[\"baseLine\"];   mb.Ireg(REG_SENSOR_BL, sensorBaseLine);    if (write_baseline(sensorBaseLine)) {     mb.Ists(REG_SENSOR_ERROR, 0);   } else {     mb.Ists(REG_SENSOR_ERROR, 1);   } }  \/\/ \u0417\u0430\u043f\u0438\u0441\u044c baseline \u0432 \u0441\u0435\u043d\u0441\u043e\u0440 bool write_baseline(uint16_t baseline) {   CCS811Core::CCS811_Status_e errorStatus;    errorStatus = ccs811.setBaseline(baseline);   if (errorStatus != CCS811Core::CCS811_Stat_SUCCESS)   {     return false;   };   return true; }  \/\/ \u0417\u0430\u043f\u0438\u0441\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0432 \u0444\u0430\u0439\u043b void write_config() {   DynamicJsonDocument doc(200);   String jsonConfig;    doc[\"baseLine\"] = sensorBaseLine;    serializeJson(doc, jsonConfig);    File cfgFile = SPIFFS.open(configFile, \"w\");   if (cfgFile) {     cfgFile.print(jsonConfig);     cfgFile.close();     mb.Ists(REG_FS_ERROR, 0);   } else {     mb.Ists(REG_FS_ERROR, 1);   } }<\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c, \u0437\u0430\u0448\u0438\u0432\u0430\u0435\u043c, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0435\u0442\u0447 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 <a href=\"https:\/\/github.com\/aadegtyarev\/esp-modbusrtu-demo\/tree\/main\/habr-article\/ver5\" rel=\"noopener noreferrer nofollow\">ver5.ino<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/622\/4ef\/5ee\/6224ef5ee3d260d187132f6c7468d5ad.png\" alt=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver5.ino\" title=\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver5.ino\" width=\"1696\" height=\"707\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/622\/4ef\/5ee\/6224ef5ee3d260d187132f6c7468d5ad.png\"\/><figcaption>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver5.ino<\/figcaption><\/figure>\n<h2>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 Wiren Board<\/h2>\n<h3>\u041f\u043b\u0430\u043d \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438<\/h3>\n<p>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0433\u043e\u0442\u043e\u0432, \u043f\u043e\u0440\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u2014 \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<p>\u0423 Wiren Board \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Modbus-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 wb-mqtt-serial, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0430\u0448\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c, \u043a\u0430\u043a \u0441 \u0440\u043e\u0434\u043d\u044b\u043c.<\/p>\n<p>\u0417\u0430\u043e\u0434\u043d\u043e \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0437\u0443\u043c\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 TVOC \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/09a\/3f5\/a0e\/09a3f5a0e8359a23a7730e7e2b257256.jpg\" alt=\"\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a \u043f\u043e\u0440\u0442\u0443 RS485 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Wiren Board\" title=\"\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a \u043f\u043e\u0440\u0442\u0443 RS485 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Wiren Board\" width=\"1618\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/09a\/3f5\/a0e\/09a3f5a0e8359a23a7730e7e2b257256.jpg\" data-blurred=\"true\"\/><figcaption>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a \u043f\u043e\u0440\u0442\u0443 RS485 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Wiren Board<\/figcaption><\/figure>\n<h3>\u0428\u0430\u0431\u043b\u043e\u043d \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/h3>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 wb-mqtt-serial \u2014 \u044d\u0442\u043e json-\u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 Modbus-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/wirenboard\/wb-mqtt-serial\" rel=\"noopener noreferrer nofollow\">wb-mqtt-serial<\/a>.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043a\u0430\u0440\u0442\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>\u0410\u0434\u0440\u0435\u0441<\/p>\n<\/th>\n<th>\n<p>\u0422\u0438\u043f<\/p>\n<\/th>\n<th>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">Discrete Input<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 CCS811<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">Input Register<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 eCO2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">Input Register<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">Input Register<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Baseline<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">Discrete Input<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0448\u0438\u0431\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">100<\/p>\n<\/td>\n<td>\n<p align=\"left\">Holding<\/p>\n<\/td>\n<td>\n<p align=\"left\">Modbus-\u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">101<\/p>\n<\/td>\n<td>\n<p align=\"left\">Holding<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0442\u043e\u043f \u0431\u0438\u0442\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">102<\/p>\n<\/td>\n<td>\n<p align=\"left\">Holding<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u043c\u0435\u043d\u0430, \u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u043d\u0430 100<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"json\">{     \"device_type\": \"ad-sv\",     \/\/ \u0442\u0438\u043f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u2014 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440     \"title\": \"AD-SV\",               \/\/ \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435     \"group\": \"g-climate-sensor\",    \/\/ \u0433\u0440\u0443\u043f\u043f\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d. \u0421\u043f\u0438\u0441\u043e\u043a \u0433\u0440\u0443\u043f\u043f \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438     \"device\": {                              \"name\": \"AD-SV\",    \/\/ \u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 MQTT         \"id\": \"ad-sv\",         \"groups\": [ ],              \/\/ \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u043a\u0430\u043d\u0430\u043b\u043e\u0432                 \"channels\": [ ],            \/\/ \u043a\u0430\u043d\u0430\u043b\u044b, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430         \"parameters\": [ ],          \/\/ \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430         \"translations\": { }         \/\/ \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b      } }<\/code><\/pre>\n<p>AD-SV \u2014 \u0441\u043e\u043a\u0440\u044b\u0449\u0451\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>\u0418\u0437 \u043a\u0430\u0440\u0442\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0438\u0434\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b 0&#8230;4 \u2014 \u044d\u0442\u043e \u043a\u0430\u043d\u0430\u043b\u044b (channels) \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430: \u0438\u0445 \u043c\u044b \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b 100&#8230;102 \u2014 \u044d\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (parameters) \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0438\u0445 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u0440\u0443\u043f\u043f\u044b \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u0432\u0435:<\/p>\n<ul>\n<li>\n<p>Inputs \u2014 \u0441\u044e\u0434\u0430 \u0432\u043e\u0439\u0434\u0443\u0442 \u043a\u0430\u043d\u0430\u043b\u044b;<\/p>\n<\/li>\n<li>\n<p>Settings \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u0432\u0443\u044f\u0437\u044b\u0447\u043d\u044b\u043c: en\/ru.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432\u0448\u0438\u0441\u044c \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u0447\u0438\u0442\u0430\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b\u044b \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"json\">{     \"device_type\": \"ad-sv\",     \"title\": \"AD-SV\",     \"group\": \"g-climate-sensor\",     \"device\": {         \"name\": \"AD-SV\",         \"id\": \"ad-sv\",         \"groups\": [             {                 \"title\": \"Inputs\",                 \"id\": \"inputs\",                 \"order\": 0             },             {                 \"title\": \"Settings\",                 \"id\": \"settings\",                 \"order\": 1             }         ],         \"channels\": [                         {                 \"name\": \"eCO2\",                 \"reg_type\": \"input\",                 \"address\": 1,                 \"type\": \"value\",                 \"group\": \"inputs\"             },             {                 \"name\": \"TVOC\",                 \"reg_type\": \"input\",                 \"address\": 2,                 \"type\": \"value\",                 \"group\": \"inputs\"             },             {                 \"name\": \"Baseline\",                 \"reg_type\": \"input\",                 \"address\": 3,                 \"type\": \"value\",                 \"group\": \"inputs\"             },             {                 \"name\": \"CCS811 Error\",                 \"reg_type\": \"discrete\",                 \"address\": 0,                 \"type\": \"switch\",                 \"group\": \"inputs\"             },             {                 \"name\": \"FS Error\",                 \"reg_type\": \"discrete\",                 \"address\": 4,                 \"type\": \"switch\",                 \"group\": \"inputs\"             }         ],         \"parameters\": [             {                 \"id\": \"address\",                 \"title\": \"Address\",                 \"reg_type\": \"holding\",                                 \"address\": 100,                 \"default\": 1,                 \"min\": 1,                 \"max\": 247,                 \"group\": \"settings\"             },             {                 \"id\": \"stop-bits\",                 \"title\": \"Stop Bits\",                 \"reg_type\": \"holding\",                                 \"address\": 101,                 \"default\": 2,                 \"enum\": [1, 2],                 \"enum_titles\": [\"1\", \"2\"],                 \"group\": \"settings\"             },             {                 \"id\": \"baudrate\",                 \"title\": \"Baudrate\",                 \"reg_type\": \"holding\",                                 \"address\": 102,                 \"default\": 96,                 \"enum\": [12, 24, 48, 96, 192, 384, 576, 1152],                 \"enum_titles\": [\"1200\", \"2400\", \"4800\", \"9600\", \"19200\", \"38400\", \"57600\", \"115200\"],                 \"group\": \"settings\"             }         ],         \"translations\": {             \"ru\": {                 \"Inputs\": \"\u0412\u0445\u043e\u0434\u044b\",                 \"Settings\": \"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\",                 \"eCO2\": \"eCO2\",                 \"TVOC\": \"TVOC\",                 \"Baseline\": \"Baseline\",                 \"CCS811 Error\": \"\u041e\u0448\u0438\u0431\u043a\u0430 CCS811\",                 \"File System Error\": \"\u041e\u0448\u0438\u0431\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\",                 \"Address\": \"\u0410\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\",                 \"Stop Bits\": \"\u0421\u0442\u043e\u043f \u0431\u0438\u0442\u044b\",                 \"Baudrate\": \"\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u043c\u0435\u043d\u0430\",             }         }     } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c:<\/p>\n<ol>\n<li>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 <code>\/etc\/wb-mqtt-serial.conf.d\/templates<\/code>,<\/p>\n<\/li>\n<li>\n<p>\u0418\u0434\u0451\u043c \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u2192 \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u2192 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 serial-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0440\u0442\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Ctrl+F5, \u0447\u0442\u043e\u0431\u044b \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u0435\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043f\u043e\u043b\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0434 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u2014 1.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443 \u0441 \u043d\u0430\u0448\u0438\u043c \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b37\/30b\/b91\/b3730bb91cdf4dc52858021933a33149.png\" alt=\"\u0424\u0430\u0439\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435\" title=\"\u0424\u0430\u0439\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435\" width=\"1001\" height=\"712\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b37\/30b\/b91\/b3730bb91cdf4dc52858021933a33149.png\"\/><figcaption>\u0424\u0430\u0439\u043b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c22\/5ef\/bd1\/c225efbd1877fe60780f1e23ad47a58e.png\" alt=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d AD-SV\" title=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d AD-SV\" width=\"1067\" height=\"630\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c22\/5ef\/bd1\/c225efbd1877fe60780f1e23ad47a58e.png\"\/><figcaption>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d AD-SV<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5a5\/e16\/fb2\/5a5e16fb2c9f1a01837193d58c3d74e2.png\" alt=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Wiren Board\" title=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Wiren Board\" width=\"525\" height=\"280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5a5\/e16\/fb2\/5a5e16fb2c9f1a01837193d58c3d74e2.png\"\/><figcaption>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Wiren Board<\/figcaption><\/figure>\n<h3>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438<\/h3>\n<p>\u0412 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 Wiren Board \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0438\u0436\u043e\u043a \u043f\u0440\u0430\u0432\u0438\u043b <a href=\"https:\/\/github.com\/wirenboard\/wb-rules\" rel=\"noopener noreferrer nofollow\">wb-rules<\/a>, \u043d\u0430 \u043d\u0451\u043c \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c: \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 2000 \u0435\u0434\u0438\u043d\u0438\u0446, \u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0443\u043c\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0438\u0442\u0441\u044f. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0435\u0439 \u0438\u043b\u0438 \u0434\u043b\u044f \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0430 \u043e\u0431 \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0432\u0438\u043d\u043e-\u0432\u043e\u0434\u043e\u0447\u043d\u043e\u043c \u0437\u0430\u0432\u043e\u0434\u0435. \u0412\u0440\u043e\u0434\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0430\u0439\u043b \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u00ab\u041f\u0440\u0430\u0432\u0438\u043b\u0430\u00bb.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e <em>tvoc-control.js<\/em>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043a\u0430\u043a <code>\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e_\u0430\u0434\u0440\u0435\u0441\/\u043a\u043e\u043d\u0442\u0440\u043e\u043b<\/code>. \u0423\u0437\u043d\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b \u043c\u043e\u0436\u043d\u043e \u043a\u043b\u0438\u043a\u043d\u0443\u0432 \u043d\u0430 \u0438\u043c\u0435\u043d\u0438 \u043a\u0430\u043d\u0430\u043b\u0430 \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u00ab\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u00bb. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2b9\/f41\/90b\/2b9f4190b55a8a19fa8185f2733166f5.png\" alt=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0442\u043e\u043f\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430\" title=\"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0442\u043e\u043f\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430\" width=\"526\" height=\"280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2b9\/f41\/90b\/2b9f4190b55a8a19fa8185f2733166f5.png\"\/><figcaption>\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0442\u043e\u043f\u0438\u043a\u0430 \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430<\/figcaption><\/figure>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043c\u0435\u043d\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f TVOC <code>ad-sv_1\/TVOC<\/code>, \u0430 \u0437\u0443\u043c\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0432 \u0442\u043e\u043f\u0438\u043a\u0435 <code>buzzer\/enabled<\/code>.<\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u043e:<\/p>\n<pre><code class=\"javascript\">defineRule({     whenChanged: \"ad-sv_1\/TVOC\", \/\/ \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c     then: function(newValue, devName, cellName) {     if (newValue >2000) {         dev[\"buzzer\/enabled\"] = true;            } else {         dev[\"buzzer\/enabled\"] = false;     }     } });<\/code><\/pre>\n<p>\u0412\u0441\u0451, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 \u0441\u043a\u0440\u0438\u043f\u0442 <em>tvoc-control.js<\/em> \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\u00bb.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/49d\/b32\/b92\/49db32b9238a9859b992cf64acc9dd58.png\" alt=\"\u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435\" title=\"\u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435\" width=\"1166\" height=\"758\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/49d\/b32\/b92\/49db32b9238a9859b992cf64acc9dd58.png\"\/><figcaption>\u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435<\/figcaption><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0443\u0433\u043d\u0443\u043b\u043e\u0441\u044c \u2014 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c!<\/p>\n<p>\u0411\u0435\u0440\u0451\u043c \u0447\u0442\u043e-\u0442\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441 \u0441\u0438\u043b\u044c\u043d\u044b\u043c \u0437\u0430\u043f\u0430\u0445\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043f\u0438\u0440\u0442 \u0438 \u043f\u043e\u0434\u043d\u043e\u0441\u0438\u043c \u044d\u0442\u0443 \u0436\u0438\u0434\u043a\u043e\u0441\u0442\u044c \u043a \u0434\u0430\u0442\u0447\u0438\u043a\u0443. \u042f \u0432\u0437\u044f\u043b \u043e\u0431\u0435\u0437\u0436\u0438\u0440\u0438\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439, \u043e\u0442\u043a\u0440\u0443\u0442\u0438\u043b \u043a\u0440\u044b\u0448\u043a\u0443 \u0438 \u043f\u043e\u0434\u043d\u0451\u0441 \u0435\u0451 \u0432 \u0437\u043e\u043d\u0443, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0430\u0442\u0447\u0438\u043a \u2014 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0438\u0449\u0430\u043b \u0437\u0443\u043c\u043c\u0435\u0440. \u0421\u0442\u043e\u0438\u043b\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u0440\u044b\u0448\u043a\u0443 \u0441 \u043e\u0431\u0435\u0437\u0436\u0438\u0440\u0438\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0430\u0434\u0430\u0442\u044c \u2014 \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0435, \u0433\u0434\u0435 \u044f \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u043e\u043a\u043d\u043e \u0438 \u0438\u0437 \u043d\u0435\u0433\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0434\u0443\u0435\u0442. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u0430\u0440\u043e\u0432 \u0443\u043f\u0430\u043b\u0430 \u043d\u0438\u0436\u0435 2000 ppb, \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u0437\u0443\u043c\u043c\u0435\u0440. <\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u043f\u043e\u0434\u0441\u043a\u043e\u0447\u0438\u043b\u043e \u0440\u0430\u0441\u0447\u0451\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 eCO2 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0443\u043c\u043c\u0435\u0440\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9aa\/06e\/f55\/9aa06ef5502c2de40f5937f40d813e73.png\" alt=\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC \u043e\u043a\u043e\u043b\u043e \u043d\u0443\u043b\u044f \u2014 \u0437\u0443\u043c\u043c\u0435\u0440 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\" title=\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC \u043e\u043a\u043e\u043b\u043e \u043d\u0443\u043b\u044f \u2014 \u0437\u0443\u043c\u043c\u0435\u0440 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\" width=\"1059\" height=\"313\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9aa\/06e\/f55\/9aa06ef5502c2de40f5937f40d813e73.png\"\/><figcaption>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC \u043e\u043a\u043e\u043b\u043e \u043d\u0443\u043b\u044f \u2014 \u0437\u0443\u043c\u043c\u0435\u0440 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bb9\/6c5\/8f0\/bb96c58f05b378e4c97924234b278a47.png\" alt=\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC \u0432\u044b\u0448\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0445 2000 ppb \u2014 \u0437\u0443\u043c\u043c\u0435\u0440 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\" title=\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC \u0432\u044b\u0448\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0445 2000 ppb \u2014 \u0437\u0443\u043c\u043c\u0435\u0440 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\" width=\"1051\" height=\"315\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bb9\/6c5\/8f0\/bb96c58f05b378e4c97924234b278a47.png\"\/><figcaption>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC \u0432\u044b\u0448\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0445 2000 ppb \u2014 \u0437\u0443\u043c\u043c\u0435\u0440 \u0432\u043a\u043b\u044e\u0447\u0435\u043d<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fdd\/43a\/329\/fdd43a329c395cd4796932dce795d216.png\" alt=\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0445 2000 ppb \u2014 \u0437\u0443\u043c\u043c\u0435\u0440 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\" title=\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0445 2000 ppb \u2014 \u0437\u0443\u043c\u043c\u0435\u0440 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\" width=\"1052\" height=\"319\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fdd\/43a\/329\/fdd43a329c395cd4796932dce795d216.png\"\/><figcaption>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TVOC \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0445 2000 ppb \u2014 \u0437\u0443\u043c\u043c\u0435\u0440 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d<\/figcaption><\/figure>\n<h2>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h2>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435:<\/p>\n<ul>\n<li>\n<p>\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 Modbus RTU;<\/p>\n<\/li>\n<li>\n<p>\u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043b\u0435\u0442\u0443\u0447\u0438\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u0435\u0449\u0435\u0441\u0442\u0432 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u044d\u043d\u0435\u0440\u0433\u043e\u043d\u0435\u0437\u0435\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043d\u0441\u043e\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c, \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u0431\u044b\u043b\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 Wiren Board.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0440\u043e\u0434\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e, \u043d\u043e \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>\u0421\u0435\u043d\u0441\u043e\u0440 CCS811 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0433\u0440\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u00ab\u043f\u043b\u044b\u0442\u044c\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u043d\u0441\u043e\u0440 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, BMP280 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0435\u0440\u043c\u043e\u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0430\u0446\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 Baseline.<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u043d\u0430 \u043c\u0430\u043a\u0435\u0442\u043a\u0435, \u043d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0441\u0442\u0438 \u0438 \u0438\u0437\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043f\u0435\u0447\u0430\u0442\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0443. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0438\u0442\u0430\u043d\u0438\u044f, \u043e\u0431\u044b\u0447\u043d\u043e \u0432 \u0448\u0438\u043d\u0435 RS-485 \u043e\u0442 12 \u0434\u043e 24 \u0412.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e Modbus \u2014 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043d\u0430\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0415\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u043d\u0443\u0436\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 Wi-Fi \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u043f\u043e OTA.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043e\u0442\u043a\u043b\u0430\u043d\u044f\u0442\u044c\u0441\u044f, \u0434\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 \u043d\u043e\u0432\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445!<\/p>\n<p>\u0421\u0441\u044b\u043b\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/aadegtyarev\/esp-modbusrtu-demo\/tree\/main\/habr-article\" rel=\"noopener noreferrer nofollow\">\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043a \u0441\u0442\u0430\u0442\u044c\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/aadegtyarev\/esp-modbusrtu-demo\/tree\/main\/arduino-esp8266-modbus-rtu-server\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e Modbus RTU \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \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\/716966\/\"> https:\/\/habr.com\/ru\/post\/716966\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c<\/h2>\n<p>\u0414\u0430\u0432\u043d\u043e \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0443 \u0441\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u0449\u0438\u043a\u043e\u0432 \u0441\u0435\u043d\u0441\u043e\u0440 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 <a href=\"https:\/\/www.sciosense.com\/wp-content\/uploads\/documents\/SC-001232-DS-3-CCS811B-Datasheet-Revision-2.pdf\" rel=\"noopener noreferrer nofollow\">CCS811<\/a> \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0441 SGP30 \u0438\u043b\u0438 SGPC3. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0435\u043d\u0441\u043e\u0440 TVOC \u0438 \u043d\u043e\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 eCO2 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c \u0443\u0433\u043b\u0435\u043a\u0438\u0441\u043b\u043e\u0433\u043e \u0433\u0430\u0437\u0430.<\/p>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 Wiren Board \u0441 \u0440\u043e\u0434\u043d\u044b\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c Modbus RTU, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043c\u043e\u0451 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443.<\/p>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 Modbus RTU \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043e\u043a.<\/p>\n<p>\u041f\u043e\u0442\u043e\u043c \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0441\u0435\u043d\u0441\u043e\u0440 CCS811 \u0438 \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<p>\u0418 \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 Wiren Board: \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 wb-mqtt-serial \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0437\u044f\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u043a\u0435\u0442\u0447\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430 \u043b\u044e\u0431\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u044e \u043f\u0440\u043e\u0439\u0442\u0438 \u0441\u043e \u043c\u043d\u043e\u0439 \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u043e\u0442 \u0438\u0434\u0435\u0438 \u0434\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430.<\/p>\n<h2>\u0427\u0442\u043e \u0437\u0430 \u0437\u0432\u0435\u0440\u044c Modbus RTU<\/h2>\n<p>Modbus RTU \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u0448\u0438\u043d\u044b RS-485.<\/p>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c, \u0430 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u044f \u2014 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438. \u0415\u0449\u0451 \u0433\u043e\u0434\u0430 \u0434\u0432\u0430 \u043d\u0430\u0437\u0430\u0434 \u043a\u043b\u0438\u0435\u043d\u0442 \u0431\u044b\u043b \u043c\u0430\u0441\u0442\u0435\u0440\u043e\u043c (master), \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043b\u0435\u0439\u0432\u043e\u043c (slave), \u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 <a href=\"https:\/\/www.modbus.org\/docs\/Client-ServerPR-07-2020-final.docx.pdf\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u043c\u0435\u043d\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f<\/a>.<\/p>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0448\u0438\u043d\u044b \u0438 \u043c\u043d\u043e\u0433\u043e modbus-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u044f\u0447\u0435\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0441\u043d\u0430\u0440\u0443\u0436\u0438.<\/p>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u043d\u0438\u0445 \u0441\u0432\u043e\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u043b\u0435.<\/p>\n<figure class=\"full-width\"><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u041a\u043b\u0438\u0435\u043d\u0442-\u0421\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Modbus<\/figcaption><\/figure>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043d\u0430\u043c \u0442\u0438\u043f\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>Coils (1 \u0431\u0438\u0442, \u0447\u0442\u0435\u043d\u0438\u0435-\u0437\u0430\u043f\u0438\u0441\u044c, 1 \u0438\u043b\u0438 0) \u2014 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0432\u044b\u0445\u043e\u0434, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c.<\/p>\n<\/li>\n<li>\n<p>Discrete Input (1 \u0431\u0438\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435, 1 \u0438\u043b\u0438 0) \u2014 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0432\u0445\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>Input Register (16 \u0431\u0438\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435, 0&#8230;65535) \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0432\u0432\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>Holding (16 \u0431\u0438\u0442, \u0447\u0442\u0435\u043d\u0438\u0435-\u0437\u0430\u043f\u0438\u0441\u044c, 0&#8230;65535) \u2014 \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>0x02 \u2014 \u0447\u0442\u0435\u043d\u0438\u0435 Discrete Input.<\/p>\n<\/li>\n<li>\n<p>0x03 \u2014 \u0447\u0442\u0435\u043d\u0438\u0435 Holding.<\/p>\n<\/li>\n<li>\n<p>0x04 \u2014 \u0447\u0442\u0435\u043d\u0438\u0435 Input Register<\/p>\n<\/li>\n<li>\n<p>0x06 \u2014 \u0437\u0430\u043f\u0438\u0441\u044c Holding.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/mcs.mail.ru\/blog\/modbus-dlya-m2m-vzaimodejstviya\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<\/p>\n<h2>\u0416\u0435\u043b\u0435\u0437\u043a\u0438<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0436\u0435\u043b\u0435\u0437\u043a\u0438.<\/p>\n<p>\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u0435\u043d\u0441\u043e\u0440 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 (TVOC) \u2014 \u044f \u0432\u043e\u0437\u044c\u043c\u0443 CCS811.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u044f \u0432\u043e\u0437\u044c\u043c\u0443 ESP8266 \u2014 \u043e\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0434\u043e\u0440\u043e\u0433\u043e\u0439, \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438, \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u043e\u043d \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f, \u044f \u0432\u043e\u0437\u044c\u043c\u0443 \u043f\u043b\u0430\u0442\u043a\u0443 NodeMCU \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c ESP12F (ESP8266), \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u0440\u0443\u0436\u0443 GPIO.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0430 NodeMCU, \u0432\u0437\u044f\u0442\u043e \u0441 lastminuteengineers.com<\/figcaption><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c ESP8266 \u043a \u0448\u0438\u043d\u0435 RS-485, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0440\u043e\u0432\u043d\u0435\u0439 UART \u2192 RS-485, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0445\u0435\u043c\u0435 MAX485 HW-97 \u0438 \u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0435 \u0431\u0440\u0430\u0442\u044c\u044f.<\/p>\n<p>\u0415\u0449\u0451 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c USB-RS485, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0443. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043b\u044e\u0431\u043e\u0439 \u0441 Aliexpress, \u044f \u0432\u043e\u0437\u044c\u043c\u0443 WB-USB485. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043b\u0430\u0442\u0443 \u044f \u0431\u0443\u0434\u0443 \u043f\u0438\u0442\u0430\u0442\u044c \u043e\u0442 USB-\u043f\u043e\u0440\u0442\u0430 \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435\u043c 5 \u0412.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043b\u044e\u0431\u0430\u044f \u0442\u0430\u043a\u0442\u043e\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430, \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043e\u043d\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<p>\u0416\u0435\u043b\u0435\u0437\u043a\u0438 \u0441\u043e\u0431\u0440\u0430\u043b\u0438, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u043d\u0438\u0436\u0435 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0421\u0435\u043d\u0441\u043e\u0440 CCS811 \u043f\u043e\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043a\u0435.<\/p>\n<figure class=\"full-width\"><figcaption>\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption>\u041c\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0430 \u043d\u0430 \u0441\u0442\u043e\u043b\u0435<\/figcaption><\/figure>\n<h2>\u041f\u0440\u043e\u0448\u0438\u0432\u043a\u0430<\/h2>\n<p>\u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442-\u0441\u0430\u043c\u043e\u0437\u0432\u0430\u043d\u0435\u0446, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0443 \u0432 \u0441\u0440\u0435\u0434\u0435 Arduino, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u0441\u043a\u0435\u0442\u0447\u0438) \u0434\u043b\u044f Embedded \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 C++.<\/p>\n<h3>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0441\u0440\u0435\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h3>\n<p>\u041f\u0438\u0441\u0430\u0442\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434 ESP8266, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0441\u0440\u0435\u0434\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0448\u0430\u0433\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Arduino.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u043b\u0430\u0442 ESP8266, <a href=\"https:\/\/wiki.iarduino.ru\/page\/wemos_start\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043b\u0430\u0442\u0443 \u0432 \u043c\u0435\u043d\u044e \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u2192 \u041f\u043b\u0430\u0442\u0430 \u2192 Generic ESP8266 Module \u0438\u043b\u0438 \u043f\u043b\u0430\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443 \u0432\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0418 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443: \u043c\u0435\u043d\u044e \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u2192 \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438. \u0412 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u0449\u0435\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/github.com\/emelianov\/modbus-esp8266\" rel=\"noopener noreferrer nofollow\">modbus-esp8266<\/a>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0441\u0451, \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0442\u0432\u043e\u0440\u0438\u0442\u044c. \u0412 \u043a\u043e\u0434\u0435 \u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043d\u043e\u043c\u0435\u0440\u0430 GPIO, \u0430 \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u043f\u043b\u0430\u0442\u044b \u0438\u043c\u0435\u043d\u0430 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u2014 \u043f\u043e \u0437\u0430\u0434\u0443\u043c\u043a\u0435, \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043b\u0430\u0442.<\/p>\n<h3>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 Modbus-\u0441\u0435\u0440\u0432\u0435\u0440<\/h3>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c modbus-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c 1, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f 9600 8N2, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 holding-\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c 3.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0441\u043a\u0435\u0442\u0447\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0417\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u0435\u043c, \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043d\u0430\u0448\u0430 \u043f\u043b\u0430\u0442\u0430 \u0432 \u043c\u0435\u043d\u044e \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0435\u0441\u0442\u044c \u043a\u043e\u0434 \u0432 \u043e\u043a\u043d\u0435.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0435\u0442\u0447 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f.<\/p>\n<pre><code class=\"cpp\">\/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 modbus-esp8266 #include &lt;ModbusRTU.h>  \/\/ \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Modbus #define SLAVE_ID 1 \/\/ \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 #define PIN_FLOW 4 \/\/ \u043f\u0438\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0451\u043c\u0430\/\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, \/\/ \u0435\u0441\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 UART-RS485 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442 \u2014 \/\/ \u0437\u0430\u043a\u043e\u043c\u0435\u043d\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u043e\u043a\u0443  \/\/ \u041d\u043e\u043c\u0435\u0440\u0430 Modbus \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 #define REG_TEST 0       \/\/ \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c 0  ModbusRTU mb;  void setup() {   modbus_setup(); }  void loop() {   mb.task(); }  void modbus_setup() {   Serial.begin(9600, SERIAL_8N2); \/\/ \u0437\u0430\u0434\u0430\u0451\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0440\u044b \u0441\u0432\u044f\u0437\u0438   mb.begin(&amp;Serial);   mb.begin(&amp;Serial, PIN_FLOW); \/\/ \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0451\u043c\u0430\/\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438   mb.slave(SLAVE_ID); \/\/ \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430    mb.addHreg(REG_TEST); \/\/ \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 REG_TEST \u0442\u0438\u043f\u0430 Holding   mb.Hreg(REG_TEST, 3); \/\/ \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043d\u0430\u0448 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 REG_TEST \u0447\u0438\u0441\u043b\u043e 3 \u2014   \/\/ \u0435\u0433\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u0438 \u043e\u043f\u0440\u043e\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 }<\/code><\/pre>\n<p>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0444\u0430\u0439\u043b <a href=\"https:\/\/github.com\/aadegtyarev\/esp-modbusrtu-demo\/tree\/main\/habr-article\/ver1\" rel=\"noopener noreferrer nofollow\">ver1.ino<\/a>.<\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0432\u043e\u044e \u043f\u043b\u0430\u0442\u0443 \u043a \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c Ctrl+U \u2014 \u044d\u0442\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0435\u0442\u0447 \u0438 \u0437\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p>\u0412\u043e\u0442 \u043e\u043d\u0438, \u0437\u0430\u0432\u0435\u0442\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430:<\/p>\n<pre><code class=\"bash\">Leaving... Hard resetting via RTS pin...<\/code><\/pre>\n<p>\u0410 \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435? \u0421\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043c\u044b \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438, \u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0435\u0442 \u2014 \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u0414\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u043e Modbus \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Modbus RTU. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u0433\u0443 \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>Windows: Rilheva Modbus Poll.<\/p>\n<\/li>\n<li>\n<p>Linux: \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 modbus_client \u0438\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 QMaster.<\/p>\n<\/li>\n<li>\n<p>MacOS \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <code>cu<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043e\u0434\u0438\u043d: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435 \u043a \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u0438\u043a USB-RS485, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u043e\u043c\u0435\u0440 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0434\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u0438\u043a\u0438.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u2014 9600 8N2<\/p>\n<\/li>\n<li>\n<p>\u0410\u0434\u0440\u0435\u0441 \u2014 1<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440 Holding \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c 0.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u043d\u0430\u0434\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430. \u0414\u043b\u044f holding-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u044d\u0442\u043e 0x03 \u2014 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 0x06 \u0437\u0430\u043f\u0438\u0441\u044c.<\/p>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Linux, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0447\u0435\u0440\u0435\u0437 modbus_client, \u043e\u043d\u043e \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 <code>dev\/ttyACM0<\/code> \u2014 \u0443 \u0432\u0430\u0441 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>\u0421\u0447\u0438\u0442\u0430\u0435\u043c \u043d\u0430\u0448 \u0440\u0435\u0433\u0438\u0441\u0442\u0440:<\/p>\n<pre><code class=\"bash\">$ modbus_client -mrtu -b9600 -d8 -pnone -s2 \/dev\/ttyACM0 -a1 -t0x03 -r0  SUCCESS: read 1 of elements:         Data: 0x0003 <\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0443\u0434\u0430 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0432\u043e\u0451, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0438\u0441\u043b\u043e 1 \u0438 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 0x03 (\u0447\u0442\u0435\u043d\u0438\u0435 holding) \u043d\u0430 0x06 (\u0437\u0430\u043f\u0438\u0441\u044c holding):<\/p>\n<pre><code class=\"bash\">$ modbus_client -mrtu -b9600 -d8 -pnone -s2 \/dev\/ttyACM0 -a1 -t0x06 -r0 1                           SUCCESS: written 1 elements!<\/code><\/pre>\n<p>\u0418 \u0441\u043d\u043e\u0432\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u043c:<\/p>\n<pre><code class=\"bash\">modbus_client -mrtu -b9600 -d8 -pnone -s2 \/dev\/ttyACM0 -a1 -t0x03 -r0                                         SUCCESS: read 1 of elements:         Data: 0x0001<\/code><\/pre>\n<p>\u0423\u0440\u0430! \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0434\u0438\u043d\u0438\u0447\u043a\u0430. \u0422\u0430\u043a\u0438\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0430\u0440\u043e\u0439 \u0441\u043e\u0442\u0435\u043d \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u0448\u0438\u043d\u0435.<\/p>\n<figure class=\"full-width\"><figcaption>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0435\u0442\u0447\u0430 ver1.ino<\/figcaption><\/figure>\n<h3>\u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438<\/h3>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439 \u0441\u0435\u043d\u0441\u043e\u0440 \u0438 \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e! \u041d\u043e \u043d\u0435\u0442, \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0438 \u044d\u0442\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043c\u0443\u0447\u0438\u043b\u0441\u044f, \u0434\u0430\u0434\u0438\u043c \u0435\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438 \u0447\u0435\u0440\u0435\u0437 Modbus-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b. \u0422\u0430\u043a \u043e\u043d \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0448\u0438\u043d\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438.<\/p>\n<p>\u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 \u0438 \u0430\u0434\u0440\u0435\u0441, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0440\u0438 holding-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u0434\u0430\u0434\u0438\u043c \u0438\u043c \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0438\u0445 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0410\u0434\u0440\u0435\u0441\u0430 Modbus-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0441\u0432\u044f\u0437\u0438 #define REG_MB_ADDRESS    100 \/\/ \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0448\u0438\u043d\u0435 #define REG_MB_STOP_BITS  101 \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 #define REG_MB_BAUDRATE   102 \/\/ \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u2014 EEPROM:<\/p>\n<pre><code class=\"cpp\">#define EEPROM_SIZE           6 \/\/ \u043c\u044b \u0437\u0430\u0439\u043c\u0451\u043c 6 \u044f\u0447\u0435\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438: 3*2=6 #define EEPROM_MB_ADDRESS     0 \/\/ \u043d\u043e\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 #define EEPROM_MB_STOP_BITS   2 \/\/ \u043d\u043e\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u043f-\u0431\u0438\u0442\u0430\u043c\u0438 #define EEPROM_MB_BAUDRATE    4 \/\/ \u043d\u043e\u043c\u0435\u0440 \u044f\u0447\u0435\u0439\u043a\u0438 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 EEPROM \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0447\u0438\u0441\u043b\u0430 \u0442\u0438\u043f\u0430 uint16_t, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 ESP8266\/ESP32 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 4 \u0431\u0430\u0439\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0439\u043c\u0451\u0442 \u0434\u0432\u0435 \u044f\u0447\u0435\u0439\u043a\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e 6 \u044f\u0447\u0435\u0435\u043a.<\/p>\n<p>\u0415\u0449\u0451 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0443 \u043c\u0435\u043d\u044f \u0431\u0443\u0434\u0435\u0442 9600 8N2:<\/p>\n<pre><code class=\"cpp\">#define DEFAULT_MB_ADDRESS    1  \/\/ \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 #define DEFAULT_MB_STOP_BITS  2  \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 #define DEFAULT_MB_BAUDRATE   96 \/\/ \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/100<\/code><\/pre>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 115200 \u2014 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0440\u0435\u0433\u0438\u0441\u0442\u0440: 65535. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u043f\u043e\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043d\u0430 100, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 9600 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f 9600\/100 = 96.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u0443\u0434\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438 \u0438\u0437 EEPROM \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0438\u0445 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 modbus-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">uint16_t mbAddress = DEFAULT_MB_ADDRESS; \/\/ modbus \u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 uint16_t mbStopBits = DEFAULT_MB_STOP_BITS; \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 uint16_t mbBaudrate = DEFAULT_MB_BAUDRATE; \/\/ \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f modbus<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441<\/p>\n<\/div>\n<\/div>\n<\/div>\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-345499","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/345499","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=345499"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/345499\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=345499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=345499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=345499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}