diff --git a/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.pl.png b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.pl.png new file mode 100644 index 00000000..1ba4f5c7 Binary files /dev/null and b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.pl.png differ diff --git a/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.pl.png b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.pl.png new file mode 100644 index 00000000..3cac91bb Binary files /dev/null and b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.pl.png differ diff --git a/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.pl.png b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.pl.png new file mode 100644 index 00000000..967e6539 Binary files /dev/null and b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.pl.png differ diff --git a/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.pl.png b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.pl.png new file mode 100644 index 00000000..247c1dd6 Binary files /dev/null and b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.pl.png differ diff --git a/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.pl.png b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.pl.png new file mode 100644 index 00000000..e89d81c4 Binary files /dev/null and b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.pl.png differ diff --git a/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.pl.png b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.pl.png new file mode 100644 index 00000000..0237836d Binary files /dev/null and b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.pl.png differ diff --git a/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.pl.png b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.pl.png new file mode 100644 index 00000000..4229fee0 Binary files /dev/null and b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.pl.png differ diff --git a/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.pl.png b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.pl.png new file mode 100644 index 00000000..9b503ac8 Binary files /dev/null and b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.pl.png differ diff --git a/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.pl.png b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.pl.png new file mode 100644 index 00000000..c98b7aaf Binary files /dev/null and b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.pl.png differ diff --git a/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.pl.png b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.pl.png new file mode 100644 index 00000000..706f83bc Binary files /dev/null and b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.pl.png differ diff --git a/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.pl.png b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.pl.png new file mode 100644 index 00000000..76bec4da Binary files /dev/null and b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.pl.png differ diff --git a/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.pl.png b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.pl.png new file mode 100644 index 00000000..b49060a2 Binary files /dev/null and b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.pl.png differ diff --git a/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.pl.png b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.pl.png new file mode 100644 index 00000000..3ca064d5 Binary files /dev/null and b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.pl.png differ diff --git a/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.pl.png b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.pl.png new file mode 100644 index 00000000..1f5f2412 Binary files /dev/null and b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.pl.png differ diff --git a/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.pl.png b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.pl.png new file mode 100644 index 00000000..2953cea1 Binary files /dev/null and b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.pl.png differ diff --git a/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.pl.png b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.pl.png new file mode 100644 index 00000000..2ce7dedf Binary files /dev/null and b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.pl.png differ diff --git a/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.pl.png b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.pl.png new file mode 100644 index 00000000..157c08c6 Binary files /dev/null and b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.pl.png differ diff --git a/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.pl.png b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.pl.png new file mode 100644 index 00000000..031361a6 Binary files /dev/null and b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.pl.png differ diff --git a/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.pl.png b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.pl.png new file mode 100644 index 00000000..3a43eb23 Binary files /dev/null and b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.pl.png differ diff --git a/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.pl.png b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.pl.png new file mode 100644 index 00000000..7c9552e3 Binary files /dev/null and b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.pl.png differ diff --git a/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.pl.png b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.pl.png new file mode 100644 index 00000000..78f695b7 Binary files /dev/null and b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.pl.png differ diff --git a/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.pl.png b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.pl.png new file mode 100644 index 00000000..77f563fb Binary files /dev/null and b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.pl.png differ diff --git a/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.pl.png b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.pl.png new file mode 100644 index 00000000..8dccd514 Binary files /dev/null and b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.pl.png differ diff --git a/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.pl.png b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.pl.png new file mode 100644 index 00000000..b75e015e Binary files /dev/null and b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.pl.png differ diff --git a/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.pl.png b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.pl.png new file mode 100644 index 00000000..5bfed282 Binary files /dev/null and b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.pl.png differ diff --git a/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.pl.png b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.pl.png new file mode 100644 index 00000000..34ca765c Binary files /dev/null and b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.pl.png differ diff --git a/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.pl.png b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.pl.png new file mode 100644 index 00000000..d1f7bc09 Binary files /dev/null and b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.pl.png differ diff --git a/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.pl.png b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.pl.png new file mode 100644 index 00000000..c215b446 Binary files /dev/null and b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.pl.png differ diff --git a/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.pl.png b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.pl.png new file mode 100644 index 00000000..63f58daa Binary files /dev/null and b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.pl.png differ diff --git a/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.pl.png b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.pl.png new file mode 100644 index 00000000..3eb38501 Binary files /dev/null and b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.pl.png differ diff --git a/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.pl.png b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.pl.png new file mode 100644 index 00000000..4f960870 Binary files /dev/null and b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.pl.png differ diff --git a/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.pl.png b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.pl.png new file mode 100644 index 00000000..ca5b5882 Binary files /dev/null and b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.pl.png differ diff --git a/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.pl.png b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.pl.png new file mode 100644 index 00000000..2c3440cd Binary files /dev/null and b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.pl.png differ diff --git a/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.pl.png b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.pl.png new file mode 100644 index 00000000..5294a9dc Binary files /dev/null and b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.pl.png differ diff --git a/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.pl.png b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.pl.png new file mode 100644 index 00000000..912ac4ca Binary files /dev/null and b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.pl.png differ diff --git a/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.pl.png b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.pl.png new file mode 100644 index 00000000..8e47de7d Binary files /dev/null and b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.pl.png differ diff --git a/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.pl.png b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.pl.png new file mode 100644 index 00000000..b3c98d83 Binary files /dev/null and b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.pl.png differ diff --git a/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.pl.png b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.pl.png new file mode 100644 index 00000000..1d494613 Binary files /dev/null and b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.pl.png differ diff --git a/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.pl.png b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.pl.png new file mode 100644 index 00000000..47ced39a Binary files /dev/null and b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.pl.png differ diff --git a/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.pl.png b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.pl.png new file mode 100644 index 00000000..88d5c896 Binary files /dev/null and b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.pl.png differ diff --git a/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.pl.png b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.pl.png new file mode 100644 index 00000000..e0706533 Binary files /dev/null and b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.pl.png differ diff --git a/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.pl.png b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.pl.png new file mode 100644 index 00000000..a1f17249 Binary files /dev/null and b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.pl.png differ diff --git a/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.pl.png b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.pl.png new file mode 100644 index 00000000..3adc61ef Binary files /dev/null and b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.pl.png differ diff --git a/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.pl.png b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.pl.png new file mode 100644 index 00000000..1c3c8d53 Binary files /dev/null and b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.pl.png differ diff --git a/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.pl.jpg b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.pl.jpg new file mode 100644 index 00000000..0f4a9a38 Binary files /dev/null and b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.pl.jpg differ diff --git a/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.pl.png b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.pl.png new file mode 100644 index 00000000..32dab60c Binary files /dev/null and b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.pl.png differ diff --git a/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.pl.png b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.pl.png new file mode 100644 index 00000000..78e9b675 Binary files /dev/null and b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.pl.png differ diff --git a/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.pl.png b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.pl.png new file mode 100644 index 00000000..fb87dd71 Binary files /dev/null and b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.pl.png differ diff --git a/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.pl.png b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.pl.png new file mode 100644 index 00000000..acaa9a02 Binary files /dev/null and b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.pl.png differ diff --git a/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.pl.png b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.pl.png new file mode 100644 index 00000000..b6afaa8a Binary files /dev/null and b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.pl.png differ diff --git a/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.pl.png b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.pl.png new file mode 100644 index 00000000..18f92ede Binary files /dev/null and b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.pl.png differ diff --git a/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.pl.png b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.pl.png new file mode 100644 index 00000000..e1eb6df0 Binary files /dev/null and b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.pl.png differ diff --git a/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.pl.png b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.pl.png new file mode 100644 index 00000000..dfcfde45 Binary files /dev/null and b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.pl.png differ diff --git a/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.pl.png b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.pl.png new file mode 100644 index 00000000..44af1896 Binary files /dev/null and b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.pl.png differ diff --git a/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.pl.png b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.pl.png new file mode 100644 index 00000000..6d749e6c Binary files /dev/null and b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.pl.png differ diff --git a/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.pl.png b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.pl.png new file mode 100644 index 00000000..7485e36c Binary files /dev/null and b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.pl.png differ diff --git a/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.pl.png b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.pl.png new file mode 100644 index 00000000..0f499097 Binary files /dev/null and b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.pl.png differ diff --git a/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.pl.png b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.pl.png new file mode 100644 index 00000000..710c440c Binary files /dev/null and b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.pl.png differ diff --git a/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.pl.png b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.pl.png new file mode 100644 index 00000000..24cecced Binary files /dev/null and b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.pl.png differ diff --git a/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.pl.png b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.pl.png new file mode 100644 index 00000000..b36025d9 Binary files /dev/null and b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.pl.png differ diff --git a/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.pl.png b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.pl.png new file mode 100644 index 00000000..b21a4bed Binary files /dev/null and b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.pl.png differ diff --git a/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.pl.png b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.pl.png new file mode 100644 index 00000000..8da6f9a4 Binary files /dev/null and b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.pl.png differ diff --git a/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.pl.jpg b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.pl.jpg new file mode 100644 index 00000000..437f3d07 Binary files /dev/null and b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.pl.jpg differ diff --git a/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.pl.png b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.pl.png new file mode 100644 index 00000000..cc61fb13 Binary files /dev/null and b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.pl.png differ diff --git a/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.pl.png b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.pl.png new file mode 100644 index 00000000..3472b1d9 Binary files /dev/null and b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.pl.png differ diff --git a/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.pl.png b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.pl.png new file mode 100644 index 00000000..0bbca602 Binary files /dev/null and b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.pl.png differ diff --git a/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.pl.png b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.pl.png new file mode 100644 index 00000000..b5775adc Binary files /dev/null and b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.pl.png differ diff --git a/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.pl.png b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.pl.png new file mode 100644 index 00000000..bc58477a Binary files /dev/null and b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.pl.png differ diff --git a/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.pl.png b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.pl.png new file mode 100644 index 00000000..1b7a40f4 Binary files /dev/null and b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.pl.png differ diff --git a/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.pl.png b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.pl.png new file mode 100644 index 00000000..011b07a3 Binary files /dev/null and b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.pl.png differ diff --git a/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.pl.png b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.pl.png new file mode 100644 index 00000000..7f9d24ef Binary files /dev/null and b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.pl.png differ diff --git a/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.pl.png b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.pl.png new file mode 100644 index 00000000..0c6a7067 Binary files /dev/null and b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.pl.png differ diff --git a/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.pl.png b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.pl.png new file mode 100644 index 00000000..8f7968a5 Binary files /dev/null and b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.pl.png differ diff --git a/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.pl.png b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.pl.png new file mode 100644 index 00000000..20c6036f Binary files /dev/null and b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.pl.png differ diff --git a/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.pl.png b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.pl.png new file mode 100644 index 00000000..f077b6e9 Binary files /dev/null and b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.pl.png differ diff --git a/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.pl.png b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.pl.png new file mode 100644 index 00000000..484206d5 Binary files /dev/null and b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.pl.png differ diff --git a/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.pl.png b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.pl.png new file mode 100644 index 00000000..9fa156e2 Binary files /dev/null and b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.pl.png differ diff --git a/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.pl.png b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.pl.png new file mode 100644 index 00000000..b0813972 Binary files /dev/null and b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.pl.png differ diff --git a/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.pl.png b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.pl.png new file mode 100644 index 00000000..4f2da8dc Binary files /dev/null and b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.pl.png differ diff --git a/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.pl.png b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.pl.png new file mode 100644 index 00000000..8ae3904c Binary files /dev/null and b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.pl.png differ diff --git a/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.pl.png b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.pl.png new file mode 100644 index 00000000..ea5cbe30 Binary files /dev/null and b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.pl.png differ diff --git a/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.pl.png b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.pl.png new file mode 100644 index 00000000..eab9fb03 Binary files /dev/null and b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.pl.png differ diff --git a/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.pl.png b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.pl.png new file mode 100644 index 00000000..c49c0459 Binary files /dev/null and b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.pl.png differ diff --git a/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.pl.png b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.pl.png new file mode 100644 index 00000000..127b0257 Binary files /dev/null and b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.pl.png differ diff --git a/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.pl.png b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.pl.png new file mode 100644 index 00000000..0b528799 Binary files /dev/null and b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.pl.png differ diff --git a/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.pl.png b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.pl.png new file mode 100644 index 00000000..e5b04c65 Binary files /dev/null and b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.pl.png differ diff --git a/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.pl.png b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.pl.png new file mode 100644 index 00000000..46543926 Binary files /dev/null and b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.pl.png differ diff --git a/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.pl.png b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.pl.png new file mode 100644 index 00000000..46e99668 Binary files /dev/null and b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.pl.png differ diff --git a/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.pl.png b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.pl.png new file mode 100644 index 00000000..c012d47d Binary files /dev/null and b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.pl.png differ diff --git a/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.pl.png b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.pl.png new file mode 100644 index 00000000..fa44061a Binary files /dev/null and b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.pl.png differ diff --git a/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.pl.png b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.pl.png new file mode 100644 index 00000000..e499b2fd Binary files /dev/null and b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.pl.png differ diff --git a/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.pl.png b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.pl.png new file mode 100644 index 00000000..66e9927a Binary files /dev/null and b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.pl.png differ diff --git a/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.pl.png b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.pl.png new file mode 100644 index 00000000..e512cf63 Binary files /dev/null and b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.pl.png differ diff --git a/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.pl.png b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.pl.png new file mode 100644 index 00000000..89e41b8a Binary files /dev/null and b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.pl.png differ diff --git a/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.pl.png b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.pl.png new file mode 100644 index 00000000..257c3e55 Binary files /dev/null and b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.pl.png differ diff --git a/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.pl.png b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.pl.png new file mode 100644 index 00000000..85a581ed Binary files /dev/null and b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.pl.png differ diff --git a/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.pl.png b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.pl.png new file mode 100644 index 00000000..c07f67c3 Binary files /dev/null and b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.pl.png differ diff --git a/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.pl.png b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.pl.png new file mode 100644 index 00000000..c598913b Binary files /dev/null and b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.pl.png differ diff --git a/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.pl.png b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.pl.png new file mode 100644 index 00000000..a630a6f3 Binary files /dev/null and b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.pl.png differ diff --git a/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.pl.png b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.pl.png new file mode 100644 index 00000000..f63ad48d Binary files /dev/null and b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.pl.png differ diff --git a/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.pl.png b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.pl.png new file mode 100644 index 00000000..73c0aea6 Binary files /dev/null and b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.pl.png differ diff --git a/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.pl.png b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.pl.png new file mode 100644 index 00000000..0768efbc Binary files /dev/null and b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.pl.png differ diff --git a/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.pl.png b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.pl.png new file mode 100644 index 00000000..a6c3afe8 Binary files /dev/null and b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.pl.png differ diff --git a/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.pl.png b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.pl.png new file mode 100644 index 00000000..eed10ecb Binary files /dev/null and b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.pl.png differ diff --git a/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.pl.png b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.pl.png new file mode 100644 index 00000000..4c086050 Binary files /dev/null and b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.pl.png differ diff --git a/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.pl.png b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.pl.png new file mode 100644 index 00000000..9f641588 Binary files /dev/null and b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.pl.png differ diff --git a/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.pl.png b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.pl.png new file mode 100644 index 00000000..9404843f Binary files /dev/null and b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.pl.png differ diff --git a/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.pl.png b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.pl.png new file mode 100644 index 00000000..9636ac68 Binary files /dev/null and b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.pl.png differ diff --git a/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.pl.png b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.pl.png new file mode 100644 index 00000000..38a2b35d Binary files /dev/null and b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.pl.png differ diff --git a/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.pl.png b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.pl.png new file mode 100644 index 00000000..cd09e177 Binary files /dev/null and b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.pl.png differ diff --git a/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.pl.png b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.pl.png new file mode 100644 index 00000000..4cc4f4bc Binary files /dev/null and b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.pl.png differ diff --git a/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.pl.png b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.pl.png new file mode 100644 index 00000000..33e03220 Binary files /dev/null and b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.pl.png differ diff --git a/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.pl.png b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.pl.png new file mode 100644 index 00000000..489d49e3 Binary files /dev/null and b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.pl.png differ diff --git a/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.pl.png b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.pl.png new file mode 100644 index 00000000..80b39b63 Binary files /dev/null and b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.pl.png differ diff --git a/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.pl.png b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.pl.png new file mode 100644 index 00000000..2404a4ce Binary files /dev/null and b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.pl.png differ diff --git a/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.pl.png b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.pl.png new file mode 100644 index 00000000..f884cc81 Binary files /dev/null and b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.pl.png differ diff --git a/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.pl.png b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.pl.png new file mode 100644 index 00000000..9f649bd1 Binary files /dev/null and b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.pl.png differ diff --git a/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.pl.png b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.pl.png new file mode 100644 index 00000000..03e1fa8c Binary files /dev/null and b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.pl.png differ diff --git a/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.pl.png b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.pl.png new file mode 100644 index 00000000..983f836f Binary files /dev/null and b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.pl.png differ diff --git a/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.pl.png b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.pl.png new file mode 100644 index 00000000..2aede939 Binary files /dev/null and b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.pl.png differ diff --git a/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.pl.png b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.pl.png new file mode 100644 index 00000000..7bc7bab2 Binary files /dev/null and b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.pl.png differ diff --git a/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.pl.png b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.pl.png new file mode 100644 index 00000000..4ffd862a Binary files /dev/null and b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.pl.png differ diff --git a/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.pl.png b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.pl.png new file mode 100644 index 00000000..ef506579 Binary files /dev/null and b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.pl.png differ diff --git a/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.pl.png b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.pl.png new file mode 100644 index 00000000..ddf79213 Binary files /dev/null and b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.pl.png differ diff --git a/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.pl.png b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.pl.png new file mode 100644 index 00000000..1796bcce Binary files /dev/null and b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.pl.png differ diff --git a/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.pl.png b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.pl.png new file mode 100644 index 00000000..ab763666 Binary files /dev/null and b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.pl.png differ diff --git a/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.pl.png b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.pl.png new file mode 100644 index 00000000..013f247d Binary files /dev/null and b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.pl.png differ diff --git a/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.pl.png b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.pl.png new file mode 100644 index 00000000..fd1b7753 Binary files /dev/null and b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.pl.png differ diff --git a/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.pl.png b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.pl.png new file mode 100644 index 00000000..55154b84 Binary files /dev/null and b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.pl.png differ diff --git a/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.pl.png b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.pl.png new file mode 100644 index 00000000..306d6f14 Binary files /dev/null and b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.pl.png differ diff --git a/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.pl.png b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.pl.png new file mode 100644 index 00000000..dfb03646 Binary files /dev/null and b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.pl.png differ diff --git a/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.pl.png b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.pl.png new file mode 100644 index 00000000..05208120 Binary files /dev/null and b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.pl.png differ diff --git a/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.pl.jpg b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.pl.jpg new file mode 100644 index 00000000..e78b8c6c Binary files /dev/null and b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.pl.jpg differ diff --git a/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.pl.png b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.pl.png new file mode 100644 index 00000000..0b221a3f Binary files /dev/null and b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.pl.png differ diff --git a/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.pl.png b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.pl.png new file mode 100644 index 00000000..576d3f84 Binary files /dev/null and b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.pl.png differ diff --git a/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.pl.png b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.pl.png new file mode 100644 index 00000000..297ccc5e Binary files /dev/null and b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.pl.png differ diff --git a/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.pl.png b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.pl.png new file mode 100644 index 00000000..89bd1ba6 Binary files /dev/null and b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.pl.png differ diff --git a/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.pl.jpg b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.pl.jpg new file mode 100644 index 00000000..383794f2 Binary files /dev/null and b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.pl.jpg differ diff --git a/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.pl.png b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.pl.png new file mode 100644 index 00000000..f28538e1 Binary files /dev/null and b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.pl.png differ diff --git a/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.pl.png b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.pl.png new file mode 100644 index 00000000..39431760 Binary files /dev/null and b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.pl.png differ diff --git a/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.pl.png b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.pl.png new file mode 100644 index 00000000..46a26d45 Binary files /dev/null and b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.pl.png differ diff --git a/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.pl.png b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.pl.png new file mode 100644 index 00000000..6f70239b Binary files /dev/null and b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.pl.png differ diff --git a/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.pl.png b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.pl.png new file mode 100644 index 00000000..c5cd51da Binary files /dev/null and b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.pl.png differ diff --git a/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.pl.png b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.pl.png new file mode 100644 index 00000000..0328b3ea Binary files /dev/null and b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.pl.png differ diff --git a/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.pl.png b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.pl.png new file mode 100644 index 00000000..b3d0d223 Binary files /dev/null and b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.pl.png differ diff --git a/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.pl.png b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.pl.png new file mode 100644 index 00000000..0729dbce Binary files /dev/null and b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.pl.png differ diff --git a/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.pl.png b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.pl.png new file mode 100644 index 00000000..2e3adef5 Binary files /dev/null and b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.pl.png differ diff --git a/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.pl.png b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.pl.png new file mode 100644 index 00000000..4e9aa9b4 Binary files /dev/null and b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.pl.png differ diff --git a/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.pl.png b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.pl.png new file mode 100644 index 00000000..766527c0 Binary files /dev/null and b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.pl.png differ diff --git a/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.pl.png b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.pl.png new file mode 100644 index 00000000..f34ad7c6 Binary files /dev/null and b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.pl.png differ diff --git a/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.pl.png b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.pl.png new file mode 100644 index 00000000..403bb436 Binary files /dev/null and b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.pl.png differ diff --git a/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.pl.png b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.pl.png new file mode 100644 index 00000000..07398a97 Binary files /dev/null and b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.pl.png differ diff --git a/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.pl.png b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.pl.png new file mode 100644 index 00000000..83d0a29e Binary files /dev/null and b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.pl.png differ diff --git a/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.pl.png b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.pl.png new file mode 100644 index 00000000..cdd566f5 Binary files /dev/null and b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.pl.png differ diff --git a/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.pl.png b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.pl.png new file mode 100644 index 00000000..50caa7a8 Binary files /dev/null and b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.pl.png differ diff --git a/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.pl.png b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.pl.png new file mode 100644 index 00000000..e68c1881 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.pl.png differ diff --git a/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.pl.png b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.pl.png new file mode 100644 index 00000000..357708db Binary files /dev/null and b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.pl.png differ diff --git a/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.pl.png b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.pl.png new file mode 100644 index 00000000..ff2cb168 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.pl.png differ diff --git a/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.pl.png b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.pl.png new file mode 100644 index 00000000..4dd28830 Binary files /dev/null and b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.pl.png differ diff --git a/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.pl.png b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.pl.png new file mode 100644 index 00000000..36a0bed7 Binary files /dev/null and b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.pl.png differ diff --git a/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.pl.png b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.pl.png new file mode 100644 index 00000000..43b82415 Binary files /dev/null and b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.pl.png differ diff --git a/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.pl.png b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.pl.png new file mode 100644 index 00000000..9f42e92d Binary files /dev/null and b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.pl.png differ diff --git a/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.pl.png b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.pl.png new file mode 100644 index 00000000..91118b35 Binary files /dev/null and b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.pl.png differ diff --git a/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.pl.png b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.pl.png new file mode 100644 index 00000000..c1074a8e Binary files /dev/null and b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.pl.png differ diff --git a/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.pl.png b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.pl.png new file mode 100644 index 00000000..a4cca4dc Binary files /dev/null and b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.pl.png differ diff --git a/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.pl.png b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.pl.png new file mode 100644 index 00000000..1dd02459 Binary files /dev/null and b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.pl.png differ diff --git a/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.pl.png b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.pl.png new file mode 100644 index 00000000..64ba974b Binary files /dev/null and b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.pl.png differ diff --git a/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.pl.png b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.pl.png new file mode 100644 index 00000000..fd3d1f9b Binary files /dev/null and b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.pl.png differ diff --git a/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.pl.png b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.pl.png new file mode 100644 index 00000000..f523159b Binary files /dev/null and b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.pl.png differ diff --git a/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.pl.png b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.pl.png new file mode 100644 index 00000000..70a9bacf Binary files /dev/null and b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.pl.png differ diff --git a/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.pl.png b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.pl.png new file mode 100644 index 00000000..9e30ab1c Binary files /dev/null and b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.pl.png differ diff --git a/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.pl.png b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.pl.png new file mode 100644 index 00000000..e9f61adc Binary files /dev/null and b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.pl.png differ diff --git a/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.pl.png b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.pl.png new file mode 100644 index 00000000..a54521f7 Binary files /dev/null and b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.pl.png differ diff --git a/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.pl.png b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.pl.png new file mode 100644 index 00000000..6981df8a Binary files /dev/null and b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.pl.png differ diff --git a/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.pl.png b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.pl.png new file mode 100644 index 00000000..2722c065 Binary files /dev/null and b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.pl.png differ diff --git a/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.pl.jpg b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.pl.jpg new file mode 100644 index 00000000..cce2a759 Binary files /dev/null and b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.pl.jpg differ diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.pl.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.pl.png new file mode 100644 index 00000000..26e0ae43 Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.pl.png differ diff --git a/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.pl.png b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.pl.png new file mode 100644 index 00000000..a5d549fd Binary files /dev/null and b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.pl.png differ diff --git a/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.pl.png b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.pl.png new file mode 100644 index 00000000..a251745c Binary files /dev/null and b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.pl.png differ diff --git a/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.pl.png b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.pl.png new file mode 100644 index 00000000..bb97d28e Binary files /dev/null and b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.pl.png differ diff --git a/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.pl.png b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.pl.png new file mode 100644 index 00000000..e34dea22 Binary files /dev/null and b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.pl.png differ diff --git a/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.pl.png b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.pl.png new file mode 100644 index 00000000..fa863501 Binary files /dev/null and b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.pl.png differ diff --git a/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.pl.png b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.pl.png new file mode 100644 index 00000000..0d0e0c48 Binary files /dev/null and b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.pl.png differ diff --git a/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.pl.png b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.pl.png new file mode 100644 index 00000000..6f79a498 Binary files /dev/null and b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.pl.png differ diff --git a/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.pl.png b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.pl.png new file mode 100644 index 00000000..8527d4cd Binary files /dev/null and b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.pl.png differ diff --git a/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.pl.png b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.pl.png new file mode 100644 index 00000000..8597bf4d Binary files /dev/null and b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.pl.png differ diff --git a/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.pl.png b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.pl.png new file mode 100644 index 00000000..3bf24358 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.pl.png differ diff --git a/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.pl.png b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.pl.png new file mode 100644 index 00000000..562f66d2 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.pl.png differ diff --git a/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.pl.png b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.pl.png new file mode 100644 index 00000000..2f50d53a Binary files /dev/null and b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.pl.png differ diff --git a/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.pl.png b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.pl.png new file mode 100644 index 00000000..de7f343e Binary files /dev/null and b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.pl.png differ diff --git a/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.pl.png b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.pl.png new file mode 100644 index 00000000..c8b1a544 Binary files /dev/null and b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.pl.png differ diff --git a/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.pl.png b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.pl.png new file mode 100644 index 00000000..17d1151d Binary files /dev/null and b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.pl.png differ diff --git a/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.pl.png b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.pl.png new file mode 100644 index 00000000..ffafc104 Binary files /dev/null and b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.pl.png differ diff --git a/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.pl.png b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.pl.png new file mode 100644 index 00000000..e3d86f8c Binary files /dev/null and b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.pl.png differ diff --git a/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.pl.png b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.pl.png new file mode 100644 index 00000000..3a4445ee Binary files /dev/null and b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.pl.png differ diff --git a/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.pl.png b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.pl.png new file mode 100644 index 00000000..b2bf4d3f Binary files /dev/null and b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.pl.png differ diff --git a/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.pl.png b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.pl.png new file mode 100644 index 00000000..467cedcd Binary files /dev/null and b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.pl.png differ diff --git a/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.pl.png b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.pl.png new file mode 100644 index 00000000..88efaa59 Binary files /dev/null and b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.pl.png differ diff --git a/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.pl.png b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.pl.png new file mode 100644 index 00000000..6197ed95 Binary files /dev/null and b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.pl.png differ diff --git a/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.pl.png b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.pl.png new file mode 100644 index 00000000..ec7768da Binary files /dev/null and b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.pl.png differ diff --git a/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.pl.png b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.pl.png new file mode 100644 index 00000000..f68bf461 Binary files /dev/null and b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.pl.png differ diff --git a/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.pl.png b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.pl.png new file mode 100644 index 00000000..73e34cfe Binary files /dev/null and b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.pl.png differ diff --git a/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.pl.png b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.pl.png new file mode 100644 index 00000000..21cc6bd0 Binary files /dev/null and b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.pl.png differ diff --git a/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.pl.png b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.pl.png new file mode 100644 index 00000000..9c7deb23 Binary files /dev/null and b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.pl.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.pl.png b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.pl.png new file mode 100644 index 00000000..ddc9958b Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.pl.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.pl.png b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.pl.png new file mode 100644 index 00000000..d181210a Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.pl.png differ diff --git a/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.pl.png b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.pl.png new file mode 100644 index 00000000..a00ab427 Binary files /dev/null and b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.pl.png differ diff --git a/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.pl.png b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.pl.png new file mode 100644 index 00000000..dedb38a3 Binary files /dev/null and b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.pl.png differ diff --git a/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.pl.png b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.pl.png new file mode 100644 index 00000000..2b34487d Binary files /dev/null and b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.pl.png differ diff --git a/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.pl.png b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.pl.png new file mode 100644 index 00000000..1cae68ed Binary files /dev/null and b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.pl.png differ diff --git a/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.pl.png b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.pl.png new file mode 100644 index 00000000..df961cae Binary files /dev/null and b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.pl.png differ diff --git a/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.pl.png b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.pl.png new file mode 100644 index 00000000..aaeaeff8 Binary files /dev/null and b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.pl.png differ diff --git a/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.pl.png b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.pl.png new file mode 100644 index 00000000..7613fe86 Binary files /dev/null and b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.pl.png differ diff --git a/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.pl.png b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.pl.png new file mode 100644 index 00000000..335bdf32 Binary files /dev/null and b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.pl.png differ diff --git a/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.pl.png b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.pl.png new file mode 100644 index 00000000..32c8ba10 Binary files /dev/null and b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.pl.png differ diff --git a/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.pl.png b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.pl.png new file mode 100644 index 00000000..82802e17 Binary files /dev/null and b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.pl.png differ diff --git a/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.pl.png b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.pl.png new file mode 100644 index 00000000..8214fc2c Binary files /dev/null and b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.pl.png differ diff --git a/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.pl.png b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.pl.png new file mode 100644 index 00000000..434baaad Binary files /dev/null and b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.pl.png differ diff --git a/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.pl.png b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.pl.png new file mode 100644 index 00000000..d32271b5 Binary files /dev/null and b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.pl.png differ diff --git a/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.pl.png b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.pl.png new file mode 100644 index 00000000..04cd7dc8 Binary files /dev/null and b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.pl.png differ diff --git a/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.pl.png b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.pl.png new file mode 100644 index 00000000..a8a12bce Binary files /dev/null and b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.pl.png differ diff --git a/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.pl.jpg b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.pl.jpg new file mode 100644 index 00000000..23ea98b2 Binary files /dev/null and b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.pl.jpg differ diff --git a/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.pl.jpg b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.pl.jpg new file mode 100644 index 00000000..1e3581d3 Binary files /dev/null and b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.pl.jpg differ diff --git a/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.pl.jpg b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.pl.jpg new file mode 100644 index 00000000..554ea37b Binary files /dev/null and b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.pl.jpg differ diff --git a/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.pl.jpg b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.pl.jpg new file mode 100644 index 00000000..427ba4c3 Binary files /dev/null and b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.pl.jpg differ diff --git a/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.pl.jpg b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.pl.jpg new file mode 100644 index 00000000..b2357285 Binary files /dev/null and b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.pl.jpg differ diff --git a/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.pl.jpg b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.pl.jpg new file mode 100644 index 00000000..1736ebb4 Binary files /dev/null and b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.pl.jpg differ diff --git a/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.pl.jpg b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.pl.jpg new file mode 100644 index 00000000..bf1d724f Binary files /dev/null and b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.pl.jpg differ diff --git a/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.pl.jpg b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.pl.jpg new file mode 100644 index 00000000..bb78259a Binary files /dev/null and b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.pl.jpg differ diff --git a/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.pl.jpg b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.pl.jpg new file mode 100644 index 00000000..b311b568 Binary files /dev/null and b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.pl.jpg differ diff --git a/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.pl.jpg b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.pl.jpg new file mode 100644 index 00000000..5bd350fd Binary files /dev/null and b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.pl.jpg differ diff --git a/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.pl.jpg b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.pl.jpg new file mode 100644 index 00000000..66fbe114 Binary files /dev/null and b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.pl.jpg differ diff --git a/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.pl.jpg b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.pl.jpg new file mode 100644 index 00000000..050e7206 Binary files /dev/null and b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.pl.jpg differ diff --git a/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.pl.jpg b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.pl.jpg new file mode 100644 index 00000000..91c64faa Binary files /dev/null and b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.pl.jpg differ diff --git a/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.pl.jpg b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.pl.jpg new file mode 100644 index 00000000..36e1a4b3 Binary files /dev/null and b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.pl.jpg differ diff --git a/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.pl.jpg b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.pl.jpg new file mode 100644 index 00000000..1b87df4c Binary files /dev/null and b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.pl.jpg differ diff --git a/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.pl.jpg b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.pl.jpg new file mode 100644 index 00000000..8df37a22 Binary files /dev/null and b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.pl.jpg differ diff --git a/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.pl.jpg b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.pl.jpg new file mode 100644 index 00000000..943af1b9 Binary files /dev/null and b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.pl.jpg differ diff --git a/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.pl.jpg b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.pl.jpg new file mode 100644 index 00000000..5a96f7fb Binary files /dev/null and b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.pl.jpg differ diff --git a/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.pl.jpg b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.pl.jpg new file mode 100644 index 00000000..8f0bee50 Binary files /dev/null and b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.pl.jpg differ diff --git a/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.pl.jpg b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.pl.jpg new file mode 100644 index 00000000..4ba24109 Binary files /dev/null and b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.pl.jpg differ diff --git a/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.pl.jpg b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.pl.jpg new file mode 100644 index 00000000..cdf0f557 Binary files /dev/null and b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.pl.jpg differ diff --git a/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.pl.jpg b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.pl.jpg new file mode 100644 index 00000000..f59ee98d Binary files /dev/null and b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.pl.jpg differ diff --git a/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.pl.jpg b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.pl.jpg new file mode 100644 index 00000000..5bdbfd14 Binary files /dev/null and b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.pl.jpg differ diff --git a/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.pl.jpg b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.pl.jpg new file mode 100644 index 00000000..b78ab3ac Binary files /dev/null and b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.pl.jpg differ diff --git a/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.pl.png b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.pl.png new file mode 100644 index 00000000..d071dffe Binary files /dev/null and b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.pl.png differ diff --git a/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.pl.png b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.pl.png new file mode 100644 index 00000000..b8947f6d Binary files /dev/null and b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.pl.png differ diff --git a/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.pl.png b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.pl.png new file mode 100644 index 00000000..5c5dfb96 Binary files /dev/null and b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.pl.png differ diff --git a/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.pl.png b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.pl.png new file mode 100644 index 00000000..663ad7e9 Binary files /dev/null and b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.pl.png differ diff --git a/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.pl.png b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.pl.png new file mode 100644 index 00000000..b1e33d6b Binary files /dev/null and b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.pl.png differ diff --git a/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.pl.png b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.pl.png new file mode 100644 index 00000000..2a03ab78 Binary files /dev/null and b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.pl.png differ diff --git a/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.pl.png b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.pl.png new file mode 100644 index 00000000..02ef1351 Binary files /dev/null and b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.pl.png differ diff --git a/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.pl.png b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.pl.png new file mode 100644 index 00000000..33faabd1 Binary files /dev/null and b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.pl.png differ diff --git a/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.pl.png b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.pl.png new file mode 100644 index 00000000..aa94da2c Binary files /dev/null and b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.pl.png differ diff --git a/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.pl.png b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.pl.png new file mode 100644 index 00000000..ac000818 Binary files /dev/null and b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.pl.png differ diff --git a/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.pl.png b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.pl.png new file mode 100644 index 00000000..2fb519f5 Binary files /dev/null and b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.pl.png differ diff --git a/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.pl.png b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.pl.png new file mode 100644 index 00000000..48459b92 Binary files /dev/null and b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.pl.png differ diff --git a/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.pl.png b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.pl.png new file mode 100644 index 00000000..d502a579 Binary files /dev/null and b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.pl.png differ diff --git a/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.pl.png b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.pl.png new file mode 100644 index 00000000..fca45002 Binary files /dev/null and b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.pl.png differ diff --git a/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.pl.png b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.pl.png new file mode 100644 index 00000000..94aa28db Binary files /dev/null and b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.pl.png differ diff --git a/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.pl.png b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.pl.png new file mode 100644 index 00000000..894df473 Binary files /dev/null and b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.pl.png differ diff --git a/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.pl.png b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.pl.png new file mode 100644 index 00000000..b75dfdd2 Binary files /dev/null and b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.pl.png differ diff --git a/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.pl.png b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.pl.png new file mode 100644 index 00000000..1e7934c3 Binary files /dev/null and b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.pl.png differ diff --git a/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.pl.png b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.pl.png new file mode 100644 index 00000000..5bb319ec Binary files /dev/null and b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.pl.png differ diff --git a/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.pl.png b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.pl.png new file mode 100644 index 00000000..d66e224f Binary files /dev/null and b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.pl.png differ diff --git a/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.pl.png b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.pl.png new file mode 100644 index 00000000..ed18e7b0 Binary files /dev/null and b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.pl.png differ diff --git a/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.pl.png b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.pl.png new file mode 100644 index 00000000..9acb21a7 Binary files /dev/null and b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.pl.png differ diff --git a/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.pl.png b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.pl.png new file mode 100644 index 00000000..1ced5fc1 Binary files /dev/null and b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.pl.png differ diff --git a/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.pl.png b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.pl.png new file mode 100644 index 00000000..7293ced1 Binary files /dev/null and b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.pl.png differ diff --git a/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.pl.png b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.pl.png new file mode 100644 index 00000000..be837c63 Binary files /dev/null and b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.pl.png differ diff --git a/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.pl.png b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.pl.png new file mode 100644 index 00000000..73861107 Binary files /dev/null and b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.pl.png differ diff --git a/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.pl.png b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.pl.png new file mode 100644 index 00000000..1b26d7ff Binary files /dev/null and b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.pl.png differ diff --git a/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.pl.png b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.pl.png new file mode 100644 index 00000000..f1905ecc Binary files /dev/null and b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.pl.png differ diff --git a/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.pl.png b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.pl.png new file mode 100644 index 00000000..edc44fa9 Binary files /dev/null and b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.pl.png differ diff --git a/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.pl.png b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.pl.png new file mode 100644 index 00000000..87854d3a Binary files /dev/null and b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.pl.png differ diff --git a/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.pl.png b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.pl.png new file mode 100644 index 00000000..d1158e0d Binary files /dev/null and b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.pl.png differ diff --git a/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.pl.png b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.pl.png new file mode 100644 index 00000000..122abea4 Binary files /dev/null and b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.pl.png differ diff --git a/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.pl.png b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.pl.png new file mode 100644 index 00000000..dc009aa5 Binary files /dev/null and b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.pl.png differ diff --git a/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.pl.png b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.pl.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.pl.png differ diff --git a/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.pl.png b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.pl.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.pl.png differ diff --git a/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.pl.png b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.pl.png new file mode 100644 index 00000000..12274b8b Binary files /dev/null and b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.pl.png differ diff --git a/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.pl.png b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.pl.png new file mode 100644 index 00000000..da226797 Binary files /dev/null and b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.pl.png differ diff --git a/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.pl.png b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.pl.png new file mode 100644 index 00000000..67bd8a82 Binary files /dev/null and b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.pl.png differ diff --git a/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.pl.png b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.pl.png new file mode 100644 index 00000000..18938f59 Binary files /dev/null and b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.pl.png differ diff --git a/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.pl.png b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.pl.png new file mode 100644 index 00000000..db480604 Binary files /dev/null and b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.pl.png differ diff --git a/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.pl.png b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.pl.png new file mode 100644 index 00000000..535e5798 Binary files /dev/null and b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.pl.png differ diff --git a/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.pl.png b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.pl.png new file mode 100644 index 00000000..b3d83ab7 Binary files /dev/null and b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.pl.png differ diff --git a/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.pl.png b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.pl.png new file mode 100644 index 00000000..4bb97d60 Binary files /dev/null and b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.pl.png differ diff --git a/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.pl.jpg b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.pl.jpg new file mode 100644 index 00000000..4cf0d73d Binary files /dev/null and b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.pl.jpg differ diff --git a/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.pl.png b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.pl.png new file mode 100644 index 00000000..0aace880 Binary files /dev/null and b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.pl.png differ diff --git a/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.pl.png b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.pl.png new file mode 100644 index 00000000..b19b1f6b Binary files /dev/null and b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.pl.png differ diff --git a/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.pl.jpg b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.pl.jpg new file mode 100644 index 00000000..827670ed Binary files /dev/null and b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.pl.jpg differ diff --git a/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.pl.png b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.pl.png new file mode 100644 index 00000000..435f901a Binary files /dev/null and b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.pl.png differ diff --git a/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.pl.png b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.pl.png new file mode 100644 index 00000000..7308a1d1 Binary files /dev/null and b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.pl.png differ diff --git a/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.pl.png b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.pl.png new file mode 100644 index 00000000..8454c4d2 Binary files /dev/null and b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.pl.png differ diff --git a/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.pl.png b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.pl.png new file mode 100644 index 00000000..324b711d Binary files /dev/null and b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.pl.png differ diff --git a/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.pl.png b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.pl.png new file mode 100644 index 00000000..ddfb42aa Binary files /dev/null and b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.pl.png differ diff --git a/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.pl.png b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.pl.png new file mode 100644 index 00000000..280f2fe0 Binary files /dev/null and b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.pl.png differ diff --git a/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.pl.jpg b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.pl.jpg new file mode 100644 index 00000000..89b581ef Binary files /dev/null and b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.pl.jpg differ diff --git a/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.pl.jpg b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.pl.jpg new file mode 100644 index 00000000..6efd2da1 Binary files /dev/null and b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.pl.jpg differ diff --git a/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.pl.png b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.pl.png new file mode 100644 index 00000000..348fe7a0 Binary files /dev/null and b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.pl.png differ diff --git a/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.pl.png b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.pl.png new file mode 100644 index 00000000..a69e73f4 Binary files /dev/null and b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.pl.png differ diff --git a/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.pl.png b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.pl.png new file mode 100644 index 00000000..49b0ca9b Binary files /dev/null and b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.pl.png differ diff --git a/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.pl.png b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.pl.png new file mode 100644 index 00000000..458a3c95 Binary files /dev/null and b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.pl.png differ diff --git a/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.pl.png b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.pl.png new file mode 100644 index 00000000..90b687c2 Binary files /dev/null and b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.pl.png differ diff --git a/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.pl.png b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.pl.png new file mode 100644 index 00000000..cb4bc445 Binary files /dev/null and b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.pl.png differ diff --git a/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.pl.png b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.pl.png new file mode 100644 index 00000000..e7ea8ab6 Binary files /dev/null and b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.pl.png differ diff --git a/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.pl.png b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.pl.png new file mode 100644 index 00000000..6f138cf9 Binary files /dev/null and b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.pl.png differ diff --git a/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.pl.png b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.pl.png new file mode 100644 index 00000000..2f5f2861 Binary files /dev/null and b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.pl.png differ diff --git a/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.pl.png b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.pl.png new file mode 100644 index 00000000..f2f1b63e Binary files /dev/null and b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.pl.png differ diff --git a/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.pl.png b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.pl.png new file mode 100644 index 00000000..5643c164 Binary files /dev/null and b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.pl.png differ diff --git a/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.pl.png b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.pl.png new file mode 100644 index 00000000..73fa30d1 Binary files /dev/null and b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.pl.png differ diff --git a/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.pl.png b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.pl.png new file mode 100644 index 00000000..eee39f7d Binary files /dev/null and b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.pl.png differ diff --git a/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.pl.png b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.pl.png new file mode 100644 index 00000000..5a0fb117 Binary files /dev/null and b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.pl.png differ diff --git a/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.pl.png b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.pl.png new file mode 100644 index 00000000..27ddbfee Binary files /dev/null and b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.pl.png differ diff --git a/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.pl.png b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.pl.png new file mode 100644 index 00000000..ee07bd10 Binary files /dev/null and b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.pl.png differ diff --git a/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.pl.png b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.pl.png new file mode 100644 index 00000000..37a2464a Binary files /dev/null and b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.pl.png differ diff --git a/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.pl.png b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.pl.png new file mode 100644 index 00000000..d852153c Binary files /dev/null and b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.pl.png differ diff --git a/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.pl.png b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.pl.png new file mode 100644 index 00000000..a457ac8d Binary files /dev/null and b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.pl.png differ diff --git a/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.pl.png b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.pl.png new file mode 100644 index 00000000..3eccd326 Binary files /dev/null and b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.pl.png differ diff --git a/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.pl.png b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.pl.png new file mode 100644 index 00000000..49083372 Binary files /dev/null and b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.pl.png differ diff --git a/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.pl.png b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.pl.png new file mode 100644 index 00000000..1b4a94e5 Binary files /dev/null and b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.pl.png differ diff --git a/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.pl.png b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.pl.png new file mode 100644 index 00000000..8589e88f Binary files /dev/null and b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.pl.png differ diff --git a/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.pl.png b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.pl.png new file mode 100644 index 00000000..e1246f56 Binary files /dev/null and b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.pl.png differ diff --git a/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.pl.png b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.pl.png new file mode 100644 index 00000000..db66a52b Binary files /dev/null and b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.pl.png differ diff --git a/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.pl.png b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.pl.png new file mode 100644 index 00000000..66c76c2f Binary files /dev/null and b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.pl.png differ diff --git a/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.pl.png b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.pl.png new file mode 100644 index 00000000..450b824c Binary files /dev/null and b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.pl.png differ diff --git a/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.pl.png b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.pl.png new file mode 100644 index 00000000..615bc7a9 Binary files /dev/null and b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.pl.png differ diff --git a/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.pl.png b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.pl.png new file mode 100644 index 00000000..3c9e2930 Binary files /dev/null and b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.pl.png differ diff --git a/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.pl.png b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.pl.png new file mode 100644 index 00000000..e4bb0186 Binary files /dev/null and b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.pl.png differ diff --git a/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.pl.png b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.pl.png new file mode 100644 index 00000000..91e4cba6 Binary files /dev/null and b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.pl.png differ diff --git a/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.pl.png b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.pl.png new file mode 100644 index 00000000..91230d0c Binary files /dev/null and b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.pl.png differ diff --git a/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.pl.png b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.pl.png new file mode 100644 index 00000000..128cd4a9 Binary files /dev/null and b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.pl.png differ diff --git a/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.pl.png b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.pl.png new file mode 100644 index 00000000..8d62d827 Binary files /dev/null and b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.pl.png differ diff --git a/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.pl.png b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.pl.png new file mode 100644 index 00000000..a84ab661 Binary files /dev/null and b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.pl.png differ diff --git a/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.pl.png b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.pl.png new file mode 100644 index 00000000..4c88d3d3 Binary files /dev/null and b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.pl.png differ diff --git a/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.pl.png b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.pl.png new file mode 100644 index 00000000..bc1895b8 Binary files /dev/null and b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.pl.png differ diff --git a/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.pl.png b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.pl.png new file mode 100644 index 00000000..d8ff3180 Binary files /dev/null and b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.pl.png differ diff --git a/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.pl.png b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.pl.png new file mode 100644 index 00000000..06b86a65 Binary files /dev/null and b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.pl.png differ diff --git a/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.pl.png b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.pl.png new file mode 100644 index 00000000..ac7aa47a Binary files /dev/null and b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.pl.png differ diff --git a/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.pl.png b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.pl.png new file mode 100644 index 00000000..20480a22 Binary files /dev/null and b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.pl.png differ diff --git a/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.pl.png b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.pl.png new file mode 100644 index 00000000..9d90f435 Binary files /dev/null and b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.pl.png differ diff --git a/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.pl.png b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.pl.png new file mode 100644 index 00000000..27b0ea2c Binary files /dev/null and b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.pl.png differ diff --git a/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.pl.png b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.pl.png new file mode 100644 index 00000000..3526a6d0 Binary files /dev/null and b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.pl.png differ diff --git a/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.pl.png b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.pl.png new file mode 100644 index 00000000..855d442e Binary files /dev/null and b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.pl.png differ diff --git a/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.pl.png b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.pl.png new file mode 100644 index 00000000..aed3d813 Binary files /dev/null and b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.pl.png differ diff --git a/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.pl.png b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.pl.png new file mode 100644 index 00000000..9bfca6c2 Binary files /dev/null and b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.pl.png differ diff --git a/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.pl.png b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.pl.png new file mode 100644 index 00000000..0490e302 Binary files /dev/null and b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.pl.png differ diff --git a/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.pl.png b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.pl.png new file mode 100644 index 00000000..676e2378 Binary files /dev/null and b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.pl.png differ diff --git a/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.pl.png b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.pl.png new file mode 100644 index 00000000..280e18c3 Binary files /dev/null and b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.pl.png differ diff --git a/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.pl.png b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.pl.png new file mode 100644 index 00000000..bb70a905 Binary files /dev/null and b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.pl.png differ diff --git a/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.pl.png b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.pl.png new file mode 100644 index 00000000..c0860d6e Binary files /dev/null and b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.pl.png differ diff --git a/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.pl.png b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.pl.png new file mode 100644 index 00000000..9a34d708 Binary files /dev/null and b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.pl.png differ diff --git a/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.pl.png b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.pl.png new file mode 100644 index 00000000..2c683d8b Binary files /dev/null and b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.pl.png differ diff --git a/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.pl.png b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.pl.png new file mode 100644 index 00000000..1ba4c5b0 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.pl.png differ diff --git a/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.pl.png b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.pl.png new file mode 100644 index 00000000..93aa3743 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.pl.png differ diff --git a/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.pl.png b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.pl.png new file mode 100644 index 00000000..3089e5e1 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.pl.png differ diff --git a/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.pl.png b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.pl.png new file mode 100644 index 00000000..53468420 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.pl.png differ diff --git a/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.pl.png b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.pl.png new file mode 100644 index 00000000..003dc174 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.pl.png differ diff --git a/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.pl.png b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.pl.png new file mode 100644 index 00000000..3c0d2f87 Binary files /dev/null and b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.pl.png differ diff --git a/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.pl.png b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.pl.png new file mode 100644 index 00000000..56f285f2 Binary files /dev/null and b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.pl.png differ diff --git a/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.pl.png b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.pl.png new file mode 100644 index 00000000..ec8bbe2f Binary files /dev/null and b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.pl.png differ diff --git a/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.pl.png b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.pl.png new file mode 100644 index 00000000..bbaae894 Binary files /dev/null and b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.pl.png differ diff --git a/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.pl.png b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.pl.png new file mode 100644 index 00000000..ef71f6da Binary files /dev/null and b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.pl.png differ diff --git a/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.pl.png b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.pl.png new file mode 100644 index 00000000..4e9390eb Binary files /dev/null and b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.pl.png differ diff --git a/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.pl.png b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.pl.png new file mode 100644 index 00000000..16d7af80 Binary files /dev/null and b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.pl.png differ diff --git a/translations/pl/1-getting-started/README.md b/translations/pl/1-getting-started/README.md new file mode 100644 index 00000000..53182324 --- /dev/null +++ b/translations/pl/1-getting-started/README.md @@ -0,0 +1,28 @@ + +# Wprowadzenie do IoT + +W tej części programu nauczania zostaniesz wprowadzony w świat Internetu Rzeczy (IoT) i poznasz podstawowe pojęcia, w tym budowę swojego pierwszego projektu 'Hello World' IoT, który łączy się z chmurą. Ten projekt to lampka nocna, która zapala się, gdy poziom światła mierzony przez czujnik spada. + +![Dioda LED podłączona do WIO włączająca się i wyłączająca w zależności od zmiany poziomu światła](../../../images/wio-running-assignment-1-1.gif) + +## Tematy + +1. [Wprowadzenie do IoT](lessons/1-introduction-to-iot/README.md) +1. [Głębsze spojrzenie na IoT](lessons/2-deeper-dive/README.md) +1. [Interakcja ze światem fizycznym za pomocą czujników i siłowników](lessons/3-sensors-and-actuators/README.md) +1. [Podłącz swoje urządzenie do Internetu](lessons/4-connect-internet/README.md) + +## Podziękowania + +Wszystkie lekcje zostały napisane z ♥️ przez [Jim Bennett](https://GitHub.com/JimBobBennett) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/1-introduction-to-iot/README.md b/translations/pl/1-getting-started/lessons/1-introduction-to-iot/README.md new file mode 100644 index 00000000..c97449e7 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/1-introduction-to-iot/README.md @@ -0,0 +1,240 @@ + +# Wprowadzenie do IoT + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obrazek, aby zobaczyć większą wersję. + +Ta lekcja była częścią serii [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) organizowanej przez [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Lekcja została podzielona na dwa filmy: godzinny wykład oraz godzinne konsultacje, podczas których szczegółowo omówiono wybrane tematy i odpowiadano na pytania. + +[![Lekcja 1: Wprowadzenie do IoT](https://img.youtube.com/vi/bVFfcYh6UBw/0.jpg)](https://youtu.be/bVFfcYh6UBw) + +[![Lekcja 1: Wprowadzenie do IoT - Konsultacje](https://img.youtube.com/vi/YI772q5v3yI/0.jpg)](https://youtu.be/YI772q5v3yI) + +> 🎥 Kliknij powyższe obrazy, aby obejrzeć filmy + +## Quiz przed wykładem + +[Quiz przed wykładem](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1) + +## Wprowadzenie + +Ta lekcja obejmuje podstawowe zagadnienia związane z Internetem Rzeczy (IoT) i pomoże Ci rozpocząć konfigurację sprzętu. + +W tej lekcji omówimy: + +* [Czym jest 'Internet Rzeczy'?](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Urządzenia IoT](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Konfiguracja urządzenia](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Zastosowania IoT](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Przykłady urządzeń IoT wokół Ciebie](../../../../../1-getting-started/lessons/1-introduction-to-iot) + +## Czym jest 'Internet Rzeczy'? + +Termin 'Internet Rzeczy' został wprowadzony przez [Kevina Ashtona](https://wikipedia.org/wiki/Kevin_Ashton) w 1999 roku, aby opisać połączenie Internetu ze światem fizycznym za pomocą sensorów. Od tego czasu termin ten odnosi się do każdego urządzenia, które wchodzi w interakcję ze światem fizycznym, zbierając dane z sensorów lub wykonując działania w świecie rzeczywistym za pomocą aktuatorów (urządzeń, które wykonują coś, np. włączają przełącznik lub zapalają diodę LED), zazwyczaj połączonych z innymi urządzeniami lub Internetem. + +> **Sensory** zbierają informacje ze świata, takie jak pomiar prędkości, temperatury czy lokalizacji. +> +> **Aktuatory** przekształcają sygnały elektryczne w działania w świecie rzeczywistym, takie jak uruchamianie przełącznika, włączanie świateł, wydawanie dźwięków czy wysyłanie sygnałów sterujących do innych urządzeń, np. w celu włączenia gniazdka elektrycznego. + +IoT jako dziedzina technologii obejmuje nie tylko urządzenia, ale także usługi w chmurze, które mogą przetwarzać dane z sensorów lub wysyłać polecenia do aktuatorów podłączonych do urządzeń IoT. Obejmuje również urządzenia, które nie mają lub nie potrzebują połączenia z Internetem, często nazywane urządzeniami brzegowymi. Są to urządzenia, które mogą samodzielnie przetwarzać i reagować na dane z sensorów, zazwyczaj korzystając z modeli AI trenowanych w chmurze. + +IoT to szybko rozwijająca się dziedzina technologii. Szacuje się, że pod koniec 2020 roku na świecie działało 30 miliardów urządzeń IoT podłączonych do Internetu. Patrząc w przyszłość, przewiduje się, że do 2025 roku urządzenia IoT będą zbierać prawie 80 zettabajtów danych, czyli 80 bilionów gigabajtów. To ogromna ilość danych! + +![Wykres pokazujący liczbę aktywnych urządzeń IoT w czasie, z tendencją wzrostową od mniej niż 5 miliardów w 2015 roku do ponad 30 miliardów w 2025 roku](../../../../../images/connected-iot-devices.svg) + +✅ Zrób małe badanie: Jak dużo danych generowanych przez urządzenia IoT jest faktycznie wykorzystywanych, a ile jest marnowanych? Dlaczego tak wiele danych jest ignorowanych? + +Te dane są kluczem do sukcesu IoT. Aby być skutecznym deweloperem IoT, musisz zrozumieć, jakie dane należy zbierać, jak je zbierać, jak podejmować decyzje na ich podstawie i jak wykorzystać te decyzje do interakcji ze światem fizycznym, jeśli zajdzie taka potrzeba. + +## Urządzenia IoT + +**T** w IoT oznacza **Rzeczy** - urządzenia, które wchodzą w interakcję ze światem fizycznym, zbierając dane z sensorów lub wykonując działania w świecie rzeczywistym za pomocą aktuatorów. + +Urządzenia produkcyjne lub komercyjne, takie jak konsumenckie opaski fitness czy przemysłowe kontrolery maszyn, są zazwyczaj projektowane na zamówienie. Korzystają z niestandardowych płyt obwodowych, a czasem nawet niestandardowych procesorów, zaprojektowanych tak, aby spełniać wymagania konkretnego zadania, czy to w celu zmieszczenia się na nadgarstku, czy wytrzymania wysokich temperatur, dużych obciążeń lub wibracji w środowisku fabrycznym. + +Jako deweloper uczący się IoT lub tworzący prototyp urządzenia, będziesz potrzebować zestawu deweloperskiego. Są to uniwersalne urządzenia IoT zaprojektowane dla deweloperów, często z funkcjami, które nie byłyby dostępne w urządzeniach produkcyjnych, takimi jak zestaw zewnętrznych pinów do podłączania sensorów lub aktuatorów, sprzęt wspierający debugowanie czy dodatkowe zasoby, które zwiększyłyby koszt produkcji w dużej skali. + +Te zestawy deweloperskie zazwyczaj dzielą się na dwie kategorie - mikrokontrolery i komputery jednopłytkowe. Zostaną one tutaj wprowadzone, a w kolejnej lekcji omówimy je bardziej szczegółowo. + +> 💁 Twój telefon również można uznać za uniwersalne urządzenie IoT, z wbudowanymi sensorami i aktuatorami, które różne aplikacje wykorzystują na różne sposoby, współpracując z różnymi usługami w chmurze. Możesz nawet znaleźć niektóre samouczki IoT, które używają aplikacji na telefonie jako urządzenia IoT. + +### Mikrokontrolery + +Mikrokontroler (często nazywany MCU, od ang. microcontroller unit) to mały komputer składający się z: + +🧠 Jednego lub więcej procesorów centralnych (CPU) - "mózgu" mikrokontrolera, który wykonuje Twój program + +💾 Pamięci (RAM i pamięci programu) - miejsca, gdzie przechowywane są Twój program, dane i zmienne + +🔌 Programowalnych połączeń wejścia/wyjścia (I/O) - do komunikacji z zewnętrznymi urządzeniami peryferyjnymi (podłączonymi urządzeniami), takimi jak sensory i aktuatory + +Mikrokontrolery są zazwyczaj tanimi urządzeniami obliczeniowymi, z przeciętnymi cenami dla tych używanych w niestandardowym sprzęcie spadającymi do około 0,50 USD, a niektóre urządzenia kosztują nawet 0,03 USD. Zestawy deweloperskie mogą zaczynać się od 4 USD, a ich koszt rośnie wraz z dodawaniem kolejnych funkcji. [Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html), zestaw deweloperski mikrokontrolera od [Seeed studios](https://www.seeedstudio.com), który ma sensory, aktuatory, WiFi i ekran, kosztuje około 30 USD. + +![Wio Terminal](../../../../../translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.pl.png) + +> 💁 Szukając w Internecie mikrokontrolerów, uważaj na wyszukiwanie terminu **MCU**, ponieważ może to zwrócić wiele wyników dotyczących Marvel Cinematic Universe, a nie mikrokontrolerów. + +Mikrokontrolery są zaprojektowane do wykonywania ograniczonej liczby bardzo specyficznych zadań, a nie do bycia komputerami ogólnego przeznaczenia, takimi jak PC czy Mac. Z wyjątkiem bardzo specyficznych scenariuszy, nie można podłączyć do nich monitora, klawiatury i myszy, aby używać ich do ogólnych zadań. + +Zestawy deweloperskie mikrokontrolerów zazwyczaj mają dodatkowe sensory i aktuatory na pokładzie. Większość płyt ma jedną lub więcej diod LED, które można zaprogramować, wraz z innymi urządzeniami, takimi jak standardowe złącza do dodawania kolejnych sensorów lub aktuatorów w ekosystemach różnych producentów czy wbudowane sensory (zazwyczaj najpopularniejsze, takie jak sensory temperatury). Niektóre mikrokontrolery mają wbudowaną łączność bezprzewodową, taką jak Bluetooth czy WiFi, lub dodatkowe mikrokontrolery na płytce, aby dodać tę łączność. + +> 💁 Mikrokontrolery są zazwyczaj programowane w językach C/C++. + +### Komputery jednopłytkowe + +Komputer jednopłytkowy to małe urządzenie obliczeniowe, które zawiera wszystkie elementy pełnoprawnego komputera na jednej małej płytce. Są to urządzenia o specyfikacjach zbliżonych do komputerów stacjonarnych lub laptopów, które działają na pełnym systemie operacyjnym, ale są mniejsze, zużywają mniej energii i są znacznie tańsze. + +![Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.pl.jpg) + +Raspberry Pi jest jednym z najpopularniejszych komputerów jednopłytkowych. + +Podobnie jak mikrokontroler, komputer jednopłytkowy ma CPU, pamięć i piny wejścia/wyjścia, ale ma dodatkowe funkcje, takie jak układ graficzny umożliwiający podłączenie monitorów, wyjścia audio i porty USB do podłączenia klawiatur, myszy i innych standardowych urządzeń USB, takich jak kamery internetowe czy zewnętrzne pamięci. Programy są przechowywane na kartach SD lub dyskach twardych wraz z systemem operacyjnym, zamiast na wbudowanym chipie pamięci. + +> 🎓 Możesz pomyśleć o komputerze jednopłytkowym jako o mniejszej, tańszej wersji PC lub Maca, na którym czytasz ten tekst, z dodatkowymi pinami GPIO (ogólnego przeznaczenia wejścia/wyjścia) do interakcji z sensorami i aktuatorami. + +Komputery jednopłytkowe są pełnoprawnymi komputerami, więc można je programować w dowolnym języku. Urządzenia IoT są zazwyczaj programowane w Pythonie. + +### Wybór sprzętu na kolejne lekcje + +Wszystkie kolejne lekcje zawierają zadania z użyciem urządzenia IoT do interakcji ze światem fizycznym i komunikacji z chmurą. Każda lekcja wspiera 3 opcje urządzeń - Arduino (z użyciem Seeed Studios Wio Terminal) lub komputer jednopłytkowy, fizyczny (Raspberry Pi 4) lub wirtualny komputer jednopłytkowy działający na Twoim PC lub Macu. + +Możesz przeczytać o sprzęcie potrzebnym do wykonania wszystkich zadań w [przewodniku sprzętowym](../../../hardware.md). + +> 💁 Nie musisz kupować żadnego sprzętu IoT, aby wykonać zadania - wszystko możesz zrobić, używając wirtualnego komputera jednopłytkowego. + +Wybór sprzętu zależy od Ciebie - od tego, co masz dostępne w domu lub w szkole, oraz od języka programowania, który znasz lub planujesz się nauczyć. Oba warianty sprzętu będą korzystać z tego samego ekosystemu sensorów, więc jeśli zaczniesz od jednej opcji, możesz przejść na drugą bez konieczności wymiany większości zestawu. Wirtualny komputer jednopłytkowy będzie odpowiednikiem nauki na Raspberry Pi, a większość kodu będzie można przenieść na Pi, jeśli w przyszłości zdobędziesz urządzenie i sensory. + +### Zestaw deweloperski Arduino + +Jeśli interesuje Cię nauka programowania mikrokontrolerów, możesz wykonać zadania, używając urządzenia Arduino. Będziesz potrzebować podstawowej znajomości programowania w językach C/C++, ponieważ lekcje będą uczyć tylko kodu związanego z frameworkiem Arduino, używanymi sensorami i aktuatorami oraz bibliotekami współpracującymi z chmurą. + +Zadania będą korzystać z [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) z rozszerzeniem [PlatformIO do programowania mikrokontrolerów](https://platformio.org). Możesz również używać Arduino IDE, jeśli masz doświadczenie z tym narzędziem, ponieważ instrukcje nie będą dostarczane. + +### Zestaw deweloperski komputera jednopłytkowego + +Jeśli interesuje Cię nauka programowania IoT z użyciem komputerów jednopłytkowych, możesz wykonać zadania, używając Raspberry Pi lub wirtualnego urządzenia działającego na Twoim PC lub Macu. + +Będziesz potrzebować podstawowej znajomości programowania w Pythonie, ponieważ lekcje będą uczyć tylko kodu związanego z używanymi sensorami i aktuatorami oraz bibliotekami współpracującymi z chmurą. + +> 💁 Jeśli chcesz nauczyć się programowania w Pythonie, sprawdź następujące serie wideo: +> +> * [Python dla początkujących](https://channel9.msdn.com/Series/Intro-to-Python-Development?WT.mc_id=academic-17441-jabenn) +> * [Więcej Python dla początkujących](https://channel9.msdn.com/Series/More-Python-for-Beginners?WT.mc_id=academic-7372-jabenn) + +Zadania będą korzystać z [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn). + +Jeśli używasz Raspberry Pi, możesz uruchomić Pi z pełną wersją desktopową Raspberry Pi OS i programować bezpośrednio na Pi, używając [wersji VS Code dla Raspberry Pi OS](https://code.visualstudio.com/docs/setup/raspberry-pi?WT.mc_id=academic-17441-jabenn), lub uruchomić Pi jako urządzenie bezgłowe i programować z PC lub Maca, używając VS Code z rozszerzeniem [Remote SSH](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn), które pozwala na połączenie z Pi i edytowanie, debugowanie oraz uruchamianie kodu tak, jakbyś programował bezpośrednio na nim. + +Jeśli korzystasz z opcji wirtualnego urządzenia, będziesz programować bezpośrednio na swoim komputerze. Zamiast korzystać z sensorów i aktuatorów, użyjesz narzędzia do symulacji tego sprzętu, które pozwoli Ci definiować wartości sensorów i wyświetlać wyniki aktuatorów na ekranie. + +## Konfiguracja urządzenia + +Zanim zaczniesz programować swoje urządzenie IoT, musisz wykonać niewielką konfigurację. Postępuj zgodnie z odpowiednimi instrukcjami w zależności od używanego urządzenia. +💁 Jeśli jeszcze nie masz urządzenia, zajrzyj do [przewodnika sprzętowego](../../../hardware.md), aby zdecydować, którego urządzenia będziesz używać i jaki dodatkowy sprzęt musisz zakupić. Nie musisz kupować sprzętu, ponieważ wszystkie projekty można uruchomić na wirtualnym sprzęcie. +Te instrukcje zawierają linki do stron internetowych twórców sprzętu lub narzędzi, których będziesz używać. Ma to na celu zapewnienie, że zawsze korzystasz z najbardziej aktualnych instrukcji dotyczących różnych narzędzi i sprzętu. + +Przejdź przez odpowiedni przewodnik, aby skonfigurować swoje urządzenie i ukończyć projekt "Hello World". Będzie to pierwszy krok w tworzeniu nocnej lampki IoT w ciągu 4 lekcji w tej części wprowadzającej. + +* [Arduino - Wio Terminal](wio-terminal.md) +* [Komputer jednopłytkowy - Raspberry Pi](pi.md) +* [Komputer jednopłytkowy - Wirtualne urządzenie](virtual-device.md) + +✅ Będziesz używać VS Code zarówno dla Arduino, jak i komputerów jednopłytkowych. Jeśli wcześniej go nie używałeś, przeczytaj więcej na stronie [VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn). + +## Zastosowania IoT + +IoT obejmuje ogromny zakres zastosowań, w kilku szerokich grupach: + +* Konsumenckie IoT +* Komercyjne IoT +* Przemysłowe IoT +* Infrastrukturalne IoT + +✅ Zrób małe badanie: Dla każdego z opisanych poniżej obszarów znajdź jeden konkretny przykład, który nie został podany w tekście. + +### Konsumenckie IoT + +Konsumenckie IoT odnosi się do urządzeń IoT, które konsumenci kupują i używają w domu. Niektóre z tych urządzeń są niezwykle przydatne, takie jak inteligentne głośniki, inteligentne systemy grzewcze i robotyczne odkurzacze. Inne budzą wątpliwości co do swojej użyteczności, na przykład krany sterowane głosem, które nie pozwalają ich wyłączyć, gdy sterowanie głosowe nie słyszy cię przez dźwięk płynącej wody. + +Urządzenia konsumenckie IoT umożliwiają ludziom osiąganie więcej w ich otoczeniu, szczególnie miliardowi osób z niepełnosprawnościami. Robotyczne odkurzacze mogą zapewnić czyste podłogi osobom z problemami z poruszaniem się, które nie mogą samodzielnie odkurzać, piekarniki sterowane głosem pozwalają osobom z ograniczonym wzrokiem lub kontrolą motoryczną nagrzewać piekarniki tylko za pomocą głosu, a monitory zdrowia umożliwiają pacjentom samodzielne monitorowanie przewlekłych schorzeń z bardziej regularnymi i szczegółowymi aktualizacjami ich stanu. Te urządzenia stają się tak powszechne, że nawet małe dzieci używają ich w codziennym życiu, na przykład uczniowie uczący się zdalnie podczas pandemii COVID ustawiają timery na inteligentnych urządzeniach domowych, aby śledzić swoją naukę lub ustawiać alarmy przypominające o nadchodzących zajęciach. + +✅ Jakie urządzenia konsumenckie IoT masz przy sobie lub w swoim domu? + +### Komercyjne IoT + +Komercyjne IoT obejmuje wykorzystanie IoT w miejscu pracy. W biurze mogą znajdować się czujniki obecności i detektory ruchu, które zarządzają oświetleniem i ogrzewaniem, aby działały tylko wtedy, gdy są potrzebne, co zmniejsza koszty i emisję dwutlenku węgla. W fabryce urządzenia IoT mogą monitorować zagrożenia bezpieczeństwa, takie jak pracownicy nie noszący kasków ochronnych lub hałas osiągający niebezpieczne poziomy. W handlu detalicznym urządzenia IoT mogą mierzyć temperaturę w chłodniach, ostrzegając właściciela sklepu, jeśli lodówka lub zamrażarka przekroczy wymaganą temperaturę, lub monitorować produkty na półkach, aby skierować pracowników do uzupełnienia sprzedanych towarów. Branża transportowa coraz częściej polega na IoT do monitorowania lokalizacji pojazdów, śledzenia przebiegu na drogach w celu naliczania opłat drogowych, monitorowania godzin pracy kierowców i przestrzegania przerw, lub powiadamiania personelu, gdy pojazd zbliża się do magazynu, aby przygotować się do załadunku lub rozładunku. + +✅ Jakie urządzenia komercyjne IoT znajdują się w twojej szkole lub miejscu pracy? + +### Przemysłowe IoT (IIoT) + +Przemysłowe IoT, czyli IIoT, to wykorzystanie urządzeń IoT do kontrolowania i zarządzania maszynami na dużą skalę. Obejmuje to szeroki zakres zastosowań, od fabryk po cyfrowe rolnictwo. + +Fabryki wykorzystują urządzenia IoT na wiele różnych sposobów. Maszyny mogą być monitorowane za pomocą wielu czujników, które śledzą takie parametry jak temperatura, wibracje i prędkość obrotowa. Dane te mogą być monitorowane, aby zatrzymać maszynę, jeśli wyjdzie poza określone tolerancje - na przykład, gdy zbytnio się nagrzewa i zostaje wyłączona. Dane te mogą być również gromadzone i analizowane w czasie, aby przeprowadzać konserwację predykcyjną, gdzie modele AI analizują dane prowadzące do awarii i wykorzystują je do przewidywania innych awarii, zanim się wydarzą. + +Cyfrowe rolnictwo jest kluczowe, jeśli planeta ma wyżywić rosnącą populację, szczególnie 2 miliardy ludzi w 500 milionach gospodarstw domowych, które utrzymują się z [rolnictwa na własne potrzeby](https://wikipedia.org/wiki/Subsistence_agriculture). Cyfrowe rolnictwo może obejmować zarówno tanie czujniki za kilka dolarów, jak i ogromne komercyjne instalacje. Rolnik może zacząć od monitorowania temperatur i korzystania z [dni stopni wzrostu](https://wikipedia.org/wiki/Growing_degree-day), aby przewidzieć, kiedy plon będzie gotowy do zbioru. Może połączyć monitorowanie wilgotności gleby z automatycznymi systemami nawadniania, aby dostarczyć roślinom tyle wody, ile potrzebują, ale nie więcej, aby zapewnić, że ich uprawy nie wyschną, nie marnując przy tym wody. Rolnicy idą jeszcze dalej, używając dronów, danych satelitarnych i AI do monitorowania wzrostu upraw, chorób i jakości gleby na ogromnych obszarach ziemi uprawnej. + +✅ Jakie inne urządzenia IoT mogłyby pomóc rolnikom? + +### Infrastrukturalne IoT + +Infrastrukturalne IoT to monitorowanie i kontrolowanie lokalnej i globalnej infrastruktury, z której ludzie korzystają na co dzień. + +[Smart Cities](https://wikipedia.org/wiki/Smart_city) to obszary miejskie, które wykorzystują urządzenia IoT do zbierania danych o mieście i wykorzystywania ich do poprawy funkcjonowania miasta. Miasta te są zazwyczaj zarządzane we współpracy między lokalnymi władzami, środowiskiem akademickim i lokalnymi firmami, monitorując i zarządzając różnymi aspektami, od transportu po parkowanie i zanieczyszczenie. Na przykład w Kopenhadze w Danii zanieczyszczenie powietrza jest ważne dla lokalnych mieszkańców, więc jest ono mierzone, a dane są wykorzystywane do dostarczania informacji o najczystszych trasach rowerowych i joggingowych. + +[Inteligentne sieci energetyczne](https://wikipedia.org/wiki/Smart_grid) pozwalają na lepszą analizę zapotrzebowania na energię dzięki zbieraniu danych o zużyciu na poziomie indywidualnych domów. Dane te mogą kierować decyzjami na poziomie kraju, w tym gdzie budować nowe elektrownie, oraz na poziomie osobistym, dostarczając użytkownikom informacji o tym, ile energii zużywają, kiedy ją zużywają, a nawet sugestii, jak obniżyć koszty, na przykład ładując samochody elektryczne w nocy. + +✅ Gdybyś mógł dodać urządzenia IoT do pomiaru czegokolwiek w miejscu, w którym mieszkasz, co by to było? + +## Przykłady urządzeń IoT, które mogą być wokół ciebie + +Byłbyś zdziwiony, jak wiele urządzeń IoT znajduje się wokół ciebie. Piszę to z domu i mam następujące urządzenia podłączone do Internetu z inteligentnymi funkcjami, takimi jak sterowanie aplikacją, sterowanie głosowe lub możliwość wysyłania danych na mój telefon: + +* Wiele inteligentnych głośników +* Lodówka, zmywarka, piekarnik i mikrofalówka +* Monitor energii dla paneli słonecznych +* Inteligentne gniazdka +* Wideodomofon i kamery bezpieczeństwa +* Inteligentny termostat z wieloma czujnikami w pomieszczeniach +* Otwieracz do drzwi garażowych +* Systemy rozrywki domowej i telewizory sterowane głosem +* Oświetlenie +* Trackery fitness i zdrowia + +Wszystkie te urządzenia mają czujniki i/lub siłowniki i komunikują się z Internetem. Mogę sprawdzić na telefonie, czy drzwi garażowe są otwarte, i poprosić inteligentny głośnik, aby je zamknął. Mogę nawet ustawić timer, aby jeśli są otwarte w nocy, zamknęły się automatycznie. Gdy dzwoni mój dzwonek do drzwi, mogę zobaczyć na telefonie, kto tam jest, gdziekolwiek jestem na świecie, i rozmawiać z nimi przez głośnik i mikrofon wbudowany w dzwonek. Mogę monitorować poziom glukozy we krwi, tętno i wzorce snu, szukając wzorców w danych, aby poprawić swoje zdrowie. Mogę sterować oświetleniem przez chmurę i siedzieć w ciemności, gdy połączenie z Internetem przestaje działać. + +--- + +## 🚀 Wyzwanie + +Wypisz jak najwięcej urządzeń IoT, które znajdują się w twoim domu, szkole lub miejscu pracy - może być ich więcej, niż myślisz! + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/2) + +## Przegląd i samodzielna nauka + +Przeczytaj o korzyściach i porażkach projektów konsumenckich IoT. Sprawdź strony z wiadomościami w poszukiwaniu artykułów o przypadkach, gdy coś poszło nie tak, takich jak problemy z prywatnością, problemy sprzętowe lub problemy spowodowane brakiem łączności. + +Kilka przykładów: + +* Sprawdź konto na Twitterze **[Internet of Sh*t](https://twitter.com/internetofshit)** *(ostrzeżenie o wulgaryzmach)*, aby zobaczyć dobre przykłady porażek w konsumenckim IoT. +* [c|net - Mój Apple Watch uratował mi życie: 5 osób dzieli się swoimi historiami](https://www.cnet.com/news/apple-watch-lifesaving-health-features-read-5-peoples-stories/) +* [c|net - Technik ADT przyznaje się do winy za szpiegowanie klientów przez lata](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on-customer-camera-feeds-for-years/) *(ostrzeżenie o treściach dotyczących niekonsensualnego podglądania)* + +## Zadanie + +[Zbadaj projekt IoT](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/1-introduction-to-iot/assignment.md b/translations/pl/1-getting-started/lessons/1-introduction-to-iot/assignment.md new file mode 100644 index 00000000..d02a0b49 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/1-introduction-to-iot/assignment.md @@ -0,0 +1,25 @@ + +# Zbadaj projekt IoT + +## Instrukcje + +Na całym świecie wdrażane są liczne projekty IoT na dużą i małą skalę, od inteligentnych farm po inteligentne miasta, w monitorowaniu zdrowia, transporcie oraz w przestrzeniach publicznych. + +Poszukaj w internecie szczegółów dotyczących projektu, który Cię interesuje, najlepiej takiego, który znajduje się blisko Twojego miejsca zamieszkania. Wyjaśnij zalety i wady tego projektu, takie jak korzyści, jakie z niego płyną, problemy, które powoduje, oraz sposób, w jaki uwzględniono kwestie prywatności. + +## Kryteria oceny + +| Kryterium | Wzorowe | Zadowalające | Wymaga poprawy | +| --------- | ------- | ------------ | -------------- | +| Wyjaśnienie zalet i wad | Jasno wyjaśniono zalety i wady projektu | Krótko wyjaśniono zalety i wady projektu | Nie wyjaśniono zalet ani wad projektu | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/1-introduction-to-iot/pi.md b/translations/pl/1-getting-started/lessons/1-introduction-to-iot/pi.md new file mode 100644 index 00000000..95c43c97 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/1-introduction-to-iot/pi.md @@ -0,0 +1,284 @@ + +# Raspberry Pi + +[Raspberry Pi](https://raspberrypi.org) to komputer jednopłytkowy. Możesz dodawać czujniki i siłowniki, korzystając z szerokiej gamy urządzeń i ekosystemów. W tych lekcjach będziesz używać ekosystemu sprzętowego o nazwie [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html). Kodowanie na Raspberry Pi oraz dostęp do czujników Grove odbywa się za pomocą języka Python. + +![Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.pl.jpg) + +## Konfiguracja + +Jeśli używasz Raspberry Pi jako swojego sprzętu IoT, masz dwie opcje – możesz przejść przez wszystkie lekcje i pisać kod bezpośrednio na Pi, lub możesz połączyć się zdalnie z Pi w trybie "headless" i pisać kod na swoim komputerze. + +Przed rozpoczęciem musisz również podłączyć Grove Base Hat do swojego Pi. + +### Zadanie - konfiguracja + +Zainstaluj Grove Base Hat na swoim Pi i skonfiguruj Pi. + +1. Podłącz Grove Base Hat do swojego Pi. Gniazdo na hat pasuje do wszystkich pinów GPIO na Pi, wsuwając się na nie aż do podstawy. Hat zakrywa Pi. + + ![Zakładanie Grove Hat](../../../../../images/pi-grove-hat-fitting.gif) + +1. Zdecyduj, w jaki sposób chcesz programować swoje Pi, i przejdź do odpowiedniej sekcji poniżej: + + * [Praca bezpośrednio na Pi](../../../../../1-getting-started/lessons/1-introduction-to-iot) + * [Zdalny dostęp do kodowania na Pi](../../../../../1-getting-started/lessons/1-introduction-to-iot) + +### Praca bezpośrednio na Pi + +Jeśli chcesz pracować bezpośrednio na swoim Pi, możesz użyć wersji desktopowej Raspberry Pi OS i zainstalować wszystkie potrzebne narzędzia. + +#### Zadanie - praca bezpośrednio na Pi + +Skonfiguruj swoje Pi do programowania. + +1. Postępuj zgodnie z instrukcjami w [przewodniku konfiguracji Raspberry Pi](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up), aby skonfigurować swoje Pi, podłączyć je do klawiatury/myszy/monitora, połączyć z siecią WiFi lub Ethernet i zaktualizować oprogramowanie. + +Aby programować Pi za pomocą czujników i siłowników Grove, musisz zainstalować edytor do pisania kodu urządzenia oraz różne biblioteki i narzędzia do interakcji ze sprzętem Grove. + +1. Po ponownym uruchomieniu Pi uruchom Terminal, klikając ikonę **Terminal** na górnym pasku menu lub wybierz *Menu -> Accessories -> Terminal*. + +1. Wykonaj następujące polecenie, aby upewnić się, że system operacyjny i zainstalowane oprogramowanie są aktualne: + + ```sh + sudo apt update && sudo apt full-upgrade --yes + ``` + +1. Wykonaj następujące polecenia, aby zainstalować wszystkie potrzebne biblioteki dla sprzętu Grove: + + ```sh + sudo apt install git python3-dev python3-pip --yes + + git clone https://github.com/Seeed-Studio/grove.py + cd grove.py + sudo pip3 install . + + sudo raspi-config nonint do_i2c 0 + ``` + + To rozpoczyna instalację Git oraz Pip do instalacji pakietów Pythona. + + Jedną z potężnych funkcji Pythona jest możliwość instalacji [pakietów Pip](https://pypi.org) – są to pakiety kodu napisane przez innych ludzi i opublikowane w Internecie. Możesz zainstalować pakiet Pip na swoim komputerze jednym poleceniem, a następnie używać go w swoim kodzie. + + Pakiety Python Grove od Seeed muszą być zainstalowane ze źródła. Te polecenia sklonują repozytorium zawierające kod źródłowy tego pakietu, a następnie zainstalują go lokalnie. + + > 💁 Domyślnie, gdy instalujesz pakiet, jest on dostępny wszędzie na twoim komputerze, co może prowadzić do problemów z wersjami pakietów – na przykład jedna aplikacja może zależeć od jednej wersji pakietu, która przestaje działać po zainstalowaniu nowej wersji dla innej aplikacji. Aby rozwiązać ten problem, możesz użyć [wirtualnego środowiska Pythona](https://docs.python.org/3/library/venv.html), czyli kopii Pythona w dedykowanym folderze, a instalowane pakiety Pip są dostępne tylko w tym folderze. Nie będziesz używać wirtualnych środowisk na swoim Pi. Skrypt instalacyjny Grove instaluje pakiety Python Grove globalnie, więc aby użyć wirtualnego środowiska, musiałbyś je skonfigurować, a następnie ręcznie ponownie zainstalować pakiety Grove w tym środowisku. Łatwiej jest po prostu używać pakietów globalnych, zwłaszcza że wielu deweloperów Pi ponownie flashuje czystą kartę SD dla każdego projektu. + + Na koniec to polecenie włącza interfejs I2C. + +1. Uruchom ponownie Pi, używając menu lub wykonując następujące polecenie w Terminalu: + + ```sh + sudo reboot + ``` + +1. Po ponownym uruchomieniu Pi, ponownie uruchom Terminal i wykonaj następujące polecenie, aby zainstalować [Visual Studio Code (VS Code)](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) – to edytor, którego będziesz używać do pisania kodu urządzenia w Pythonie. + + ```sh + sudo apt install code + ``` + + Po zainstalowaniu VS Code będzie dostępny z górnego menu. + + > 💁 Możesz używać dowolnego IDE lub edytora Pythona, jeśli masz preferowane narzędzie, ale lekcje będą zawierały instrukcje oparte na używaniu VS Code. + +1. Zainstaluj Pylance. Jest to rozszerzenie dla VS Code, które zapewnia wsparcie dla języka Python. Zapoznaj się z [dokumentacją rozszerzenia Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance), aby uzyskać instrukcje dotyczące instalacji tego rozszerzenia w VS Code. + +### Zdalny dostęp do kodowania na Pi + +Zamiast kodować bezpośrednio na Pi, możesz uruchomić je w trybie "headless", czyli bez podłączonej klawiatury/myszy/monitora, i konfigurować oraz pisać kod na nim z poziomu swojego komputera, używając Visual Studio Code. + +#### Konfiguracja systemu Pi OS + +Aby kodować zdalnie, system Pi OS musi być zainstalowany na karcie SD. + +##### Zadanie - konfiguracja systemu Pi OS + +Skonfiguruj system Pi OS w trybie headless. + +1. Pobierz **Raspberry Pi Imager** ze [strony oprogramowania Raspberry Pi OS](https://www.raspberrypi.org/software/) i zainstaluj go. + +1. Włóż kartę SD do swojego komputera, używając adaptera, jeśli to konieczne. + +1. Uruchom Raspberry Pi Imager. + +1. W Raspberry Pi Imager wybierz przycisk **CHOOSE OS**, a następnie wybierz *Raspberry Pi OS (Other)*, a potem *Raspberry Pi OS Lite (32-bit)*. + + ![Raspberry Pi Imager z wybranym Raspberry Pi OS Lite](../../../../../translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.pl.png) + + > 💁 Raspberry Pi OS Lite to wersja Raspberry Pi OS bez interfejsu graficznego i narzędzi opartych na UI. Nie są one potrzebne dla Pi w trybie headless, co sprawia, że instalacja jest mniejsza, a czas uruchamiania szybszy. + +1. Wybierz przycisk **CHOOSE STORAGE**, a następnie wybierz swoją kartę SD. + +1. Uruchom **Advanced Options**, naciskając `Ctrl+Shift+X`. Te opcje pozwalają na wstępną konfigurację Raspberry Pi OS przed zapisaniem go na karcie SD. + + 1. Zaznacz pole **Enable SSH** i ustaw hasło dla użytkownika `pi`. To hasło będzie używane do logowania się na Pi później. + + 1. Jeśli planujesz połączyć się z Pi przez WiFi, zaznacz pole **Configure WiFi** i wprowadź swoją nazwę sieci WiFi (SSID) oraz hasło, a także wybierz swój kraj WiFi. Nie musisz tego robić, jeśli będziesz używać kabla Ethernet. Upewnij się, że sieć, do której się łączysz, jest tą samą, na której znajduje się twój komputer. + + 1. Zaznacz pole **Set locale settings** i ustaw swój kraj oraz strefę czasową. + + 1. Wybierz przycisk **SAVE**. + +1. Wybierz przycisk **WRITE**, aby zapisać system operacyjny na karcie SD. Jeśli używasz macOS, zostaniesz poproszony o podanie hasła, ponieważ narzędzie zapisujące obrazy dysków wymaga uprawnień administratora. + +System operacyjny zostanie zapisany na karcie SD, a po zakończeniu karta zostanie wysunięta przez system operacyjny, a ty zostaniesz o tym powiadomiony. Wyjmij kartę SD z komputera, włóż ją do Pi, włącz Pi i poczekaj około 2 minut, aż się poprawnie uruchomi. + +#### Połączenie z Pi + +Następnym krokiem jest zdalny dostęp do Pi. Możesz to zrobić za pomocą `ssh`, które jest dostępne na macOS, Linux i nowszych wersjach Windows. + +##### Zadanie - połączenie z Pi + +Uzyskaj zdalny dostęp do Pi. + +1. Uruchom Terminal lub Wiersz Poleceń i wprowadź następujące polecenie, aby połączyć się z Pi: + + ```sh + ssh pi@raspberrypi.local + ``` + + Jeśli używasz starszej wersji Windows, która nie ma zainstalowanego `ssh`, możesz użyć OpenSSH. Instrukcje instalacji znajdziesz w [dokumentacji instalacji OpenSSH](https://docs.microsoft.com//windows-server/administration/openssh/openssh_install_firstuse?WT.mc_id=academic-17441-jabenn). + +1. Powinno to połączyć cię z Pi i poprosić o hasło. + + Możliwość znajdowania komputerów w sieci za pomocą `.local` to stosunkowo nowa funkcja w Linux i Windows. Jeśli używasz Linux lub Windows i pojawią się błędy dotyczące nieznalezienia nazwy hosta, będziesz musiał zainstalować dodatkowe oprogramowanie, aby włączyć sieć ZeroConf (określaną przez Apple jako Bonjour): + + 1. Jeśli używasz Linux, zainstaluj Avahi, wykonując następujące polecenie: + + ```sh + sudo apt-get install avahi-daemon + ``` + + 1. Jeśli używasz Windows, najprostszym sposobem na włączenie ZeroConf jest zainstalowanie [Bonjour Print Services for Windows](http://support.apple.com/kb/DL999). Możesz również zainstalować [iTunes dla Windows](https://www.apple.com/itunes/download/), aby uzyskać nowszą wersję narzędzia (które nie jest dostępne samodzielnie). + + > 💁 Jeśli nie możesz połączyć się za pomocą `raspberrypi.local`, możesz użyć adresu IP swojego Pi. Zapoznaj się z [dokumentacją adresu IP Raspberry Pi](https://www.raspberrypi.org/documentation/remote-access/ip-address.md), aby uzyskać instrukcje dotyczące różnych sposobów uzyskania adresu IP. + +1. Wprowadź hasło, które ustawiłeś w zaawansowanych opcjach Raspberry Pi Imager. + +#### Konfiguracja oprogramowania na Pi + +Po połączeniu z Pi musisz upewnić się, że system operacyjny jest aktualny, oraz zainstalować różne biblioteki i narzędzia do interakcji ze sprzętem Grove. + +##### Zadanie - konfiguracja oprogramowania na Pi + +Skonfiguruj zainstalowane oprogramowanie Pi i zainstaluj biblioteki Grove. + +1. W swojej sesji `ssh` wykonaj następujące polecenie, aby zaktualizować system, a następnie uruchomić Pi ponownie: + + ```sh + sudo apt update && sudo apt full-upgrade --yes && sudo reboot + ``` + + Pi zostanie zaktualizowane i uruchomione ponownie. Sesja `ssh` zakończy się, gdy Pi zostanie uruchomione ponownie, więc odczekaj około 30 sekund, a następnie połącz się ponownie. + +1. W ponownie połączonej sesji `ssh` wykonaj następujące polecenia, aby zainstalować wszystkie potrzebne biblioteki dla sprzętu Grove: + + ```sh + sudo apt install git python3-dev python3-pip --yes + + git clone https://github.com/Seeed-Studio/grove.py + cd grove.py + sudo pip3 install . + + sudo raspi-config nonint do_i2c 0 + ``` + + To rozpoczyna instalację Git oraz Pip do instalacji pakietów Pythona. + + Jedną z potężnych funkcji Pythona jest możliwość instalacji [pakietów Pip](https://pypi.org) – są to pakiety kodu napisane przez innych ludzi i opublikowane w Internecie. Możesz zainstalować pakiet Pip na swoim komputerze jednym poleceniem, a następnie używać go w swoim kodzie. + + Pakiety Python Grove od Seeed muszą być zainstalowane ze źródła. Te polecenia sklonują repozytorium zawierające kod źródłowy tego pakietu, a następnie zainstalują go lokalnie. + + > 💁 Domyślnie, gdy instalujesz pakiet, jest on dostępny wszędzie na twoim komputerze, co może prowadzić do problemów z wersjami pakietów – na przykład jedna aplikacja może zależeć od jednej wersji pakietu, która przestaje działać po zainstalowaniu nowej wersji dla innej aplikacji. Aby rozwiązać ten problem, możesz użyć [wirtualnego środowiska Pythona](https://docs.python.org/3/library/venv.html), czyli kopii Pythona w dedykowanym folderze, a instalowane pakiety Pip są dostępne tylko w tym folderze. Nie będziesz używać wirtualnych środowisk na swoim Pi. Skrypt instalacyjny Grove instaluje pakiety Python Grove globalnie, więc aby użyć wirtualnego środowiska, musiałbyś je skonfigurować, a następnie ręcznie ponownie zainstalować pakiety Grove w tym środowisku. Łatwiej jest po prostu używać pakietów globalnych, zwłaszcza że wielu deweloperów Pi ponownie flashuje czystą kartę SD dla każdego projektu. + + Na koniec to polecenie włącza interfejs I2C. + +1. Uruchom ponownie Pi, wykonując następujące polecenie: + + ```sh + sudo reboot + ``` + + Sesja `ssh` zakończy się, gdy Pi zostanie uruchomione ponownie. Nie ma potrzeby ponownego łączenia się. + +#### Konfiguracja VS Code do zdalnego dostępu + +Po skonfigurowaniu Pi możesz połączyć się z nim za pomocą Visual Studio Code (VS Code) z poziomu swojego komputera – jest to darmowy edytor tekstu dla programistów, którego będziesz używać do pisania kodu urządzenia w Pythonie. + +##### Zadanie - konfiguracja VS Code do zdalnego dostępu + +Zainstaluj wymagane oprogramowanie i połącz się zdalnie z Pi. + +1. Zainstaluj VS Code na swoim komputerze, postępując zgodnie z [dokumentacją VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn). + +1. Postępuj zgodnie z instrukcjami w [dokumentacji zdalnego programowania w VS Code za pomocą SSH](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn), aby zainstalować potrzebne komponenty. + +1. Postępując zgodnie z tymi samymi instrukcjami, połącz VS Code z Pi. + +1. Po połączeniu postępuj zgodnie z instrukcjami dotyczącymi [zarządzania rozszerzeniami](https://code.visualstudio.com/docs/remote/ssh#_managing-extensions?WT.mc_id=academic-17441-jabenn), aby zainstalować zdalnie na Pi rozszerzenie [Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance). + +## Hello world +Tradycyjnie, gdy zaczynamy pracę z nowym językiem programowania lub technologią, tworzymy aplikację 'Hello World' – małą aplikację, która wyświetla tekst, np. `"Hello World"`, aby upewnić się, że wszystkie narzędzia są poprawnie skonfigurowane. + +Aplikacja Hello World dla Raspberry Pi pozwoli Ci upewnić się, że Python i Visual Studio Code są poprawnie zainstalowane. + +Ta aplikacja znajdzie się w folderze o nazwie `nightlight` i będzie ponownie wykorzystywana z różnym kodem w dalszych częściach tego zadania, aby stworzyć aplikację nightlight. + +### Zadanie - hello world + +Stwórz aplikację Hello World. + +1. Uruchom VS Code, bezpośrednio na Raspberry Pi lub na swoim komputerze, łącząc się z Pi za pomocą rozszerzenia Remote SSH. + +1. Otwórz terminal w VS Code, wybierając *Terminal -> New Terminal* lub naciskając `` CTRL+` ``. Terminal otworzy się w katalogu domowym użytkownika `pi`. + +1. Wykonaj poniższe polecenia, aby utworzyć katalog na swój kod i plik Python o nazwie `app.py` w tym katalogu: + + ```sh + mkdir nightlight + cd nightlight + touch app.py + ``` + +1. Otwórz ten folder w VS Code, wybierając *File -> Open...* i wskazując folder *nightlight*, a następnie wybierz **OK**. + + ![Okno dialogowe otwierania w VS Code pokazujące folder nightlight](../../../../../translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.pl.png) + +1. Otwórz plik `app.py` w eksploratorze VS Code i dodaj poniższy kod: + + ```python + print('Hello World!') + ``` + + Funkcja `print` wypisuje na konsolę wszystko, co zostanie do niej przekazane. + +1. W terminalu VS Code uruchom poniższe polecenie, aby uruchomić swoją aplikację w Pythonie: + + ```sh + python app.py + ``` + + > 💁 Może być konieczne wyraźne użycie `python3`, aby uruchomić ten kod, jeśli masz zainstalowanego Pythona 2 obok Pythona 3 (najnowszej wersji). Jeśli Python 2 jest zainstalowany, wywołanie `python` uruchomi Pythona 2 zamiast Pythona 3. Domyślnie najnowsze wersje Raspberry Pi OS mają zainstalowanego tylko Pythona 3. + + W terminalu pojawi się następujący wynik: + + ```output + pi@raspberrypi:~/nightlight $ python3 app.py + Hello World! + ``` + +> 💁 Ten kod znajdziesz w folderze [code/pi](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/pi). + +😀 Twój program 'Hello World' zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md b/translations/pl/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md new file mode 100644 index 00000000..7a51cac9 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md @@ -0,0 +1,243 @@ + +# Wirtualny komputer jednopłytkowy + +Zamiast kupować urządzenie IoT wraz z czujnikami i elementami wykonawczymi, możesz użyć swojego komputera do symulacji sprzętu IoT. Projekt [CounterFit](https://github.com/CounterFit-IoT/CounterFit) pozwala uruchomić aplikację lokalnie, która symuluje sprzęt IoT, taki jak czujniki i elementy wykonawcze, oraz uzyskać do nich dostęp za pomocą lokalnego kodu Python, napisanego w taki sam sposób, jak kod, który napisałbyś na Raspberry Pi, używając fizycznego sprzętu. + +## Konfiguracja + +Aby korzystać z CounterFit, musisz zainstalować na swoim komputerze kilka darmowych programów. + +### Zadanie + +Zainstaluj wymagane oprogramowanie. + +1. Zainstaluj Pythona. Odwiedź [stronę pobierania Pythona](https://www.python.org/downloads/), aby uzyskać instrukcje dotyczące instalacji najnowszej wersji Pythona. + +1. Zainstaluj Visual Studio Code (VS Code). To edytor, którego będziesz używać do pisania kodu dla wirtualnego urządzenia w Pythonie. Odwiedź [dokumentację VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn), aby uzyskać instrukcje dotyczące instalacji VS Code. + + > 💁 Możesz używać dowolnego IDE lub edytora dla Pythona, jeśli masz preferowane narzędzie, ale instrukcje w lekcjach będą oparte na używaniu VS Code. + +1. Zainstaluj rozszerzenie Pylance dla VS Code. Jest to rozszerzenie, które zapewnia wsparcie dla języka Python. Odwiedź [dokumentację rozszerzenia Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance), aby uzyskać instrukcje dotyczące instalacji tego rozszerzenia w VS Code. + +Instrukcje dotyczące instalacji i konfiguracji aplikacji CounterFit zostaną podane w odpowiednim momencie w ramach instrukcji zadania, ponieważ aplikacja jest instalowana indywidualnie dla każdego projektu. + +## Hello World + +Tradycyjnie, zaczynając pracę z nowym językiem programowania lub technologią, tworzy się aplikację 'Hello World' – małą aplikację, która wyświetla tekst, np. `"Hello World"`, aby upewnić się, że wszystkie narzędzia są poprawnie skonfigurowane. + +Aplikacja Hello World dla wirtualnego sprzętu IoT pozwoli upewnić się, że Python i Visual Studio Code są poprawnie zainstalowane. Połączy się również z CounterFit, aby obsługiwać wirtualne czujniki i elementy wykonawcze IoT. Nie będzie używać żadnego sprzętu – po prostu połączy się, aby potwierdzić, że wszystko działa. + +Ta aplikacja znajdzie się w folderze o nazwie `nightlight` i będzie ponownie używana z różnym kodem w późniejszych częściach tego zadania, aby zbudować aplikację lampki nocnej. + +### Konfiguracja wirtualnego środowiska Pythona + +Jedną z potężnych funkcji Pythona jest możliwość instalowania [pakietów Pip](https://pypi.org) – są to pakiety kodu napisane przez innych i opublikowane w Internecie. Możesz zainstalować pakiet Pip na swoim komputerze za pomocą jednego polecenia, a następnie używać go w swoim kodzie. W tym zadaniu użyjesz Pip do zainstalowania pakietu umożliwiającego komunikację z CounterFit. + +Domyślnie, gdy instalujesz pakiet, jest on dostępny wszędzie na twoim komputerze, co może prowadzić do problemów z wersjami pakietów – na przykład jedna aplikacja może wymagać jednej wersji pakietu, która przestaje działać po zainstalowaniu nowej wersji dla innej aplikacji. Aby rozwiązać ten problem, możesz użyć [wirtualnego środowiska Pythona](https://docs.python.org/3/library/venv.html), czyli kopii Pythona w dedykowanym folderze. W takim środowisku pakiety Pip są instalowane tylko w tym folderze. + +> 💁 Jeśli używasz Raspberry Pi, nie konfigurowałeś wirtualnego środowiska na tym urządzeniu do zarządzania pakietami Pip. Zamiast tego używasz pakietów globalnych, ponieważ pakiety Grove są instalowane globalnie przez skrypt instalacyjny. + +#### Zadanie – konfiguracja wirtualnego środowiska Pythona + +Skonfiguruj wirtualne środowisko Pythona i zainstaluj pakiety Pip dla CounterFit. + +1. W terminalu lub wierszu poleceń uruchom następujące polecenia w wybranej lokalizacji, aby utworzyć i przejść do nowego katalogu: + + ```sh + mkdir nightlight + cd nightlight + ``` + +1. Następnie uruchom następujące polecenie, aby utworzyć wirtualne środowisko w folderze `.venv`: + + ```sh + python3 -m venv .venv + ``` + + > 💁 Musisz wyraźnie wywołać `python3`, aby utworzyć wirtualne środowisko, na wypadek gdybyś miał zainstalowanego Pythona 2 obok Pythona 3 (najnowszej wersji). Jeśli masz zainstalowanego Pythona 2, wywołanie `python` użyje Pythona 2 zamiast Pythona 3. + +1. Aktywuj wirtualne środowisko: + + * Na Windowsie: + * Jeśli używasz Wiersza Poleceń lub Wiersza Poleceń w Windows Terminal, uruchom: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Jeśli używasz PowerShell, uruchom: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + > Jeśli pojawi się błąd dotyczący wyłączonego uruchamiania skryptów w tym systemie, musisz włączyć uruchamianie skryptów, ustawiając odpowiednią politykę wykonywania. Możesz to zrobić, uruchamiając PowerShell jako administrator, a następnie wykonując następujące polecenie: + + ```powershell + Set-ExecutionPolicy -ExecutionPolicy Unrestricted + ``` + + Wpisz `Y`, aby potwierdzić. Następnie ponownie uruchom PowerShell i spróbuj ponownie. + + Możesz później przywrócić tę politykę wykonywania, jeśli zajdzie taka potrzeba. Więcej informacji znajdziesz na stronie [Execution Policies w dokumentacji Microsoft](https://docs.microsoft.com/powershell/module/microsoft.powershell.core/about/about_execution_policies?WT.mc_id=academic-17441-jabenn). + + * Na macOS lub Linux uruchom: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Te polecenia powinny być uruchamiane z tej samej lokalizacji, w której uruchomiłeś polecenie tworzące wirtualne środowisko. Nigdy nie musisz wchodzić do folderu `.venv`, zawsze uruchamiaj polecenie aktywacji i inne polecenia instalacji pakietów lub uruchamiania kodu z folderu, w którym utworzyłeś wirtualne środowisko. + +1. Po aktywacji wirtualnego środowiska domyślne polecenie `python` uruchomi wersję Pythona, która została użyta do utworzenia środowiska. Uruchom następujące polecenie, aby sprawdzić wersję: + + ```sh + python --version + ``` + + Wynik powinien zawierać: + + ```output + (.venv) ➜ nightlight python --version + Python 3.9.1 + ``` + + > 💁 Twoja wersja Pythona może być inna – o ile jest to wersja 3.6 lub nowsza, wszystko jest w porządku. Jeśli nie, usuń ten folder, zainstaluj nowszą wersję Pythona i spróbuj ponownie. + +1. Uruchom następujące polecenia, aby zainstalować pakiety Pip dla CounterFit. Pakiety te obejmują główną aplikację CounterFit oraz shimy dla sprzętu Grove. Shimy te pozwalają pisać kod tak, jakbyś programował z użyciem fizycznych czujników i elementów wykonawczych z ekosystemu Grove, ale podłączonych do wirtualnych urządzeń IoT. + + ```sh + pip install CounterFit + pip install counterfit-connection + pip install counterfit-shims-grove + ``` + + Te pakiety Pip zostaną zainstalowane tylko w wirtualnym środowisku i nie będą dostępne poza nim. + +### Napisz kod + +Gdy wirtualne środowisko Pythona jest gotowe, możesz napisać kod dla aplikacji 'Hello World'. + +#### Zadanie – napisz kod + +Utwórz aplikację w Pythonie, która wypisze `"Hello World"` w konsoli. + +1. W terminalu lub wierszu poleceń, będąc w wirtualnym środowisku, uruchom następujące polecenie, aby utworzyć plik Pythona o nazwie `app.py`: + + * Na Windowsie uruchom: + + ```cmd + type nul > app.py + ``` + + * Na macOS lub Linux uruchom: + + ```cmd + touch app.py + ``` + +1. Otwórz bieżący folder w VS Code: + + ```sh + code . + ``` + + > 💁 Jeśli twój terminal zwraca `command not found` na macOS, oznacza to, że VS Code nie został dodany do PATH. Możesz dodać VS Code do PATH, postępując zgodnie z instrukcjami w sekcji [Launching from the command line w dokumentacji VS Code](https://code.visualstudio.com/docs/setup/mac?WT.mc_id=academic-17441-jabenn#_launching-from-the-command-line) i uruchomić polecenie ponownie. VS Code jest domyślnie dodawany do PATH na Windowsie i Linuxie. + +1. Po uruchomieniu VS Code aktywuje ono wirtualne środowisko Pythona. Wybrane środowisko pojawi się na dolnym pasku stanu: + + ![VS Code pokazujący wybrane wirtualne środowisko](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.pl.png) + +1. Jeśli terminal VS Code jest już uruchomiony podczas startu VS Code, wirtualne środowisko nie będzie w nim aktywne. Najłatwiej jest zamknąć terminal, używając przycisku **Kill the active terminal instance**: + + ![VS Code przycisk Kill the active terminal instance](../../../../../translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.pl.png) + + Możesz sprawdzić, czy terminal ma aktywne wirtualne środowisko, ponieważ nazwa środowiska będzie prefiksem w terminalu. Na przykład może to być: + + ```sh + (.venv) ➜ nightlight + ``` + + Jeśli nie widzisz `.venv` jako prefiksu w terminalu, wirtualne środowisko nie jest aktywne. + +1. Uruchom nowy terminal w VS Code, wybierając *Terminal -> New Terminal* lub naciskając `` CTRL+` ``. Nowy terminal załaduje wirtualne środowisko, a wywołanie aktywacji pojawi się w terminalu. W terminalu pojawi się również prefiks z nazwą środowiska (`.venv`): + + ```output + ➜ nightlight source .venv/bin/activate + (.venv) ➜ nightlight + ``` + +1. Otwórz plik `app.py` w eksploratorze VS Code i dodaj następujący kod: + + ```python + print('Hello World!') + ``` + + Funkcja `print` wypisuje w konsoli to, co zostanie do niej przekazane. + +1. W terminalu VS Code uruchom następujące polecenie, aby uruchomić aplikację w Pythonie: + + ```sh + python app.py + ``` + + W konsoli pojawi się: + + ```output + (.venv) ➜ nightlight python app.py + Hello World! + ``` + +😀 Twój program 'Hello World' działa poprawnie! + +### Podłącz 'sprzęt' + +Jako drugi krok 'Hello World', uruchomisz aplikację CounterFit i połączysz z nią swój kod. Jest to wirtualny odpowiednik podłączenia sprzętu IoT do zestawu deweloperskiego. + +#### Zadanie – podłącz 'sprzęt' + +1. W terminalu VS Code uruchom aplikację CounterFit za pomocą następującego polecenia: + + ```sh + counterfit + ``` + + Aplikacja zacznie działać i otworzy się w przeglądarce internetowej: + + ![Aplikacja CounterFit uruchomiona w przeglądarce](../../../../../translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.pl.png) + + Będzie oznaczona jako *Disconnected*, a dioda LED w prawym górnym rogu będzie wyłączona. + +1. Dodaj następujący kod na początku pliku `app.py`: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + + Kod ten importuje klasę `CounterFitConnection` z modułu `counterfit_connection`, który pochodzi z pakietu Pip `counterfit-connection`, zainstalowanego wcześniej. Następnie inicjalizuje połączenie z aplikacją CounterFit działającą na `127.0.0.1`, co jest adresem IP używanym do dostępu do lokalnego komputera (często nazywanego *localhost*), na porcie 5000. + + > 💁 Jeśli inne aplikacje działają na porcie 5000, możesz to zmienić, aktualizując port w kodzie i uruchamiając CounterFit za pomocą `CounterFit --port `, zastępując `` wybranym portem. + +1. Będziesz musiał uruchomić nowy terminal w VS Code, wybierając przycisk **Create a new integrated terminal**. Jest to konieczne, ponieważ aplikacja CounterFit działa w bieżącym terminalu. + + ![VS Code przycisk Create a new integrated terminal](../../../../../translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.pl.png) + +1. W nowym terminalu uruchom plik `app.py` tak jak wcześniej. Status CounterFit zmieni się na **Connected**, a dioda LED zaświeci się. + + ![CounterFit pokazujący status Connected](../../../../../translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.pl.png) + +> 💁 Kod ten znajdziesz w folderze [code/virtual-device](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/virtual-device). + +😀 Połączenie ze sprzętem zakończyło się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md b/translations/pl/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md new file mode 100644 index 00000000..c66147f7 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md @@ -0,0 +1,220 @@ + +# Wio Terminal + +[Wio Terminal od Seeed Studios](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) to mikrokontroler kompatybilny z Arduino, wyposażony w WiFi, kilka wbudowanych czujników i elementów wykonawczych, a także porty umożliwiające dodanie kolejnych czujników i elementów wykonawczych za pomocą ekosystemu sprzętowego o nazwie [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html). + +![Wio Terminal od Seeed Studios](../../../../../translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.pl.png) + +## Konfiguracja + +Aby korzystać z Wio Terminal, musisz zainstalować na swoim komputerze darmowe oprogramowanie. Przed połączeniem urządzenia z WiFi konieczna będzie również aktualizacja oprogramowania układowego Wio Terminal. + +### Zadanie - konfiguracja + +Zainstaluj wymagane oprogramowanie i zaktualizuj firmware. + +1. Zainstaluj Visual Studio Code (VS Code). To edytor, którego będziesz używać do pisania kodu urządzenia w językach C/C++. Zapoznaj się z [dokumentacją VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn), aby uzyskać instrukcje dotyczące instalacji. + + > 💁 Innym popularnym środowiskiem IDE do programowania Arduino jest [Arduino IDE](https://www.arduino.cc/en/software). Jeśli już znasz to narzędzie, możesz go używać zamiast VS Code i PlatformIO, ale lekcje będą oparte na instrukcjach dla VS Code. + +1. Zainstaluj rozszerzenie PlatformIO dla VS Code. To rozszerzenie wspiera programowanie mikrokontrolerów w językach C/C++. Zapoznaj się z [dokumentacją rozszerzenia PlatformIO](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=platformio.platformio-ide), aby dowiedzieć się, jak je zainstalować w VS Code. Rozszerzenie to wymaga rozszerzenia Microsoft C/C++, które zostanie automatycznie zainstalowane wraz z PlatformIO. + +1. Podłącz Wio Terminal do komputera. Wio Terminal posiada port USB-C na spodzie, który należy podłączyć do portu USB w komputerze. W zestawie znajduje się kabel USB-C do USB-A, ale jeśli Twój komputer ma tylko porty USB-C, będziesz potrzebować kabla USB-C lub adaptera USB-A do USB-C. + +1. Postępuj zgodnie z instrukcjami w [dokumentacji Wio Terminal Wiki WiFi Overview](https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/), aby skonfigurować Wio Terminal i zaktualizować firmware. + +## Hello World + +Tradycyjnie, zaczynając pracę z nowym językiem programowania lub technologią, tworzy się aplikację 'Hello World' – mały program, który wyświetla tekst, np. `"Hello World"`, aby upewnić się, że wszystkie narzędzia są poprawnie skonfigurowane. + +Aplikacja Hello World dla Wio Terminal pozwoli upewnić się, że Visual Studio Code zostało poprawnie zainstalowane z PlatformIO i skonfigurowane do pracy z mikrokontrolerami. + +### Utwórz projekt PlatformIO + +Pierwszym krokiem jest utworzenie nowego projektu w PlatformIO skonfigurowanego dla Wio Terminal. + +#### Zadanie - utwórz projekt PlatformIO + +Utwórz projekt PlatformIO. + +1. Podłącz Wio Terminal do komputera. + +1. Uruchom VS Code. + +1. Ikona PlatformIO będzie widoczna na pasku menu bocznego: + + ![Opcja menu PlatformIO](../../../../../translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.pl.png) + + Wybierz tę opcję, a następnie wybierz *PIO Home -> Open*. + + ![Opcja otwarcia PlatformIO](../../../../../translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.pl.png) + +1. Na ekranie powitalnym wybierz przycisk **+ New Project**. + + ![Przycisk nowego projektu](../../../../../translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.pl.png) + +1. Skonfiguruj projekt w *Project Wizard*: + + 1. Nazwij swój projekt `nightlight`. + + 1. W polu *Board* wpisz `WIO`, aby przefiltrować listę, i wybierz *Seeeduino Wio Terminal*. + + 1. Pozostaw *Framework* jako *Arduino*. + + 1. Zaznacz pole *Use default location* lub odznacz je i wybierz lokalizację dla swojego projektu. + + 1. Kliknij przycisk **Finish**. + + ![Ukończony kreator projektu](../../../../../translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.pl.png) + + PlatformIO pobierze potrzebne komponenty do kompilacji kodu dla Wio Terminal i utworzy Twój projekt. Może to potrwać kilka minut. + +### Zbadaj projekt PlatformIO + +Eksplorator VS Code pokaże kilka plików i folderów utworzonych przez kreator PlatformIO. + +#### Foldery + +* `.pio` - ten folder zawiera dane tymczasowe potrzebne PlatformIO, takie jak biblioteki czy skompilowany kod. Jest automatycznie odtwarzany po usunięciu i nie musisz go dodawać do systemu kontroli wersji, jeśli udostępniasz projekt np. na GitHubie. +* `.vscode` - ten folder zawiera konfigurację używaną przez PlatformIO i VS Code. Jest automatycznie odtwarzany po usunięciu i nie musisz go dodawać do systemu kontroli wersji, jeśli udostępniasz projekt np. na GitHubie. +* `include` - ten folder jest przeznaczony na zewnętrzne pliki nagłówkowe potrzebne przy dodawaniu dodatkowych bibliotek do kodu. Nie będziesz używać tego folderu w tych lekcjach. +* `lib` - ten folder jest przeznaczony na zewnętrzne biblioteki, które chcesz wywoływać w swoim kodzie. Nie będziesz używać tego folderu w tych lekcjach. +* `src` - ten folder zawiera główny kod źródłowy Twojej aplikacji. Na początku będzie zawierał tylko jeden plik - `main.cpp`. +* `test` - ten folder jest przeznaczony na testy jednostkowe Twojego kodu. + +#### Pliki + +* `main.cpp` - ten plik w folderze `src` zawiera punkt wejścia Twojej aplikacji. Otwórz ten plik, a znajdziesz w nim następujący kod: + + ```cpp + #include + + void setup() { + // put your setup code here, to run once: + } + + void loop() { + // put your main code here, to run repeatedly: + } + ``` + + Po uruchomieniu urządzenia framework Arduino uruchomi funkcję `setup` raz, a następnie będzie wielokrotnie wykonywać funkcję `loop`, dopóki urządzenie nie zostanie wyłączone. + +* `.gitignore` - ten plik zawiera listę plików i katalogów, które mają być ignorowane podczas dodawania kodu do systemu kontroli wersji git, np. podczas przesyłania na repozytorium GitHub. + +* `platformio.ini` - ten plik zawiera konfigurację dla Twojego urządzenia i aplikacji. Otwórz ten plik, a znajdziesz w nim następujący kod: + + ```ini + [env:seeed_wio_terminal] + platform = atmelsam + board = seeed_wio_terminal + framework = arduino + ``` + + Sekcja `[env:seeed_wio_terminal]` zawiera konfigurację dla Wio Terminal. Możesz mieć wiele sekcji `env`, aby Twój kod mógł być kompilowany dla różnych płytek. + + Pozostałe wartości odpowiadają konfiguracji z kreatora projektu: + + * `platform = atmelsam` definiuje sprzęt używany przez Wio Terminal (mikrokontroler oparty na ATSAMD51). + * `board = seeed_wio_terminal` definiuje typ płytki mikrokontrolera (Wio Terminal). + * `framework = arduino` definiuje, że projekt korzysta z frameworka Arduino. + +### Napisz aplikację Hello World + +Teraz jesteś gotowy, aby napisać aplikację Hello World. + +#### Zadanie - napisz aplikację Hello World + +Napisz aplikację Hello World. + +1. Otwórz plik `main.cpp` w VS Code. + +1. Zmień kod na następujący: + + ```cpp + #include + + void setup() + { + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + } + + void loop() + { + Serial.println("Hello World"); + delay(5000); + } + ``` + + Funkcja `setup` inicjalizuje połączenie z portem szeregowym – w tym przypadku portem USB, który łączy Wio Terminal z komputerem. Parametr `9600` to [prędkość transmisji](https://wikipedia.org/wiki/Symbol_rate) (znana również jako Symbol rate), czyli szybkość przesyłania danych przez port szeregowy w bitach na sekundę. Ustawienie to oznacza, że przesyłane jest 9 600 bitów (0 i 1) danych na sekundę. Następnie funkcja czeka, aż port szeregowy będzie gotowy. + + Funkcja `loop` wysyła linię `Hello World!` do portu szeregowego, czyli znaki `Hello World!` wraz ze znakiem nowej linii. Następnie usypia na 5 000 milisekund, czyli 5 sekund. Po zakończeniu funkcji `loop` jest ona uruchamiana ponownie, i tak w kółko, dopóki mikrokontroler jest włączony. + +1. Wprowadź Wio Terminal w tryb przesyłania. Będziesz musiał to robić za każdym razem, gdy przesyłasz nowy kod na urządzenie: + + 1. Dwukrotnie szybko przesuń przełącznik zasilania w dół – za każdym razem wróci on do pozycji włączonej. + + 1. Sprawdź niebieską diodę LED statusu po prawej stronie portu USB. Powinna pulsować. + + [![Film pokazujący, jak wprowadzić Wio Terminal w tryb przesyłania](https://img.youtube.com/vi/LeKU_7zLRrQ/0.jpg)](https://youtu.be/LeKU_7zLRrQ) + + Kliknij obrazek powyżej, aby obejrzeć film pokazujący, jak to zrobić. + +1. Skompiluj i prześlij kod na Wio Terminal. + + 1. Otwórz paletę poleceń VS Code. + + 1. Wpisz `PlatformIO Upload`, aby wyszukać opcję przesyłania, i wybierz *PlatformIO: Upload*. + + ![Opcja przesyłania PlatformIO w palecie poleceń](../../../../../translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.pl.png) + + PlatformIO automatycznie skompiluje kod, jeśli będzie to konieczne, przed przesłaniem. + + 1. Kod zostanie skompilowany i przesłany na Wio Terminal. + + > 💁 Jeśli korzystasz z macOS, pojawi się powiadomienie o *DISK NOT EJECTED PROPERLY*. Dzieje się tak, ponieważ Wio Terminal jest montowany jako dysk w procesie flashowania, a następnie odłączany, gdy skompilowany kod jest zapisywany na urządzeniu. Możesz zignorować to powiadomienie. + + ⚠️ Jeśli pojawią się błędy dotyczące niedostępności portu przesyłania, upewnij się, że Wio Terminal jest podłączony do komputera, włączony za pomocą przełącznika po lewej stronie ekranu i ustawiony w tryb przesyłania. Zielona dioda na spodzie powinna być włączona, a niebieska dioda powinna pulsować. Jeśli nadal występuje błąd, ponownie dwukrotnie szybko przesuń przełącznik zasilania w dół, aby wymusić tryb przesyłania, i spróbuj ponownie. + +PlatformIO posiada Monitor Szeregowy, który pozwala monitorować dane przesyłane przez kabel USB z Wio Terminal. Dzięki temu możesz obserwować dane wysyłane przez polecenie `Serial.println("Hello World");`. + +1. Otwórz paletę poleceń VS Code. + +1. Wpisz `PlatformIO Serial`, aby wyszukać opcję Monitora Szeregowego, i wybierz *PlatformIO: Serial Monitor*. + + ![Opcja Monitora Szeregowego PlatformIO w palecie poleceń](../../../../../translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.pl.png) + + Otworzy się nowe okno terminala, a dane przesyłane przez port szeregowy będą wyświetlane w tym terminalu: + + ```output + > Executing task: platformio device monitor < + + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem101 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Hello World + Hello World + ``` + + `Hello World` będzie wyświetlane w monitorze szeregowym co 5 sekund. + +> 💁 Kod ten znajdziesz w folderze [code/wio-terminal](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/wio-terminal). + +😀 Twój program 'Hello World' zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/2-deeper-dive/README.md b/translations/pl/1-getting-started/lessons/2-deeper-dive/README.md new file mode 100644 index 00000000..c6a008cd --- /dev/null +++ b/translations/pl/1-getting-started/lessons/2-deeper-dive/README.md @@ -0,0 +1,275 @@ + +# Głębsze spojrzenie na IoT + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obraz, aby zobaczyć większą wersję. + +Ta lekcja była częścią serii [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) prowadzonej przez [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Lekcja została podzielona na dwa filmy: godzinny wykład oraz godzinne konsultacje, podczas których szczegółowo omówiono wybrane zagadnienia i odpowiadano na pytania. + +[![Lekcja 2: Głębsze spojrzenie na IoT](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M) + +[![Lekcja 2: Głębsze spojrzenie na IoT - Konsultacje](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E) + +> 🎥 Kliknij obrazy powyżej, aby obejrzeć filmy + +## Quiz przed wykładem + +[Quiz przed wykładem](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3) + +## Wprowadzenie + +W tej lekcji zagłębimy się w niektóre z koncepcji omówionych w poprzedniej lekcji. + +W tej lekcji omówimy: + +* [Komponenty aplikacji IoT](../../../../../1-getting-started/lessons/2-deeper-dive) +* [Głębsze spojrzenie na mikrokontrolery](../../../../../1-getting-started/lessons/2-deeper-dive) +* [Głębsze spojrzenie na komputery jednopłytkowe](../../../../../1-getting-started/lessons/2-deeper-dive) + +## Komponenty aplikacji IoT + +Dwa główne komponenty aplikacji IoT to *Internet* i *urządzenie*. Przyjrzyjmy się im bliżej. + +### Urządzenie + +![Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.pl.jpg) + +Część **Urządzenie** w IoT odnosi się do urządzenia, które może wchodzić w interakcję ze światem fizycznym. Są to zazwyczaj małe, niedrogie komputery, działające z niską prędkością i zużywające niewiele energii – na przykład proste mikrokontrolery z kilobajtami pamięci RAM (w porównaniu do gigabajtów w komputerach PC), działające z częstotliwością kilkuset megaherców (w porównaniu do gigaherców w komputerach PC), ale zużywające tak mało energii, że mogą działać przez tygodnie, miesiące, a nawet lata na bateriach. + +Urządzenia te wchodzą w interakcję ze światem fizycznym, używając czujników do zbierania danych z otoczenia lub kontrolując wyjścia czy siłowniki, aby wprowadzać zmiany fizyczne. Typowym przykładem jest inteligentny termostat – urządzenie wyposażone w czujnik temperatury, sposób ustawiania pożądanej temperatury, np. za pomocą pokrętła lub ekranu dotykowego, oraz połączenie z systemem grzewczym lub chłodzącym, który można włączyć, gdy wykryta temperatura jest poza zakresem docelowym. Czujnik temperatury wykrywa, że w pomieszczeniu jest za zimno, a siłownik włącza ogrzewanie. + +![Schemat pokazujący temperaturę i pokrętło jako wejścia do urządzenia IoT oraz kontrolę grzejnika jako wyjście](../../../../../translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.pl.png) + +Istnieje ogromna różnorodność urządzeń, które mogą działać jako urządzenia IoT – od dedykowanego sprzętu wykrywającego jedno zjawisko, po urządzenia ogólnego przeznaczenia, a nawet Twój smartfon! Smartfon może używać czujników do wykrywania otoczenia i siłowników do interakcji ze światem – na przykład używając czujnika GPS do określenia lokalizacji i głośnika do przekazywania instrukcji nawigacyjnych. + +✅ Pomyśl o innych systemach wokół Ciebie, które odczytują dane z czujnika i wykorzystują je do podejmowania decyzji. Jednym z przykładów może być termostat w piekarniku. Czy znajdziesz więcej? + +### Internet + +Część **Internet** w aplikacji IoT obejmuje aplikacje, z którymi urządzenie IoT może się łączyć, aby wysyłać i odbierać dane, a także inne aplikacje, które mogą przetwarzać dane z urządzenia IoT i pomagać w podejmowaniu decyzji dotyczących żądań wysyłanych do siłowników urządzenia IoT. + +Typowym rozwiązaniem jest korzystanie z jakiejś usługi w chmurze, z którą urządzenie IoT się łączy. Taka usługa zajmuje się kwestiami bezpieczeństwa, odbieraniem wiadomości od urządzenia IoT i wysyłaniem wiadomości z powrotem do urządzenia. Usługa w chmurze może następnie łączyć się z innymi aplikacjami, które mogą przetwarzać lub przechowywać dane z czujników, albo wykorzystywać te dane wraz z danymi z innych systemów do podejmowania decyzji. + +Urządzenia nie zawsze łączą się bezpośrednio z Internetem za pomocą WiFi lub połączeń przewodowych. Niektóre urządzenia korzystają z sieci kratowych, aby komunikować się ze sobą za pomocą technologii takich jak Bluetooth, łącząc się przez urządzenie centralne, które ma połączenie z Internetem. + +W przypadku inteligentnego termostatu, termostat łączyłby się z domową siecią WiFi i usługą w chmurze. Wysyłałby dane o temperaturze do tej usługi, a stamtąd byłyby one zapisywane w bazie danych, umożliwiając właścicielowi domu sprawdzenie aktualnej i przeszłej temperatury za pomocą aplikacji na telefonie. Inna usługa w chmurze wiedziałaby, jaką temperaturę chce właściciel domu, i wysyłałaby wiadomości z powrotem do urządzenia IoT za pośrednictwem usługi w chmurze, aby poinformować system grzewczy, czy ma się włączyć lub wyłączyć. + +![Schemat pokazujący temperaturę i pokrętło jako wejścia do urządzenia IoT, urządzenie IoT z dwukierunkową komunikacją z chmurą, która z kolei ma dwukierunkową komunikację z telefonem, oraz kontrolę grzejnika jako wyjście z urządzenia IoT](../../../../../translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.pl.png) + +Jeszcze bardziej zaawansowana wersja mogłaby korzystać ze sztucznej inteligencji w chmurze, wykorzystując dane z innych czujników podłączonych do innych urządzeń IoT, takich jak czujniki obecności wykrywające, które pomieszczenia są używane, a także dane takie jak pogoda czy Twój kalendarz, aby inteligentnie ustawiać temperaturę. Na przykład mogłaby wyłączyć ogrzewanie, jeśli z kalendarza wynika, że jesteś na wakacjach, lub wyłączać ogrzewanie w poszczególnych pomieszczeniach w zależności od tego, które z nich są używane, ucząc się na podstawie danych, aby z czasem być coraz bardziej precyzyjną. + +![Schemat pokazujący wiele czujników temperatury i pokrętło jako wejścia do urządzenia IoT, urządzenie IoT z dwukierunkową komunikacją z chmurą, która z kolei ma dwukierunkową komunikację z telefonem, kalendarzem i usługą pogodową, oraz kontrolę grzejnika jako wyjście z urządzenia IoT](../../../../../translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.pl.png) + +✅ Jakie inne dane mogłyby pomóc w stworzeniu inteligentniejszego termostatu podłączonego do Internetu? + +### IoT na krawędzi + +Chociaż litera "I" w IoT oznacza Internet, urządzenia te nie muszą łączyć się z Internetem. W niektórych przypadkach urządzenia mogą łączyć się z urządzeniami brzegowymi – urządzeniami bramkowymi działającymi w Twojej lokalnej sieci, co pozwala na przetwarzanie danych bez konieczności korzystania z połączenia internetowego. Może to być szybsze, gdy masz dużo danych lub wolne połączenie internetowe, pozwala działać offline w miejscach, gdzie połączenie z Internetem nie jest możliwe, takich jak statek czy obszar dotknięty katastrofą podczas akcji humanitarnej, a także pozwala zachować prywatność danych. Niektóre urządzenia zawierają kod przetwarzający stworzony za pomocą narzędzi chmurowych i uruchamiają go lokalnie, aby zbierać i reagować na dane bez użycia połączenia internetowego do podejmowania decyzji. + +Przykładem może być inteligentne urządzenie domowe, takie jak Apple HomePod, Amazon Alexa czy Google Home, które nasłuchuje Twojego głosu za pomocą modeli AI wytrenowanych w chmurze, ale działających lokalnie na urządzeniu. Urządzenia te "budzą się", gdy wypowiesz określone słowo lub frazę, i dopiero wtedy przesyłają Twoją mowę przez Internet do przetworzenia. Urządzenie przestaje przesyłać mowę w odpowiednim momencie, na przykład gdy wykryje pauzę w Twojej wypowiedzi. Wszystko, co powiesz przed obudzeniem urządzenia za pomocą słowa kluczowego, i wszystko, co powiesz po tym, jak urządzenie przestanie słuchać, nie zostanie przesłane przez Internet do dostawcy urządzenia, a zatem pozostanie prywatne. + +✅ Pomyśl o innych scenariuszach, w których prywatność jest ważna, więc przetwarzanie danych byłoby lepsze na krawędzi niż w chmurze. Podpowiedź – pomyśl o urządzeniach IoT z kamerami lub innymi urządzeniami obrazującymi. + +### Bezpieczeństwo IoT + +W przypadku każdego połączenia z Internetem bezpieczeństwo jest ważnym zagadnieniem. Istnieje stare powiedzenie, że "litera S w IoT oznacza bezpieczeństwo" – w IoT nie ma litery "S", co sugeruje, że nie jest ono bezpieczne. + +Urządzenia IoT łączą się z usługą w chmurze, a zatem są tak bezpieczne, jak ta usługa w chmurze – jeśli Twoja usługa w chmurze pozwala na połączenie dowolnego urządzenia, może dojść do przesyłania złośliwych danych lub ataków wirusowych. Może to mieć bardzo realne konsekwencje, ponieważ urządzenia IoT wchodzą w interakcję i kontrolują inne urządzenia. Na przykład [robak Stuxnet](https://wikipedia.org/wiki/Stuxnet) manipulował zaworami w wirówkach, aby je uszkodzić. Hakerzy wykorzystali również [słabe zabezpieczenia, aby uzyskać dostęp do monitorów dla dzieci](https://www.npr.org/sections/thetwo-way/2018/06/05/617196788/s-c-mom-says-baby-monitor-was-hacked-experts-say-many-devices-are-vulnerable) i innych urządzeń monitorujących w domach. + +> 💁 Czasami urządzenia IoT i urządzenia brzegowe działają w sieci całkowicie odizolowanej od Internetu, aby zachować prywatność i bezpieczeństwo danych. Jest to znane jako [air-gapping](https://wikipedia.org/wiki/Air_gap_(networking)). + +## Głębsze spojrzenie na mikrokontrolery + +W poprzedniej lekcji wprowadziliśmy mikrokontrolery. Teraz przyjrzyjmy się im bliżej. + +### CPU + +CPU to "mózg" mikrokontrolera. Jest to procesor, który uruchamia Twój kod i może wysyłać dane do oraz odbierać dane od podłączonych urządzeń. CPU może zawierać jeden lub więcej rdzeni – w zasadzie jeden lub więcej procesorów, które mogą współpracować, aby uruchamiać Twój kod. + +CPU opiera się na zegarze, który tyka miliony lub miliardy razy na sekundę. Każde tyknięcie, czyli cykl, synchronizuje działania, które CPU może wykonać. Przy każdym tyknięciu CPU może wykonać instrukcję z programu, na przykład pobrać dane z urządzenia zewnętrznego lub wykonać obliczenie matematyczne. Ten regularny cykl pozwala na zakończenie wszystkich działań przed przetworzeniem kolejnej instrukcji. + +Im szybszy cykl zegara, tym więcej instrukcji można przetworzyć w ciągu sekundy, a zatem tym szybszy jest CPU. Prędkości CPU mierzy się w [hercach (Hz)](https://wikipedia.org/wiki/Hertz), standardowej jednostce, gdzie 1 Hz oznacza jeden cykl lub tyknięcie zegara na sekundę. + +> 🎓 Prędkości CPU często podaje się w MHz lub GHz. 1 MHz to 1 milion Hz, 1 GHz to 1 miliard Hz. + +> 💁 CPU wykonuje programy za pomocą [cyklu pobierania-dekodowania-wykonywania](https://wikipedia.org/wiki/Instruction_cycle). Przy każdym tyknięciu zegara CPU pobiera kolejną instrukcję z pamięci, dekoduje ją, a następnie wykonuje, na przykład używając jednostki arytmetyczno-logicznej (ALU) do dodania dwóch liczb. Niektóre instrukcje wymagają wielu cykli do wykonania, więc kolejny cykl rozpoczyna się przy następnym tyknięciu po zakończeniu instrukcji. + +![Cykl pobierania-dekodowania-wykonywania pokazujący pobieranie instrukcji z programu przechowywanego w RAM, a następnie dekodowanie i wykonywanie jej na CPU](../../../../../translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.pl.png) + +Mikrokontrolery mają znacznie niższe prędkości zegara niż komputery stacjonarne, laptopy czy nawet większość smartfonów. Na przykład Wio Terminal ma CPU działający z prędkością 120 MHz, czyli 120 000 000 cykli na sekundę. + +✅ Przeciętny komputer PC lub Mac ma CPU z wieloma rdzeniami działającymi z prędkością kilku gigaherców, co oznacza, że zegar tyka miliardy razy na sekundę. Sprawdź prędkość zegara swojego komputera i porównaj, ile razy jest szybszy od Wio Terminal. + +Każdy cykl zegara zużywa energię i generuje ciepło. Im szybsze tyknięcia, tym więcej zużywanej energii i więcej generowanego ciepła. Komputery PC mają radiatory i wentylatory do odprowadzania ciepła, bez których przegrzałyby się i wyłączyły w ciągu kilku sekund. Mikrokontrolery często nie mają ani jednego, ani drugiego, ponieważ działają znacznie chłodniej, a zatem znacznie wolniej. Komputery PC działają na zasilaniu sieciowym lub dużych bateriach przez kilka godzin, mikrokontrolery mogą działać przez dni, miesiące, a nawet lata na małych bateriach. Mikrokontrolery mogą również mieć rdzenie działające z różnymi prędkościami, przełączając się na wolniejsze rdzenie o niskim poborze mocy, gdy obciążenie CPU jest niskie, aby zmniejszyć zużycie energii. + +> 💁 Niektóre komputery PC i Maci przyjmują podobne podejście, łącząc szybkie rdzenie o wysokiej wydajności z wolniejszymi rdzeniami o niskim poborze mocy, przełączając się, aby oszczędzać baterię. Na przykład chip M1 w najnowszych laptopach Apple może przełączać się między 4 rdzeniami wydajnościowymi a 4 rdzeniami efektywnościowymi, aby zoptymalizować żywotność baterii lub prędkość w zależności od wykonywanego zadania. + +✅ Zrób małe badanie: Przeczytaj o CPU w [artykule na Wikipedii o procesorach](https://wikipedia.org/wiki/Central_processing_unit). + +#### Zadanie + +Zbadaj Wio Terminal. + +Jeśli używasz Wio Terminal w tych lekcjach, spróbuj znaleźć CPU. Znajdź sekcję *Hardware Overview* na [stronie produktu Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html), aby zobaczyć zdjęcie wnętrza, i spróbuj znaleźć CPU przez przezroczyste plastikowe okienko z tyłu. + +### Pamięć + +Mikrokontrolery zazwyczaj mają dwa rodzaje pamięci – pamięć programu i pamięć o dostępie swobodnym (RAM). + +Pamięć programu jest nieulotna, co oznacza, że to, co zostało do niej zapisane, pozostaje, gdy urządzenie jest wyłączone. To właśnie w tej pamięci przechowywany jest Twój kod programu. + +RAM to pamięć używana przez program do działania, zawierająca zmienne przydzielone przez Twój program i dane zebrane z urządzeń peryferyjnych. RAM jest ulotna – gdy zasilanie zostanie odłączone, +🎓 Pamięć programu przechowuje Twój kod i pozostaje nawet po odcięciu zasilania. +🎓 RAM jest używana do uruchamiania programu i resetuje się, gdy nie ma zasilania + +Podobnie jak w przypadku CPU, pamięć w mikrokontrolerze jest o rzędy wielkości mniejsza niż w komputerze PC lub Mac. Typowy komputer PC może mieć 8 gigabajtów (GB) RAM, czyli 8 000 000 000 bajtów, gdzie każdy bajt to wystarczająca ilość miejsca na przechowanie jednej litery lub liczby od 0 do 255. Mikrokontroler ma zazwyczaj tylko kilobajty (KB) RAM, gdzie kilobajt to 1 000 bajtów. Wspomniany wcześniej terminal Wio ma 192 KB RAM, czyli 192 000 bajtów - ponad 40 000 razy mniej niż przeciętny komputer PC! + +Poniższy diagram pokazuje względną różnicę wielkości między 192 KB a 8 GB - mała kropka w środku reprezentuje 192 KB. + +![Porównanie między 192 KB a 8 GB - ponad 40 000 razy większe](../../../../../translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.pl.png) + +Pamięć na programy również jest mniejsza niż w komputerze PC. Typowy komputer PC może mieć dysk twardy o pojemności 500 GB na przechowywanie programów, podczas gdy mikrokontroler może mieć tylko kilobajty lub może kilka megabajtów (MB) pamięci (1 MB to 1 000 KB, czyli 1 000 000 bajtów). Terminal Wio ma 4 MB pamięci na programy. + +✅ Zrób małe badanie: Ile RAM i pamięci ma komputer, którego używasz do czytania tego tekstu? Jak to się ma do mikrokontrolera? + +### Wejście/Wyjście + +Mikrokontrolery potrzebują połączeń wejścia i wyjścia (I/O), aby odczytywać dane z czujników i wysyłać sygnały sterujące do siłowników. Zazwyczaj zawierają one kilka uniwersalnych pinów wejścia/wyjścia (GPIO). Piny te można skonfigurować w oprogramowaniu jako wejście (czyli odbierają sygnał) lub wyjście (wysyłają sygnał). + +🧠⬅️ Piny wejściowe służą do odczytu wartości z czujników + +🧠➡️ Piny wyjściowe wysyłają instrukcje do siłowników + +✅ Dowiesz się więcej na ten temat w kolejnej lekcji. + +#### Zadanie + +Zbadaj terminal Wio. + +Jeśli używasz terminala Wio w tych lekcjach, znajdź piny GPIO. Znajdź sekcję *Pinout diagram* na [stronie produktu terminala Wio](https://www.seeedstudio.com/Wio-Terminal-p-4509.html), aby dowiedzieć się, które piny są które. Terminal Wio jest dostarczany z naklejką, którą można zamontować z tyłu z numerami pinów, więc dodaj ją teraz, jeśli jeszcze tego nie zrobiłeś. + +### Rozmiar fizyczny + +Mikrokontrolery są zazwyczaj małe, a najmniejszy, [Freescale Kinetis KL03 MCU, jest wystarczająco mały, aby zmieścić się w wgłębieniu piłki golfowej](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/). Sam procesor w komputerze PC może mieć wymiary 40 mm x 40 mm, nie licząc radiatorów i wentylatorów potrzebnych do zapewnienia, że procesor może działać dłużej niż kilka sekund bez przegrzania, co jest znacznie większe niż kompletny mikrokontroler. Zestaw deweloperski terminala Wio z mikrokontrolerem, obudową, ekranem i szeregiem połączeń i komponentów nie jest dużo większy niż sam procesor Intel i9, a znacznie mniejszy niż procesor z radiatorem i wentylatorem! + +| Urządzenie | Rozmiar | +| ------------------------------- | --------------------- | +| Freescale Kinetis KL03 | 1,6 mm x 2 mm x 1 mm | +| Terminal Wio | 72 mm x 57 mm x 12 mm | +| Intel i9 CPU, radiator i wentylator | 136 mm x 145 mm x 103 mm | + +### Frameworki i systemy operacyjne + +Ze względu na niską prędkość i rozmiar pamięci, mikrokontrolery nie uruchamiają systemu operacyjnego (OS) w sensie znanym z komputerów stacjonarnych. System operacyjny, który sprawia, że Twój komputer działa (Windows, Linux lub macOS), potrzebuje dużo pamięci i mocy obliczeniowej do wykonywania zadań, które są całkowicie zbędne dla mikrokontrolera. Pamiętaj, że mikrokontrolery są zazwyczaj programowane do wykonywania jednego lub kilku bardzo specyficznych zadań, w przeciwieństwie do komputerów ogólnego przeznaczenia, takich jak PC czy Mac, które muszą obsługiwać interfejs użytkownika, odtwarzać muzykę lub filmy, zapewniać narzędzia do pisania dokumentów lub kodu, grać w gry czy przeglądać Internet. + +Aby zaprogramować mikrokontroler bez systemu operacyjnego, potrzebujesz narzędzi umożliwiających budowanie kodu w sposób, który mikrokontroler może uruchomić, korzystając z API umożliwiających komunikację z peryferiami. Każdy mikrokontroler jest inny, więc producenci zazwyczaj wspierają standardowe frameworki, które pozwalają na stosowanie standardowego "przepisu" do budowania kodu i uruchamiania go na dowolnym mikrokontrolerze obsługującym ten framework. + +Możesz programować mikrokontrolery używając systemu operacyjnego - często nazywanego systemem operacyjnym czasu rzeczywistego (RTOS), ponieważ są one zaprojektowane do obsługi przesyłania danych do i z peryferiów w czasie rzeczywistym. Te systemy operacyjne są bardzo lekkie i oferują funkcje takie jak: + +* Wielowątkowość, pozwalająca na uruchamianie więcej niż jednego bloku kodu jednocześnie, albo na wielu rdzeniach, albo na jednym rdzeniu na zmianę +* Sieciowanie, umożliwiające bezpieczną komunikację przez Internet +* Komponenty graficznego interfejsu użytkownika (GUI) do budowy interfejsów na urządzeniach z ekranami. + +✅ Przeczytaj o różnych RTOS-ach: [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [Zephyr](https://www.zephyrproject.org) + +#### Arduino + +![Logo Arduino](../../../../../images/arduino-logo.svg) + +[Arduino](https://www.arduino.cc) jest prawdopodobnie najpopularniejszym frameworkiem dla mikrokontrolerów, szczególnie wśród studentów, hobbystów i twórców. Arduino to otwartoźródłowa platforma elektroniczna łącząca oprogramowanie i sprzęt. Możesz kupić kompatybilne płytki Arduino od samego Arduino lub od innych producentów, a następnie kodować za pomocą frameworka Arduino. + +Płytki Arduino są programowane w językach C lub C++. Użycie C/C++ pozwala na kompilację kodu do bardzo małych rozmiarów i szybkie działanie, co jest konieczne na urządzeniach o ograniczonych zasobach, takich jak mikrokontrolery. Rdzeń aplikacji Arduino nazywany jest szkicem i jest to kod C/C++ z 2 funkcjami - `setup` i `loop`. Gdy płytka się uruchamia, kod frameworka Arduino uruchamia funkcję `setup` raz, a następnie uruchamia funkcję `loop` w kółko, aż do wyłączenia zasilania. + +Kod inicjalizacyjny umieściłbyś w funkcji `setup`, na przykład łączenie z WiFi i usługami w chmurze lub inicjalizację pinów wejścia/wyjścia. Kod w pętli zawierałby przetwarzanie, na przykład odczyt z czujnika i wysyłanie wartości do chmury. Zazwyczaj dodaje się opóźnienie w każdej pętli, na przykład jeśli chcesz, aby dane z czujnika były wysyłane co 10 sekund, dodajesz opóźnienie 10 sekund na końcu pętli, aby mikrokontroler mógł przejść w stan uśpienia, oszczędzając energię, a następnie uruchomić pętlę ponownie po 10 sekundach. + +![Szkic Arduino uruchamiający najpierw setup, a następnie wielokrotnie loop](../../../../../translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.pl.png) + +✅ Ta architektura programu jest znana jako *pętla zdarzeń* lub *pętla komunikatów*. Wiele aplikacji korzysta z niej w tle i jest to standard dla większości aplikacji desktopowych działających na systemach operacyjnych takich jak Windows, macOS czy Linux. Możesz przeczytać więcej w tym [artykule o pętli zdarzeń](https://wikipedia.org/wiki/Event_loop). + +Arduino dostarcza standardowe biblioteki do interakcji z mikrokontrolerami i pinami I/O, z różnymi implementacjami pod spodem, aby działały na różnych mikrokontrolerach. Na przykład funkcja [`delay`](https://www.arduino.cc/reference/en/language/functions/time/delay/) wstrzymuje program na określony czas, a funkcja [`digitalRead`](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/) odczytuje wartość `HIGH` lub `LOW` z danego pinu, niezależnie od tego, na której płytce kod jest uruchamiany. Te standardowe biblioteki oznaczają, że kod Arduino napisany dla jednej płytki może być skompilowany dla dowolnej innej płytki Arduino i będzie działał, zakładając, że piny są takie same i płytki obsługują te same funkcje. + +Istnieje duży ekosystem bibliotek Arduino od firm trzecich, które pozwalają na dodanie dodatkowych funkcji do projektów Arduino, takich jak używanie czujników i siłowników lub łączenie się z usługami IoT w chmurze. + +##### Zadanie + +Zbadaj terminal Wio. + +Jeśli używasz terminala Wio w tych lekcjach, przeczytaj ponownie kod, który napisałeś w poprzedniej lekcji. Znajdź funkcje `setup` i `loop`. Monitoruj wyjście szeregowe, aby zobaczyć, że funkcja `loop` jest wywoływana wielokrotnie. Spróbuj dodać kod do funkcji `setup`, aby zapisać coś na porcie szeregowym i zaobserwuj, że ten kod jest wywoływany tylko raz przy każdym ponownym uruchomieniu. Spróbuj ponownie uruchomić urządzenie za pomocą przełącznika zasilania z boku, aby pokazać, że funkcja ta jest wywoływana za każdym razem, gdy urządzenie się restartuje. + +## Głębsze spojrzenie na komputery jednopłytkowe + +W poprzedniej lekcji wprowadziliśmy komputery jednopłytkowe. Teraz przyjrzyjmy się im bliżej. + +### Raspberry Pi + +![Logo Raspberry Pi](../../../../../translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.pl.png) + +[Raspberry Pi Foundation](https://www.raspberrypi.org) to organizacja charytatywna z Wielkiej Brytanii założona w 2009 roku w celu promowania nauki informatyki, szczególnie na poziomie szkolnym. W ramach tej misji opracowali komputer jednopłytkowy, nazwany Raspberry Pi. Raspberry Pi są obecnie dostępne w 3 wariantach - pełnowymiarowym, mniejszym Pi Zero oraz module obliczeniowym, który można wbudować w końcowe urządzenie IoT. + +![Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.pl.jpg) + +Najnowsza wersja pełnowymiarowego Raspberry Pi to Raspberry Pi 4B. Ma czterordzeniowy procesor (4 rdzenie) o taktowaniu 1,5 GHz, 2, 4 lub 8 GB RAM, gigabitowy Ethernet, WiFi, 2 porty HDMI obsługujące ekrany 4k, port wyjścia audio i wideo kompozytowego, porty USB (2 USB 2.0, 2 USB 3.0), 40 pinów GPIO, złącze kamery dla modułu kamery Raspberry Pi oraz gniazdo na kartę SD. Wszystko to na płytce o wymiarach 88 mm x 58 mm x 19,5 mm, zasilanej przez zasilacz USB-C o mocy 3A. Ceny zaczynają się od 35 USD, co jest znacznie tańsze niż PC czy Mac. + +> 💁 Jest także Pi400, komputer typu all-in-one z Pi4 wbudowanym w klawiaturę. + +![Raspberry Pi Zero](../../../../../translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.pl.jpg) + +Pi Zero jest znacznie mniejszy i mniej wydajny. Ma jednordzeniowy procesor 1 GHz, 512 MB RAM, WiFi (w modelu Zero W), pojedynczy port HDMI, port micro-USB, 40 pinów GPIO, złącze kamery dla modułu kamery Raspberry Pi oraz gniazdo na kartę SD. Ma wymiary 65 mm x 30 mm x 5 mm i zużywa bardzo mało energii. Pi Zero kosztuje 5 USD, a wersja W z WiFi - 10 USD. + +> 🎓 Procesory w obu tych urządzeniach to procesory ARM, w przeciwieństwie do procesorów Intel/AMD x86 lub x64, które znajdziesz w większości komputerów PC i Mac. Są one podobne do procesorów, które znajdziesz w niektórych mikrokontrolerach, a także w prawie wszystkich telefonach komórkowych, Microsoft Surface X i nowych komputerach Mac z Apple Silicon. + +Wszystkie warianty Raspberry Pi działają na wersji systemu Debian Linux o nazwie Raspberry Pi OS. Jest on dostępny w wersji lite bez pulpitu, idealnej do projektów "headless", gdzie nie potrzebujesz ekranu, lub w pełnej wersji z pełnym środowiskiem graficznym, przeglądarką internetową, aplikacjami biurowymi, narzędziami do kodowania i grami. Ponieważ system operacyjny jest wersją Debiana, możesz zainstalować dowolną aplikację lub narzędzie, które działa na Debianie i jest zbudowane dla procesora ARM w Pi. + +#### Zadanie + +Zbadaj Raspberry Pi. + +Jeśli używasz Raspberry Pi w tych lekcjach, przeczytaj o różnych komponentach sprzętowych na płytce. + +* Możesz znaleźć szczegóły dotyczące procesorów używanych w [dokumentacji sprzętowej Raspberry Pi](https://www.raspberrypi.org/documentation/hardware/raspberrypi/). Przeczytaj o procesorze używanym w Twoim Pi. +* Zlokalizuj piny GPIO. Przeczytaj więcej o nich w [dokumentacji GPIO Raspberry Pi](https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md). Skorzystaj z [przewodnika po użyciu pinów GPIO](https://www.raspberrypi.org/documentation/usage/gpio/README.md), aby zidentyfikować różne piny na Twoim Pi. + +### Programowanie komputerów jednopłytkowych + +Komputery jednopłytkowe to pełne komputery, działające na pełnym systemie operacyjnym. Oznacza to, że istnieje szeroka gama języków programowania, frameworków i narzędzi, których możesz używać do ich kodowania, w przeciwieństwie do mikrokontrolerów, które polegają na wsparciu dla płytki w frameworkach takich jak Arduino. Większość języków programowania ma biblioteki umożliwiające dostęp do pinów GPIO w celu wysyłania i odbierania danych z czujników i siłowników. + +✅ Jakie języki programowania znasz? Czy są one obsługiwane na Linuksie? + +Najczęściej używanym językiem programowania do budowy aplikacji IoT na Raspberry Pi jest Python. Istnieje ogromny ekosystem sprzętu zaprojektowanego dla Pi, a prawie wszystkie z nich zawierają odpowiedni kod potrzebny do ich użycia jako bibliotek Pythona. Niektóre z tych ekosystemów opierają się na "czapkach" - tak nazwanych, ponieważ nakładają się na Pi jak czapka i łączą się z dużym gniazdem do 40 pinów GPIO. Te czapki zapewniają dodatkowe możliwości, takie jak ekrany, czujniki, zdalnie sterowane samochody lub adaptery umożliwiające podłączenie czujników za pomocą standaryzowanych kabli. +### Wykorzystanie komputerów jednopłytkowych w profesjonalnych wdrożeniach IoT + +Komputery jednopłytkowe są wykorzystywane w profesjonalnych wdrożeniach IoT, nie tylko jako zestawy deweloperskie. Mogą stanowić potężne narzędzie do sterowania sprzętem i wykonywania złożonych zadań, takich jak uruchamianie modeli uczenia maszynowego. Na przykład istnieje [moduł obliczeniowy Raspberry Pi 4](https://www.raspberrypi.org/blog/raspberry-pi-compute-module-4/), który oferuje wszystkie możliwości Raspberry Pi 4, ale w bardziej kompaktowej i tańszej formie, bez większości portów, zaprojektowany do instalacji w niestandardowym sprzęcie. + +--- + +## 🚀 Wyzwanie + +Wyzwanie z ostatniej lekcji polegało na wymienieniu jak największej liczby urządzeń IoT, które znajdują się w Twoim domu, szkole lub miejscu pracy. Dla każdego urządzenia z tej listy zastanów się, czy są one oparte na mikrokontrolerach, komputerach jednopłytkowych, czy może na mieszance obu tych technologii. + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4) + +## Przegląd i samodzielna nauka + +* Przeczytaj [przewodnik wprowadzający do Arduino](https://www.arduino.cc/en/Guide/Introduction), aby lepiej zrozumieć platformę Arduino. +* Zapoznaj się z [wprowadzeniem do Raspberry Pi 4](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/), aby dowiedzieć się więcej o Raspberry Pi. +* Dowiedz się więcej o niektórych koncepcjach i akronimach w artykule [What the FAQ are CPUs, MPUs, MCUs, and GPUs w Electrical Engineering Journal](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/). + +✅ Skorzystaj z tych przewodników oraz z kosztów pokazanych w linkach w [przewodniku sprzętowym](../../../hardware.md), aby zdecydować, jaką platformę sprzętową chcesz użyć, lub czy wolisz skorzystać z wirtualnego urządzenia. + +## Zadanie + +[Porównaj i skontrastuj mikrokontrolery oraz komputery jednopłytkowe](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/2-deeper-dive/assignment.md b/translations/pl/1-getting-started/lessons/2-deeper-dive/assignment.md new file mode 100644 index 00000000..c4665cff --- /dev/null +++ b/translations/pl/1-getting-started/lessons/2-deeper-dive/assignment.md @@ -0,0 +1,24 @@ + +# Porównanie mikrokontrolerów i komputerów jednopłytkowych + +## Instrukcje + +Ta lekcja dotyczyła mikrokontrolerów i komputerów jednopłytkowych. Stwórz tabelę porównującą i kontrastującą te dwa typy urządzeń, a także podaj co najmniej 2 powody, dla których warto używać mikrokontrolera zamiast komputera jednopłytkowego, oraz co najmniej 2 powody, dla których warto używać komputera jednopłytkowego zamiast mikrokontrolera. + +## Kryteria oceny + +| Kryteria | Wzorowe | Zadowalające | Wymaga poprawy | +| -------- | --------- | -------- | ----------------- | +| Stworzenie tabeli porównującej mikrokontrolery i komputery jednopłytkowe | Stworzono listę z wieloma elementami poprawnie porównującymi i kontrastującymi | Stworzono listę z tylko kilkoma elementami | Stworzono listę z jednym lub żadnym elementem porównującym i kontrastującym | +| Powody użycia jednego zamiast drugiego | Podano 2 lub więcej powodów dla mikrokontrolerów oraz 2 lub więcej dla komputerów jednopłytkowych | Podano tylko 1-2 powody dla mikrokontrolera oraz 1-2 powody dla komputera jednopłytkowego | Nie podano żadnego lub podano mniej niż 1 powód dla mikrokontrolera lub komputera jednopłytkowego | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/README.md b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/README.md new file mode 100644 index 00000000..c27dc97c --- /dev/null +++ b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/README.md @@ -0,0 +1,228 @@ + +# Interakcja ze światem fizycznym za pomocą czujników i siłowników + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obraz, aby zobaczyć większą wersję. + +Ta lekcja była częścią serii [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) organizowanej przez [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Lekcja została przeprowadzona w formie dwóch filmów – godzinnej lekcji oraz godzinnej sesji pytań i odpowiedzi, podczas której omówiono szczegóły i odpowiadano na pytania. + +[![Lekcja 3: Interakcja ze światem fizycznym za pomocą czujników i siłowników](https://img.youtube.com/vi/Lqalu1v6aF4/0.jpg)](https://youtu.be/Lqalu1v6aF4) + +[![Lekcja 3: Interakcja ze światem fizycznym za pomocą czujników i siłowników - Sesja pytań i odpowiedzi](https://img.youtube.com/vi/qR3ekcMlLWA/0.jpg)](https://youtu.be/qR3ekcMlLWA) + +> 🎥 Kliknij powyższe obrazy, aby obejrzeć filmy + +## Quiz przed lekcją + +[Quiz przed lekcją](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5) + +## Wprowadzenie + +W tej lekcji wprowadzimy dwa kluczowe pojęcia dotyczące urządzeń IoT – czujniki i siłowniki. Będziesz mieć okazję praktycznie z nimi pracować, dodając czujnik światła do swojego projektu IoT, a następnie diodę LED sterowaną poziomem światła, tworząc w ten sposób lampkę nocną. + +W tej lekcji omówimy: + +* [Czym są czujniki?](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Jak używać czujnika](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Rodzaje czujników](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Czym są siłowniki?](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Jak używać siłownika](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Rodzaje siłowników](../../../../../1-getting-started/lessons/3-sensors-and-actuators) + +## Czym są czujniki? + +Czujniki to urządzenia sprzętowe, które wykrywają świat fizyczny – mierzą jedną lub więcej właściwości otoczenia i przesyłają informacje do urządzenia IoT. Istnieje ogromna różnorodność czujników, ponieważ można mierzyć wiele różnych rzeczy, od właściwości naturalnych, takich jak temperatura powietrza, po interakcje fizyczne, takie jak ruch. + +Niektóre popularne czujniki to: + +* Czujniki temperatury – mierzą temperaturę powietrza lub obiektu, w którym są zanurzone. Dla hobbystów i programistów często łączone są z czujnikami ciśnienia i wilgotności w jednym urządzeniu. +* Przyciski – wykrywają, kiedy zostały naciśnięte. +* Czujniki światła – wykrywają poziomy światła, w tym światło widzialne, UV, IR lub konkretne kolory. +* Kamery – rejestrują wizualną reprezentację świata, robiąc zdjęcia lub przesyłając wideo. +* Akcelerometry – wykrywają ruch w wielu kierunkach. +* Mikrofony – wykrywają dźwięk, zarówno ogólny poziom hałasu, jak i dźwięk kierunkowy. + +✅ Zrób małe badanie. Jakie czujniki ma Twój telefon? + +Wszystkie czujniki mają jedną wspólną cechę – przekształcają to, co wykrywają, w sygnał elektryczny, który może być interpretowany przez urządzenie IoT. Interpretacja tego sygnału zależy od rodzaju czujnika oraz protokołu komunikacyjnego używanego do komunikacji z urządzeniem IoT. + +## Jak używać czujnika + +Skorzystaj z odpowiedniego przewodnika, aby dodać czujnik do swojego urządzenia IoT: + +* [Arduino - Wio Terminal](wio-terminal-sensor.md) +* [Komputer jednopłytkowy - Raspberry Pi](pi-sensor.md) +* [Komputer jednopłytkowy - Wirtualne urządzenie](virtual-device-sensor.md) + +## Rodzaje czujników + +Czujniki mogą być analogowe lub cyfrowe. + +### Czujniki analogowe + +Najprostsze czujniki to czujniki analogowe. Otrzymują napięcie z urządzenia IoT, komponenty czujnika dostosowują to napięcie, a napięcie zwracane przez czujnik jest mierzone, aby uzyskać wartość czujnika. + +> 🎓 Napięcie to miara siły, z jaką prąd elektryczny jest przesuwany z jednego miejsca do drugiego, np. z dodatniego bieguna baterii do bieguna ujemnego. Na przykład standardowa bateria AA ma napięcie 1,5V (V to symbol woltów) i może przesuwać prąd z siłą 1,5V. Różne urządzenia elektryczne wymagają różnych napięć, np. dioda LED działa przy napięciu 2-3V, ale żarówka o mocy 100W potrzebuje 240V. Więcej o napięciu przeczytasz na [stronie Wikipedii o napięciu](https://wikipedia.org/wiki/Voltage). + +Przykładem jest potencjometr – pokrętło, które można obracać między dwoma pozycjami, a czujnik mierzy obrót. + +![Potencjometr ustawiony w połowie, otrzymujący 5 woltów i zwracający 3,8 woltów](../../../../../translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.pl.png) + +Urządzenie IoT wysyła sygnał elektryczny do potencjometru o napięciu, np. 5 woltów (5V). W miarę regulacji potencjometru zmienia się napięcie wychodzące z drugiej strony. Wyobraź sobie potencjometr oznaczony jako pokrętło od 0 do [11](https://wikipedia.org/wiki/Up_to_eleven), np. pokrętło głośności w wzmacniaczu. Gdy potencjometr jest w pozycji wyłączonej (0), wychodzi 0V. Gdy jest w pozycji maksymalnej (11), wychodzi 5V. + +> 🎓 To uproszczenie. Więcej o potencjometrach i rezystorach zmiennych przeczytasz na [stronie Wikipedii o potencjometrach](https://wikipedia.org/wiki/Potentiometer). + +Napięcie wychodzące z czujnika jest następnie odczytywane przez urządzenie IoT, które może na nie odpowiedzieć. W zależności od czujnika napięcie to może być wartością arbitralną lub odpowiadać standardowej jednostce. Na przykład analogowy czujnik temperatury oparty na [termistorze](https://wikipedia.org/wiki/Thermistor) zmienia swoją rezystancję w zależności od temperatury. Napięcie wyjściowe można następnie przeliczyć na temperaturę w kelwinach, a następnie na °C lub °F za pomocą obliczeń w kodzie. + +✅ Jak myślisz, co się stanie, jeśli czujnik zwróci wyższe napięcie niż to, które zostało wysłane (np. pochodzące z zewnętrznego źródła zasilania)? ⛔️ NIE testuj tego. + +#### Konwersja analogowo-cyfrowa + +Urządzenia IoT są cyfrowe – nie mogą pracować z wartościami analogowymi, tylko z 0 i 1. Oznacza to, że wartości czujników analogowych muszą zostać przekształcone na sygnał cyfrowy, zanim będą mogły zostać przetworzone. Wiele urządzeń IoT ma przetworniki analogowo-cyfrowe (ADC), które konwertują wejścia analogowe na cyfrowe reprezentacje ich wartości. Czujniki mogą również współpracować z ADC za pośrednictwem płytki łączącej. Na przykład w ekosystemie Seeed Grove z Raspberry Pi czujniki analogowe podłącza się do określonych portów na „nakładce” (hat), która jest podłączona do pinów GPIO Pi i zawiera ADC do konwersji napięcia na sygnał cyfrowy. + +Wyobraź sobie, że masz analogowy czujnik światła podłączony do urządzenia IoT, które działa na 3,3V i zwraca wartość 1V. To 1V nie ma znaczenia w świecie cyfrowym, więc musi zostać przekształcone. Napięcie zostanie przekształcone na wartość analogową w skali zależnej od urządzenia i czujnika. Przykładem jest czujnik światła Seeed Grove, który zwraca wartości od 0 do 1023. Dla tego czujnika działającego na 3,3V wyjście 1V odpowiada wartości 300. Urządzenie IoT nie może obsługiwać 300 jako wartości analogowej, więc wartość zostanie przekształcona na `0000000100101100`, binarną reprezentację liczby 300 przez nakładkę Grove. Następnie zostanie przetworzona przez urządzenie IoT. + +✅ Jeśli nie znasz systemu binarnego, zrób małe badanie, aby dowiedzieć się, jak liczby są reprezentowane za pomocą 0 i 1. [Lekcja wprowadzająca do systemu binarnego na BBC Bitesize](https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1) to świetne miejsce na start. + +Z perspektywy programowania wszystko to jest zwykle obsługiwane przez biblioteki dostarczane z czujnikami, więc nie musisz martwić się o tę konwersję samodzielnie. Dla czujnika światła Grove użyjesz biblioteki Python i wywołasz właściwość `light`, lub użyjesz biblioteki Arduino i wywołasz `analogRead`, aby uzyskać wartość 300. + +### Cyfrowe czujniki + +Cyfrowe czujniki, podobnie jak analogowe, wykrywają świat wokół siebie za pomocą zmian napięcia elektrycznego. Różnica polega na tym, że wysyłają sygnał cyfrowy, albo mierząc tylko dwa stany, albo używając wbudowanego ADC. Cyfrowe czujniki stają się coraz bardziej popularne, aby uniknąć konieczności używania ADC w płytce łączącej lub na samym urządzeniu IoT. + +Najprostszym cyfrowym czujnikiem jest przycisk lub przełącznik. Jest to czujnik z dwoma stanami: włączony lub wyłączony. + +![Przycisk otrzymuje 5 woltów. Gdy nie jest wciśnięty, zwraca 0 woltów, gdy jest wciśnięty, zwraca 5 woltów](../../../../../translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.pl.png) + +Piny w urządzeniach IoT, takie jak piny GPIO, mogą bezpośrednio mierzyć ten sygnał jako 0 lub 1. Jeśli napięcie wysłane jest takie samo jak napięcie zwrócone, odczytana wartość to 1, w przeciwnym razie wartość to 0. Nie ma potrzeby konwersji sygnału, może on być tylko 1 lub 0. + +> 💁 Napięcia nigdy nie są dokładne, zwłaszcza że komponenty w czujniku mają pewną rezystancję, więc zwykle istnieje tolerancja. Na przykład piny GPIO w Raspberry Pi działają na 3,3V i odczytują sygnał powyżej 1,8V jako 1, a poniżej 1,8V jako 0. + +* 3,3V wchodzi do przycisku. Przycisk jest wyłączony, więc wychodzi 0V, co daje wartość 0. +* 3,3V wchodzi do przycisku. Przycisk jest włączony, więc wychodzi 3,3V, co daje wartość 1. + +Bardziej zaawansowane cyfrowe czujniki odczytują wartości analogowe, a następnie konwertują je za pomocą wbudowanych ADC na sygnały cyfrowe. Na przykład cyfrowy czujnik temperatury nadal używa termopary w taki sam sposób jak czujnik analogowy i nadal mierzy zmianę napięcia spowodowaną rezystancją termopary w danej temperaturze. Zamiast zwracać wartość analogową i polegać na urządzeniu lub płytce łączącej w celu konwersji na sygnał cyfrowy, wbudowany w czujnik ADC konwertuje wartość i wysyła ją jako serię 0 i 1 do urządzenia IoT. Te 0 i 1 są wysyłane w taki sam sposób jak sygnał cyfrowy dla przycisku, gdzie 1 oznacza pełne napięcie, a 0 oznacza 0V. + +![Cyfrowy czujnik temperatury konwertujący odczyt analogowy na dane binarne z 0 jako 0 woltów i 1 jako 5 woltów przed wysłaniem do urządzenia IoT](../../../../../translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.pl.png) + +Wysyłanie danych cyfrowych pozwala czujnikom stać się bardziej zaawansowanymi i przesyłać bardziej szczegółowe dane, a nawet zaszyfrowane dane dla bezpiecznych czujników. Przykładem jest kamera. Jest to czujnik, który rejestruje obraz i przesyła go jako dane cyfrowe zawierające ten obraz, zwykle w skompresowanym formacie, takim jak JPEG, do odczytu przez urządzenie IoT. Może nawet przesyłać strumieniowo wideo, rejestrując obrazy i przesyłając je klatka po klatce lub jako skompresowany strumień wideo. + +## Czym są siłowniki? + +Siłowniki to przeciwieństwo czujników – przekształcają sygnał elektryczny z urządzenia IoT w interakcję ze światem fizycznym, taką jak emitowanie światła lub dźwięku, czy poruszanie silnikiem. + +Niektóre popularne siłowniki to: + +* Dioda LED – emituje światło po włączeniu. +* Głośnik – emituje dźwięk na podstawie przesłanego sygnału, od prostego brzęczyka po głośnik audio odtwarzający muzykę. +* Silnik krokowy – przekształca sygnał w określoną ilość obrotu, np. obrót pokrętła o 90°. +* Przekaźnik – przełącznik, który można włączyć lub wyłączyć za pomocą sygnału elektrycznego. Pozwala na włączenie większych napięć za pomocą małego napięcia z urządzenia IoT. +* Ekrany – bardziej złożone siłowniki, które wyświetlają informacje na wielosegmentowym wyświetlaczu. Ekrany mogą być od prostych wyświetlaczy LED po wysokiej rozdzielczości monitory wideo. + +✅ Zrób małe badanie. Jakie siłowniki ma Twój telefon? + +## Jak używać siłownika + +Skorzystaj z odpowiedniego przewodnika, aby dodać siłownik do swojego urządzenia IoT, sterowany przez czujnik, aby zbudować lampkę nocną IoT. Będzie ona zbierać poziomy światła z czujnika światła i używać siłownika w postaci diody LED do emitowania światła, gdy wykryty poziom światła będzie zbyt niski. + +![Schemat przepływu zadania pokazujący odczyt i sprawdzanie poziomów światła oraz sterowanie diodą LED](../../../../../translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.pl.png) + +* [Arduino - Wio Terminal](wio-terminal-actuator.md) +* [Komputer jednopłytkowy - Raspberry Pi](pi-actuator.md) +* [Komputer jednopłytkowy - Wirtualne urządzenie](virtual-device-actuator.md) + +## Rodzaje siłowników + +Podobnie jak czujniki, siłowniki mogą być analogowe lub cyfrowe. + +### Analogowe siłowniki + +Analogowe siłowniki przyjmują sygnał analogowy i przekształcają go w jakąś interakcję, gdzie interakcja zmienia się w zależności od dostarczonego napięcia. + +Przykładem jest ściemnialne światło, takie jak te, które możesz mieć w domu. Ilość dostarczonego napięcia decyduje o jasności światła. +![Światło przyciemnione przy niskim napięciu i jaśniejsze przy wyższym napięciu](../../../../../translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.pl.png) + +Podobnie jak w przypadku czujników, rzeczywiste urządzenie IoT działa na sygnałach cyfrowych, a nie analogowych. Oznacza to, że aby wysłać sygnał analogowy, urządzenie IoT potrzebuje przetwornika cyfrowo-analogowego (DAC), który może być wbudowany bezpośrednio w urządzenie IoT lub znajdować się na płytce połączeniowej. Przetwornik ten zamienia 0 i 1 z urządzenia IoT na napięcie analogowe, które może być używane przez siłownik. + +✅ Co Twoim zdaniem się stanie, jeśli urządzenie IoT wyśle napięcie wyższe niż to, które siłownik może obsłużyć? +⛔️ NIE testuj tego w praktyce. + +#### Modulacja szerokości impulsu (PWM) + +Inną opcją konwersji sygnałów cyfrowych z urządzenia IoT na sygnał analogowy jest modulacja szerokości impulsu (PWM). Polega to na wysyłaniu wielu krótkich impulsów cyfrowych, które działają jak sygnał analogowy. + +Na przykład PWM można użyć do kontrolowania prędkości silnika. + +Wyobraź sobie, że sterujesz silnikiem zasilanym napięciem 5V. Wysyłasz krótki impuls do silnika, przełączając napięcie na wysokie (5V) na dwie setne sekundy (0,02s). W tym czasie silnik może wykonać jedną dziesiątą obrotu, czyli 36°. Następnie sygnał pauzuje na dwie setne sekundy (0,02s), wysyłając niski sygnał (0V). Każdy cykl włączania i wyłączania trwa 0,04s. Cykl ten powtarza się. + +![Modulacja szerokości impulsu - obrót silnika z prędkością 150 RPM](../../../../../translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.pl.png) + +Oznacza to, że w ciągu jednej sekundy wysyłasz 25 impulsów 5V trwających 0,02s, które obracają silnik, a każdy z nich jest poprzedzony 0,02s przerwy przy 0V, gdy silnik się nie obraca. Każdy impuls obraca silnik o jedną dziesiątą obrotu, co oznacza, że silnik wykonuje 2,5 obrotu na sekundę. Użyłeś sygnału cyfrowego, aby obrócić silnik z prędkością 2,5 obrotu na sekundę, czyli 150 [obrotów na minutę](https://wikipedia.org/wiki/Revolutions_per_minute) (niestandardowa jednostka prędkości obrotowej). + +```output +25 pulses per second x 0.1 rotations per pulse = 2.5 rotations per second +2.5 rotations per second x 60 seconds in a minute = 150rpm +``` + +> 🎓 Gdy sygnał PWM jest włączony przez połowę czasu, a wyłączony przez drugą połowę, nazywa się to [cyklem pracy 50%](https://wikipedia.org/wiki/Duty_cycle). Cykl pracy mierzy się jako procent czasu, w którym sygnał jest w stanie włączonym w porównaniu do stanu wyłączonego. + +![Modulacja szerokości impulsu - obrót silnika z prędkością 75 RPM](../../../../../translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.pl.png) + +Możesz zmienić prędkość silnika, zmieniając długość impulsów. Na przykład, przy tym samym silniku możesz zachować ten sam czas cyklu 0,04s, ale skrócić impuls włączony do 0,01s, a impuls wyłączony wydłużyć do 0,03s. Liczba impulsów na sekundę (25) pozostaje taka sama, ale każdy impuls włączony jest o połowę krótszy. Krótszy impuls obraca silnik o jedną dwudziestą obrotu, a przy 25 impulsach na sekundę silnik wykona 1,25 obrotu na sekundę, czyli 75 RPM. Zmieniając prędkość impulsów sygnału cyfrowego, zmniejszyłeś prędkość analogowego silnika o połowę. + +```output +25 pulses per second x 0.05 rotations per pulse = 1.25 rotations per second +1.25 rotations per second x 60 seconds in a minute = 75rpm +``` + +✅ Jak utrzymać płynność obrotów silnika, szczególnie przy niskich prędkościach? Czy użyłbyś małej liczby długich impulsów z długimi przerwami, czy wielu bardzo krótkich impulsów z krótkimi przerwami? + +> 💁 Niektóre czujniki również używają PWM do konwersji sygnałów analogowych na cyfrowe. + +> 🎓 Więcej o modulacji szerokości impulsu możesz przeczytać na [stronie Wikipedii o PWM](https://wikipedia.org/wiki/Pulse-width_modulation). + +### Siłowniki cyfrowe + +Siłowniki cyfrowe, podobnie jak czujniki cyfrowe, mają dwa stany kontrolowane przez wysokie lub niskie napięcie albo mają wbudowany DAC, który pozwala na konwersję sygnału cyfrowego na analogowy. + +Prostym siłownikiem cyfrowym jest dioda LED. Gdy urządzenie wysyła sygnał cyfrowy 1, wysyłane jest wysokie napięcie, które zapala diodę LED. Gdy wysyłany jest sygnał cyfrowy 0, napięcie spada do 0V i dioda LED gaśnie. + +![Dioda LED wyłączona przy 0V i włączona przy 5V](../../../../../translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.pl.png) + +✅ Jakie inne proste siłowniki dwustanowe przychodzą Ci do głowy? Jednym z przykładów jest elektromagnes (solenoid), który można aktywować, aby np. przesunąć rygiel drzwi, blokując/odblokowując drzwi. + +Bardziej zaawansowane siłowniki cyfrowe, takie jak ekrany, wymagają przesyłania danych cyfrowych w określonych formatach. Zazwyczaj są one dostarczane z bibliotekami, które ułatwiają wysyłanie odpowiednich danych do ich sterowania. + +--- + +## 🚀 Wyzwanie + +Wyzwanie z ostatnich dwóch lekcji polegało na wymienieniu jak największej liczby urządzeń IoT znajdujących się w Twoim domu, szkole lub miejscu pracy oraz określeniu, czy są one oparte na mikrokontrolerach, komputerach jednopłytkowych, czy może na mieszance obu. + +Dla każdego wymienionego urządzenia zastanów się, z jakimi czujnikami i siłownikami są one połączone. Jaki jest cel każdego czujnika i siłownika podłączonego do tych urządzeń? + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6) + +## Przegląd i samodzielna nauka + +* Przeczytaj o elektryczności i obwodach na [ThingLearn](http://thinglearn.jenlooper.com/curriculum/). +* Przeczytaj o różnych typach czujników temperatury w [przewodniku Seeed Studios o czujnikach temperatury](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/). +* Przeczytaj o diodach LED na [stronie Wikipedii o diodach LED](https://wikipedia.org/wiki/Light-emitting_diode). + +## Zadanie + +[Zbadaj czujniki i siłowniki](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/assignment.md b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/assignment.md new file mode 100644 index 00000000..21489f1c --- /dev/null +++ b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/assignment.md @@ -0,0 +1,29 @@ + +# Badania czujników i siłowników + +## Instrukcje + +Ta lekcja dotyczyła czujników i siłowników. Zbadaj i opisz jeden czujnik oraz jeden siłownik, które mogą być używane z zestawem deweloperskim IoT, uwzględniając: + +* Co robi +* Elektronikę/sprzęt używany wewnątrz +* Czy jest analogowy czy cyfrowy +* Jakie są jednostki i zakres wejść lub pomiarów + +## Kryteria oceny + +| Kryteria | Wzorowe | Zadowalające | Wymaga poprawy | +| -------- | --------- | -------- | ----------------- | +| Opis czujnika | Opisano czujnik, uwzględniając szczegóły dla wszystkich 4 sekcji wymienionych powyżej. | Opisano czujnik, ale uwzględniono tylko 2-3 sekcje wymienione powyżej. | Opisano czujnik, ale uwzględniono tylko 1 sekcję wymienioną powyżej. | +| Opis siłownika | Opisano siłownik, uwzględniając szczegóły dla wszystkich 4 sekcji wymienionych powyżej. | Opisano siłownik, ale uwzględniono tylko 2-3 sekcje wymienione powyżej. | Opisano siłownik, ale uwzględniono tylko 1 sekcję wymienioną powyżej. | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md new file mode 100644 index 00000000..4301d539 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md @@ -0,0 +1,128 @@ + +# Zbuduj lampkę nocną - Raspberry Pi + +W tej części lekcji dodasz diodę LED do swojego Raspberry Pi i użyjesz jej do stworzenia lampki nocnej. + +## Sprzęt + +Lampka nocna potrzebuje teraz aktuatora. + +Aktuatorem jest **LED**, czyli [dioda emitująca światło](https://wikipedia.org/wiki/Light-emitting_diode), która świeci, gdy przepływa przez nią prąd. Jest to cyfrowy aktuator, który ma dwa stany: włączony i wyłączony. Wysłanie wartości 1 włącza diodę LED, a 0 ją wyłącza. LED jest zewnętrznym aktuatoriem Grove i musi być podłączony do Grove Base hat na Raspberry Pi. + +Logika lampki nocnej w pseudokodzie wygląda następująco: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Podłącz diodę LED + +Dioda Grove LED jest dostępna jako moduł z wyborem diod LED, co pozwala wybrać kolor. + +#### Zadanie - podłącz diodę LED + +Podłącz diodę LED. + +![Dioda Grove LED](../../../../../translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.pl.png) + +1. Wybierz swoją ulubioną diodę LED i włóż jej nóżki do dwóch otworów w module LED. + + Diody LED to diody emitujące światło, a diody to urządzenia elektroniczne, które mogą przewodzić prąd tylko w jednym kierunku. Oznacza to, że dioda LED musi być podłączona w odpowiedni sposób, inaczej nie będzie działać. + + Jedna z nóżek diody LED to pin dodatni, a druga to pin ujemny. Dioda LED nie jest idealnie okrągła i jest nieco bardziej płaska z jednej strony. Ta bardziej płaska strona to pin ujemny. Podłączając diodę LED do modułu, upewnij się, że nóżka po stronie zaokrąglonej jest podłączona do gniazda oznaczonego **+** na zewnątrz modułu, a płaska strona jest podłączona do gniazda bliżej środka modułu. + +1. Moduł LED ma pokrętło, które pozwala kontrolować jasność. Na początek ustaw je na maksymalną jasność, obracając je w kierunku przeciwnym do ruchu wskazówek zegara, aż do oporu, używając małego śrubokręta krzyżakowego. + +1. Włóż jeden koniec kabla Grove do gniazda w module LED. Kabel wejdzie tylko w jednym kierunku. + +1. Przy wyłączonym Raspberry Pi podłącz drugi koniec kabla Grove do gniazda cyfrowego oznaczonego **D5** na Grove Base hat podłączonym do Pi. To gniazdo znajduje się jako drugie od lewej, w rzędzie gniazd obok pinów GPIO. + +![Dioda Grove LED podłączona do gniazda D5](../../../../../translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.pl.png) + +## Zaprogramuj lampkę nocną + +Lampka nocna może teraz zostać zaprogramowana przy użyciu czujnika światła Grove i diody LED Grove. + +### Zadanie - zaprogramuj lampkę nocną + +Zaprogramuj lampkę nocną. + +1. Włącz Raspberry Pi i poczekaj, aż się uruchomi. + +1. Otwórz projekt lampki nocnej w VS Code, który utworzyłeś w poprzedniej części zadania, uruchamiając go bezpośrednio na Pi lub łącząc się za pomocą rozszerzenia Remote SSH. + +1. Dodaj poniższy kod do pliku `app.py`, aby zaimportować wymaganą bibliotekę. Kod ten powinien być dodany na górze, poniżej innych linii `import`. + + ```python + from grove.grove_led import GroveLed + ``` + + Instrukcja `from grove.grove_led import GroveLed` importuje `GroveLed` z bibliotek Python Grove. Ta biblioteka zawiera kod do interakcji z diodą LED Grove. + +1. Dodaj poniższy kod po deklaracji `light_sensor`, aby utworzyć instancję klasy zarządzającej diodą LED: + + ```python + led = GroveLed(5) + ``` + + Linia `led = GroveLed(5)` tworzy instancję klasy `GroveLed`, łącząc się z pinem **D5** - cyfrowym pinem Grove, do którego podłączona jest dioda LED. + + > 💁 Wszystkie gniazda mają unikalne numery pinów. Piny 0, 2, 4 i 6 to piny analogowe, a piny 5, 16, 18, 22, 24 i 26 to piny cyfrowe. + +1. Dodaj sprawdzenie wewnątrz pętli `while`, przed `time.sleep`, aby sprawdzić poziomy światła i włączyć lub wyłączyć diodę LED: + + ```python + if light < 300: + led.on() + else: + led.off() + ``` + + Ten kod sprawdza wartość `light`. Jeśli jest ona mniejsza niż 300, wywołuje metodę `on` klasy `GroveLed`, która wysyła wartość cyfrową 1 do diody LED, włączając ją. Jeśli wartość światła jest większa lub równa 300, wywołuje metodę `off`, wysyłając wartość cyfrową 0 do diody LED, wyłączając ją. + + > 💁 Ten kod powinien być wcięty na tym samym poziomie co linia `print('Light level:', light)`, aby znajdował się wewnątrz pętli while! + + > 💁 Podczas wysyłania wartości cyfrowych do aktuatorów wartość 0 oznacza 0V, a wartość 1 oznacza maksymalne napięcie dla urządzenia. Dla Raspberry Pi z czujnikami i aktuatorami Grove napięcie 1 wynosi 3.3V. + +1. W terminalu VS Code uruchom poniższe polecenie, aby uruchomić swoją aplikację w Pythonie: + + ```sh + python3 app.py + ``` + + Wartości światła będą wyświetlane w konsoli. + + ```output + pi@raspberrypi:~/nightlight $ python3 app.py + Light level: 634 + Light level: 634 + Light level: 634 + Light level: 230 + Light level: 104 + Light level: 290 + ``` + +1. Zakryj i odkryj czujnik światła. Zauważ, że dioda LED zapali się, jeśli poziom światła wynosi 300 lub mniej, a wyłączy się, gdy poziom światła będzie większy niż 300. + + > 💁 Jeśli dioda LED się nie zapala, upewnij się, że jest podłączona w odpowiedni sposób, a pokrętło jest ustawione na maksymalną jasność. + +![Dioda LED podłączona do Pi zapala się i gaśnie w zależności od poziomu światła](../../../../../images/pi-running-assignment-1-1.gif) + +> 💁 Ten kod znajdziesz w folderze [code-actuator/pi](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/pi). + +😀 Twój program lampki nocnej zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md new file mode 100644 index 00000000..a39e923b --- /dev/null +++ b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md @@ -0,0 +1,108 @@ + +# Zbuduj lampkę nocną - Raspberry Pi + +W tej części lekcji dodasz czujnik światła do swojego Raspberry Pi. + +## Sprzęt + +Czujnikiem używanym w tej lekcji jest **czujnik światła**, który wykorzystuje [fotodiodę](https://wikipedia.org/wiki/Fotodioda) do przekształcania światła w sygnał elektryczny. Jest to czujnik analogowy, który wysyła wartość całkowitą od 0 do 1 000, wskazującą względną ilość światła, która nie odpowiada żadnej standardowej jednostce miary, takiej jak [lux](https://wikipedia.org/wiki/Lux). + +Czujnik światła to zewnętrzny czujnik Grove, który należy podłączyć do nakładki Grove Base na Raspberry Pi. + +### Podłącz czujnik światła + +Czujnik światła Grove, który służy do wykrywania poziomów światła, musi zostać podłączony do Raspberry Pi. + +#### Zadanie - podłącz czujnik światła + +Podłącz czujnik światła. + +![Czujnik światła Grove](../../../../../translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.pl.png) + +1. Włóż jeden koniec kabla Grove do gniazda na module czujnika światła. Kabel wejdzie tylko w jedną stronę. + +1. Przy wyłączonym Raspberry Pi podłącz drugi koniec kabla Grove do analogowego gniazda oznaczonego **A0** na nakładce Grove Base przymocowanej do Pi. To gniazdo znajduje się drugie od prawej strony, w rzędzie gniazd obok pinów GPIO. + +![Czujnik światła Grove podłączony do gniazda A0](../../../../../translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.pl.png) + +## Zaprogramuj czujnik światła + +Urządzenie można teraz zaprogramować przy użyciu czujnika światła Grove. + +### Zadanie - zaprogramuj czujnik światła + +Zaprogramuj urządzenie. + +1. Włącz Raspberry Pi i poczekaj, aż się uruchomi. + +1. Otwórz projekt lampki nocnej w VS Code, który utworzyłeś w poprzedniej części tego zadania, działając bezpośrednio na Pi lub łącząc się za pomocą rozszerzenia Remote SSH. + +1. Otwórz plik `app.py` i usuń z niego cały kod. + +1. Dodaj poniższy kod do pliku `app.py`, aby zaimportować wymagane biblioteki: + + ```python + import time + from grove.grove_light_sensor_v1_2 import GroveLightSensor + ``` + + Instrukcja `import time` importuje moduł `time`, który będzie używany później w tym zadaniu. + + Instrukcja `from grove.grove_light_sensor_v1_2 import GroveLightSensor` importuje `GroveLightSensor` z bibliotek Python Grove. Ta biblioteka zawiera kod do obsługi czujnika światła Grove i została zainstalowana globalnie podczas konfiguracji Pi. + +1. Dodaj poniższy kod po kodzie powyżej, aby utworzyć instancję klasy zarządzającej czujnikiem światła: + + ```python + light_sensor = GroveLightSensor(0) + ``` + + Linia `light_sensor = GroveLightSensor(0)` tworzy instancję klasy `GroveLightSensor`, łącząc się z pinem **A0** - analogowym pinem Grove, do którego podłączony jest czujnik światła. + +1. Dodaj nieskończoną pętlę po kodzie powyżej, aby odczytywać wartość czujnika światła i wyświetlać ją w konsoli: + + ```python + while True: + light = light_sensor.light + print('Light level:', light) + ``` + + To odczyta aktualny poziom światła w skali od 0 do 1 023, używając właściwości `light` klasy `GroveLightSensor`. Ta właściwość odczytuje wartość analogową z pinu. Wartość ta jest następnie wyświetlana w konsoli. + +1. Dodaj krótką pauzę trwającą jedną sekundę na końcu pętli, ponieważ poziomy światła nie muszą być sprawdzane ciągle. Pauza zmniejsza zużycie energii przez urządzenie. + + ```python + time.sleep(1) + ``` + +1. W terminalu VS Code uruchom poniższe polecenie, aby uruchomić swoją aplikację w Pythonie: + + ```sh + python3 app.py + ``` + + Wartości światła będą wyświetlane w konsoli. Zakryj i odkryj czujnik światła, a wartości będą się zmieniać: + + ```output + pi@raspberrypi:~/nightlight $ python3 app.py + Light level: 634 + Light level: 634 + Light level: 634 + Light level: 230 + Light level: 104 + Light level: 290 + ``` + +> 💁 Ten kod znajdziesz w folderze [code-sensor/pi](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/pi). + +😀 Dodanie czujnika do programu lampki nocnej zakończyło się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md new file mode 100644 index 00000000..42455de1 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md @@ -0,0 +1,122 @@ + +# Zbuduj lampkę nocną - Wirtualny sprzęt IoT + +W tej części lekcji dodasz diodę LED do swojego wirtualnego urządzenia IoT i użyjesz jej do stworzenia lampki nocnej. + +## Wirtualny sprzęt + +Lampka nocna wymaga jednego aktuatora, który zostanie utworzony w aplikacji CounterFit. + +Aktuatorem jest **LED**. W fizycznym urządzeniu IoT byłaby to [dioda elektroluminescencyjna](https://wikipedia.org/wiki/Dioda_elektroluminescencyjna), która emituje światło, gdy przepływa przez nią prąd. Jest to cyfrowy aktuator, który ma dwa stany: włączony i wyłączony. Wysłanie wartości 1 włącza diodę LED, a 0 ją wyłącza. + +Logika lampki nocnej w pseudokodzie wygląda następująco: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Dodaj aktuator do CounterFit + +Aby użyć wirtualnej diody LED, musisz dodać ją do aplikacji CounterFit. + +#### Zadanie - dodaj aktuator do CounterFit + +Dodaj diodę LED do aplikacji CounterFit. + +1. Upewnij się, że aplikacja webowa CounterFit działa z poprzedniej części tego zadania. Jeśli nie, uruchom ją ponownie i dodaj czujnik światła. + +1. Utwórz diodę LED: + + 1. W polu *Create actuator* w panelu *Actuator* rozwiń listę *Actuator type* i wybierz *LED*. + + 1. Ustaw *Pin* na *5*. + + 1. Wybierz przycisk **Add**, aby utworzyć diodę LED na pinie 5. + + ![Ustawienia diody LED](../../../../../translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.pl.png) + + Dioda LED zostanie utworzona i pojawi się na liście aktuatorów. + + ![Utworzona dioda LED](../../../../../translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.pl.png) + + Po utworzeniu diody LED możesz zmienić jej kolor za pomocą selektora *Color*. Wybierz przycisk **Set**, aby zmienić kolor po jego wybraniu. + +### Zaprogramuj lampkę nocną + +Teraz możesz zaprogramować lampkę nocną, używając czujnika światła i diody LED w CounterFit. + +#### Zadanie - zaprogramuj lampkę nocną + +Zaprogramuj lampkę nocną. + +1. Otwórz projekt lampki nocnej w VS Code, który utworzyłeś w poprzedniej części tego zadania. Jeśli to konieczne, zamknij i ponownie utwórz terminal, aby upewnić się, że działa w wirtualnym środowisku. + +1. Otwórz plik `app.py`. + +1. Dodaj poniższy kod do pliku `app.py`, aby zaimportować wymaganą bibliotekę. Kod ten powinien zostać dodany na górze, poniżej innych linii `import`. + + ```python + from counterfit_shims_grove.grove_led import GroveLed + ``` + + Linia `from counterfit_shims_grove.grove_led import GroveLed` importuje `GroveLed` z bibliotek Python CounterFit Grove shim. Ta biblioteka zawiera kod do obsługi diody LED utworzonej w aplikacji CounterFit. + +1. Dodaj poniższy kod po deklaracji `light_sensor`, aby utworzyć instancję klasy zarządzającej diodą LED: + + ```python + led = GroveLed(5) + ``` + + Linia `led = GroveLed(5)` tworzy instancję klasy `GroveLed`, łącząc się z pinem **5** - pinem CounterFit Grove, do którego podłączona jest dioda LED. + +1. Dodaj sprawdzenie wewnątrz pętli `while`, przed `time.sleep`, aby sprawdzić poziomy światła i włączyć lub wyłączyć diodę LED: + + ```python + if light < 300: + led.on() + else: + led.off() + ``` + + Ten kod sprawdza wartość `light`. Jeśli jest mniejsza niż 300, wywołuje metodę `on` klasy `GroveLed`, która wysyła wartość cyfrową 1 do diody LED, włączając ją. Jeśli wartość światła jest większa lub równa 300, wywołuje metodę `off`, wysyłając wartość cyfrową 0 do diody LED, wyłączając ją. + + > 💁 Ten kod powinien być wcięty na tym samym poziomie co linia `print('Light level:', light)`, aby znajdował się wewnątrz pętli `while`! + +1. W terminalu VS Code uruchom poniższe polecenie, aby uruchomić swoją aplikację w Pythonie: + + ```sh + python3 app.py + ``` + + Wartości światła będą wyświetlane w konsoli. + + ```output + (.venv) ➜ GroveTest python3 app.py + Light level: 143 + Light level: 244 + Light level: 246 + Light level: 253 + ``` + +1. Zmień ustawienia *Value* lub *Random*, aby zmieniać poziom światła powyżej i poniżej 300. Dioda LED będzie się włączać i wyłączać. + +![Dioda LED w aplikacji CounterFit włączająca się i wyłączająca w zależności od poziomu światła](../../../../../images/virtual-device-running-assignment-1-1.gif) + +> 💁 Ten kod znajdziesz w folderze [code-actuator/virtual-device](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/virtual-device). + +😀 Twój program lampki nocnej działa poprawnie! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md new file mode 100644 index 00000000..61c97bc8 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md @@ -0,0 +1,122 @@ + +# Zbuduj lampkę nocną - Wirtualny sprzęt IoT + +W tej części lekcji dodasz czujnik światła do swojego wirtualnego urządzenia IoT. + +## Wirtualny sprzęt + +Lampka nocna potrzebuje jednego czujnika, utworzonego w aplikacji CounterFit. + +Czujnik to **czujnik światła**. W fizycznym urządzeniu IoT byłby to [fotodioda](https://wikipedia.org/wiki/Photodiode), która przekształca światło w sygnał elektryczny. Czujniki światła są analogowymi czujnikami, które wysyłają wartość całkowitą wskazującą względną ilość światła, która nie odpowiada żadnej standardowej jednostce miary, takiej jak [lux](https://wikipedia.org/wiki/Lux). + +### Dodaj czujniki do CounterFit + +Aby użyć wirtualnego czujnika światła, musisz dodać go do aplikacji CounterFit. + +#### Zadanie - dodaj czujniki do CounterFit + +Dodaj czujnik światła do aplikacji CounterFit. + +1. Upewnij się, że aplikacja internetowa CounterFit działa z poprzedniej części tego zadania. Jeśli nie, uruchom ją. + +1. Utwórz czujnik światła: + + 1. W polu *Create sensor* w panelu *Sensors* rozwiń pole *Sensor type* i wybierz *Light*. + + 1. Pozostaw *Units* ustawione na *NoUnits*. + + 1. Upewnij się, że *Pin* jest ustawiony na *0*. + + 1. Wybierz przycisk **Add**, aby utworzyć czujnik światła na Pinie 0. + + ![Ustawienia czujnika światła](../../../../../translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.pl.png) + + Czujnik światła zostanie utworzony i pojawi się na liście czujników. + + ![Utworzony czujnik światła](../../../../../translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.pl.png) + +## Programowanie czujnika światła + +Urządzenie może teraz zostać zaprogramowane do korzystania z wbudowanego czujnika światła. + +### Zadanie - zaprogramuj czujnik światła + +Zaprogramuj urządzenie. + +1. Otwórz projekt lampki nocnej w VS Code, który utworzyłeś w poprzedniej części tego zadania. Jeśli to konieczne, zamknij i ponownie utwórz terminal, aby upewnić się, że działa w wirtualnym środowisku. + +1. Otwórz plik `app.py`. + +1. Dodaj poniższy kod na początku pliku `app.py` wraz z pozostałymi instrukcjami `import`, aby zaimportować wymagane biblioteki: + + ```python + import time + from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor + ``` + + Instrukcja `import time` importuje moduł Python `time`, który będzie używany później w tym zadaniu. + + Instrukcja `from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor` importuje `GroveLightSensor` z bibliotek Python CounterFit Grove shim. Ta biblioteka zawiera kod do obsługi czujnika światła utworzonego w aplikacji CounterFit. + +1. Dodaj poniższy kod na końcu pliku, aby utworzyć instancje klas zarządzających czujnikiem światła: + + ```python + light_sensor = GroveLightSensor(0) + ``` + + Linia `light_sensor = GroveLightSensor(0)` tworzy instancję klasy `GroveLightSensor`, łącząc się z pinem **0** - pinem CounterFit Grove, do którego podłączony jest czujnik światła. + +1. Dodaj nieskończoną pętlę po powyższym kodzie, aby odczytywać wartość czujnika światła i wyświetlać ją w konsoli: + + ```python + while True: + light = light_sensor.light + print('Light level:', light) + ``` + + To odczyta aktualny poziom światła za pomocą właściwości `light` klasy `GroveLightSensor`. Ta właściwość odczytuje wartość analogową z pinu. Następnie wartość ta zostanie wyświetlona w konsoli. + +1. Dodaj krótką pauzę trwającą jedną sekundę na końcu pętli `while`, ponieważ poziomy światła nie muszą być sprawdzane ciągle. Pauza zmniejsza zużycie energii przez urządzenie. + + ```python + time.sleep(1) + ``` + +1. W terminalu VS Code uruchom poniższe polecenie, aby uruchomić swoją aplikację w Pythonie: + + ```sh + python3 app.py + ``` + + Wartości światła zostaną wyświetlone w konsoli. Początkowo wartość ta będzie wynosić 0. + +1. W aplikacji CounterFit zmień wartość czujnika światła, która będzie odczytywana przez aplikację. Możesz to zrobić na dwa sposoby: + + * Wpisz liczbę w polu *Value* dla czujnika światła, a następnie wybierz przycisk **Set**. Liczba, którą wpiszesz, będzie wartością zwracaną przez czujnik. + + * Zaznacz pole *Random* i wpisz wartości *Min* oraz *Max*, a następnie wybierz przycisk **Set**. Za każdym razem, gdy czujnik odczytuje wartość, będzie odczytywał losową liczbę pomiędzy *Min* a *Max*. + + Wartości, które ustawisz, zostaną wyświetlone w konsoli. Zmień ustawienia *Value* lub *Random*, aby wartość się zmieniała. + + ```output + (.venv) ➜ GroveTest python3 app.py + Light level: 143 + Light level: 244 + Light level: 246 + Light level: 253 + ``` + +> 💁 Ten kod znajdziesz w folderze [code-sensor/virtual-device](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/virtual-device). + +😀 Twój program lampki nocnej zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md new file mode 100644 index 00000000..3e36cf5b --- /dev/null +++ b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md @@ -0,0 +1,122 @@ + +# Zbuduj lampkę nocną - Wio Terminal + +W tej części lekcji dodasz diodę LED do swojego Wio Terminal i użyjesz jej do stworzenia lampki nocnej. + +## Sprzęt + +Lampka nocna potrzebuje teraz aktuatora. + +Aktuatorem jest **LED**, czyli [dioda emitująca światło](https://wikipedia.org/wiki/Light-emitting_diode), która świeci, gdy przepływa przez nią prąd. Jest to cyfrowy aktuator, który ma dwa stany: włączony i wyłączony. Wysłanie wartości 1 włącza diodę LED, a 0 ją wyłącza. Jest to zewnętrzny aktuator Grove, który należy podłączyć do Wio Terminal. + +Logika lampki nocnej w pseudokodzie wygląda następująco: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Podłącz diodę LED + +Dioda Grove LED jest dostępna jako moduł z wyborem diod LED, co pozwala wybrać kolor. + +#### Zadanie - podłącz diodę LED + +Podłącz diodę LED. + +![Dioda Grove LED](../../../../../translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.pl.png) + +1. Wybierz swoją ulubioną diodę LED i włóż jej nóżki do dwóch otworów w module LED. + + Diody LED to diody emitujące światło, a diody to urządzenia elektroniczne, które mogą przewodzić prąd tylko w jednym kierunku. Oznacza to, że dioda LED musi być podłączona w odpowiedni sposób, inaczej nie będzie działać. + + Jedna z nóżek diody LED to pin dodatni, a druga to pin ujemny. Dioda LED nie jest idealnie okrągła i jest lekko spłaszczona z jednej strony. Lekko spłaszczona strona to pin ujemny. Podłączając diodę LED do modułu, upewnij się, że nóżka po stronie zaokrąglonej jest podłączona do gniazda oznaczonego **+** na zewnątrz modułu, a spłaszczona strona jest podłączona do gniazda bliżej środka modułu. + +1. Moduł LED ma pokrętło, które pozwala kontrolować jasność. Na początek ustaw je na maksymalną jasność, obracając je w kierunku przeciwnym do ruchu wskazówek zegara, aż do oporu, używając małego śrubokręta krzyżakowego. + +1. Włóż jeden koniec kabla Grove do gniazda w module LED. Kabel wejdzie tylko w jednym kierunku. + +1. Gdy Wio Terminal jest odłączony od komputera lub innego źródła zasilania, podłącz drugi koniec kabla Grove do gniazda Grove po prawej stronie Wio Terminal, patrząc na ekran. Jest to gniazdo najbardziej oddalone od przycisku zasilania. + + > 💁 Prawe gniazdo Grove może być używane z analogowymi lub cyfrowymi czujnikami i aktuatorami. Lewe gniazdo jest przeznaczone tylko dla czujników i aktuatorów cyfrowych. C zostanie omówione w późniejszej lekcji. + +![Dioda Grove LED podłączona do prawego gniazda](../../../../../translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.pl.png) + +## Zaprogramuj lampkę nocną + +Lampka nocna może teraz zostać zaprogramowana przy użyciu wbudowanego czujnika światła i diody Grove LED. + +### Zadanie - zaprogramuj lampkę nocną + +Zaprogramuj lampkę nocną. + +1. Otwórz projekt lampki nocnej w VS Code, który utworzyłeś w poprzedniej części tego zadania. + +1. Dodaj następującą linię na końcu funkcji `setup`: + + ```cpp + pinMode(D0, OUTPUT); + ``` + + Ta linia konfiguruje pin używany do komunikacji z diodą LED przez port Grove. + + Pin `D0` to cyfrowy pin dla prawego gniazda Grove. Ten pin jest ustawiony na `OUTPUT`, co oznacza, że łączy się z aktuatorami, a dane będą zapisywane na pinie. + +1. Dodaj następujący kod bezpośrednio przed `delay` w funkcji `loop`: + + ```cpp + if (light < 300) + { + digitalWrite(D0, HIGH); + } + else + { + digitalWrite(D0, LOW); + } + ``` + + Ten kod sprawdza wartość `light`. Jeśli jest ona mniejsza niż 300, wysyła wartość `HIGH` do cyfrowego pinu `D0`. Wartość `HIGH` to wartość 1, która włącza diodę LED. Jeśli wartość światła jest większa lub równa 300, wysyłana jest wartość `LOW` wynosząca 0, która wyłącza diodę LED. + + > 💁 Podczas wysyłania wartości cyfrowych do aktuatorów wartość LOW to 0V, a wartość HIGH to maksymalne napięcie dla urządzenia. Dla Wio Terminal napięcie HIGH wynosi 3,3V. + +1. Podłącz ponownie Wio Terminal do komputera i wgraj nowy kod tak jak wcześniej. + +1. Podłącz Serial Monitor. Wartości światła będą wyświetlane w terminalu. + + ```output + > Executing task: platformio device monitor < + + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem101 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Light value: 4 + Light value: 5 + Light value: 4 + Light value: 158 + Light value: 343 + Light value: 348 + Light value: 344 + ``` + +1. Zakryj i odkryj czujnik światła. Zauważ, jak dioda LED zapala się, gdy poziom światła wynosi 300 lub mniej, i gaśnie, gdy poziom światła jest większy niż 300. + +![Dioda LED podłączona do WIO zapala się i gaśnie w zależności od poziomu światła](../../../../../images/wio-running-assignment-1-1.gif) + +> 💁 Ten kod znajdziesz w folderze [code-actuator/wio-terminal](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/wio-terminal). + +😀 Twój program lampki nocnej zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md new file mode 100644 index 00000000..b2067dc2 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md @@ -0,0 +1,85 @@ + +# Dodaj czujnik - Wio Terminal + +W tej części lekcji użyjesz czujnika światła w swoim Wio Terminal. + +## Sprzęt + +Czujnik używany w tej lekcji to **czujnik światła**, który wykorzystuje [fotodiodę](https://wikipedia.org/wiki/Fotodioda) do przekształcania światła w sygnał elektryczny. Jest to czujnik analogowy, który wysyła wartość całkowitą od 0 do 1 023, wskazując względną ilość światła, która nie jest powiązana z żadną standardową jednostką miary, taką jak [lux](https://wikipedia.org/wiki/Lux). + +Czujnik światła jest wbudowany w Wio Terminal i widoczny przez przezroczyste plastikowe okienko z tyłu urządzenia. + +![Czujnik światła z tyłu Wio Terminal](../../../../../translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.pl.png) + +## Programowanie czujnika światła + +Urządzenie można teraz zaprogramować do korzystania z wbudowanego czujnika światła. + +### Zadanie + +Zaprogramuj urządzenie. + +1. Otwórz projekt nightlight w VS Code, który utworzyłeś w poprzedniej części tego zadania. + +1. Dodaj następującą linię na końcu funkcji `setup`: + + ```cpp + pinMode(WIO_LIGHT, INPUT); + ``` + + Ta linia konfiguruje piny używane do komunikacji ze sprzętem czujnika. + + Pin `WIO_LIGHT` to numer pinu GPIO połączonego z wbudowanym czujnikiem światła. Ten pin jest ustawiony na `INPUT`, co oznacza, że łączy się z czujnikiem i dane będą odczytywane z tego pinu. + +1. Usuń zawartość funkcji `loop`. + +1. Dodaj następujący kod do teraz pustej funkcji `loop`. + + ```cpp + int light = analogRead(WIO_LIGHT); + Serial.print("Light value: "); + Serial.println(light); + ``` + + Ten kod odczytuje wartość analogową z pinu `WIO_LIGHT`. Odczytuje wartość od 0 do 1 023 z wbudowanego czujnika światła. Ta wartość jest następnie wysyłana do portu szeregowego, dzięki czemu możesz ją odczytać w Serial Monitor, gdy ten kod działa. `Serial.print` zapisuje tekst bez nowej linii na końcu, więc każda linia zacznie się od `Light value:` i zakończy rzeczywistą wartością światła. + +1. Dodaj małe opóźnienie jednej sekundy (1 000 ms) na końcu `loop`, ponieważ poziomy światła nie muszą być sprawdzane ciągle. Opóźnienie zmniejsza zużycie energii przez urządzenie. + + ```cpp + delay(1000); + ``` + +1. Podłącz ponownie Wio Terminal do komputera i wgraj nowy kod, tak jak wcześniej. + +1. Połącz się z Serial Monitor. Wartości światła będą wyświetlane w terminalu. Zakrywaj i odkrywaj czujnik światła z tyłu Wio Terminal, a wartości będą się zmieniać. + + ```output + > Executing task: platformio device monitor < + + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem101 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Light value: 4 + Light value: 5 + Light value: 4 + Light value: 158 + Light value: 343 + Light value: 348 + Light value: 344 + ``` + +> 💁 Ten kod znajdziesz w folderze [code-sensor/wio-terminal](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/wio-terminal). + +😀 Dodanie czujnika do programu nightlight zakończyło się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić precyzję, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/4-connect-internet/README.md b/translations/pl/1-getting-started/lessons/4-connect-internet/README.md new file mode 100644 index 00000000..1ca0e483 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/4-connect-internet/README.md @@ -0,0 +1,464 @@ + +# Podłącz swoje urządzenie do Internetu + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obrazek, aby zobaczyć większą wersję. + +Ta lekcja była częścią serii [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) organizowanej przez [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Lekcja została podzielona na dwa filmy: godzinny wykład oraz godzinne konsultacje, podczas których szczegółowo omówiono wybrane części lekcji i odpowiadano na pytania. + +[![Lekcja 4: Podłącz swoje urządzenie do Internetu](https://img.youtube.com/vi/O4dd172mZhs/0.jpg)](https://youtu.be/O4dd172mZhs) + +[![Lekcja 4: Podłącz swoje urządzenie do Internetu - Konsultacje](https://img.youtube.com/vi/j-cVCzRDE2Q/0.jpg)](https://youtu.be/j-cVCzRDE2Q) + +> 🎥 Kliknij powyższe obrazy, aby obejrzeć filmy + +## Quiz przed wykładem + +[Quiz przed wykładem](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/7) + +## Wprowadzenie + +Litera **I** w IoT oznacza **Internet** – połączenie z chmurą i usługi, które umożliwiają wiele funkcji urządzeń IoT, od zbierania pomiarów z czujników podłączonych do urządzenia, po wysyłanie wiadomości sterujących do elementów wykonawczych. Urządzenia IoT zazwyczaj łączą się z jedną usługą IoT w chmurze za pomocą standardowego protokołu komunikacyjnego, a ta usługa jest połączona z resztą aplikacji IoT, od usług AI podejmujących inteligentne decyzje na podstawie danych, po aplikacje webowe do sterowania lub raportowania. + +> 🎓 Dane zbierane z czujników i wysyłane do chmury nazywane są telemetrią. + +Urządzenia IoT mogą odbierać wiadomości z chmury. Często są to polecenia – instrukcje wykonania jakiejś akcji, zarówno wewnętrznej (np. restart lub aktualizacja oprogramowania), jak i z użyciem elementu wykonawczego (np. włączenie światła). + +Ta lekcja wprowadza niektóre protokoły komunikacyjne, które urządzenia IoT mogą używać do łączenia się z chmurą, oraz typy danych, które mogą wysyłać lub odbierać. Będziesz także mieć okazję praktycznie z nimi pracować, dodając kontrolę przez Internet do swojej lampki nocnej, przenosząc logikę sterowania diodą LED do kodu 'serwera' uruchamianego lokalnie. + +W tej lekcji omówimy: + +* [Protokoły komunikacyjne](../../../../../1-getting-started/lessons/4-connect-internet) +* [Message Queueing Telemetry Transport (MQTT)](../../../../../1-getting-started/lessons/4-connect-internet) +* [Telemetria](../../../../../1-getting-started/lessons/4-connect-internet) +* [Polecenia](../../../../../1-getting-started/lessons/4-connect-internet) + +## Protokoły komunikacyjne + +Istnieje wiele popularnych protokołów komunikacyjnych używanych przez urządzenia IoT do komunikacji z Internetem. Najpopularniejsze opierają się na modelu publikowania/subskrypcji za pośrednictwem jakiegoś rodzaju brokera. Urządzenia IoT łączą się z brokerem, publikują telemetrię i subskrybują polecenia. Usługi w chmurze również łączą się z brokerem, subskrybują wszystkie wiadomości telemetrii i publikują polecenia skierowane do konkretnych urządzeń lub grup urządzeń. + +![Urządzenia IoT łączą się z brokerem, publikują telemetrię i subskrybują polecenia. Usługi w chmurze łączą się z brokerem, subskrybują wszystkie wiadomości telemetrii i wysyłają polecenia do konkretnych urządzeń.](../../../../../translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.pl.png) + +MQTT jest najpopularniejszym protokołem komunikacyjnym dla urządzeń IoT i jest omówiony w tej lekcji. Inne protokoły to AMQP oraz HTTP/HTTPS. + +## Message Queueing Telemetry Transport (MQTT) + +[MQTT](http://mqtt.org) to lekki, otwarty standard protokołu komunikacyjnego, który umożliwia przesyłanie wiadomości między urządzeniami. Został zaprojektowany w 1999 roku do monitorowania rurociągów naftowych, a 15 lat później udostępniony jako otwarty standard przez IBM. + +MQTT działa na zasadzie jednego brokera i wielu klientów. Wszystkie klienty łączą się z brokerem, a broker przekazuje wiadomości do odpowiednich klientów. Wiadomości są przekazywane za pomocą nazwanych tematów, zamiast być wysyłane bezpośrednio do konkretnego klienta. Klient może publikować wiadomości w temacie, a każdy klient subskrybujący ten temat otrzyma wiadomość. + +![Urządzenie IoT publikujące telemetrię w temacie /telemetry, a usługa w chmurze subskrybująca ten temat](../../../../../translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.pl.png) + +✅ Zrób badania. Jeśli masz wiele urządzeń IoT, jak możesz zapewnić, że Twój broker MQTT poradzi sobie z wszystkimi wiadomościami? + +### Podłącz swoje urządzenie IoT do MQTT + +Pierwszym krokiem w dodaniu kontroli przez Internet do lampki nocnej jest podłączenie jej do brokera MQTT. + +#### Zadanie + +Podłącz swoje urządzenie do brokera MQTT. + +W tej części lekcji podłączysz swoją lampkę nocną IoT do Internetu, aby można było nią sterować zdalnie. Później w tej lekcji Twoje urządzenie IoT wyśle wiadomość telemetrii przez MQTT do publicznego brokera MQTT z poziomem światła, gdzie zostanie ona odebrana przez kod serwera, który napiszesz. Ten kod sprawdzi poziom światła i wyśle wiadomość polecenia z powrotem do urządzenia, informując je, czy włączyć, czy wyłączyć diodę LED. + +Przykładem zastosowania takiego rozwiązania w rzeczywistości mogłoby być zbieranie danych z wielu czujników światła przed podjęciem decyzji o włączeniu świateł w miejscu, gdzie jest ich dużo, na przykład na stadionie. Dzięki temu światła nie zostaną włączone, jeśli tylko jeden czujnik zostanie zasłonięty przez chmury lub ptaka, ale pozostałe czujniki wykryją wystarczającą ilość światła. + +✅ Jakie inne sytuacje wymagałyby oceny danych z wielu czujników przed wysłaniem poleceń? + +Zamiast zajmować się złożonością konfiguracji brokera MQTT w ramach tego zadania, możesz skorzystać z publicznego serwera testowego, który działa na [Eclipse Mosquitto](https://www.mosquitto.org), otwartoźródłowym brokerze MQTT. Ten serwer testowy jest publicznie dostępny pod adresem [test.mosquitto.org](https://test.mosquitto.org) i nie wymaga zakładania konta, co czyni go świetnym narzędziem do testowania klientów i serwerów MQTT. + +> 💁 Ten serwer testowy jest publiczny i nie jest zabezpieczony. Każdy może słuchać tego, co publikujesz, więc nie powinien być używany do przesyłania danych, które muszą pozostać prywatne. + +![Schemat przepływu zadania pokazujący odczyty poziomów światła, ich sprawdzanie i kontrolę diody LED](../../../../../translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.pl.png) + +Wykonaj odpowiedni krok poniżej, aby podłączyć swoje urządzenie do brokera MQTT: + +* [Arduino - Wio Terminal](wio-terminal-mqtt.md) +* [Komputer jednopłytkowy - Raspberry Pi/Wirtualne urządzenie IoT](single-board-computer-mqtt.md) + +### Głębsze spojrzenie na MQTT + +Tematy mogą mieć hierarchię, a klienty mogą subskrybować różne poziomy hierarchii za pomocą symboli wieloznacznych. Na przykład możesz wysyłać wiadomości telemetrii temperatury do tematu `/telemetry/temperature` i wiadomości telemetrii wilgotności do tematu `/telemetry/humidity`, a następnie w swojej aplikacji w chmurze subskrybować temat `/telemetry/*`, aby odbierać zarówno wiadomości telemetrii temperatury, jak i wilgotności. + +Wiadomości mogą być wysyłane z różnym poziomem jakości usług (QoS), który określa gwarancję ich odbioru. + +* Najwyżej raz – wiadomość jest wysyłana tylko raz, a klient i broker nie podejmują dodatkowych kroków w celu potwierdzenia dostarczenia (wyślij i zapomnij). +* Co najmniej raz – wiadomość jest ponawiana przez nadawcę wielokrotnie, aż do otrzymania potwierdzenia (dostarczenie potwierdzone). +* Dokładnie raz – nadawca i odbiorca angażują się w dwupoziomowy proces potwierdzenia, aby zapewnić, że tylko jedna kopia wiadomości zostanie odebrana (dostarczenie gwarantowane). + +✅ Jakie sytuacje mogą wymagać wiadomości z gwarantowanym dostarczeniem zamiast wiadomości typu wyślij i zapomnij? + +Pomimo nazwy Message Queueing (inicjały w MQTT), protokół ten nie obsługuje kolejek wiadomości. Oznacza to, że jeśli klient się rozłączy, a następnie połączy ponownie, nie otrzyma wiadomości wysłanych podczas rozłączenia, z wyjątkiem tych, które już zaczął przetwarzać za pomocą procesu QoS. Wiadomości mogą mieć ustawioną flagę "retained". Jeśli jest ona ustawiona, broker MQTT przechowa ostatnią wiadomość wysłaną w temacie z tą flagą i wyśle ją do każdego klienta, który później zasubskrybuje ten temat. W ten sposób klienty zawsze otrzymają najnowszą wiadomość. + +MQTT obsługuje również funkcję "keep alive", która sprawdza, czy połączenie jest nadal aktywne podczas długich przerw między wiadomościami. + +> 🦟 [Mosquitto od Eclipse Foundation](https://mosquitto.org) oferuje darmowy broker MQTT, który możesz uruchomić samodzielnie, aby eksperymentować z MQTT, oraz publiczny broker MQTT, który możesz używać do testowania swojego kodu, dostępny pod adresem [test.mosquitto.org](https://test.mosquitto.org). + +Połączenia MQTT mogą być publiczne i otwarte lub szyfrowane i zabezpieczone za pomocą nazw użytkowników i haseł, lub certyfikatów. + +> 💁 MQTT komunikuje się za pomocą TCP/IP, tego samego podstawowego protokołu sieciowego co HTTP, ale na innym porcie. Możesz również używać MQTT przez websockets, aby komunikować się z aplikacjami webowymi działającymi w przeglądarce lub w sytuacjach, gdy zapory sieciowe lub inne reguły sieciowe blokują standardowe połączenia MQTT. + +## Telemetria + +Słowo telemetria pochodzi z greckich korzeni oznaczających zdalne mierzenie. Telemetria to proces zbierania danych z czujników i wysyłania ich do chmury. + +> 💁 Jedno z pierwszych urządzeń telemetrycznych zostało wynalezione we Francji w 1874 roku i przesyłało w czasie rzeczywistym dane pogodowe i głębokość śniegu z Mont Blanc do Paryża. Wykorzystywało fizyczne przewody, ponieważ technologie bezprzewodowe nie były wtedy dostępne. + +Przyjrzyjmy się ponownie przykładowi inteligentnego termostatu z Lekcji 1. + +![Termostat podłączony do Internetu, używający wielu czujników w pomieszczeniach](../../../../../translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.pl.png) + +Termostat posiada czujniki temperatury do zbierania telemetrii. Najprawdopodobniej miałby jeden wbudowany czujnik temperatury, a także mógłby łączyć się z wieloma zewnętrznymi czujnikami temperatury za pomocą protokołu bezprzewodowego, takiego jak [Bluetooth Low Energy](https://wikipedia.org/wiki/Bluetooth_Low_Energy) (BLE). + +Przykładem danych telemetrii, które mógłby wysyłać, mogłyby być: + +| Nazwa | Wartość | Opis | +| ---- | ----- | ----------- | +| `thermostat_temperature` | 18°C | Temperatura zmierzona przez wbudowany czujnik temperatury termostatu | +| `livingroom_temperature` | 19°C | Temperatura zmierzona przez zdalny czujnik temperatury nazwany `livingroom`, aby zidentyfikować pomieszczenie, w którym się znajduje | +| `bedroom_temperature` | 21°C | Temperatura zmierzona przez zdalny czujnik temperatury nazwany `bedroom`, aby zidentyfikować pomieszczenie, w którym się znajduje | + +Usługa w chmurze może następnie wykorzystać te dane telemetrii do podejmowania decyzji dotyczących poleceń sterujących ogrzewaniem. + +### Wysyłanie telemetrii z urządzenia IoT + +Kolejnym krokiem w dodaniu kontroli przez Internet do lampki nocnej jest wysyłanie telemetrii poziomu światła do brokera MQTT w temacie telemetrii. + +#### Zadanie - wysyłanie telemetrii z urządzenia IoT + +Wyślij telemetrię poziomu światła do brokera MQTT. + +Dane są wysyłane w formacie JSON – skrót od JavaScript Object Notation, standardu kodowania danych w tekście za pomocą par klucz/wartość. + +✅ Jeśli nie spotkałeś się wcześniej z JSON, możesz dowiedzieć się więcej na [dokumentacji JSON.org](https://www.json.org/). + +Wykonaj odpowiedni krok poniżej, aby wysłać telemetrię ze swojego urządzenia do brokera MQTT: + +* [Arduino - Wio Terminal](wio-terminal-telemetry.md) +* [Komputer jednopłytkowy - Raspberry Pi/Wirtualne urządzenie IoT](single-board-computer-telemetry.md) + +### Odbieranie telemetrii z brokera MQTT + +Nie ma sensu wysyłać telemetrii, jeśli nikt jej nie odbiera. Telemetria poziomu światła potrzebuje czegoś, co będzie jej słuchać i przetwarzać dane. Kod 'serwera' to rodzaj kodu, który wdrożysz w usłudze chmurowej jako część większej aplikacji IoT, ale tutaj uruchomisz ten kod lokalnie na swoim komputerze (lub na Pi, jeśli kodujesz bezpośrednio na nim). Kod serwera składa się z aplikacji w Pythonie, która nasłuchuje wiadomości telemetrii przez MQTT z poziomami światła. Później w tej lekcji sprawisz, że odpowie wiadomością polecenia z instrukcjami, czy włączyć, czy wyłączyć diodę LED. + +✅ Zrób badania: Co dzieje się z wiadomościami MQTT, jeśli nie ma odbiorcy? + +#### Zainstaluj Python i VS Code + +Jeśli nie masz zainstalowanego Pythona i VS Code lokalnie, będziesz musiał je zainstalować, aby napisać kod serwera. Jeśli używasz wirtualnego urządzenia IoT lub pracujesz na Raspberry Pi, możesz pominąć ten krok, ponieważ powinieneś już mieć to zainstalowane i skonfigurowane. + +##### Zadanie - zainstaluj Python i VS Code + +Zainstaluj Python i VS Code. + +1. Zainstaluj Python. Odwiedź [stronę pobierania Pythona](https://www.python.org/downloads/), aby uzyskać instrukcje dotyczące instalacji najnowszej wersji Pythona. + +1. Zainstaluj Visual Studio Code (VS Code). To edytor, którego będziesz używać do pisania kodu w Pythonie dla wirtualnego urządzenia. Odwiedź [dokumentację VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn), aby uzyskać instrukcje dotyczące instalacji VS Code. +💁 Możesz korzystać z dowolnego edytora lub IDE dla Pythona, jeśli masz ulubione narzędzie, ale lekcje będą zawierały instrukcje oparte na używaniu VS Code. +1. Zainstaluj rozszerzenie Pylance dla VS Code. Jest to rozszerzenie dla VS Code, które zapewnia wsparcie dla języka Python. Zapoznaj się z [dokumentacją rozszerzenia Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance), aby dowiedzieć się, jak je zainstalować w VS Code. + +#### Skonfiguruj wirtualne środowisko Pythona + +Jedną z potężnych funkcji Pythona jest możliwość instalowania [pakietów pip](https://pypi.org) - są to pakiety kodu napisane przez innych i opublikowane w Internecie. Możesz zainstalować pakiet pip na swoim komputerze za pomocą jednego polecenia, a następnie używać go w swoim kodzie. W tym przypadku użyjesz pip do zainstalowania pakietu do komunikacji przez MQTT. + +Domyślnie, gdy instalujesz pakiet, jest on dostępny wszędzie na twoim komputerze, co może prowadzić do problemów z wersjami pakietów - na przykład jedna aplikacja może wymagać jednej wersji pakietu, która przestaje działać po zainstalowaniu nowej wersji dla innej aplikacji. Aby obejść ten problem, możesz użyć [wirtualnego środowiska Pythona](https://docs.python.org/3/library/venv.html), które jest zasadniczo kopią Pythona w dedykowanym folderze. W takim środowisku pakiety pip są instalowane tylko w tym folderze. + +##### Zadanie - skonfiguruj wirtualne środowisko Pythona + +Skonfiguruj wirtualne środowisko Pythona i zainstaluj pakiety pip dla MQTT. + +1. W terminalu lub wierszu poleceń uruchom poniższe polecenia w wybranej lokalizacji, aby utworzyć i przejść do nowego katalogu: + + ```sh + mkdir nightlight-server + cd nightlight-server + ``` + +1. Teraz uruchom poniższe polecenie, aby utworzyć wirtualne środowisko w folderze `.venv`: + + ```sh + python3 -m venv .venv + ``` + + > 💁 Musisz wyraźnie wywołać `python3`, aby utworzyć wirtualne środowisko, na wypadek gdybyś miał zainstalowanego Pythona 2 obok Pythona 3 (najnowszej wersji). Jeśli masz zainstalowanego Pythona 2, wywołanie `python` użyje wersji 2 zamiast 3. + +1. Aktywuj wirtualne środowisko: + + * Na Windowsie: + * Jeśli używasz Command Prompt lub Command Prompt przez Windows Terminal, uruchom: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Jeśli używasz PowerShell, uruchom: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + * Na macOS lub Linux uruchom: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Te polecenia powinny być uruchamiane z tej samej lokalizacji, w której uruchomiłeś polecenie tworzące wirtualne środowisko. Nigdy nie musisz wchodzić do folderu `.venv`, zawsze uruchamiaj polecenie aktywacji i wszelkie polecenia instalacji pakietów lub uruchamiania kodu z folderu, w którym utworzyłeś wirtualne środowisko. + +1. Po aktywacji wirtualnego środowiska domyślne polecenie `python` uruchomi wersję Pythona, która została użyta do utworzenia środowiska. Uruchom poniższe polecenie, aby sprawdzić wersję: + + ```sh + python --version + ``` + + Wynik będzie podobny do poniższego: + + ```output + (.venv) ➜ nightlight-server python --version + Python 3.9.1 + ``` + + > 💁 Twoja wersja Pythona może być inna - o ile jest to wersja 3.6 lub nowsza, wszystko jest w porządku. Jeśli nie, usuń ten folder, zainstaluj nowszą wersję Pythona i spróbuj ponownie. + +1. Uruchom poniższe polecenia, aby zainstalować pakiet pip dla [Paho-MQTT](https://pypi.org/project/paho-mqtt/), popularnej biblioteki MQTT. + + ```sh + pip install paho-mqtt + ``` + + Ten pakiet pip zostanie zainstalowany tylko w wirtualnym środowisku i nie będzie dostępny poza nim. + +#### Napisz kod serwera + +Teraz możesz napisać kod serwera w Pythonie. + +##### Zadanie - napisz kod serwera + +Napisz kod serwera. + +1. W terminalu lub wierszu poleceń uruchom poniższe polecenie wewnątrz wirtualnego środowiska, aby utworzyć plik Pythona o nazwie `app.py`: + + * Na Windowsie uruchom: + + ```cmd + type nul > app.py + ``` + + * Na macOS lub Linux uruchom: + + ```cmd + touch app.py + ``` + +1. Otwórz bieżący folder w VS Code: + + ```sh + code . + ``` + +1. Po uruchomieniu VS Code aktywuje ono wirtualne środowisko Pythona. Informacja o tym pojawi się na dolnym pasku stanu: + + ![VS Code pokazujący wybrane wirtualne środowisko](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.pl.png) + +1. Jeśli terminal VS Code jest już uruchomiony podczas startu VS Code, wirtualne środowisko nie zostanie w nim aktywowane. Najprostszym rozwiązaniem jest zamknięcie terminala za pomocą przycisku **Kill the active terminal instance**: + + ![Przycisk VS Code Kill the active terminal instance](../../../../../translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.pl.png) + +1. Uruchom nowy terminal w VS Code, wybierając *Terminal -> New Terminal* lub naciskając `` CTRL+` ``. Nowy terminal załaduje wirtualne środowisko, a polecenie aktywacji pojawi się w terminalu. Nazwa wirtualnego środowiska (`.venv`) będzie również widoczna w prompt: + + ```output + ➜ nightlight-server source .venv/bin/activate + (.venv) ➜ nightlight + ``` + +1. Otwórz plik `app.py` w eksploratorze VS Code i dodaj poniższy kod: + + ```python + import json + import time + + import paho.mqtt.client as mqtt + + id = '' + + client_telemetry_topic = id + '/telemetry' + client_name = id + 'nightlight_server' + + mqtt_client = mqtt.Client(client_name) + mqtt_client.connect('test.mosquitto.org') + + mqtt_client.loop_start() + + def handle_telemetry(client, userdata, message): + payload = json.loads(message.payload.decode()) + print("Message received:", payload) + + mqtt_client.subscribe(client_telemetry_topic) + mqtt_client.on_message = handle_telemetry + + while True: + time.sleep(2) + ``` + + Zamień `` w linii 6 na unikalny identyfikator, którego użyłeś podczas tworzenia kodu urządzenia. + + ⚠️ To **musi** być ten sam identyfikator, którego użyłeś na swoim urządzeniu, w przeciwnym razie kod serwera nie będzie subskrybował ani publikował na właściwym temacie. + + Ten kod tworzy klienta MQTT z unikalną nazwą i łączy się z brokerem *test.mosquitto.org*. Następnie uruchamia pętlę przetwarzania, która działa w tle, nasłuchując wiadomości na dowolnych subskrybowanych tematach. + + Klient subskrybuje wiadomości na temacie telemetrycznym i definiuje funkcję, która jest wywoływana, gdy wiadomość zostanie odebrana. Gdy wiadomość telemetryczna zostanie odebrana, funkcja `handle_telemetry` zostanie wywołana, drukując odebraną wiadomość w konsoli. + + Na koniec nieskończona pętla utrzymuje aplikację w działaniu. Klient MQTT nasłuchuje wiadomości w wątku w tle i działa przez cały czas, gdy główna aplikacja działa. + +1. W terminalu VS Code uruchom poniższe polecenie, aby uruchomić swoją aplikację w Pythonie: + + ```sh + python app.py + ``` + + Aplikacja zacznie nasłuchiwać wiadomości z urządzenia IoT. + +1. Upewnij się, że twoje urządzenie działa i wysyła wiadomości telemetryczne. Dostosuj poziomy światła wykrywane przez swoje fizyczne lub wirtualne urządzenie. Odbierane wiadomości będą drukowane w terminalu. + + ```output + (.venv) ➜ nightlight-server python app.py + Message received: {'light': 0} + Message received: {'light': 400} + ``` + + Plik `app.py` w wirtualnym środowisku nightlight musi być uruchomiony, aby plik `app.py` w wirtualnym środowisku nightlight-server mógł odbierać wysyłane wiadomości. + +> 💁 Ten kod znajdziesz w folderze [code-server/server](../../../../../1-getting-started/lessons/4-connect-internet/code-server/server). + +### Jak często należy wysyłać dane telemetryczne? + +Jednym z ważnych aspektów danych telemetrycznych jest częstotliwość ich pomiaru i wysyłania. Odpowiedź brzmi - to zależy. Jeśli mierzysz często, możesz szybciej reagować na zmiany, ale zużywasz więcej energii, więcej przepustowości, generujesz więcej danych i potrzebujesz więcej zasobów chmurowych do ich przetwarzania. Musisz mierzyć wystarczająco często, ale nie za często. + +Dla termostatu pomiar co kilka minut prawdopodobnie wystarczy, ponieważ temperatura nie zmienia się tak często. Jeśli mierzysz tylko raz dziennie, możesz skończyć z ogrzewaniem domu na nocne temperatury w środku słonecznego dnia, podczas gdy pomiar co sekundę wygeneruje tysiące niepotrzebnie zduplikowanych pomiarów, które obciążą prędkość i przepustowość Internetu użytkownika (problem dla osób z ograniczonymi planami), zużyją więcej energii, co może być problemem dla urządzeń zasilanych bateryjnie, takich jak zdalne czujniki, i zwiększą koszty zasobów chmurowych dostawcy przetwarzających i przechowujących te dane. + +Jeśli monitorujesz dane dotyczące maszyny w fabryce, której awaria mogłaby spowodować katastrofalne szkody i miliony dolarów strat, pomiar kilka razy na sekundę może być konieczny. Lepiej zmarnować przepustowość niż przegapić dane telemetryczne wskazujące, że maszyna wymaga zatrzymania i naprawy, zanim się zepsuje. + +> 💁 W takiej sytuacji możesz rozważyć użycie urządzenia brzegowego do wstępnego przetwarzania danych telemetrycznych, aby zmniejszyć zależność od Internetu. + +### Utrata łączności + +Połączenia internetowe mogą być zawodnymi, a przerwy w dostępie są powszechne. Co powinno zrobić urządzenie IoT w takich okolicznościach - czy powinno utracić dane, czy przechować je do czasu przywrócenia łączności? Odpowiedź brzmi - to zależy. + +Dla termostatu dane mogą zostać utracone, gdy tylko zostanie wykonany nowy pomiar temperatury. System grzewczy nie przejmuje się, że 20 minut temu było 20,5°C, jeśli teraz jest 19°C - to obecna temperatura decyduje, czy ogrzewanie powinno być włączone czy wyłączone. + +Dla maszyn możesz chcieć zachować dane, zwłaszcza jeśli są one używane do analizy trendów. Istnieją modele uczenia maszynowego, które mogą wykrywać anomalie w strumieniach danych, analizując dane z określonego okresu czasu (np. ostatniej godziny) i identyfikując anomalne wartości. Jest to często używane do predykcyjnej konserwacji, szukając wskazówek, że coś może się wkrótce zepsuć, aby można było to naprawić lub wymienić, zanim to nastąpi. Możesz chcieć, aby każde dane telemetryczne maszyny zostały przesłane, aby mogły zostać przetworzone pod kątem wykrywania anomalii, więc gdy urządzenie IoT odzyska połączenie, wyśle wszystkie dane telemetryczne wygenerowane podczas przerwy w dostępie do Internetu. + +Projektanci urządzeń IoT powinni również rozważyć, czy urządzenie IoT może być używane podczas przerwy w dostępie do Internetu lub utraty sygnału spowodowanej lokalizacją. Inteligentny termostat powinien być w stanie podejmować pewne ograniczone decyzje dotyczące sterowania ogrzewaniem, jeśli nie może wysyłać danych telemetrycznych do chmury z powodu przerwy. + +[![Ten ferrari został "zbrickowany", ponieważ ktoś próbował go zaktualizować pod ziemią, gdzie nie ma zasięgu](../../../../../translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.pl.png)](https://twitter.com/internetofshit/status/1315736960082808832) + +Aby MQTT mogło obsłużyć utratę łączności, kod urządzenia i serwera będzie musiał być odpowiedzialny za zapewnienie dostarczenia wiadomości, jeśli jest to konieczne, na przykład poprzez wymaganie, aby wszystkie wysłane wiadomości były potwierdzane dodatkowymi wiadomościami na temacie odpowiedzi, a jeśli nie, były ręcznie kolejkowane do ponownego wysłania później. + +## Polecenia + +Polecenia to wiadomości wysyłane przez chmurę do urządzenia, instruujące je, aby coś zrobiło. Najczęściej polega to na generowaniu jakiegoś rodzaju wyjścia za pomocą aktuatora, ale może to być również instrukcja dla samego urządzenia, na przykład aby się zrestartowało lub zebrało dodatkowe dane telemetryczne i zwróciło je jako odpowiedź na polecenie. + +![Termostat podłączony do Internetu odbierający polecenie włączenia ogrzewania](../../../../../translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.pl.png) + +Termostat mógłby otrzymać polecenie z chmury, aby włączyć ogrzewanie. Na podstawie danych telemetrycznych ze wszystkich czujników, jeśli usługa chmurowa zdecyduje, że ogrzewanie powinno być włączone, wysyła odpowiednie polecenie. + +### Wysyłanie poleceń do brokera MQTT + +Kolejnym krokiem dla naszej nocnej lampki sterowanej przez Internet jest to, aby kod serwera wysyłał polecenie z powrotem do urządzenia IoT, aby sterować światłem na podstawie wykrywanych poziomów światła. + +1. Otwórz kod serwera w VS Code. + +1. Dodaj poniższą linię po deklaracji `client_telemetry_topic`, aby zdefiniować, na którym temacie wysyłać polecenia: + + ```python + server_command_topic = id + '/commands' + ``` + +1. Dodaj poniższy kod na końcu funkcji `handle_telemetry`: + + ```python + command = { 'led_on' : payload['light'] < 300 } + print("Sending message:", command) + + client.publish(server_command_topic, json.dumps(command)) + ``` + + To wysyła wiadomość JSON na temat polecenia z wartością `led_on` ustawioną na true lub false w zależności od tego, czy światło jest mniejsze niż 300, czy nie. Jeśli światło jest mniejsze niż 300, wysyłane jest true, aby nakazać urządzeniu włączenie diody LED. + +1. Uruchom kod jak wcześniej. + +1. Dostosuj poziomy światła wykrywane przez swoje fizyczne lub wirtualne urządzenie. Odbierane wiadomości i wysyłane polecenia będą zapisywane w terminalu: + + ```output + (.venv) ➜ nightlight-server python app.py + Message received: {'light': 0} + Sending message: {'led_on': True} + Message received: {'light': 400} + Sending message: {'led_on': False} + ``` + +> 💁 Telemetria i polecenia są wysyłane na pojedynczym temacie każde. Oznacza to, że telemetria z wielu urządzeń pojawi się na tym samym temacie telemetrycznym, a polecenia do wielu urządzeń pojawią się na tym samym temacie poleceń. Jeśli chciałbyś wysłać polecenie do konkretnego urządzenia, możesz użyć wielu tematów, nazwanych unikalnym identyfikatorem urządzenia, takich jak `/commands/device1`, `/commands/device2`. W ten sposób urządzenie może nasłuchiwać wiadomości przeznaczonych tylko dla niego. + +> 💁 Ten kod znajdziesz w folderze [code-commands/server](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/server). + +### Obsługa poleceń na urządzeniu IoT + +Teraz, gdy polecenia są wysyłane z serwera, możesz dodać kod do urządzenia IoT, aby je obsługiwało i sterowało diodą LED. + +Wykonaj odpowiedni krok poniżej, aby nasłuchiwać poleceń z brokera MQTT: + +* [Arduino - Wio Terminal](wio-terminal-commands.md) +* [Komputer jednopłytkowy - Raspberry Pi/Wirtualne urządzenie IoT](single-board-computer-commands.md) + +Gdy ten kod zostanie napisany i uruchomiony, eksperymentuj z zmianą poziomów światła. Obserwuj dane wyjściowe z serwera i urządzenia oraz obserwuj diodę LED, gdy zmieniasz poziomy światła. + +### Utrata łączności + +Co powinna zrobić usługa chmurowa, jeśli musi wysłać polecenie do urządzenia IoT, które jest offline? Odpowiedź brzmi - to zależy. + +Jeśli najnowsze polecenie zastępuje wcześniejsze, wcześniejsze mogą zostać prawdopodobnie zignorowane. Jeśli usługa chmurowa wysyła polecenie włączenia ogrzewania, a następnie polecenie wyłączenia, polecenie włączenia może zostać zignorowane i nie wysłane ponownie. + +Jeśli polecenia muszą być przetwarzane w kolejności, na przykład przesunięcie ramienia robota w górę, a następnie zamknięcie chwytaka, muszą być wysyłane w odpowiedniej kolejności po przywróceniu łączności. + +✅ Jak kod urządzenia lub serwera mógłby zapewnić, że polecenia są zawsze wysyłane i obsługiwane w odpowiedniej kolejności za pomocą MQTT, jeśli jest to konieczne? + +--- + +## 🚀 Wyzwanie + +Wyzwanie z ostatnich trzech lekcji polegało na wymienieniu jak największej liczby urządzeń IoT, które znajdują się w twoim domu, szkole lub miejscu pracy, oraz określeniu, czy są one oparte na mikrokontrolerach, komputerach jednopłytkowych, czy może na mieszance obu, a także +Dla tych urządzeń zastanów się, jakie wiadomości mogą wysyłać lub odbierać. Jaką telemetrię wysyłają? Jakie wiadomości lub polecenia mogą otrzymywać? Czy uważasz, że są bezpieczne? + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8) + +## Przegląd i samodzielna nauka + +Przeczytaj więcej o MQTT na [stronie Wikipedii o MQTT](https://wikipedia.org/wiki/MQTT). + +Spróbuj uruchomić samodzielnie broker MQTT, korzystając z [Mosquitto](https://www.mosquitto.org), i połącz się z nim za pomocą swojego urządzenia IoT oraz kodu serwera. + +> 💁 Wskazówka - domyślnie Mosquitto nie pozwala na anonimowe połączenia (czyli połączenia bez nazwy użytkownika i hasła) oraz nie pozwala na połączenia spoza komputera, na którym działa. +> Możesz to zmienić za pomocą [pliku konfiguracyjnego `mosquitto.conf`](https://www.mosquitto.org/man/mosquitto-conf-5.html) z następującą zawartością: +> +> ```sh +> listener 1883 0.0.0.0 +> allow_anonymous true +> ``` + +## Zadanie + +[Porównaj i zestaw MQTT z innymi protokołami komunikacyjnymi](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/4-connect-internet/assignment.md b/translations/pl/1-getting-started/lessons/4-connect-internet/assignment.md new file mode 100644 index 00000000..7cb4ffe7 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/4-connect-internet/assignment.md @@ -0,0 +1,26 @@ + +# Porównanie i kontrastowanie MQTT z innymi protokołami komunikacyjnymi + +## Instrukcje + +Ta lekcja dotyczyła MQTT jako protokołu komunikacyjnego. Istnieją również inne, takie jak AMQP i HTTP/HTTPS. + +Zbadaj oba te protokoły i porównaj je z MQTT. Zastanów się nad zużyciem energii, bezpieczeństwem oraz trwałością wiadomości w przypadku utraty połączenia. + +## Kryteria oceny + +| Kryteria | Wzorowe | Zadowalające | Wymaga poprawy | +| -------- | --------- | -------- | ----------------- | +| Porównanie AMQP z MQTT | Potrafi porównać i skontrastować AMQP z MQTT, uwzględniając zużycie energii, bezpieczeństwo i trwałość wiadomości. | Częściowo potrafi porównać i skontrastować AMQP z MQTT, uwzględniając dwa z trzech aspektów: zużycie energii, bezpieczeństwo i trwałość wiadomości. | Częściowo potrafi porównać i skontrastować AMQP z MQTT, uwzględniając jeden z trzech aspektów: zużycie energii, bezpieczeństwo i trwałość wiadomości. | +| Porównanie HTTP/HTTPS z MQTT | Potrafi porównać i skontrastować HTTP/HTTPS z MQTT, uwzględniając zużycie energii, bezpieczeństwo i trwałość wiadomości. | Częściowo potrafi porównać i skontrastować HTTP/HTTPS z MQTT, uwzględniając dwa z trzech aspektów: zużycie energii, bezpieczeństwo i trwałość wiadomości. | Częściowo potrafi porównać i skontrastować HTTP/HTTPS z MQTT, uwzględniając jeden z trzech aspektów: zużycie energii, bezpieczeństwo i trwałość wiadomości. | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego języku źródłowym powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md b/translations/pl/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md new file mode 100644 index 00000000..c270e010 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md @@ -0,0 +1,65 @@ + +# Steruj swoją lampką nocną przez Internet - Wirtualny sprzęt IoT i Raspberry Pi + +W tej części lekcji zasubskrybujesz polecenia wysyłane z brokera MQTT do Twojego Raspberry Pi lub wirtualnego urządzenia IoT. + +## Subskrybuj polecenia + +Kolejnym krokiem jest subskrybowanie poleceń wysyłanych z brokera MQTT i reagowanie na nie. + +### Zadanie + +Zasubskrybuj polecenia. + +1. Otwórz projekt lampki nocnej w VS Code. + +1. Jeśli używasz wirtualnego urządzenia IoT, upewnij się, że terminal działa w środowisku wirtualnym. Jeśli korzystasz z Raspberry Pi, nie będziesz używać środowiska wirtualnego. + +1. Dodaj poniższy kod po definicjach `client_telemetry_topic`: + + ```python + server_command_topic = id + '/commands' + ``` + + `server_command_topic` to temat MQTT, który urządzenie zasubskrybuje, aby odbierać polecenia dotyczące LED. + +1. Dodaj poniższy kod tuż nad główną pętlą, po linii `mqtt_client.loop_start()`: + + ```python + def handle_command(client, userdata, message): + payload = json.loads(message.payload.decode()) + print("Message received:", payload) + + if payload['led_on']: + led.on() + else: + led.off() + + mqtt_client.subscribe(server_command_topic) + mqtt_client.on_message = handle_command + ``` + + Ten kod definiuje funkcję `handle_command`, która odczytuje wiadomość jako dokument JSON i sprawdza wartość właściwości `led_on`. Jeśli jest ustawiona na `True`, dioda LED zostaje włączona, w przeciwnym razie zostaje wyłączona. + + Klient MQTT subskrybuje temat, na który serwer będzie wysyłał wiadomości, i ustawia funkcję `handle_command`, aby była wywoływana, gdy wiadomość zostanie odebrana. + + > 💁 Handler `on_message` jest wywoływany dla wszystkich subskrybowanych tematów. Jeśli później napiszesz kod nasłuchujący wielu tematów, możesz uzyskać temat, na który wiadomość została wysłana, z obiektu `message` przekazanego do funkcji obsługującej. + +1. Uruchom kod w taki sam sposób, jak uruchamiałeś kod z poprzedniej części zadania. Jeśli używasz wirtualnego urządzenia IoT, upewnij się, że aplikacja CounterFit jest uruchomiona, a czujnik światła i dioda LED zostały utworzone na odpowiednich pinach. + +1. Dostosuj poziomy światła wykrywane przez swoje fizyczne lub wirtualne urządzenie. Wiadomości odbierane i polecenia wysyłane będą zapisywane w terminalu. Dioda LED będzie również włączana i wyłączana w zależności od poziomu światła. + +> 💁 Ten kod znajdziesz w folderze [code-commands/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/virtual-device) lub [code-commands/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/pi). + +😀 Udało Ci się zaprogramować swoje urządzenie tak, aby reagowało na polecenia z brokera MQTT. + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md b/translations/pl/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md new file mode 100644 index 00000000..ce41fd22 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md @@ -0,0 +1,91 @@ + +# Steruj swoją lampką nocną przez Internet - Wirtualny sprzęt IoT i Raspberry Pi + +Urządzenie IoT musi zostać zaprogramowane tak, aby komunikowało się z *test.mosquitto.org* za pomocą MQTT, wysyłając dane telemetryczne z odczytem czujnika światła oraz odbierając polecenia do sterowania diodą LED. + +W tej części lekcji połączysz swoje Raspberry Pi lub wirtualne urządzenie IoT z brokerem MQTT. + +## Zainstaluj pakiet klienta MQTT + +Aby komunikować się z brokerem MQTT, musisz zainstalować bibliotekę MQTT jako pakiet pip, albo na swoim Raspberry Pi, albo w środowisku wirtualnym, jeśli korzystasz z wirtualnego urządzenia. + +### Zadanie + +Zainstaluj pakiet pip + +1. Otwórz projekt lampki nocnej w VS Code. + +1. Jeśli korzystasz z wirtualnego urządzenia IoT, upewnij się, że terminal działa w środowisku wirtualnym. Jeśli używasz Raspberry Pi, nie będziesz korzystać ze środowiska wirtualnego. + +1. Uruchom następujące polecenie, aby zainstalować pakiet pip MQTT: + + ```sh + pip3 install paho-mqtt + ``` + +## Programowanie urządzenia + +Urządzenie jest gotowe do zaprogramowania. + +### Zadanie + +Napisz kod urządzenia. + +1. Dodaj następujący import na początku pliku `app.py`: + + ```python + import paho.mqtt.client as mqtt + ``` + + Biblioteka `paho.mqtt.client` pozwala Twojej aplikacji komunikować się za pomocą MQTT. + +1. Dodaj następujący kod po definicjach czujnika światła i diody LED: + + ```python + id = '' + + client_name = id + 'nightlight_client' + ``` + + Zamień `` na unikalny identyfikator, który będzie używany jako nazwa tego klienta urządzenia, a później jako nazwa tematów, które to urządzenie publikuje i subskrybuje. Broker *test.mosquitto.org* jest publiczny i używany przez wiele osób, w tym innych uczniów realizujących to zadanie. Posiadanie unikalnej nazwy klienta MQTT i nazw tematów zapewnia, że Twój kod nie będzie kolidował z kodem innych osób. Będziesz również potrzebować tego identyfikatora podczas tworzenia kodu serwera w dalszej części tego zadania. + + > 💁 Możesz użyć strony internetowej, takiej jak [GUIDGen](https://www.guidgen.com), aby wygenerować unikalny identyfikator. + + `client_name` to unikalna nazwa tego klienta MQTT na brokerze. + +1. Dodaj następujący kod poniżej nowego kodu, aby utworzyć obiekt klienta MQTT i połączyć się z brokerem MQTT: + + ```python + mqtt_client = mqtt.Client(client_name) + mqtt_client.connect('test.mosquitto.org') + + mqtt_client.loop_start() + + print("MQTT connected!") + ``` + + Ten kod tworzy obiekt klienta, łączy się z publicznym brokerem MQTT i uruchamia pętlę przetwarzania, która działa w tle, nasłuchując wiadomości na dowolnych subskrybowanych tematach. + +1. Uruchom kod w taki sam sposób, jak uruchamiałeś kod z poprzedniej części zadania. Jeśli korzystasz z wirtualnego urządzenia IoT, upewnij się, że aplikacja CounterFit jest uruchomiona, a czujnik światła i dioda LED zostały utworzone na odpowiednich pinach. + + ```output + (.venv) ➜ nightlight python app.py + MQTT connected! + Light level: 0 + Light level: 0 + ``` + +> 💁 Ten kod znajdziesz w folderze [code-mqtt/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/virtual-device) lub [code-mqtt/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/pi). + +😀 Udało Ci się pomyślnie połączyć swoje urządzenie z brokerem MQTT. + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md b/translations/pl/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md new file mode 100644 index 00000000..dca5a61c --- /dev/null +++ b/translations/pl/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md @@ -0,0 +1,72 @@ + +# Steruj swoją lampką nocną przez Internet - Wirtualny sprzęt IoT i Raspberry Pi + +W tej części lekcji wyślesz dane telemetryczne dotyczące poziomu światła z Raspberry Pi lub wirtualnego urządzenia IoT do brokera MQTT. + +## Wysyłanie danych telemetrycznych + +Kolejnym krokiem jest utworzenie dokumentu JSON z danymi telemetrycznymi i wysłanie go do brokera MQTT. + +### Zadanie + +Wyślij dane telemetryczne do brokera MQTT. + +1. Otwórz projekt lampki nocnej w VS Code. + +1. Jeśli korzystasz z wirtualnego urządzenia IoT, upewnij się, że terminal działa w środowisku wirtualnym. Jeśli używasz Raspberry Pi, nie będziesz korzystać ze środowiska wirtualnego. + +1. Dodaj następujący import na początku pliku `app.py`: + + ```python + import json + ``` + + Biblioteka `json` jest używana do kodowania danych telemetrycznych jako dokument JSON. + +1. Dodaj poniższy kod po deklaracji `client_name`: + + ```python + client_telemetry_topic = id + '/telemetry' + ``` + + Zmienna `client_telemetry_topic` to temat MQTT, na który urządzenie będzie wysyłać poziomy światła. + +1. Zamień zawartość pętli `while True:` na końcu pliku na poniższą: + + ```python + while True: + light = light_sensor.light + telemetry = json.dumps({'light' : light}) + + print("Sending telemetry ", telemetry) + + mqtt_client.publish(client_telemetry_topic, telemetry) + + time.sleep(5) + ``` + + Ten kod pakuje poziom światła w dokument JSON i publikuje go do brokera MQTT. Następnie wprowadza opóźnienie, aby zmniejszyć częstotliwość wysyłania wiadomości. + +1. Uruchom kod w taki sam sposób, jak uruchamiałeś kod z poprzedniej części zadania. Jeśli korzystasz z wirtualnego urządzenia IoT, upewnij się, że aplikacja CounterFit jest uruchomiona, a czujnik światła i dioda LED zostały utworzone na odpowiednich pinach. + + ```output + (.venv) ➜ nightlight python app.py + MQTT connected! + Sending telemetry {"light": 0} + Sending telemetry {"light": 0} + ``` + +> 💁 Ten kod znajdziesz w folderze [code-telemetry/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/virtual-device) lub [code-telemetry/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/pi). + +😀 Udało Ci się pomyślnie wysłać dane telemetryczne z Twojego urządzenia. + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md b/translations/pl/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md new file mode 100644 index 00000000..a838de2f --- /dev/null +++ b/translations/pl/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md @@ -0,0 +1,91 @@ + +# Steruj swoją lampką nocną przez Internet - Wio Terminal + +W tej części lekcji zasubskrybujesz polecenia wysyłane z brokera MQTT do Twojego Wio Terminal. + +## Subskrybowanie poleceń + +Kolejnym krokiem jest subskrybowanie poleceń wysyłanych z brokera MQTT i odpowiednie reagowanie na nie. + +### Zadanie + +Zasubskrybuj polecenia. + +1. Otwórz projekt lampki nocnej w VS Code. + +1. Dodaj poniższy kod na końcu pliku `config.h`, aby zdefiniować nazwę tematu dla poleceń: + + ```cpp + const string SERVER_COMMAND_TOPIC = ID + "/commands"; + ``` + + `SERVER_COMMAND_TOPIC` to temat, który urządzenie zasubskrybuje, aby odbierać polecenia dotyczące LED. + +1. Dodaj poniższą linię na końcu funkcji `reconnectMQTTClient`, aby zasubskrybować temat poleceń, gdy klient MQTT zostanie ponownie połączony: + + ```cpp + client.subscribe(SERVER_COMMAND_TOPIC.c_str()); + ``` + +1. Dodaj poniższy kod poniżej funkcji `reconnectMQTTClient`. + + ```cpp + void clientCallback(char *topic, uint8_t *payload, unsigned int length) + { + char buff[length + 1]; + for (int i = 0; i < length; i++) + { + buff[i] = (char)payload[i]; + } + buff[length] = '\0'; + + Serial.print("Message received:"); + Serial.println(buff); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, buff); + JsonObject obj = doc.as(); + + bool led_on = obj["led_on"]; + + if (led_on) + digitalWrite(D0, HIGH); + else + digitalWrite(D0, LOW); + } + ``` + + Ta funkcja będzie wywoływana jako callback przez klienta MQTT, gdy otrzyma wiadomość z serwera. + + Wiadomość jest odbierana jako tablica 8-bitowych liczb całkowitych bez znaku, więc musi zostać przekonwertowana na tablicę znaków, aby mogła być traktowana jako tekst. + + Wiadomość zawiera dokument JSON, który jest dekodowany za pomocą biblioteki ArduinoJson. Właściwość `led_on` dokumentu JSON jest odczytywana, a w zależności od jej wartości dioda LED jest włączana lub wyłączana. + +1. Dodaj poniższy kod do funkcji `createMQTTClient`: + + ```cpp + client.setCallback(clientCallback); + ``` + + Ten kod ustawia `clientCallback` jako callback, który będzie wywoływany, gdy klient MQTT otrzyma wiadomość od brokera. + + > 💁 Handler `clientCallback` jest wywoływany dla wszystkich zasubskrybowanych tematów. Jeśli później napiszesz kod nasłuchujący wielu tematów, możesz uzyskać temat, na który została wysłana wiadomość, z parametru `topic` przekazanego do funkcji callback. + +1. Wgraj kod na swój Wio Terminal i użyj Monitora Szeregowego, aby zobaczyć poziomy światła wysyłane do brokera MQTT. + +1. Dostosuj poziomy światła wykrywane przez swoje fizyczne lub wirtualne urządzenie. Zobaczysz wiadomości odbierane i polecenia wysyłane w terminalu. Zobaczysz również, jak dioda LED włącza się i wyłącza w zależności od poziomu światła. + +> 💁 Ten kod znajdziesz w folderze [code-commands/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal). + +😀 Udało Ci się zaprogramować swoje urządzenie tak, aby reagowało na polecenia z brokera MQTT. + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md b/translations/pl/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md new file mode 100644 index 00000000..b1d04ea8 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md @@ -0,0 +1,249 @@ + +# Steruj swoją lampką nocną przez Internet - Wio Terminal + +Urządzenie IoT musi zostać zaprogramowane, aby komunikować się z *test.mosquitto.org* za pomocą MQTT w celu wysyłania wartości telemetrycznych z odczytem czujnika światła oraz odbierania poleceń do sterowania diodą LED. + +W tej części lekcji połączysz swój Wio Terminal z brokerem MQTT. + +## Zainstaluj biblioteki WiFi i MQTT dla Arduino + +Aby komunikować się z brokerem MQTT, musisz zainstalować kilka bibliotek Arduino, które umożliwią korzystanie z modułu WiFi w Wio Terminal oraz komunikację z MQTT. Podczas tworzenia aplikacji dla urządzeń Arduino możesz korzystać z szerokiej gamy bibliotek zawierających otwarty kod źródłowy, które implementują różnorodne funkcje. Seeed publikuje biblioteki dla Wio Terminal, które umożliwiają komunikację przez WiFi. Inni deweloperzy opublikowali biblioteki do komunikacji z brokerami MQTT, z których będziesz korzystać na swoim urządzeniu. + +Te biblioteki są dostarczane jako kod źródłowy, który można automatycznie zaimportować do PlatformIO i skompilować dla Twojego urządzenia. Dzięki temu biblioteki Arduino będą działać na każdym urządzeniu obsługującym framework Arduino, pod warunkiem, że urządzenie posiada odpowiedni sprzęt wymagany przez daną bibliotekę. Niektóre biblioteki, takie jak biblioteki WiFi od Seeed, są specyficzne dla określonego sprzętu. + +Biblioteki można instalować globalnie i kompilować w razie potrzeby lub w ramach konkretnego projektu. W tym zadaniu biblioteki zostaną zainstalowane w projekcie. + +✅ Więcej informacji o zarządzaniu bibliotekami oraz o tym, jak je znaleźć i zainstalować, znajdziesz w [dokumentacji bibliotek PlatformIO](https://docs.platformio.org/en/latest/librarymanager/index.html). + +### Zadanie - zainstaluj biblioteki WiFi i MQTT dla Arduino + +Zainstaluj biblioteki Arduino. + +1. Otwórz projekt lampki nocnej w VS Code. + +1. Dodaj następujący kod na końcu pliku `platformio.ini`: + + ```ini + lib_deps = + seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 + seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 + seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 + ``` + + To importuje biblioteki WiFi od Seeed. Składnia `@ ` odnosi się do konkretnej wersji biblioteki. + + > 💁 Możesz usunąć `@ `, aby zawsze używać najnowszej wersji bibliotek, ale nie ma gwarancji, że nowsze wersje będą działać z poniższym kodem. Kod tutaj został przetestowany z tą wersją bibliotek. + + To wszystko, co musisz zrobić, aby dodać biblioteki. Przy następnym budowaniu projektu PlatformIO pobierze kod źródłowy tych bibliotek i skompiluje go w Twoim projekcie. + +1. Dodaj następujący kod do `lib_deps`: + + ```ini + knolleary/PubSubClient @ 2.8 + ``` + + To importuje [PubSubClient](https://github.com/knolleary/pubsubclient), klienta MQTT dla Arduino. + +## Połącz się z WiFi + +Teraz możesz połączyć Wio Terminal z WiFi. + +### Zadanie - połącz się z WiFi + +Połącz Wio Terminal z WiFi. + +1. Utwórz nowy plik w folderze `src` o nazwie `config.h`. Możesz to zrobić, wybierając folder `src` lub plik `main.cpp` w środku, a następnie klikając przycisk **New file** w eksploratorze. Ten przycisk pojawia się tylko wtedy, gdy kursor znajduje się nad eksploratorem. + + ![Przycisk nowego pliku](../../../../../translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.pl.png) + +1. Dodaj następujący kod do tego pliku, aby zdefiniować stałe dla danych logowania do WiFi: + + ```cpp + #pragma once + + #include + + using namespace std; + + // WiFi credentials + const char *SSID = ""; + const char *PASSWORD = ""; + ``` + + Zamień `` na SSID swojej sieci WiFi. Zamień `` na hasło do swojej sieci WiFi. + +1. Otwórz plik `main.cpp`. + +1. Dodaj następujące dyrektywy `#include` na początku pliku: + + ```cpp + #include + #include + #include + + #include "config.h" + ``` + + To dodaje pliki nagłówkowe dla wcześniej dodanych bibliotek oraz plik nagłówkowy konfiguracji. Te pliki nagłówkowe są potrzebne, aby PlatformIO mogło zaimportować kod z bibliotek. Bez ich wyraźnego uwzględnienia niektóre fragmenty kodu nie zostaną skompilowane, co spowoduje błędy kompilatora. + +1. Dodaj następujący kod powyżej funkcji `setup`: + + ```cpp + void connectWiFi() + { + while (WiFi.status() != WL_CONNECTED) + { + Serial.println("Connecting to WiFi.."); + WiFi.begin(SSID, PASSWORD); + delay(500); + } + + Serial.println("Connected!"); + } + ``` + + Ten kod działa w pętli, dopóki urządzenie nie połączy się z WiFi, i próbuje połączyć się, używając SSID i hasła z pliku nagłówkowego konfiguracji. + +1. Dodaj wywołanie tej funkcji na końcu funkcji `setup`, po skonfigurowaniu pinów. + + ```cpp + connectWiFi(); + ``` + +1. Wgraj ten kod na swoje urządzenie, aby sprawdzić, czy połączenie WiFi działa. Powinieneś zobaczyć to w monitorze szeregowym. + + ```output + > Executing task: platformio device monitor < + + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1101 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Connecting to WiFi.. + Connected! + ``` + +## Połącz się z MQTT + +Gdy Wio Terminal jest połączony z WiFi, może połączyć się z brokerem MQTT. + +### Zadanie - połącz się z MQTT + +Połącz się z brokerem MQTT. + +1. Dodaj następujący kod na końcu pliku `config.h`, aby zdefiniować szczegóły połączenia z brokerem MQTT: + + ```cpp + // MQTT settings + const string ID = ""; + + const string BROKER = "test.mosquitto.org"; + const string CLIENT_NAME = ID + "nightlight_client"; + ``` + + Zamień `` na unikalny identyfikator, który będzie używany jako nazwa tego klienta urządzenia, a później jako nazwa tematów, które to urządzenie publikuje i subskrybuje. Broker *test.mosquitto.org* jest publiczny i używany przez wiele osób, w tym innych studentów realizujących to zadanie. Posiadanie unikalnej nazwy klienta MQTT i tematów zapewnia, że Twój kod nie będzie kolidował z kodem innych osób. Będziesz również potrzebować tego identyfikatora podczas tworzenia kodu serwera w dalszej części zadania. + + > 💁 Możesz użyć strony internetowej, takiej jak [GUIDGen](https://www.guidgen.com), aby wygenerować unikalny identyfikator. + + `BROKER` to URL brokera MQTT. + + `CLIENT_NAME` to unikalna nazwa tego klienta MQTT na brokerze. + +1. Otwórz plik `main.cpp` i dodaj następujący kod poniżej funkcji `connectWiFi` i powyżej funkcji `setup`: + + ```cpp + WiFiClient wioClient; + PubSubClient client(wioClient); + ``` + + Ten kod tworzy klienta WiFi, korzystając z bibliotek WiFi Wio Terminal, i używa go do utworzenia klienta MQTT. + +1. Poniżej tego kodu dodaj następujący fragment: + + ```cpp + void reconnectMQTTClient() + { + while (!client.connected()) + { + Serial.print("Attempting MQTT connection..."); + + if (client.connect(CLIENT_NAME.c_str())) + { + Serial.println("connected"); + } + else + { + Serial.print("Retying in 5 seconds - failed, rc="); + Serial.println(client.state()); + + delay(5000); + } + } + } + ``` + + Ta funkcja testuje połączenie z brokerem MQTT i ponownie łączy się, jeśli połączenie zostało zerwane. Działa w pętli, dopóki nie zostanie nawiązane połączenie, i próbuje połączyć się, używając unikalnej nazwy klienta zdefiniowanej w pliku nagłówkowym konfiguracji. + + Jeśli połączenie się nie powiedzie, próbuje ponownie po 5 sekundach. + +1. Dodaj następujący kod poniżej funkcji `reconnectMQTTClient`: + + ```cpp + void createMQTTClient() + { + client.setServer(BROKER.c_str(), 1883); + reconnectMQTTClient(); + } + ``` + + Ten kod ustawia brokera MQTT dla klienta oraz konfiguruje wywołanie zwrotne, gdy wiadomość zostanie odebrana. Następnie próbuje połączyć się z brokerem. + +1. Wywołaj funkcję `createMQTTClient` w funkcji `setup` po nawiązaniu połączenia z WiFi. + +1. Zastąp całą funkcję `loop` następującym kodem: + + ```cpp + void loop() + { + reconnectMQTTClient(); + client.loop(); + + delay(2000); + } + ``` + + Ten kod zaczyna od ponownego połączenia z brokerem MQTT. Połączenia te mogą być łatwo zrywane, więc warto regularnie sprawdzać i ponownie łączyć się w razie potrzeby. Następnie wywołuje metodę `loop` na kliencie MQTT, aby przetworzyć wszelkie wiadomości przychodzące na subskrybowany temat. Ta aplikacja jest jednowątkowa, więc wiadomości nie mogą być odbierane w tle, dlatego należy przeznaczyć czas w głównym wątku na przetwarzanie wiadomości oczekujących na połączeniu sieciowym. + + Na koniec opóźnienie 2 sekund zapewnia, że poziomy światła nie są wysyłane zbyt często, co zmniejsza zużycie energii przez urządzenie. + +1. Wgraj kod na swój Wio Terminal i użyj monitora szeregowego, aby zobaczyć, jak urządzenie łączy się z WiFi i MQTT. + + ```output + > Executing task: platformio device monitor < + + source /Users/jimbennett/GitHub/IoT-For-Beginners/1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal/nightlight/.venv/bin/activate + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Connecting to WiFi.. + Connected! + Attempting MQTT connection...connected + ``` + +> 💁 Ten kod znajdziesz w folderze [code-mqtt/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal). + +😀 Udało Ci się pomyślnie połączyć swoje urządzenie z brokerem MQTT. + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md b/translations/pl/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md new file mode 100644 index 00000000..5efac619 --- /dev/null +++ b/translations/pl/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md @@ -0,0 +1,91 @@ + +# Steruj swoją lampką nocną przez Internet - Wio Terminal + +W tej części lekcji wyślesz dane telemetryczne dotyczące poziomu światła z Wio Terminal do brokera MQTT. + +## Zainstaluj biblioteki JSON dla Arduino + +Popularnym sposobem przesyłania wiadomości przez MQTT jest użycie JSON. Istnieje biblioteka Arduino dla JSON, która ułatwia odczytywanie i zapisywanie dokumentów JSON. + +### Zadanie + +Zainstaluj bibliotekę Arduino JSON. + +1. Otwórz projekt lampki nocnej w VS Code. + +1. Dodaj następującą linię do listy `lib_deps` w pliku `platformio.ini`: + + ```ini + bblanchon/ArduinoJson @ 6.17.3 + ``` + + To importuje [ArduinoJson](https://arduinojson.org), bibliotekę JSON dla Arduino. + +## Publikowanie danych telemetrycznych + +Kolejnym krokiem jest utworzenie dokumentu JSON z danymi telemetrycznymi i wysłanie go do brokera MQTT. + +### Zadanie - publikowanie danych telemetrycznych + +Publikuj dane telemetryczne do brokera MQTT. + +1. Dodaj poniższy kod na końcu pliku `config.h`, aby zdefiniować nazwę tematu telemetrycznego dla brokera MQTT: + + ```cpp + const string CLIENT_TELEMETRY_TOPIC = ID + "/telemetry"; + ``` + + `CLIENT_TELEMETRY_TOPIC` to temat, na który urządzenie będzie publikować poziomy światła. + +1. Otwórz plik `main.cpp`. + +1. Dodaj następującą dyrektywę `#include` na początku pliku: + + ```cpp + #include + ``` + +1. Dodaj poniższy kod wewnątrz funkcji `loop`, tuż przed `delay`: + + ```cpp + int light = analogRead(WIO_LIGHT); + + DynamicJsonDocument doc(1024); + doc["light"] = light; + + string telemetry; + serializeJson(doc, telemetry); + + Serial.print("Sending telemetry "); + Serial.println(telemetry.c_str()); + + client.publish(CLIENT_TELEMETRY_TOPIC.c_str(), telemetry.c_str()); + ``` + + Ten kod odczytuje poziom światła i tworzy dokument JSON za pomocą ArduinoJson, który zawiera ten poziom. Następnie jest on serializowany do ciągu znaków i publikowany na temacie telemetrycznym MQTT przez klienta MQTT. + +1. Wgraj kod na swój Wio Terminal i użyj Monitora Szeregowego, aby zobaczyć poziomy światła wysyłane do brokera MQTT. + + ```output + Connecting to WiFi.. + Connected! + Attempting MQTT connection...connected + Sending telemetry {"light":652} + Sending telemetry {"light":612} + Sending telemetry {"light":583} + ``` + +> 💁 Ten kod znajdziesz w folderze [code-telemetry/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal). + +😀 Udało Ci się pomyślnie wysłać dane telemetryczne z urządzenia. + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/README.md b/translations/pl/2-farm/README.md new file mode 100644 index 00000000..4e1689c1 --- /dev/null +++ b/translations/pl/2-farm/README.md @@ -0,0 +1,32 @@ + +# Rolnictwo z IoT + +Wraz ze wzrostem populacji rośnie zapotrzebowanie na rolnictwo. Ilość dostępnej ziemi pozostaje niezmienna, ale klimat się zmienia - stawiając przed rolnikami jeszcze większe wyzwania, szczególnie przed 2 miliardami [rolników utrzymujących się z własnych upraw](https://wikipedia.org/wiki/Subsistence_agriculture), którzy polegają na tym, co wyhodują, aby móc jeść i wyżywić swoje rodziny. IoT może pomóc rolnikom podejmować mądrzejsze decyzje dotyczące tego, co uprawiać i kiedy zbierać plony, zwiększać wydajność, zmniejszać ilość pracy ręcznej oraz wykrywać i zwalczać szkodniki. + +W tych 6 lekcjach dowiesz się, jak zastosować Internet Rzeczy, aby usprawnić i zautomatyzować rolnictwo. + +> 💁 Te lekcje będą korzystać z zasobów chmurowych. Jeśli nie ukończysz wszystkich lekcji w tym projekcie, upewnij się, że [posprzątasz swój projekt](../clean-up.md). + +## Tematy + +1. [Przewidywanie wzrostu roślin za pomocą IoT](lessons/1-predict-plant-growth/README.md) +1. [Wykrywanie wilgotności gleby](lessons/2-detect-soil-moisture/README.md) +1. [Automatyczne podlewanie roślin](lessons/3-automated-plant-watering/README.md) +1. [Przeniesienie rośliny do chmury](lessons/4-migrate-your-plant-to-the-cloud/README.md) +1. [Przeniesienie logiki aplikacji do chmury](lessons/5-migrate-application-to-the-cloud/README.md) +1. [Zabezpieczenie rośliny](lessons/6-keep-your-plant-secure/README.md) + +## Podziękowania + +Wszystkie lekcje zostały napisane z ♥️ przez [Jim Bennett](https://GitHub.com/JimBobBennett) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić precyzję, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/1-predict-plant-growth/README.md b/translations/pl/2-farm/lessons/1-predict-plant-growth/README.md new file mode 100644 index 00000000..d2dc25eb --- /dev/null +++ b/translations/pl/2-farm/lessons/1-predict-plant-growth/README.md @@ -0,0 +1,282 @@ + +## Przewiduj wzrost roślin za pomocą IoT + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obrazek, aby zobaczyć większą wersję. + +## Quiz przed wykładem + +[Quiz przed wykładem](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/9) + +## Wprowadzenie + +Rośliny potrzebują określonych rzeczy, aby rosnąć - wody, dwutlenku węgla, składników odżywczych, światła i ciepła. W tej lekcji dowiesz się, jak obliczać tempo wzrostu i dojrzewania roślin, mierząc temperaturę powietrza. + +W tej lekcji omówimy: + +* [Cyfrowe rolnictwo](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Dlaczego temperatura jest ważna w rolnictwie?](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Pomiar temperatury otoczenia](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Dni stopni wzrostu (GDD)](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Obliczanie GDD za pomocą danych z czujnika temperatury](../../../../../2-farm/lessons/1-predict-plant-growth) + +## Cyfrowe rolnictwo + +Cyfrowe rolnictwo zmienia sposób, w jaki uprawiamy ziemię, wykorzystując narzędzia do zbierania, przechowywania i analizowania danych z gospodarstw rolnych. Obecnie znajdujemy się w okresie określanym przez Światowe Forum Ekonomiczne jako "Czwarta Rewolucja Przemysłowa", a rozwój cyfrowego rolnictwa został nazwany "Czwartą Rewolucją Rolniczą" lub "Rolnictwem 4.0". + +> 🎓 Termin "Cyfrowe rolnictwo" obejmuje również cały "łańcuch wartości rolnictwa", czyli całą drogę od farmy do stołu. Obejmuje to śledzenie jakości produktów spożywczych podczas ich transportu i przetwarzania, systemy magazynowe i e-commerce, a nawet aplikacje do wynajmu traktorów! + +Te zmiany pozwalają rolnikom zwiększać plony, używać mniej nawozów i pestycydów oraz efektywniej gospodarować wodą. Chociaż głównie stosowane w bogatszych krajach, czujniki i inne urządzenia stopniowo tanieją, co czyni je bardziej dostępnymi w krajach rozwijających się. + +Niektóre techniki umożliwione przez cyfrowe rolnictwo to: + +* Pomiar temperatury - pomiar temperatury pozwala rolnikom przewidywać wzrost i dojrzewanie roślin. +* Automatyczne nawadnianie - pomiar wilgotności gleby i włączanie systemów nawadniających, gdy gleba jest zbyt sucha, zamiast nawadniania według harmonogramu. Nawadnianie według harmonogramu może prowadzić do niedostatecznego nawodnienia roślin podczas gorących, suchych okresów lub nadmiernego nawodnienia podczas deszczu. Nawadniając tylko wtedy, gdy gleba tego potrzebuje, rolnicy mogą zoptymalizować zużycie wody. +* Kontrola szkodników - rolnicy mogą używać kamer na zautomatyzowanych robotach lub dronach do sprawdzania obecności szkodników, a następnie stosować pestycydy tylko tam, gdzie są potrzebne, zmniejszając ilość używanych pestycydów i ograniczając ich spływ do lokalnych źródeł wody. + +✅ Zrób badania. Jakie inne techniki są stosowane w celu poprawy plonów rolnych? + +> 🎓 Termin "Rolnictwo precyzyjne" odnosi się do obserwowania, mierzenia i reagowania na potrzeby upraw na poziomie pola, a nawet jego części. Obejmuje to pomiar poziomu wody, składników odżywczych i szkodników oraz precyzyjne reagowanie, na przykład nawadnianie tylko małej części pola. + +## Dlaczego temperatura jest ważna w rolnictwie? + +Ucząc się o roślinach, większość uczniów dowiaduje się o konieczności wody, światła, dwutlenku węgla i składników odżywczych. Rośliny potrzebują również ciepła, aby rosnąć - dlatego rośliny kwitną wiosną, gdy temperatura wzrasta, dlaczego przebiśniegi lub żonkile mogą zakwitnąć wcześnie podczas krótkiego okresu ciepła, i dlaczego szklarnie są tak skuteczne w wspomaganiu wzrostu roślin. + +> 🎓 Szklarnie i cieplarnie pełnią podobną funkcję, ale z istotną różnicą. Cieplarnie są ogrzewane sztucznie, co pozwala rolnikom dokładniej kontrolować temperaturę, podczas gdy szklarnie polegają na słońcu jako źródle ciepła, a kontrola ogranicza się zwykle do okien lub innych otworów umożliwiających wypuszczenie ciepła. + +Rośliny mają temperaturę bazową lub minimalną, optymalną temperaturę oraz maksymalną temperaturę, wszystko oparte na średnich dziennych temperaturach. + +* Temperatura bazowa - to minimalna średnia dzienna temperatura potrzebna do wzrostu rośliny. +* Temperatura optymalna - to najlepsza średnia dzienna temperatura, aby uzyskać największy wzrost. +* Temperatura maksymalna - to maksymalna temperatura, którą roślina może wytrzymać. Powyżej tej temperatury roślina przestaje rosnąć, próbując oszczędzać wodę i przetrwać. + +> 💁 Są to średnie temperatury, uśrednione z temperatur dziennych i nocnych. Rośliny potrzebują również różnych temperatur w dzień i w nocy, aby efektywniej przeprowadzać fotosyntezę i oszczędzać energię w nocy. + +Każdy gatunek rośliny ma różne wartości dla temperatury bazowej, optymalnej i maksymalnej. Dlatego niektóre rośliny dobrze rosną w gorących krajach, a inne w chłodniejszych. + +✅ Zrób badania. Dla dowolnych roślin w Twoim ogrodzie, szkole lub lokalnym parku sprawdź, czy możesz znaleźć ich temperaturę bazową. + +![Wykres pokazujący wzrost tempa wzrostu wraz ze wzrostem temperatury, a następnie spadek, gdy temperatura jest zbyt wysoka](../../../../../translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.pl.png) + +Powyższy wykres pokazuje przykładowy wykres tempa wzrostu w zależności od temperatury. Do temperatury bazowej nie ma wzrostu. Tempo wzrostu wzrasta do temperatury optymalnej, a następnie spada po osiągnięciu szczytu. + +Kształt tego wykresu różni się w zależności od gatunku rośliny. Niektóre mają ostrzejsze spadki powyżej temperatury optymalnej, inne mają wolniejsze wzrosty od temperatury bazowej do optymalnej. + +> 💁 Aby rolnik mógł uzyskać najlepszy wzrost, musi znać trzy wartości temperatury i rozumieć kształt wykresów dla roślin, które uprawia. + +Jeśli rolnik ma kontrolę nad temperaturą, na przykład w komercyjnej cieplarni, może zoptymalizować warunki dla swoich roślin. Komercyjna cieplarnia uprawiająca pomidory, na przykład, będzie miała temperaturę ustawioną na około 25°C w ciągu dnia i 20°C w nocy, aby uzyskać najszybszy wzrost. + +> 🍅 Łącząc te temperatury ze sztucznym oświetleniem, nawozami i kontrolowanym poziomem dwutlenku węgla, komercyjni hodowcy mogą uprawiać i zbierać plony przez cały rok. + +## Pomiar temperatury otoczenia + +Czujniki temperatury mogą być używane z urządzeniami IoT do pomiaru temperatury otoczenia. + +### Zadanie - pomiar temperatury + +Przejdź przez odpowiedni przewodnik, aby monitorować temperatury za pomocą swojego urządzenia IoT: + +* [Arduino - Wio Terminal](wio-terminal-temp.md) +* [Komputer jednopłytkowy - Raspberry Pi](pi-temp.md) +* [Komputer jednopłytkowy - Wirtualne urządzenie](virtual-device-temp.md) + +## Dni stopni wzrostu + +Dni stopni wzrostu (znane również jako jednostki stopni wzrostu) to sposób mierzenia wzrostu roślin na podstawie temperatury. Zakładając, że roślina ma wystarczającą ilość wody, składników odżywczych i dwutlenku węgla, temperatura determinuje tempo wzrostu. + +Dni stopni wzrostu, czyli GDD, są obliczane na każdy dzień jako średnia temperatura w stopniach Celsjusza dla danego dnia powyżej temperatury bazowej rośliny. Każda roślina potrzebuje określonej liczby GDD, aby rosnąć, kwitnąć lub dojrzewać i wydawać plony. Im więcej GDD każdego dnia, tym szybciej roślina rośnie. + +> 🇺🇸 Dla Amerykanów dni stopni wzrostu można również obliczać w stopniach Fahrenheita. 5 GDD (dni stopni wzrostu w Celsjuszu) odpowiada 9 GDD (dni stopni wzrostu w Fahrenheicie). + +Pełna formuła dla GDD jest nieco skomplikowana, ale często używa się uproszczonego równania jako dobrego przybliżenia: + +![GDD = T max + T min podzielone przez 2, wszystko minus T base](../../../../../translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.pl.png) + +* **GDD** - to liczba dni stopni wzrostu +* **T max** - to dzienna maksymalna temperatura w stopniach Celsjusza +* **T min** - to dzienna minimalna temperatura w stopniach Celsjusza +* **T base** - to temperatura bazowa rośliny w stopniach Celsjusza + +> 💁 Istnieją wariacje uwzględniające T max powyżej 30°C lub T min poniżej T base, ale na razie je pominiemy. + +### Przykład - Kukurydza 🌽 + +W zależności od odmiany, kukurydza (lub kukurydza zwyczajna) potrzebuje od 800 do 2700 GDD, aby dojrzeć, z temperaturą bazową wynoszącą 10°C. + +Pierwszego dnia powyżej temperatury bazowej zmierzono następujące temperatury: + +| Pomiar | Temp °C | +| :--------- | :-----: | +| Maksymalna | 16 | +| Minimalna | 12 | + +Podstawiając te liczby do naszego równania: + +* T max = 16 +* T min = 12 +* T base = 10 + +Daje to obliczenie: + +![GDD = 16 + 12 podzielone przez 2, wszystko minus 10, daje wynik 4](../../../../../translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.pl.png) + +Kukurydza otrzymała 4 GDD tego dnia. Zakładając odmianę kukurydzy, która potrzebuje 800 GDD do dojrzewania, będzie potrzebować jeszcze 796 GDD, aby osiągnąć dojrzałość. + +✅ Zrób badania. Dla dowolnych roślin w Twoim ogrodzie, szkole lub lokalnym parku sprawdź, czy możesz znaleźć liczbę GDD potrzebną do osiągnięcia dojrzałości lub wydania plonów. + +## Obliczanie GDD za pomocą danych z czujnika temperatury + +Rośliny nie rosną według ustalonych dat - na przykład nie można posadzić nasiona i wiedzieć, że roślina wyda owoce dokładnie 100 dni później. Zamiast tego rolnik może mieć ogólne pojęcie, ile czasu zajmuje wzrost rośliny, a następnie codziennie sprawdzać, kiedy plony są gotowe. + +To ma ogromny wpływ na pracę na dużej farmie i ryzyko, że rolnik przegapi plony, które są gotowe niespodziewanie wcześnie. Mierząc temperatury, rolnik może obliczyć GDD, które roślina otrzymała, pozwalając mu sprawdzać tylko w pobliżu oczekiwanej dojrzałości. + +Zbierając dane o temperaturze za pomocą urządzenia IoT, rolnik może automatycznie otrzymywać powiadomienia, gdy rośliny są bliskie dojrzałości. Typowa architektura dla tego procesu polega na tym, że urządzenia IoT mierzą temperaturę, a następnie przesyłają te dane telemetryczne przez Internet, używając czegoś takiego jak MQTT. Kod serwera nasłuchuje tych danych i zapisuje je gdzieś, na przykład w bazie danych. Dzięki temu dane mogą być później analizowane, na przykład w ramach nocnego zadania obliczającego GDD dla danego dnia, sumującego GDD dla każdej uprawy i wysyłającego alert, jeśli roślina jest bliska dojrzałości. + +![Dane telemetryczne są przesyłane na serwer, a następnie zapisywane w bazie danych](../../../../../translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.pl.png) + +Kod serwera może również wzbogacać dane, dodając dodatkowe informacje. Na przykład urządzenie IoT może przesyłać identyfikator wskazujący, które urządzenie to jest, a kod serwera może używać tego identyfikatora do wyszukiwania lokalizacji urządzenia i upraw, które monitoruje. Może również dodawać podstawowe dane, takie jak aktualny czas, ponieważ niektóre urządzenia IoT nie mają niezbędnego sprzętu do śledzenia dokładnego czasu lub wymagają dodatkowego kodu do odczytu aktualnego czasu przez Internet. + +✅ Dlaczego uważasz, że różne pola mogą mieć różne temperatury? + +### Zadanie - przesyłanie informacji o temperaturze + +Przejdź przez odpowiedni przewodnik, aby przesyłać dane o temperaturze za pomocą MQTT z urządzenia IoT, aby mogły być później analizowane: + +* [Arduino - Wio Terminal](wio-terminal-temp-publish.md) +* [Komputer jednopłytkowy - Raspberry Pi/Wirtualne urządzenie IoT](single-board-computer-temp-publish.md) + +### Zadanie - przechwytywanie i przechowywanie informacji o temperaturze + +Gdy urządzenie IoT przesyła dane telemetryczne, kod serwera może zostać napisany, aby subskrybować te dane i je przechowywać. Zamiast zapisywać je w bazie danych, kod serwera zapisze je w pliku CSV (Comma Separated Values). Pliki CSV przechowują dane jako wiersze wartości w formacie tekstowym, z każdą wartością oddzieloną przecinkiem i każdym rekordem w nowej linii. Są wygodnym, czytelnym dla człowieka i dobrze obsługiwanym sposobem zapisywania danych jako pliku. + +Plik CSV będzie miał dwie kolumny - *data* i *temperatura*. Kolumna *data* będzie ustawiona jako aktualna data i czas, kiedy wiadomość została odebrana przez serwer, a *temperatura* pochodzi z wiadomości telemetrycznej. + +1. Powtórz kroki z lekcji 4, aby stworzyć kod serwera do subskrybowania danych telemetrycznych. Nie musisz dodawać kodu do przesyłania poleceń. + + Kroki te obejmują: + + * Konfigurację i aktywację wirtualnego środowiska Python + + * Instalację pakietu paho-mqtt za pomocą pip + + * Napisanie kodu do nasłuchiwania wiadomości MQTT publikowanych na temacie telemetrycznym + + > ⚠️ Możesz odwołać się do [instrukcji w lekcji 4 dotyczących tworzenia aplikacji Python do odbierania danych telemetrycznych, jeśli to konieczne](../../../1-getting-started/lessons/4-connect-internet/README.md#receive-telemetry-from-the-mqtt-broker). + + Nazwij folder dla tego projektu `temperature-sensor-server`. + +1. Upewnij się, że `client_name` odzwierciedla ten projekt: + + ```cpp + client_name = id + 'temperature_sensor_server' + ``` + +1. Dodaj następujące importy na początku pliku, poniżej istniejących importów: + + ```python + from os import path + import csv + from datetime import datetime + ``` + + To importuje bibliotekę do odczytu plików, bibliotekę do interakcji z plikami CSV oraz bibliotekę pomagającą w obsłudze dat i czasu. + +1. Dodaj następujący kod przed funkcją `handle_telemetry`: + + ```python + temperature_file_name = 'temperature.csv' + fieldnames = ['date', 'temperature'] + + if not path.exists(temperature_file_name): + with open(temperature_file_name, mode='w') as csv_file: + writer = csv.DictWriter(csv_file, fieldnames=fieldnames) + writer.writeheader() + ``` + + Ten kod deklaruje kilka stałych dla nazwy pliku, do którego będą zapisywane dane, oraz nazw nagłówków kolumn dla pliku CSV. Pierwszy wiersz pliku CSV tradycyjnie zawiera nagłówki kolumn oddzielone przecinkami. + + Kod następnie sprawdza, czy plik CSV już istnieje. Jeśli nie istnieje, jest tworzony z nagłówkami kolumn w pierwszym wierszu. + +1. Dodaj następujący kod na końcu funkcji `handle_telemetry`: + + ```python + with open(temperature_file_name, mode='a') as temperature_file: + temperature_writer = csv.DictWriter(temperature_file, fieldnames=fieldnames) + temperature_writer.writerow({'date' : datetime.now().astimezone().replace(microsecond=0).isoformat(), 'temperature' : payload['temperature']}) + ``` +Ten kod otwiera plik CSV, a następnie dodaje nowy wiersz na końcu. Wiersz zawiera aktualną datę i godzinę sformatowaną w sposób czytelny dla człowieka, a także temperaturę otrzymaną z urządzenia IoT. Dane są przechowywane w [formacie ISO 8601](https://wikipedia.org/wiki/ISO_8601) z uwzględnieniem strefy czasowej, ale bez mikrosekund. + +1. Uruchom ten kod w taki sam sposób jak wcześniej, upewniając się, że Twoje urządzenie IoT przesyła dane. W tym samym folderze zostanie utworzony plik CSV o nazwie `temperature.csv`. Jeśli go otworzysz, zobaczysz daty/godziny oraz pomiary temperatury: + + ```output + date,temperature + 2021-04-19T17:21:36-07:00,25 + 2021-04-19T17:31:36-07:00,24 + 2021-04-19T17:41:36-07:00,25 + ``` + +1. Uruchom ten kod przez jakiś czas, aby zebrać dane. Idealnie byłoby uruchomić go przez cały dzień, aby zgromadzić wystarczającą ilość danych do obliczeń GDD. + + +> 💁 Jeśli korzystasz z wirtualnego urządzenia IoT, zaznacz pole wyboru "random" i ustaw zakres, aby uniknąć otrzymywania tej samej temperatury za każdym razem, gdy wartość temperatury jest zwracana. + ![Zaznacz pole wyboru "random" i ustaw zakres](../../../../../translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.pl.png) + + > 💁 Jeśli chcesz uruchomić to przez cały dzień, musisz upewnić się, że komputer, na którym działa Twój kod serwera, nie przejdzie w tryb uśpienia. Możesz to zrobić, zmieniając ustawienia zasilania lub uruchamiając coś takiego jak [ten skrypt Python, który utrzymuje system aktywny](https://github.com/jaqsparow/keep-system-active). + +> 💁 Ten kod znajdziesz w folderze [code-server/temperature-sensor-server](../../../../../2-farm/lessons/1-predict-plant-growth/code-server/temperature-sensor-server). + +### Zadanie - obliczanie GDD przy użyciu zapisanych danych + +Gdy serwer zbierze dane o temperaturze, można obliczyć GDD dla rośliny. + +Kroki, aby zrobić to ręcznie: + +1. Znajdź temperaturę bazową dla rośliny. Na przykład dla truskawek temperatura bazowa wynosi 10°C. + +1. W pliku `temperature.csv` znajdź najwyższą i najniższą temperaturę dnia. + +1. Użyj wcześniej podanego wzoru na obliczenie GDD. + +Na przykład, jeśli najwyższa temperatura dnia wynosi 25°C, a najniższa 12°C: + +![GDD = 25 + 12 podzielone przez 2, następnie odejmij 10 od wyniku, co daje 8,5](../../../../../translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.pl.png) + +* 25 + 12 = 37 +* 37 / 2 = 18,5 +* 18,5 - 10 = 8,5 + +Zatem truskawki otrzymały **8,5** GDD. Truskawki potrzebują około 250 GDD, aby wydać owoce, więc jeszcze trochę czasu zostało. + +--- + +## 🚀 Wyzwanie + +Rośliny potrzebują więcej niż tylko ciepła, aby rosnąć. Jakie inne czynniki są potrzebne? + +Dla tych czynników znajdź, czy istnieją czujniki, które mogą je mierzyć. A co z siłownikami do kontrolowania tych poziomów? Jak połączyłbyś jedno lub więcej urządzeń IoT, aby zoptymalizować wzrost roślin? + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/10) + +## Przegląd i samodzielna nauka + +* Przeczytaj więcej o cyfrowym rolnictwie na [stronie Wikipedii o cyfrowym rolnictwie](https://wikipedia.org/wiki/Digital_agriculture). Przeczytaj także więcej o precyzyjnym rolnictwie na [stronie Wikipedii o precyzyjnym rolnictwie](https://wikipedia.org/wiki/Precision_agriculture). +* Pełne obliczenie stopniodni wzrostu (GDD) jest bardziej skomplikowane niż uproszczony wzór podany tutaj. Przeczytaj więcej o bardziej skomplikowanym równaniu i jak radzić sobie z temperaturami poniżej wartości bazowej na [stronie Wikipedii o stopniodniach wzrostu](https://wikipedia.org/wiki/Growing_degree-day). +* Żywność może być w przyszłości deficytowa, jeśli nadal będziemy stosować te same metody uprawy. Dowiedz się więcej o zaawansowanych technikach rolniczych w tym [filmie o zaawansowanych farmach przyszłości na YouTube](https://www.youtube.com/watch?v=KIEOuKD9KX8). + +## Zadanie + +[Wizualizacja danych GDD za pomocą Jupyter Notebook](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/1-predict-plant-growth/assignment.md b/translations/pl/2-farm/lessons/1-predict-plant-growth/assignment.md new file mode 100644 index 00000000..5534c668 --- /dev/null +++ b/translations/pl/2-farm/lessons/1-predict-plant-growth/assignment.md @@ -0,0 +1,55 @@ + +# Wizualizacja danych GDD za pomocą Jupyter Notebook + +## Instrukcje + +W tej lekcji zebrałeś dane GDD za pomocą czujnika IoT. Aby uzyskać dobre dane GDD, musisz zbierać dane przez kilka dni. Aby pomóc w wizualizacji danych dotyczących temperatury i obliczaniu GDD, możesz użyć narzędzi takich jak [Jupyter Notebooks](https://jupyter.org) do analizy danych. + +Zacznij od zbierania danych przez kilka dni. Musisz upewnić się, że kod serwera działa przez cały czas, gdy Twoje urządzenie IoT jest aktywne, albo dostosowując ustawienia zarządzania energią, albo uruchamiając coś w rodzaju [tego skryptu Python, który utrzymuje system aktywny](https://github.com/jaqsparow/keep-system-active). + +Gdy już masz dane dotyczące temperatury, możesz użyć Jupyter Notebook z tego repozytorium, aby je zwizualizować i obliczyć GDD. Jupyter Notebooks łączą kod i instrukcje w blokach zwanych *komórkami*, często z kodem w Pythonie. Możesz przeczytać instrukcje, a następnie uruchamiać każdy blok kodu, blok po bloku. Możesz także edytować kod. W tym notatniku, na przykład, możesz zmienić temperaturę bazową używaną do obliczania GDD dla Twojej rośliny. + +1. Utwórz folder o nazwie `gdd-calculation`. + +1. Pobierz plik [gdd.ipynb](../../../../../2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb) i skopiuj go do folderu `gdd-calculation`. + +1. Skopiuj plik `temperature.csv` utworzony przez serwer MQTT. + +1. Utwórz nowe wirtualne środowisko Pythona w folderze `gdd-calculation`. + +1. Zainstaluj kilka pakietów pip dla Jupyter Notebooks oraz biblioteki potrzebne do zarządzania i wizualizacji danych: + + ```sh + pip install --upgrade pip + pip install pandas + pip install matplotlib + pip install jupyter + ``` + +1. Uruchom notatnik w Jupyter: + + ```sh + jupyter notebook gdd.ipynb + ``` + + Jupyter uruchomi się i otworzy notatnik w Twojej przeglądarce. Pracuj zgodnie z instrukcjami w notatniku, aby zwizualizować zmierzone temperatury i obliczyć dni stopni wzrostu (GDD). + + ![Notatnik Jupyter](../../../../../translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.pl.png) + +## Kryteria oceny + +| Kryterium | Wzorowe | Zadowalające | Wymaga poprawy | +| --------- | -------- | ------------ | -------------- | +| Zbieranie danych | Zebrano dane z co najmniej 2 pełnych dni | Zebrano dane z co najmniej 1 pełnego dnia | Zebrano część danych | +| Obliczanie GDD | Pomyślnie uruchomiono notatnik i obliczono GDD | Pomyślnie uruchomiono notatnik | Nie udało się uruchomić notatnika | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/1-predict-plant-growth/pi-temp.md b/translations/pl/2-farm/lessons/1-predict-plant-growth/pi-temp.md new file mode 100644 index 00000000..f75d0959 --- /dev/null +++ b/translations/pl/2-farm/lessons/1-predict-plant-growth/pi-temp.md @@ -0,0 +1,123 @@ + +# Mierzenie temperatury - Raspberry Pi + +W tej części lekcji dodasz czujnik temperatury do swojego Raspberry Pi. + +## Sprzęt + +Czujnik, którego użyjesz, to [czujnik wilgotności i temperatury DHT11](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html), łączący dwa czujniki w jednym urządzeniu. Jest to dość popularne rozwiązanie, a wiele dostępnych na rynku czujników łączy pomiar temperatury, wilgotności, a czasem także ciśnienia atmosferycznego. Komponent czujnika temperatury to termistor o ujemnym współczynniku temperaturowym (NTC), czyli termistor, którego opór maleje wraz ze wzrostem temperatury. + +Jest to czujnik cyfrowy, co oznacza, że posiada wbudowany przetwornik ADC, który generuje sygnał cyfrowy zawierający dane o temperaturze i wilgotności, które mikroprocesor może odczytać. + +### Podłączanie czujnika temperatury + +Czujnik temperatury Grove można podłączyć do Raspberry Pi. + +#### Zadanie + +Podłącz czujnik temperatury. + +![Czujnik temperatury Grove](../../../../../translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.pl.png) + +1. Włóż jeden koniec kabla Grove do gniazda na czujniku wilgotności i temperatury. Kabel wejdzie tylko w jednym kierunku. + +1. Przy wyłączonym zasilaniu Raspberry Pi, podłącz drugi koniec kabla Grove do gniazda cyfrowego oznaczonego jako **D5** na nakładce Grove Base zamontowanej na Raspberry Pi. To gniazdo znajduje się jako drugie od lewej w rzędzie gniazd obok pinów GPIO. + +![Czujnik temperatury Grove podłączony do gniazda A0](../../../../../translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.pl.png) + +## Programowanie czujnika temperatury + +Teraz można zaprogramować urządzenie do korzystania z podłączonego czujnika temperatury. + +### Zadanie + +Zaprogramuj urządzenie. + +1. Włącz Raspberry Pi i poczekaj, aż się uruchomi. + +1. Uruchom VS Code, bezpośrednio na Raspberry Pi lub łącząc się za pomocą rozszerzenia Remote SSH. + + > ⚠️ Możesz odwołać się do [instrukcji konfiguracji i uruchamiania VS Code w lekcji 1, jeśli to konieczne](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. W terminalu utwórz nowy folder w katalogu domowym użytkownika `pi` o nazwie `temperature-sensor`. W tym folderze utwórz plik o nazwie `app.py`: + + ```sh + mkdir temperature-sensor + cd temperature-sensor + touch app.py + ``` + +1. Otwórz ten folder w VS Code. + +1. Aby użyć czujnika temperatury i wilgotności, należy zainstalować dodatkowy pakiet Pip. W terminalu w VS Code uruchom następujące polecenie, aby zainstalować ten pakiet na Raspberry Pi: + + ```sh + pip3 install seeed-python-dht + ``` + +1. Dodaj poniższy kod do pliku `app.py`, aby zaimportować wymagane biblioteki: + + ```python + import time + from seeed_dht import DHT + ``` + + Instrukcja `from seeed_dht import DHT` importuje klasę `DHT`, która umożliwia interakcję z czujnikiem temperatury Grove z modułu `seeed_dht`. + +1. Dodaj poniższy kod po wcześniejszym, aby utworzyć instancję klasy zarządzającej czujnikiem temperatury: + + ```python + sensor = DHT("11", 5) + ``` + + To deklaruje instancję klasy `DHT`, która zarządza **D**igitalnym czujnikiem **H**umidity i **T**emperature. Pierwszy parametr informuje kod, że używany jest czujnik *DHT11* - biblioteka, której używasz, obsługuje inne warianty tego czujnika. Drugi parametr informuje kod, że czujnik jest podłączony do portu cyfrowego `D5` na nakładce Grove Base. + + > ✅ Pamiętaj, że wszystkie gniazda mają unikalne numery pinów. Piny 0, 2, 4 i 6 to piny analogowe, a piny 5, 16, 18, 22, 24 i 26 to piny cyfrowe. + +1. Dodaj nieskończoną pętlę po wcześniejszym kodzie, aby odczytywać wartość z czujnika temperatury i wyświetlać ją w konsoli: + + ```python + while True: + _, temp = sensor.read() + print(f'Temperature {temp}°C') + ``` + + Wywołanie `sensor.read()` zwraca krotkę zawierającą wilgotność i temperaturę. Potrzebujesz tylko wartości temperatury, więc wilgotność jest pomijana. Wartość temperatury jest następnie wyświetlana w konsoli. + +1. Dodaj krótką pauzę trwającą dziesięć sekund na końcu pętli, ponieważ poziomy temperatury nie muszą być sprawdzane ciągle. Pauza zmniejsza zużycie energii przez urządzenie. + + ```python + time.sleep(10) + ``` + +1. W terminalu VS Code uruchom następujące polecenie, aby uruchomić swoją aplikację w Pythonie: + + ```sh + python3 app.py + ``` + + Powinieneś zobaczyć wartości temperatury wyświetlane w konsoli. Użyj czegoś, aby ogrzać czujnik, na przykład przyciśnij go kciukiem lub użyj wentylatora, aby zobaczyć zmieniające się wartości: + + ```output + pi@raspberrypi:~/temperature-sensor $ python3 app.py + Temperature 26°C + Temperature 26°C + Temperature 28°C + Temperature 30°C + Temperature 32°C + ``` + +> 💁 Kod ten znajdziesz w folderze [code-temperature/pi](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/pi). + +😀 Twój program do obsługi czujnika temperatury zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md b/translations/pl/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md new file mode 100644 index 00000000..de09002e --- /dev/null +++ b/translations/pl/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md @@ -0,0 +1,69 @@ + +# Publikowanie temperatury - Wirtualny sprzęt IoT i Raspberry Pi + +W tej części lekcji opublikujesz wartości temperatury wykryte przez Raspberry Pi lub Wirtualne Urządzenie IoT za pomocą MQTT, aby mogły być później wykorzystane do obliczenia GDD. + +## Publikowanie temperatury + +Po odczytaniu temperatury można ją opublikować za pomocą MQTT do kodu 'serwera', który odczyta wartości i zapisze je, aby mogły być użyte do obliczeń GDD. + +### Zadanie - publikowanie temperatury + +Zaprogramuj urządzenie, aby publikowało dane o temperaturze. + +1. Otwórz projekt aplikacji `temperature-sensor`, jeśli nie jest jeszcze otwarty. + +1. Powtórz kroki, które wykonałeś w lekcji 4, aby połączyć się z MQTT i wysłać dane telemetryczne. Będziesz korzystać z tego samego publicznego brokera Mosquitto. + + Kroki te obejmują: + + - Dodanie pakietu pip dla MQTT + - Dodanie kodu do połączenia z brokerem MQTT + - Dodanie kodu do publikowania danych telemetrycznych + + > ⚠️ Zapoznaj się z [instrukcjami dotyczącymi łączenia się z MQTT](../../../1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md) oraz [instrukcjami dotyczącymi wysyłania danych telemetrycznych](../../../1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md) z lekcji 4, jeśli zajdzie taka potrzeba. + +1. Upewnij się, że `client_name` odzwierciedla nazwę tego projektu: + + ```python + client_name = id + 'temperature_sensor_client' + ``` + +1. W przypadku danych telemetrycznych, zamiast wysyłać wartość światła, wyślij wartość temperatury odczytaną z czujnika DHT w właściwości dokumentu JSON o nazwie `temperature`: + + ```python + _, temp = sensor.read() + telemetry = json.dumps({'temperature' : temp}) + ``` + +1. Wartość temperatury nie musi być odczytywana zbyt często - nie zmienia się znacząco w krótkim czasie, więc ustaw `time.sleep` na 10 minut: + + ```cpp + time.sleep(10 * 60); + ``` + + > 💁 Funkcja `sleep` przyjmuje czas w sekundach, więc aby ułatwić odczyt, wartość jest przekazywana jako wynik obliczenia. 60 sekund w minucie, więc 10 x (60 sekund w minucie) daje 10-minutowe opóźnienie. + +1. Uruchom kod w taki sam sposób, jak uruchamiałeś kod z poprzedniej części zadania. Jeśli korzystasz z wirtualnego urządzenia IoT, upewnij się, że aplikacja CounterFit jest uruchomiona, a czujniki wilgotności i temperatury zostały utworzone na odpowiednich pinach. + + ```output + pi@raspberrypi:~/temperature-sensor $ python3 app.py + MQTT connected! + Sending telemetry {"temperature": 25} + Sending telemetry {"temperature": 25} + ``` + +> 💁 Kod ten znajdziesz w folderze [code-publish-temperature/virtual-device](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/virtual-device) lub [code-publish-temperature/pi](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/pi). + +😀 Pomyślnie opublikowałeś temperaturę jako dane telemetryczne z Twojego urządzenia. + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md b/translations/pl/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md new file mode 100644 index 00000000..a87ad7df --- /dev/null +++ b/translations/pl/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md @@ -0,0 +1,152 @@ + +# Mierz temperaturę - Wirtualny sprzęt IoT + +W tej części lekcji dodasz czujnik temperatury do swojego wirtualnego urządzenia IoT. + +## Wirtualny sprzęt + +Wirtualne urządzenie IoT będzie korzystać z symulowanego czujnika Grove Digital Humidity and Temperature. Dzięki temu laboratorium pozostaje takie samo, jak przy użyciu Raspberry Pi z fizycznym czujnikiem Grove DHT11. + +Czujnik łączy **czujnik temperatury** z **czujnikiem wilgotności**, ale w tym laboratorium interesuje Cię tylko komponent czujnika temperatury. W fizycznym urządzeniu IoT czujnik temperatury byłby [termistorem](https://wikipedia.org/wiki/Thermistor), który mierzy temperaturę, wykrywając zmiany oporu w zależności od zmian temperatury. Czujniki temperatury są zazwyczaj cyfrowe i wewnętrznie przekształcają zmierzony opór na temperaturę w stopniach Celsjusza (lub Kelwina, lub Fahrenheita). + +### Dodaj czujniki do CounterFit + +Aby użyć wirtualnego czujnika wilgotności i temperatury, musisz dodać oba czujniki do aplikacji CounterFit. + +#### Zadanie - dodaj czujniki do CounterFit + +Dodaj czujniki wilgotności i temperatury do aplikacji CounterFit. + +1. Utwórz nową aplikację Python na swoim komputerze w folderze `temperature-sensor` z jednym plikiem o nazwie `app.py` oraz wirtualnym środowiskiem Python, a następnie dodaj pakiety pip CounterFit. + + > ⚠️ Możesz odwołać się do [instrukcji dotyczących tworzenia i konfiguracji projektu Python dla CounterFit w lekcji 1, jeśli zajdzie taka potrzeba](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Zainstaluj dodatkowy pakiet Pip, aby zainstalować CounterFit shim dla czujnika DHT11. Upewnij się, że instalujesz go z terminala z aktywowanym wirtualnym środowiskiem. + + ```sh + pip install counterfit-shims-seeed-python-dht + ``` + +1. Upewnij się, że aplikacja webowa CounterFit działa. + +1. Utwórz czujnik wilgotności: + + 1. W polu *Create sensor* w panelu *Sensors* rozwiń pole *Sensor type* i wybierz *Humidity*. + + 1. Pozostaw *Units* ustawione na *Percentage*. + + 1. Upewnij się, że *Pin* jest ustawiony na *5*. + + 1. Wybierz przycisk **Add**, aby utworzyć czujnik wilgotności na pinie 5. + + ![Ustawienia czujnika wilgotności](../../../../../translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.pl.png) + + Czujnik wilgotności zostanie utworzony i pojawi się na liście czujników. + + ![Utworzony czujnik wilgotności](../../../../../translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.pl.png) + +1. Utwórz czujnik temperatury: + + 1. W polu *Create sensor* w panelu *Sensors* rozwiń pole *Sensor type* i wybierz *Temperature*. + + 1. Pozostaw *Units* ustawione na *Celsius*. + + 1. Upewnij się, że *Pin* jest ustawiony na *6*. + + 1. Wybierz przycisk **Add**, aby utworzyć czujnik temperatury na pinie 6. + + ![Ustawienia czujnika temperatury](../../../../../translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.pl.png) + + Czujnik temperatury zostanie utworzony i pojawi się na liście czujników. + + ![Utworzony czujnik temperatury](../../../../../translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.pl.png) + +## Programowanie aplikacji czujnika temperatury + +Teraz możesz zaprogramować aplikację czujnika temperatury, korzystając z czujników CounterFit. + +### Zadanie - zaprogramuj aplikację czujnika temperatury + +Zaprogramuj aplikację czujnika temperatury. + +1. Upewnij się, że aplikacja `temperature-sensor` jest otwarta w VS Code. + +1. Otwórz plik `app.py`. + +1. Dodaj następujący kod na początku pliku `app.py`, aby połączyć aplikację z CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Dodaj następujący kod do pliku `app.py`, aby zaimportować wymagane biblioteki: + + ```python + import time + from counterfit_shims_seeed_python_dht import DHT + ``` + + Instrukcja `from seeed_dht import DHT` importuje klasę `DHT`, która umożliwia interakcję z wirtualnym czujnikiem Grove temperatury za pomocą shima z modułu `counterfit_shims_seeed_python_dht`. + +1. Dodaj następujący kod po powyższym, aby utworzyć instancję klasy zarządzającej wirtualnym czujnikiem wilgotności i temperatury: + + ```python + sensor = DHT("11", 5) + ``` + + To deklaruje instancję klasy `DHT`, która zarządza wirtualnym **D**igital **H**umidity and **T**emperature sensor. Pierwszy parametr informuje kod, że używany czujnik to wirtualny *DHT11*. Drugi parametr informuje kod, że czujnik jest podłączony do portu `5`. + + > 💁 CounterFit symuluje ten połączony czujnik wilgotności i temperatury, łącząc się z dwoma czujnikami: czujnikiem wilgotności na pinie podanym podczas tworzenia klasy `DHT` oraz czujnikiem temperatury działającym na następnym pinie. Jeśli czujnik wilgotności jest na pinie 5, shim oczekuje, że czujnik temperatury będzie na pinie 6. + +1. Dodaj nieskończoną pętlę po powyższym kodzie, aby odczytywać wartość czujnika temperatury i wyświetlać ją w konsoli: + + ```python + while True: + _, temp = sensor.read() + print(f'Temperature {temp}°C') + ``` + + Wywołanie `sensor.read()` zwraca krotkę zawierającą wilgotność i temperaturę. Potrzebujesz tylko wartości temperatury, więc wilgotność jest ignorowana. Wartość temperatury jest następnie wyświetlana w konsoli. + +1. Dodaj krótką pauzę trwającą dziesięć sekund na końcu pętli, ponieważ poziomy temperatury nie muszą być sprawdzane ciągle. Pauza zmniejsza zużycie energii przez urządzenie. + + ```python + time.sleep(10) + ``` + +1. Z terminala VS Code z aktywowanym wirtualnym środowiskiem uruchom następujące polecenie, aby uruchomić swoją aplikację Python: + + ```sh + python app.py + ``` + +1. W aplikacji CounterFit zmień wartość czujnika temperatury, która będzie odczytywana przez aplikację. Możesz to zrobić na dwa sposoby: + + * Wpisz liczbę w polu *Value* dla czujnika temperatury, a następnie wybierz przycisk **Set**. Liczba, którą wpiszesz, będzie wartością zwracaną przez czujnik. + + * Zaznacz pole *Random*, wpisz wartości *Min* i *Max*, a następnie wybierz przycisk **Set**. Za każdym razem, gdy czujnik odczytuje wartość, będzie to losowa liczba pomiędzy *Min* a *Max*. + + Powinieneś zobaczyć wartości, które ustawiłeś, pojawiające się w konsoli. Zmień *Value* lub ustawienia *Random*, aby zobaczyć zmieniające się wartości. + + ```output + (.venv) ➜ temperature-sensor python app.py + Temperature 28.25°C + Temperature 30.71°C + Temperature 25.17°C + ``` + +> 💁 Ten kod znajdziesz w folderze [code-temperature/virtual-device](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/virtual-device). + +😀 Twoja aplikacja czujnika temperatury zakończyła się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md b/translations/pl/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md new file mode 100644 index 00000000..d003dfe0 --- /dev/null +++ b/translations/pl/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md @@ -0,0 +1,80 @@ + +# Publikowanie temperatury - Wio Terminal + +W tej części lekcji opublikujesz wartości temperatury wykryte przez Wio Terminal za pomocą MQTT, aby mogły być później wykorzystane do obliczenia GDD. + +## Publikowanie temperatury + +Po odczytaniu temperatury można ją opublikować za pomocą MQTT do kodu 'serwera', który odczyta wartości i zapisze je, aby mogły być użyte do obliczeń GDD. Mikrokontrolery nie odczytują czasu z Internetu ani nie śledzą czasu za pomocą zegara czasu rzeczywistego w standardzie, urządzenie musi być zaprogramowane, aby to robić, zakładając, że posiada odpowiedni sprzęt. + +Aby uprościć sprawy w tej lekcji, czas nie będzie wysyłany razem z danymi z czujnika, zamiast tego może zostać dodany przez kod serwera później, gdy odbierze wiadomości. + +### Zadanie + +Zaprogramuj urządzenie, aby publikowało dane o temperaturze. + +1. Otwórz projekt `temperature-sensor` dla Wio Terminal. + +1. Powtórz kroki, które wykonałeś w lekcji 4, aby połączyć się z MQTT i wysłać dane telemetryczne. Będziesz używać tego samego publicznego brokera Mosquitto. + + Kroki te obejmują: + + - Dodanie bibliotek Seeed WiFi i MQTT do pliku `.ini` + - Dodanie pliku konfiguracyjnego i kodu do połączenia z WiFi + - Dodanie kodu do połączenia z brokerem MQTT + - Dodanie kodu do publikowania danych telemetrycznych + + > ⚠️ Zapoznaj się z [instrukcjami dotyczącymi połączenia z MQTT](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md) oraz [instrukcjami dotyczącymi wysyłania danych telemetrycznych](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md) z lekcji 4, jeśli zajdzie taka potrzeba. + +1. Upewnij się, że `CLIENT_NAME` w pliku nagłówkowym `config.h` odzwierciedla ten projekt: + + ```cpp + const string CLIENT_NAME = ID + "temperature_sensor_client"; + ``` + +1. W przypadku danych telemetrycznych, zamiast wysyłać wartość światła, wyślij wartość temperatury odczytaną z czujnika DHT jako właściwość w dokumencie JSON o nazwie `temperature`, zmieniając funkcję `loop` w `main.cpp`: + + ```cpp + float temp_hum_val[2] = {0}; + dht.readTempAndHumidity(temp_hum_val); + + DynamicJsonDocument doc(1024); + doc["temperature"] = temp_hum_val[1]; + ``` + +1. Wartość temperatury nie musi być odczytywana zbyt często - nie zmienia się znacząco w krótkim czasie, więc ustaw `delay` w funkcji `loop` na 10 minut: + + ```cpp + delay(10 * 60 * 1000); + ``` + + > 💁 Funkcja `delay` przyjmuje czas w milisekundach, więc dla ułatwienia odczytu wartość jest przekazywana jako wynik obliczenia. 1,000ms w sekundzie, 60s w minucie, więc 10 x (60s w minucie) x (1000ms w sekundzie) daje opóźnienie 10 minut. + +1. Wgraj to na swój Wio Terminal i użyj monitora szeregowego, aby zobaczyć, jak temperatura jest wysyłana do brokera MQTT. + + ```output + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Connecting to WiFi.. + Connected! + Attempting MQTT connection...connected + Sending telemetry {"temperature":25} + Sending telemetry {"temperature":25} + ``` + +> 💁 Ten kod znajdziesz w folderze [code-publish-temperature/wio-terminal](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal). + +😀 Udało Ci się pomyślnie opublikować temperaturę jako dane telemetryczne z Twojego urządzenia. + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md b/translations/pl/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md new file mode 100644 index 00000000..849ed5e4 --- /dev/null +++ b/translations/pl/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md @@ -0,0 +1,141 @@ + +# Mierzenie temperatury - Wio Terminal + +W tej części lekcji dodasz czujnik temperatury do swojego Wio Terminal i odczytasz z niego wartości temperatury. + +## Sprzęt + +Wio Terminal potrzebuje czujnika temperatury. + +Czujnik, którego użyjesz, to [czujnik wilgotności i temperatury DHT11](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html), który łączy dwa czujniki w jednym urządzeniu. Jest to dość popularne rozwiązanie, a wiele dostępnych na rynku czujników łączy pomiar temperatury, wilgotności, a czasem także ciśnienia atmosferycznego. Komponent czujnika temperatury to termistor o ujemnym współczynniku temperaturowym (NTC), czyli termistor, którego opór maleje wraz ze wzrostem temperatury. + +Jest to czujnik cyfrowy, więc posiada wbudowany przetwornik ADC, który generuje sygnał cyfrowy zawierający dane o temperaturze i wilgotności, które mikroprocesor może odczytać. + +### Podłącz czujnik temperatury + +Czujnik temperatury Grove można podłączyć do cyfrowego portu Wio Terminal. + +#### Zadanie - podłącz czujnik temperatury + +Podłącz czujnik temperatury. + +![Czujnik temperatury Grove](../../../../../translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.pl.png) + +1. Włóż jeden koniec kabla Grove do gniazda w czujniku wilgotności i temperatury. Kabel pasuje tylko w jednym kierunku. + +1. Gdy Wio Terminal jest odłączony od komputera lub innego źródła zasilania, podłącz drugi koniec kabla Grove do prawego gniazda Grove w Wio Terminal, patrząc na ekran. Jest to gniazdo najbardziej oddalone od przycisku zasilania. + +![Czujnik temperatury Grove podłączony do prawego gniazda](../../../../../translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.pl.png) + +## Programowanie czujnika temperatury + +Teraz możesz zaprogramować Wio Terminal, aby korzystał z podłączonego czujnika temperatury. + +### Zadanie - zaprogramuj czujnik temperatury + +Zaprogramuj urządzenie. + +1. Utwórz nowy projekt Wio Terminal w PlatformIO. Nazwij ten projekt `temperature-sensor`. Dodaj kod w funkcji `setup`, aby skonfigurować port szeregowy. + + > ⚠️ Możesz odwołać się do [instrukcji tworzenia projektu PlatformIO w projekcie 1, lekcji 1, jeśli potrzebujesz](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#create-a-platformio-project). + +1. Dodaj zależność biblioteki dla biblioteki Seeed Grove Humidity and Temperature sensor do pliku `platformio.ini` projektu: + + ```ini + lib_deps = + seeed-studio/Grove Temperature And Humidity Sensor @ 1.0.1 + ``` + + > ⚠️ Możesz odwołać się do [instrukcji dodawania bibliotek do projektu PlatformIO w projekcie 1, lekcji 4, jeśli potrzebujesz](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md#install-the-wifi-and-mqtt-arduino-libraries). + +1. Dodaj następujące dyrektywy `#include` na początku pliku, pod istniejącym `#include `: + + ```cpp + #include + #include + ``` + + Importuje to pliki potrzebne do interakcji z czujnikiem. Plik nagłówkowy `DHT.h` zawiera kod dla samego czujnika, a dodanie nagłówka `SPI.h` zapewnia, że kod potrzebny do komunikacji z czujnikiem zostanie uwzględniony podczas kompilacji aplikacji. + +1. Przed funkcją `setup` zadeklaruj czujnik DHT: + + ```cpp + DHT dht(D0, DHT11); + ``` + + Deklaruje to instancję klasy `DHT`, która zarządza **D**igitalnym **H**umidity i **T**emperature sensorem. Czujnik jest podłączony do portu `D0`, prawego gniazda Grove w Wio Terminal. Drugi parametr informuje kod, że używany czujnik to *DHT11* - biblioteka, której używasz, obsługuje inne warianty tego czujnika. + +1. W funkcji `setup` dodaj kod do konfiguracji połączenia szeregowego: + + ```cpp + void setup() + { + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + } + ``` + +1. Na końcu funkcji `setup`, po ostatnim `delay`, dodaj wywołanie uruchamiające czujnik DHT: + + ```cpp + dht.begin(); + ``` + +1. W funkcji `loop` dodaj kod wywołujący czujnik i drukujący temperaturę na port szeregowy: + + ```cpp + void loop() + { + float temp_hum_val[2] = {0}; + dht.readTempAndHumidity(temp_hum_val); + Serial.print("Temperature: "); + Serial.print(temp_hum_val[1]); + Serial.println ("°C"); + + delay(10000); + } + ``` + + Ten kod deklaruje pustą tablicę z 2 liczbami zmiennoprzecinkowymi i przekazuje ją do wywołania `readTempAndHumidity` na instancji `DHT`. Wywołanie to wypełnia tablicę dwoma wartościami - wilgotność trafia do pierwszego elementu tablicy (0), a temperatura do drugiego elementu (1). + + Temperatura jest odczytywana z drugiego elementu tablicy i drukowana na port szeregowy. + + > 🇺🇸 Temperatura jest odczytywana w stopniach Celsjusza. Dla Amerykanów, aby przeliczyć ją na stopnie Fahrenheita, podziel wartość w Celsjuszach przez 5, pomnóż przez 9, a następnie dodaj 32. Na przykład odczyt temperatury 20°C przelicza się na ((20/5)*9) + 32 = 68°F. + +1. Zbuduj i wgraj kod na Wio Terminal. + + > ⚠️ Możesz odwołać się do [instrukcji tworzenia projektu PlatformIO w projekcie 1, lekcji 1, jeśli potrzebujesz](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#write-the-hello-world-app). + +1. Po wgraniu możesz monitorować temperaturę za pomocą monitora szeregowego: + + ```output + > Executing task: platformio device monitor < + + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Temperature: 25.00°C + Temperature: 25.00°C + Temperature: 25.00°C + Temperature: 24.00°C + ``` + +> 💁 Ten kod znajdziesz w folderze [code-temperature/wio-terminal](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/wio-terminal). + +😀 Twój program do obsługi czujnika temperatury działa poprawnie! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/2-detect-soil-moisture/README.md b/translations/pl/2-farm/lessons/2-detect-soil-moisture/README.md new file mode 100644 index 00000000..82c38f9f --- /dev/null +++ b/translations/pl/2-farm/lessons/2-detect-soil-moisture/README.md @@ -0,0 +1,167 @@ + +C, wymawiane jako *I-kwadrat-C*, to protokół wielokontrolerowy i wieloperyferyjny, w którym każde podłączone urządzenie może działać jako kontroler lub peryferium, komunikując się za pośrednictwem magistrali I²C (nazwa systemu komunikacyjnego, który przesyła dane). Dane są przesyłane w postaci adresowanych pakietów, z każdym pakietem zawierającym adres urządzenia, do którego są przeznaczone. + +> 💁 Ten model był wcześniej określany jako master/slave, ale ta terminologia jest wycofywana ze względu na jej skojarzenia z niewolnictwem. [Open Source Hardware Association przyjęło terminologię kontroler/peryferium](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/), ale nadal można spotkać odniesienia do starej terminologii. + +Urządzenia mają adres, który jest używany podczas ich podłączania do magistrali I²C i zazwyczaj jest on zakodowany na stałe w urządzeniu. Na przykład każdy typ czujnika Grove od Seeed ma ten sam adres, więc wszystkie czujniki światła mają ten sam adres, wszystkie przyciski mają ten sam adres, który różni się od adresu czujnika światła. Niektóre urządzenia mają możliwość zmiany adresu, na przykład poprzez zmianę ustawień zworki lub lutowanie pinów. + +I²C ma magistralę składającą się z 2 głównych przewodów, wraz z 2 przewodami zasilającymi: + +| Przewód | Nazwa | Opis | +| ---- | --------- | ----------- | +| SDA | Serial Data (Dane szeregowe) | Ten przewód służy do przesyłania danych między urządzeniami. | +| SCL | Serial Clock (Zegar szeregowy) | Ten przewód przesyła sygnał zegarowy z częstotliwością ustawioną przez kontroler. | +| VCC | Voltage common collector (Wspólny kolektor napięcia) | Zasilanie dla urządzeń. Jest podłączone do przewodów SDA i SCL, aby dostarczać im zasilanie za pośrednictwem rezystora podciągającego, który wyłącza sygnał, gdy żadne urządzenie nie jest kontrolerem. | +| GND | Ground (Masa) | Zapewnia wspólną masę dla obwodu elektrycznego. | + +![Magistrala I2C z 3 urządzeniami podłączonymi do przewodów SDA i SCL, współdzieląca wspólny przewód masy](../../../../../translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.pl.png) + +Aby przesłać dane, jedno urządzenie wydaje warunek startu, aby pokazać, że jest gotowe do przesyłania danych. Następnie staje się kontrolerem. Kontroler wysyła adres urządzenia, z którym chce się komunikować, wraz z informacją, czy chce odczytać, czy zapisać dane. Po przesłaniu danych kontroler wysyła warunek stopu, aby wskazać, że zakończył. Po tym inne urządzenie może stać się kontrolerem i przesyłać lub odbierać dane. + +I2C ma ograniczenia prędkości, z trzema różnymi trybami działającymi z ustalonymi prędkościami. Najszybszy to tryb High Speed z maksymalną prędkością 3,4 Mbps (megabitów na sekundę), choć bardzo niewiele urządzeń obsługuje tę prędkość. Na przykład Raspberry Pi jest ograniczone do trybu fast z prędkością 400 Kbps (kilobitów na sekundę). Tryb standardowy działa z prędkością 100 Kbps. + +> 💁 Jeśli używasz Raspberry Pi z nakładką Grove Base jako swojego sprzętu IoT, możesz zobaczyć kilka gniazd I2C na płytce, które możesz wykorzystać do komunikacji z czujnikami I2C. Analogowe czujniki Grove również korzystają z I2C z przetwornikiem ADC, aby przesyłać wartości analogowe jako dane cyfrowe, więc czujnik światła, którego używałeś, symulował pin analogowy, a wartość była przesyłana przez I2C, ponieważ Raspberry Pi obsługuje tylko piny cyfrowe. + +### Uniwersalny asynchroniczny odbiornik-nadajnik (UART) + +UART obejmuje fizyczny układ, który pozwala dwóm urządzeniom komunikować się. Każde urządzenie ma 2 piny komunikacyjne - transmitujący (Tx) i odbierający (Rx), przy czym pin Tx pierwszego urządzenia jest połączony z pinem Rx drugiego urządzenia, a pin Tx drugiego urządzenia jest połączony z pinem Rx pierwszego urządzenia. Dzięki temu dane mogą być przesyłane w obu kierunkach. + +* Urządzenie 1 przesyła dane ze swojego pinu Tx, które są odbierane przez urządzenie 2 na jego pinie Rx +* Urządzenie 1 odbiera dane na swoim pinie Rx, które są przesyłane przez urządzenie 2 z jego pinu Tx + +![UART z pinem Tx jednego układu połączonym z pinem Rx innego i vice versa](../../../../../translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.pl.png) + +> 🎓 Dane są przesyłane po jednym bicie na raz, co nazywa się komunikacją *szeregową*. Większość systemów operacyjnych i mikrokontrolerów ma *porty szeregowe*, czyli połączenia umożliwiające przesyłanie i odbieranie danych szeregowych, które są dostępne dla twojego kodu. + +Urządzenia UART mają [prędkość transmisji](https://wikipedia.org/wiki/Symbol_rate) (znaną również jako Symbol rate), która określa szybkość przesyłania i odbierania danych w bitach na sekundę. Popularna prędkość transmisji to 9 600, co oznacza, że 9 600 bitów (0 i 1) danych jest przesyłanych każdą sekundę. + +UART używa bitów startu i stopu - wysyła bit startu, aby wskazać, że zaraz wyśle bajt (8 bitów) danych, a następnie bit stopu po wysłaniu 8 bitów. + +Prędkość UART zależy od sprzętu, ale nawet najszybsze implementacje nie przekraczają 6,5 Mbps (megabitów na sekundę, czyli milionów bitów, 0 lub 1, przesyłanych na sekundę). + +Możesz używać UART przez piny GPIO - możesz ustawić jeden pin jako Tx, a inny jako Rx, a następnie połączyć je z innym urządzeniem. + +> 💁 Jeśli używasz Raspberry Pi z nakładką Grove Base jako swojego sprzętu IoT, możesz zobaczyć gniazdo UART na płytce, które możesz wykorzystać do komunikacji z czujnikami korzystającymi z protokołu UART. + +### Szeregowy interfejs peryferyjny (SPI) + +SPI został zaprojektowany do komunikacji na krótkie odległości, na przykład na mikrokontrolerze do komunikacji z urządzeniem pamięci masowej, takim jak pamięć flash. Opiera się na modelu kontroler/peryferium, gdzie pojedynczy kontroler (zazwyczaj procesor urządzenia IoT) komunikuje się z wieloma peryferiami. Kontroler zarządza wszystkim, wybierając peryferium i wysyłając lub żądając danych. + +> 💁 Podobnie jak w przypadku I2C, terminy kontroler i peryferium to niedawne zmiany, więc możesz spotkać się z użyciem starszych terminów. + +Kontrolery SPI używają 3 przewodów, wraz z 1 dodatkowym przewodem na każde peryferium. Peryferia używają 4 przewodów. Te przewody to: + +| Przewód | Nazwa | Opis | +| ---- | --------- | ----------- | +| COPI | Wyjście kontrolera, wejście peryferium | Ten przewód służy do przesyłania danych z kontrolera do peryferium. | +| CIPO | Wejście kontrolera, wyjście peryferium | Ten przewód służy do przesyłania danych z peryferium do kontrolera. | +| SCLK | Zegar szeregowy | Ten przewód przesyła sygnał zegarowy z prędkością ustawioną przez kontroler. | +| CS | Wybór układu | Kontroler ma wiele przewodów, po jednym na każde peryferium, a każdy przewód łączy się z przewodem CS odpowiedniego peryferium. | + +![SPI z jednym kontrolerem i dwoma peryferiami](../../../../../translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.pl.png) + +Przewód CS jest używany do aktywacji jednego peryferium naraz, komunikując się przez przewody COPI i CIPO. Gdy kontroler musi zmienić peryferium, dezaktywuje przewód CS połączony z obecnie aktywnym peryferium, a następnie aktywuje przewód połączony z peryferium, z którym chce się komunikować. + +SPI jest *pełnodupleksowe*, co oznacza, że kontroler może jednocześnie wysyłać i odbierać dane z tego samego peryferium, używając przewodów COPI i CIPO. SPI używa sygnału zegarowego na przewodzie SCLK, aby utrzymać synchronizację urządzeń, więc w przeciwieństwie do przesyłania bezpośrednio przez UART, nie potrzebuje bitów startu i stopu. + +Nie ma określonych ograniczeń prędkości dla SPI, a implementacje często mogą przesyłać wiele megabajtów danych na sekundę. + +Zestawy deweloperskie IoT często obsługują SPI przez niektóre piny GPIO. Na przykład na Raspberry Pi możesz używać pinów GPIO 19, 21, 23, 24 i 26 do SPI. + +### Bezprzewodowe + +Niektóre czujniki mogą komunikować się za pomocą standardowych protokołów bezprzewodowych, takich jak Bluetooth (głównie Bluetooth Low Energy, czyli BLE), LoRaWAN (protokół sieciowy o niskim zużyciu energii i dużym zasięgu) lub WiFi. Umożliwia to zdalnym czujnikom działanie bez fizycznego połączenia z urządzeniem IoT. + +Przykładem są komercyjne czujniki wilgotności gleby. Mierzą one wilgotność gleby na polu, a następnie przesyłają dane przez LoRaWAN do urządzenia centralnego, które przetwarza dane lub przesyła je przez Internet. Dzięki temu czujnik może znajdować się z dala od urządzenia IoT zarządzającego danymi, co zmniejsza zużycie energii i potrzebę dużych sieci WiFi lub długich kabli. + +BLE jest popularne w zaawansowanych czujnikach, takich jak opaski fitness noszone na nadgarstku. Łączą one wiele czujników i przesyłają dane do urządzenia IoT, na przykład telefonu, za pomocą BLE. + +✅ Czy masz jakieś czujniki Bluetooth przy sobie, w domu lub w szkole? Mogą to być czujniki temperatury, czujniki obecności, lokalizatory urządzeń lub urządzenia fitness. + +Jednym z popularnych sposobów łączenia urządzeń komercyjnych jest Zigbee. Zigbee wykorzystuje WiFi do tworzenia sieci kratowych między urządzeniami, gdzie każde urządzenie łączy się z jak największą liczbą pobliskich urządzeń, tworząc dużą liczbę połączeń przypominających pajęczynę. Gdy jedno urządzenie chce wysłać wiadomość do Internetu, może przesłać ją do najbliższych urządzeń, które następnie przekazują ją dalej do innych pobliskich urządzeń i tak dalej, aż dotrze do koordynatora i zostanie przesłana do Internetu. + +> 🐝 Nazwa Zigbee odnosi się do tańca pszczół miodnych po ich powrocie do ula. + +## Pomiar poziomu wilgotności gleby + +Możesz zmierzyć poziom wilgotności gleby za pomocą czujnika wilgotności gleby, urządzenia IoT i rośliny doniczkowej lub pobliskiego kawałka gleby. + +### Zadanie - pomiar wilgotności gleby + +Przejdź przez odpowiedni przewodnik, aby zmierzyć wilgotność gleby za pomocą swojego urządzenia IoT: + +* [Arduino - Wio Terminal](wio-terminal-soil-moisture.md) +* [Komputer jednopłytkowy - Raspberry Pi](pi-soil-moisture.md) +* [Komputer jednopłytkowy - Wirtualne urządzenie](virtual-device-soil-moisture.md) + +## Kalibracja czujników + +Czujniki opierają się na pomiarze właściwości elektrycznych, takich jak rezystancja lub pojemność. + +> 🎓 Rezystancja, mierzona w omach (Ω), to miara oporu, jaki napotyka prąd elektryczny przepływający przez coś. Gdy napięcie jest przyłożone do materiału, ilość prądu, który przez niego przepływa, zależy od rezystancji materiału. Więcej informacji znajdziesz na [stronie o rezystancji elektrycznej na Wikipedii](https://wikipedia.org/wiki/Electrical_resistance_and_conductance). + +> 🎓 Pojemność, mierzona w faradach (F), to zdolność komponentu lub obwodu do gromadzenia i przechowywania energii elektrycznej. Więcej informacji znajdziesz na [stronie o pojemności na Wikipedii](https://wikipedia.org/wiki/Capacitance). + +Te pomiary nie zawsze są użyteczne - wyobraź sobie czujnik temperatury, który podaje wynik 22,5 kΩ! Zamiast tego zmierzona wartość musi zostać przekształcona na użyteczną jednostkę poprzez kalibrację - czyli dopasowanie zmierzonych wartości do mierzonej wielkości, aby umożliwić przekształcenie nowych pomiarów na odpowiednią jednostkę. + +Niektóre czujniki są fabrycznie skalibrowane. Na przykład czujnik temperatury, którego używałeś w poprzedniej lekcji, był już skalibrowany, aby mógł zwracać pomiar temperatury w °C. W fabryce pierwszy wyprodukowany czujnik był wystawiany na działanie znanych temperatur, a rezystancja była mierzona. Na tej podstawie opracowano obliczenia, które mogą przekształcać wartość zmierzoną w Ω (jednostka rezystancji) na °C. + +> 💁 Wzór do obliczania rezystancji na podstawie temperatury to [równanie Steinharta–Harta](https://wikipedia.org/wiki/Steinhart–Hart_equation). + +### Kalibracja czujnika wilgotności gleby + +Wilgotność gleby jest mierzona za pomocą zawartości wody grawimetrycznej lub objętościowej. + +* Grawimetryczna to waga wody w jednostce wagi gleby, mierzona jako liczba kilogramów wody na kilogram suchej gleby +* Objętościowa to objętość wody w jednostce objętości gleby, mierzona jako liczba metrów sześciennych wody na metry sześcienne suchej gleby + +> 🇺🇸 Dla Amerykanów, ze względu na spójność jednostek, można to mierzyć w funtach zamiast kilogramów lub stopach sześciennych zamiast metrów sześciennych. + +Czujniki wilgotności gleby mierzą rezystancję lub pojemność elektryczną - to zależy nie tylko od wilgotności gleby, ale także od jej rodzaju, ponieważ składniki gleby mogą zmieniać jej właściwości elektryczne. Idealnie czujniki powinny być skalibrowane - czyli odczyty z czujnika powinny być porównywane z pomiarami uzyskanymi bardziej naukową metodą. Na przykład laboratorium może obliczyć grawimetryczną wilgotność gleby, używając próbek z konkretnego pola pobranych kilka razy w roku, a te dane mogą być użyte do kalibracji czujnika, dopasowując odczyty czujnika do grawimetrycznej wilgotności gleby. + +![Wykres napięcia w zależności od zawartości wilgoci w glebie](../../../../../translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.pl.png) + +Powyższy wykres pokazuje, jak skalibrować czujnik. Napięcie jest rejestrowane dla próbki gleby, która następnie jest mierzona w laboratorium przez porównanie wilgotnej wagi z suchą wagą (mierząc wagę wilgotną, a następnie susząc w piecu i mierząc wagę suchą). Po wykonaniu kilku pomiarów można je nanieść na wykres i dopasować linię do punktów. Ta linia może być następnie użyta do przekształcenia odczytów czujnika wilgotności gleby wykonanych przez urządzenie IoT na rzeczywiste pomiary wilgotności gleby. + +💁 W przypadku rezystancyjnych czujników wilgotności gleby napięcie wzrasta wraz ze wzrostem wilgotności gleby. W przypadku pojemnościowych czujników wilgotności gleby napięcie maleje wraz ze wzrostem wilgotności gleby, więc wykresy dla tych czujników będą opadać, a nie wznosić się. + +![Wartość wilgotności gleby interpolowana z wykresu](../../../../../translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.pl.png) + +Powyższy wykres pokazuje odczyt napięcia z czujnika wilgotności gleby, a poprzez śledzenie tego do linii na wykresie można obliczyć rzeczywistą wilgotność gleby. + +To podejście oznacza, że rolnik potrzebuje tylko kilku pomiarów laboratoryjnych dla pola, a następnie może używać urządzeń IoT do pomiaru wilgotności gleby - znacznie przyspieszając czas potrzebny na wykonanie pomiarów. + +--- + +## 🚀 Wyzwanie + +Rezystancyjne i pojemnościowe czujniki wilgotności gleby mają szereg różnic. Jakie są te różnice i który typ (jeśli w ogóle) jest najlepszy dla rolnika? Czy odpowiedź na to pytanie zmienia się w zależności od tego, czy mówimy o krajach rozwijających się, czy rozwiniętych? + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/12) + +## Przegląd i samodzielna nauka + +Przeczytaj o sprzęcie i protokołach używanych przez czujniki i siłowniki: + +* [Strona Wikipedii o GPIO](https://wikipedia.org/wiki/General-purpose_input/output) +* [Strona Wikipedii o UART](https://wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter) +* [Strona Wikipedii o SPI](https://wikipedia.org/wiki/Serial_Peripheral_Interface) +* [Strona Wikipedii o I2C](https://wikipedia.org/wiki/I²C) +* [Strona Wikipedii o Zigbee](https://wikipedia.org/wiki/Zigbee) + +## Zadanie + +[Skalibruj swój czujnik](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/2-detect-soil-moisture/assignment.md b/translations/pl/2-farm/lessons/2-detect-soil-moisture/assignment.md new file mode 100644 index 00000000..29e0f176 --- /dev/null +++ b/translations/pl/2-farm/lessons/2-detect-soil-moisture/assignment.md @@ -0,0 +1,61 @@ + +# Kalibracja czujnika + +## Instrukcje + +W tej lekcji zebrałeś odczyty z czujnika wilgotności gleby, mierzone w wartościach od 0 do 1023. Aby przekształcić je w rzeczywiste odczyty wilgotności gleby, musisz skalibrować swój czujnik. Możesz to zrobić, wykonując odczyty z próbek gleby, a następnie obliczając grawimetryczną zawartość wilgoci w glebie na podstawie tych próbek. + +Będziesz musiał powtórzyć te kroki kilkukrotnie, aby uzyskać potrzebne odczyty, za każdym razem z różnym poziomem wilgotności gleby. + +1. Wykonaj odczyt wilgotności gleby za pomocą czujnika wilgotności gleby. Zapisz ten odczyt. + +1. Pobierz próbkę gleby i zważ ją. Zapisz tę wagę. + +1. Wysusz glebę – najlepiej w ciepłym piekarniku w temperaturze 110°C (230°F) przez kilka godzin. Możesz to zrobić również na słońcu lub umieścić próbkę w ciepłym, suchym miejscu, aż gleba będzie całkowicie sucha. Powinna być sypka i miałka. + + > 💁 W laboratorium, aby uzyskać najdokładniejsze wyniki, suszyłbyś próbkę w piekarniku przez 48-72 godziny. Jeśli w Twojej szkole są dostępne suszarki laboratoryjne, sprawdź, czy możesz z nich skorzystać, aby suszyć próbki dłużej. Im dłużej, tym bardziej sucha próbka i dokładniejsze wyniki. + +1. Zważ glebę ponownie. + + > 🔥 Jeśli suszyłeś próbkę w piekarniku, upewnij się, że najpierw ostygła! + +Grawimetryczna wilgotność gleby jest obliczana jako: + +![wilgotność gleby % to waga mokrej gleby minus waga suchej gleby, podzielone przez wagę suchej gleby, pomnożone przez 100](../../../../../translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.pl.png) + +* W +- waga mokrej gleby +* W +- waga suchej gleby + +Na przykład, załóżmy, że masz próbkę gleby, która waży 212 g w stanie mokrym i 197 g w stanie suchym. + +![Wypełnione obliczenie](../../../../../translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.pl.png) + +* W = 212 g +* W = 197 g +* 212 - 197 = 15 +* 15 / 197 = 0,076 +* 0,076 * 100 = 7,6% + +W tym przykładzie gleba ma grawimetryczną wilgotność na poziomie 7,6%. + +Gdy masz odczyty dla co najmniej 3 próbek, narysuj wykres procentowej wilgotności gleby w stosunku do odczytów z czujnika wilgotności gleby i dodaj linię najlepszego dopasowania do punktów. Następnie możesz użyć tego wykresu, aby obliczyć grawimetryczną zawartość wilgoci w glebie dla danego odczytu z czujnika, odczytując wartość z linii. + +## Kryteria oceny + +| Kryterium | Wzorowe | Wystarczające | Wymaga poprawy | +| --------- | ------- | ------------- | -------------- | +| Zbieranie danych kalibracyjnych | Zebrano co najmniej 3 próbki kalibracyjne | Zebrano co najmniej 2 próbki kalibracyjne | Zebrano co najmniej 1 próbkę kalibracyjną | +| Wykonanie skalibrowanego odczytu | Pomyślnie narysowano wykres kalibracyjny, wykonano odczyt z czujnika i przeliczono go na grawimetryczną wilgotność gleby | Pomyślnie narysowano wykres kalibracyjny | Nie udało się narysować wykresu | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md b/translations/pl/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md new file mode 100644 index 00000000..d17c4ece --- /dev/null +++ b/translations/pl/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md @@ -0,0 +1,106 @@ + +# Pomiar wilgotności gleby - Raspberry Pi + +W tej części lekcji dodasz pojemnościowy czujnik wilgotności gleby do swojego Raspberry Pi i odczytasz z niego wartości. + +## Sprzęt + +Do Raspberry Pi potrzebny jest pojemnościowy czujnik wilgotności gleby. + +Czujnik, którego użyjesz, to [Pojemnościowy Czujnik Wilgotności Gleby](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), który mierzy wilgotność gleby poprzez wykrywanie jej pojemności, właściwości zmieniającej się wraz ze zmianą wilgotności gleby. Wraz ze wzrostem wilgotności gleby napięcie maleje. + +Jest to czujnik analogowy, który korzysta z analogowego pinu oraz 10-bitowego przetwornika ADC w Grove Base Hat na Raspberry Pi, aby przekształcić napięcie na sygnał cyfrowy w zakresie od 1 do 1 023. Następnie sygnał ten jest przesyłany przez I²C za pomocą pinów GPIO na Raspberry Pi. + +### Podłączanie czujnika wilgotności gleby + +Czujnik wilgotności gleby Grove można podłączyć do Raspberry Pi. + +#### Zadanie - podłącz czujnik wilgotności gleby + +Podłącz czujnik wilgotności gleby. + +![Czujnik wilgotności gleby Grove](../../../../../translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.pl.png) + +1. Włóż jeden koniec kabla Grove do gniazda na czujniku wilgotności gleby. Kabel można włożyć tylko w jeden sposób. + +1. Przy wyłączonym Raspberry Pi podłącz drugi koniec kabla Grove do gniazda analogowego oznaczonego **A0** na Grove Base Hat przymocowanym do Raspberry Pi. To gniazdo znajduje się drugie od prawej strony w rzędzie gniazd obok pinów GPIO. + +![Czujnik wilgotności gleby Grove podłączony do gniazda A0](../../../../../translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.pl.png) + +1. Włóż czujnik wilgotności gleby do gleby. Na czujniku znajduje się linia oznaczająca "najwyższy poziom" - biała linia przecinająca czujnik. Włóż czujnik do gleby do tej linii, ale nie głębiej. + +![Czujnik wilgotności gleby Grove w glebie](../../../../../translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.pl.png) + +## Programowanie czujnika wilgotności gleby + +Teraz Raspberry Pi można zaprogramować do obsługi podłączonego czujnika wilgotności gleby. + +### Zadanie - zaprogramuj czujnik wilgotności gleby + +Zaprogramuj urządzenie. + +1. Włącz Raspberry Pi i poczekaj, aż się uruchomi. + +1. Uruchom VS Code, bezpośrednio na Raspberry Pi lub za pomocą rozszerzenia Remote SSH. + + > ⚠️ Możesz odwołać się do [instrukcji dotyczących konfiguracji i uruchamiania VS Code w lekcji 1 - nightlight, jeśli to konieczne](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. W terminalu utwórz nowy folder w katalogu domowym użytkownika `pi` o nazwie `soil-moisture-sensor`. W tym folderze utwórz plik o nazwie `app.py`. + +1. Otwórz ten folder w VS Code. + +1. Dodaj poniższy kod do pliku `app.py`, aby zaimportować wymagane biblioteki: + + ```python + import time + from grove.adc import ADC + ``` + + Instrukcja `import time` importuje moduł `time`, który będzie używany później w tym zadaniu. + + Instrukcja `from grove.adc import ADC` importuje `ADC` z bibliotek Python Grove. Ta biblioteka zawiera kod do obsługi przetwornika analogowo-cyfrowego na Grove Base Hat i odczytu napięć z czujników analogowych. + +1. Dodaj poniższy kod, aby utworzyć instancję klasy `ADC`: + + ```python + adc = ADC() + ``` + +1. Dodaj nieskończoną pętlę, która odczytuje dane z ADC na pinie A0 i zapisuje wynik w konsoli. Pętla ta może następnie usypiać na 10 sekund między odczytami. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. Uruchom aplikację w Pythonie. Zobaczysz pomiary wilgotności gleby wyświetlane w konsoli. Dodaj wodę do gleby lub wyjmij czujnik z gleby i obserwuj zmieniające się wartości. + + ```output + pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py + Soil moisture: 615 + Soil moisture: 612 + Soil moisture: 498 + Soil moisture: 493 + Soil moisture: 490 + Soil Moisture: 388 + ``` + + W powyższym przykładzie wyjścia widać, jak napięcie spada po dodaniu wody. + +> 💁 Kod ten znajdziesz w folderze [code/pi](../../../../../2-farm/lessons/2-detect-soil-moisture/code/pi). + +😀 Twój program do obsługi czujnika wilgotności gleby działa poprawnie! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md b/translations/pl/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md new file mode 100644 index 00000000..ed3b9d4d --- /dev/null +++ b/translations/pl/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md @@ -0,0 +1,121 @@ + +# Pomiar wilgotności gleby - Wirtualny sprzęt IoT + +W tej części lekcji dodasz pojemnościowy czujnik wilgotności gleby do swojego wirtualnego urządzenia IoT i odczytasz z niego wartości. + +## Wirtualny sprzęt + +Wirtualne urządzenie IoT będzie korzystać z symulowanego pojemnościowego czujnika wilgotności gleby Grove. Dzięki temu laboratorium pozostaje takie samo, jak w przypadku użycia Raspberry Pi z fizycznym pojemnościowym czujnikiem wilgotności gleby Grove. + +W fizycznym urządzeniu IoT czujnik wilgotności gleby byłby pojemnościowym czujnikiem, który mierzy wilgotność gleby poprzez wykrywanie jej pojemności, właściwości zmieniającej się wraz ze zmianą wilgotności gleby. Wraz ze wzrostem wilgotności gleby napięcie maleje. + +Jest to czujnik analogowy, który wykorzystuje symulowany 10-bitowy przetwornik ADC do raportowania wartości w zakresie od 1 do 1 023. + +### Dodanie czujnika wilgotności gleby do CounterFit + +Aby użyć wirtualnego czujnika wilgotności gleby, musisz dodać go do aplikacji CounterFit. + +#### Zadanie - Dodanie czujnika wilgotności gleby do CounterFit + +Dodaj czujnik wilgotności gleby do aplikacji CounterFit. + +1. Utwórz nową aplikację Python na swoim komputerze w folderze o nazwie `soil-moisture-sensor` z jednym plikiem o nazwie `app.py` oraz wirtualnym środowiskiem Python, a następnie dodaj pakiety pip CounterFit. + + > ⚠️ Możesz odwołać się do [instrukcji tworzenia i konfigurowania projektu Python w CounterFit w lekcji 1, jeśli to konieczne](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Upewnij się, że aplikacja internetowa CounterFit jest uruchomiona. + +1. Utwórz czujnik wilgotności gleby: + + 1. W polu *Create sensor* w panelu *Sensors* rozwiń pole *Sensor type* i wybierz *Soil Moisture*. + + 1. Pozostaw *Units* ustawione na *NoUnits*. + + 1. Upewnij się, że *Pin* jest ustawiony na *0*. + + 1. Wybierz przycisk **Add**, aby utworzyć czujnik *Soil Moisture* na pinie 0. + + ![Ustawienia czujnika wilgotności gleby](../../../../../translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.pl.png) + + Czujnik wilgotności gleby zostanie utworzony i pojawi się na liście czujników. + + ![Utworzony czujnik wilgotności gleby](../../../../../translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.pl.png) + +## Programowanie aplikacji czujnika wilgotności gleby + +Teraz możesz zaprogramować aplikację czujnika wilgotności gleby, korzystając z czujników CounterFit. + +### Zadanie - Programowanie aplikacji czujnika wilgotności gleby + +Zaprogramuj aplikację czujnika wilgotności gleby. + +1. Upewnij się, że aplikacja `soil-moisture-sensor` jest otwarta w VS Code. + +1. Otwórz plik `app.py`. + +1. Dodaj następujący kod na początku pliku `app.py`, aby połączyć aplikację z CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Dodaj następujący kod do pliku `app.py`, aby zaimportować wymagane biblioteki: + + ```python + import time + from counterfit_shims_grove.adc import ADC + ``` + + Instrukcja `import time` importuje moduł `time`, który będzie używany później w tym zadaniu. + + Instrukcja `from counterfit_shims_grove.adc import ADC` importuje klasę `ADC`, aby umożliwić interakcję z wirtualnym przetwornikiem analogowo-cyfrowym, który może być połączony z czujnikiem CounterFit. + +1. Dodaj poniżej następujący kod, aby utworzyć instancję klasy `ADC`: + + ```python + adc = ADC() + ``` + +1. Dodaj nieskończoną pętlę, która odczytuje dane z tego przetwornika ADC na pinie 0 i zapisuje wynik w konsoli. Pętla ta może następnie usypiać na 10 sekund między odczytami. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. W aplikacji CounterFit zmień wartość czujnika wilgotności gleby, która będzie odczytywana przez aplikację. Możesz to zrobić na dwa sposoby: + + * Wpisz liczbę w polu *Value* dla czujnika wilgotności gleby, a następnie wybierz przycisk **Set**. Liczba, którą wpiszesz, będzie wartością zwracaną przez czujnik. + + * Zaznacz pole *Random* i wpisz wartości *Min* oraz *Max*, a następnie wybierz przycisk **Set**. Za każdym razem, gdy czujnik odczyta wartość, będzie to losowa liczba z zakresu *Min* i *Max*. + +1. Uruchom aplikację Python. Zobaczysz pomiary wilgotności gleby wypisywane w konsoli. Zmień wartość w polu *Value* lub ustawienia *Random*, aby zobaczyć zmieniające się wartości. + + ```output + (.venv) ➜ soil-moisture-sensor $ python app.py + Soil moisture: 615 + Soil moisture: 612 + Soil moisture: 498 + Soil moisture: 493 + Soil moisture: 490 + Soil Moisture: 388 + ``` + +> 💁 Kod ten znajdziesz w folderze [code/virtual-device](../../../../../2-farm/lessons/2-detect-soil-moisture/code/virtual-device). + +😀 Twój program czujnika wilgotności gleby zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md b/translations/pl/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md new file mode 100644 index 00000000..640b2792 --- /dev/null +++ b/translations/pl/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md @@ -0,0 +1,115 @@ + +# Pomiar wilgotności gleby - Wio Terminal + +W tej części lekcji dodasz pojemnościowy czujnik wilgotności gleby do swojego Wio Terminal i odczytasz z niego wartości. + +## Sprzęt + +Wio Terminal potrzebuje pojemnościowego czujnika wilgotności gleby. + +Czujnik, którego użyjesz, to [Pojemnościowy Czujnik Wilgotności Gleby](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), który mierzy wilgotność gleby poprzez wykrywanie jej pojemności, właściwości zmieniającej się wraz ze zmianą wilgotności gleby. Wraz ze wzrostem wilgotności gleby napięcie maleje. + +Jest to czujnik analogowy, który łączy się z analogowymi pinami Wio Terminal, wykorzystując wbudowany przetwornik ADC do generowania wartości w zakresie od 0 do 1023. + +### Podłącz czujnik wilgotności gleby + +Czujnik wilgotności gleby Grove można podłączyć do konfigurowalnego portu analogowo-cyfrowego Wio Terminal. + +#### Zadanie - podłącz czujnik wilgotności gleby + +Podłącz czujnik wilgotności gleby. + +![Czujnik wilgotności gleby Grove](../../../../../translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.pl.png) + +1. Włóż jeden koniec kabla Grove do gniazda na czujniku wilgotności gleby. Kabel wejdzie tylko w jednym kierunku. + +1. Przy odłączonym Wio Terminal od komputera lub innego źródła zasilania, podłącz drugi koniec kabla Grove do prawego gniazda Grove na Wio Terminal, patrząc na ekran. Jest to gniazdo najbardziej oddalone od przycisku zasilania. + +![Czujnik wilgotności gleby Grove podłączony do prawego gniazda](../../../../../translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.pl.png) + +1. Włóż czujnik wilgotności gleby do gleby. Czujnik ma linię oznaczającą "najwyższą pozycję" - białą linię na czujniku. Włóż czujnik do gleby do tej linii, ale nie dalej. + +![Czujnik wilgotności gleby Grove w glebie](../../../../../translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.pl.png) + +1. Teraz możesz podłączyć Wio Terminal do komputera. + +## Programowanie czujnika wilgotności gleby + +Wio Terminal może teraz zostać zaprogramowany do korzystania z podłączonego czujnika wilgotności gleby. + +### Zadanie - zaprogramuj czujnik wilgotności gleby + +Zaprogramuj urządzenie. + +1. Utwórz nowy projekt Wio Terminal za pomocą PlatformIO. Nazwij ten projekt `soil-moisture-sensor`. Dodaj kod w funkcji `setup`, aby skonfigurować port szeregowy. + + > ⚠️ Możesz odwołać się do [instrukcji tworzenia projektu PlatformIO w projekcie 1, lekcji 1, jeśli potrzebujesz](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#create-a-platformio-project). + +1. Nie ma biblioteki dla tego czujnika, zamiast tego możesz odczytać dane z pinu analogowego za pomocą wbudowanej funkcji Arduino [`analogRead`](https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/). Zacznij od skonfigurowania pinu analogowego jako wejścia, aby można było odczytywać z niego wartości, dodając poniższy kod do funkcji `setup`. + + ```cpp + pinMode(A0, INPUT); + ``` + + Ten kod ustawia pin `A0`, połączony pin analogowo-cyfrowy, jako pin wejściowy, z którego można odczytywać napięcie. + +1. Dodaj poniższy kod do funkcji `loop`, aby odczytać napięcie z tego pinu: + + ```cpp + int soil_moisture = analogRead(A0); + ``` + +1. Pod tym kodem dodaj poniższy kod, aby wydrukować wartość na port szeregowy: + + ```cpp + Serial.print("Soil Moisture: "); + Serial.println(soil_moisture); + ``` + +1. Na końcu dodaj opóźnienie wynoszące 10 sekund: + + ```cpp + delay(10000); + ``` + +1. Zbuduj i wgraj kod na Wio Terminal. + + > ⚠️ Możesz odwołać się do [instrukcji tworzenia projektu PlatformIO w projekcie 1, lekcji 1, jeśli potrzebujesz](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#write-the-hello-world-app). + +1. Po wgraniu kodu możesz monitorować wilgotność gleby za pomocą monitora szeregowego. Dodaj trochę wody do gleby lub wyjmij czujnik z gleby i zobacz, jak zmieniają się wartości. + + ```output + > Executing task: platformio device monitor < + + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Soil Moisture: 526 + Soil Moisture: 529 + Soil Moisture: 521 + Soil Moisture: 494 + Soil Moisture: 454 + Soil Moisture: 456 + Soil Moisture: 395 + Soil Moisture: 388 + Soil Moisture: 394 + Soil Moisture: 391 + ``` + + W powyższym przykładzie wyjścia możesz zobaczyć, jak napięcie spada po dodaniu wody. + +> 💁 Ten kod znajdziesz w folderze [code/wio-terminal](../../../../../2-farm/lessons/2-detect-soil-moisture/code/wio-terminal). + +😀 Twój program do czujnika wilgotności gleby zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/3-automated-plant-watering/README.md b/translations/pl/2-farm/lessons/3-automated-plant-watering/README.md new file mode 100644 index 00000000..21c3ece9 --- /dev/null +++ b/translations/pl/2-farm/lessons/3-automated-plant-watering/README.md @@ -0,0 +1,312 @@ + +# Automatyczne podlewanie roślin + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obraz, aby zobaczyć większą wersję. + +Ta lekcja była częścią [Projektu IoT dla początkujących 2 - Cyfrowe rolnictwo](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) z [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Automatyczne podlewanie roślin zasilane IoT](https://img.youtube.com/vi/g9FfZwv9R58/0.jpg)](https://youtu.be/g9FfZwv9R58) + +## Quiz przed lekcją + +[Quiz przed lekcją](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/13) + +## Wprowadzenie + +W poprzedniej lekcji nauczyłeś się, jak monitorować wilgotność gleby. W tej lekcji dowiesz się, jak zbudować podstawowe elementy automatycznego systemu nawadniania, który reaguje na wilgotność gleby. Poznasz również zagadnienia związane z czasem - jak czujniki mogą potrzebować chwili na reakcję na zmiany oraz jak siłowniki mogą potrzebować czasu na zmianę właściwości mierzonych przez czujniki. + +W tej lekcji omówimy: + +* [Sterowanie urządzeniami o dużej mocy za pomocą urządzenia IoT o niskiej mocy](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Sterowanie przekaźnikiem](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Sterowanie rośliną za pomocą MQTT](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Czas reakcji czujników i siłowników](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Dodanie czasu do serwera sterującego rośliną](../../../../../2-farm/lessons/3-automated-plant-watering) + +## Sterowanie urządzeniami o dużej mocy za pomocą urządzenia IoT o niskiej mocy + +Urządzenia IoT korzystają z niskiego napięcia. Chociaż jest ono wystarczające dla czujników i siłowników o niskim poborze mocy, takich jak diody LED, to jest zbyt niskie, aby sterować większym sprzętem, takim jak pompa wodna używana do nawadniania. Nawet małe pompy, które można wykorzystać do podlewania roślin doniczkowych, pobierają zbyt dużo prądu dla zestawu deweloperskiego IoT i mogłyby go uszkodzić. + +> 🎓 Prąd, mierzony w amperach (A), to ilość elektryczności przepływającej przez obwód. Napięcie zapewnia "popych", a prąd określa, ile jest "popychane". Więcej o prądzie możesz przeczytać na [stronie o prądzie elektrycznym w Wikipedii](https://wikipedia.org/wiki/Electric_current). + +Rozwiązaniem tego problemu jest podłączenie pompy do zewnętrznego źródła zasilania i użycie siłownika do włączania pompy, podobnie jak włączasz światło. Wymaga to niewielkiej ilości energii (w postaci energii z twojego ciała), aby palcem przełączyć włącznik, co łączy światło z siecią elektryczną o napięciu 110V/240V. + +![Włącznik światła włącza zasilanie do lampy](../../../../../translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.pl.png) + +> 🎓 [Prąd sieciowy](https://wikipedia.org/wiki/Mains_electricity) odnosi się do elektryczności dostarczanej do domów i firm przez infrastrukturę krajową w wielu częściach świata. + +✅ Urządzenia IoT zazwyczaj dostarczają 3,3V lub 5V, przy prądzie mniejszym niż 1 amper (1A). Dla porównania, prąd sieciowy to najczęściej 230V (120V w Ameryce Północnej i 100V w Japonii) i może zasilać urządzenia pobierające prąd o natężeniu 30A. + +Istnieje wiele siłowników, które mogą to zrobić, w tym urządzenia mechaniczne, które można przymocować do istniejących przełączników, naśladując ruch palca. Najpopularniejszym rozwiązaniem jest przekaźnik. + +### Przekaźniki + +Przekaźnik to elektromechaniczny przełącznik, który przekształca sygnał elektryczny w ruch mechaniczny, włączając przełącznik. Rdzeniem przekaźnika jest elektromagnes. + +> 🎓 [Elektromagnesy](https://wikipedia.org/wiki/Electromagnet) to magnesy tworzone przez przepływ prądu przez cewkę drutu. Gdy prąd jest włączony, cewka staje się namagnesowana. Gdy prąd jest wyłączony, cewka traci swoje właściwości magnetyczne. + +![Gdy włączony, elektromagnes tworzy pole magnetyczne, włączając przełącznik dla obwodu wyjściowego](../../../../../translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.pl.png) + +W przekaźniku obwód sterujący zasila elektromagnes. Gdy elektromagnes jest włączony, przyciąga dźwignię, która porusza przełącznik, zamykając parę styków i zamykając obwód wyjściowy. + +![Gdy wyłączony, elektromagnes nie tworzy pola magnetycznego, wyłączając przełącznik dla obwodu wyjściowego](../../../../../translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.pl.png) + +Gdy obwód sterujący jest wyłączony, elektromagnes wyłącza się, zwalniając dźwignię i otwierając styki, wyłączając obwód wyjściowy. Przekaźniki są cyfrowymi siłownikami - wysoki sygnał włącza przekaźnik, niski sygnał go wyłącza. + +Obwód wyjściowy może zasilać dodatkowy sprzęt, taki jak system nawadniania. Urządzenie IoT może włączyć przekaźnik, zamykając obwód wyjściowy, który zasila system nawadniania, a rośliny zostają podlane. Następnie urządzenie IoT może wyłączyć przekaźnik, odcinając zasilanie systemu nawadniania i wyłączając wodę. + +![Przekaźnik włączający pompę, która dostarcza wodę do rośliny](../../../../../images/strawberry-pump.gif) + +Na powyższym filmie przekaźnik jest włączany. Dioda LED na przekaźniku zapala się, wskazując, że jest włączony (niektóre płytki przekaźników mają diody LED wskazujące, czy przekaźnik jest włączony, czy wyłączony), a zasilanie jest przesyłane do pompy, która włącza się i pompuje wodę do rośliny. + +> 💁 Przekaźniki mogą być również używane do przełączania między dwoma obwodami wyjściowymi zamiast włączania i wyłączania jednego. Gdy dźwignia się porusza, przełącza obwód z jednego obwodu wyjściowego na inny, zwykle dzieląc wspólne zasilanie lub wspólną masę. + +✅ Zrób badania: Istnieje wiele typów przekaźników, różniących się np. tym, czy obwód sterujący włącza lub wyłącza przekaźnik po podaniu zasilania, lub liczbą obwodów wyjściowych. Dowiedz się więcej o tych różnych typach. + +Gdy dźwignia się porusza, zwykle można usłyszeć charakterystyczny klik, gdy styka się z elektromagnesem. + +> 💁 Przekaźnik można podłączyć w taki sposób, że połączenie faktycznie przerywa zasilanie przekaźnika, wyłączając go, co następnie ponownie wysyła zasilanie do przekaźnika, włączając go ponownie, i tak dalej. Oznacza to, że przekaźnik będzie klikał bardzo szybko, wydając dźwięk brzęczenia. W ten sposób działały niektóre z pierwszych brzęczyków używanych w dzwonkach elektrycznych. + +### Zasilanie przekaźnika + +Elektromagnes nie potrzebuje dużo mocy, aby się aktywować i przyciągnąć dźwignię, można go sterować za pomocą 3,3V lub 5V z urządzenia IoT. Obwód wyjściowy może przenosić znacznie większą moc, w zależności od przekaźnika, w tym napięcie sieciowe lub nawet wyższe poziomy mocy dla zastosowań przemysłowych. Dzięki temu zestaw IoT może sterować systemem nawadniania, od małej pompy dla pojedynczej rośliny, po ogromny system przemysłowy dla całej farmy komercyjnej. + +![Przekaźnik Grove z oznaczonym obwodem sterującym, obwodem wyjściowym i przekaźnikiem](../../../../../translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.pl.png) + +Na powyższym obrazie pokazano przekaźnik Grove. Obwód sterujący łączy się z urządzeniem IoT i włącza lub wyłącza przekaźnik za pomocą 3,3V lub 5V. Obwód wyjściowy ma dwa terminale, z których każdy może być zasilaniem lub masą. Obwód wyjściowy może obsługiwać do 250V przy 10A, co wystarcza dla szeregu urządzeń zasilanych z sieci. Można również znaleźć przekaźniki obsługujące jeszcze wyższe poziomy mocy. + +![Pompa podłączona przez przekaźnik](../../../../../translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.pl.png) + +Na powyższym obrazie zasilanie jest dostarczane do pompy przez przekaźnik. Czerwony przewód łączy terminal +5V zasilacza USB z jednym terminalem obwodu wyjściowego przekaźnika, a inny czerwony przewód łączy drugi terminal obwodu wyjściowego z pompą. Czarny przewód łączy pompę z masą zasilacza USB. Gdy przekaźnik się włącza, zamyka obwód, przesyłając 5V do pompy, włączając ją. + +## Sterowanie przekaźnikiem + +Możesz sterować przekaźnikiem za pomocą swojego zestawu IoT. + +### Zadanie - sterowanie przekaźnikiem + +Przejdź przez odpowiedni przewodnik, aby sterować przekaźnikiem za pomocą swojego urządzenia IoT: + +* [Arduino - Wio Terminal](wio-terminal-relay.md) +* [Komputer jednopłytkowy - Raspberry Pi](pi-relay.md) +* [Komputer jednopłytkowy - Wirtualne urządzenie](virtual-device-relay.md) + +## Sterowanie rośliną za pomocą MQTT + +Do tej pory przekaźnik był sterowany bezpośrednio przez urządzenie IoT na podstawie pojedynczego odczytu wilgotności gleby. W komercyjnym systemie nawadniania logika sterowania jest scentralizowana, co pozwala podejmować decyzje o podlewaniu na podstawie danych z wielu czujników i umożliwia zmianę konfiguracji w jednym miejscu. Aby to zasymulować, możesz sterować przekaźnikiem za pomocą MQTT. + +### Zadanie - sterowanie przekaźnikiem za pomocą MQTT + +1. Dodaj odpowiednie biblioteki MQTT/pakiety pip i kod do swojego projektu `soil-moisture-sensor`, aby połączyć się z MQTT. Nazwij identyfikator klienta jako `soilmoisturesensor_client` z prefiksem swojego ID. + + > ⚠️ Możesz odwołać się do [instrukcji dotyczących łączenia się z MQTT w projekcie 1, lekcja 4, jeśli to konieczne](../../../1-getting-started/lessons/4-connect-internet/README.md#connect-your-iot-device-to-mqtt). + +1. Dodaj odpowiedni kod urządzenia, aby wysyłać telemetrię z ustawieniami wilgotności gleby. Dla wiadomości telemetrii nazwij właściwość `soil_moisture`. + + > ⚠️ Możesz odwołać się do [instrukcji dotyczących wysyłania telemetrii do MQTT w projekcie 1, lekcja 4, jeśli to konieczne](../../../1-getting-started/lessons/4-connect-internet/README.md#send-telemetry-from-your-iot-device). + +1. Utwórz lokalny kod serwera, aby subskrybować telemetrię i wysyłać polecenie sterujące przekaźnikiem w folderze `soil-moisture-sensor-server`. Nazwij właściwość w wiadomości polecenia `relay_on`, a identyfikator klienta jako `soilmoisturesensor_server` z prefiksem swojego ID. Zachowaj tę samą strukturę, co kod serwera, który napisałeś w projekcie 1, lekcja 4, ponieważ będziesz dodawać do tego kodu później w tej lekcji. + + > ⚠️ Możesz odwołać się do [instrukcji dotyczących wysyłania telemetrii do MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#write-the-server-code) i [wysyłania poleceń przez MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#send-commands-to-the-mqtt-broker) w projekcie 1, lekcja 4, jeśli to konieczne. + +1. Dodaj odpowiedni kod urządzenia, aby sterować przekaźnikiem na podstawie odebranych poleceń, używając właściwości `relay_on` z wiadomości. Wyślij wartość true dla `relay_on`, jeśli `soil_moisture` jest większe niż 450, w przeciwnym razie wyślij false, zgodnie z logiką, którą dodałeś wcześniej dla urządzenia IoT. + + > ⚠️ Możesz odwołać się do [instrukcji dotyczących reagowania na polecenia z MQTT w projekcie 1, lekcja 4, jeśli to konieczne](../../../1-getting-started/lessons/4-connect-internet/README.md#handle-commands-on-the-iot-device). + +> 💁 Kod znajdziesz w folderze [code-mqtt](../../../../../2-farm/lessons/3-automated-plant-watering/code-mqtt). + +Upewnij się, że kod działa na twoim urządzeniu i lokalnym serwerze, i przetestuj go, zmieniając poziomy wilgotności gleby, albo zmieniając wartości wysyłane przez wirtualny czujnik, albo zmieniając poziomy wilgotności gleby, dodając wodę lub usuwając czujnik z gleby. + +## Czas reakcji czujników i siłowników + +W lekcji 3 zbudowałeś lampkę nocną - diodę LED, która włącza się, gdy czujnik światła wykryje niski poziom światła. Czujnik światła wykrywał zmiany poziomu światła natychmiast, a urządzenie mogło szybko reagować, ograniczone jedynie długością opóźnienia w funkcji `loop` lub pętli `while True:`. Jako programista IoT, nie zawsze możesz polegać na tak szybkim sprzężeniu zwrotnym. + +### Czas reakcji dla wilgotności gleby + +Jeśli wykonałeś poprzednią lekcję dotyczącą wilgotności gleby za pomocą fizycznego czujnika, zauważyłeś, że odczyt wilgotności gleby spadał przez kilka sekund po podlaniu rośliny. Nie wynika to z powolności czujnika, lecz z czasu, jaki woda potrzebuje, aby wsiąknąć w glebę. +💁 Jeśli podlewałeś zbyt blisko czujnika, mogłeś zauważyć szybki spadek odczytu, a następnie jego powrót do poprzedniego poziomu - dzieje się tak, ponieważ woda w pobliżu czujnika rozprzestrzenia się w pozostałej części gleby, zmniejszając wilgotność gleby w okolicy czujnika. +![Pomiar wilgotności gleby wynoszący 658 nie zmienia się podczas podlewania, spada dopiero do 320 po podlewaniu, gdy woda przesiąknie przez glebę](../../../../../translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.pl.png) + +Na powyższym diagramie odczyt wilgotności gleby wynosi 658. Roślina jest podlewana, ale odczyt ten nie zmienia się od razu, ponieważ woda jeszcze nie dotarła do czujnika. Podlewanie może nawet zakończyć się, zanim woda dotrze do czujnika, a wartość spadnie, odzwierciedlając nowy poziom wilgotności. + +Jeśli pisałbyś kod do sterowania systemem nawadniania za pomocą przekaźnika na podstawie poziomów wilgotności gleby, musiałbyś uwzględnić to opóźnienie i wprowadzić inteligentniejsze sterowanie czasem w swoim urządzeniu IoT. + +✅ Zastanów się, jak mógłbyś to zrobić. + +### Sterowanie czasem czujnika i aktuatora + +Wyobraź sobie, że masz za zadanie zbudować system nawadniania dla farmy. Na podstawie rodzaju gleby idealny poziom wilgotności dla uprawianych roślin odpowiada analogowemu odczytowi napięcia w zakresie 400-450. + +Możesz zaprogramować urządzenie w taki sam sposób jak lampkę nocną – za każdym razem, gdy czujnik odczytuje wartość powyżej 450, włącz przekaźnik, aby uruchomić pompę. Problem polega na tym, że woda potrzebuje czasu, aby dotrzeć z pompy przez glebę do czujnika. Czujnik zatrzyma wodę, gdy wykryje poziom 450, ale poziom wilgotności będzie nadal spadał, ponieważ pompowana woda wciąż przesiąka przez glebę. W efekcie marnuje się woda, a korzenie roślin są narażone na uszkodzenie. + +✅ Pamiętaj – zbyt dużo wody może być równie szkodliwe dla roślin, co jej niedobór, a dodatkowo marnuje cenny zasób. + +Lepszym rozwiązaniem jest zrozumienie, że istnieje opóźnienie między włączeniem aktuatora a zmianą właściwości odczytywanej przez czujnik. Oznacza to, że nie tylko czujnik powinien poczekać chwilę przed ponownym pomiarem wartości, ale także aktuator musi być wyłączony na jakiś czas przed kolejnym pomiarem czujnika. + +Jak długo przekaźnik powinien być włączony za każdym razem? Lepiej być ostrożnym i włączać przekaźnik na krótki czas, a następnie poczekać, aż woda przesiąknie, i ponownie sprawdzić poziom wilgotności. W końcu zawsze można włączyć pompę ponownie, aby dodać więcej wody, ale nie można usunąć wody z gleby. + +> 💁 Tego rodzaju sterowanie czasem jest bardzo specyficzne dla urządzenia IoT, które budujesz, właściwości, którą mierzysz, oraz używanych czujników i aktuatorów. + +![Roślina truskawki podłączona do wody za pomocą pompy, z pompą podłączoną do przekaźnika. Przekaźnik i czujnik wilgotności gleby w roślinie są podłączone do Raspberry Pi](../../../../../translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.pl.png) + +Na przykład mam roślinę truskawki z czujnikiem wilgotności gleby i pompą sterowaną przekaźnikiem. Zauważyłem, że gdy dodaję wodę, potrzeba około 20 sekund, aby odczyt wilgotności gleby się ustabilizował. Oznacza to, że muszę wyłączyć przekaźnik i poczekać 20 sekund przed sprawdzeniem poziomu wilgotności. Wolę mieć za mało wody niż za dużo – zawsze mogę włączyć pompę ponownie, ale nie mogę usunąć wody z rośliny. + +![Krok 1: wykonaj pomiar. Krok 2: dodaj wodę. Krok 3: poczekaj, aż woda przesiąknie przez glebę. Krok 4: wykonaj ponowny pomiar](../../../../../translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.pl.png) + +Oznacza to, że najlepszy proces podlewania wyglądałby mniej więcej tak: + +* Włącz pompę na 5 sekund +* Poczekaj 20 sekund +* Sprawdź wilgotność gleby +* Jeśli poziom nadal jest powyżej wymaganego, powtórz powyższe kroki + +5 sekund może być zbyt długim czasem dla pompy, szczególnie jeśli poziom wilgotności jest tylko nieznacznie powyżej wymaganego poziomu. Najlepszym sposobem na ustalenie odpowiedniego czasu jest wypróbowanie, a następnie dostosowanie na podstawie danych z czujnika, z ciągłym cyklem sprzężenia zwrotnego. Może to nawet prowadzić do bardziej precyzyjnego sterowania czasem, na przykład włączania pompy na 1 sekundę za każde 100 powyżej wymaganego poziomu wilgotności gleby, zamiast stałych 5 sekund. + +✅ Zrób badania: Czy istnieją inne kwestie związane z czasem? Czy roślinę można podlewać w dowolnym momencie, gdy wilgotność gleby jest zbyt niska, czy są określone pory dnia, które są dobre lub złe do podlewania roślin? + +> 💁 Prognozy pogody również mogą być brane pod uwagę przy sterowaniu automatycznymi systemami nawadniania na zewnątrz. Jeśli spodziewany jest deszcz, podlewanie można wstrzymać do czasu jego zakończenia. Wtedy gleba może być wystarczająco wilgotna, aby nie wymagała podlewania, co jest znacznie bardziej efektywne niż marnowanie wody przez podlewanie tuż przed deszczem. + +## Dodaj sterowanie czasem do serwera kontrolującego rośliny + +Kod serwera można zmodyfikować, aby dodać kontrolę nad czasem cyklu podlewania i oczekiwaniem na zmianę poziomów wilgotności gleby. Logika serwera kontrolująca czas przekaźnika wygląda następująco: + +1. Odebrano wiadomość telemetryczną +1. Sprawdź poziom wilgotności gleby +1. Jeśli jest w porządku, nic nie rób. Jeśli odczyt jest zbyt wysoki (co oznacza, że wilgotność gleby jest zbyt niska), to: + 1. Wyślij polecenie włączenia przekaźnika + 1. Poczekaj 5 sekund + 1. Wyślij polecenie wyłączenia przekaźnika + 1. Poczekaj 20 sekund, aby poziomy wilgotności gleby się ustabilizowały + +Cykl podlewania, proces od odebrania wiadomości telemetrycznej do gotowości do ponownego przetwarzania poziomów wilgotności gleby, trwa około 25 sekund. Wysyłamy poziomy wilgotności gleby co 10 sekund, więc istnieje nakładanie się, gdzie wiadomość jest odbierana, podczas gdy serwer czeka na stabilizację poziomów wilgotności gleby, co może rozpocząć kolejny cykl podlewania. + +Istnieją dwa rozwiązania tego problemu: + +* Zmień kod urządzenia IoT, aby wysyłał telemetrię co minutę, dzięki czemu cykl podlewania zostanie zakończony przed wysłaniem kolejnej wiadomości +* Wyłącz subskrypcję telemetrii podczas cyklu podlewania + +Pierwsza opcja nie zawsze jest dobrym rozwiązaniem dla dużych farm. Rolnik może chcieć rejestrować poziomy wilgotności gleby podczas podlewania, aby później je analizować, na przykład aby być świadomym przepływu wody w różnych obszarach farmy i kierować bardziej precyzyjnym podlewaniem. Druga opcja jest lepsza – kod po prostu ignoruje telemetrię, gdy nie może jej użyć, ale telemetria nadal jest dostępna dla innych usług, które mogą ją subskrybować. + +> 💁 Dane IoT nie są wysyłane tylko z jednego urządzenia do jednej usługi, zamiast tego wiele urządzeń może wysyłać dane do brokera, a wiele usług może odbierać dane z brokera. Na przykład jedna usługa może odbierać dane o wilgotności gleby i przechowywać je w bazie danych do późniejszej analizy. Inna usługa może również odbierać tę samą telemetrię, aby sterować systemem nawadniania. + +### Zadanie - dodaj sterowanie czasem do serwera kontrolującego rośliny + +Zaktualizuj kod serwera, aby uruchamiał przekaźnik na 5 sekund, a następnie czekał 20 sekund. + +1. Otwórz folder `soil-moisture-sensor-server` w VS Code, jeśli nie jest już otwarty. Upewnij się, że środowisko wirtualne jest aktywowane. + +1. Otwórz plik `app.py` + +1. Dodaj poniższy kod do pliku `app.py` poniżej istniejących importów: + + ```python + import threading + ``` + + Ten kod importuje `threading` z bibliotek Pythona, co pozwala na wykonywanie innych kodów podczas oczekiwania. + +1. Dodaj poniższy kod przed funkcją `handle_telemetry`, która obsługuje wiadomości telemetryczne odbierane przez kod serwera: + + ```python + water_time = 5 + wait_time = 20 + ``` + + To definiuje, jak długo uruchamiać przekaźnik (`water_time`) i jak długo czekać po tym, aby sprawdzić wilgotność gleby (`wait_time`). + +1. Poniżej tego kodu dodaj następujący fragment: + + ```python + def send_relay_command(client, state): + command = { 'relay_on' : state } + print("Sending message:", command) + client.publish(server_command_topic, json.dumps(command)) + ``` + + Ten kod definiuje funkcję `send_relay_command`, która wysyła polecenie przez MQTT do sterowania przekaźnikiem. Telemetria jest tworzona jako słownik, a następnie konwertowana na ciąg JSON. Wartość przekazana do `state` określa, czy przekaźnik powinien być włączony czy wyłączony. + +1. Po funkcji `send_relay_code` dodaj następujący kod: + + ```python + def control_relay(client): + print("Unsubscribing from telemetry") + mqtt_client.unsubscribe(client_telemetry_topic) + + send_relay_command(client, True) + time.sleep(water_time) + send_relay_command(client, False) + + time.sleep(wait_time) + + print("Subscribing to telemetry") + mqtt_client.subscribe(client_telemetry_topic) + ``` + + Ten kod definiuje funkcję do sterowania przekaźnikiem na podstawie wymaganego czasu. Zaczyna od wyłączenia subskrypcji telemetrii, aby wiadomości o wilgotności gleby nie były przetwarzane podczas podlewania. Następnie wysyła polecenie włączenia przekaźnika. Potem czeka przez `water_time`, zanim wyśle polecenie wyłączenia przekaźnika. Na końcu czeka przez `wait_time`, aby poziomy wilgotności gleby się ustabilizowały, a następnie ponownie subskrybuje telemetrię. + +1. Zmień funkcję `handle_telemetry` na następującą: + + ```python + def handle_telemetry(client, userdata, message): + payload = json.loads(message.payload.decode()) + print("Message received:", payload) + + if payload['soil_moisture'] > 450: + threading.Thread(target=control_relay, args=(client,)).start() + ``` + + Ten kod sprawdza poziom wilgotności gleby. Jeśli jest większy niż 450, gleba wymaga podlewania, więc wywołuje funkcję `control_relay`. Ta funkcja jest uruchamiana w osobnym wątku, działającym w tle. + +1. Upewnij się, że Twoje urządzenie IoT działa, a następnie uruchom ten kod. Zmień poziomy wilgotności gleby i obserwuj, co dzieje się z przekaźnikiem – powinien włączać się na 5 sekund, a następnie pozostawać wyłączony przez co najmniej 20 sekund, włączając się tylko wtedy, gdy poziomy wilgotności gleby są niewystarczające. + + ```output + (.venv) ➜ soil-moisture-sensor-server ✗ python app.py + Message received: {'soil_moisture': 457} + Unsubscribing from telemetry + Sending message: {'relay_on': True} + Sending message: {'relay_on': False} + Subscribing to telemetry + Message received: {'soil_moisture': 302} + ``` + + Dobrym sposobem na przetestowanie tego w symulowanym systemie nawadniania jest użycie suchej gleby, a następnie ręczne dolewanie wody podczas włączonego przekaźnika, zatrzymując dolewanie, gdy przekaźnik się wyłącza. + +> 💁 Ten kod znajdziesz w folderze [code-timing](../../../../../2-farm/lessons/3-automated-plant-watering/code-timing). + +> 💁 Jeśli chcesz użyć pompy do zbudowania prawdziwego systemu nawadniania, możesz użyć [6V mini pompy wodnej](https://www.seeedstudio.com/6V-Mini-Water-Pump-p-1945.html) z [zasilaczem USB](https://www.adafruit.com/product/3628). Upewnij się, że zasilanie do lub z pompy jest podłączone przez przekaźnik. + +--- + +## 🚀 Wyzwanie + +Czy możesz pomyśleć o innych urządzeniach IoT lub elektrycznych, które mają podobny problem, gdzie potrzeba czasu, aby wyniki aktuatora dotarły do czujnika? Prawdopodobnie masz kilka w swoim domu lub szkole. + +* Jakie właściwości mierzą? +* Jak długo trwa zmiana właściwości po użyciu aktuatora? +* Czy jest w porządku, jeśli właściwość zmienia się poza wymagany poziom? +* Jak można ją przywrócić do wymaganego poziomu, jeśli zajdzie taka potrzeba? + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/14) + +## Przegląd i samodzielna nauka + +* Przeczytaj więcej o przekaźnikach, w tym o ich historycznym zastosowaniu w centralach telefonicznych, na [stronie Wikipedii o przekaźnikach](https://wikipedia.org/wiki/Relay). + +## Zadanie + +[Zbuduj bardziej efektywny cykl podlewania](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/3-automated-plant-watering/assignment.md b/translations/pl/2-farm/lessons/3-automated-plant-watering/assignment.md new file mode 100644 index 00000000..5ed8337f --- /dev/null +++ b/translations/pl/2-farm/lessons/3-automated-plant-watering/assignment.md @@ -0,0 +1,52 @@ + +# Stwórz bardziej efektywny cykl nawadniania + +## Instrukcje + +W tej lekcji omówiono, jak sterować przekaźnikiem za pomocą danych z czujnika, a ten przekaźnik może z kolei sterować pompą w systemie nawadniania. Dla określonej objętości gleby uruchomienie pompy na ustalony czas powinno zawsze mieć taki sam wpływ na wilgotność gleby. Oznacza to, że możesz oszacować, ile sekund nawadniania odpowiada określonemu spadkowi odczytu wilgotności gleby. Korzystając z tych danych, możesz zbudować bardziej kontrolowany system nawadniania. + +W tym zadaniu obliczysz, jak długo pompa powinna działać, aby osiągnąć określony wzrost wilgotności gleby. + +> ⚠️ Jeśli używasz wirtualnego sprzętu IoT, możesz przejść przez ten proces, ale zasymuluj wyniki, ręcznie zwiększając odczyt wilgotności gleby o stałą wartość na sekundę, gdy przekaźnik jest włączony. + +1. Zacznij od suchej gleby. Zmierz wilgotność gleby. + +1. Dodaj stałą ilość wody, albo uruchamiając pompę na 1 sekundę, albo wlewając określoną ilość wody. + + > Pompa powinna zawsze działać z stałą wydajnością, więc każda sekunda jej pracy powinna dostarczać taką samą ilość wody. + +1. Poczekaj, aż poziom wilgotności gleby się ustabilizuje, i wykonaj odczyt. + +1. Powtórz ten proces kilkukrotnie i stwórz tabelę wyników. Przykład takiej tabeli znajduje się poniżej. + + | Całkowity czas pracy pompy | Wilgotność gleby | Spadek | + | --- | --: | -: | + | Sucha | 643 | 0 | + | 1s | 621 | 22 | + | 2s | 601 | 20 | + | 3s | 579 | 22 | + | 4s | 560 | 19 | + | 5s | 539 | 21 | + | 6s | 521 | 18 | + +1. Oblicz średni wzrost wilgotności gleby na sekundę pracy pompy. W powyższym przykładzie każda sekunda pracy pompy zmniejsza odczyt średnio o 20,3. + +1. Wykorzystaj te dane, aby poprawić efektywność kodu serwera, uruchamiając pompę na wymagany czas, aby osiągnąć potrzebny poziom wilgotności gleby. + +## Kryteria oceny + +| Kryteria | Wzorowe | Wystarczające | Wymaga poprawy | +| -------- | --------- | -------- | ----------------- | +| Zbieranie danych o wilgotności gleby | Potrafi zebrać wiele odczytów po dodaniu stałych ilości wody | Potrafi zebrać kilka odczytów przy użyciu stałych ilości wody | Potrafi zebrać tylko jeden lub dwa odczyty albo nie potrafi użyć stałych ilości wody | +| Kalibracja kodu serwera | Potrafi obliczyć średni spadek odczytu wilgotności gleby i zaktualizować kod serwera, aby to uwzględnić | Potrafi obliczyć średni spadek, ale nie potrafi zaktualizować kodu serwera, lub nie potrafi poprawnie obliczyć średniej, ale używa tej wartości do poprawnej aktualizacji kodu serwera | Nie potrafi obliczyć średniej ani zaktualizować kodu serwera | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/3-automated-plant-watering/pi-relay.md b/translations/pl/2-farm/lessons/3-automated-plant-watering/pi-relay.md new file mode 100644 index 00000000..a191a6b0 --- /dev/null +++ b/translations/pl/2-farm/lessons/3-automated-plant-watering/pi-relay.md @@ -0,0 +1,121 @@ + +# Sterowanie przekaźnikiem - Raspberry Pi + +W tej części lekcji dodasz przekaźnik do swojego Raspberry Pi, oprócz czujnika wilgotności gleby, i będziesz nim sterować na podstawie poziomu wilgotności gleby. + +## Sprzęt + +Raspberry Pi potrzebuje przekaźnika. + +Przekaźnik, którego użyjesz, to [Grove relay](https://www.seeedstudio.com/Grove-Relay.html), przekaźnik normalnie otwarty (oznacza to, że obwód wyjściowy jest otwarty lub odłączony, gdy nie jest wysyłany sygnał do przekaźnika), który obsługuje obwody wyjściowe do 250V i 10A. + +Jest to cyfrowy aktuator, więc podłącza się go do cyfrowego pinu na Grove Base Hat. + +### Podłącz przekaźnik + +Przekaźnik Grove można podłączyć do Raspberry Pi. + +#### Zadanie + +Podłącz przekaźnik. + +![Przekaźnik Grove](../../../../../translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.pl.png) + +1. Włóż jeden koniec kabla Grove do gniazda w przekaźniku. Kabel wejdzie tylko w jednym kierunku. + +1. Przy wyłączonym Raspberry Pi podłącz drugi koniec kabla Grove do cyfrowego gniazda oznaczonego **D5** na Grove Base Hat zamontowanym na Pi. To gniazdo znajduje się drugie od lewej, w rzędzie gniazd obok pinów GPIO. Pozostaw czujnik wilgotności gleby podłączony do gniazda **A0**. + +![Przekaźnik Grove podłączony do gniazda D5, a czujnik wilgotności gleby podłączony do gniazda A0](../../../../../translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.pl.png) + +1. Włóż czujnik wilgotności gleby do gleby, jeśli nie jest już tam z poprzedniej lekcji. + +## Programowanie przekaźnika + +Raspberry Pi można teraz zaprogramować do obsługi podłączonego przekaźnika. + +### Zadanie + +Zaprogramuj urządzenie. + +1. Włącz Raspberry Pi i poczekaj, aż się uruchomi. + +1. Otwórz projekt `soil-moisture-sensor` z poprzedniej lekcji w VS Code, jeśli nie jest już otwarty. Będziesz dodawać kod do tego projektu. + +1. Dodaj poniższy kod do pliku `app.py` poniżej istniejących importów: + + ```python + from grove.grove_relay import GroveRelay + ``` + + Ten kod importuje `GroveRelay` z bibliotek Python Grove, aby umożliwić interakcję z przekaźnikiem Grove. + +1. Dodaj poniższy kod poniżej deklaracji klasy `ADC`, aby utworzyć instancję `GroveRelay`: + + ```python + relay = GroveRelay(5) + ``` + + Ten kod tworzy przekaźnik używając pinu **D5**, cyfrowego pinu, do którego podłączyłeś przekaźnik. + +1. Aby przetestować działanie przekaźnika, dodaj poniższy kod do pętli `while True:`: + + ```python + relay.on() + time.sleep(.5) + relay.off() + ``` + + Kod włącza przekaźnik, czeka 0,5 sekundy, a następnie wyłącza przekaźnik. + +1. Uruchom aplikację w Pythonie. Przekaźnik będzie włączał się i wyłączał co 10 sekund, z półsekundowym opóźnieniem między włączeniem a wyłączeniem. Usłyszysz kliknięcie przekaźnika przy włączaniu i wyłączaniu. Dioda LED na płytce Grove zapali się, gdy przekaźnik jest włączony, a zgaśnie, gdy jest wyłączony. + + ![Przekaźnik włączający się i wyłączający](../../../../../images/relay-turn-on-off.gif) + +## Sterowanie przekaźnikiem na podstawie wilgotności gleby + +Teraz, gdy przekaźnik działa, można nim sterować w odpowiedzi na odczyty wilgotności gleby. + +### Zadanie + +Steruj przekaźnikiem. + +1. Usuń 3 linie kodu, które dodałeś do testowania przekaźnika. Zastąp je poniższym kodem: + + ```python + if soil_moisture > 450: + print("Soil Moisture is too low, turning relay on.") + relay.on() + else: + print("Soil Moisture is ok, turning relay off.") + relay.off() + ``` + + Ten kod sprawdza poziom wilgotności gleby z czujnika wilgotności gleby. Jeśli poziom wilgotności jest powyżej 450, włącza przekaźnik, a wyłącza go, gdy poziom spada poniżej 450. + + > 💁 Pamiętaj, że pojemnościowy czujnik wilgotności gleby odczytuje: im niższy poziom wilgotności gleby, tym więcej wilgoci znajduje się w glebie i odwrotnie. + +1. Uruchom aplikację w Pythonie. Zobaczysz, jak przekaźnik włącza się lub wyłącza w zależności od poziomu wilgotności gleby. Wypróbuj w suchej glebie, a następnie dodaj wodę. + + ```output + Soil Moisture: 638 + Soil Moisture is too low, turning relay on. + Soil Moisture: 452 + Soil Moisture is too low, turning relay on. + Soil Moisture: 347 + Soil Moisture is ok, turning relay off. + ``` + +> 💁 Ten kod znajdziesz w folderze [code-relay/pi](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/pi). + +😀 Twój program sterujący przekaźnikiem na podstawie czujnika wilgotności gleby zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md b/translations/pl/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md new file mode 100644 index 00000000..2649bb98 --- /dev/null +++ b/translations/pl/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md @@ -0,0 +1,125 @@ + +# Sterowanie przekaźnikiem - Wirtualny sprzęt IoT + +W tej części lekcji dodasz przekaźnik do swojego wirtualnego urządzenia IoT, oprócz czujnika wilgotności gleby, i będziesz nim sterować w zależności od poziomu wilgotności gleby. + +## Wirtualny sprzęt + +Wirtualne urządzenie IoT będzie korzystać z symulowanego przekaźnika Grove. Dzięki temu laboratorium pozostaje takie samo, jak w przypadku użycia Raspberry Pi z fizycznym przekaźnikiem Grove. + +W fizycznym urządzeniu IoT przekaźnik byłby przekaźnikiem normalnie otwartym (co oznacza, że obwód wyjściowy jest otwarty lub rozłączony, gdy nie jest wysyłany sygnał do przekaźnika). Taki przekaźnik może obsługiwać obwody wyjściowe do 250V i 10A. + +### Dodanie przekaźnika do CounterFit + +Aby użyć wirtualnego przekaźnika, musisz dodać go do aplikacji CounterFit. + +#### Zadanie + +Dodaj przekaźnik do aplikacji CounterFit. + +1. Otwórz projekt `soil-moisture-sensor` z poprzedniej lekcji w VS Code, jeśli nie jest jeszcze otwarty. Będziesz dodawać do tego projektu. + +1. Upewnij się, że aplikacja webowa CounterFit jest uruchomiona. + +1. Utwórz przekaźnik: + + 1. W polu *Create actuator* w panelu *Actuators* rozwiń pole *Actuator type* i wybierz *Relay*. + + 1. Ustaw *Pin* na *5*. + + 1. Wybierz przycisk **Add**, aby utworzyć przekaźnik na Pinie 5. + + ![Ustawienia przekaźnika](../../../../../translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.pl.png) + + Przekaźnik zostanie utworzony i pojawi się na liście aktuatorów. + + ![Utworzony przekaźnik](../../../../../translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.pl.png) + +## Programowanie przekaźnika + +Aplikacja czujnika wilgotności gleby może teraz zostać zaprogramowana do korzystania z wirtualnego przekaźnika. + +### Zadanie + +Zaprogramuj wirtualne urządzenie. + +1. Otwórz projekt `soil-moisture-sensor` z poprzedniej lekcji w VS Code, jeśli nie jest jeszcze otwarty. Będziesz dodawać do tego projektu. + +1. Dodaj poniższy kod do pliku `app.py` poniżej istniejących importów: + + ```python + from counterfit_shims_grove.grove_relay import GroveRelay + ``` + + Ten kod importuje `GroveRelay` z bibliotek Grove Python shim, aby umożliwić interakcję z wirtualnym przekaźnikiem Grove. + +1. Dodaj poniższy kod poniżej deklaracji klasy `ADC`, aby utworzyć instancję `GroveRelay`: + + ```python + relay = GroveRelay(5) + ``` + + Tworzy to przekaźnik używający pinu **5**, do którego podłączyłeś przekaźnik. + +1. Aby przetestować działanie przekaźnika, dodaj poniższy kod do pętli `while True:`: + + ```python + relay.on() + time.sleep(.5) + relay.off() + ``` + + Kod włącza przekaźnik, czeka 0,5 sekundy, a następnie wyłącza przekaźnik. + +1. Uruchom aplikację w Pythonie. Przekaźnik będzie włączał się i wyłączał co 10 sekund, z półsekundowym opóźnieniem między włączeniem a wyłączeniem. Zobaczysz, jak wirtualny przekaźnik w aplikacji CounterFit zamyka się i otwiera, gdy przekaźnik jest włączany i wyłączany. + + ![Wirtualny przekaźnik włączający się i wyłączający](../../../../../images/virtual-relay-turn-on-off.gif) + +## Sterowanie przekaźnikiem na podstawie wilgotności gleby + +Teraz, gdy przekaźnik działa, można nim sterować w odpowiedzi na odczyty wilgotności gleby. + +### Zadanie + +Steruj przekaźnikiem. + +1. Usuń 3 linie kodu, które dodałeś do testowania przekaźnika. Zastąp je poniższym kodem: + + ```python + if soil_moisture > 450: + print("Soil Moisture is too low, turning relay on.") + relay.on() + else: + print("Soil Moisture is ok, turning relay off.") + relay.off() + ``` + + Ten kod sprawdza poziom wilgotności gleby z czujnika wilgotności. Jeśli poziom jest powyżej 450, włącza przekaźnik, a jeśli spada poniżej 450, wyłącza go. + + > 💁 Pamiętaj, że pojemnościowy czujnik wilgotności gleby odczytuje: im niższy poziom wilgotności gleby, tym więcej wilgoci znajduje się w glebie i odwrotnie. + +1. Uruchom aplikację w Pythonie. Zobaczysz, jak przekaźnik włącza się lub wyłącza w zależności od poziomów wilgotności gleby. Zmień ustawienia *Value* lub *Random* dla czujnika wilgotności gleby, aby zobaczyć zmiany wartości. + + ```output + Soil Moisture: 638 + Soil Moisture is too low, turning relay on. + Soil Moisture: 452 + Soil Moisture is too low, turning relay on. + Soil Moisture: 347 + Soil Moisture is ok, turning relay off. + ``` + +> 💁 Ten kod znajdziesz w folderze [code-relay/virtual-device](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/virtual-device). + +😀 Twój program wirtualnego czujnika wilgotności gleby sterujący przekaźnikiem zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md b/translations/pl/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md new file mode 100644 index 00000000..f3747468 --- /dev/null +++ b/translations/pl/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md @@ -0,0 +1,23 @@ + +# Sterowanie przekaźnikiem - Wio Terminal + +W tej części lekcji dodasz przekaźnik do swojego Wio Terminal, oprócz czujnika wilgotności gleby, i będziesz nim sterować na podstawie poziomu wilgotności gleby. + +## Sprzęt + +Wio Terminal potrzebuje przekaźnika. + +Przekaźnik, którego użyjesz, to [Grove relay](https://www.seeedstudio.com/Grove-Relay.html), przekaźnik normalnie otwarty (oznacza to, że obwód wyjściowy jest otwarty lub odłączony, gdy nie jest wysyłany sygnał do przekaźnika), który obsługuje obwody wyjściowe do 250V i 10A. + +Jest to cyfrowy aktuator, więc podłącza się go do cyfrowych pinów w Wio Terminal. Połączony port analogowo-cyfrowy jest już używany przez czujnik wilgotności gleby, więc przekaźnik podłącza się do drugiego portu, który jest połączonym portem I + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md b/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md new file mode 100644 index 00000000..0532750c --- /dev/null +++ b/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md @@ -0,0 +1,449 @@ + +# Przenieś swoją roślinę do chmury + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obraz, aby zobaczyć większą wersję. + +Ta lekcja była częścią [Projektu IoT dla początkujących 2 - Cyfrowe rolnictwo](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) realizowanego przez [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Połącz swoje urządzenie z chmurą za pomocą Azure IoT Hub](https://img.youtube.com/vi/bNxjopXkhvk/0.jpg)](https://youtu.be/bNxjopXkhvk) + +## Quiz przed lekcją + +[Quiz przed lekcją](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/15) + +## Wprowadzenie + +W poprzedniej lekcji nauczyłeś się, jak połączyć swoją roślinę z brokerem MQTT i sterować przekaźnikiem za pomocą kodu serwera uruchomionego lokalnie. To stanowi podstawę internetowego, zautomatyzowanego systemu nawadniania, który może być stosowany zarówno w przypadku pojedynczych roślin w domu, jak i na komercyjnych farmach. + +Urządzenie IoT komunikowało się z publicznym brokerem MQTT, aby zademonstrować zasady działania, ale nie jest to najbardziej niezawodny ani bezpieczny sposób. W tej lekcji dowiesz się o chmurze i możliwościach IoT oferowanych przez publiczne usługi chmurowe. Nauczysz się również, jak przenieść swoją roślinę z publicznego brokera MQTT do jednej z tych usług chmurowych. + +W tej lekcji omówimy: + +* [Czym jest chmura?](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Tworzenie subskrypcji chmurowej](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Usługi IoT w chmurze](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Tworzenie usługi IoT w chmurze](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Komunikacja z IoT Hub](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Łączenie urządzenia z usługą IoT](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) + +## Czym jest chmura? + +Przed pojawieniem się chmury, firmy, które chciały zapewnić usługi swoim pracownikom (np. bazy danych czy przechowywanie plików) lub klientom (np. strony internetowe), musiały budować i zarządzać własnymi centrami danych. Mogło to być małe pomieszczenie z kilkoma komputerami lub cały budynek pełen sprzętu. Firma musiała zarządzać wszystkim, w tym: + +* Zakupem komputerów +* Konserwacją sprzętu +* Zasilaniem i chłodzeniem +* Siecią +* Bezpieczeństwem, w tym ochroną budynku i oprogramowania +* Instalacją i aktualizacją oprogramowania + +Było to bardzo kosztowne, wymagało szerokiego zakresu umiejętności od pracowników i było powolne w dostosowywaniu się do zmian. Na przykład, jeśli sklep internetowy chciał przygotować się na intensywny sezon świąteczny, musiał planować z dużym wyprzedzeniem, aby zakupić więcej sprzętu, skonfigurować go i zainstalować odpowiednie oprogramowanie. Po zakończeniu sezonu świątecznego, gdy sprzedaż spadała, sprzęt pozostawał niewykorzystany do kolejnego szczytu. + +✅ Czy uważasz, że taki model pozwalał firmom działać szybko? Jeśli sklep odzieżowy nagle zyskałby popularność dzięki celebrycie noszącemu ich ubrania, czy byłby w stanie szybko zwiększyć moc obliczeniową, aby obsłużyć nagły wzrost zamówień? + +### Komputer kogoś innego + +Chmura jest często żartobliwie nazywana „komputerem kogoś innego”. Początkowy pomysł był prosty - zamiast kupować komputery, wynajmujesz je od kogoś innego. Dostawca usług chmurowych zarządza ogromnymi centrami danych. To on odpowiada za zakup i instalację sprzętu, zarządzanie zasilaniem i chłodzeniem, siecią, bezpieczeństwem budynku, aktualizacjami sprzętu i oprogramowania. Jako klient wynajmujesz potrzebne komputery, zwiększając ich liczbę w razie wzrostu zapotrzebowania i zmniejszając, gdy zapotrzebowanie spada. Centra danych chmurowych znajdują się na całym świecie. + +![Centrum danych Microsoft w chmurze](../../../../../translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.pl.png) +![Planowana rozbudowa centrum danych Microsoft w chmurze](../../../../../translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.pl.png) + +Te centra danych mogą zajmować powierzchnię kilku kilometrów kwadratowych. Powyższe zdjęcia przedstawiają centrum danych Microsoft sprzed kilku lat, pokazując jego początkowy rozmiar oraz planowaną rozbudowę. Obszar przeznaczony na rozbudowę ma ponad 5 kilometrów kwadratowych. + +> 💁 Te centra danych zużywają tak dużo energii, że niektóre mają własne elektrownie. Ze względu na swoją skalę i poziom inwestycji dostawców chmurowych, są one zazwyczaj bardzo przyjazne dla środowiska. Są bardziej efektywne niż wiele małych centrów danych, działają głównie na odnawialnych źródłach energii, a dostawcy chmur ciężko pracują, aby zmniejszyć ilość odpadów, ograniczyć zużycie wody i sadzić lasy w miejsce tych wyciętych pod budowę centrów danych. Więcej o działaniach na rzecz zrównoważonego rozwoju jednego z dostawców chmury możesz przeczytać na [stronie Azure o zrównoważonym rozwoju](https://azure.microsoft.com/global-infrastructure/sustainability/?WT.mc_id=academic-17441-jabenn). + +✅ Zrób badania: Przeczytaj o głównych dostawcach chmur, takich jak [Azure od Microsoft](https://azure.microsoft.com/?WT.mc_id=academic-17441-jabenn) czy [GCP od Google](https://cloud.google.com). Ile mają centrów danych i gdzie się znajdują? + +Korzystanie z chmury obniża koszty dla firm i pozwala im skupić się na tym, co robią najlepiej, pozostawiając zarządzanie chmurą w rękach dostawcy. Firmy nie muszą już wynajmować lub kupować przestrzeni w centrach danych, płacić różnym dostawcom za łączność i energię ani zatrudniać ekspertów. Zamiast tego płacą jedną miesięczną fakturę dostawcy chmury, który zajmuje się wszystkim. + +Dostawca chmury może wykorzystać efekt skali, aby obniżyć koszty, kupując sprzęt hurtowo po niższych cenach, inwestując w narzędzia zmniejszające nakład pracy związany z konserwacją, a nawet projektując i budując własny sprzęt, aby ulepszyć swoją ofertę chmurową. + +### Microsoft Azure + +Azure to chmura dla programistów od Microsoft, której będziesz używać w tych lekcjach. Poniższy film przedstawia krótki przegląd Azure: + +[![Film o Azure](../../../../../translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.pl.png)](https://www.microsoft.com/videoplayer/embed/RE4Ibng?WT.mc_id=academic-17441-jabenn) + +## Tworzenie subskrypcji chmurowej + +Aby korzystać z usług w chmurze, musisz założyć subskrypcję u dostawcy chmury. W tej lekcji założysz subskrypcję Microsoft Azure. Jeśli już masz subskrypcję Azure, możesz pominąć to zadanie. Szczegóły subskrypcji opisane tutaj są aktualne w momencie pisania, ale mogą ulec zmianie. + +> 💁 Jeśli korzystasz z tych lekcji w ramach szkoły, możesz już mieć dostęp do subskrypcji Azure. Sprawdź to z nauczycielem. + +Istnieją dwa rodzaje darmowych subskrypcji Azure, które możesz założyć: + +* **Azure dla studentów** - Subskrypcja przeznaczona dla studentów powyżej 18 roku życia. Nie potrzebujesz karty kredytowej, aby się zarejestrować, a do weryfikacji używasz szkolnego adresu e-mail. Po rejestracji otrzymujesz 100 USD na wydatki na zasoby chmurowe oraz darmowe usługi, w tym darmową wersję usługi IoT. Subskrypcja trwa 12 miesięcy i można ją odnawiać co roku, dopóki jesteś studentem. + +* **Darmowa subskrypcja Azure** - Subskrypcja dla osób, które nie są studentami. Wymagana jest karta kredytowa do rejestracji, ale karta nie zostanie obciążona - służy jedynie do weryfikacji, że jesteś prawdziwą osobą, a nie botem. Otrzymujesz 200 USD kredytu do wykorzystania w ciągu pierwszych 30 dni na dowolne usługi oraz darmowe poziomy usług Azure. Po wykorzystaniu kredytu karta nie zostanie obciążona, chyba że przejdziesz na subskrypcję płatną. + +> 💁 Microsoft oferuje również subskrypcję Azure dla studentów Starter dla osób poniżej 18 roku życia, ale w momencie pisania tego tekstu nie obsługuje ona usług IoT. + +### Zadanie - załóż darmową subskrypcję chmurową + +Jeśli jesteś studentem powyżej 18 roku życia, możesz założyć subskrypcję Azure dla studentów. Weryfikacja odbywa się za pomocą szkolnego adresu e-mail. Możesz to zrobić na dwa sposoby: + +* Zarejestruj się w GitHub Student Developer Pack na stronie [education.github.com/pack](https://education.github.com/pack). Otrzymasz dostęp do wielu narzędzi i ofert, w tym GitHub i Microsoft Azure. Po rejestracji w pakiecie deweloperskim możesz aktywować ofertę Azure dla studentów. + +* Zarejestruj się bezpośrednio na konto Azure dla studentów na stronie [azure.microsoft.com/free/students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-17441-jabenn). + +> ⚠️ Jeśli Twój szkolny adres e-mail nie jest rozpoznawany, zgłoś [problem w tym repozytorium](https://github.com/Microsoft/IoT-For-Beginners/issues), a sprawdzimy, czy można go dodać do listy dozwolonych adresów Azure dla studentów. + +Jeśli nie jesteś studentem lub nie masz ważnego szkolnego adresu e-mail, możesz założyć darmową subskrypcję Azure. + +* Zarejestruj się na darmową subskrypcję Azure na stronie [azure.microsoft.com/free](https://azure.microsoft.com/free/?WT.mc_id=academic-17441-jabenn) + +## Usługi IoT w chmurze + +Publiczny testowy broker MQTT, którego używałeś, jest świetnym narzędziem do nauki, ale ma kilka wad w kontekście zastosowań komercyjnych: + +* Niezawodność - to darmowa usługa bez gwarancji, która może zostać wyłączona w dowolnym momencie +* Bezpieczeństwo - jest publiczna, więc każdy może podsłuchiwać Twoje dane telemetryczne lub wysyłać polecenia do sterowania Twoim sprzętem +* Wydajność - jest zaprojektowana do obsługi tylko kilku testowych wiadomości, więc nie poradzi sobie z dużą ilością przesyłanych danych +* Odkrywalność - brak możliwości sprawdzenia, jakie urządzenia są podłączone + +Usługi IoT w chmurze rozwiązują te problemy. Są utrzymywane przez dużych dostawców chmurowych, którzy inwestują w niezawodność i są gotowi naprawić wszelkie problemy. Mają wbudowane zabezpieczenia, które chronią przed hakerami odczytującymi Twoje dane lub wysyłającymi fałszywe polecenia. Są również bardzo wydajne, obsługując miliony wiadomości dziennie, korzystając z możliwości skalowania chmury. + +> 💁 Chociaż za te korzyści płacisz miesięczną opłatę, większość dostawców chmurowych oferuje darmową wersję swojej usługi IoT z ograniczoną liczbą wiadomości dziennie lub urządzeń, które mogą się połączyć. Ta darmowa wersja zazwyczaj wystarcza programistom do nauki. W tej lekcji będziesz korzystać z darmowej wersji. + +Urządzenia IoT łączą się z usługą chmurową za pomocą SDK urządzenia (biblioteki, która dostarcza kod do pracy z funkcjami usługi) lub bezpośrednio za pomocą protokołu komunikacyjnego, takiego jak MQTT lub HTTP. SDK urządzenia jest zazwyczaj najłatwiejszą opcją, ponieważ obsługuje wszystko za Ciebie, np. wie, jakie tematy publikować lub subskrybować i jak obsługiwać bezpieczeństwo. + +![Urządzenia łączą się z usługą za pomocą SDK urządzenia. Kod serwera również łączy się z usługą za pomocą SDK](../../../../../translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.pl.png) + +Twoje urządzenie komunikuje się z innymi częściami aplikacji za pośrednictwem tej usługi - podobnie jak przesyłałeś dane telemetryczne i odbierałeś polecenia za pomocą MQTT. Zazwyczaj odbywa się to za pomocą SDK usługi lub podobnej biblioteki. Wiadomości są przesyłane z urządzenia do usługi, gdzie inne komponenty aplikacji mogą je odczytać, a następnie wysyłać wiadomości z powrotem do urządzenia. + +![Urządzenia bez ważnego klucza tajnego nie mogą połączyć się z usługą IoT](../../../../../translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.pl.png) + +Te usługi implementują bezpieczeństwo, znając wszystkie urządzenia, które mogą się połączyć i przesyłać dane, albo poprzez wcześniejszą rejestrację urządzeń w usłudze, albo poprzez nadanie urządzeniom kluczy tajnych lub certyfikatów, które mogą wykorzystać do samodzielnej rejestracji przy pierwszym połączeniu. Nieznane urządzenia nie mogą się połączyć - jeśli spróbują, usługa odrzuci połączenie i zignoruje wysyłane przez nie wiadomości. + +✅ Zrób badania: Jakie są wady otwartej usługi IoT, do której każde urządzenie lub kod może się połączyć? Czy możesz znaleźć konkretne przykłady hakerów wykorzystujących takie sytuacje? + +Inne komponenty Twojej aplikacji mogą łączyć się z usługą IoT, dowiadywać się o wszystkich podłączonych lub zarejestrowanych urządzeniach i komunikować się z nimi bezpośrednio, zarówno masowo, jak i indywidualnie. +💁 Usługi IoT wdrażają również dodatkowe funkcje, a dostawcy chmury oferują dodatkowe usługi i aplikacje, które można połączyć z daną usługą. Na przykład, jeśli chcesz przechowywać wszystkie wiadomości telemetryczne wysyłane przez wszystkie urządzenia w bazie danych, zazwyczaj wystarczy kilka kliknięć w narzędziu konfiguracyjnym dostawcy chmury, aby połączyć usługę z bazą danych i przesyłać dane strumieniowo. +## Utwórz usługę IoT w chmurze + +Teraz, gdy masz subskrypcję Azure, możesz zarejestrować się w usłudze IoT. Usługa IoT od Microsoftu nazywa się Azure IoT Hub. + +![Logo Azure IoT Hub](../../../../../translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.pl.png) + +Poniższy film przedstawia krótki przegląd Azure IoT Hub: + +[![Film: Przegląd Azure IoT Hub](https://img.youtube.com/vi/smuZaZZXKsU/0.jpg)](https://www.youtube.com/watch?v=smuZaZZXKsU) + +> 🎥 Kliknij obrazek powyżej, aby obejrzeć film + +✅ Poświęć chwilę na przeprowadzenie badań i przeczytaj przegląd IoT Hub w [dokumentacji Microsoft IoT Hub](https://docs.microsoft.com/azure/iot-hub/about-iot-hub?WT.mc_id=academic-17441-jabenn). + +Usługi chmurowe dostępne w Azure można konfigurować za pomocą portalu internetowego lub interfejsu wiersza poleceń (CLI). W tym zadaniu użyjesz CLI. + +### Zadanie - zainstaluj Azure CLI + +Aby korzystać z Azure CLI, najpierw musisz go zainstalować na swoim komputerze PC lub Mac. + +1. Postępuj zgodnie z instrukcjami w [dokumentacji Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli?WT.mc_id=academic-17441-jabenn), aby zainstalować CLI. + +1. Azure CLI obsługuje wiele rozszerzeń, które dodają funkcje zarządzania szeroką gamą usług Azure. Zainstaluj rozszerzenie IoT, uruchamiając następujące polecenie w wierszu poleceń lub terminalu: + + ```sh + az extension add --name azure-iot + ``` + +1. W wierszu poleceń lub terminalu uruchom następujące polecenie, aby zalogować się do swojej subskrypcji Azure za pomocą Azure CLI. + + ```sh + az login + ``` + + W przeglądarce zostanie otwarta strona internetowa. Zaloguj się, używając konta, którego użyłeś do rejestracji subskrypcji Azure. Po zalogowaniu możesz zamknąć kartę przeglądarki. + +1. Jeśli masz wiele subskrypcji Azure, na przykład subskrypcję zapewnioną przez szkołę oraz własną subskrypcję Azure dla Studentów, musisz wybrać tę, której chcesz używać. Uruchom następujące polecenie, aby wyświetlić listę wszystkich subskrypcji, do których masz dostęp: + + ```sh + az account list --output table + ``` + + W wynikach zobaczysz nazwę każdej subskrypcji wraz z jej `SubscriptionId`. + + ```output + ➜ ~ az account list --output table + Name CloudName SubscriptionId State IsDefault + ---------------------- ----------- ------------------------------------ ------- ----------- + School-subscription AzureCloud cb30cde9-814a-42f0-a111-754cb788e4e1 Enabled True + Azure for Students AzureCloud fa51c31b-162c-4599-add6-781def2e1fbf Enabled False + ``` + + Aby wybrać subskrypcję, której chcesz używać, użyj następującego polecenia: + + ```sh + az account set --subscription + ``` + + Zamień `` na Id subskrypcji, której chcesz używać. Po uruchomieniu tego polecenia ponownie uruchom polecenie, aby wyświetlić swoje konta. Zobaczysz, że kolumna `IsDefault` będzie oznaczona jako `True` dla subskrypcji, którą właśnie ustawiłeś. + +### Zadanie - utwórz grupę zasobów + +Usługi Azure, takie jak instancje IoT Hub, maszyny wirtualne, bazy danych czy usługi AI, są określane jako **zasoby**. Każdy zasób musi znajdować się w **grupie zasobów**, czyli logicznej grupie jednego lub więcej zasobów. + +> 💁 Korzystanie z grup zasobów pozwala zarządzać wieloma usługami jednocześnie. Na przykład, po ukończeniu wszystkich lekcji tego projektu możesz usunąć grupę zasobów, a wszystkie zasoby w niej zostaną automatycznie usunięte. + +1. Istnieje wiele centrów danych Azure na całym świecie, podzielonych na regiony. Tworząc zasób lub grupę zasobów Azure, musisz określić, gdzie chcesz go utworzyć. Uruchom następujące polecenie, aby uzyskać listę lokalizacji: + + ```sh + az account list-locations --output table + ``` + + Zobaczysz listę lokalizacji. Ta lista będzie długa. + + > 💁 W momencie pisania tego tekstu dostępnych jest 65 lokalizacji, w których można wdrażać zasoby. + + ```output + ➜ ~ az account list-locations --output table + DisplayName Name RegionalDisplayName + ------------------------ ------------------- ------------------------------------- + East US eastus (US) East US + East US 2 eastus2 (US) East US 2 + South Central US southcentralus (US) South Central US + ... + ``` + + Zanotuj wartość z kolumny `Name` dla regionu najbliższego Tobie. Możesz znaleźć regiony na mapie na stronie [Azure geographies](https://azure.microsoft.com/global-infrastructure/geographies/?WT.mc_id=academic-17441-jabenn). + +1. Uruchom następujące polecenie, aby utworzyć grupę zasobów o nazwie `soil-moisture-sensor`. Nazwy grup zasobów muszą być unikalne w Twojej subskrypcji. + + ```sh + az group create --name soil-moisture-sensor \ + --location + ``` + + Zamień `` na lokalizację wybraną w poprzednim kroku. + +### Zadanie - utwórz IoT Hub + +Teraz możesz utworzyć zasób IoT Hub w swojej grupie zasobów. + +1. Użyj następującego polecenia, aby utworzyć zasób IoT Hub: + + ```sh + az iot hub create --resource-group soil-moisture-sensor \ + --sku F1 \ + --partition-count 2 \ + --name + ``` + + Zamień `` na nazwę swojego huba. Ta nazwa musi być globalnie unikalna - to znaczy, że żaden inny IoT Hub utworzony przez kogokolwiek nie może mieć tej samej nazwy. Ta nazwa jest używana w adresie URL wskazującym na hub, więc musi być unikalna. Użyj czegoś w stylu `soil-moisture-sensor-` i dodaj unikalny identyfikator na końcu, na przykład losowe słowa lub swoje imię. + + Opcja `--sku F1` wskazuje na użycie darmowego poziomu. Darmowy poziom obsługuje 8 000 wiadomości dziennie oraz większość funkcji pełnopłatnych poziomów. + + > 🎓 Różne poziomy cenowe usług Azure są określane jako poziomy. Każdy poziom ma inną cenę i oferuje różne funkcje lub wolumeny danych. + + > 💁 Jeśli chcesz dowiedzieć się więcej o cenach, możesz sprawdzić [przewodnik cenowy Azure IoT Hub](https://azure.microsoft.com/pricing/details/iot-hub/?WT.mc_id=academic-17441-jabenn). + + Opcja `--partition-count 2` definiuje, ile strumieni danych obsługuje IoT Hub. Więcej partycji zmniejsza blokowanie danych, gdy wiele urządzeń odczytuje i zapisuje dane w IoT Hub. Partycje są poza zakresem tych lekcji, ale wartość ta musi być ustawiona, aby utworzyć IoT Hub w darmowym poziomie. + + > 💁 Możesz mieć tylko jeden IoT Hub w darmowym poziomie na subskrypcję. + +IoT Hub zostanie utworzony. Może to potrwać minutę lub dwie. + +## Komunikacja z IoT Hub + +W poprzedniej lekcji używałeś MQTT i wysyłałeś wiadomości w różnych tematach, z różnymi tematami mającymi różne cele. Zamiast wysyłać wiadomości w różnych tematach, IoT Hub ma kilka zdefiniowanych sposobów komunikacji urządzenia z hubem lub huba z urządzeniem. + +> 💁 Pod spodem ta komunikacja między IoT Hub a Twoim urządzeniem może korzystać z MQTT, HTTPS lub AMQP. + +* Wiadomości od urządzenia do chmury (D2C) - są to wiadomości wysyłane z urządzenia do IoT Hub, takie jak dane telemetryczne. Mogą być następnie odczytywane z IoT Hub przez kod aplikacji. + + > 🎓 Pod spodem IoT Hub korzysta z usługi Azure o nazwie [Event Hubs](https://docs.microsoft.com/azure/event-hubs/?WT.mc_id=academic-17441-jabenn). Pisząc kod do odczytu wiadomości wysyłanych do huba, często nazywa się je zdarzeniami. + +* Wiadomości od chmury do urządzenia (C2D) - są to wiadomości wysyłane z kodu aplikacji, przez IoT Hub do urządzenia IoT. + +* Żądania metod bezpośrednich - są to wiadomości wysyłane z kodu aplikacji przez IoT Hub do urządzenia IoT w celu zażądania wykonania jakiejś czynności, na przykład sterowania siłownikiem. Wiadomości te wymagają odpowiedzi, aby kod aplikacji mógł stwierdzić, czy zostały pomyślnie przetworzone. + +* Bliźniaki urządzeń - są to dokumenty JSON synchronizowane między urządzeniem a IoT Hub, używane do przechowywania ustawień lub innych właściwości zgłaszanych przez urządzenie lub mających być ustawionych na urządzeniu (znanych jako pożądane) przez IoT Hub. + +IoT Hub może przechowywać wiadomości i żądania metod bezpośrednich przez konfigurowalny okres czasu (domyślnie jeden dzień), więc jeśli urządzenie lub kod aplikacji straci połączenie, nadal może pobrać wiadomości wysłane podczas jego braku po ponownym połączeniu. Bliźniaki urządzeń są przechowywane na stałe w IoT Hub, więc w dowolnym momencie urządzenie może się ponownie połączyć i uzyskać najnowszy bliźniak urządzenia. + +✅ Przeprowadź badania: Przeczytaj więcej o tych typach wiadomości w [przewodniku komunikacji od urządzenia do chmury](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-d2c-guidance?WT.mc_id=academic-17441-jabenn) oraz [przewodniku komunikacji od chmury do urządzenia](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-c2d-guidance?WT.mc_id=academic-17441-jabenn) w dokumentacji IoT Hub. + +## Połącz swoje urządzenie z usługą IoT + +Po utworzeniu huba Twoje urządzenie IoT może się z nim połączyć. Tylko zarejestrowane urządzenia mogą łączyć się z usługą, więc najpierw musisz zarejestrować swoje urządzenie. Po rejestracji możesz uzyskać ciąg połączenia, który urządzenie może używać do połączenia. Ten ciąg połączenia jest specyficzny dla urządzenia i zawiera informacje o IoT Hub, urządzeniu oraz tajny klucz, który umożliwia temu urządzeniu połączenie. + +> 🎓 Ciąg połączenia to ogólny termin oznaczający fragment tekstu zawierający szczegóły połączenia. Są one używane podczas łączenia z IoT Hub, bazami danych i wieloma innymi usługami. Zazwyczaj składają się z identyfikatora usługi, takiego jak URL, oraz informacji o zabezpieczeniach, takich jak tajny klucz. Są przekazywane do SDK w celu połączenia z usługą. + +> ⚠️ Ciągi połączenia powinny być przechowywane w bezpiecznym miejscu! Zagadnienia związane z bezpieczeństwem zostaną omówione bardziej szczegółowo w przyszłej lekcji. + +### Zadanie - zarejestruj swoje urządzenie IoT + +Urządzenie IoT można zarejestrować w IoT Hub za pomocą Azure CLI. + +1. Uruchom następujące polecenie, aby zarejestrować urządzenie: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor \ + --hub-name + ``` + + Zamień `` na nazwę, której użyłeś dla swojego IoT Hub. + + Spowoduje to utworzenie urządzenia o identyfikatorze `soil-moisture-sensor`. + +1. Gdy Twoje urządzenie IoT łączy się z IoT Hub za pomocą SDK, musi używać ciągu połączenia, który podaje URL huba oraz tajny klucz. Uruchom następujące polecenie, aby uzyskać ciąg połączenia: + + ```sh + az iot hub device-identity connection-string show --device-id soil-moisture-sensor \ + --output table \ + --hub-name + ``` + + Zamień `` na nazwę, której użyłeś dla swojego IoT Hub. + +1. Zapisz ciąg połączenia wyświetlony w wynikach, ponieważ będzie Ci potrzebny później. + +### Zadanie - połącz swoje urządzenie IoT z chmurą + +Przejdź przez odpowiedni przewodnik, aby połączyć swoje urządzenie IoT z chmurą: + +* [Arduino - Wio Terminal](wio-terminal-connect-hub.md) +* [Komputer jednopłytkowy - Raspberry Pi/Wirtualne urządzenie IoT](single-board-computer-connect-hub.md) + +### Zadanie - monitoruj zdarzenia + +Na razie nie będziesz aktualizować kodu serwera. Zamiast tego możesz użyć Azure CLI, aby monitorować zdarzenia z Twojego urządzenia IoT. + +1. Upewnij się, że Twoje urządzenie IoT działa i wysyła wartości telemetryczne wilgotności gleby. + +1. Uruchom następujące polecenie w wierszu poleceń lub terminalu, aby monitorować wiadomości wysyłane do Twojego IoT Hub: + + ```sh + az iot hub monitor-events --hub-name + ``` + + Zamień `` na nazwę, której użyłeś dla swojego IoT Hub. + + Zobaczysz wiadomości pojawiające się w wynikach konsoli w miarę ich wysyłania przez Twoje urządzenie IoT. + + ```output + Starting event monitor, use ctrl-c to stop... + { + "event": { + "origin": "soil-moisture-sensor", + "module": "", + "interface": "", + "component": "", + "payload": "{\"soil_moisture\": 376}" + } + }, + { + "event": { + "origin": "soil-moisture-sensor", + "module": "", + "interface": "", + "component": "", + "payload": "{\"soil_moisture\": 381}" + } + } + ``` + + Zawartość `payload` będzie odpowiadać wiadomości wysłanej przez Twoje urządzenie IoT. + + > W momencie pisania tego tekstu rozszerzenie `az iot` nie działa w pełni na urządzeniach Apple Silicon. Jeśli używasz urządzenia Apple Silicon, będziesz musiał monitorować wiadomości w inny sposób, na przykład korzystając z [Azure IoT Tools dla Visual Studio Code](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-vscode-iot-toolkit-cloud-device-messaging). + +1. Te wiadomości mają automatycznie przypisane różne właściwości, takie jak znacznik czasu ich wysłania. Są one znane jako *adnotacje*. Aby wyświetlić wszystkie adnotacje wiadomości, użyj następującego polecenia: + + ```sh + az iot hub monitor-events --properties anno --hub-name + ``` + + Zamień `` na nazwę, której użyłeś dla swojego IoT Hub. + + Zobaczysz wiadomości pojawiające się w wynikach konsoli w miarę ich wysyłania przez Twoje urządzenie IoT. + + ```output + Starting event monitor, use ctrl-c to stop... + { + "event": { + "origin": "soil-moisture-sensor", + "module": "", + "interface": "", + "component": "", + "properties": {}, + "annotations": { + "iothub-connection-device-id": "soil-moisture-sensor", + "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}", + "iothub-connection-auth-generation-id": "637553997165220462", + "iothub-enqueuedtime": 1619976150288, + "iothub-message-source": "Telemetry", + "x-opt-sequence-number": 1379, + "x-opt-offset": "550576", + "x-opt-enqueued-time": 1619976150277 + }, + "payload": "{\"soil_moisture\": 381}" + } + } + ``` + + Wartości czasu w adnotacjach są w [czasie UNIX](https://wikipedia.org/wiki/Unix_time), reprezentującym liczbę sekund od północy 1 stycznia 1970 roku. + + Wyjdź z monitora zdarzeń, gdy skończysz. + +### Zadanie - kontroluj swoje urządzenie IoT + +Możesz również użyć Azure CLI, aby wywoływać metody bezpośrednie na swoim urządzeniu IoT. + +1. Uruchom następujące polecenie w wierszu poleceń lub terminalu, aby wywołać metodę `relay_on` na urządzeniu IoT: + + ```sh + az iot hub invoke-device-method --device-id soil-moisture-sensor \ + --method-name relay_on \ + --method-payload '{}' \ + --hub-name + ``` + + Zamień ` + +` z nazwą, której użyłeś dla swojego IoT Hub. + + To wysyła żądanie metody bezpośredniej dla metody określonej przez `method-name`. Metody bezpośrednie mogą przyjmować ładunek zawierający dane dla metody, który można określić w parametrze `method-payload` jako JSON. + + Zobaczysz, jak przekaźnik się włącza, oraz odpowiadające temu dane wyjściowe z Twojego urządzenia IoT: + + ```output + Direct method received - relay_on + ``` + +1. Powtórz powyższy krok, ale ustaw `--method-name` na `relay_off`. Zobaczysz, jak przekaźnik się wyłącza, oraz odpowiadające temu dane wyjściowe z urządzenia IoT. + +--- + +## 🚀 Wyzwanie + +Darmowy poziom IoT Hub pozwala na 8 000 wiadomości dziennie. Kod, który napisałeś, wysyła wiadomości telemetryczne co 10 sekund. Ile wiadomości dziennie to jedna wiadomość co 10 sekund? + +Zastanów się, jak często powinny być wysyłane pomiary wilgotności gleby? Jak możesz zmienić swój kod, aby pozostać w ramach darmowego poziomu, sprawdzając tak często, jak to konieczne, ale nie za często? Co, jeśli chciałbyś dodać drugie urządzenie? + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/16) + +## Przegląd i samodzielna nauka + +SDK IoT Hub jest open source zarówno dla Arduino, jak i Pythona. W repozytoriach kodu na GitHub znajduje się wiele przykładów pokazujących, jak pracować z różnymi funkcjami IoT Hub. + +* Jeśli używasz Wio Terminal, sprawdź [przykłady dla Arduino na GitHub](https://github.com/Azure/azure-iot-pal-arduino/tree/master/pal/samples) +* Jeśli używasz Raspberry Pi lub urządzenia wirtualnego, sprawdź [przykłady dla Pythona na GitHub](https://github.com/Azure/azure-iot-sdk-python/tree/master/azure-iot-hub/samples) + +## Zadanie + +[Dowiedz się więcej o usługach w chmurze](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md b/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md new file mode 100644 index 00000000..840a5041 --- /dev/null +++ b/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md @@ -0,0 +1,31 @@ + +# Dowiedz się o usługach chmurowych + +## Instrukcje + +Chmury, takie jak Azure od Microsoftu, oferują więcej niż tylko wynajem mocy obliczeniowej. Główne rodzaje usług chmurowych obejmują: + +* Infrastruktura jako usługa (IaaS) +* Platforma jako usługa (PaaS) +* Bezserwerowe (Serverless) +* Oprogramowanie jako usługa (SaaS) + +Dowiedz się o tych różnych rodzajach usług, wyjaśnij, czym są i czym się różnią. Wyjaśnij, które z tych usług są istotne dla programistów IoT. + +## Kryteria oceny + +| Kryteria | Wzorowe | Wystarczające | Wymaga poprawy | +| -------- | --------- | -------- | ----------------- | +| Wyjaśnienie różnych usług chmurowych | Przedstawiono jasne wyjaśnienia wszystkich 4 rodzajów usług | Przedstawiono wyjaśnienia 3 rodzajów usług | Przedstawiono wyjaśnienia tylko 1 lub 2 rodzajów usług | +| Wyjaśnienie, która usługa jest istotna dla IoT | Przedstawiono wyjaśnienie, które usługi są istotne dla programistów IoT i dlaczego | Przedstawiono wyjaśnienie, które usługi są istotne dla programistów IoT, ale bez uzasadnienia dlaczego | Nie udało się wyjaśnić, które usługi są istotne dla programistów IoT | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md b/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md new file mode 100644 index 00000000..06d87fc0 --- /dev/null +++ b/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md @@ -0,0 +1,128 @@ + +# Podłącz swoje urządzenie IoT do chmury - Wirtualny sprzęt IoT i Raspberry Pi + +W tej części lekcji podłączysz swoje wirtualne urządzenie IoT lub Raspberry Pi do IoT Hub, aby wysyłać dane telemetryczne i odbierać polecenia. + +## Podłącz swoje urządzenie do IoT Hub + +Kolejnym krokiem jest podłączenie urządzenia do IoT Hub. + +### Zadanie - podłączenie do IoT Hub + +1. Otwórz folder `soil-moisture-sensor` w VS Code. Upewnij się, że środowisko wirtualne działa w terminalu, jeśli używasz wirtualnego urządzenia IoT. + +1. Zainstaluj dodatkowe pakiety Pip: + + ```sh + pip3 install azure-iot-device + ``` + + `azure-iot-device` to biblioteka umożliwiająca komunikację z IoT Hub. + +1. Dodaj następujące importy na początku pliku `app.py`, poniżej istniejących importów: + + ```python + from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse + ``` + + Ten kod importuje SDK do komunikacji z IoT Hub. + +1. Usuń linię `import paho.mqtt.client as mqtt`, ponieważ ta biblioteka nie jest już potrzebna. Usuń cały kod MQTT, w tym nazwy tematów, cały kod używający `mqtt_client` oraz `handle_command`. Zachowaj pętlę `while True:`, ale usuń linię `mqtt_client.publish` z tej pętli. + +1. Dodaj następujący kod poniżej sekcji importów: + + ```python + connection_string = "" + ``` + + Zamień `` na ciąg połączenia, który pobrałeś dla urządzenia wcześniej w tej lekcji. + + > 💁 To nie jest najlepsza praktyka. Ciągi połączenia nigdy nie powinny być przechowywane w kodzie źródłowym, ponieważ mogą zostać zapisane w systemie kontroli wersji i znalezione przez innych. Robimy to tutaj dla uproszczenia. Idealnie powinno się używać czegoś takiego jak zmienne środowiskowe i narzędzia takie jak [`python-dotenv`](https://pypi.org/project/python-dotenv/). Dowiesz się więcej na ten temat w kolejnej lekcji. + +1. Poniżej tego kodu dodaj następujący fragment, aby utworzyć obiekt klienta urządzenia, który może komunikować się z IoT Hub, i połącz go: + + ```python + device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) + + print('Connecting') + device_client.connect() + print('Connected') + ``` + +1. Uruchom ten kod. Zobaczysz, że Twoje urządzenie się połączy. + + ```output + pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py + Connecting + Connected + Soil moisture: 379 + ``` + +## Wysyłanie danych telemetrycznych + +Teraz, gdy Twoje urządzenie jest podłączone, możesz wysyłać dane telemetryczne do IoT Hub zamiast do brokera MQTT. + +### Zadanie - wysyłanie danych telemetrycznych + +1. Dodaj następujący kod wewnątrz pętli `while True`, tuż przed funkcją sleep: + + ```python + message = Message(json.dumps({ 'soil_moisture': soil_moisture })) + device_client.send_message(message) + ``` + + Ten kod tworzy `Message` IoT Hub zawierający odczyt wilgotności gleby jako ciąg JSON, a następnie wysyła go do IoT Hub jako wiadomość od urządzenia do chmury. + +## Obsługa poleceń + +Twoje urządzenie musi obsługiwać polecenie z kodu serwera, aby sterować przekaźnikiem. Polecenie to jest wysyłane jako żądanie metody bezpośredniej. + +## Zadanie - obsługa żądania metody bezpośredniej + +1. Dodaj następujący kod przed pętlą `while True`: + + ```python + def handle_method_request(request): + print("Direct method received - ", request.name) + + if request.name == "relay_on": + relay.on() + elif request.name == "relay_off": + relay.off() + ``` + + Ten kod definiuje metodę `handle_method_request`, która zostanie wywołana, gdy IoT Hub wyśle żądanie metody bezpośredniej. Każda metoda bezpośrednia ma nazwę, a ten kod oczekuje metody o nazwie `relay_on`, aby włączyć przekaźnik, oraz `relay_off`, aby go wyłączyć. + + > 💁 Można to również zaimplementować w jednej metodzie bezpośredniej, przekazując pożądany stan przekaźnika w ładunku, który można przesłać z żądaniem metody i który będzie dostępny z obiektu `request`. + +1. Metody bezpośrednie wymagają odpowiedzi, aby poinformować kod wywołujący, że zostały obsłużone. Dodaj następujący kod na końcu funkcji `handle_method_request`, aby utworzyć odpowiedź na żądanie: + + ```python + method_response = MethodResponse.create_from_method_request(request, 200) + device_client.send_method_response(method_response) + ``` + + Ten kod wysyła odpowiedź na żądanie metody bezpośredniej z kodem statusu HTTP 200 i przesyła ją z powrotem do IoT Hub. + +1. Dodaj następujący kod poniżej definicji tej funkcji: + + ```python + device_client.on_method_request_received = handle_method_request + ``` + + Ten kod informuje klienta IoT Hub, aby wywołał funkcję `handle_method_request`, gdy zostanie wywołana metoda bezpośrednia. + +> 💁 Ten kod znajdziesz w folderze [code/pi](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/pi) lub [code/virtual-device](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/virtual-device). + +😀 Twój program czujnika wilgotności gleby jest podłączony do IoT Hub! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md b/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md new file mode 100644 index 00000000..244adec8 --- /dev/null +++ b/translations/pl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md @@ -0,0 +1,304 @@ + +# Podłącz swoje urządzenie IoT do chmury - Wio Terminal + +W tej części lekcji podłączysz swój Wio Terminal do IoT Hub, aby wysyłać dane telemetryczne i odbierać polecenia. + +## Podłącz swoje urządzenie do IoT Hub + +Kolejnym krokiem jest podłączenie urządzenia do IoT Hub. + +### Zadanie - podłącz do IoT Hub + +1. Otwórz projekt `soil-moisture-sensor` w VS Code. + +1. Otwórz plik `platformio.ini`. Usuń zależność od biblioteki `knolleary/PubSubClient`. Była ona używana do połączenia z publicznym brokerem MQTT, ale nie jest potrzebna do połączenia z IoT Hub. + +1. Dodaj następujące zależności bibliotek: + + ```ini + seeed-studio/Seeed Arduino RTC @ 2.0.0 + arduino-libraries/AzureIoTHub @ 1.6.0 + azure/AzureIoTUtility @ 1.6.1 + azure/AzureIoTProtocol_MQTT @ 1.6.0 + azure/AzureIoTProtocol_HTTP @ 1.6.0 + azure/AzureIoTSocket_WiFi @ 1.0.2 + ``` + + Biblioteka `Seeed Arduino RTC` dostarcza kod do obsługi zegara czasu rzeczywistego w Wio Terminal, który jest używany do śledzenia czasu. Pozostałe biblioteki umożliwiają Twojemu urządzeniu IoT połączenie z IoT Hub. + +1. Dodaj następujący wpis na końcu pliku `platformio.ini`: + + ```ini + build_flags = + -DDONT_USE_UPLOADTOBLOB + ``` + + Ustawia to flagę kompilatora, która jest wymagana podczas kompilacji kodu Arduino IoT Hub. + +1. Otwórz plik nagłówkowy `config.h`. Usuń wszystkie ustawienia MQTT i dodaj następującą stałą dla ciągu połączenia urządzenia: + + ```cpp + // IoT Hub settings + const char *CONNECTION_STRING = ""; + ``` + + Zamień `` na ciąg połączenia dla Twojego urządzenia, który skopiowałeś wcześniej. + +1. Połączenie z IoT Hub wykorzystuje token oparty na czasie. Oznacza to, że urządzenie IoT musi znać aktualny czas. W przeciwieństwie do systemów operacyjnych takich jak Windows, macOS czy Linux, mikrokontrolery nie synchronizują automatycznie aktualnego czasu przez Internet. Oznacza to, że musisz dodać kod do pobrania aktualnego czasu z serwera [NTP](https://wikipedia.org/wiki/Network_Time_Protocol). Po pobraniu czasu można go zapisać w zegarze czasu rzeczywistego w Wio Terminal, co pozwala na uzyskanie poprawnego czasu w późniejszym terminie, o ile urządzenie nie straci zasilania. Dodaj nowy plik o nazwie `ntp.h` z następującym kodem: + + ```cpp + #pragma once + + #include "DateTime.h" + #include + #include "samd/NTPClientAz.h" + #include + + static void initTime() + { + WiFiUDP _udp; + time_t epochTime = (time_t)-1; + NTPClientAz ntpClient; + + ntpClient.begin(); + + while (true) + { + epochTime = ntpClient.getEpochTime("0.pool.ntp.org"); + + if (epochTime == (time_t)-1) + { + Serial.println("Fetching NTP epoch time failed! Waiting 2 seconds to retry."); + delay(2000); + } + else + { + Serial.print("Fetched NTP epoch time is: "); + + char buff[32]; + sprintf(buff, "%.f", difftime(epochTime, (time_t)0)); + Serial.println(buff); + break; + } + } + + ntpClient.end(); + + struct timeval tv; + tv.tv_sec = epochTime; + tv.tv_usec = 0; + + settimeofday(&tv, NULL); + } + ``` + + Szczegóły tego kodu wykraczają poza zakres tej lekcji. Definiuje on funkcję `initTime`, która pobiera aktualny czas z serwera NTP i ustawia zegar w Wio Terminal. + +1. Otwórz plik `main.cpp` i usuń cały kod MQTT, w tym nagłówek `PubSubClient.h`, deklarację zmiennej `PubSubClient`, metody `reconnectMQTTClient` i `createMQTTClient`, oraz wszelkie wywołania tych zmiennych i metod. Plik ten powinien zawierać jedynie kod do połączenia z WiFi, pobrania wilgotności gleby i utworzenia dokumentu JSON z tymi danymi. + +1. Dodaj następujące dyrektywy `#include` na początku pliku `main.cpp`, aby dołączyć nagłówki bibliotek IoT Hub oraz ustawiania czasu: + + ```cpp + #include + #include + #include + #include "ntp.h" + ``` + +1. Dodaj następujące wywołanie na końcu funkcji `setup`, aby ustawić aktualny czas: + + ```cpp + initTime(); + ``` + +1. Dodaj następującą deklarację zmiennej na początku pliku, tuż poniżej dyrektyw include: + + ```cpp + IOTHUB_DEVICE_CLIENT_LL_HANDLE _device_ll_handle; + ``` + + Deklaruje to `IOTHUB_DEVICE_CLIENT_LL_HANDLE`, uchwyt do połączenia z IoT Hub. + +1. Poniżej tego dodaj następujący kod: + + ```cpp + static void connectionStatusCallback(IOTHUB_CLIENT_CONNECTION_STATUS result, IOTHUB_CLIENT_CONNECTION_STATUS_REASON reason, void *user_context) + { + if (result == IOTHUB_CLIENT_CONNECTION_AUTHENTICATED) + { + Serial.println("The device client is connected to iothub"); + } + else + { + Serial.println("The device client has been disconnected"); + } + } + ``` + + Deklaruje to funkcję zwrotną, która będzie wywoływana, gdy status połączenia z IoT Hub ulegnie zmianie, np. po połączeniu lub rozłączeniu. Status jest wysyłany na port szeregowy. + +1. Poniżej tego dodaj funkcję do połączenia z IoT Hub: + + ```cpp + void connectIoTHub() + { + IoTHub_Init(); + + _device_ll_handle = IoTHubDeviceClient_LL_CreateFromConnectionString(CONNECTION_STRING, MQTT_Protocol); + + if (_device_ll_handle == NULL) + { + Serial.println("Failure creating Iothub device. Hint: Check your connection string."); + return; + } + + IoTHubDeviceClient_LL_SetConnectionStatusCallback(_device_ll_handle, connectionStatusCallback, NULL); + } + ``` + + Kod ten inicjalizuje bibliotekę IoT Hub, a następnie tworzy połączenie przy użyciu ciągu połączenia zdefiniowanego w pliku nagłówkowym `config.h`. Połączenie to opiera się na MQTT. Jeśli połączenie się nie powiedzie, informacja o tym zostanie wysłana na port szeregowy - jeśli zobaczysz to w wyjściu, sprawdź ciąg połączenia. Na końcu ustawiana jest funkcja zwrotna statusu połączenia. + +1. Wywołaj tę funkcję w funkcji `setup` poniżej wywołania `initTime`: + + ```cpp + connectIoTHub(); + ``` + +1. Podobnie jak w przypadku klienta MQTT, ten kod działa na jednym wątku, więc potrzebuje czasu na przetwarzanie wiadomości wysyłanych przez hub i do huba. Dodaj następujący kod na początku funkcji `loop`, aby to zrobić: + + ```cpp + IoTHubDeviceClient_LL_DoWork(_device_ll_handle); + ``` + +1. Zbuduj i wgraj ten kod. Zobaczysz połączenie w monitorze szeregowym: + + ```output + Connecting to WiFi.. + Connected! + Fetched NTP epoch time is: 1619983687 + Sending telemetry {"soil_moisture":391} + The device client is connected to iothub + ``` + + W wyjściu zobaczysz pobieranie czasu NTP, a następnie łączenie klienta urządzenia. Połączenie może zająć kilka sekund, więc możesz zobaczyć wilgotność gleby w wyjściu, podczas gdy urządzenie się łączy. + + > 💁 Możesz przekonwertować czas UNIX z NTP na bardziej czytelną wersję, korzystając z witryny internetowej, takiej jak [unixtimestamp.com](https://www.unixtimestamp.com) + +## Wysyłanie telemetrii + +Teraz, gdy Twoje urządzenie jest podłączone, możesz wysyłać dane telemetryczne do IoT Hub zamiast do brokera MQTT. + +### Zadanie - wysyłanie telemetrii + +1. Dodaj następującą funkcję powyżej funkcji `setup`: + + ```cpp + void sendTelemetry(const char *telemetry) + { + IOTHUB_MESSAGE_HANDLE message_handle = IoTHubMessage_CreateFromString(telemetry); + IoTHubDeviceClient_LL_SendEventAsync(_device_ll_handle, message_handle, NULL, NULL); + IoTHubMessage_Destroy(message_handle); + } + ``` + + Kod ten tworzy wiadomość IoT Hub z ciągu przekazanego jako parametr, wysyła ją do huba, a następnie czyści obiekt wiadomości. + +1. Wywołaj ten kod w funkcji `loop`, zaraz po linii, w której telemetria jest wysyłana na port szeregowy: + + ```cpp + sendTelemetry(telemetry.c_str()); + ``` + +## Obsługa poleceń + +Twoje urządzenie musi obsługiwać polecenie z kodu serwera do sterowania przekaźnikiem. Jest ono wysyłane jako żądanie metody bezpośredniej. + +## Zadanie - obsługa żądania metody bezpośredniej + +1. Dodaj następujący kod przed funkcją `connectIoTHub`: + + ```cpp + int directMethodCallback(const char *method_name, const unsigned char *payload, size_t size, unsigned char **response, size_t *response_size, void *userContextCallback) + { + Serial.printf("Direct method received %s\r\n", method_name); + + if (strcmp(method_name, "relay_on") == 0) + { + digitalWrite(PIN_WIRE_SCL, HIGH); + } + else if (strcmp(method_name, "relay_off") == 0) + { + digitalWrite(PIN_WIRE_SCL, LOW); + } + } + ``` + + Kod ten definiuje metodę zwrotną, którą biblioteka IoT Hub może wywołać, gdy otrzyma żądanie metody bezpośredniej. Metoda, która jest żądana, jest przesyłana w parametrze `method_name`. Funkcja ta wypisuje wywołaną metodę na port szeregowy, a następnie włącza lub wyłącza przekaźnik w zależności od nazwy metody. + + > 💁 Można to również zaimplementować w ramach jednej metody bezpośredniej, przekazując pożądany stan przekaźnika w ładunku, który można przesłać z żądaniem metody i który jest dostępny w parametrze `payload`. + +1. Dodaj następujący kod na końcu funkcji `directMethodCallback`: + + ```cpp + char resultBuff[16]; + sprintf(resultBuff, "{\"Result\":\"\"}"); + *response_size = strlen(resultBuff); + *response = (unsigned char *)malloc(*response_size); + memcpy(*response, resultBuff, *response_size); + + return IOTHUB_CLIENT_OK; + ``` + + Żądania metod bezpośrednich wymagają odpowiedzi, która składa się z dwóch części - odpowiedzi w formie tekstu oraz kodu zwrotnego. Kod ten utworzy wynik w postaci następującego dokumentu JSON: + + ```JSON + { + "Result": "" + } + ``` + + Następnie jest on kopiowany do parametru `response`, a rozmiar tej odpowiedzi jest ustawiany w parametrze `response_size`. Kod ten zwraca `IOTHUB_CLIENT_OK`, aby pokazać, że metoda została obsłużona poprawnie. + +1. Podłącz funkcję zwrotną, dodając następujący kod na końcu funkcji `connectIoTHub`: + + ```cpp + IoTHubClient_LL_SetDeviceMethodCallback(_device_ll_handle, directMethodCallback, NULL); + ``` + +1. Funkcja `loop` wywoła funkcję `IoTHubDeviceClient_LL_DoWork`, aby przetwarzać zdarzenia wysyłane przez IoT Hub. Funkcja ta jest wywoływana co 10 sekund z powodu `delay`, co oznacza, że metody bezpośrednie są przetwarzane tylko co 10 sekund. Aby to usprawnić, 10-sekundowe opóźnienie można zaimplementować jako wiele krótszych opóźnień, wywołując `IoTHubDeviceClient_LL_DoWork` za każdym razem. Aby to zrobić, dodaj następujący kod powyżej funkcji `loop`: + + ```cpp + void work_delay(int delay_time) + { + int current = 0; + do + { + IoTHubDeviceClient_LL_DoWork(_device_ll_handle); + delay(100); + current += 100; + } while (current < delay_time); + } + ``` + + Kod ten będzie wielokrotnie wywoływał `IoTHubDeviceClient_LL_DoWork` i opóźniał o 100 ms za każdym razem. Będzie to robił tyle razy, ile potrzeba, aby opóźnić o czas podany w parametrze `delay_time`. Oznacza to, że urządzenie czeka maksymalnie 100 ms na przetworzenie żądań metod bezpośrednich. + +1. W funkcji `loop` usuń wywołanie `IoTHubDeviceClient_LL_DoWork` i zastąp wywołanie `delay(10000)` następującym kodem, aby wywołać nową funkcję: + + ```cpp + work_delay(10000); + ``` + +> 💁 Kod ten znajdziesz w folderze [code/wio-terminal](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal). + +😀 Twój program czujnika wilgotności gleby jest podłączony do IoT Hub! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego języku źródłowym powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/5-migrate-application-to-the-cloud/README.md b/translations/pl/2-farm/lessons/5-migrate-application-to-the-cloud/README.md new file mode 100644 index 00000000..2abb3453 --- /dev/null +++ b/translations/pl/2-farm/lessons/5-migrate-application-to-the-cloud/README.md @@ -0,0 +1,654 @@ + +# Przenieś logikę swojej aplikacji do chmury + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obraz, aby zobaczyć większą wersję. + +Ta lekcja była częścią [Projektu IoT dla początkujących 2 - Cykl o cyfrowym rolnictwie](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) organizowanego przez [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Steruj swoim urządzeniem IoT za pomocą kodu bezserwerowego](https://img.youtube.com/vi/VVZDcs5u1_I/0.jpg)](https://youtu.be/VVZDcs5u1_I) + +## Quiz przed lekcją + +[Quiz przed lekcją](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/17) + +## Wprowadzenie + +W poprzedniej lekcji nauczyłeś się, jak połączyć monitorowanie wilgotności gleby i sterowanie przekaźnikiem z usługą IoT w chmurze. Kolejnym krokiem jest przeniesienie kodu serwera, który kontroluje czas działania przekaźnika, do chmury. W tej lekcji dowiesz się, jak to zrobić za pomocą funkcji bezserwerowych. + +W tej lekcji omówimy: + +* [Czym jest bezserwerowość?](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Tworzenie aplikacji bezserwerowej](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Tworzenie wyzwalacza zdarzeń IoT Hub](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Wysyłanie żądań metod bezpośrednich z kodu bezserwerowego](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Wdrażanie kodu bezserwerowego w chmurze](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) + +## Czym jest bezserwerowość? + +Bezserwerowość, czyli przetwarzanie bezserwerowe, polega na tworzeniu małych bloków kodu, które są uruchamiane w chmurze w odpowiedzi na różne zdarzenia. Gdy zdarzenie wystąpi, Twój kod jest uruchamiany i otrzymuje dane dotyczące tego zdarzenia. Zdarzenia te mogą pochodzić z różnych źródeł, takich jak żądania sieciowe, wiadomości umieszczone w kolejce, zmiany danych w bazie danych czy wiadomości wysyłane do usługi IoT przez urządzenia IoT. + +![Zdarzenia wysyłane z usługi IoT do usługi bezserwerowej, przetwarzane jednocześnie przez wiele funkcji](../../../../../translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.pl.png) + +> 💁 Jeśli wcześniej korzystałeś z wyzwalaczy w bazach danych, możesz to porównać do tego samego mechanizmu — kod jest uruchamiany w odpowiedzi na zdarzenie, takie jak wstawienie wiersza. + +![Gdy wiele zdarzeń występuje jednocześnie, usługa bezserwerowa skaluje się, aby obsłużyć je wszystkie w tym samym czasie](../../../../../translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.pl.png) + +Twój kod jest uruchamiany tylko wtedy, gdy wystąpi zdarzenie, a w innych momentach nie jest aktywny. Zdarzenie występuje, Twój kod jest ładowany i uruchamiany. Dzięki temu bezserwerowość jest bardzo skalowalna — jeśli wiele zdarzeń wystąpi jednocześnie, dostawca chmury może uruchomić Twoją funkcję tyle razy, ile potrzeba, na dostępnych serwerach. Wadą tego podejścia jest to, że jeśli musisz udostępniać informacje między zdarzeniami, musisz je zapisać w miejscu takim jak baza danych, zamiast przechowywać je w pamięci. + +Twój kod jest pisany jako funkcja, która przyjmuje szczegóły dotyczące zdarzenia jako parametr. Możesz używać szerokiej gamy języków programowania do pisania tych funkcji bezserwerowych. + +> 🎓 Bezserwerowość jest również nazywana Funkcjami jako Usługa (FaaS), ponieważ każdy wyzwalacz zdarzenia jest implementowany jako funkcja w kodzie. + +Pomimo nazwy, bezserwerowość faktycznie korzysta z serwerów. Nazwa pochodzi stąd, że jako programista nie musisz martwić się o serwery potrzebne do uruchomienia Twojego kodu — interesuje Cię tylko to, że Twój kod jest uruchamiany w odpowiedzi na zdarzenie. Dostawca chmury posiada środowisko uruchomieniowe bezserwerowe, które zarządza przydzielaniem serwerów, siecią, pamięcią masową, procesorem, pamięcią RAM i wszystkim innym potrzebnym do uruchomienia Twojego kodu. W tym modelu nie płacisz za serwer, ponieważ nie ma serwera. Zamiast tego płacisz za czas, w którym Twój kod jest uruchamiany, oraz za ilość użytej pamięci. + +> 💰 Bezserwerowość to jeden z najtańszych sposobów uruchamiania kodu w chmurze. Na przykład, w momencie pisania tego tekstu, jeden z dostawców chmury pozwala na wykonanie wszystkich Twoich funkcji bezserwerowych łącznie 1 000 000 razy miesięcznie, zanim zacznie naliczać opłaty, a po tym nalicza 0,20 USD za każde 1 000 000 wykonanych funkcji. Gdy Twój kod nie działa, nie płacisz. + +Jako programista IoT, model bezserwerowy jest idealny. Możesz napisać funkcję, która jest wywoływana w odpowiedzi na wiadomości wysyłane przez dowolne urządzenie IoT podłączone do Twojej usługi IoT hostowanej w chmurze. Twój kod obsłuży wszystkie wysłane wiadomości, ale będzie działał tylko wtedy, gdy będzie to potrzebne. + +✅ Spójrz na kod, który napisałeś jako kod serwera nasłuchujący wiadomości przez MQTT. Jak mógłby on działać w chmurze, korzystając z bezserwerowości? Jak myślisz, jakie zmiany byłyby potrzebne, aby dostosować kod do przetwarzania bezserwerowego? + +> 💁 Model bezserwerowy jest również wdrażany w innych usługach chmurowych, oprócz uruchamiania kodu. Na przykład, w chmurze dostępne są bazy danych bezserwerowe, które korzystają z modelu cenowego bezserwerowego, gdzie płacisz za każde żądanie wykonane wobec bazy danych, takie jak zapytanie czy wstawienie danych. Koszty są zwykle oparte na ilości pracy potrzebnej do obsługi żądania. Na przykład, pojedyncze zapytanie o jeden wiersz na podstawie klucza głównego będzie kosztować mniej niż skomplikowana operacja łącząca wiele tabel i zwracająca tysiące wierszy. + +## Tworzenie aplikacji bezserwerowej + +Usługa przetwarzania bezserwerowego od Microsoftu nazywa się Azure Functions. + +![Logo Azure Functions](../../../../../translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.pl.png) + +Krótki film poniżej przedstawia przegląd Azure Functions. + +[![Film o Azure Functions](https://img.youtube.com/vi/8-jz5f_JyEQ/0.jpg)](https://www.youtube.com/watch?v=8-jz5f_JyEQ) + +> 🎥 Kliknij obraz powyżej, aby obejrzeć film. + +✅ Poświęć chwilę na zbadanie i przeczytanie przeglądu Azure Functions w [dokumentacji Microsoft Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-overview?WT.mc_id=academic-17441-jabenn). + +Aby napisać Azure Functions, zaczynasz od aplikacji Azure Functions w wybranym przez siebie języku. Domyślnie Azure Functions obsługuje Python, JavaScript, TypeScript, C#, F#, Java i Powershell. W tej lekcji nauczysz się, jak napisać aplikację Azure Functions w Pythonie. + +> 💁 Azure Functions obsługuje również niestandardowe obsługiwacze, dzięki czemu możesz pisać swoje funkcje w dowolnym języku, który obsługuje żądania HTTP, w tym w starszych językach, takich jak COBOL. + +Aplikacje funkcji składają się z jednego lub więcej *wyzwalaczy* — funkcji, które reagują na zdarzenia. Możesz mieć wiele wyzwalaczy w jednej aplikacji funkcji, które współdzielą wspólną konfigurację. Na przykład w pliku konfiguracyjnym Twojej aplikacji funkcji możesz mieć szczegóły połączenia z IoT Hub, a wszystkie funkcje w aplikacji mogą z tego korzystać, aby się połączyć i nasłuchiwać zdarzeń. + +### Zadanie - zainstaluj narzędzia Azure Functions + +> W momencie pisania tego tekstu narzędzia do kodowania Azure Functions nie działają w pełni na komputerach Apple Silicon z projektami w Pythonie. Będziesz musiał użyć komputera Mac z procesorem Intel, komputera z systemem Windows lub komputera z systemem Linux. + +Jedną z wielkich zalet Azure Functions jest to, że możesz je uruchamiać lokalnie. To samo środowisko uruchomieniowe, które jest używane w chmurze, może być uruchamiane na Twoim komputerze, co pozwala na pisanie kodu reagującego na wiadomości IoT i jego lokalne uruchamianie. Możesz nawet debugować swój kod podczas obsługi zdarzeń. Gdy będziesz zadowolony z kodu, możesz go wdrożyć w chmurze. + +Narzędzia Azure Functions są dostępne jako interfejs wiersza poleceń, znany jako Azure Functions Core Tools. + +1. Zainstaluj narzędzia Azure Functions Core Tools, postępując zgodnie z instrukcjami w [dokumentacji Azure Functions Core Tools](https://docs.microsoft.com/azure/azure-functions/functions-run-local?WT.mc_id=academic-17441-jabenn). + +1. Zainstaluj rozszerzenie Azure Functions dla VS Code. To rozszerzenie zapewnia wsparcie dla tworzenia, debugowania i wdrażania funkcji Azure. Zapoznaj się z [dokumentacją rozszerzenia Azure Functions](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-azuretools.vscode-azurefunctions), aby uzyskać instrukcje dotyczące instalacji tego rozszerzenia w VS Code. + +Podczas wdrażania aplikacji Azure Functions w chmurze potrzebuje ona niewielkiej ilości pamięci w chmurze do przechowywania takich rzeczy jak pliki aplikacji i pliki dziennika. Podczas lokalnego uruchamiania aplikacji Functions nadal musisz połączyć się z pamięcią w chmurze, ale zamiast korzystać z rzeczywistej pamięci w chmurze, możesz użyć emulatora pamięci o nazwie [Azurite](https://github.com/Azure/Azurite). Działa on lokalnie, ale zachowuje się jak pamięć w chmurze. + +> 🎓 W Azure pamięć używana przez Azure Functions to konto magazynu Azure. Konta te mogą przechowywać pliki, bloby, dane w tabelach lub dane w kolejkach. Możesz współdzielić jedno konto magazynu między wieloma aplikacjami, takimi jak aplikacja Functions i aplikacja internetowa. + +1. Azurite to aplikacja Node.js, więc musisz zainstalować Node.js. Możesz znaleźć instrukcje dotyczące pobierania i instalacji na [stronie Node.js](https://nodejs.org/). Jeśli używasz Maca, możesz również zainstalować go za pomocą [Homebrew](https://formulae.brew.sh/formula/node). + +1. Zainstaluj Azurite za pomocą następującego polecenia (`npm` to narzędzie instalowane razem z Node.js): + + ```sh + npm install -g azurite + ``` + +1. Utwórz folder o nazwie `azurite`, który Azurite będzie używać do przechowywania danych: + + ```sh + mkdir azurite + ``` + +1. Uruchom Azurite, przekazując mu ten nowy folder: + + ```sh + azurite --location azurite + ``` + + Emulator pamięci Azurite zostanie uruchomiony i będzie gotowy do połączenia z lokalnym środowiskiem uruchomieniowym Functions. + + ```output + ➜ ~ azurite --location azurite + Azurite Blob service is starting at http://127.0.0.1:10000 + Azurite Blob service is successfully listening at http://127.0.0.1:10000 + Azurite Queue service is starting at http://127.0.0.1:10001 + Azurite Queue service is successfully listening at http://127.0.0.1:10001 + Azurite Table service is starting at http://127.0.0.1:10002 + Azurite Table service is successfully listening at http://127.0.0.1:10002 + ``` + +### Zadanie - utwórz projekt Azure Functions + +Interfejs wiersza poleceń Azure Functions może być używany do tworzenia nowej aplikacji funkcji. + +1. Utwórz folder dla swojej aplikacji funkcji i przejdź do niego. Nazwij go `soil-moisture-trigger`. + + ```sh + mkdir soil-moisture-trigger + cd soil-moisture-trigger + ``` + +1. Utwórz wirtualne środowisko Pythona w tym folderze: + + ```sh + python3 -m venv .venv + ``` + +1. Aktywuj wirtualne środowisko: + + * W systemie Windows: + * Jeśli używasz Wiersza Poleceń lub Wiersza Poleceń przez Windows Terminal, uruchom: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Jeśli używasz PowerShell, uruchom: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + * W systemie macOS lub Linux uruchom: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Te polecenia powinny być uruchamiane z tej samej lokalizacji, w której uruchomiłeś polecenie tworzenia wirtualnego środowiska. Nigdy nie musisz przechodzić do folderu `.venv`, zawsze uruchamiaj polecenie aktywacji i inne polecenia instalacji pakietów lub uruchamiania kodu z folderu, w którym utworzyłeś wirtualne środowisko. + +1. Uruchom następujące polecenie, aby utworzyć aplikację funkcji w tym folderze: + + ```sh + func init --worker-runtime python soil-moisture-trigger + ``` + + To polecenie utworzy trzy pliki w bieżącym folderze: + + * `host.json` - ten dokument JSON zawiera ustawienia Twojej aplikacji funkcji. Nie będziesz musiał modyfikować tych ustawień. + * `local.settings.json` - ten dokument JSON zawiera ustawienia, których Twoja aplikacja używa podczas lokalnego uruchamiania, takie jak ciągi połączeń do Twojego IoT Hub. Te ustawienia są tylko lokalne i nie powinny być dodawane do systemu kontroli wersji. Podczas wdrażania aplikacji w chmurze te ustawienia nie są wdrażane, zamiast tego Twoje ustawienia są ładowane z ustawień aplikacji. To zostanie omówione później w tej lekcji. + * `requirements.txt` - to [plik wymagań Pip](https://pip.pypa.io/en/stable/user_guide/#requirements-files), który zawiera pakiety Pip potrzebne do uruchomienia Twojej aplikacji funkcji. + +1. Plik `local.settings.json` zawiera ustawienie dla konta magazynu, które aplikacja funkcji będzie używać. Domyślnie jest ono puste, więc musi zostać ustawione. Aby połączyć się z lokalnym emulatorem pamięci Azurite, ustaw tę wartość na następującą: + + ```json + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + ``` + +1. Zainstaluj niezbędne pakiety Pip za pomocą pliku wymagań: + + ```sh + pip install -r requirements.txt + ``` + + > 💁 Wymagane pakiety Pip muszą znajdować się w tym pliku, aby podczas wdrażania aplikacji funkcji w chmurze środowisko uruchomieniowe mogło upewnić się, że zainstalowano odpowiednie pakiety. + +1. Aby sprawdzić, czy wszystko działa poprawnie, możesz uruchomić środowisko uruchomieniowe funkcji. Uruchom następujące polecenie: + + ```sh + func start + ``` + + Zobaczysz, jak środowisko uruchomieniowe się uruchamia i zgłasza, że nie znalazło żadnych funkcji zadaniowych (wyzwalaczy). + + ```output + (.venv) ➜ soil-moisture-trigger func start + Found Python version 3.9.1 (python3). + + Azure Functions Core Tools + Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit) + Function Runtime Version: 3.0.15417.0 + + [2021-05-05T01:24:46.795Z] No job functions found. + ``` +> ⚠️ Jeśli pojawi się powiadomienie o zaporze, udziel dostępu, ponieważ aplikacja `func` musi mieć możliwość odczytu i zapisu w Twojej sieci. +> ⚠️ Jeśli używasz macOS, w wynikach mogą pojawić się ostrzeżenia: +> +> ```output + > (.venv) ➜ soil-moisture-trigger func start + > Found Python version 3.9.1 (python3). + > + > Azure Functions Core Tools + > Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit) + > Function Runtime Version: 3.0.15417.0 + > + > [2021-06-16T08:18:28.315Z] Cannot create directory for shared memory usage: /dev/shm/AzureFunctions + > [2021-06-16T08:18:28.316Z] System.IO.FileSystem: Access to the path '/dev/shm/AzureFunctions' is denied. Operation not permitted. + > [2021-06-16T08:18:30.361Z] No job functions found. + > ``` +> +> Możesz je zignorować, o ile aplikacja Functions uruchamia się poprawnie i wyświetla działające funkcje. Jak wspomniano w [tym pytaniu na Microsoft Docs Q&A](https://docs.microsoft.com/answers/questions/396617/azure-functions-core-tools-error-osx-devshmazurefu.html?WT.mc_id=academic-17441-jabenn), można je zignorować. + +1. Zatrzymaj aplikację Functions, naciskając `ctrl+c`. + +1. Otwórz bieżący folder w VS Code, albo uruchamiając VS Code i otwierając ten folder, albo uruchamiając następujące polecenie: + + ```sh + code . + ``` + + VS Code wykryje Twój projekt Functions i wyświetli powiadomienie: + + ```output + Detected an Azure Functions Project in folder "soil-moisture-trigger" that may have been created outside of + VS Code. Initialize for optimal use with VS Code? + ``` + + ![Powiadomienie](../../../../../translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.pl.png) + + Wybierz **Yes** w tym powiadomieniu. + +1. Upewnij się, że w terminalu VS Code działa wirtualne środowisko Python. Jeśli to konieczne, zakończ je i uruchom ponownie. + +## Utwórz wyzwalacz zdarzeń IoT Hub + +Aplikacja Functions jest powłoką dla Twojego kodu serwerless. Aby reagować na zdarzenia IoT Hub, możesz dodać wyzwalacz IoT Hub do tej aplikacji. Wyzwalacz musi połączyć się ze strumieniem wiadomości wysyłanych do IoT Hub i na nie reagować. Aby uzyskać ten strumień wiadomości, Twój wyzwalacz musi połączyć się z *kompatybilnym punktem końcowym Event Hub* IoT Hub. + +IoT Hub opiera się na innej usłudze Azure zwanej Azure Event Hubs. Event Hubs to usługa umożliwiająca wysyłanie i odbieranie wiadomości, a IoT Hub rozszerza ją o funkcje dla urządzeń IoT. Sposób, w jaki łączysz się, aby odczytać wiadomości z IoT Hub, jest taki sam, jak w przypadku korzystania z Event Hubs. + +✅ Zrób trochę badań: Przeczytaj przegląd Event Hubs w [dokumentacji Azure Event Hubs](https://docs.microsoft.com/azure/event-hubs/event-hubs-about?WT.mc_id=academic-17441-jabenn). Jak podstawowe funkcje porównują się z IoT Hub? + +Aby urządzenie IoT mogło połączyć się z IoT Hub, musi używać klucza tajnego, który zapewnia, że tylko dozwolone urządzenia mogą się połączyć. To samo dotyczy połączenia w celu odczytu wiadomości – Twój kod będzie potrzebował ciągu połączenia zawierającego klucz tajny oraz szczegóły IoT Hub. + +> 💁 Domyślny ciąg połączenia, który otrzymujesz, ma uprawnienia **iothubowner**, co daje każdemu kodowi, który go używa, pełne uprawnienia do IoT Hub. Idealnie powinieneś łączyć się z najniższym poziomem wymaganych uprawnień. Zostanie to omówione w następnej lekcji. + +Po nawiązaniu połączenia przez wyzwalacz, kod wewnątrz funkcji będzie wywoływany dla każdej wiadomości wysłanej do IoT Hub, niezależnie od tego, które urządzenie ją wysłało. Wyzwalacz przekaże wiadomość jako parametr. + +### Zadanie - uzyskaj ciąg połączenia kompatybilnego punktu końcowego Event Hub + +1. W terminalu VS Code uruchom następujące polecenie, aby uzyskać ciąg połączenia dla kompatybilnego punktu końcowego Event Hub IoT Hub: + + ```sh + az iot hub connection-string show --default-eventhub \ + --output table \ + --hub-name + ``` + + Zamień `` na nazwę, której użyłeś dla swojego IoT Hub. + +1. W VS Code otwórz plik `local.settings.json`. Dodaj następującą wartość w sekcji `Values`: + + ```json + "IOT_HUB_CONNECTION_STRING": "" + ``` + + Zamień `` na wartość z poprzedniego kroku. Musisz dodać przecinek po poprzedniej linii, aby plik był poprawnym JSON-em. + +### Zadanie - utwórz wyzwalacz zdarzeń + +Teraz możesz utworzyć wyzwalacz zdarzeń. + +1. W terminalu VS Code uruchom następujące polecenie z folderu `soil-moisture-trigger`: + + ```sh + func new --name iot-hub-trigger --template "Azure Event Hub trigger" + ``` + + To polecenie tworzy nową funkcję o nazwie `iot-hub-trigger`. Wyzwalacz połączy się z kompatybilnym punktem końcowym Event Hub w IoT Hub, więc możesz użyć wyzwalacza Event Hub. Nie ma specyficznego wyzwalacza IoT Hub. + +To utworzy folder w folderze `soil-moisture-trigger` o nazwie `iot-hub-trigger`, który zawiera tę funkcję. W tym folderze znajdą się następujące pliki: + +* `__init__.py` - plik kodu Python zawierający wyzwalacz, używający standardowej konwencji nazewnictwa plików Python, aby przekształcić ten folder w moduł Python. + + Ten plik będzie zawierał następujący kod: + + ```python + import logging + + import azure.functions as func + + + def main(event: func.EventHubEvent): + logging.info('Python EventHub trigger processed an event: %s', + event.get_body().decode('utf-8')) + ``` + + Główna część wyzwalacza to funkcja `main`. To właśnie ta funkcja jest wywoływana z wydarzeniami z IoT Hub. Funkcja ma parametr `event`, który zawiera `EventHubEvent`. Za każdym razem, gdy wiadomość jest wysyłana do IoT Hub, funkcja jest wywoływana, przekazując tę wiadomość jako `event`, wraz z właściwościami, które są takie same jak adnotacje, które widziałeś w poprzedniej lekcji. + + Główna część tej funkcji loguje zdarzenie. + +* `function.json` - zawiera konfigurację dla wyzwalacza. Główna konfiguracja znajduje się w sekcji `bindings`. Binding to termin określający połączenie między Azure Functions a innymi usługami Azure. Ta funkcja ma binding wejściowy do Event Hub - łączy się z Event Hub i odbiera dane. + + > 💁 Możesz także mieć bindingi wyjściowe, dzięki którym dane wyjściowe funkcji są wysyłane do innej usługi. Na przykład możesz dodać binding wyjściowy do bazy danych i zwrócić zdarzenie IoT Hub z funkcji, a zostanie ono automatycznie wstawione do bazy danych. + + ✅ Zrób trochę badań: Przeczytaj o bindingach w [dokumentacji koncepcji wyzwalaczy i bindingów Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings?WT.mc_id=academic-17441-jabenn&tabs=python). + + Sekcja `bindings` zawiera konfigurację dla bindingu. Interesujące wartości to: + + * `"type": "eventHubTrigger"` - informuje funkcję, że musi nasłuchiwać zdarzeń z Event Hub + * `"name": "events"` - to nazwa parametru używanego dla zdarzeń Event Hub. Odpowiada nazwie parametru w funkcji `main` w kodzie Python. + * `"direction": "in"` - to binding wejściowy, dane z Event Hub trafiają do funkcji + * `"connection": ""` - definiuje nazwę ustawienia, z którego odczytywany jest ciąg połączenia. Podczas uruchamiania lokalnie, ustawienie to zostanie odczytane z pliku `local.settings.json`. + + > 💁 Ciąg połączenia nie może być przechowywany w pliku `function.json`, musi być odczytywany z ustawień. Ma to na celu zapobieżenie przypadkowemu ujawnieniu ciągu połączenia. + +1. Z powodu [błędu w szablonie Azure Functions](https://github.com/Azure/azure-functions-templates/issues/1250), pole `cardinality` w pliku `function.json` ma nieprawidłową wartość. Zaktualizuj tę wartość z `many` na `one`: + + ```json + "cardinality": "one", + ``` + +1. Zaktualizuj wartość `"connection"` w pliku `function.json`, aby wskazywała na nową wartość dodaną do pliku `local.settings.json`: + + ```json + "connection": "IOT_HUB_CONNECTION_STRING", + ``` + + > 💁 Pamiętaj - musi to wskazywać na ustawienie, a nie zawierać rzeczywisty ciąg połączenia. + +1. Ciąg połączenia zawiera wartość `eventHubName`, więc wartość dla tego pola w pliku `function.json` musi być wyczyszczona. Zaktualizuj tę wartość do pustego ciągu: + + ```json + "eventHubName": "", + ``` + +### Zadanie - uruchom wyzwalacz zdarzeń + +1. Upewnij się, że nie uruchamiasz monitora zdarzeń IoT Hub. Jeśli działa on jednocześnie z aplikacją Functions, aplikacja Functions nie będzie mogła się połączyć i konsumować zdarzeń. + + > 💁 Wiele aplikacji może łączyć się z punktami końcowymi IoT Hub, używając różnych *grup konsumentów*. Zostanie to omówione w późniejszej lekcji. + +1. Aby uruchomić aplikację Functions, uruchom następujące polecenie w terminalu VS Code: + + ```sh + func start + ``` + + Aplikacja Functions uruchomi się, wykryje funkcję `iot-hub-trigger` i przetworzy wszystkie zdarzenia, które zostały już wysłane do IoT Hub w ciągu ostatniego dnia. + + ```output + (.venv) ➜ soil-moisture-trigger func start + Found Python version 3.9.1 (python3). + + Azure Functions Core Tools + Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit) + Function Runtime Version: 3.0.15417.0 + + Functions: + + iot-hub-trigger: eventHubTrigger + + For detailed output, run func with --verbose flag. + [2021-05-05T02:44:07.517Z] Worker process started and initialized. + [2021-05-05T02:44:09.202Z] Executing 'Functions.iot-hub-trigger' (Reason='(null)', Id=802803a5-eae9-4401-a1f4-176631456ce4) + [2021-05-05T02:44:09.205Z] Trigger Details: PartitionId: 0, Offset: 1011240-1011632, EnqueueTimeUtc: 2021-05-04T19:04:04.2030000Z-2021-05-04T19:04:04.3900000Z, SequenceNumber: 2546-2547, Count: 2 + [2021-05-05T02:44:09.352Z] Python EventHub trigger processed an event: {"soil_moisture":628} + [2021-05-05T02:44:09.354Z] Python EventHub trigger processed an event: {"soil_moisture":624} + [2021-05-05T02:44:09.395Z] Executed 'Functions.iot-hub-trigger' (Succeeded, Id=802803a5-eae9-4401-a1f4-176631456ce4, Duration=245ms) + ``` + + Każde wywołanie funkcji będzie otoczone blokiem `Executing 'Functions.iot-hub-trigger'`/`Executed 'Functions.iot-hub-trigger'` w wynikach, dzięki czemu zobaczysz, ile wiadomości zostało przetworzonych w każdym wywołaniu funkcji. + +1. Upewnij się, że Twoje urządzenie IoT działa. Zobaczysz nowe wiadomości o wilgotności gleby pojawiające się w aplikacji Functions. + +1. Zatrzymaj i ponownie uruchom aplikację Functions. Zobaczysz, że nie przetworzy ponownie poprzednich wiadomości, przetworzy tylko nowe wiadomości. + +> 💁 VS Code obsługuje również debugowanie Twoich funkcji. Możesz ustawić punkty przerwania, klikając na marginesie przy początku każdej linii kodu, lub umieszczając kursor na linii kodu i wybierając *Run -> Toggle breakpoint*, lub naciskając `F9`. Możesz uruchomić debuger, wybierając *Run -> Start debugging*, naciskając `F5`, lub wybierając panel *Run and debug* i klikając przycisk **Start debugging**. Dzięki temu możesz zobaczyć szczegóły przetwarzanych zdarzeń. + +#### Rozwiązywanie problemów + +* Jeśli otrzymasz następujący błąd: + + ```output + The listener for function 'Functions.iot-hub-trigger' was unable to start. Microsoft.WindowsAzure.Storage: Connection refused. System.Net.Http: Connection refused. System.Private.CoreLib: Connection refused. + ``` + + Sprawdź, czy Azurite działa i czy ustawiłeś `AzureWebJobsStorage` w pliku `local.settings.json` na `UseDevelopmentStorage=true`. + +* Jeśli otrzymasz następujący błąd: + + ```output + System.Private.CoreLib: Exception while executing function: Functions.iot-hub-trigger. System.Private.CoreLib: Result: Failure Exception: AttributeError: 'list' object has no attribute 'get_body' + ``` + + Sprawdź, czy ustawiłeś `cardinality` w pliku `function.json` na `one`. + +* Jeśli otrzymasz następujący błąd: + + ```output + Azure.Messaging.EventHubs: The path to an Event Hub may be specified as part of the connection string or as a separate value, but not both. Please verify that your connection string does not have the `EntityPath` token if you are passing an explicit Event Hub name. (Parameter 'connectionString'). + ``` + + Sprawdź, czy ustawiłeś `eventHubName` w pliku `function.json` na pusty ciąg. + +## Wysyłanie żądań metod bezpośrednich z kodu serwerless + +Do tej pory Twoja aplikacja Functions nasłuchuje wiadomości z IoT Hub, używając kompatybilnego punktu końcowego Event Hub. Teraz musisz wysyłać polecenia do urządzenia IoT. Odbywa się to za pomocą innego połączenia z IoT Hub przez *Registry Manager*. Registry Manager to narzędzie, które pozwala zobaczyć, jakie urządzenia są zarejestrowane w IoT Hub, i komunikować się z tymi urządzeniami, wysyłając wiadomości z chmury do urządzenia, żądania metod bezpośrednich lub aktualizując bliźniaka urządzenia. Możesz również używać go do rejestrowania, aktualizowania lub usuwania urządzeń IoT z IoT Hub. + +Aby połączyć się z Registry Manager, potrzebujesz ciągu połączenia. + +### Zadanie - uzyskaj ciąg połączenia Registry Manager + +1. Aby uzyskać ciąg połączenia, uruchom następujące polecenie: + + ```sh + az iot hub connection-string show --policy-name service \ + --output table \ + --hub-name + ``` + + Zamień `` na nazwę, której użyłeś dla swojego IoT Hub. + + Ciąg połączenia jest żądany dla polityki *ServiceConnect* za pomocą parametru `--policy-name service`. Podczas żądania ciągu połączenia możesz określić, jakie uprawnienia ten ciąg połączenia będzie umożliwiał. Polityka ServiceConnect pozwala Twojemu kodowi na połączenie i wysyłanie wiadomości do urządzeń IoT. + + ✅ Zrób trochę badań: Przeczytaj o różnych politykach w [dokumentacji uprawnień IoT Hub](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-security#iot-hub-permissions?WT.mc_id=academic-17441-jabenn) + +1. W VS Code otwórz plik `local.settings.json`. Dodaj następującą wartość w sekcji `Values`: + + ```json + "REGISTRY_MANAGER_CONNECTION_STRING": "" + ``` + + Zamień `` na wartość z poprzedniego kroku. Musisz dodać przecinek po poprzedniej linii, aby plik był poprawnym JSON-em. + +### Zadanie - wyślij żądanie metody bezpośredniej do urządzenia + +1. SDK dla Registry Manager jest dostępne jako pakiet Pip. Dodaj następującą linię do pliku `requirements.txt`, aby dodać zależność od tego pakietu: + + ```sh + azure-iot-hub + ``` + +1. Upewnij się, że terminal VS Code ma aktywowane wirtualne środowisko, i uruchom następujące polecenie, aby zainstalować pakiety Pip: + + ```sh + pip install -r requirements.txt + ``` + +1. Dodaj następujące importy do pliku `__init__.py`: + + ```python + import json + import os + from azure.iot.hub import IoTHubRegistryManager + from azure.iot.hub.models import CloudToDeviceMethod + ``` + + To importuje niektóre biblioteki systemowe, a także biblioteki do interakcji z Registry Manager i wysyłania żądań metod bezpośrednich. + +1. Usuń kod z wnętrza metody `main`, ale zachowaj samą metodę. + +1. W metodzie `main` dodaj następujący kod: + + ```python + body = json.loads(event.get_body().decode('utf-8')) + device_id = event.iothub_metadata['connection-device-id'] + + logging.info(f'Received message: {body} from {device_id}') + ``` + + Ten kod wyodrębnia treść zdarzenia, która zawiera wiadomość JSON wysłaną przez urządzenie IoT. + + Następnie pobiera identyfikator urządzenia z adnotacji przekazanych z wiadomością. Treść zdarzenia zawiera wiadomość wysłaną jako telemetria, a słownik `iothub_metadata` zawiera właściwości ustawione przez IoT Hub, takie jak identyfikator urządzenia nadawcy i czas wysłania wiadomości. + + Te informacje są następnie logowane. Zobaczysz to logowanie w terminalu podczas lokalnego uruchamiania aplikacji Functions. + +1. Poniżej tego dodaj następujący kod: + + ```python + soil_moisture = body['soil_moisture'] + + if soil_moisture > 450: + direct_method = CloudToDeviceMethod(method_name='relay_on', payload='{}') + else: + direct_method = CloudToDeviceMethod(method_name='relay_off', payload='{}') + ``` + + Ten kod pobiera wilgotność gleby z wiadomości. Następnie sprawdza wilgotność gleby i w zależności od wartości tworzy klasę pomocniczą dla żądania metody bezpośredniej dla metody `relay_on` lub `relay_off`. Żądanie metody nie wymaga ładunku, więc wysyłany jest pusty dokument JSON. + +1. Poniżej tego dodaj następujący kod: + + ```python + logging.info(f'Sending direct method request for {direct_method.method_name} for device {device_id}') + + registry_manager_connection_string = os.environ['REGISTRY_MANAGER_CONNECTION_STRING'] + registry_manager = IoTHubRegistryManager(registry_manager_connection_string) + ``` +Ten kod ładuje `REGISTRY_MANAGER_CONNECTION_STRING` z pliku `local.settings.json`. Wartości w tym pliku są udostępniane jako zmienne środowiskowe i można je odczytać za pomocą funkcji `os.environ`, która zwraca słownik wszystkich zmiennych środowiskowych. + +> 💁 Gdy ten kod zostanie wdrożony w chmurze, wartości z pliku `local.settings.json` zostaną ustawione jako *Application Settings* i można je odczytać ze zmiennych środowiskowych. + +Kod następnie tworzy instancję pomocniczej klasy Registry Manager, używając ciągu połączenia. + +1. Poniżej dodaj następujący kod: + + ```python + registry_manager.invoke_device_method(device_id, direct_method) + + logging.info('Direct method request sent!') + ``` + + Ten kod instruuje menedżera rejestru, aby wysłał żądanie metody bezpośredniej do urządzenia, które wysłało telemetrię. + + > 💁 W wersjach aplikacji, które stworzyłeś w poprzednich lekcjach, używając MQTT, polecenia sterowania przekaźnikiem były wysyłane do wszystkich urządzeń. Kod zakładał, że będziesz mieć tylko jedno urządzenie. Ta wersja kodu wysyła żądanie metody do pojedynczego urządzenia, dzięki czemu działa, jeśli masz wiele zestawów czujników wilgotności i przekaźników, wysyłając odpowiednie żądanie metody do właściwego urządzenia. + +1. Uruchom aplikację Functions i upewnij się, że Twoje urządzenie IoT wysyła dane. Zobaczysz przetwarzane wiadomości i wysyłane żądania metod bezpośrednich. Przesuwaj czujnik wilgotności gleby w i poza glebę, aby zobaczyć zmieniające się wartości i włączanie/wyłączanie przekaźnika. + +> 💁 Ten kod znajdziesz w folderze [code/functions](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud/code/functions). + +## Wdróż swój kod bezserwerowy w chmurze + +Twój kod działa teraz lokalnie, więc następnym krokiem jest wdrożenie aplikacji Functions w chmurze. + +### Zadanie - utwórz zasoby w chmurze + +Twoja aplikacja Functions musi zostać wdrożona w zasobie Functions App w Azure, znajdującym się w grupie zasobów, którą utworzyłeś dla swojego IoT Hub. Będziesz także potrzebować konta magazynu utworzonego w Azure, aby zastąpić emulowane konto działające lokalnie. + +1. Uruchom następujące polecenie, aby utworzyć konto magazynu: + + ```sh + az storage account create --resource-group soil-moisture-sensor \ + --sku Standard_LRS \ + --name + ``` + + Zamień `` na nazwę swojego konta magazynu. Musi być ona globalnie unikalna, ponieważ stanowi część adresu URL używanego do uzyskania dostępu do konta magazynu. Możesz używać tylko małych liter i cyfr, bez innych znaków, a nazwa jest ograniczona do 24 znaków. Użyj czegoś w rodzaju `sms` i dodaj unikalny identyfikator na końcu, na przykład losowe słowa lub swoje imię. + + Opcja `--sku Standard_LRS` wybiera poziom cenowy, wybierając najtańsze konto ogólnego przeznaczenia. Nie ma darmowego poziomu magazynu, a płacisz za to, co wykorzystasz. Koszty są stosunkowo niskie, a najdroższy magazyn kosztuje mniej niż 0,05 USD miesięcznie za gigabajt przechowywanych danych. + + ✅ Przeczytaj więcej o cenach na stronie [Azure Storage Account pricing page](https://azure.microsoft.com/pricing/details/storage/?WT.mc_id=academic-17441-jabenn) + +1. Uruchom następujące polecenie, aby utworzyć aplikację Functions: + + ```sh + az functionapp create --resource-group soil-moisture-sensor \ + --runtime python \ + --functions-version 3 \ + --os-type Linux \ + --consumption-plan-location \ + --storage-account \ + --name + ``` + + Zamień `` na lokalizację, której użyłeś podczas tworzenia grupy zasobów w poprzedniej lekcji. + + Zamień `` na nazwę konta magazynu, które utworzyłeś w poprzednim kroku. + + Zamień `` na unikalną nazwę dla swojej aplikacji Functions. Musi być ona globalnie unikalna, ponieważ stanowi część adresu URL, który może być używany do uzyskania dostępu do aplikacji Functions. Użyj czegoś w rodzaju `soil-moisture-sensor-` i dodaj unikalny identyfikator na końcu, na przykład losowe słowa lub swoje imię. + + Opcja `--functions-version 3` ustawia wersję Azure Functions do użycia. Wersja 3 to najnowsza wersja. + + Opcja `--os-type Linux` informuje środowisko uruchomieniowe Functions, aby używało systemu Linux jako systemu operacyjnego do hostowania tych funkcji. Funkcje mogą być hostowane na systemach Linux lub Windows, w zależności od używanego języka programowania. Aplikacje Python są obsługiwane tylko na systemie Linux. + +### Zadanie - prześlij ustawienia aplikacji + +Podczas tworzenia aplikacji Functions przechowywałeś pewne ustawienia w pliku `local.settings.json` dla ciągów połączeń do swojego IoT Hub. Te ustawienia muszą zostać zapisane jako Application Settings w Twojej aplikacji Functions w Azure, aby mogły być używane przez Twój kod. + +> 🎓 Plik `local.settings.json` jest przeznaczony wyłącznie do ustawień lokalnych i nie powinien być dodawany do systemu kontroli wersji, takiego jak GitHub. Po wdrożeniu w chmurze używane są Application Settings. Application Settings to pary klucz/wartość hostowane w chmurze i odczytywane ze zmiennych środowiskowych w kodzie lub przez środowisko uruchomieniowe podczas łączenia kodu z IoT Hub. + +1. Uruchom następujące polecenie, aby ustawić ustawienie `IOT_HUB_CONNECTION_STRING` w Application Settings aplikacji Functions: + + ```sh + az functionapp config appsettings set --resource-group soil-moisture-sensor \ + --name \ + --settings "IOT_HUB_CONNECTION_STRING=" + ``` + + Zamień `` na nazwę, której użyłeś dla swojej aplikacji Functions. + + Zamień `` na wartość `IOT_HUB_CONNECTION_STRING` z pliku `local.settings.json`. + +1. Powtórz powyższy krok, ale ustaw wartość `REGISTRY_MANAGER_CONNECTION_STRING` na odpowiednią wartość z pliku `local.settings.json`. + +Po uruchomieniu tych poleceń zostanie również wyświetlona lista wszystkich Application Settings dla aplikacji Functions. Możesz użyć tej listy, aby sprawdzić, czy wartości zostały ustawione poprawnie. + +> 💁 Zobaczysz wartość już ustawioną dla `AzureWebJobsStorage`. W pliku `local.settings.json` była ona ustawiona na wartość używającą lokalnego emulatora magazynu. Podczas tworzenia aplikacji Functions przekazujesz konto magazynu jako parametr, a wartość ta jest ustawiana automatycznie w tym ustawieniu. + +### Zadanie - wdroż swoją aplikację Functions w chmurze + +Teraz, gdy aplikacja Functions jest gotowa, Twój kod może zostać wdrożony. + +1. Uruchom następujące polecenie z terminala VS Code, aby opublikować swoją aplikację Functions: + + ```sh + func azure functionapp publish + ``` + + Zamień `` na nazwę, której użyłeś dla swojej aplikacji Functions. + +Kod zostanie spakowany i wysłany do aplikacji Functions, gdzie zostanie wdrożony i uruchomiony. Na konsoli pojawi się wiele komunikatów, kończących się potwierdzeniem wdrożenia i listą wdrożonych funkcji. W tym przypadku lista będzie zawierać tylko wyzwalacz. + +```output +Deployment successful. +Remote build succeeded! +Syncing triggers... +Functions in soil-moisture-sensor: + iot-hub-trigger - [eventHubTrigger] +``` + +Upewnij się, że Twoje urządzenie IoT działa. Zmieniaj poziomy wilgotności, dostosowując wilgotność gleby lub przesuwając czujnik w i poza glebę. Zobaczysz, jak przekaźnik włącza się i wyłącza w zależności od zmian wilgotności gleby. + +--- + +## 🚀 Wyzwanie + +W poprzedniej lekcji zarządzałeś czasem działania przekaźnika, rezygnując z subskrypcji wiadomości MQTT, gdy przekaźnik był włączony, i przez krótki czas po jego wyłączeniu. Nie możesz użyć tej metody tutaj - nie możesz zrezygnować z subskrypcji wyzwalacza IoT Hub. + +Zastanów się nad różnymi sposobami, w jakie możesz to obsłużyć w swojej aplikacji Functions. + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/18) + +## Przegląd i samodzielna nauka + +* Przeczytaj o obliczeniach bezserwerowych na stronie [Serverless Computing na Wikipedii](https://wikipedia.org/wiki/Serverless_computing) +* Przeczytaj o używaniu rozwiązań bezserwerowych w Azure, w tym więcej przykładów, na blogu [Go serverless for your IoT needs Azure](https://azure.microsoft.com/blog/go-serverless-for-your-iot-needs/?WT.mc_id=academic-17441-jabenn) +* Dowiedz się więcej o Azure Functions na [kanale YouTube Azure Functions](https://www.youtube.com/c/AzureFunctions) + +## Zadanie + +[Dodaj ręczne sterowanie przekaźnikiem](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić precyzję, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md b/translations/pl/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md new file mode 100644 index 00000000..4b173059 --- /dev/null +++ b/translations/pl/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md @@ -0,0 +1,68 @@ + +# Dodaj ręczne sterowanie przekaźnikiem + +## Instrukcje + +Kod bezserwerowy może być uruchamiany przez różne zdarzenia, w tym żądania HTTP. Możesz użyć wyzwalaczy HTTP, aby dodać ręczne sterowanie przekaźnikiem, umożliwiając komuś włączenie lub wyłączenie przekaźnika za pomocą żądania internetowego. + +W ramach tego zadania musisz dodać dwa wyzwalacze HTTP do swojej aplikacji Functions App, aby włączyć i wyłączyć przekaźnik, wykorzystując wiedzę zdobytą w tej lekcji do wysyłania poleceń do urządzenia. + +Kilka wskazówek: + +* Możesz dodać wyzwalacz HTTP do swojej istniejącej aplikacji Functions App za pomocą następującego polecenia: + + ```sh + func new --name --template "HTTP trigger" + ``` + + Zamień `` na nazwę dla swojego wyzwalacza HTTP. Użyj czegoś w rodzaju `relay_on` i `relay_off`. + +* Wyzwalacze HTTP mogą mieć kontrolę dostępu. Domyślnie wymagają klucza API specyficznego dla funkcji, który musi być przekazany w URL, aby uruchomić funkcję. W ramach tego zadania możesz usunąć to ograniczenie, aby każdy mógł uruchomić funkcję. Aby to zrobić, zaktualizuj ustawienie `authLevel` w pliku `function.json` dla wyzwalaczy HTTP do następującej wartości: + + ```json + "authLevel": "anonymous" + ``` + + > 💁 Więcej informacji o tej kontroli dostępu znajdziesz w [dokumentacji kluczy dostępu funkcji](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?WT.mc_id=academic-17441-jabenn#authorization-keys). + +* Wyzwalacze HTTP domyślnie obsługują żądania GET i POST. Oznacza to, że możesz je wywoływać za pomocą swojej przeglądarki internetowej - przeglądarki internetowe wykonują żądania GET. + + Kiedy uruchomisz swoją aplikację Functions App lokalnie, zobaczysz URL wyzwalacza: + + ```output + Functions: + + relay_off: [GET,POST] http://localhost:7071/api/relay_off + + relay_on: [GET,POST] http://localhost:7071/api/relay_on + + iot-hub-trigger: eventHubTrigger + ``` + + Wklej URL do swojej przeglądarki i naciśnij `Enter`, lub `Ctrl+kliknij` (`Cmd+kliknij` na macOS) link w oknie terminala w VS Code, aby otworzyć go w domyślnej przeglądarce. To uruchomi wyzwalacz. + + > 💁 Zauważ, że URL zawiera `/api` - wyzwalacze HTTP są domyślnie w subdomenie `api`. + +* Po wdrożeniu aplikacji Functions App, URL wyzwalacza HTTP będzie wyglądał następująco: + + `https://.azurewebsites.net/api/` + + Gdzie `` to nazwa Twojej aplikacji Functions App, a `` to nazwa Twojego wyzwalacza. + +## Kryteria oceny + +| Kryterium | Wzorowe | Zadowalające | Wymaga poprawy | +| --------- | ------- | ------------ | -------------- | +| Tworzenie wyzwalaczy HTTP | Utworzono 2 wyzwalacze do włączania i wyłączania przekaźnika, z odpowiednimi nazwami | Utworzono jeden wyzwalacz z odpowiednią nazwą | Nie udało się utworzyć żadnych wyzwalaczy | +| Sterowanie przekaźnikiem za pomocą wyzwalaczy HTTP | Udało się połączyć oba wyzwalacze z IoT Hub i odpowiednio sterować przekaźnikiem | Udało się połączyć jeden wyzwalacz z IoT Hub i odpowiednio sterować przekaźnikiem | Nie udało się połączyć wyzwalaczy z IoT Hub | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/6-keep-your-plant-secure/README.md b/translations/pl/2-farm/lessons/6-keep-your-plant-secure/README.md new file mode 100644 index 00000000..08e2b913 --- /dev/null +++ b/translations/pl/2-farm/lessons/6-keep-your-plant-secure/README.md @@ -0,0 +1,241 @@ + +# Zabezpiecz swoją roślinę + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obraz, aby zobaczyć większą wersję. + +## Quiz przed wykładem + +[Quiz przed wykładem](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/19) + +## Wprowadzenie + +W ostatnich lekcjach stworzyłeś urządzenie IoT monitorujące glebę i połączyłeś je z chmurą. Ale co, jeśli hakerzy pracujący dla konkurencyjnego rolnika przejęliby kontrolę nad Twoimi urządzeniami IoT? Co, jeśli wysyłaliby fałszywe odczyty wysokiej wilgotności gleby, przez co Twoje rośliny nigdy nie byłyby podlewane, albo włączyliby system nawadniania na stałe, co doprowadziłoby do przelania roślin i ogromnych kosztów za wodę? + +W tej lekcji dowiesz się, jak zabezpieczyć urządzenia IoT. Ponieważ jest to ostatnia lekcja w tym projekcie, nauczysz się również, jak posprzątać swoje zasoby w chmurze, aby zminimalizować potencjalne koszty. + +W tej lekcji omówimy: + +* [Dlaczego musisz zabezpieczać urządzenia IoT?](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Kryptografia](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Zabezpiecz swoje urządzenia IoT](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Generowanie i używanie certyfikatu X.509](../../../../../2-farm/lessons/6-keep-your-plant-secure) + +> 🗑 To ostatnia lekcja w tym projekcie, więc po jej ukończeniu i wykonaniu zadania nie zapomnij posprzątać swoich usług w chmurze. Usługi będą potrzebne do ukończenia zadania, więc upewnij się, że najpierw je wykonasz. +> +> W razie potrzeby zapoznaj się z [przewodnikiem dotyczącym sprzątania projektu](../../../clean-up.md), aby uzyskać instrukcje, jak to zrobić. + +## Dlaczego musisz zabezpieczać urządzenia IoT? + +Bezpieczeństwo IoT polega na zapewnieniu, że tylko oczekiwane urządzenia mogą łączyć się z Twoją usługą IoT w chmurze i wysyłać do niej dane telemetryczne, a tylko Twoja usługa w chmurze może wysyłać polecenia do Twoich urządzeń. Dane IoT mogą być również osobiste, obejmując dane medyczne lub intymne, dlatego cała Twoja aplikacja musi uwzględniać bezpieczeństwo, aby zapobiec wyciekowi tych danych. + +Jeśli Twoja aplikacja IoT nie jest bezpieczna, istnieje wiele ryzyk: + +* Fałszywe urządzenie może wysyłać nieprawidłowe dane, powodując, że Twoja aplikacja zareaguje nieprawidłowo. Na przykład, mogłoby wysyłać ciągłe odczyty wysokiej wilgotności gleby, przez co system nawadniania nigdy by się nie włączał, a Twoje rośliny uschłyby z braku wody. +* Nieautoryzowani użytkownicy mogliby odczytywać dane z urządzeń IoT, w tym dane osobiste lub kluczowe dla biznesu. +* Hakerzy mogliby wysyłać polecenia, aby kontrolować urządzenie w sposób, który mógłby spowodować uszkodzenie urządzenia lub podłączonego sprzętu. +* Łącząc się z urządzeniem IoT, hakerzy mogliby uzyskać dostęp do dodatkowych sieci, aby dostać się do prywatnych systemów. +* Złośliwi użytkownicy mogliby uzyskać dostęp do danych osobowych i wykorzystać je do szantażu. + +To są scenariusze z prawdziwego życia i zdarzają się cały czas. Niektóre przykłady zostały podane w poprzednich lekcjach, ale oto kilka kolejnych: + +* W 2018 roku hakerzy wykorzystali otwarty punkt dostępu WiFi na termostacie akwarium, aby uzyskać dostęp do sieci kasyna i ukraść dane. [The Hacker News - Casino Gets Hacked Through Its Internet-Connected Fish Tank Thermometer](https://thehackernews.com/2018/04/iot-hacking-thermometer.html) +* W 2016 roku botnet Mirai przeprowadził atak typu denial of service na Dyn, dostawcę usług internetowych, co spowodowało zakłócenia w dużej części Internetu. Botnet ten używał złośliwego oprogramowania do łączenia się z urządzeniami IoT, takimi jak rejestratory DVR i kamery, które korzystały z domyślnych nazw użytkowników i haseł, a następnie przeprowadził atak. [The Guardian - DDoS attack that disrupted internet was largest of its kind in history, experts say](https://www.theguardian.com/technology/2016/oct/26/ddos-attack-dyn-mirai-botnet) +* Spiral Toys miało bazę danych użytkowników swoich zabawek CloudPets publicznie dostępną w Internecie. [Troy Hunt - Data from connected CloudPets teddy bears leaked and ransomed, exposing kids' voice messages](https://www.troyhunt.com/data-from-connected-cloudpets-teddy-bears-leaked-and-ransomed-exposing-kids-voice-messages/). +* Strava oznaczała biegaczy, których mijałeś, i pokazywała ich trasy, umożliwiając obcym osobom praktycznie zobaczenie, gdzie mieszkasz. [Kim Komndo - Fitness app could lead a stranger right to your home — change this setting](https://www.komando.com/security-privacy/strava-fitness-app-privacy/755349/). + +✅ Zrób badania: Poszukaj więcej przykładów włamań do IoT i naruszeń danych IoT, zwłaszcza w przypadku przedmiotów osobistych, takich jak szczoteczki do zębów czy wagi podłączone do Internetu. Zastanów się, jaki wpływ te włamania mogłyby mieć na ofiary lub klientów. + +> 💁 Bezpieczeństwo to ogromny temat, a ta lekcja poruszy jedynie podstawy związane z łączeniem urządzenia z chmurą. Inne tematy, które nie zostaną omówione, to monitorowanie zmian danych w trakcie przesyłu, bezpośrednie włamania do urządzeń czy zmiany konfiguracji urządzeń. Zagrożenie związane z hakowaniem IoT jest tak poważne, że opracowano narzędzia takie jak [Azure Defender for IoT](https://azure.microsoft.com/services/azure-defender-for-iot/?WT.mc_id=academic-17441-jabenn). Narzędzia te są podobne do programów antywirusowych i zabezpieczających, które możesz mieć na swoim komputerze, ale są zaprojektowane dla małych, niskowydajnych urządzeń IoT. + +## Kryptografia + +Kiedy urządzenie łączy się z usługą IoT, używa identyfikatora, aby się zidentyfikować. Problem polega na tym, że ten identyfikator można sklonować – haker mógłby skonfigurować złośliwe urządzenie, które używa tego samego identyfikatora co prawdziwe urządzenie, ale wysyła fałszywe dane. + +![Zarówno prawidłowe, jak i złośliwe urządzenia mogą używać tego samego identyfikatora do wysyłania telemetrii](../../../../../translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.pl.png) + +Rozwiązaniem tego problemu jest przekształcenie wysyłanych danych w zaszyfrowany format, używając wartości znanej tylko urządzeniu i chmurze. Proces ten nazywa się *szyfrowaniem*, a wartość używana do szyfrowania danych to *klucz szyfrujący*. + +![Jeśli używane jest szyfrowanie, akceptowane są tylko zaszyfrowane wiadomości, inne są odrzucane](../../../../../translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.pl.png) + +Usługa w chmurze może następnie przekształcić dane z powrotem w czytelny format, używając procesu zwanego *odszyfrowaniem*, korzystając z tego samego klucza szyfrującego lub *klucza deszyfrującego*. Jeśli zaszyfrowana wiadomość nie może zostać odszyfrowana za pomocą klucza, oznacza to, że urządzenie zostało zhakowane, a wiadomość jest odrzucana. + +Technika szyfrowania i odszyfrowywania nazywa się *kryptografią*. + +### Wczesna kryptografia + +Najwcześniejsze rodzaje kryptografii to szyfry podstawieniowe, które sięgają 3500 lat wstecz. Szyfry podstawieniowe polegają na zastępowaniu jednej litery inną. Na przykład [szyfr Cezara](https://wikipedia.org/wiki/Caesar_cipher) polega na przesunięciu alfabetu o określoną liczbę miejsc, przy czym tylko nadawca zaszyfrowanej wiadomości i jej odbiorca wiedzą, o ile liter należy przesunąć. + +[Szyfr Vigenère’a](https://wikipedia.org/wiki/Vigenère_cipher) poszedł o krok dalej, używając słów do szyfrowania tekstu, tak aby każda litera w oryginalnym tekście była przesunięta o inną wartość, zamiast zawsze przesuwać o tę samą liczbę liter. + +Kryptografia była używana w różnych celach, takich jak ochrona receptury glazury garncarskiej w starożytnej Mezopotamii, pisanie sekretnych listów miłosnych w Indiach czy utrzymywanie w tajemnicy starożytnych egipskich zaklęć magicznych. + +### Współczesna kryptografia + +Współczesna kryptografia jest znacznie bardziej zaawansowana, co sprawia, że jest trudniejsza do złamania niż wczesne metody. Współczesna kryptografia wykorzystuje skomplikowaną matematykę do szyfrowania danych, zbyt skomplikowaną, aby ataki brute force były możliwe. + +Kryptografia jest używana na wiele różnych sposobów w celu zapewnienia bezpiecznej komunikacji. Jeśli czytasz tę stronę na GitHubie, możesz zauważyć, że adres strony zaczyna się od *HTTPS*, co oznacza, że komunikacja między Twoją przeglądarką a serwerami GitHuba jest zaszyfrowana. Jeśli ktoś byłby w stanie odczytać ruch internetowy między Twoją przeglądarką a GitHubem, nie byłby w stanie odczytać danych, ponieważ są one zaszyfrowane. Twój komputer może nawet szyfrować wszystkie dane na dysku twardym, aby w przypadku kradzieży nikt nie mógł odczytać Twoich danych bez hasła. + +> 🎓 HTTPS oznacza HyperText Transfer Protocol **Secure** + +Niestety, nie wszystko jest bezpieczne. Niektóre urządzenia nie mają żadnych zabezpieczeń, inne są zabezpieczone łatwymi do złamania kluczami, a czasami wszystkie urządzenia tego samego typu używają tego samego klucza. Zdarzały się przypadki bardzo osobistych urządzeń IoT, które wszystkie miały to samo hasło do połączenia przez WiFi lub Bluetooth. Jeśli możesz połączyć się ze swoim urządzeniem, możesz połączyć się z urządzeniem innej osoby. Po połączeniu możesz uzyskać dostęp do bardzo prywatnych danych lub przejąć kontrolę nad ich urządzeniem. + +> 💁 Pomimo złożoności współczesnej kryptografii i twierdzeń, że złamanie szyfrowania może zająć miliardy lat, rozwój komputerów kwantowych otworzył możliwość złamania wszystkich znanych metod szyfrowania w bardzo krótkim czasie! + +### Klucze symetryczne i asymetryczne + +Szyfrowanie występuje w dwóch rodzajach – symetrycznym i asymetrycznym. + +**Symetryczne** szyfrowanie używa tego samego klucza do szyfrowania i odszyfrowywania danych. Zarówno nadawca, jak i odbiorca muszą znać ten sam klucz. Jest to najmniej bezpieczny rodzaj szyfrowania, ponieważ klucz musi zostać w jakiś sposób udostępniony. Aby nadawca mógł wysłać zaszyfrowaną wiadomość odbiorcy, nadawca najpierw musi przesłać odbiorcy klucz. + +![Szyfrowanie symetryczne używa tego samego klucza do szyfrowania i odszyfrowywania wiadomości](../../../../../translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.pl.png) + +Jeśli klucz zostanie przechwycony podczas przesyłania lub jeśli nadawca lub odbiorca zostaną zhakowani i klucz zostanie znaleziony, szyfrowanie można złamać. + +![Szyfrowanie symetryczne jest bezpieczne tylko wtedy, gdy haker nie przechwyci klucza – jeśli tak się stanie, może przechwycić i odszyfrować wiadomość](../../../../../translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.pl.png) + +**Asymetryczne** szyfrowanie używa dwóch kluczy – klucza szyfrującego i klucza deszyfrującego, nazywanych parą kluczy publicznego i prywatnego. Klucz publiczny służy do szyfrowania wiadomości, ale nie można go użyć do jej odszyfrowania, natomiast klucz prywatny służy do odszyfrowania wiadomości, ale nie można go użyć do jej zaszyfrowania. + +![Szyfrowanie asymetryczne używa różnych kluczy do szyfrowania i odszyfrowywania. Klucz szyfrujący jest wysyłany do nadawców wiadomości, aby mogli zaszyfrować wiadomość przed wysłaniem jej do odbiorcy, który posiada klucze](../../../../../translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.pl.png) + +Odbiorca udostępnia swój klucz publiczny, a nadawca używa go do zaszyfrowania wiadomości. Po wysłaniu wiadomości odbiorca odszyfrowuje ją za pomocą swojego klucza prywatnego. Szyfrowanie asymetryczne jest bardziej bezpieczne, ponieważ klucz prywatny jest przechowywany w tajemnicy przez odbiorcę i nigdy nie jest udostępniany. Klucz publiczny może być dostępny dla każdego, ponieważ można go użyć tylko do szyfrowania wiadomości. + +Szyfrowanie symetryczne jest szybsze niż asymetryczne, ale asymetryczne jest bardziej bezpieczne. Niektóre systemy używają obu rodzajów – asymetrycznego do szyfrowania i udostępniania klucza symetrycznego, a następnie symetrycznego do szyfrowania wszystkich danych. Dzięki temu udostępnianie klucza symetrycznego między nadawcą a odbiorcą jest bardziej bezpieczne, a szyfrowanie i odszyfrowywanie danych jest szybsze. + +## Zabezpiecz swoje urządzenia IoT + +Urządzenia IoT można zabezpieczyć za pomocą szyfrowania symetrycznego lub asymetrycznego. Szyfrowanie symetryczne jest łatwiejsze, ale mniej bezpieczne. + +### Klucze symetryczne + +Kiedy konfigurowałeś swoje urządzenie IoT do współpracy z IoT Hub, używałeś ciągu połączenia. Przykładowy ciąg połączenia wygląda następująco: + +```output +HostName=soil-moisture-sensor.azure-devices.net;DeviceId=soil-moisture-sensor;SharedAccessKey=Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0= +``` + +Ten ciąg połączenia składa się z trzech części oddzielonych średnikami, z każdą częścią będącą kluczem i wartością: + +| Klucz | Wartość | Opis | +| --- | ----- | ----------- | +| HostName | `soil-moisture-sensor.azure-devices.net` | Adres URL IoT Hub | +| DeviceId | `soil-moisture-sensor` | Unikalny identyfikator urządzenia | +| SharedAccessKey | `Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0=` | Klucz symetryczny znany urządzeniu i IoT Hub | + +Ostatnia część tego ciągu połączenia, `SharedAccessKey`, to klucz symetryczny znany zarówno urządzeniu, jak i IoT Hub. Klucz ten nigdy nie jest wysyłany z urządzenia do chmury ani z chmury do urządzenia. Zamiast tego jest używany do szyfrowania danych, które są wysyłane lub odbierane. + +✅ Zrób eksperyment. Jak myślisz, co się stanie, jeśli zmienisz część `SharedAccessKey` w ciągu połączenia podczas łączenia swojego urządzenia IoT? Wypróbuj to. + +Kiedy urządzenie po raz pierwszy próbuje się połączyć, wysyła token podpisu dostępu współdzielonego (SAS) składający się z adresu URL IoT Hub, znacznika czasu, kiedy podpis dostępu wygaśnie (zazwyczaj 1 dzień od bieżącego czasu), oraz podpisu. Ten podpis składa się z adresu URL i czasu wygaśnięcia zaszyfrowanych za pomocą klucza dostępu współdzielonego z ciągu połączenia. + +IoT Hub odszyfrowuje ten podpis za pomocą klucza dostępu współdzielonego i jeśli odszyfrowana wartość pasuje do adres +💁 Ze względu na czas wygaśnięcia, Twoje urządzenie IoT musi znać dokładny czas, który zazwyczaj jest odczytywany z serwera [NTP](https://wikipedia.org/wiki/Network_Time_Protocol). Jeśli czas nie jest dokładny, połączenie się nie powiedzie. +Po nawiązaniu połączenia wszystkie dane wysyłane do IoT Hub z urządzenia lub z IoT Hub do urządzenia będą szyfrowane za pomocą współdzielonego klucza dostępu. + +✅ Co myślisz, że się stanie, jeśli wiele urządzeń będzie korzystać z tego samego ciągu połączenia? + +> 💁 Przechowywanie tego klucza w kodzie to zła praktyka bezpieczeństwa. Jeśli haker uzyska dostęp do twojego kodu źródłowego, może zdobyć twój klucz. Utrudnia to również wydawanie kodu, ponieważ musiałbyś rekompilować go z zaktualizowanym kluczem dla każdego urządzenia. Lepiej jest załadować ten klucz z modułu bezpieczeństwa sprzętowego - układu na urządzeniu IoT, który przechowuje zaszyfrowane wartości, które mogą być odczytane przez twój kod. +> +> Podczas nauki IoT często łatwiej jest umieścić klucz w kodzie, tak jak zrobiłeś to w poprzedniej lekcji, ale musisz upewnić się, że ten klucz nie zostanie umieszczony w publicznym systemie kontroli wersji. + +Urządzenia mają 2 klucze i 2 odpowiadające im ciągi połączenia. Pozwala to na rotację kluczy - czyli przełączanie się z jednego klucza na drugi, jeśli pierwszy zostanie skompromitowany, oraz ponowne wygenerowanie pierwszego klucza. + +### Certyfikaty X.509 + +Kiedy używasz szyfrowania asymetrycznego z parą kluczy publiczny/prywatny, musisz dostarczyć swój klucz publiczny każdemu, kto chce wysłać ci dane. Problem polega na tym, jak odbiorca twojego klucza może być pewien, że to faktycznie twój klucz publiczny, a nie kogoś, kto się pod ciebie podszywa? Zamiast dostarczać klucz, możesz dostarczyć swój klucz publiczny w certyfikacie, który został zweryfikowany przez zaufaną trzecią stronę, zwaną certyfikatem X.509. + +Certyfikaty X.509 to cyfrowe dokumenty zawierające klucz publiczny z pary kluczy publiczny/prywatny. Zazwyczaj są one wydawane przez jedną z wielu zaufanych organizacji zwanych [urzędy certyfikacji](https://wikipedia.org/wiki/Certificate_authority) (CAs) i cyfrowo podpisywane przez CA, aby wskazać, że klucz jest ważny i pochodzi od ciebie. Ufasz certyfikatowi i temu, że klucz publiczny pochodzi od osoby, którą certyfikat wskazuje, ponieważ ufasz CA, podobnie jak ufasz paszportowi lub prawu jazdy, ponieważ ufasz krajowi, który je wydał. Certyfikaty kosztują, więc możesz również „podpisać samodzielnie”, czyli stworzyć certyfikat samodzielnie, podpisany przez ciebie, do celów testowych. + +> 💁 Nigdy nie powinieneś używać samopodpisanego certyfikatu w wersji produkcyjnej. + +Te certyfikaty zawierają szereg pól, w tym informacje o tym, od kogo pochodzi klucz publiczny, szczegóły CA, który go wydał, jak długo jest ważny oraz sam klucz publiczny. Przed użyciem certyfikatu dobrą praktyką jest jego weryfikacja poprzez sprawdzenie, czy został podpisany przez oryginalny CA. + +✅ Pełną listę pól w certyfikacie możesz przeczytać w [samouczku Microsoft Understanding X.509 Public Key Certificates](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-certificates?WT.mc_id=academic-17441-jabenn#certificate-fields) + +Podczas korzystania z certyfikatów X.509 zarówno nadawca, jak i odbiorca będą mieli swoje własne klucze publiczne i prywatne, a także certyfikaty X.509 zawierające klucz publiczny. Następnie wymieniają się certyfikatami X.509 w jakiś sposób, używając kluczy publicznych drugiej strony do szyfrowania danych, które wysyłają, oraz swoich własnych kluczy prywatnych do odszyfrowywania danych, które otrzymują. + +![Zamiast udostępniać klucz publiczny, możesz udostępnić certyfikat. Użytkownik certyfikatu może zweryfikować, że pochodzi on od ciebie, sprawdzając u urzędu certyfikacji, który go podpisał.](../../../../../translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.pl.png) + +Jedną z dużych zalet korzystania z certyfikatów X.509 jest to, że mogą być one współdzielone między urządzeniami. Możesz stworzyć jeden certyfikat, przesłać go do IoT Hub i używać go dla wszystkich swoich urządzeń. Każde urządzenie musi wtedy znać tylko klucz prywatny, aby odszyfrować wiadomości, które otrzymuje z IoT Hub. + +Certyfikat używany przez twoje urządzenie do szyfrowania wiadomości wysyłanych do IoT Hub jest publikowany przez Microsoft. Jest to ten sam certyfikat, którego używa wiele usług Azure i czasami jest wbudowany w SDK. + +> 💁 Pamiętaj, klucz publiczny jest właśnie tym - publiczny. Klucz publiczny Azure może być używany tylko do szyfrowania danych wysyłanych do Azure, a nie do ich odszyfrowywania, więc może być udostępniany wszędzie, w tym w kodzie źródłowym. Na przykład możesz go zobaczyć w [kodzie źródłowym Azure IoT C SDK](https://github.com/Azure/azure-iot-sdk-c/blob/master/certs/certs.c). + +✅ Istnieje wiele żargonu związanego z certyfikatami X.509. Możesz przeczytać definicje niektórych terminów, które możesz napotkać, w [Przewodniku po żargonie certyfikatów X.509 dla laików](https://techcommunity.microsoft.com/t5/internet-of-things/the-layman-s-guide-to-x-509-certificate-jargon/ba-p/2203540?WT.mc_id=academic-17441-jabenn) + +## Generowanie i używanie certyfikatu X.509 + +Kroki do wygenerowania certyfikatu X.509 są następujące: + +1. Utwórz parę kluczy publiczny/prywatny. Jednym z najczęściej używanych algorytmów do generowania pary kluczy publiczny/prywatny jest [Rivest–Shamir–Adleman](https://wikipedia.org/wiki/RSA_(cryptosystem))(RSA). + +1. Prześlij klucz publiczny z powiązanymi danymi do podpisania, albo przez CA, albo przez samopodpisanie. + +Azure CLI ma polecenia do tworzenia nowej tożsamości urządzenia w IoT Hub, automatycznego generowania pary kluczy publiczny/prywatny oraz tworzenia samopodpisanego certyfikatu. + +> 💁 Jeśli chcesz zobaczyć szczegółowe kroki, zamiast używać Azure CLI, możesz znaleźć je w [samouczku Microsoft IoT Hub dotyczącym używania OpenSSL do tworzenia samopodpisanych certyfikatów](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-self-sign?WT.mc_id=academic-17441-jabenn) + +### Zadanie - utwórz tożsamość urządzenia za pomocą certyfikatu X.509 + +1. Uruchom następujące polecenie, aby zarejestrować nową tożsamość urządzenia, automatycznie generując klucze i certyfikaty: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor-x509 \ + --am x509_thumbprint \ + --output-dir . \ + --hub-name + ``` + + Zamień `` na nazwę, której użyłeś dla swojego IoT Hub. + + To polecenie utworzy urządzenie o identyfikatorze `soil-moisture-sensor-x509`, aby odróżnić je od tożsamości urządzenia, którą utworzyłeś w poprzedniej lekcji. To polecenie utworzy również 2 pliki w bieżącym katalogu: + + * `soil-moisture-sensor-x509-key.pem` - ten plik zawiera klucz prywatny urządzenia. + * `soil-moisture-sensor-x509-cert.pem` - to plik certyfikatu X.509 dla urządzenia. + + Przechowuj te pliki w bezpiecznym miejscu! Plik z kluczem prywatnym nie powinien być umieszczany w publicznym systemie kontroli wersji. + +### Zadanie - użyj certyfikatu X.509 w kodzie swojego urządzenia + +Przejdź przez odpowiedni przewodnik, aby połączyć swoje urządzenie IoT z chmurą za pomocą certyfikatu X.509: + +* [Arduino - Wio Terminal](wio-terminal-x509.md) +* [Komputer jednopłytkowy - Raspberry Pi/Wirtualne urządzenie IoT](single-board-computer-x509.md) + +--- + +## 🚀 Wyzwanie + +Istnieje wiele sposobów tworzenia, zarządzania i usuwania usług Azure, takich jak Grupy Zasobów i IoT Hub. Jednym z nich jest [Azure Portal](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) - interfejs internetowy, który oferuje GUI do zarządzania usługami Azure. + +Przejdź na [portal.azure.com](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) i zapoznaj się z portalem. Sprawdź, czy potrafisz utworzyć IoT Hub za pomocą portalu, a następnie go usunąć. + +**Wskazówka** - podczas tworzenia usług przez portal nie musisz tworzyć Grupy Zasobów z wyprzedzeniem, można ją utworzyć podczas tworzenia usługi. Upewnij się, że usuniesz ją, gdy skończysz! + +W dokumentacji portalu Azure znajdziesz wiele dokumentów, samouczków i przewodników: [Azure portal documentation](https://docs.microsoft.com/azure/azure-portal/?WT.mc_id=academic-17441-jabenn). + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/20) + +## Przegląd i samodzielna nauka + +* Przeczytaj o historii kryptografii na stronie [Historia kryptografii na Wikipedii](https://wikipedia.org/wiki/History_of_cryptography). +* Przeczytaj o certyfikatach X.509 na stronie [X.509 na Wikipedii](https://wikipedia.org/wiki/X.509). + +## Zadanie + +[Zbuduj nowe urządzenie IoT](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/6-keep-your-plant-secure/assignment.md b/translations/pl/2-farm/lessons/6-keep-your-plant-secure/assignment.md new file mode 100644 index 00000000..5d2b626d --- /dev/null +++ b/translations/pl/2-farm/lessons/6-keep-your-plant-secure/assignment.md @@ -0,0 +1,27 @@ + +# Zbuduj nowe urządzenie IoT + +## Instrukcje + +W ciągu ostatnich 6 lekcji nauczyłeś się o cyfrowym rolnictwie oraz o tym, jak używać urządzeń IoT do zbierania danych w celu przewidywania wzrostu roślin i automatyzacji podlewania na podstawie odczytów wilgotności gleby. + +Wykorzystaj zdobytą wiedzę, aby zbudować nowe urządzenie IoT, używając wybranego sensora i aktuatora. Wyślij dane telemetryczne do IoT Hub i użyj ich do sterowania aktuatorami za pomocą kodu bezserwerowego. Możesz użyć sensora i aktuatora, które już były używane w tym lub poprzednim projekcie, albo, jeśli masz inne komponenty, spróbuj czegoś nowego. + +## Kryteria oceny + +| Kryterium | Wzorowe | Wystarczające | Wymaga poprawy | +| --------- | ------- | ------------- | -------------- | +| Zaprogramowanie urządzenia IoT do użycia sensora i aktuatora | Zaprogramowano urządzenie IoT, które działa z sensorem i aktuatorem | Zaprogramowano urządzenie IoT, które działa z sensorem lub aktuatorem | Nie udało się zaprogramować urządzenia IoT do użycia sensora lub aktuatora | +| Połączenie urządzenia IoT z IoT Hub | Udało się wdrożyć IoT Hub, wysyłać do niego dane telemetryczne i odbierać polecenia | Udało się wdrożyć IoT Hub i wysyłać dane telemetryczne lub odbierać polecenia | Nie udało się wdrożyć IoT Hub ani nawiązać komunikacji z urządzeniem IoT | +| Sterowanie aktuatorami za pomocą kodu bezserwerowego | Udało się wdrożyć funkcję Azure do sterowania urządzeniem wyzwalaną przez zdarzenia telemetryczne | Udało się wdrożyć funkcję Azure wyzwalaną przez zdarzenia telemetryczne, ale nie udało się sterować aktuatorami | Nie udało się wdrożyć funkcji Azure | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md b/translations/pl/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md new file mode 100644 index 00000000..033eb554 --- /dev/null +++ b/translations/pl/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md @@ -0,0 +1,69 @@ + +# Użyj certyfikatu X.509 w kodzie urządzenia - Wirtualny sprzęt IoT i Raspberry Pi + +W tej części lekcji połączysz swoje wirtualne urządzenie IoT lub Raspberry Pi z IoT Hub, używając certyfikatu X.509. + +## Połącz swoje urządzenie z IoT Hub + +Kolejnym krokiem jest połączenie urządzenia z IoT Hub za pomocą certyfikatów X.509. + +### Zadanie - połącz z IoT Hub + +1. Skopiuj pliki klucza i certyfikatu do folderu zawierającego kod Twojego urządzenia IoT. Jeśli korzystasz z Raspberry Pi przez VS Code Remote SSH i utworzyłeś klucze na swoim komputerze PC lub Mac, możesz przeciągnąć i upuścić pliki do eksploratora w VS Code, aby je skopiować. + +1. Otwórz plik `app.py`. + +1. Aby połączyć się za pomocą certyfikatu X.509, będziesz potrzebować nazwy hosta IoT Hub oraz certyfikatu X.509. Zacznij od utworzenia zmiennej zawierającej nazwę hosta, dodając poniższy kod przed utworzeniem klienta urządzenia: + + ```python + host_name = "" + ``` + + Zamień `` na nazwę hosta Twojego IoT Hub. Możesz ją znaleźć w sekcji `HostName` w `connection_string`. Będzie to nazwa Twojego IoT Hub, kończąca się na `.azure-devices.net`. + +1. Poniżej zadeklaruj zmienną z identyfikatorem urządzenia: + + ```python + device_id = "soil-moisture-sensor-x509" + ``` + +1. Będziesz potrzebować instancji klasy `X509`, która zawiera pliki certyfikatu X.509. Dodaj `X509` do listy klas importowanych z modułu `azure.iot.device`: + + ```python + from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse, X509 + ``` + +1. Utwórz instancję klasy `X509`, używając swoich plików certyfikatu i klucza, dodając ten kod poniżej deklaracji `host_name`: + + ```python + x509 = X509("./soil-moisture-sensor-x509-cert.pem", "./soil-moisture-sensor-x509-key.pem") + ``` + + To utworzy klasę `X509`, używając plików `soil-moisture-sensor-x509-cert.pem` i `soil-moisture-sensor-x509-key.pem`, które zostały utworzone wcześniej. + +1. Zamień linię kodu, która tworzy `device_client` z connection string, na następującą: + + ```python + device_client = IoTHubDeviceClient.create_from_x509_certificate(x509, host_name, device_id) + ``` + + To połączy urządzenie za pomocą certyfikatu X.509 zamiast connection string. + +1. Usuń linię z zmienną `connection_string`. + +1. Uruchom swój kod. Monitoruj wiadomości wysyłane do IoT Hub i wysyłaj żądania metod bezpośrednich, jak wcześniej. Zobaczysz, jak urządzenie łączy się, wysyła odczyty wilgotności gleby oraz odbiera żądania metod bezpośrednich. + +> 💁 Ten kod znajdziesz w folderze [code/pi](../../../../../2-farm/lessons/6-keep-your-plant-secure/code/pi) lub [code/virtual-device](../../../../../2-farm/lessons/6-keep-your-plant-secure/code/virtual-device). + +😀 Twój program czujnika wilgotności gleby jest połączony z IoT Hub za pomocą certyfikatu X.509! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md b/translations/pl/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md new file mode 100644 index 00000000..7934e00d --- /dev/null +++ b/translations/pl/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md @@ -0,0 +1,15 @@ + +# Użycie certyfikatu X.509 w kodzie urządzenia - Wio Terminal + +W momencie pisania tego tekstu, Azure Arduino SDK nie obsługuje certyfikatów X.509. Jeśli chcesz eksperymentować z certyfikatami X.509, możesz zapoznać się z [instrukcjami dotyczącymi wirtualnego urządzenia IoT przy użyciu Python SDK](single-board-computer-x509.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/3-transport/README.md b/translations/pl/3-transport/README.md new file mode 100644 index 00000000..2e09d0a5 --- /dev/null +++ b/translations/pl/3-transport/README.md @@ -0,0 +1,36 @@ + +# Transport z farmy do fabryki - wykorzystanie IoT do śledzenia dostaw żywności + +Wielu rolników uprawia żywność na sprzedaż – albo są to rolnicy komercyjni, którzy sprzedają wszystko, co wyprodukują, albo rolnicy samozaopatrzeniowi, którzy sprzedają nadwyżki, aby kupić niezbędne rzeczy. W jakiś sposób żywność musi trafić z farmy do konsumenta, a zazwyczaj odbywa się to za pomocą transportu zbiorowego z farm do centrów dystrybucji lub zakładów przetwórczych, a następnie do sklepów. Na przykład rolnik uprawiający pomidory zbiera je, pakuje do skrzynek, ładuje skrzynki na ciężarówkę, a następnie dostarcza do zakładu przetwórczego. Tam pomidory są sortowane, a następnie trafiają do konsumentów w postaci przetworzonej żywności, sprzedaży detalicznej lub są spożywane w restauracjach. + +IoT może wspomóc ten łańcuch dostaw, śledząc żywność w trakcie transportu – zapewniając, że kierowcy jadą tam, gdzie powinni, monitorując lokalizację pojazdów i wysyłając powiadomienia, gdy pojazdy dotrą na miejsce, aby żywność mogła zostać rozładowana i była gotowa do przetworzenia tak szybko, jak to możliwe. + +> 🎓 *Łańcuch dostaw* to sekwencja działań prowadzących do wytworzenia i dostarczenia czegoś. Na przykład w przypadku uprawy pomidorów obejmuje to dostarczenie nasion, gleby, nawozów i wody, uprawę pomidorów, dostarczenie ich do centralnego punktu, transport do lokalnego centrum supermarketu, transport do poszczególnych sklepów, wystawienie na półki, sprzedaż konsumentowi i zabranie do domu w celu spożycia. Każdy etap jest jak ogniwo w łańcuchu. + +> 🎓 Część łańcucha dostaw związana z transportem nazywana jest *logistyką*. + +W tych 4 lekcjach dowiesz się, jak zastosować Internet Rzeczy (IoT), aby usprawnić łańcuch dostaw poprzez monitorowanie żywności podczas jej załadunku na (wirtualną) ciężarówkę, która jest śledzona w drodze do miejsca docelowego. Nauczysz się, jak działa śledzenie GPS, jak przechowywać i wizualizować dane GPS oraz jak otrzymywać powiadomienia, gdy ciężarówka dotrze na miejsce. + +> 💁 Te lekcje będą korzystać z niektórych zasobów w chmurze. Jeśli nie ukończysz wszystkich lekcji w tym projekcie, upewnij się, że [wyczyścisz swój projekt](../clean-up.md). + +## Tematy + +1. [Śledzenie lokalizacji](lessons/1-location-tracking/README.md) +1. [Przechowywanie danych lokalizacyjnych](lessons/2-store-location-data/README.md) +1. [Wizualizacja danych lokalizacyjnych](lessons/3-visualize-location-data/README.md) +1. [Geosiatki](lessons/4-geofences/README.md) + +## Podziękowania + +Wszystkie lekcje zostały napisane z ♥️ przez [Jen Looper](https://github.com/jlooper) i [Jim Bennett](https://GitHub.com/JimBobBennett) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/3-transport/lessons/1-location-tracking/README.md b/translations/pl/3-transport/lessons/1-location-tracking/README.md new file mode 100644 index 00000000..b02126f8 --- /dev/null +++ b/translations/pl/3-transport/lessons/1-location-tracking/README.md @@ -0,0 +1,214 @@ + +# Śledzenie lokalizacji + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obrazek, aby zobaczyć większą wersję. + +## Quiz przed wykładem + +[Quiz przed wykładem](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/21) + +## Wprowadzenie + +Główny proces dostarczania żywności od rolnika do konsumenta obejmuje załadunek skrzynek z produktami na ciężarówki, statki, samoloty lub inne pojazdy transportowe, a następnie dostarczenie żywności w określone miejsce – bezpośrednio do klienta lub do centralnego magazynu w celu dalszego przetwarzania. Cały proces od farmy do konsumenta jest częścią procesu nazywanego *łańcuchem dostaw*. Poniższy film z W. P. Carey School of Business na Uniwersytecie Stanowym Arizony omawia ideę łańcucha dostaw i sposób jego zarządzania w bardziej szczegółowy sposób. + +[![Czym jest zarządzanie łańcuchem dostaw? Film z W. P. Carey School of Business na Uniwersytecie Stanowym Arizony](https://img.youtube.com/vi/Mi1QBxVjZAw/0.jpg)](https://www.youtube.com/watch?v=Mi1QBxVjZAw) + +> 🎥 Kliknij obrazek powyżej, aby obejrzeć film + +Dodanie urządzeń IoT może znacząco poprawić Twój łańcuch dostaw, umożliwiając zarządzanie lokalizacją przedmiotów, lepsze planowanie transportu i obsługi towarów oraz szybsze reagowanie na problemy. + +Podczas zarządzania flotą pojazdów, takich jak ciężarówki, pomocne jest wiedzieć, gdzie każdy pojazd znajduje się w danym momencie. Pojazdy mogą być wyposażone w czujniki GPS, które przesyłają ich lokalizację do systemów IoT, umożliwiając właścicielom określenie ich położenia, prześledzenie trasy, którą przebyły, oraz przewidzenie czasu dotarcia do celu. Większość pojazdów działa poza zasięgiem WiFi, więc do przesyłania takich danych używają sieci komórkowych. Czasami czujnik GPS jest wbudowany w bardziej złożone urządzenia IoT, takie jak elektroniczne dzienniki pokładowe. Te urządzenia śledzą, jak długo ciężarówka jest w trasie, aby upewnić się, że kierowcy przestrzegają lokalnych przepisów dotyczących godzin pracy. + +W tej lekcji dowiesz się, jak śledzić lokalizację pojazdu za pomocą czujnika GPS. + +W tej lekcji omówimy: + +* [Pojazdy połączone](../../../../../3-transport/lessons/1-location-tracking) +* [Współrzędne geograficzne](../../../../../3-transport/lessons/1-location-tracking) +* [Globalne systemy pozycjonowania (GPS)](../../../../../3-transport/lessons/1-location-tracking) +* [Odczyt danych z czujnika GPS](../../../../../3-transport/lessons/1-location-tracking) +* [Dane GPS w formacie NMEA](../../../../../3-transport/lessons/1-location-tracking) +* [Dekodowanie danych z czujnika GPS](../../../../../3-transport/lessons/1-location-tracking) + +## Pojazdy połączone + +IoT zmienia sposób transportu towarów, tworząc floty *połączonych pojazdów*. Te pojazdy są połączone z centralnymi systemami IT, przesyłając informacje o swojej lokalizacji i innych danych z czujników. Posiadanie floty połączonych pojazdów niesie ze sobą wiele korzyści: + +* Śledzenie lokalizacji – możesz określić, gdzie pojazd znajduje się w dowolnym momencie, co pozwala na: + + * Otrzymywanie powiadomień, gdy pojazd zbliża się do celu, aby przygotować załogę do rozładunku + * Lokalizowanie skradzionych pojazdów + * Łączenie danych o lokalizacji i trasie z problemami drogowymi, aby umożliwić zmianę trasy pojazdu w trakcie podróży + * Przestrzeganie przepisów podatkowych. Niektóre kraje pobierają opłaty za przejechane kilometry na drogach publicznych (np. [RUC w Nowej Zelandii](https://www.nzta.govt.nz/vehicles/licensing-rego/road-user-charges/)), więc wiedza, kiedy pojazd znajduje się na drogach publicznych, a kiedy na prywatnych, ułatwia obliczenie należnego podatku. + * Wiedza, gdzie wysłać ekipy serwisowe w przypadku awarii + +* Telemetria kierowcy – możliwość monitorowania, czy kierowcy przestrzegają ograniczeń prędkości, pokonują zakręty z odpowiednią prędkością, hamują wcześnie i efektywnie oraz jeżdżą bezpiecznie. Połączone pojazdy mogą również mieć kamery rejestrujące zdarzenia. Może to być powiązane z ubezpieczeniem, oferując niższe stawki dla dobrych kierowców. + +* Zgodność z godzinami pracy kierowcy – zapewnienie, że kierowcy jeżdżą tylko przez dozwolone prawem godziny, na podstawie czasu włączania i wyłączania silnika. + +Te korzyści można łączyć – na przykład, łączenie zgodności godzin pracy kierowcy ze śledzeniem lokalizacji, aby zmienić trasę kierowcy, jeśli nie może dotrzeć do celu w ramach dozwolonych godzin jazdy. Można je również łączyć z innymi danymi telemetrycznymi specyficznymi dla pojazdu, takimi jak dane o temperaturze z ciężarówek chłodniczych, aby zmienić trasę pojazdu, jeśli obecna trasa uniemożliwiłaby utrzymanie towarów w odpowiedniej temperaturze. + +> 🎓 Logistyka to proces transportu towarów z jednego miejsca do drugiego, na przykład z farmy do supermarketu przez jeden lub więcej magazynów. Rolnik pakuje skrzynki z pomidorami, które są ładowane na ciężarówkę, dostarczane do centralnego magazynu, a następnie umieszczane na drugiej ciężarówce, która może zawierać mieszankę różnych rodzajów produktów, które są następnie dostarczane do supermarketu. + +Głównym elementem śledzenia pojazdów jest GPS – czujniki, które mogą określić ich lokalizację w dowolnym miejscu na Ziemi. W tej lekcji dowiesz się, jak korzystać z czujnika GPS, zaczynając od nauki, jak definiować lokalizację na Ziemi. + +## Współrzędne geograficzne + +Współrzędne geograficzne są używane do definiowania punktów na powierzchni Ziemi, podobnie jak współrzędne mogą być używane do rysowania pikseli na ekranie komputera lub pozycjonowania ściegów w hafcie krzyżykowym. Dla pojedynczego punktu masz parę współrzędnych. Na przykład kampus Microsoftu w Redmond, Waszyngton, USA znajduje się na 47.6423109, -122.1390293. + +### Szerokość i długość geograficzna + +Ziemia jest kulą – trójwymiarowym okręgiem. Z tego powodu punkty są definiowane przez podzielenie jej na 360 stopni, tak jak w geometrii okręgów. Szerokość geograficzna mierzy liczbę stopni od północy do południa, a długość geograficzna mierzy liczbę stopni od wschodu do zachodu. + +> 💁 Nikt tak naprawdę nie wie, dlaczego okręgi są podzielone na 360 stopni. [Strona o stopniach (kątach) na Wikipedii](https://wikipedia.org/wiki/Degree_(angle)) omawia niektóre możliwe powody. + +![Linie szerokości geograficznej od 90° na biegunie północnym, 45° w połowie drogi między biegunem północnym a równikiem, 0° na równiku, -45° w połowie drogi między równikiem a biegunem południowym oraz -90° na biegunie południowym](../../../../../translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.pl.png) + +Szerokość geograficzna jest mierzona za pomocą linii, które okrążają Ziemię i biegną równolegle do równika, dzieląc półkulę północną i południową na 90° każda. Równik znajduje się na 0°, biegun północny na 90°, znany również jako 90° na północ, a biegun południowy na -90°, czyli 90° na południe. + +Długość geograficzna jest mierzona jako liczba stopni na wschód i zachód. Punkt początkowy 0° długości geograficznej nazywany jest *południkiem zerowym* i został zdefiniowany w 1884 roku jako linia biegnąca od bieguna północnego do bieguna południowego, przechodząca przez [Brytyjskie Obserwatorium Królewskie w Greenwich, Anglia](https://wikipedia.org/wiki/Royal_Observatory,_Greenwich). + +![Linie długości geograficznej od -180° na zachód od południka zerowego, do 0° na południku zerowym, do 180° na wschód od południka zerowego](../../../../../translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.pl.png) + +> 🎓 Południk to wyimaginowana prosta linia biegnąca od bieguna północnego do bieguna południowego, tworząca półokrąg. + +Aby zmierzyć długość geograficzną punktu, mierzy się liczbę stopni wokół równika od południka zerowego do południka przechodzącego przez ten punkt. Długość geograficzna wynosi od -180°, czyli 180° na zachód, przez 0° na południku zerowym, do 180°, czyli 180° na wschód. 180° i -180° odnoszą się do tego samego punktu, antypołudnika lub 180. południka. Jest to południk po przeciwnej stronie Ziemi od południka zerowego. + +> 💁 Antypołudnik nie należy mylić z Międzynarodową Linią Zmiany Daty, która znajduje się w przybliżeniu w tym samym miejscu, ale nie jest prostą linią i zmienia się, aby dopasować się do granic geopolitycznych. + +✅ Zrób małe badanie: Spróbuj znaleźć szerokość i długość geograficzną swojej obecnej lokalizacji. + +### Stopnie, minuty i sekundy vs stopnie dziesiętne + +Tradycyjnie pomiary stopni szerokości i długości geograficznej były wykonywane za pomocą systemu liczbowego sześćdziesiątkowego, czyli bazowego 60, systemu liczbowego używanego przez starożytnych Babilończyków, którzy jako pierwsi dokonywali pomiarów i zapisów czasu oraz odległości. Używasz systemu sześćdziesiątkowego prawdopodobnie codziennie, nawet nie zdając sobie z tego sprawy – dzieląc godziny na 60 minut i minuty na 60 sekund. + +Długość i szerokość geograficzna są mierzone w stopniach, minutach i sekundach, przy czym jedna minuta to 1/60 stopnia, a jedna sekunda to 1/60 minuty. + +Na przykład na równiku: + +* 1° szerokości geograficznej to **111,3 kilometra** +* 1 minuta szerokości geograficznej to 111,3/60 = **1,855 kilometra** +* 1 sekunda szerokości geograficznej to 1,855/60 = **0,031 kilometra** + +Symbol dla minuty to pojedynczy apostrof, dla sekundy podwójny apostrof. Na przykład 2 stopnie, 17 minut i 43 sekundy byłoby zapisane jako 2°17'43". Części sekund są podawane jako liczby dziesiętne, na przykład pół sekundy to 0°0'0.5". + +Komputery nie pracują w bazie 60, więc te współrzędne są podawane jako stopnie dziesiętne podczas korzystania z danych GPS w większości systemów komputerowych. Na przykład 2°17'43" to 2.295277. Symbol stopnia jest zazwyczaj pomijany. + +Współrzędne punktu są zawsze podawane jako `szerokość geograficzna, długość geograficzna`, więc wcześniejszy przykład kampusu Microsoftu na 47.6423109,-122.117198 ma: + +* Szerokość geograficzną 47.6423109 (47.6423109 stopni na północ od równika) +* Długość geograficzną -122.1390293 (122.1390293 stopni na zachód od południka zerowego). + +![Kampus Microsoftu na 47.6423109,-122.117198](../../../../../translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.pl.png) + +## Globalne systemy pozycjonowania (GPS) + +Systemy GPS wykorzystują wiele satelitów orbitujących Ziemię do określenia Twojej lokalizacji. Prawdopodobnie korzystałeś z systemów GPS, nawet nie zdając sobie z tego sprawy – aby znaleźć swoją lokalizację w aplikacji mapowej na telefonie, takiej jak Apple Maps lub Google Maps, aby zobaczyć, gdzie znajduje się Twój przejazd w aplikacji do zamawiania transportu, takiej jak Uber lub Lyft, lub podczas korzystania z nawigacji satelitarnej (sat-nav) w samochodzie. + +> 🎓 Satelity w „nawigacji satelitarnej” to satelity GPS! + +Systemy GPS działają, mając wiele satelitów, które wysyłają sygnał z aktualną pozycją każdego satelity oraz dokładnym znacznikiem czasu. Te sygnały są przesyłane za pomocą fal radiowych i wykrywane przez antenę w czujniku GPS. Czujnik GPS wykrywa te sygnały i, korzystając z aktualnego czasu, mierzy, ile czasu zajęło sygnałowi dotarcie od satelity do czujnika. Ponieważ prędkość fal radiowych jest stała, czujnik GPS może użyć przesłanego znacznika czasu, aby obliczyć, jak daleko czujnik znajduje się od satelity. Łącząc dane z co najmniej 3 satelitów z przesłanymi pozycjami, czujnik GPS jest w stanie określić swoją lokalizację na Ziemi. + +> 💁 Czujniki GPS potrzebują anten do wykrywania fal radiowych. Anteny wbudowane w ciężarówki i samochody z wbudowanym GPS są umieszczone tak, aby uzyskać dobry sygnał, zazwyczaj na przedniej szybie lub dachu. Jeśli korzystasz z oddzielnego systemu GPS, takiego jak smartfon lub urządzenie IoT, musisz upewnić się, że antena wbudowana w system GPS lub telefon ma wyraźny widok na niebo, na przykład jest zamontowana na przedniej szybie. + +![Znając odległość od czujnika do wielu satelitów, można obliczyć lokalizację](../../../../../translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.pl.png) + +Satelity GPS krążą wokół Ziemi, a nie są w stałym punkcie nad czujnikiem, więc dane lokalizacyjne obejmują wysokość nad poziomem morza, a także szerokość i długość geograficzną. + +GPS miał kiedyś ograniczenia dotyczące dokładności narzucone przez wojsko USA, ograniczając dokładność do około 5 metrów. To ograniczenie zostało zniesione w 2000 roku, umożliwiając dokładność do 30 centymetrów. Uzyskanie tej dokładności nie zawsze jest możliwe ze względu na zakłócenia sygnałów. + +✅ Jeśli masz smartfon, uruchom aplikację mapową i sprawdź, jak dokładna jest Twoja lokalizacja. Może to zająć chwilę, zanim Twój telefon wykryje wiele satelitów, aby uzyskać bardziej dokładną lokalizację. +💁 Satelity zawierają zegary atomowe, które są niezwykle precyzyjne, ale każdego dnia odchylają się o 38 mikrosekund (0,0000038 sekundy) w porównaniu do zegarów atomowych na Ziemi. Dzieje się tak z powodu spowolnienia czasu przy zwiększającej się prędkości, zgodnie z teoriami szczególnej i ogólnej względności Einsteina – satelity poruszają się szybciej niż obrót Ziemi. To odchylenie zostało wykorzystane do potwierdzenia przewidywań teorii szczególnej i ogólnej względności i musi być uwzględnione w projektowaniu systemów GPS. Dosłownie czas płynie wolniej na satelicie GPS. +Systemy GPS zostały opracowane i wdrożone przez wiele krajów i unii politycznych, w tym USA, Rosję, Japonię, Indie, UE i Chiny. Nowoczesne czujniki GPS mogą łączyć się z większością tych systemów, aby uzyskać szybsze i bardziej precyzyjne dane lokalizacyjne. + +> 🎓 Grupy satelitów w każdej implementacji nazywane są konstelacjami. + +## Odczyt danych z czujnika GPS + +Większość czujników GPS przesyła dane GPS za pomocą UART. + +> ⚠️ UART został omówiony w [projekcie 2, lekcji 2](../../../2-farm/lessons/2-detect-soil-moisture/README.md#universal-asynchronous-receiver-transmitter-uart). W razie potrzeby wróć do tej lekcji. + +Możesz użyć czujnika GPS w swoim urządzeniu IoT, aby odczytać dane GPS. + +### Zadanie - podłącz czujnik GPS i odczytaj dane GPS + +Przejdź przez odpowiedni przewodnik, aby odczytać dane GPS za pomocą swojego urządzenia IoT: + +* [Arduino - Wio Terminal](wio-terminal-gps-sensor.md) +* [Komputer jednopłytkowy - Raspberry Pi](pi-gps-sensor.md) +* [Komputer jednopłytkowy - Wirtualne urządzenie](virtual-device-gps-sensor.md) + +## Dane GPS w formacie NMEA + +Podczas uruchamiania kodu mogłeś zauważyć coś, co na pierwszy rzut oka wygląda jak niezrozumiały tekst w wynikach. W rzeczywistości są to standardowe dane GPS, które mają swoje znaczenie. + +Czujniki GPS przesyłają dane za pomocą wiadomości NMEA, zgodnie ze standardem NMEA 0183. NMEA to akronim od [National Marine Electronics Association](https://www.nmea.org), amerykańskiej organizacji handlowej, która ustala standardy komunikacji między elektroniką morską. + +> 💁 Ten standard jest własnościowy i kosztuje co najmniej 2000 USD, ale wystarczająco dużo informacji na jego temat znajduje się w domenie publicznej, aby większość standardu została zrekonstruowana i mogła być używana w kodzie open source oraz innych projektach niekomercyjnych. + +Wiadomości te są tekstowe. Każda wiadomość składa się z *zdania*, które zaczyna się od znaku `$`, po którym następują 2 znaki wskazujące źródło wiadomości (np. GP dla amerykańskiego systemu GPS, GN dla GLONASS, rosyjskiego systemu GPS) oraz 3 znaki wskazujące typ wiadomości. Reszta wiadomości to pola oddzielone przecinkami, zakończone znakiem nowej linii. + +Niektóre typy wiadomości, które można odebrać, to: + +| Typ | Opis | +| ---- | ----------- | +| GGA | Dane lokalizacji GPS, w tym szerokość, długość i wysokość czujnika GPS, wraz z liczbą satelitów w zasięgu, które umożliwiają obliczenie tej lokalizacji. | +| ZDA | Aktualna data i czas, w tym lokalna strefa czasowa | +| GSV | Szczegóły dotyczące satelitów w zasięgu - zdefiniowane jako satelity, z których czujnik GPS może odbierać sygnały | + +> 💁 Dane GPS zawierają znaczniki czasu, więc Twoje urządzenie IoT może uzyskać czas z czujnika GPS, zamiast polegać na serwerze NTP lub wewnętrznym zegarze czasu rzeczywistego. + +Wiadomość GGA zawiera aktualną lokalizację w formacie `(dd)dmm.mmmm`, wraz z pojedynczym znakiem wskazującym kierunek. `d` w formacie oznacza stopnie, `m` oznacza minuty, a sekundy są wyrażone jako dziesiętne części minut. Na przykład 2°17'43" to 217.716666667 - 2 stopnie, 17.716666667 minut. + +Znak kierunku może być `N` lub `S` dla szerokości geograficznej, aby wskazać północ lub południe, oraz `E` lub `W` dla długości geograficznej, aby wskazać wschód lub zachód. Na przykład szerokość geograficzna 2°17'43" miałaby znak kierunku `N`, -2°17'43" miałaby znak kierunku `S`. + +Na przykład - zdanie NMEA `$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67` + +* Część szerokości geograficznej to `4738.538654,N`, co przekłada się na 47.6423109 w stopniach dziesiętnych. `4738.538654` to 47.6423109, a kierunek to `N` (północ), więc jest to dodatnia szerokość geograficzna. + +* Część długości geograficznej to `12208.341758,W`, co przekłada się na -122.1390293 w stopniach dziesiętnych. `12208.341758` to 122.1390293°, a kierunek to `W` (zachód), więc jest to ujemna długość geograficzna. + +## Dekodowanie danych z czujnika GPS + +Zamiast używać surowych danych NMEA, lepiej jest je dekodować do bardziej użytecznego formatu. Istnieje wiele bibliotek open source, które mogą pomóc w wyodrębnieniu przydatnych danych z surowych wiadomości NMEA. + +### Zadanie - dekodowanie danych z czujnika GPS + +Przejdź przez odpowiedni przewodnik, aby dekodować dane GPS za pomocą swojego urządzenia IoT: + +* [Arduino - Wio Terminal](wio-terminal-gps-decode.md) +* [Komputer jednopłytkowy - Raspberry Pi/Wirtualne urządzenie IoT](single-board-computer-gps-decode.md) + +--- + +## 🚀 Wyzwanie + +Napisz własny dekoder NMEA! Zamiast polegać na bibliotekach zewnętrznych do dekodowania zdań NMEA, czy potrafisz napisać własny dekoder, który wyodrębni szerokość i długość geograficzną ze zdań NMEA? + +## Quiz po wykładzie + +[Quiz po wykładzie](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/22) + +## Przegląd i samodzielna nauka + +* Przeczytaj więcej o współrzędnych geograficznych na [stronie o systemie współrzędnych geograficznych na Wikipedii](https://wikipedia.org/wiki/Geographic_coordinate_system). +* Dowiedz się więcej o południkach zerowych na innych ciałach niebieskich niż Ziemia na [stronie o południku zerowym na Wikipedii](https://wikipedia.org/wiki/Prime_meridian#Prime_meridian_on_other_planetary_bodies). +* Zbadaj różne systemy GPS opracowane przez różne rządy i unie polityczne, takie jak UE, Japonia, Rosja, Indie i USA. + +## Zadanie + +[Zbadaj inne dane GPS](assignment.md) + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/3-transport/lessons/1-location-tracking/assignment.md b/translations/pl/3-transport/lessons/1-location-tracking/assignment.md new file mode 100644 index 00000000..265f314b --- /dev/null +++ b/translations/pl/3-transport/lessons/1-location-tracking/assignment.md @@ -0,0 +1,27 @@ + +# Zbadaj inne dane GPS + +## Instrukcje + +Zdania NMEA pochodzące z Twojego czujnika GPS zawierają inne dane oprócz lokalizacji. Zbadaj dodatkowe dane i wykorzystaj je w swoim urządzeniu IoT. + +Na przykład - czy możesz uzyskać aktualną datę i czas? Jeśli używasz mikrokontrolera, czy możesz ustawić zegar za pomocą danych GPS w taki sam sposób, jak robiłeś to za pomocą sygnałów NTP w poprzednim projekcie? Czy możesz uzyskać wysokość (swoją wysokość nad poziomem morza) lub aktualną prędkość? + +Jeśli używasz wirtualnego urządzenia IoT, możesz uzyskać niektóre z tych danych, wysyłając zdania NMEA wygenerowane za pomocą narzędzi [nmeagen.org](https://www.nmeagen.org). + +## Kryteria oceny + +| Kryterium | Wzorowe | Wystarczające | Wymaga poprawy | +| --------- | ------- | ------------- | -------------- | +| Uzyskanie dodatkowych danych GPS | Potrafi uzyskać i wykorzystać dodatkowe dane GPS, zarówno jako telemetrię, jak i do konfiguracji urządzenia IoT | Potrafi uzyskać dodatkowe dane GPS, ale nie potrafi ich wykorzystać | Nie potrafi uzyskać dodatkowych danych GPS | + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/3-transport/lessons/1-location-tracking/pi-gps-sensor.md b/translations/pl/3-transport/lessons/1-location-tracking/pi-gps-sensor.md new file mode 100644 index 00000000..abd08a46 --- /dev/null +++ b/translations/pl/3-transport/lessons/1-location-tracking/pi-gps-sensor.md @@ -0,0 +1,191 @@ + +# Odczyt danych GPS - Raspberry Pi + +W tej części lekcji dodasz czujnik GPS do swojego Raspberry Pi i odczytasz z niego dane. + +## Sprzęt + +Raspberry Pi potrzebuje czujnika GPS. + +Czujnik, którego użyjesz, to [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Ten czujnik może łączyć się z wieloma systemami GPS, aby szybko i dokładnie określić pozycję. Składa się z dwóch części - głównej elektroniki czujnika oraz zewnętrznej anteny podłączonej cienkim przewodem, która odbiera fale radiowe z satelitów. + +Jest to czujnik UART, więc przesyła dane GPS przez UART. + +## Podłącz czujnik GPS + +Czujnik Grove GPS można podłączyć do Raspberry Pi. + +### Zadanie - podłącz czujnik GPS + +Podłącz czujnik GPS. + +![Czujnik Grove GPS](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.pl.png) + +1. Włóż jeden koniec kabla Grove do gniazda w czujniku GPS. Kabel pasuje tylko w jedną stronę. + +1. Gdy Raspberry Pi jest wyłączone, podłącz drugi koniec kabla Grove do gniazda UART oznaczonego jako **UART** na nakładce Grove Base przymocowanej do Raspberry Pi. Gniazdo to znajduje się w środkowym rzędzie, po stronie najbliższej gniazda karty SD, na przeciwległym końcu od portów USB i gniazda Ethernet. + + ![Czujnik Grove GPS podłączony do gniazda UART](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.pl.png) + +1. Ustaw czujnik GPS tak, aby podłączona antena miała widoczność na niebo - najlepiej w pobliżu otwartego okna lub na zewnątrz. Łatwiej uzyskać wyraźny sygnał, gdy nic nie zasłania anteny. + +## Programowanie czujnika GPS + +Teraz Raspberry Pi można zaprogramować do obsługi podłączonego czujnika GPS. + +### Zadanie - zaprogramuj czujnik GPS + +Zaprogramuj urządzenie. + +1. Włącz Raspberry Pi i poczekaj, aż się uruchomi. + +1. Czujnik GPS ma dwie diody LED - niebieską, która miga podczas przesyłania danych, oraz zieloną, która miga co sekundę, gdy odbiera dane z satelitów. Upewnij się, że niebieska dioda LED miga po włączeniu Raspberry Pi. Po kilku minutach powinna zacząć migać zielona dioda LED - jeśli nie, może być konieczne przestawienie anteny. + +1. Uruchom VS Code, bezpośrednio na Raspberry Pi lub za pomocą rozszerzenia Remote SSH. + + > ⚠️ Możesz odwołać się do [instrukcji konfiguracji i uruchamiania VS Code w lekcji 1, jeśli to konieczne](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. W nowszych wersjach Raspberry Pi obsługujących Bluetooth występuje konflikt między portem szeregowym używanym przez Bluetooth a tym używanym przez port UART Grove. Aby to naprawić, wykonaj następujące kroki: + + 1. W terminalu VS Code edytuj plik `/boot/config.txt` za pomocą `nano`, wbudowanego edytora tekstu w terminalu, używając następującego polecenia: + + ```sh + sudo nano /boot/config.txt + ``` + + > Tego pliku nie można edytować w VS Code, ponieważ wymaga on uprawnień `sudo`, czyli podwyższonych uprawnień. VS Code nie działa z tymi uprawnieniami. + + 1. Użyj klawiszy kursora, aby przejść na koniec pliku, a następnie skopiuj poniższy kod i wklej go na końcu pliku: + + ```ini + dtoverlay=pi3-miniuart-bt + dtoverlay=pi3-disable-bt + enable_uart=1 + ``` + + Możesz wkleić, używając standardowych skrótów klawiaturowych dla swojego urządzenia (`Ctrl+v` na Windows, Linux lub Raspberry Pi OS, `Cmd+v` na macOS). + + 1. Zapisz plik i wyjdź z `nano`, naciskając `Ctrl+x`. Naciśnij `y`, gdy zostaniesz zapytany, czy chcesz zapisać zmodyfikowany bufor, a następnie naciśnij `enter`, aby potwierdzić nadpisanie `/boot/config.txt`. + + > Jeśli popełnisz błąd, możesz wyjść bez zapisywania, a następnie powtórzyć te kroki. + + 1. Edytuj plik `/boot/cmdline.txt` w `nano`, używając następującego polecenia: + + ```sh + sudo nano /boot/cmdline.txt + ``` + + 1. Ten plik zawiera kilka par klucz/wartość oddzielonych spacjami. Usuń wszystkie pary klucz/wartość dla klucza `console`. Prawdopodobnie będą wyglądać tak: + + ```output + console=serial0,115200 console=tty1 + ``` + + Możesz przejść do tych wpisów za pomocą klawiszy kursora, a następnie usunąć je za pomocą klawiszy `del` lub `backspace`. + + Na przykład, jeśli Twój oryginalny plik wygląda tak: + + ```output + console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait + ``` + + Nowa wersja będzie wyglądać tak: + + ```output + root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait + ``` + + 1. Wykonaj powyższe kroki, aby zapisać ten plik i wyjść z `nano`. + + 1. Uruchom ponownie Raspberry Pi, a następnie połącz się ponownie w VS Code po ponownym uruchomieniu Pi. + +1. W terminalu utwórz nowy folder w katalogu domowym użytkownika `pi` o nazwie `gps-sensor`. Utwórz plik w tym folderze o nazwie `app.py`. + +1. Otwórz ten folder w VS Code. + +1. Moduł GPS przesyła dane UART przez port szeregowy. Zainstaluj pakiet Pip `pyserial`, aby komunikować się z portem szeregowym w kodzie Pythona: + + ```sh + pip3 install pyserial + ``` + +1. Dodaj poniższy kod do swojego pliku `app.py`: + + ```python + import time + import serial + + serial = serial.Serial('/dev/ttyAMA0', 9600, timeout=1) + serial.reset_input_buffer() + serial.flush() + + def print_gps_data(line): + print(line.rstrip()) + + while True: + line = serial.readline().decode('utf-8') + + while len(line) > 0: + print_gps_data(line) + line = serial.readline().decode('utf-8') + + time.sleep(1) + ``` + + Ten kod importuje moduł `serial` z pakietu Pip `pyserial`. Następnie łączy się z portem szeregowym `/dev/ttyAMA0` - to adres portu szeregowego, którego używa nakładka Grove Pi Base Hat dla swojego portu UART. Następnie czyści wszelkie istniejące dane z tego połączenia szeregowego. + + Następnie definiowana jest funkcja `print_gps_data`, która wypisuje na konsolę linię przekazaną do niej jako argument. + + Kolejny fragment kodu działa w nieskończonej pętli, odczytując tyle linii tekstu, ile może z portu szeregowego w każdej iteracji. Wywołuje funkcję `print_gps_data` dla każdej linii. + + Po odczytaniu wszystkich danych pętla usypia na 1 sekundę, a następnie próbuje ponownie. + +1. Uruchom ten kod. Zobaczysz surowe dane wyjściowe z czujnika GPS, coś w rodzaju: + + ```output + $GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 + $GPGSA,A,1,,,,,,,,,,,,,,,*1E + $BDGSA,A,1,,,,,,,,,,,,,,,*0F + $GPGSV,1,1,00*79 + $BDGSV,1,1,00*68 + ``` + + > Jeśli napotkasz jeden z poniższych błędów podczas zatrzymywania i ponownego uruchamiania kodu, dodaj blok `try - except` do swojej pętli `while`. + + ```output + UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte + UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte + ``` + + ```python + while True: + try: + line = serial.readline().decode('utf-8') + + while len(line) > 0: + print_gps_data() + line = serial.readline().decode('utf-8') + + # There's a random chance the first byte being read is part way through a character. + # Read another full line and continue. + + except UnicodeDecodeError: + line = serial.readline().decode('utf-8') + + time.sleep(1) + ``` + +> 💁 Ten kod znajdziesz w folderze [code-gps/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps/pi). + +😀 Twój program obsługujący czujnik GPS działa poprawnie! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md b/translations/pl/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md new file mode 100644 index 00000000..1f96eba1 --- /dev/null +++ b/translations/pl/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md @@ -0,0 +1,73 @@ + +# Dekodowanie danych GPS - Wirtualny sprzęt IoT i Raspberry Pi + +W tej części lekcji będziesz dekodować wiadomości NMEA odczytane z czujnika GPS przez Raspberry Pi lub Wirtualne Urządzenie IoT, aby wyodrębnić szerokość i długość geograficzną. + +## Dekodowanie danych GPS + +Po odczytaniu surowych danych NMEA z portu szeregowego można je zdekodować za pomocą biblioteki NMEA typu open source. + +### Zadanie - dekodowanie danych GPS + +Zaprogramuj urządzenie do dekodowania danych GPS. + +1. Otwórz projekt aplikacji `gps-sensor`, jeśli nie jest jeszcze otwarty. + +1. Zainstaluj pakiet Pip `pynmea2`. Ten pakiet zawiera kod do dekodowania wiadomości NMEA. + + ```sh + pip3 install pynmea2 + ``` + +1. Dodaj poniższy kod do sekcji importów w pliku `app.py`, aby zaimportować moduł `pynmea2`: + + ```python + import pynmea2 + ``` + +1. Zastąp zawartość funkcji `print_gps_data` następującym kodem: + + ```python + msg = pynmea2.parse(line) + if msg.sentence_type == 'GGA': + lat = pynmea2.dm_to_sd(msg.lat) + lon = pynmea2.dm_to_sd(msg.lon) + + if msg.lat_dir == 'S': + lat = lat * -1 + + if msg.lon_dir == 'W': + lon = lon * -1 + + print(f'{lat},{lon} - from {msg.num_sats} satellites') + ``` + + Ten kod użyje biblioteki `pynmea2` do parsowania linii odczytanej z portu szeregowego UART. + + Jeśli typ zdania wiadomości to `GGA`, oznacza to wiadomość o ustaleniu pozycji, która zostanie przetworzona. Wartości szerokości i długości geograficznej są odczytywane z wiadomości i konwertowane na stopnie dziesiętne z formatu NMEA `(d)ddmm.mmmm`. Funkcja `dm_to_sd` wykonuje tę konwersję. + + Następnie sprawdzany jest kierunek szerokości geograficznej, a jeśli szerokość geograficzna jest południowa, wartość zostaje przekształcona na liczbę ujemną. Podobnie w przypadku długości geograficznej, jeśli jest zachodnia, zostaje przekształcona na liczbę ujemną. + + Na koniec współrzędne są drukowane na konsoli, wraz z liczbą satelitów użytych do ustalenia lokalizacji. + +1. Uruchom kod. Jeśli używasz wirtualnego urządzenia IoT, upewnij się, że aplikacja CounterFit działa i dane GPS są wysyłane. + + ```output + pi@raspberrypi:~/gps-sensor $ python3 app.py + 47.6423109,-122.1390293 - from 3 satellites + ``` + +> 💁 Ten kod znajdziesz w folderze [code-gps-decode/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/virtual-device) lub [code-gps-decode/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/pi). + +😀 Twój program czujnika GPS z dekodowaniem danych zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md b/translations/pl/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md new file mode 100644 index 00000000..f3dc7ebc --- /dev/null +++ b/translations/pl/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md @@ -0,0 +1,142 @@ + +# Odczyt danych GPS - Wirtualny sprzęt IoT + +W tej części lekcji dodasz czujnik GPS do swojego wirtualnego urządzenia IoT i odczytasz z niego wartości. + +## Wirtualny sprzęt + +Wirtualne urządzenie IoT będzie korzystać z symulowanego czujnika GPS, który jest dostępny przez UART za pośrednictwem portu szeregowego. + +Fizyczny czujnik GPS posiada antenę, która odbiera fale radiowe z satelitów GPS i przekształca sygnały GPS w dane GPS. Wirtualna wersja symuluje to, pozwalając na ustawienie szerokości i długości geograficznej, wysyłanie surowych zdań NMEA lub przesyłanie pliku GPX z wieloma lokalizacjami, które mogą być zwracane sekwencyjnie. + +> 🎓 Zdania NMEA zostaną omówione później w tej lekcji + +### Dodanie czujnika do CounterFit + +Aby użyć wirtualnego czujnika GPS, musisz dodać go do aplikacji CounterFit. + +#### Zadanie - dodanie czujnika do CounterFit + +Dodaj czujnik GPS do aplikacji CounterFit. + +1. Utwórz nową aplikację w Pythonie na swoim komputerze w folderze `gps-sensor` z jednym plikiem o nazwie `app.py` oraz wirtualnym środowiskiem Pythona, a następnie dodaj pakiety pip dla CounterFit. + + > ⚠️ Możesz odwołać się do [instrukcji tworzenia i konfigurowania projektu CounterFit w Pythonie w lekcji 1, jeśli to konieczne](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Zainstaluj dodatkowy pakiet Pip, aby dodać CounterFit shim, który umożliwia komunikację z czujnikami UART przez połączenie szeregowe. Upewnij się, że instalujesz to z terminala z aktywowanym wirtualnym środowiskiem. + + ```sh + pip install counterfit-shims-serial + ``` + +1. Upewnij się, że aplikacja CounterFit działa. + +1. Utwórz czujnik GPS: + + 1. W polu *Create sensor* w panelu *Sensors* rozwiń listę *Sensor type* i wybierz *UART GPS*. + + 1. Pozostaw *Port* ustawiony na */dev/ttyAMA0*. + + 1. Wybierz przycisk **Add**, aby utworzyć czujnik GPS na porcie `/dev/ttyAMA0`. + + ![Ustawienia czujnika GPS](../../../../../translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.pl.png) + + Czujnik GPS zostanie utworzony i pojawi się na liście czujników. + + ![Utworzony czujnik GPS](../../../../../translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.pl.png) + +## Programowanie czujnika GPS + +Wirtualne urządzenie IoT może teraz zostać zaprogramowane do korzystania z wirtualnego czujnika GPS. + +### Zadanie - programowanie czujnika GPS + +Zaprogramuj aplikację czujnika GPS. + +1. Upewnij się, że aplikacja `gps-sensor` jest otwarta w VS Code. + +1. Otwórz plik `app.py`. + +1. Dodaj poniższy kod na początku pliku `app.py`, aby połączyć aplikację z CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Dodaj poniższy kod poniżej, aby zaimportować potrzebne biblioteki, w tym bibliotekę dla portu szeregowego CounterFit: + + ```python + import time + import counterfit_shims_serial + + serial = counterfit_shims_serial.Serial('/dev/ttyAMA0') + ``` + + Ten kod importuje moduł `serial` z pakietu Pip `counterfit_shims_serial`. Następnie łączy się z portem szeregowym `/dev/ttyAMA0` - jest to adres portu szeregowego, którego używa wirtualny czujnik GPS dla swojego portu UART. + +1. Dodaj poniższy kod poniżej, aby odczytać dane z portu szeregowego i wyświetlić wartości w konsoli: + + ```python + def print_gps_data(line): + print(line.rstrip()) + + while True: + line = serial.readline().decode('utf-8') + + while len(line) > 0: + print_gps_data(line) + line = serial.readline().decode('utf-8') + + time.sleep(1) + ``` + + Zdefiniowana jest funkcja `print_gps_data`, która wypisuje linię przekazaną do niej w konsoli. + + Następnie kod działa w nieskończonej pętli, odczytując tyle linii tekstu, ile może z portu szeregowego w każdej iteracji. Wywołuje funkcję `print_gps_data` dla każdej linii. + + Po odczytaniu wszystkich danych pętla usypia na 1 sekundę, a następnie próbuje ponownie. + +1. Uruchom ten kod, upewniając się, że używasz innego terminala niż ten, w którym działa aplikacja CounterFit, aby aplikacja CounterFit pozostała uruchomiona. + +1. W aplikacji CounterFit zmień wartość czujnika GPS. Możesz to zrobić na jeden z następujących sposobów: + + * Ustaw **Source** na `Lat/Lon` i wprowadź konkretną szerokość, długość geograficzną oraz liczbę satelitów używanych do uzyskania sygnału GPS. Ta wartość zostanie wysłana tylko raz, więc zaznacz pole **Repeat**, aby dane były powtarzane co sekundę. + + ![Czujnik GPS z wybraną opcją lat lon](../../../../../translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.pl.png) + + * Ustaw **Source** na `NMEA` i dodaj kilka zdań NMEA do pola tekstowego. Wszystkie te wartości zostaną wysłane, z opóźnieniem 1 sekundy przed każdym nowym zdaniem GGA (ustalenie pozycji). + + ![Czujnik GPS z ustawionymi zdaniami NMEA](../../../../../translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.pl.png) + + Możesz użyć narzędzia takiego jak [nmeagen.org](https://www.nmeagen.org), aby wygenerować te zdania, rysując na mapie. Te wartości zostaną wysłane tylko raz, więc zaznacz pole **Repeat**, aby dane były powtarzane co sekundę po ich wysłaniu. + + * Ustaw **Source** na plik GPX i prześlij plik GPX z lokalizacjami trasy. Możesz pobrać pliki GPX z wielu popularnych stron z mapami i trasami, takich jak [AllTrails](https://www.alltrails.com/). Te pliki zawierają wiele lokalizacji GPS jako trasę, a czujnik GPS będzie zwracał każdą nową lokalizację w odstępach 1 sekundy. + + ![Czujnik GPS z ustawionym plikiem GPX](../../../../../translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.pl.png) + + Te wartości zostaną wysłane tylko raz, więc zaznacz pole **Repeat**, aby dane były powtarzane co sekundę po ich wysłaniu. + + Po skonfigurowaniu ustawień GPS wybierz przycisk **Set**, aby zatwierdzić te wartości dla czujnika. + +1. Zobaczysz surowe dane wyjściowe z czujnika GPS, coś w rodzaju: + + ```output + $GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 + $GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 + ``` + +> 💁 Ten kod znajdziesz w folderze [code-gps/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps/virtual-device). + +😀 Twój program czujnika GPS działa poprawnie! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić precyzję, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md b/translations/pl/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md new file mode 100644 index 00000000..392a8f46 --- /dev/null +++ b/translations/pl/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md @@ -0,0 +1,81 @@ + +# Dekodowanie danych GPS - Wio Terminal + +W tej części lekcji zdekodujesz wiadomości NMEA odczytane z czujnika GPS przez Wio Terminal i wyodrębnisz szerokość oraz długość geograficzną. + +## Dekodowanie danych GPS + +Po odczytaniu surowych danych NMEA z portu szeregowego można je zdekodować za pomocą otwartoźródłowej biblioteki NMEA. + +### Zadanie - dekodowanie danych GPS + +Zaprogramuj urządzenie do dekodowania danych GPS. + +1. Otwórz projekt aplikacji `gps-sensor`, jeśli nie jest jeszcze otwarty. + +1. Dodaj zależność biblioteki [TinyGPSPlus](https://github.com/mikalhart/TinyGPSPlus) do pliku `platformio.ini` projektu. Ta biblioteka zawiera kod do dekodowania danych NMEA. + + ```ini + lib_deps = + mikalhart/TinyGPSPlus @ 1.0.2 + ``` + +1. W pliku `main.cpp` dodaj dyrektywę include dla biblioteki TinyGPSPlus: + + ```cpp + #include + ``` + +1. Poniżej deklaracji `Serial3` zadeklaruj obiekt TinyGPSPlus do przetwarzania zdań NMEA: + + ```cpp + TinyGPSPlus gps; + ``` + +1. Zmień zawartość funkcji `printGPSData` na następującą: + + ```cpp + if (gps.encode(Serial3.read())) + { + if (gps.location.isValid()) + { + Serial.print(gps.location.lat(), 6); + Serial.print(F(",")); + Serial.print(gps.location.lng(), 6); + Serial.print(" - from "); + Serial.print(gps.satellites.value()); + Serial.println(" satellites"); + } + } + ``` + + Ten kod odczytuje kolejny znak z portu szeregowego UART do dekodera NMEA `gps`. Po każdym znaku sprawdza, czy dekoder odczytał poprawne zdanie, a następnie sprawdza, czy odczytał poprawną lokalizację. Jeśli lokalizacja jest poprawna, wysyła ją do monitora szeregowego wraz z liczbą satelitów, które przyczyniły się do tego ustalenia. + +1. Zbuduj i wgraj kod na Wio Terminal. + +1. Po wgraniu możesz monitorować dane lokalizacji GPS za pomocą monitora szeregowego. + + ```output + > Executing task: platformio device monitor < + + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + 47.6423109,-122.1390293 - from 3 satellites + ``` + +> 💁 Ten kod znajdziesz w folderze [code-gps-decode/wio-terminal](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/wio-terminal). + +😀 Twój program czujnika GPS z dekodowaniem danych zakończył się sukcesem! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md b/translations/pl/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md new file mode 100644 index 00000000..0ce012c2 --- /dev/null +++ b/translations/pl/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md @@ -0,0 +1,152 @@ + +# Odczyt danych GPS - Wio Terminal + +W tej części lekcji dodasz czujnik GPS do swojego Wio Terminal i odczytasz z niego wartości. + +## Sprzęt + +Wio Terminal potrzebuje czujnika GPS. + +Czujnik, którego użyjesz, to [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Ten czujnik może łączyć się z wieloma systemami GPS, aby szybko i dokładnie ustalić pozycję. Czujnik składa się z dwóch części - głównej elektroniki czujnika oraz zewnętrznej anteny podłączonej cienkim przewodem, która odbiera fale radiowe z satelitów. + +Jest to czujnik UART, więc przesyła dane GPS za pomocą UART. + +### Podłącz czujnik GPS + +Czujnik Grove GPS można podłączyć do Wio Terminal. + +#### Zadanie - podłącz czujnik GPS + +Podłącz czujnik GPS. + +![Czujnik Grove GPS](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.pl.png) + +1. Włóż jeden koniec kabla Grove do gniazda w czujniku GPS. Kabel wejdzie tylko w jednym kierunku. + +1. Gdy Wio Terminal jest odłączony od komputera lub innego źródła zasilania, podłącz drugi koniec kabla Grove do gniazda Grove po lewej stronie Wio Terminal, patrząc na ekran. Jest to gniazdo najbliżej przycisku zasilania. + + ![Czujnik Grove GPS podłączony do lewego gniazda](../../../../../translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.pl.png) + +1. Umieść czujnik GPS tak, aby podłączona antena miała widoczność na niebo - najlepiej obok otwartego okna lub na zewnątrz. Łatwiej uzyskać wyraźny sygnał, gdy nic nie zasłania anteny. + +1. Teraz możesz podłączyć Wio Terminal do komputera. + +1. Czujnik GPS ma 2 diody LED - niebieską, która miga podczas przesyłania danych, oraz zieloną, która miga co sekundę podczas odbierania danych z satelitów. Upewnij się, że niebieska dioda LED miga po włączeniu Wio Terminal. Po kilku minutach zielona dioda LED zacznie migać - jeśli nie, może być konieczne przestawienie anteny. + +## Programowanie czujnika GPS + +Teraz możesz zaprogramować Wio Terminal, aby korzystał z podłączonego czujnika GPS. + +### Zadanie - zaprogramuj czujnik GPS + +Zaprogramuj urządzenie. + +1. Utwórz nowy projekt dla Wio Terminal w PlatformIO. Nazwij ten projekt `gps-sensor`. Dodaj kod w funkcji `setup`, aby skonfigurować port szeregowy. + +1. Dodaj następującą dyrektywę `include` na początku pliku `main.cpp`. Zawiera ona plik nagłówkowy z funkcjami do konfiguracji lewego gniazda Grove dla UART. + + ```cpp + #include + ``` + +1. Poniżej dodaj następującą linię kodu, aby zadeklarować połączenie portu szeregowego z portem UART: + + ```cpp + static Uart Serial3(&sercom3, PIN_WIRE_SCL, PIN_WIRE_SDA, SERCOM_RX_PAD_1, UART_TX_PAD_0); + ``` + +1. Musisz dodać kod, aby przekierować niektóre wewnętrzne obsługiwacze sygnałów do tego portu szeregowego. Dodaj następujący kod poniżej deklaracji `Serial3`: + + ```cpp + void SERCOM3_0_Handler() + { + Serial3.IrqHandler(); + } + + void SERCOM3_1_Handler() + { + Serial3.IrqHandler(); + } + + void SERCOM3_2_Handler() + { + Serial3.IrqHandler(); + } + + void SERCOM3_3_Handler() + { + Serial3.IrqHandler(); + } + ``` + +1. W funkcji `setup`, poniżej konfiguracji portu `Serial`, skonfiguruj port szeregowy UART za pomocą następującego kodu: + + ```cpp + Serial3.begin(9600); + + while (!Serial3) + ; // Wait for Serial3 to be ready + + delay(1000); + ``` + +1. Poniżej tego kodu w funkcji `setup` dodaj następujący kod, aby połączyć pin Grove z portem szeregowym: + + ```cpp + pinPeripheral(PIN_WIRE_SCL, PIO_SERCOM_ALT); + ``` + +1. Dodaj następującą funkcję przed funkcją `loop`, aby wysyłać dane GPS do monitora szeregowego: + + ```cpp + void printGPSData() + { + Serial.println(Serial3.readStringUntil('\n')); + } + ``` + +1. W funkcji `loop` dodaj następujący kod, aby odczytać dane z portu szeregowego UART i wyświetlić je w monitorze szeregowym: + + ```cpp + while (Serial3.available() > 0) + { + printGPSData(); + } + + delay(1000); + ``` + + Ten kod odczytuje dane z portu szeregowego UART. Funkcja `readStringUntil` odczytuje dane aż do znaku kończącego, w tym przypadku nowej linii. Odczytuje całe zdanie NMEA (zdania NMEA są zakończone znakiem nowej linii). Dopóki dane mogą być odczytane z portu szeregowego UART, są odczytywane i wysyłane do monitora szeregowego za pomocą funkcji `printGPSData`. Gdy nie można już odczytać więcej danych, funkcja `loop` wstrzymuje działanie na 1 sekundę (1,000ms). + +1. Zbuduj i wgraj kod na Wio Terminal. + +1. Po wgraniu możesz monitorować dane GPS za pomocą monitora szeregowego. + + ```output + > Executing task: platformio device monitor < + + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + $GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 + $GPGSA,A,1,,,,,,,,,,,,,,,*1E + $BDGSA,A,1,,,,,,,,,,,,,,,*0F + $GPGSV,1,1,00*79 + $BDGSV,1,1,00*68 + ``` + +> 💁 Ten kod znajdziesz w folderze [code-gps/wio-terminal](../../../../../3-transport/lessons/1-location-tracking/code-gps/wio-terminal). + +😀 Twój program czujnika GPS działa poprawnie! + +**Zastrzeżenie**: +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/3-transport/lessons/2-store-location-data/README.md b/translations/pl/3-transport/lessons/2-store-location-data/README.md new file mode 100644 index 00000000..f632f568 --- /dev/null +++ b/translations/pl/3-transport/lessons/2-store-location-data/README.md @@ -0,0 +1,475 @@ + +# Przechowywanie danych o lokalizacji + +![Szkicowy przegląd tej lekcji](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.pl.jpg) + +> Szkic autorstwa [Nitya Narasimhan](https://github.com/nitya). Kliknij obraz, aby zobaczyć większą wersję. + +## Quiz przed wykładem + +[Quiz przed wykładem](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) + +## Wprowadzenie + +W poprzedniej lekcji nauczyłeś się, jak korzystać z czujnika GPS do zbierania danych o lokalizacji. Aby wykorzystać te dane do wizualizacji lokalizacji ciężarówki przewożącej żywność i jej trasy, dane te muszą zostać przesłane do usługi IoT w chmurze, a następnie gdzieś przechowywane. + +W tej lekcji dowiesz się o różnych sposobach przechowywania danych IoT oraz jak przechowywać dane z usługi IoT za pomocą kodu bezserwerowego. + +W tej lekcji omówimy: + +* [Dane strukturalne i niestrukturalne](../../../../../3-transport/lessons/2-store-location-data) +* [Wysyłanie danych GPS do IoT Hub](../../../../../3-transport/lessons/2-store-location-data) +* [Ścieżki gorące, ciepłe i zimne](../../../../../3-transport/lessons/2-store-location-data) +* [Obsługa zdarzeń GPS za pomocą kodu bezserwerowego](../../../../../3-transport/lessons/2-store-location-data) +* [Konta magazynu Azure](../../../../../3-transport/lessons/2-store-location-data) +* [Połączenie kodu bezserwerowego z magazynem](../../../../../3-transport/lessons/2-store-location-data) + +## Dane strukturalne i niestrukturalne + +Systemy komputerowe przetwarzają dane, które mogą przybierać różne formy i rozmiary. Mogą to być pojedyncze liczby, duże ilości tekstu, filmy, obrazy czy dane IoT. Dane te można zazwyczaj podzielić na dwie kategorie - *strukturalne* i *niestrukturalne*. + +* **Dane strukturalne** to dane o dobrze zdefiniowanej, sztywnej strukturze, która się nie zmienia i zazwyczaj odpowiada tabelom danych z relacjami. Przykładem mogą być dane osobowe, takie jak imię, data urodzenia i adres. + +* **Dane niestrukturalne** to dane bez dobrze zdefiniowanej, sztywnej struktury, które mogą często zmieniać swoją formę. Przykładem mogą być dokumenty, takie jak teksty pisane czy arkusze kalkulacyjne. + +✅ Zrób małe badanie: Czy potrafisz wymyślić inne przykłady danych strukturalnych i niestrukturalnych? + +> 💁 Istnieją również dane półstrukturalne, które mają strukturę, ale nie pasują do sztywnych tabel danych. + +Dane IoT są zazwyczaj uważane za dane niestrukturalne. + +Wyobraź sobie, że dodajesz urządzenia IoT do floty pojazdów dużego gospodarstwa rolnego. Możesz chcieć używać różnych urządzeń dla różnych typów pojazdów. Na przykład: + +* Dla pojazdów rolniczych, takich jak traktory, chcesz zbierać dane GPS, aby upewnić się, że pracują na właściwych polach. +* Dla ciężarówek dostawczych przewożących żywność do magazynów chcesz zbierać dane GPS, a także dane o prędkości i przyspieszeniu, aby upewnić się, że kierowca jeździ bezpiecznie, oraz dane o tożsamości kierowcy i rozpoczęciu/zakończeniu pracy, aby zapewnić zgodność z lokalnymi przepisami dotyczącymi godzin pracy. +* Dla ciężarówek chłodniczych chcesz również zbierać dane o temperaturze, aby upewnić się, że żywność nie przegrzewa się ani nie zamarza podczas transportu. + +Te dane mogą się stale zmieniać. Na przykład, jeśli urządzenie IoT znajduje się w kabinie ciężarówki, dane, które wysyła, mogą się zmieniać w zależności od zmiany przyczepy, np. wysyłając dane o temperaturze tylko wtedy, gdy używana jest przyczepa chłodnicza. + +✅ Jakie inne dane IoT mogłyby być zbierane? Pomyśl o rodzajach ładunków, które mogą przewozić ciężarówki, a także o danych dotyczących konserwacji. + +Te dane różnią się w zależności od pojazdu, ale wszystkie są przesyłane do tej samej usługi IoT w celu przetworzenia. Usługa IoT musi być w stanie przetwarzać te niestrukturalne dane, przechowując je w sposób umożliwiający ich wyszukiwanie lub analizę, ale jednocześnie obsługując różne struktury tych danych. + +### Magazyn SQL vs NoSQL + +Bazy danych to usługi umożliwiające przechowywanie i przeszukiwanie danych. Bazy danych dzielą się na dwa typy - SQL i NoSQL. + +#### Bazy danych SQL + +Pierwsze bazy danych to Relacyjne Systemy Zarządzania Bazami Danych (RDBMS), znane również jako bazy danych SQL, od języka Structured Query Language (SQL), który służy do interakcji z nimi w celu dodawania, usuwania, aktualizowania lub przeszukiwania danych. Te bazy danych składają się ze schematu - dobrze zdefiniowanego zestawu tabel danych, podobnych do arkusza kalkulacyjnego. Każda tabela ma wiele nazwanych kolumn. Wstawiając dane, dodajesz wiersz do tabeli, umieszczając wartości w każdej z kolumn. To utrzymuje dane w bardzo sztywnej strukturze - chociaż możesz pozostawić kolumny puste, jeśli chcesz dodać nową kolumnę, musisz to zrobić w bazie danych, uzupełniając wartości dla istniejących wierszy. Te bazy danych są relacyjne - jedna tabela może mieć relację z inną. + +![Relacyjna baza danych z ID tabeli użytkowników powiązanym z kolumną ID użytkownika w tabeli zakupów oraz ID tabeli produktów powiązanym z kolumną ID produktu w tabeli zakupów](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.pl.png) + +Na przykład, jeśli przechowujesz dane osobowe użytkowników w tabeli, miałbyś jakiś wewnętrzny unikalny identyfikator dla każdego użytkownika, który jest używany w wierszu tabeli zawierającej imię i adres użytkownika. Jeśli chciałbyś przechowywać inne szczegóły dotyczące tego użytkownika, takie jak jego zakupy, w innej tabeli, miałbyś jedną kolumnę w nowej tabeli dla identyfikatora tego użytkownika. Gdy wyszukujesz użytkownika, możesz użyć jego identyfikatora, aby uzyskać jego dane osobowe z jednej tabeli i jego zakupy z innej. + +Bazy danych SQL są idealne do przechowywania danych strukturalnych i do sytuacji, gdy chcesz zapewnić zgodność danych ze schematem. + +✅ Jeśli nigdy wcześniej nie korzystałeś z SQL, poświęć chwilę, aby przeczytać o nim na [stronie SQL w Wikipedii](https://wikipedia.org/wiki/SQL). + +Niektóre znane bazy danych SQL to Microsoft SQL Server, MySQL i PostgreSQL. + +✅ Zrób małe badanie: Przeczytaj o niektórych z tych baz danych SQL i ich możliwościach. + +#### Bazy danych NoSQL + +Bazy danych NoSQL nazywane są NoSQL, ponieważ nie mają tej samej sztywnej struktury co bazy danych SQL. Są również znane jako bazy dokumentów, ponieważ mogą przechowywać dane niestrukturalne, takie jak dokumenty. + +> 💁 Pomimo swojej nazwy, niektóre bazy danych NoSQL pozwalają na użycie SQL do przeszukiwania danych. + +![Dokumenty w folderach w bazie danych NoSQL](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.pl.png) + +Bazy danych NoSQL nie mają z góry zdefiniowanego schematu, który ogranicza sposób przechowywania danych. Możesz wstawiać dowolne dane niestrukturalne, zazwyczaj w formacie JSON. Dokumenty te mogą być organizowane w foldery, podobnie jak pliki na komputerze. Każdy dokument może mieć inne pola niż inne dokumenty - na przykład, jeśli przechowujesz dane IoT z pojazdów rolniczych, niektóre mogą mieć pola dla danych z akcelerometru i prędkości, inne mogą mieć pola dla temperatury w przyczepie. Jeśli dodałbyś nowy typ ciężarówki, na przykład z wbudowanymi wagami do śledzenia wagi przewożonych produktów, urządzenie IoT mogłoby dodać to nowe pole, a dane mogłyby być przechowywane bez żadnych zmian w bazie danych. + +Niektóre znane bazy danych NoSQL to Azure CosmosDB, MongoDB i CouchDB. + +✅ Zrób małe badanie: Przeczytaj o niektórych z tych baz danych NoSQL i ich możliwościach. + +W tej lekcji będziesz używać magazynu NoSQL do przechowywania danych IoT. + +## Wysyłanie danych GPS do IoT Hub + +W poprzedniej lekcji zebrałeś dane GPS z czujnika GPS podłączonego do urządzenia IoT. Aby przechowywać te dane IoT w chmurze, musisz je przesłać do usługi IoT. Ponownie użyjesz Azure IoT Hub, tej samej usługi IoT w chmurze, której używałeś w poprzednim projekcie. + +![Wysyłanie telemetrii GPS z urządzenia IoT do IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.pl.png) + +### Zadanie - wysyłanie danych GPS do IoT Hub + +1. Utwórz nowy IoT Hub, korzystając z darmowego poziomu. + + > ⚠️ Możesz odwołać się do [instrukcji tworzenia IoT Hub z projektu 2, lekcja 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud), jeśli to konieczne. + + Pamiętaj, aby utworzyć nową grupę zasobów. Nazwij nową grupę zasobów `gps-sensor`, a nowy IoT Hub unikalną nazwą opartą na `gps-sensor`, na przykład `gps-sensor-`. + + > 💁 Jeśli nadal masz swój IoT Hub z poprzedniego projektu, możesz go ponownie użyć. Pamiętaj, aby użyć nazwy tego IoT Hub i grupy zasobów, w której się znajduje, podczas tworzenia innych usług. + +1. Dodaj nowe urządzenie do IoT Hub. Nazwij to urządzenie `gps-sensor`. Pobierz łańcuch połączenia dla urządzenia. + +1. Zaktualizuj kod urządzenia, aby wysyłał dane GPS do nowego IoT Hub, używając łańcucha połączenia urządzenia z poprzedniego kroku. + + > ⚠️ Możesz odwołać się do [instrukcji łączenia urządzenia z IoT z projektu 2, lekcja 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service), jeśli to konieczne. + +1. Podczas wysyłania danych GPS, zrób to w formacie JSON w następujący sposób: + + ```json + { + "gps" : + { + "lat" : , + "lon" : + } + } + ``` + +1. Wysyłaj dane GPS co minutę, aby nie przekroczyć dziennego limitu wiadomości. + +Jeśli używasz Wio Terminal, pamiętaj, aby dodać wszystkie niezbędne biblioteki i ustawić czas za pomocą serwera NTP. Twój kod musi również upewnić się, że odczytał wszystkie dane z portu szeregowego przed wysłaniem lokalizacji GPS, używając istniejącego kodu z poprzedniej lekcji. Użyj poniższego kodu, aby skonstruować dokument JSON: + +```cpp +DynamicJsonDocument doc(1024); +doc["gps"]["lat"] = gps.location.lat(); +doc["gps"]["lon"] = gps.location.lng(); +``` + +Jeśli używasz Wirtualnego urządzenia IoT, pamiętaj, aby zainstalować wszystkie potrzebne biblioteki, korzystając z wirtualnego środowiska. + +Dla Raspberry Pi i Wirtualnego urządzenia IoT użyj istniejącego kodu z poprzedniej lekcji, aby uzyskać wartości szerokości i długości geograficznej, a następnie wyślij je w odpowiednim formacie JSON za pomocą poniższego kodu: + +```python +message_json = { "gps" : { "lat":lat, "lon":lon } } +print("Sending telemetry", message_json) +message = Message(json.dumps(message_json)) +``` + +> 💁 Ten kod znajdziesz w folderze [code/wio-terminal](../../../../../3-transport/lessons/2-store-location-data/code/wio-terminal), [code/pi](../../../../../3-transport/lessons/2-store-location-data/code/pi) lub [code/virtual-device](../../../../../3-transport/lessons/2-store-location-data/code/virtual-device). + +Uruchom kod urządzenia i upewnij się, że wiadomości trafiają do IoT Hub, używając polecenia CLI `az iot hub monitor-events`. + +## Ścieżki gorące, ciepłe i zimne + +Dane przesyłane z urządzenia IoT do chmury nie zawsze są przetwarzane w czasie rzeczywistym. Niektóre dane wymagają przetwarzania w czasie rzeczywistym, inne mogą być przetwarzane z niewielkim opóźnieniem, a jeszcze inne mogą być przetwarzane znacznie później. Przepływ danych do różnych usług przetwarzających dane w różnym czasie określa się jako ścieżki gorące, ciepłe i zimne. + +### Ścieżka gorąca + +Ścieżka gorąca odnosi się do danych, które muszą być przetwarzane w czasie rzeczywistym lub niemal w czasie rzeczywistym. Używałbyś danych ze ścieżki gorącej do alertów, takich jak powiadomienia o zbliżaniu się pojazdu do magazynu lub o zbyt wysokiej temperaturze w ciężarówce chłodniczej. + +Aby korzystać z danych ze ścieżki gorącej, twój kod reagowałby na zdarzenia natychmiast po ich odebraniu przez usługi w chmurze. + +### Ścieżka ciepła + +Ścieżka ciepła odnosi się do danych, które mogą być przetwarzane krótko po ich odebraniu, na przykład do raportowania lub krótkoterminowej analizy. Używałbyś danych ze ścieżki ciepłej do codziennych raportów o przebiegu pojazdów, korzystając z danych zebranych poprzedniego dnia. + +Dane ze ścieżki ciepłej są przechowywane zaraz po ich odebraniu przez usługę w chmurze w jakimś rodzaju magazynu, który można szybko uzyskać. + +### Ścieżka zimna + +Ścieżka zimna odnosi się do danych historycznych, przechowywanych długoterminowo, które mogą być przetwarzane w dowolnym momencie. Na przykład, możesz użyć ścieżki zimnej do uzyskania rocznych raportów o przebiegu pojazdów lub przeprowadzenia analizy tras w celu znalezienia najbardziej optymalnej trasy zmniejszającej koszty paliwa. + +Dane ze ścieżki zimnej są przechowywane w hurtowniach danych - bazach danych zaprojektowanych do przechowywania dużych ilości danych, które nigdy się nie zmieniają i mogą być szybko i łatwo przeszukiwane. Zazwyczaj w aplikacji chmurowej uruchamiałbyś regularne zadanie, które w określonym czasie każdego dnia, tygodnia lub miesiąca przenosi dane z magazynu ścieżki ciepłej do hurtowni danych. + +✅ Pomyśl o danych, które zebrałeś do tej pory w tych lekcjach. Czy są to dane ze ścieżki gorącej, ciepłej czy zimnej? + +## Obsługa zdarzeń GPS za pomocą kodu bezserwerowego + +Gdy dane trafiają do IoT Hub, możesz napisać kod bezserwerowy, który będzie nasłuchiwał zdarzeń publikowanych na zgodnym z Event-Hub punkcie końcowym. To jest ścieżka ciepła - te dane zostaną przechowane i wykorzystane w następnej lekcji do raportowania trasy. + +![Wysyłanie telemetrii GPS z urządzenia IoT do IoT Hub, a następnie do Azure Functions za pomocą wyzwalacza Event Hub](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.pl.png) + +### Zadanie - obsługa zdarzeń GPS za pomocą kodu bezserwerowego + +1. Utwórz aplikację Azure Functions za pomocą CLI Azure Functions. Użyj środowiska wykonawczego Python i utwórz ją w folderze o nazwie `gps-trigger`, używając tej samej nazwy dla projektu aplikacji Functions. Upewnij się, że tworzysz wirtualne środowisko do tego celu. +> ⚠️ Możesz odwołać się do [instrukcji dotyczących tworzenia projektu Azure Functions z projektu 2, lekcji 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application), jeśli zajdzie taka potrzeba. +1. Dodaj wyzwalacz zdarzeń IoT Hub, który korzysta z punktu końcowego zgodnego z Event Hub w IoT Hub. + + > ⚠️ Możesz odwołać się do [instrukcji tworzenia wyzwalacza zdarzeń IoT Hub z projektu 2, lekcja 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger), jeśli będzie to potrzebne. + +1. Ustaw łańcuch połączenia punktu końcowego zgodnego z Event Hub w pliku `local.settings.json` i użyj klucza dla tego wpisu w pliku `function.json`. + +1. Użyj aplikacji Azurite jako lokalnego emulatora pamięci. + +1. Uruchom aplikację funkcji, aby upewnić się, że odbiera zdarzenia z Twojego urządzenia GPS. Upewnij się, że Twoje urządzenie IoT również działa i wysyła dane GPS. + + ```output + Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} + ``` + +## Konta magazynu Azure + +![Logo Azure Storage](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.pl.png) + +Konta magazynu Azure to uniwersalna usługa przechowywania danych, która umożliwia przechowywanie danych na różne sposoby. Możesz przechowywać dane jako obiekty blob, w kolejkach, w tabelach lub jako pliki – wszystko jednocześnie. + +### Magazyn obiektów blob + +Słowo *Blob* oznacza duże obiekty binarne, ale stało się określeniem dla wszelkich danych niestrukturalnych. W magazynie obiektów blob możesz przechowywać dowolne dane, od dokumentów JSON zawierających dane IoT, po pliki graficzne i wideo. Magazyn obiektów blob wprowadza pojęcie *kontenerów*, czyli nazwanych zbiorników, w których można przechowywać dane, podobnie jak tabele w relacyjnej bazie danych. Kontenery mogą zawierać jeden lub więcej folderów do przechowywania obiektów blob, a każdy folder może zawierać inne foldery, podobnie jak pliki są przechowywane na dysku twardym komputera. + +W tej lekcji użyjesz magazynu obiektów blob do przechowywania danych IoT. + +✅ Zrób badania: Przeczytaj o [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) + +### Magazyn tabel + +Magazyn tabel pozwala przechowywać dane półstrukturalne. Jest to w rzeczywistości baza danych NoSQL, więc nie wymaga z góry zdefiniowanego zestawu tabel, ale jest zaprojektowany do przechowywania danych w jednej lub więcej tabelach, z unikalnymi kluczami definiującymi każdy wiersz. + +✅ Zrób badania: Przeczytaj o [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) + +### Magazyn kolejek + +Magazyn kolejek pozwala przechowywać wiadomości o rozmiarze do 64 KB w kolejce. Możesz dodawać wiadomości na końcu kolejki i odczytywać je z przodu. Kolejki przechowują wiadomości bezterminowo, o ile jest dostępne miejsce w magazynie, co pozwala na ich długoterminowe przechowywanie i odczyt w razie potrzeby. Na przykład, jeśli chcesz uruchamiać miesięczne zadanie przetwarzania danych GPS, możesz codziennie dodawać je do kolejki, a na koniec miesiąca przetworzyć wszystkie wiadomości z kolejki. + +✅ Zrób badania: Przeczytaj o [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) + +### Magazyn plików + +Magazyn plików umożliwia przechowywanie plików w chmurze, a aplikacje lub urządzenia mogą się z nim łączyć za pomocą standardowych protokołów. Możesz zapisywać pliki w magazynie plików, a następnie zamontować go jako dysk na swoim komputerze PC lub Mac. + +✅ Zrób badania: Przeczytaj o [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) + +## Połącz swój kod bezserwerowy z magazynem + +Twoja aplikacja funkcji musi teraz połączyć się z magazynem obiektów blob, aby przechowywać wiadomości z IoT Hub. Istnieją dwa sposoby, aby to zrobić: + +* Wewnątrz kodu funkcji, połącz się z magazynem obiektów blob za pomocą SDK dla Pythona i zapisz dane jako obiekty blob. +* Użyj powiązania wyjściowego funkcji, aby powiązać wartość zwracaną funkcji z magazynem obiektów blob i automatycznie zapisać obiekt blob. + +W tej lekcji użyjesz SDK dla Pythona, aby zobaczyć, jak pracować z magazynem obiektów blob. + +![Wysyłanie telemetrii GPS z urządzenia IoT do IoT Hub, następnie do Azure Functions za pomocą wyzwalacza Event Hub, a następnie zapisywanie jej w magazynie obiektów blob](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.pl.png) + +Dane zostaną zapisane jako obiekt JSON w następującym formacie: + +```json +{ + "device_id": , + "timestamp" :