diff --git a/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.el.png b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.el.png new file mode 100644 index 00000000..1ba4f5c7 Binary files /dev/null and b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.el.png differ diff --git a/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.th.png b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.th.png new file mode 100644 index 00000000..1ba4f5c7 Binary files /dev/null and b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.th.png differ diff --git a/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.el.png b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.el.png new file mode 100644 index 00000000..3cac91bb Binary files /dev/null and b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.el.png differ diff --git a/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.th.png b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.th.png new file mode 100644 index 00000000..3cac91bb Binary files /dev/null and b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.th.png differ diff --git a/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.el.png b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.el.png new file mode 100644 index 00000000..967e6539 Binary files /dev/null and b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.el.png differ diff --git a/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.th.png b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.th.png new file mode 100644 index 00000000..967e6539 Binary files /dev/null and b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.th.png differ diff --git a/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.el.png b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.el.png new file mode 100644 index 00000000..247c1dd6 Binary files /dev/null and b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.el.png differ diff --git a/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.th.png b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.th.png new file mode 100644 index 00000000..247c1dd6 Binary files /dev/null and b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.th.png differ diff --git a/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.el.png b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.el.png new file mode 100644 index 00000000..e89d81c4 Binary files /dev/null and b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.el.png differ diff --git a/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.th.png b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.th.png new file mode 100644 index 00000000..e89d81c4 Binary files /dev/null and b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.th.png differ diff --git a/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.el.png b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.el.png new file mode 100644 index 00000000..0237836d Binary files /dev/null and b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.el.png differ diff --git a/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.th.png b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.th.png new file mode 100644 index 00000000..0237836d Binary files /dev/null and b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.th.png differ diff --git a/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.el.png b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.el.png new file mode 100644 index 00000000..4229fee0 Binary files /dev/null and b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.el.png differ diff --git a/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.th.png b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.th.png new file mode 100644 index 00000000..4229fee0 Binary files /dev/null and b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.th.png differ diff --git a/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.el.png b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.el.png new file mode 100644 index 00000000..9b503ac8 Binary files /dev/null and b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.el.png differ diff --git a/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.th.png b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.th.png new file mode 100644 index 00000000..9b503ac8 Binary files /dev/null and b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.th.png differ diff --git a/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.el.png b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.el.png new file mode 100644 index 00000000..c98b7aaf Binary files /dev/null and b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.el.png differ diff --git a/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.th.png b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.th.png new file mode 100644 index 00000000..c98b7aaf Binary files /dev/null and b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.th.png differ diff --git a/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.el.png b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.el.png new file mode 100644 index 00000000..706f83bc Binary files /dev/null and b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.el.png differ diff --git a/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.th.png b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.th.png new file mode 100644 index 00000000..706f83bc Binary files /dev/null and b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.th.png differ diff --git a/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.el.png b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.el.png new file mode 100644 index 00000000..76bec4da Binary files /dev/null and b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.el.png differ diff --git a/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.th.png b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.th.png new file mode 100644 index 00000000..76bec4da Binary files /dev/null and b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.th.png differ diff --git a/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.el.png b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.el.png new file mode 100644 index 00000000..b49060a2 Binary files /dev/null and b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.el.png differ diff --git a/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.th.png b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.th.png new file mode 100644 index 00000000..b49060a2 Binary files /dev/null and b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.th.png differ diff --git a/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.el.png b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.el.png new file mode 100644 index 00000000..3ca064d5 Binary files /dev/null and b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.el.png differ diff --git a/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.th.png b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.th.png new file mode 100644 index 00000000..3ca064d5 Binary files /dev/null and b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.th.png differ diff --git a/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.el.png b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.el.png new file mode 100644 index 00000000..1f5f2412 Binary files /dev/null and b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.el.png differ diff --git a/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.th.png b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.th.png new file mode 100644 index 00000000..1f5f2412 Binary files /dev/null and b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.th.png differ diff --git a/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.el.png b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.el.png new file mode 100644 index 00000000..2953cea1 Binary files /dev/null and b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.el.png differ diff --git a/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.th.png b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.th.png new file mode 100644 index 00000000..2953cea1 Binary files /dev/null and b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.th.png differ diff --git a/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.el.png b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.el.png new file mode 100644 index 00000000..2ce7dedf Binary files /dev/null and b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.el.png differ diff --git a/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.th.png b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.th.png new file mode 100644 index 00000000..2ce7dedf Binary files /dev/null and b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.th.png differ diff --git a/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.el.png b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.el.png new file mode 100644 index 00000000..157c08c6 Binary files /dev/null and b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.el.png differ diff --git a/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.th.png b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.th.png new file mode 100644 index 00000000..157c08c6 Binary files /dev/null and b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.th.png differ diff --git a/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.el.png b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.el.png new file mode 100644 index 00000000..031361a6 Binary files /dev/null and b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.el.png differ diff --git a/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.th.png b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.th.png new file mode 100644 index 00000000..031361a6 Binary files /dev/null and b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.th.png differ diff --git a/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.el.png b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.el.png new file mode 100644 index 00000000..3a43eb23 Binary files /dev/null and b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.el.png differ diff --git a/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.th.png b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.th.png new file mode 100644 index 00000000..3a43eb23 Binary files /dev/null and b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.th.png differ diff --git a/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.el.png b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.el.png new file mode 100644 index 00000000..7c9552e3 Binary files /dev/null and b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.el.png differ diff --git a/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.th.png b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.th.png new file mode 100644 index 00000000..7c9552e3 Binary files /dev/null and b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.th.png differ diff --git a/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.el.png b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.el.png new file mode 100644 index 00000000..78f695b7 Binary files /dev/null and b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.el.png differ diff --git a/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.th.png b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.th.png new file mode 100644 index 00000000..78f695b7 Binary files /dev/null and b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.th.png differ diff --git a/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.el.png b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.el.png new file mode 100644 index 00000000..77f563fb Binary files /dev/null and b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.el.png differ diff --git a/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.th.png b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.th.png new file mode 100644 index 00000000..77f563fb Binary files /dev/null and b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.th.png differ diff --git a/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.el.png b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.el.png new file mode 100644 index 00000000..8dccd514 Binary files /dev/null and b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.el.png differ diff --git a/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.th.png b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.th.png new file mode 100644 index 00000000..8dccd514 Binary files /dev/null and b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.th.png differ diff --git a/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.el.png b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.el.png new file mode 100644 index 00000000..b75e015e Binary files /dev/null and b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.el.png differ diff --git a/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.th.png b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.th.png new file mode 100644 index 00000000..b75e015e Binary files /dev/null and b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.th.png differ diff --git a/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.el.png b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.el.png new file mode 100644 index 00000000..5bfed282 Binary files /dev/null and b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.el.png differ diff --git a/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.th.png b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.th.png new file mode 100644 index 00000000..5bfed282 Binary files /dev/null and b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.th.png differ diff --git a/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.el.png b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.el.png new file mode 100644 index 00000000..34ca765c Binary files /dev/null and b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.el.png differ diff --git a/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.th.png b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.th.png new file mode 100644 index 00000000..34ca765c Binary files /dev/null and b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.th.png differ diff --git a/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.el.png b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.el.png new file mode 100644 index 00000000..d1f7bc09 Binary files /dev/null and b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.el.png differ diff --git a/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.th.png b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.th.png new file mode 100644 index 00000000..d1f7bc09 Binary files /dev/null and b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.th.png differ diff --git a/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.el.png b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.el.png new file mode 100644 index 00000000..c215b446 Binary files /dev/null and b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.el.png differ diff --git a/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.th.png b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.th.png new file mode 100644 index 00000000..c215b446 Binary files /dev/null and b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.th.png differ diff --git a/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.el.png b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.el.png new file mode 100644 index 00000000..63f58daa Binary files /dev/null and b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.el.png differ diff --git a/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.th.png b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.th.png new file mode 100644 index 00000000..63f58daa Binary files /dev/null and b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.th.png differ diff --git a/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.el.png b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.el.png new file mode 100644 index 00000000..3eb38501 Binary files /dev/null and b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.el.png differ diff --git a/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.th.png b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.th.png new file mode 100644 index 00000000..3eb38501 Binary files /dev/null and b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.th.png differ diff --git a/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.el.png b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.el.png new file mode 100644 index 00000000..4f960870 Binary files /dev/null and b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.el.png differ diff --git a/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.th.png b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.th.png new file mode 100644 index 00000000..4f960870 Binary files /dev/null and b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.th.png differ diff --git a/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.el.png b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.el.png new file mode 100644 index 00000000..ca5b5882 Binary files /dev/null and b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.el.png differ diff --git a/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.th.png b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.th.png new file mode 100644 index 00000000..ca5b5882 Binary files /dev/null and b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.th.png differ diff --git a/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.el.png b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.el.png new file mode 100644 index 00000000..2c3440cd Binary files /dev/null and b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.el.png differ diff --git a/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.th.png b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.th.png new file mode 100644 index 00000000..2c3440cd Binary files /dev/null and b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.th.png differ diff --git a/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.el.png b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.el.png new file mode 100644 index 00000000..5294a9dc Binary files /dev/null and b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.el.png differ diff --git a/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.th.png b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.th.png new file mode 100644 index 00000000..5294a9dc Binary files /dev/null and b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.th.png differ diff --git a/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.el.png b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.el.png new file mode 100644 index 00000000..912ac4ca Binary files /dev/null and b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.el.png differ diff --git a/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.th.png b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.th.png new file mode 100644 index 00000000..912ac4ca Binary files /dev/null and b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.th.png differ diff --git a/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.el.png b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.el.png new file mode 100644 index 00000000..8e47de7d Binary files /dev/null and b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.el.png differ diff --git a/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.th.png b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.th.png new file mode 100644 index 00000000..8e47de7d Binary files /dev/null and b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.th.png differ diff --git a/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.el.png b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.el.png new file mode 100644 index 00000000..b3c98d83 Binary files /dev/null and b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.el.png differ diff --git a/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.th.png b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.th.png new file mode 100644 index 00000000..b3c98d83 Binary files /dev/null and b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.th.png differ diff --git a/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.el.png b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.el.png new file mode 100644 index 00000000..1d494613 Binary files /dev/null and b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.el.png differ diff --git a/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.th.png b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.th.png new file mode 100644 index 00000000..1d494613 Binary files /dev/null and b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.th.png differ diff --git a/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.el.png b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.el.png new file mode 100644 index 00000000..47ced39a Binary files /dev/null and b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.el.png differ diff --git a/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.th.png b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.th.png new file mode 100644 index 00000000..47ced39a Binary files /dev/null and b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.th.png differ diff --git a/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.el.png b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.el.png new file mode 100644 index 00000000..88d5c896 Binary files /dev/null and b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.el.png differ diff --git a/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.th.png b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.th.png new file mode 100644 index 00000000..88d5c896 Binary files /dev/null and b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.th.png differ diff --git a/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.el.png b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.el.png new file mode 100644 index 00000000..e0706533 Binary files /dev/null and b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.el.png differ diff --git a/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.th.png b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.th.png new file mode 100644 index 00000000..e0706533 Binary files /dev/null and b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.th.png differ diff --git a/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.el.png b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.el.png new file mode 100644 index 00000000..a1f17249 Binary files /dev/null and b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.el.png differ diff --git a/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.th.png b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.th.png new file mode 100644 index 00000000..a1f17249 Binary files /dev/null and b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.th.png differ diff --git a/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.el.png b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.el.png new file mode 100644 index 00000000..3adc61ef Binary files /dev/null and b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.el.png differ diff --git a/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.th.png b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.th.png new file mode 100644 index 00000000..3adc61ef Binary files /dev/null and b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.th.png differ diff --git a/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.el.png b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.el.png new file mode 100644 index 00000000..1c3c8d53 Binary files /dev/null and b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.el.png differ diff --git a/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.th.png b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.th.png new file mode 100644 index 00000000..1c3c8d53 Binary files /dev/null and b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.th.png differ diff --git a/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.el.jpg b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.el.jpg new file mode 100644 index 00000000..0f4a9a38 Binary files /dev/null and b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.el.jpg differ diff --git a/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.th.jpg b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.th.jpg new file mode 100644 index 00000000..0f4a9a38 Binary files /dev/null and b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.th.jpg differ diff --git a/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.el.png b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.el.png new file mode 100644 index 00000000..32dab60c Binary files /dev/null and b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.el.png differ diff --git a/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.th.png b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.th.png new file mode 100644 index 00000000..32dab60c Binary files /dev/null and b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.th.png differ diff --git a/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.el.png b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.el.png new file mode 100644 index 00000000..78e9b675 Binary files /dev/null and b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.el.png differ diff --git a/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.th.png b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.th.png new file mode 100644 index 00000000..78e9b675 Binary files /dev/null and b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.th.png differ diff --git a/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.el.png b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.el.png new file mode 100644 index 00000000..fb87dd71 Binary files /dev/null and b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.el.png differ diff --git a/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.th.png b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.th.png new file mode 100644 index 00000000..fb87dd71 Binary files /dev/null and b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.th.png differ diff --git a/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.el.png b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.el.png new file mode 100644 index 00000000..acaa9a02 Binary files /dev/null and b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.el.png differ diff --git a/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.th.png b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.th.png new file mode 100644 index 00000000..acaa9a02 Binary files /dev/null and b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.th.png differ diff --git a/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.el.png b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.el.png new file mode 100644 index 00000000..b6afaa8a Binary files /dev/null and b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.el.png differ diff --git a/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.th.png b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.th.png new file mode 100644 index 00000000..b6afaa8a Binary files /dev/null and b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.th.png differ diff --git a/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.el.png b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.el.png new file mode 100644 index 00000000..18f92ede Binary files /dev/null and b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.el.png differ diff --git a/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.th.png b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.th.png new file mode 100644 index 00000000..18f92ede Binary files /dev/null and b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.th.png differ diff --git a/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.el.png b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.el.png new file mode 100644 index 00000000..e1eb6df0 Binary files /dev/null and b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.el.png differ diff --git a/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.th.png b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.th.png new file mode 100644 index 00000000..e1eb6df0 Binary files /dev/null and b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.th.png differ diff --git a/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.el.png b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.el.png new file mode 100644 index 00000000..dfcfde45 Binary files /dev/null and b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.el.png differ diff --git a/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.th.png b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.th.png new file mode 100644 index 00000000..dfcfde45 Binary files /dev/null and b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.th.png differ diff --git a/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.el.png b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.el.png new file mode 100644 index 00000000..44af1896 Binary files /dev/null and b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.el.png differ diff --git a/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.th.png b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.th.png new file mode 100644 index 00000000..44af1896 Binary files /dev/null and b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.th.png differ diff --git a/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.el.png b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.el.png new file mode 100644 index 00000000..6d749e6c Binary files /dev/null and b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.el.png differ diff --git a/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.th.png b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.th.png new file mode 100644 index 00000000..6d749e6c Binary files /dev/null and b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.th.png differ diff --git a/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.el.png b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.el.png new file mode 100644 index 00000000..7485e36c Binary files /dev/null and b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.el.png differ diff --git a/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.th.png b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.th.png new file mode 100644 index 00000000..7485e36c Binary files /dev/null and b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.th.png differ diff --git a/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.el.png b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.el.png new file mode 100644 index 00000000..0f499097 Binary files /dev/null and b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.el.png differ diff --git a/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.th.png b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.th.png new file mode 100644 index 00000000..0f499097 Binary files /dev/null and b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.th.png differ diff --git a/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.el.png b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.el.png new file mode 100644 index 00000000..710c440c Binary files /dev/null and b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.el.png differ diff --git a/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.th.png b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.th.png new file mode 100644 index 00000000..710c440c Binary files /dev/null and b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.th.png differ diff --git a/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.el.png b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.el.png new file mode 100644 index 00000000..24cecced Binary files /dev/null and b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.el.png differ diff --git a/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.th.png b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.th.png new file mode 100644 index 00000000..24cecced Binary files /dev/null and b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.th.png differ diff --git a/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.el.png b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.el.png new file mode 100644 index 00000000..b36025d9 Binary files /dev/null and b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.el.png differ diff --git a/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.th.png b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.th.png new file mode 100644 index 00000000..b36025d9 Binary files /dev/null and b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.th.png differ diff --git a/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.el.png b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.el.png new file mode 100644 index 00000000..b21a4bed Binary files /dev/null and b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.el.png differ diff --git a/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.th.png b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.th.png new file mode 100644 index 00000000..b21a4bed Binary files /dev/null and b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.th.png differ diff --git a/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.el.png b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.el.png new file mode 100644 index 00000000..8da6f9a4 Binary files /dev/null and b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.el.png differ diff --git a/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.th.png b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.th.png new file mode 100644 index 00000000..8da6f9a4 Binary files /dev/null and b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.th.png differ diff --git a/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.el.jpg b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.el.jpg new file mode 100644 index 00000000..437f3d07 Binary files /dev/null and b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.el.jpg differ diff --git a/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.th.jpg b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.th.jpg new file mode 100644 index 00000000..437f3d07 Binary files /dev/null and b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.th.jpg differ diff --git a/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.el.png b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.el.png new file mode 100644 index 00000000..cc61fb13 Binary files /dev/null and b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.el.png differ diff --git a/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.th.png b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.th.png new file mode 100644 index 00000000..cc61fb13 Binary files /dev/null and b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.th.png differ diff --git a/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.el.png b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.el.png new file mode 100644 index 00000000..3472b1d9 Binary files /dev/null and b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.el.png differ diff --git a/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.th.png b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.th.png new file mode 100644 index 00000000..3472b1d9 Binary files /dev/null and b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.th.png differ diff --git a/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.el.png b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.el.png new file mode 100644 index 00000000..0bbca602 Binary files /dev/null and b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.el.png differ diff --git a/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.th.png b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.th.png new file mode 100644 index 00000000..0bbca602 Binary files /dev/null and b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.th.png differ diff --git a/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.el.png b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.el.png new file mode 100644 index 00000000..b5775adc Binary files /dev/null and b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.el.png differ diff --git a/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.th.png b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.th.png new file mode 100644 index 00000000..b5775adc Binary files /dev/null and b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.th.png differ diff --git a/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.el.png b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.el.png new file mode 100644 index 00000000..bc58477a Binary files /dev/null and b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.el.png differ diff --git a/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.th.png b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.th.png new file mode 100644 index 00000000..bc58477a Binary files /dev/null and b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.th.png differ diff --git a/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.el.png b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.el.png new file mode 100644 index 00000000..1b7a40f4 Binary files /dev/null and b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.el.png differ diff --git a/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.th.png b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.th.png new file mode 100644 index 00000000..1b7a40f4 Binary files /dev/null and b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.th.png differ diff --git a/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.el.png b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.el.png new file mode 100644 index 00000000..011b07a3 Binary files /dev/null and b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.el.png differ diff --git a/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.th.png b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.th.png new file mode 100644 index 00000000..011b07a3 Binary files /dev/null and b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.th.png differ diff --git a/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.el.png b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.el.png new file mode 100644 index 00000000..7f9d24ef Binary files /dev/null and b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.el.png differ diff --git a/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.th.png b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.th.png new file mode 100644 index 00000000..7f9d24ef Binary files /dev/null and b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.th.png differ diff --git a/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.el.png b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.el.png new file mode 100644 index 00000000..0c6a7067 Binary files /dev/null and b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.el.png differ diff --git a/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.th.png b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.th.png new file mode 100644 index 00000000..0c6a7067 Binary files /dev/null and b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.th.png differ diff --git a/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.el.png b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.el.png new file mode 100644 index 00000000..8f7968a5 Binary files /dev/null and b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.el.png differ diff --git a/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.th.png b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.th.png new file mode 100644 index 00000000..8f7968a5 Binary files /dev/null and b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.th.png differ diff --git a/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.el.png b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.el.png new file mode 100644 index 00000000..20c6036f Binary files /dev/null and b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.el.png differ diff --git a/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.th.png b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.th.png new file mode 100644 index 00000000..20c6036f Binary files /dev/null and b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.th.png differ diff --git a/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.el.png b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.el.png new file mode 100644 index 00000000..f077b6e9 Binary files /dev/null and b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.el.png differ diff --git a/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.th.png b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.th.png new file mode 100644 index 00000000..f077b6e9 Binary files /dev/null and b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.th.png differ diff --git a/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.el.png b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.el.png new file mode 100644 index 00000000..484206d5 Binary files /dev/null and b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.el.png differ diff --git a/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.th.png b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.th.png new file mode 100644 index 00000000..484206d5 Binary files /dev/null and b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.th.png differ diff --git a/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.el.png b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.el.png new file mode 100644 index 00000000..9fa156e2 Binary files /dev/null and b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.el.png differ diff --git a/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.th.png b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.th.png new file mode 100644 index 00000000..9fa156e2 Binary files /dev/null and b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.th.png differ diff --git a/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.el.png b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.el.png new file mode 100644 index 00000000..b0813972 Binary files /dev/null and b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.el.png differ diff --git a/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.th.png b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.th.png new file mode 100644 index 00000000..b0813972 Binary files /dev/null and b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.th.png differ diff --git a/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.el.png b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.el.png new file mode 100644 index 00000000..4f2da8dc Binary files /dev/null and b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.el.png differ diff --git a/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.th.png b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.th.png new file mode 100644 index 00000000..4f2da8dc Binary files /dev/null and b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.th.png differ diff --git a/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.el.png b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.el.png new file mode 100644 index 00000000..8ae3904c Binary files /dev/null and b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.el.png differ diff --git a/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.th.png b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.th.png new file mode 100644 index 00000000..8ae3904c Binary files /dev/null and b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.th.png differ diff --git a/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.el.png b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.el.png new file mode 100644 index 00000000..ea5cbe30 Binary files /dev/null and b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.el.png differ diff --git a/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.th.png b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.th.png new file mode 100644 index 00000000..ea5cbe30 Binary files /dev/null and b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.th.png differ diff --git a/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.el.png b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.el.png new file mode 100644 index 00000000..eab9fb03 Binary files /dev/null and b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.el.png differ diff --git a/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.th.png b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.th.png new file mode 100644 index 00000000..eab9fb03 Binary files /dev/null and b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.th.png differ diff --git a/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.el.png b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.el.png new file mode 100644 index 00000000..c49c0459 Binary files /dev/null and b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.el.png differ diff --git a/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.th.png b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.th.png new file mode 100644 index 00000000..c49c0459 Binary files /dev/null and b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.th.png differ diff --git a/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.el.png b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.el.png new file mode 100644 index 00000000..127b0257 Binary files /dev/null and b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.el.png differ diff --git a/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.th.png b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.th.png new file mode 100644 index 00000000..127b0257 Binary files /dev/null and b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.th.png differ diff --git a/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.el.png b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.el.png new file mode 100644 index 00000000..0b528799 Binary files /dev/null and b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.el.png differ diff --git a/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.th.png b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.th.png new file mode 100644 index 00000000..0b528799 Binary files /dev/null and b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.th.png differ diff --git a/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.el.png b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.el.png new file mode 100644 index 00000000..e5b04c65 Binary files /dev/null and b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.el.png differ diff --git a/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.th.png b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.th.png new file mode 100644 index 00000000..e5b04c65 Binary files /dev/null and b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.th.png differ diff --git a/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.el.png b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.el.png new file mode 100644 index 00000000..46543926 Binary files /dev/null and b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.el.png differ diff --git a/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.th.png b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.th.png new file mode 100644 index 00000000..46543926 Binary files /dev/null and b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.th.png differ diff --git a/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.el.png b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.el.png new file mode 100644 index 00000000..46e99668 Binary files /dev/null and b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.el.png differ diff --git a/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.th.png b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.th.png new file mode 100644 index 00000000..46e99668 Binary files /dev/null and b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.th.png differ diff --git a/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.el.png b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.el.png new file mode 100644 index 00000000..c012d47d Binary files /dev/null and b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.el.png differ diff --git a/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.th.png b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.th.png new file mode 100644 index 00000000..c012d47d Binary files /dev/null and b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.th.png differ diff --git a/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.el.png b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.el.png new file mode 100644 index 00000000..fa44061a Binary files /dev/null and b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.el.png differ diff --git a/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.th.png b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.th.png new file mode 100644 index 00000000..fa44061a Binary files /dev/null and b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.th.png differ diff --git a/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.el.png b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.el.png new file mode 100644 index 00000000..e499b2fd Binary files /dev/null and b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.el.png differ diff --git a/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.th.png b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.th.png new file mode 100644 index 00000000..e499b2fd Binary files /dev/null and b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.th.png differ diff --git a/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.el.png b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.el.png new file mode 100644 index 00000000..66e9927a Binary files /dev/null and b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.el.png differ diff --git a/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.th.png b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.th.png new file mode 100644 index 00000000..66e9927a Binary files /dev/null and b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.th.png differ diff --git a/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.el.png b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.el.png new file mode 100644 index 00000000..e512cf63 Binary files /dev/null and b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.el.png differ diff --git a/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.th.png b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.th.png new file mode 100644 index 00000000..e512cf63 Binary files /dev/null and b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.th.png differ diff --git a/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.el.png b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.el.png new file mode 100644 index 00000000..89e41b8a Binary files /dev/null and b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.el.png differ diff --git a/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.th.png b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.th.png new file mode 100644 index 00000000..89e41b8a Binary files /dev/null and b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.th.png differ diff --git a/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.el.png b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.el.png new file mode 100644 index 00000000..257c3e55 Binary files /dev/null and b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.el.png differ diff --git a/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.th.png b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.th.png new file mode 100644 index 00000000..257c3e55 Binary files /dev/null and b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.th.png differ diff --git a/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.el.png b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.el.png new file mode 100644 index 00000000..85a581ed Binary files /dev/null and b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.el.png differ diff --git a/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.th.png b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.th.png new file mode 100644 index 00000000..85a581ed Binary files /dev/null and b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.th.png differ diff --git a/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.el.png b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.el.png new file mode 100644 index 00000000..c07f67c3 Binary files /dev/null and b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.el.png differ diff --git a/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.th.png b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.th.png new file mode 100644 index 00000000..c07f67c3 Binary files /dev/null and b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.th.png differ diff --git a/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.el.png b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.el.png new file mode 100644 index 00000000..c598913b Binary files /dev/null and b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.el.png differ diff --git a/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.th.png b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.th.png new file mode 100644 index 00000000..c598913b Binary files /dev/null and b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.th.png differ diff --git a/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.el.png b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.el.png new file mode 100644 index 00000000..a630a6f3 Binary files /dev/null and b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.el.png differ diff --git a/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.th.png b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.th.png new file mode 100644 index 00000000..a630a6f3 Binary files /dev/null and b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.th.png differ diff --git a/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.el.png b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.el.png new file mode 100644 index 00000000..f63ad48d Binary files /dev/null and b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.el.png differ diff --git a/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.th.png b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.th.png new file mode 100644 index 00000000..f63ad48d Binary files /dev/null and b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.th.png differ diff --git a/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.el.png b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.el.png new file mode 100644 index 00000000..73c0aea6 Binary files /dev/null and b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.el.png differ diff --git a/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.th.png b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.th.png new file mode 100644 index 00000000..73c0aea6 Binary files /dev/null and b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.th.png differ diff --git a/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.el.png b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.el.png new file mode 100644 index 00000000..0768efbc Binary files /dev/null and b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.el.png differ diff --git a/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.th.png b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.th.png new file mode 100644 index 00000000..0768efbc Binary files /dev/null and b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.th.png differ diff --git a/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.el.png b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.el.png new file mode 100644 index 00000000..a6c3afe8 Binary files /dev/null and b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.el.png differ diff --git a/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.th.png b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.th.png new file mode 100644 index 00000000..a6c3afe8 Binary files /dev/null and b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.th.png differ diff --git a/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.el.png b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.el.png new file mode 100644 index 00000000..eed10ecb Binary files /dev/null and b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.el.png differ diff --git a/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.th.png b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.th.png new file mode 100644 index 00000000..eed10ecb Binary files /dev/null and b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.th.png differ diff --git a/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.el.png b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.el.png new file mode 100644 index 00000000..4c086050 Binary files /dev/null and b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.el.png differ diff --git a/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.th.png b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.th.png new file mode 100644 index 00000000..4c086050 Binary files /dev/null and b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.th.png differ diff --git a/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.el.png b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.el.png new file mode 100644 index 00000000..9f641588 Binary files /dev/null and b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.el.png differ diff --git a/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.th.png b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.th.png new file mode 100644 index 00000000..9f641588 Binary files /dev/null and b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.th.png differ diff --git a/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.el.png b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.el.png new file mode 100644 index 00000000..9404843f Binary files /dev/null and b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.el.png differ diff --git a/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.th.png b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.th.png new file mode 100644 index 00000000..9404843f Binary files /dev/null and b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.th.png differ diff --git a/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.el.png b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.el.png new file mode 100644 index 00000000..9636ac68 Binary files /dev/null and b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.el.png differ diff --git a/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.th.png b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.th.png new file mode 100644 index 00000000..9636ac68 Binary files /dev/null and b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.th.png differ diff --git a/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.el.png b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.el.png new file mode 100644 index 00000000..38a2b35d Binary files /dev/null and b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.el.png differ diff --git a/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.th.png b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.th.png new file mode 100644 index 00000000..38a2b35d Binary files /dev/null and b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.th.png differ diff --git a/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.el.png b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.el.png new file mode 100644 index 00000000..cd09e177 Binary files /dev/null and b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.el.png differ diff --git a/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.th.png b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.th.png new file mode 100644 index 00000000..cd09e177 Binary files /dev/null and b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.th.png differ diff --git a/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.el.png b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.el.png new file mode 100644 index 00000000..4cc4f4bc Binary files /dev/null and b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.el.png differ diff --git a/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.th.png b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.th.png new file mode 100644 index 00000000..4cc4f4bc Binary files /dev/null and b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.th.png differ diff --git a/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.el.png b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.el.png new file mode 100644 index 00000000..33e03220 Binary files /dev/null and b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.el.png differ diff --git a/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.th.png b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.th.png new file mode 100644 index 00000000..33e03220 Binary files /dev/null and b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.th.png differ diff --git a/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.el.png b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.el.png new file mode 100644 index 00000000..489d49e3 Binary files /dev/null and b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.el.png differ diff --git a/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.th.png b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.th.png new file mode 100644 index 00000000..489d49e3 Binary files /dev/null and b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.th.png differ diff --git a/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.el.png b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.el.png new file mode 100644 index 00000000..80b39b63 Binary files /dev/null and b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.el.png differ diff --git a/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.th.png b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.th.png new file mode 100644 index 00000000..80b39b63 Binary files /dev/null and b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.th.png differ diff --git a/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.el.png b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.el.png new file mode 100644 index 00000000..2404a4ce Binary files /dev/null and b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.el.png differ diff --git a/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.th.png b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.th.png new file mode 100644 index 00000000..2404a4ce Binary files /dev/null and b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.th.png differ diff --git a/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.el.png b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.el.png new file mode 100644 index 00000000..f884cc81 Binary files /dev/null and b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.el.png differ diff --git a/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.th.png b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.th.png new file mode 100644 index 00000000..f884cc81 Binary files /dev/null and b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.th.png differ diff --git a/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.el.png b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.el.png new file mode 100644 index 00000000..9f649bd1 Binary files /dev/null and b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.el.png differ diff --git a/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.th.png b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.th.png new file mode 100644 index 00000000..9f649bd1 Binary files /dev/null and b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.th.png differ diff --git a/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.el.png b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.el.png new file mode 100644 index 00000000..03e1fa8c Binary files /dev/null and b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.el.png differ diff --git a/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.th.png b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.th.png new file mode 100644 index 00000000..03e1fa8c Binary files /dev/null and b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.th.png differ diff --git a/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.el.png b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.el.png new file mode 100644 index 00000000..983f836f Binary files /dev/null and b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.el.png differ diff --git a/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.th.png b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.th.png new file mode 100644 index 00000000..983f836f Binary files /dev/null and b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.th.png differ diff --git a/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.el.png b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.el.png new file mode 100644 index 00000000..2aede939 Binary files /dev/null and b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.el.png differ diff --git a/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.th.png b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.th.png new file mode 100644 index 00000000..2aede939 Binary files /dev/null and b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.th.png differ diff --git a/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.el.png b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.el.png new file mode 100644 index 00000000..7bc7bab2 Binary files /dev/null and b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.el.png differ diff --git a/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.th.png b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.th.png new file mode 100644 index 00000000..7bc7bab2 Binary files /dev/null and b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.th.png differ diff --git a/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.el.png b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.el.png new file mode 100644 index 00000000..4ffd862a Binary files /dev/null and b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.el.png differ diff --git a/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.th.png b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.th.png new file mode 100644 index 00000000..4ffd862a Binary files /dev/null and b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.th.png differ diff --git a/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.el.png b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.el.png new file mode 100644 index 00000000..ef506579 Binary files /dev/null and b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.el.png differ diff --git a/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.th.png b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.th.png new file mode 100644 index 00000000..ef506579 Binary files /dev/null and b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.th.png differ diff --git a/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.el.png b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.el.png new file mode 100644 index 00000000..ddf79213 Binary files /dev/null and b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.el.png differ diff --git a/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.th.png b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.th.png new file mode 100644 index 00000000..ddf79213 Binary files /dev/null and b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.th.png differ diff --git a/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.el.png b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.el.png new file mode 100644 index 00000000..1796bcce Binary files /dev/null and b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.el.png differ diff --git a/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.th.png b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.th.png new file mode 100644 index 00000000..1796bcce Binary files /dev/null and b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.th.png differ diff --git a/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.el.png b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.el.png new file mode 100644 index 00000000..ab763666 Binary files /dev/null and b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.el.png differ diff --git a/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.th.png b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.th.png new file mode 100644 index 00000000..ab763666 Binary files /dev/null and b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.th.png differ diff --git a/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.el.png b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.el.png new file mode 100644 index 00000000..013f247d Binary files /dev/null and b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.el.png differ diff --git a/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.th.png b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.th.png new file mode 100644 index 00000000..013f247d Binary files /dev/null and b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.th.png differ diff --git a/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.el.png b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.el.png new file mode 100644 index 00000000..fd1b7753 Binary files /dev/null and b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.el.png differ diff --git a/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.th.png b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.th.png new file mode 100644 index 00000000..fd1b7753 Binary files /dev/null and b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.th.png differ diff --git a/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.el.png b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.el.png new file mode 100644 index 00000000..55154b84 Binary files /dev/null and b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.el.png differ diff --git a/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.th.png b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.th.png new file mode 100644 index 00000000..55154b84 Binary files /dev/null and b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.th.png differ diff --git a/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.el.png b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.el.png new file mode 100644 index 00000000..306d6f14 Binary files /dev/null and b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.el.png differ diff --git a/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.th.png b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.th.png new file mode 100644 index 00000000..306d6f14 Binary files /dev/null and b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.th.png differ diff --git a/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.el.png b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.el.png new file mode 100644 index 00000000..dfb03646 Binary files /dev/null and b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.el.png differ diff --git a/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.th.png b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.th.png new file mode 100644 index 00000000..dfb03646 Binary files /dev/null and b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.th.png differ diff --git a/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.el.png b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.el.png new file mode 100644 index 00000000..05208120 Binary files /dev/null and b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.el.png differ diff --git a/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.th.png b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.th.png new file mode 100644 index 00000000..05208120 Binary files /dev/null and b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.th.png differ diff --git a/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.el.jpg b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.el.jpg new file mode 100644 index 00000000..e78b8c6c Binary files /dev/null and b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.el.jpg differ diff --git a/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.th.jpg b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.th.jpg new file mode 100644 index 00000000..e78b8c6c Binary files /dev/null and b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.th.jpg differ diff --git a/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.el.png b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.el.png new file mode 100644 index 00000000..0b221a3f Binary files /dev/null and b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.el.png differ diff --git a/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.th.png b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.th.png new file mode 100644 index 00000000..0b221a3f Binary files /dev/null and b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.th.png differ diff --git a/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.el.png b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.el.png new file mode 100644 index 00000000..576d3f84 Binary files /dev/null and b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.el.png differ diff --git a/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.th.png b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.th.png new file mode 100644 index 00000000..576d3f84 Binary files /dev/null and b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.th.png differ diff --git a/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.el.png b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.el.png new file mode 100644 index 00000000..297ccc5e Binary files /dev/null and b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.el.png differ diff --git a/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.th.png b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.th.png new file mode 100644 index 00000000..297ccc5e Binary files /dev/null and b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.th.png differ diff --git a/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.el.png b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.el.png new file mode 100644 index 00000000..89bd1ba6 Binary files /dev/null and b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.el.png differ diff --git a/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.th.png b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.th.png new file mode 100644 index 00000000..89bd1ba6 Binary files /dev/null and b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.th.png differ diff --git a/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.el.jpg b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.el.jpg new file mode 100644 index 00000000..383794f2 Binary files /dev/null and b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.el.jpg differ diff --git a/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.th.jpg b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.th.jpg new file mode 100644 index 00000000..383794f2 Binary files /dev/null and b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.th.jpg differ diff --git a/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.el.png b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.el.png new file mode 100644 index 00000000..f28538e1 Binary files /dev/null and b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.el.png differ diff --git a/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.th.png b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.th.png new file mode 100644 index 00000000..f28538e1 Binary files /dev/null and b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.th.png differ diff --git a/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.el.png b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.el.png new file mode 100644 index 00000000..39431760 Binary files /dev/null and b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.el.png differ diff --git a/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.th.png b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.th.png new file mode 100644 index 00000000..39431760 Binary files /dev/null and b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.th.png differ diff --git a/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.el.png b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.el.png new file mode 100644 index 00000000..46a26d45 Binary files /dev/null and b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.el.png differ diff --git a/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.th.png b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.th.png new file mode 100644 index 00000000..46a26d45 Binary files /dev/null and b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.th.png differ diff --git a/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.el.png b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.el.png new file mode 100644 index 00000000..6f70239b Binary files /dev/null and b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.el.png differ diff --git a/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.th.png b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.th.png new file mode 100644 index 00000000..6f70239b Binary files /dev/null and b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.th.png differ diff --git a/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.el.png b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.el.png new file mode 100644 index 00000000..c5cd51da Binary files /dev/null and b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.el.png differ diff --git a/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.th.png b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.th.png new file mode 100644 index 00000000..c5cd51da Binary files /dev/null and b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.th.png differ diff --git a/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.el.png b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.el.png new file mode 100644 index 00000000..0328b3ea Binary files /dev/null and b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.el.png differ diff --git a/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.th.png b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.th.png new file mode 100644 index 00000000..0328b3ea Binary files /dev/null and b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.th.png differ diff --git a/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.el.png b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.el.png new file mode 100644 index 00000000..b3d0d223 Binary files /dev/null and b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.el.png differ diff --git a/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.th.png b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.th.png new file mode 100644 index 00000000..b3d0d223 Binary files /dev/null and b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.th.png differ diff --git a/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.el.png b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.el.png new file mode 100644 index 00000000..0729dbce Binary files /dev/null and b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.el.png differ diff --git a/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.th.png b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.th.png new file mode 100644 index 00000000..0729dbce Binary files /dev/null and b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.th.png differ diff --git a/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.el.png b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.el.png new file mode 100644 index 00000000..2e3adef5 Binary files /dev/null and b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.el.png differ diff --git a/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.th.png b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.th.png new file mode 100644 index 00000000..2e3adef5 Binary files /dev/null and b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.th.png differ diff --git a/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.el.png b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.el.png new file mode 100644 index 00000000..4e9aa9b4 Binary files /dev/null and b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.el.png differ diff --git a/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.th.png b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.th.png new file mode 100644 index 00000000..4e9aa9b4 Binary files /dev/null and b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.th.png differ diff --git a/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.el.png b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.el.png new file mode 100644 index 00000000..766527c0 Binary files /dev/null and b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.el.png differ diff --git a/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.th.png b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.th.png new file mode 100644 index 00000000..766527c0 Binary files /dev/null and b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.th.png differ diff --git a/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.el.png b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.el.png new file mode 100644 index 00000000..f34ad7c6 Binary files /dev/null and b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.el.png differ diff --git a/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.th.png b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.th.png new file mode 100644 index 00000000..f34ad7c6 Binary files /dev/null and b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.th.png differ diff --git a/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.el.png b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.el.png new file mode 100644 index 00000000..403bb436 Binary files /dev/null and b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.el.png differ diff --git a/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.th.png b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.th.png new file mode 100644 index 00000000..403bb436 Binary files /dev/null and b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.th.png differ diff --git a/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.el.png b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.el.png new file mode 100644 index 00000000..07398a97 Binary files /dev/null and b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.el.png differ diff --git a/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.th.png b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.th.png new file mode 100644 index 00000000..07398a97 Binary files /dev/null and b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.th.png differ diff --git a/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.el.png b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.el.png new file mode 100644 index 00000000..83d0a29e Binary files /dev/null and b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.el.png differ diff --git a/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.th.png b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.th.png new file mode 100644 index 00000000..83d0a29e Binary files /dev/null and b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.th.png differ diff --git a/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.el.png b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.el.png new file mode 100644 index 00000000..cdd566f5 Binary files /dev/null and b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.el.png differ diff --git a/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.th.png b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.th.png new file mode 100644 index 00000000..cdd566f5 Binary files /dev/null and b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.th.png differ diff --git a/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.el.png b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.el.png new file mode 100644 index 00000000..50caa7a8 Binary files /dev/null and b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.el.png differ diff --git a/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.th.png b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.th.png new file mode 100644 index 00000000..50caa7a8 Binary files /dev/null and b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.th.png differ diff --git a/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.el.png b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.el.png new file mode 100644 index 00000000..e68c1881 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.el.png differ diff --git a/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.th.png b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.th.png new file mode 100644 index 00000000..e68c1881 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.th.png differ diff --git a/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.el.png b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.el.png new file mode 100644 index 00000000..357708db Binary files /dev/null and b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.el.png differ diff --git a/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.th.png b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.th.png new file mode 100644 index 00000000..357708db Binary files /dev/null and b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.th.png differ diff --git a/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.el.png b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.el.png new file mode 100644 index 00000000..ff2cb168 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.el.png differ diff --git a/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.th.png b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.th.png new file mode 100644 index 00000000..ff2cb168 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.th.png differ diff --git a/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.el.png b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.el.png new file mode 100644 index 00000000..4dd28830 Binary files /dev/null and b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.el.png differ diff --git a/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.th.png b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.th.png new file mode 100644 index 00000000..4dd28830 Binary files /dev/null and b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.th.png differ diff --git a/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.el.png b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.el.png new file mode 100644 index 00000000..36a0bed7 Binary files /dev/null and b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.el.png differ diff --git a/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.th.png b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.th.png new file mode 100644 index 00000000..36a0bed7 Binary files /dev/null and b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.th.png differ diff --git a/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.el.png b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.el.png new file mode 100644 index 00000000..43b82415 Binary files /dev/null and b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.el.png differ diff --git a/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.th.png b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.th.png new file mode 100644 index 00000000..43b82415 Binary files /dev/null and b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.th.png differ diff --git a/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.el.png b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.el.png new file mode 100644 index 00000000..9f42e92d Binary files /dev/null and b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.el.png differ diff --git a/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.th.png b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.th.png new file mode 100644 index 00000000..9f42e92d Binary files /dev/null and b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.th.png differ diff --git a/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.el.png b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.el.png new file mode 100644 index 00000000..91118b35 Binary files /dev/null and b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.el.png differ diff --git a/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.th.png b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.th.png new file mode 100644 index 00000000..91118b35 Binary files /dev/null and b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.th.png differ diff --git a/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.el.png b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.el.png new file mode 100644 index 00000000..c1074a8e Binary files /dev/null and b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.el.png differ diff --git a/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.th.png b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.th.png new file mode 100644 index 00000000..c1074a8e Binary files /dev/null and b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.th.png differ diff --git a/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.el.png b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.el.png new file mode 100644 index 00000000..a4cca4dc Binary files /dev/null and b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.el.png differ diff --git a/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.th.png b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.th.png new file mode 100644 index 00000000..a4cca4dc Binary files /dev/null and b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.th.png differ diff --git a/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.el.png b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.el.png new file mode 100644 index 00000000..1dd02459 Binary files /dev/null and b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.el.png differ diff --git a/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.th.png b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.th.png new file mode 100644 index 00000000..1dd02459 Binary files /dev/null and b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.th.png differ diff --git a/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.el.png b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.el.png new file mode 100644 index 00000000..64ba974b Binary files /dev/null and b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.el.png differ diff --git a/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.th.png b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.th.png new file mode 100644 index 00000000..64ba974b Binary files /dev/null and b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.th.png differ diff --git a/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.el.png b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.el.png new file mode 100644 index 00000000..fd3d1f9b Binary files /dev/null and b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.el.png differ diff --git a/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.th.png b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.th.png new file mode 100644 index 00000000..fd3d1f9b Binary files /dev/null and b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.th.png differ diff --git a/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.el.png b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.el.png new file mode 100644 index 00000000..f523159b Binary files /dev/null and b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.el.png differ diff --git a/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.th.png b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.th.png new file mode 100644 index 00000000..f523159b Binary files /dev/null and b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.th.png differ diff --git a/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.el.png b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.el.png new file mode 100644 index 00000000..70a9bacf Binary files /dev/null and b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.el.png differ diff --git a/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.th.png b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.th.png new file mode 100644 index 00000000..70a9bacf Binary files /dev/null and b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.th.png differ diff --git a/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.el.png b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.el.png new file mode 100644 index 00000000..9e30ab1c Binary files /dev/null and b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.el.png differ diff --git a/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.th.png b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.th.png new file mode 100644 index 00000000..9e30ab1c Binary files /dev/null and b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.th.png differ diff --git a/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.el.png b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.el.png new file mode 100644 index 00000000..e9f61adc Binary files /dev/null and b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.el.png differ diff --git a/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.th.png b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.th.png new file mode 100644 index 00000000..e9f61adc Binary files /dev/null and b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.th.png differ diff --git a/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.el.png b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.el.png new file mode 100644 index 00000000..a54521f7 Binary files /dev/null and b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.el.png differ diff --git a/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.th.png b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.th.png new file mode 100644 index 00000000..a54521f7 Binary files /dev/null and b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.th.png differ diff --git a/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.el.png b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.el.png new file mode 100644 index 00000000..6981df8a Binary files /dev/null and b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.el.png differ diff --git a/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.th.png b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.th.png new file mode 100644 index 00000000..6981df8a Binary files /dev/null and b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.th.png differ diff --git a/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.el.png b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.el.png new file mode 100644 index 00000000..2722c065 Binary files /dev/null and b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.el.png differ diff --git a/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.th.png b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.th.png new file mode 100644 index 00000000..2722c065 Binary files /dev/null and b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.th.png differ diff --git a/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.el.jpg b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.el.jpg new file mode 100644 index 00000000..cce2a759 Binary files /dev/null and b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.el.jpg differ diff --git a/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.th.jpg b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.th.jpg new file mode 100644 index 00000000..cce2a759 Binary files /dev/null and b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.th.jpg differ diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.el.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.el.png new file mode 100644 index 00000000..26e0ae43 Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.el.png differ diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.th.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.th.png new file mode 100644 index 00000000..26e0ae43 Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.th.png differ diff --git a/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.el.png b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.el.png new file mode 100644 index 00000000..a5d549fd Binary files /dev/null and b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.el.png differ diff --git a/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.th.png b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.th.png new file mode 100644 index 00000000..a5d549fd Binary files /dev/null and b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.th.png differ diff --git a/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.el.png b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.el.png new file mode 100644 index 00000000..a251745c Binary files /dev/null and b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.el.png differ diff --git a/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.th.png b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.th.png new file mode 100644 index 00000000..a251745c Binary files /dev/null and b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.th.png differ diff --git a/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.el.png b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.el.png new file mode 100644 index 00000000..bb97d28e Binary files /dev/null and b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.el.png differ diff --git a/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.th.png b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.th.png new file mode 100644 index 00000000..bb97d28e Binary files /dev/null and b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.th.png differ diff --git a/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.el.png b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.el.png new file mode 100644 index 00000000..e34dea22 Binary files /dev/null and b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.el.png differ diff --git a/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.th.png b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.th.png new file mode 100644 index 00000000..e34dea22 Binary files /dev/null and b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.th.png differ diff --git a/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.el.png b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.el.png new file mode 100644 index 00000000..fa863501 Binary files /dev/null and b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.el.png differ diff --git a/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.th.png b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.th.png new file mode 100644 index 00000000..fa863501 Binary files /dev/null and b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.th.png differ diff --git a/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.el.png b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.el.png new file mode 100644 index 00000000..0d0e0c48 Binary files /dev/null and b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.el.png differ diff --git a/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.th.png b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.th.png new file mode 100644 index 00000000..0d0e0c48 Binary files /dev/null and b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.th.png differ diff --git a/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.el.png b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.el.png new file mode 100644 index 00000000..6f79a498 Binary files /dev/null and b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.el.png differ diff --git a/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.th.png b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.th.png new file mode 100644 index 00000000..6f79a498 Binary files /dev/null and b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.th.png differ diff --git a/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.el.png b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.el.png new file mode 100644 index 00000000..8527d4cd Binary files /dev/null and b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.el.png differ diff --git a/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.th.png b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.th.png new file mode 100644 index 00000000..8527d4cd Binary files /dev/null and b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.th.png differ diff --git a/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.el.png b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.el.png new file mode 100644 index 00000000..8597bf4d Binary files /dev/null and b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.el.png differ diff --git a/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.th.png b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.th.png new file mode 100644 index 00000000..8597bf4d Binary files /dev/null and b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.th.png differ diff --git a/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.el.png b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.el.png new file mode 100644 index 00000000..3bf24358 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.el.png differ diff --git a/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.th.png b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.th.png new file mode 100644 index 00000000..3bf24358 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.th.png differ diff --git a/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.el.png b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.el.png new file mode 100644 index 00000000..562f66d2 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.el.png differ diff --git a/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.th.png b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.th.png new file mode 100644 index 00000000..562f66d2 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.th.png differ diff --git a/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.el.png b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.el.png new file mode 100644 index 00000000..2f50d53a Binary files /dev/null and b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.el.png differ diff --git a/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.th.png b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.th.png new file mode 100644 index 00000000..2f50d53a Binary files /dev/null and b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.th.png differ diff --git a/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.el.png b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.el.png new file mode 100644 index 00000000..de7f343e Binary files /dev/null and b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.el.png differ diff --git a/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.th.png b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.th.png new file mode 100644 index 00000000..de7f343e Binary files /dev/null and b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.th.png differ diff --git a/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.el.png b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.el.png new file mode 100644 index 00000000..c8b1a544 Binary files /dev/null and b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.el.png differ diff --git a/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.th.png b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.th.png new file mode 100644 index 00000000..c8b1a544 Binary files /dev/null and b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.th.png differ diff --git a/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.el.png b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.el.png new file mode 100644 index 00000000..17d1151d Binary files /dev/null and b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.el.png differ diff --git a/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.th.png b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.th.png new file mode 100644 index 00000000..17d1151d Binary files /dev/null and b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.th.png differ diff --git a/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.el.png b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.el.png new file mode 100644 index 00000000..ffafc104 Binary files /dev/null and b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.el.png differ diff --git a/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.th.png b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.th.png new file mode 100644 index 00000000..ffafc104 Binary files /dev/null and b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.th.png differ diff --git a/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.el.png b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.el.png new file mode 100644 index 00000000..e3d86f8c Binary files /dev/null and b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.el.png differ diff --git a/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.th.png b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.th.png new file mode 100644 index 00000000..e3d86f8c Binary files /dev/null and b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.th.png differ diff --git a/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.el.png b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.el.png new file mode 100644 index 00000000..3a4445ee Binary files /dev/null and b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.el.png differ diff --git a/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.th.png b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.th.png new file mode 100644 index 00000000..3a4445ee Binary files /dev/null and b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.th.png differ diff --git a/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.el.png b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.el.png new file mode 100644 index 00000000..b2bf4d3f Binary files /dev/null and b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.el.png differ diff --git a/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.th.png b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.th.png new file mode 100644 index 00000000..b2bf4d3f Binary files /dev/null and b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.th.png differ diff --git a/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.el.png b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.el.png new file mode 100644 index 00000000..467cedcd Binary files /dev/null and b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.el.png differ diff --git a/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.th.png b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.th.png new file mode 100644 index 00000000..467cedcd Binary files /dev/null and b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.th.png differ diff --git a/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.el.png b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.el.png new file mode 100644 index 00000000..88efaa59 Binary files /dev/null and b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.el.png differ diff --git a/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.th.png b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.th.png new file mode 100644 index 00000000..88efaa59 Binary files /dev/null and b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.th.png differ diff --git a/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.el.png b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.el.png new file mode 100644 index 00000000..6197ed95 Binary files /dev/null and b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.el.png differ diff --git a/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.th.png b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.th.png new file mode 100644 index 00000000..6197ed95 Binary files /dev/null and b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.th.png differ diff --git a/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.el.png b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.el.png new file mode 100644 index 00000000..ec7768da Binary files /dev/null and b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.el.png differ diff --git a/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.th.png b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.th.png new file mode 100644 index 00000000..ec7768da Binary files /dev/null and b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.th.png differ diff --git a/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.el.png b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.el.png new file mode 100644 index 00000000..f68bf461 Binary files /dev/null and b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.el.png differ diff --git a/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.th.png b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.th.png new file mode 100644 index 00000000..f68bf461 Binary files /dev/null and b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.th.png differ diff --git a/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.el.png b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.el.png new file mode 100644 index 00000000..73e34cfe Binary files /dev/null and b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.el.png differ diff --git a/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.th.png b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.th.png new file mode 100644 index 00000000..73e34cfe Binary files /dev/null and b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.th.png differ diff --git a/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.el.png b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.el.png new file mode 100644 index 00000000..21cc6bd0 Binary files /dev/null and b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.el.png differ diff --git a/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.th.png b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.th.png new file mode 100644 index 00000000..21cc6bd0 Binary files /dev/null and b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.th.png differ diff --git a/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.el.png b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.el.png new file mode 100644 index 00000000..9c7deb23 Binary files /dev/null and b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.el.png differ diff --git a/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.th.png b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.th.png new file mode 100644 index 00000000..9c7deb23 Binary files /dev/null and b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.th.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.el.png b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.el.png new file mode 100644 index 00000000..ddc9958b Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.el.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.th.png b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.th.png new file mode 100644 index 00000000..ddc9958b Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.th.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.el.png b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.el.png new file mode 100644 index 00000000..d181210a Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.el.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.th.png b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.th.png new file mode 100644 index 00000000..d181210a Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.th.png differ diff --git a/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.el.png b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.el.png new file mode 100644 index 00000000..a00ab427 Binary files /dev/null and b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.el.png differ diff --git a/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.th.png b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.th.png new file mode 100644 index 00000000..a00ab427 Binary files /dev/null and b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.th.png differ diff --git a/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.el.png b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.el.png new file mode 100644 index 00000000..dedb38a3 Binary files /dev/null and b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.el.png differ diff --git a/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.th.png b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.th.png new file mode 100644 index 00000000..dedb38a3 Binary files /dev/null and b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.th.png differ diff --git a/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.el.png b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.el.png new file mode 100644 index 00000000..2b34487d Binary files /dev/null and b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.el.png differ diff --git a/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.th.png b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.th.png new file mode 100644 index 00000000..2b34487d Binary files /dev/null and b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.th.png differ diff --git a/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.el.png b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.el.png new file mode 100644 index 00000000..1cae68ed Binary files /dev/null and b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.el.png differ diff --git a/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.th.png b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.th.png new file mode 100644 index 00000000..1cae68ed Binary files /dev/null and b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.th.png differ diff --git a/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.el.png b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.el.png new file mode 100644 index 00000000..df961cae Binary files /dev/null and b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.el.png differ diff --git a/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.th.png b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.th.png new file mode 100644 index 00000000..df961cae Binary files /dev/null and b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.th.png differ diff --git a/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.el.png b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.el.png new file mode 100644 index 00000000..aaeaeff8 Binary files /dev/null and b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.el.png differ diff --git a/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.th.png b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.th.png new file mode 100644 index 00000000..aaeaeff8 Binary files /dev/null and b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.th.png differ diff --git a/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.el.png b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.el.png new file mode 100644 index 00000000..7613fe86 Binary files /dev/null and b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.el.png differ diff --git a/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.th.png b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.th.png new file mode 100644 index 00000000..7613fe86 Binary files /dev/null and b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.th.png differ diff --git a/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.el.png b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.el.png new file mode 100644 index 00000000..335bdf32 Binary files /dev/null and b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.el.png differ diff --git a/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.th.png b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.th.png new file mode 100644 index 00000000..335bdf32 Binary files /dev/null and b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.th.png differ diff --git a/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.el.png b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.el.png new file mode 100644 index 00000000..32c8ba10 Binary files /dev/null and b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.el.png differ diff --git a/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.th.png b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.th.png new file mode 100644 index 00000000..32c8ba10 Binary files /dev/null and b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.th.png differ diff --git a/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.el.png b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.el.png new file mode 100644 index 00000000..82802e17 Binary files /dev/null and b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.el.png differ diff --git a/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.th.png b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.th.png new file mode 100644 index 00000000..82802e17 Binary files /dev/null and b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.th.png differ diff --git a/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.el.png b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.el.png new file mode 100644 index 00000000..8214fc2c Binary files /dev/null and b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.el.png differ diff --git a/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.th.png b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.th.png new file mode 100644 index 00000000..8214fc2c Binary files /dev/null and b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.th.png differ diff --git a/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.el.png b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.el.png new file mode 100644 index 00000000..434baaad Binary files /dev/null and b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.el.png differ diff --git a/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.th.png b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.th.png new file mode 100644 index 00000000..434baaad Binary files /dev/null and b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.th.png differ diff --git a/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.el.png b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.el.png new file mode 100644 index 00000000..d32271b5 Binary files /dev/null and b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.el.png differ diff --git a/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.th.png b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.th.png new file mode 100644 index 00000000..d32271b5 Binary files /dev/null and b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.th.png differ diff --git a/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.el.png b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.el.png new file mode 100644 index 00000000..04cd7dc8 Binary files /dev/null and b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.el.png differ diff --git a/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.th.png b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.th.png new file mode 100644 index 00000000..04cd7dc8 Binary files /dev/null and b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.th.png differ diff --git a/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.el.png b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.el.png new file mode 100644 index 00000000..a8a12bce Binary files /dev/null and b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.el.png differ diff --git a/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.th.png b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.th.png new file mode 100644 index 00000000..a8a12bce Binary files /dev/null and b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.th.png differ diff --git a/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.el.jpg b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.el.jpg new file mode 100644 index 00000000..23ea98b2 Binary files /dev/null and b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.el.jpg differ diff --git a/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.th.jpg b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.th.jpg new file mode 100644 index 00000000..23ea98b2 Binary files /dev/null and b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.th.jpg differ diff --git a/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.el.jpg b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.el.jpg new file mode 100644 index 00000000..1e3581d3 Binary files /dev/null and b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.el.jpg differ diff --git a/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.th.jpg b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.th.jpg new file mode 100644 index 00000000..1e3581d3 Binary files /dev/null and b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.th.jpg differ diff --git a/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.el.jpg b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.el.jpg new file mode 100644 index 00000000..554ea37b Binary files /dev/null and b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.el.jpg differ diff --git a/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.th.jpg b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.th.jpg new file mode 100644 index 00000000..554ea37b Binary files /dev/null and b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.th.jpg differ diff --git a/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.el.jpg b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.el.jpg new file mode 100644 index 00000000..427ba4c3 Binary files /dev/null and b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.el.jpg differ diff --git a/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.th.jpg b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.th.jpg new file mode 100644 index 00000000..427ba4c3 Binary files /dev/null and b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.th.jpg differ diff --git a/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.el.jpg b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.el.jpg new file mode 100644 index 00000000..b2357285 Binary files /dev/null and b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.el.jpg differ diff --git a/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.th.jpg b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.th.jpg new file mode 100644 index 00000000..b2357285 Binary files /dev/null and b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.th.jpg differ diff --git a/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.el.jpg b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.el.jpg new file mode 100644 index 00000000..1736ebb4 Binary files /dev/null and b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.el.jpg differ diff --git a/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.th.jpg b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.th.jpg new file mode 100644 index 00000000..1736ebb4 Binary files /dev/null and b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.th.jpg differ diff --git a/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.el.jpg b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.el.jpg new file mode 100644 index 00000000..bf1d724f Binary files /dev/null and b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.el.jpg differ diff --git a/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.th.jpg b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.th.jpg new file mode 100644 index 00000000..bf1d724f Binary files /dev/null and b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.th.jpg differ diff --git a/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.el.jpg b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.el.jpg new file mode 100644 index 00000000..bb78259a Binary files /dev/null and b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.el.jpg differ diff --git a/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.th.jpg b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.th.jpg new file mode 100644 index 00000000..bb78259a Binary files /dev/null and b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.th.jpg differ diff --git a/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.el.jpg b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.el.jpg new file mode 100644 index 00000000..b311b568 Binary files /dev/null and b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.el.jpg differ diff --git a/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.th.jpg b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.th.jpg new file mode 100644 index 00000000..b311b568 Binary files /dev/null and b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.th.jpg differ diff --git a/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.el.jpg b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.el.jpg new file mode 100644 index 00000000..5bd350fd Binary files /dev/null and b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.el.jpg differ diff --git a/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.th.jpg b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.th.jpg new file mode 100644 index 00000000..5bd350fd Binary files /dev/null and b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.th.jpg differ diff --git a/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.el.jpg b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.el.jpg new file mode 100644 index 00000000..66fbe114 Binary files /dev/null and b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.el.jpg differ diff --git a/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.th.jpg b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.th.jpg new file mode 100644 index 00000000..66fbe114 Binary files /dev/null and b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.th.jpg differ diff --git a/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.el.jpg b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.el.jpg new file mode 100644 index 00000000..050e7206 Binary files /dev/null and b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.el.jpg differ diff --git a/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.th.jpg b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.th.jpg new file mode 100644 index 00000000..050e7206 Binary files /dev/null and b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.th.jpg differ diff --git a/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.el.jpg b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.el.jpg new file mode 100644 index 00000000..91c64faa Binary files /dev/null and b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.el.jpg differ diff --git a/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.th.jpg b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.th.jpg new file mode 100644 index 00000000..91c64faa Binary files /dev/null and b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.th.jpg differ diff --git a/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.el.jpg b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.el.jpg new file mode 100644 index 00000000..36e1a4b3 Binary files /dev/null and b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.el.jpg differ diff --git a/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.th.jpg b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.th.jpg new file mode 100644 index 00000000..36e1a4b3 Binary files /dev/null and b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.th.jpg differ diff --git a/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.el.jpg b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.el.jpg new file mode 100644 index 00000000..1b87df4c Binary files /dev/null and b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.el.jpg differ diff --git a/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.th.jpg b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.th.jpg new file mode 100644 index 00000000..1b87df4c Binary files /dev/null and b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.th.jpg differ diff --git a/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.el.jpg b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.el.jpg new file mode 100644 index 00000000..8df37a22 Binary files /dev/null and b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.el.jpg differ diff --git a/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.th.jpg b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.th.jpg new file mode 100644 index 00000000..8df37a22 Binary files /dev/null and b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.th.jpg differ diff --git a/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.el.jpg b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.el.jpg new file mode 100644 index 00000000..943af1b9 Binary files /dev/null and b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.el.jpg differ diff --git a/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.th.jpg b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.th.jpg new file mode 100644 index 00000000..943af1b9 Binary files /dev/null and b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.th.jpg differ diff --git a/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.el.jpg b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.el.jpg new file mode 100644 index 00000000..5a96f7fb Binary files /dev/null and b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.el.jpg differ diff --git a/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.th.jpg b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.th.jpg new file mode 100644 index 00000000..5a96f7fb Binary files /dev/null and b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.th.jpg differ diff --git a/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.el.jpg b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.el.jpg new file mode 100644 index 00000000..8f0bee50 Binary files /dev/null and b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.el.jpg differ diff --git a/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.th.jpg b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.th.jpg new file mode 100644 index 00000000..8f0bee50 Binary files /dev/null and b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.th.jpg differ diff --git a/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.el.jpg b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.el.jpg new file mode 100644 index 00000000..4ba24109 Binary files /dev/null and b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.el.jpg differ diff --git a/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.th.jpg b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.th.jpg new file mode 100644 index 00000000..4ba24109 Binary files /dev/null and b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.th.jpg differ diff --git a/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.el.jpg b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.el.jpg new file mode 100644 index 00000000..cdf0f557 Binary files /dev/null and b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.el.jpg differ diff --git a/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.th.jpg b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.th.jpg new file mode 100644 index 00000000..cdf0f557 Binary files /dev/null and b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.th.jpg differ diff --git a/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.el.jpg b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.el.jpg new file mode 100644 index 00000000..f59ee98d Binary files /dev/null and b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.el.jpg differ diff --git a/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.th.jpg b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.th.jpg new file mode 100644 index 00000000..f59ee98d Binary files /dev/null and b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.th.jpg differ diff --git a/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.el.jpg b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.el.jpg new file mode 100644 index 00000000..5bdbfd14 Binary files /dev/null and b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.el.jpg differ diff --git a/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.th.jpg b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.th.jpg new file mode 100644 index 00000000..5bdbfd14 Binary files /dev/null and b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.th.jpg differ diff --git a/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.el.jpg b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.el.jpg new file mode 100644 index 00000000..b78ab3ac Binary files /dev/null and b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.el.jpg differ diff --git a/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.th.jpg b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.th.jpg new file mode 100644 index 00000000..b78ab3ac Binary files /dev/null and b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.th.jpg differ diff --git a/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.el.png b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.el.png new file mode 100644 index 00000000..d071dffe Binary files /dev/null and b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.el.png differ diff --git a/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.th.png b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.th.png new file mode 100644 index 00000000..d071dffe Binary files /dev/null and b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.th.png differ diff --git a/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.el.png b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.el.png new file mode 100644 index 00000000..b8947f6d Binary files /dev/null and b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.el.png differ diff --git a/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.th.png b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.th.png new file mode 100644 index 00000000..b8947f6d Binary files /dev/null and b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.th.png differ diff --git a/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.el.png b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.el.png new file mode 100644 index 00000000..5c5dfb96 Binary files /dev/null and b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.el.png differ diff --git a/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.th.png b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.th.png new file mode 100644 index 00000000..5c5dfb96 Binary files /dev/null and b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.th.png differ diff --git a/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.el.png b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.el.png new file mode 100644 index 00000000..663ad7e9 Binary files /dev/null and b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.el.png differ diff --git a/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.th.png b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.th.png new file mode 100644 index 00000000..663ad7e9 Binary files /dev/null and b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.th.png differ diff --git a/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.el.png b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.el.png new file mode 100644 index 00000000..b1e33d6b Binary files /dev/null and b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.el.png differ diff --git a/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.th.png b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.th.png new file mode 100644 index 00000000..b1e33d6b Binary files /dev/null and b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.th.png differ diff --git a/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.el.png b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.el.png new file mode 100644 index 00000000..2a03ab78 Binary files /dev/null and b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.el.png differ diff --git a/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.th.png b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.th.png new file mode 100644 index 00000000..2a03ab78 Binary files /dev/null and b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.th.png differ diff --git a/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.el.png b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.el.png new file mode 100644 index 00000000..02ef1351 Binary files /dev/null and b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.el.png differ diff --git a/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.th.png b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.th.png new file mode 100644 index 00000000..02ef1351 Binary files /dev/null and b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.th.png differ diff --git a/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.el.png b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.el.png new file mode 100644 index 00000000..33faabd1 Binary files /dev/null and b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.el.png differ diff --git a/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.th.png b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.th.png new file mode 100644 index 00000000..33faabd1 Binary files /dev/null and b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.th.png differ diff --git a/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.el.png b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.el.png new file mode 100644 index 00000000..aa94da2c Binary files /dev/null and b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.el.png differ diff --git a/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.th.png b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.th.png new file mode 100644 index 00000000..aa94da2c Binary files /dev/null and b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.th.png differ diff --git a/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.el.png b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.el.png new file mode 100644 index 00000000..ac000818 Binary files /dev/null and b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.el.png differ diff --git a/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.th.png b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.th.png new file mode 100644 index 00000000..ac000818 Binary files /dev/null and b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.th.png differ diff --git a/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.el.png b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.el.png new file mode 100644 index 00000000..2fb519f5 Binary files /dev/null and b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.el.png differ diff --git a/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.th.png b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.th.png new file mode 100644 index 00000000..2fb519f5 Binary files /dev/null and b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.th.png differ diff --git a/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.el.png b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.el.png new file mode 100644 index 00000000..48459b92 Binary files /dev/null and b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.el.png differ diff --git a/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.th.png b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.th.png new file mode 100644 index 00000000..48459b92 Binary files /dev/null and b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.th.png differ diff --git a/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.el.png b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.el.png new file mode 100644 index 00000000..d502a579 Binary files /dev/null and b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.el.png differ diff --git a/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.th.png b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.th.png new file mode 100644 index 00000000..d502a579 Binary files /dev/null and b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.th.png differ diff --git a/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.el.png b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.el.png new file mode 100644 index 00000000..fca45002 Binary files /dev/null and b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.el.png differ diff --git a/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.th.png b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.th.png new file mode 100644 index 00000000..fca45002 Binary files /dev/null and b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.th.png differ diff --git a/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.el.png b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.el.png new file mode 100644 index 00000000..94aa28db Binary files /dev/null and b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.el.png differ diff --git a/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.th.png b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.th.png new file mode 100644 index 00000000..94aa28db Binary files /dev/null and b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.th.png differ diff --git a/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.el.png b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.el.png new file mode 100644 index 00000000..894df473 Binary files /dev/null and b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.el.png differ diff --git a/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.th.png b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.th.png new file mode 100644 index 00000000..894df473 Binary files /dev/null and b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.th.png differ diff --git a/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.el.png b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.el.png new file mode 100644 index 00000000..b75dfdd2 Binary files /dev/null and b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.el.png differ diff --git a/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.th.png b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.th.png new file mode 100644 index 00000000..b75dfdd2 Binary files /dev/null and b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.th.png differ diff --git a/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.el.png b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.el.png new file mode 100644 index 00000000..1e7934c3 Binary files /dev/null and b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.el.png differ diff --git a/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.th.png b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.th.png new file mode 100644 index 00000000..1e7934c3 Binary files /dev/null and b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.th.png differ diff --git a/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.el.png b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.el.png new file mode 100644 index 00000000..5bb319ec Binary files /dev/null and b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.el.png differ diff --git a/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.th.png b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.th.png new file mode 100644 index 00000000..5bb319ec Binary files /dev/null and b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.th.png differ diff --git a/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.el.png b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.el.png new file mode 100644 index 00000000..d66e224f Binary files /dev/null and b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.el.png differ diff --git a/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.th.png b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.th.png new file mode 100644 index 00000000..d66e224f Binary files /dev/null and b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.th.png differ diff --git a/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.el.png b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.el.png new file mode 100644 index 00000000..ed18e7b0 Binary files /dev/null and b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.el.png differ diff --git a/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.th.png b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.th.png new file mode 100644 index 00000000..ed18e7b0 Binary files /dev/null and b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.th.png differ diff --git a/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.el.png b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.el.png new file mode 100644 index 00000000..9acb21a7 Binary files /dev/null and b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.el.png differ diff --git a/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.th.png b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.th.png new file mode 100644 index 00000000..9acb21a7 Binary files /dev/null and b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.th.png differ diff --git a/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.el.png b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.el.png new file mode 100644 index 00000000..1ced5fc1 Binary files /dev/null and b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.el.png differ diff --git a/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.th.png b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.th.png new file mode 100644 index 00000000..1ced5fc1 Binary files /dev/null and b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.th.png differ diff --git a/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.el.png b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.el.png new file mode 100644 index 00000000..7293ced1 Binary files /dev/null and b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.el.png differ diff --git a/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.th.png b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.th.png new file mode 100644 index 00000000..7293ced1 Binary files /dev/null and b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.th.png differ diff --git a/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.el.png b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.el.png new file mode 100644 index 00000000..be837c63 Binary files /dev/null and b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.el.png differ diff --git a/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.th.png b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.th.png new file mode 100644 index 00000000..be837c63 Binary files /dev/null and b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.th.png differ diff --git a/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.el.png b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.el.png new file mode 100644 index 00000000..73861107 Binary files /dev/null and b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.el.png differ diff --git a/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.th.png b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.th.png new file mode 100644 index 00000000..73861107 Binary files /dev/null and b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.th.png differ diff --git a/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.el.png b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.el.png new file mode 100644 index 00000000..1b26d7ff Binary files /dev/null and b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.el.png differ diff --git a/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.th.png b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.th.png new file mode 100644 index 00000000..1b26d7ff Binary files /dev/null and b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.th.png differ diff --git a/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.el.png b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.el.png new file mode 100644 index 00000000..f1905ecc Binary files /dev/null and b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.el.png differ diff --git a/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.th.png b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.th.png new file mode 100644 index 00000000..f1905ecc Binary files /dev/null and b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.th.png differ diff --git a/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.el.png b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.el.png new file mode 100644 index 00000000..edc44fa9 Binary files /dev/null and b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.el.png differ diff --git a/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.th.png b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.th.png new file mode 100644 index 00000000..edc44fa9 Binary files /dev/null and b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.th.png differ diff --git a/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.el.png b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.el.png new file mode 100644 index 00000000..87854d3a Binary files /dev/null and b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.el.png differ diff --git a/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.th.png b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.th.png new file mode 100644 index 00000000..87854d3a Binary files /dev/null and b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.th.png differ diff --git a/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.el.png b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.el.png new file mode 100644 index 00000000..d1158e0d Binary files /dev/null and b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.el.png differ diff --git a/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.th.png b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.th.png new file mode 100644 index 00000000..d1158e0d Binary files /dev/null and b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.th.png differ diff --git a/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.el.png b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.el.png new file mode 100644 index 00000000..122abea4 Binary files /dev/null and b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.el.png differ diff --git a/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.th.png b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.th.png new file mode 100644 index 00000000..122abea4 Binary files /dev/null and b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.th.png differ diff --git a/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.el.png b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.el.png new file mode 100644 index 00000000..dc009aa5 Binary files /dev/null and b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.el.png differ diff --git a/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.th.png b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.th.png new file mode 100644 index 00000000..dc009aa5 Binary files /dev/null and b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.th.png differ diff --git a/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.el.png b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.el.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.el.png differ diff --git a/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.th.png b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.th.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.th.png differ diff --git a/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.el.png b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.el.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.el.png differ diff --git a/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.th.png b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.th.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.th.png differ diff --git a/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.el.png b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.el.png new file mode 100644 index 00000000..12274b8b Binary files /dev/null and b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.el.png differ diff --git a/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.th.png b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.th.png new file mode 100644 index 00000000..12274b8b Binary files /dev/null and b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.th.png differ diff --git a/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.el.png b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.el.png new file mode 100644 index 00000000..da226797 Binary files /dev/null and b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.el.png differ diff --git a/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.th.png b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.th.png new file mode 100644 index 00000000..da226797 Binary files /dev/null and b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.th.png differ diff --git a/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.el.png b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.el.png new file mode 100644 index 00000000..67bd8a82 Binary files /dev/null and b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.el.png differ diff --git a/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.th.png b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.th.png new file mode 100644 index 00000000..67bd8a82 Binary files /dev/null and b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.th.png differ diff --git a/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.el.png b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.el.png new file mode 100644 index 00000000..18938f59 Binary files /dev/null and b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.el.png differ diff --git a/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.th.png b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.th.png new file mode 100644 index 00000000..18938f59 Binary files /dev/null and b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.th.png differ diff --git a/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.el.png b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.el.png new file mode 100644 index 00000000..db480604 Binary files /dev/null and b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.el.png differ diff --git a/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.th.png b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.th.png new file mode 100644 index 00000000..db480604 Binary files /dev/null and b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.th.png differ diff --git a/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.el.png b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.el.png new file mode 100644 index 00000000..535e5798 Binary files /dev/null and b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.el.png differ diff --git a/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.th.png b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.th.png new file mode 100644 index 00000000..535e5798 Binary files /dev/null and b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.th.png differ diff --git a/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.el.png b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.el.png new file mode 100644 index 00000000..b3d83ab7 Binary files /dev/null and b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.el.png differ diff --git a/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.th.png b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.th.png new file mode 100644 index 00000000..b3d83ab7 Binary files /dev/null and b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.th.png differ diff --git a/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.el.png b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.el.png new file mode 100644 index 00000000..4bb97d60 Binary files /dev/null and b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.el.png differ diff --git a/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.th.png b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.th.png new file mode 100644 index 00000000..4bb97d60 Binary files /dev/null and b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.th.png differ diff --git a/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.el.jpg b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.el.jpg new file mode 100644 index 00000000..4cf0d73d Binary files /dev/null and b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.el.jpg differ diff --git a/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.th.jpg b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.th.jpg new file mode 100644 index 00000000..4cf0d73d Binary files /dev/null and b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.th.jpg differ diff --git a/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.el.png b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.el.png new file mode 100644 index 00000000..0aace880 Binary files /dev/null and b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.el.png differ diff --git a/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.th.png b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.th.png new file mode 100644 index 00000000..0aace880 Binary files /dev/null and b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.th.png differ diff --git a/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.el.png b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.el.png new file mode 100644 index 00000000..b19b1f6b Binary files /dev/null and b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.el.png differ diff --git a/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.th.png b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.th.png new file mode 100644 index 00000000..b19b1f6b Binary files /dev/null and b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.th.png differ diff --git a/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.el.jpg b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.el.jpg new file mode 100644 index 00000000..827670ed Binary files /dev/null and b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.el.jpg differ diff --git a/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.th.jpg b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.th.jpg new file mode 100644 index 00000000..827670ed Binary files /dev/null and b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.th.jpg differ diff --git a/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.el.png b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.el.png new file mode 100644 index 00000000..435f901a Binary files /dev/null and b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.el.png differ diff --git a/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.th.png b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.th.png new file mode 100644 index 00000000..435f901a Binary files /dev/null and b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.th.png differ diff --git a/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.el.png b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.el.png new file mode 100644 index 00000000..7308a1d1 Binary files /dev/null and b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.el.png differ diff --git a/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.th.png b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.th.png new file mode 100644 index 00000000..7308a1d1 Binary files /dev/null and b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.th.png differ diff --git a/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.el.png b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.el.png new file mode 100644 index 00000000..8454c4d2 Binary files /dev/null and b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.el.png differ diff --git a/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.th.png b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.th.png new file mode 100644 index 00000000..8454c4d2 Binary files /dev/null and b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.th.png differ diff --git a/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.el.png b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.el.png new file mode 100644 index 00000000..324b711d Binary files /dev/null and b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.el.png differ diff --git a/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.th.png b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.th.png new file mode 100644 index 00000000..324b711d Binary files /dev/null and b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.th.png differ diff --git a/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.el.png b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.el.png new file mode 100644 index 00000000..ddfb42aa Binary files /dev/null and b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.el.png differ diff --git a/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.th.png b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.th.png new file mode 100644 index 00000000..ddfb42aa Binary files /dev/null and b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.th.png differ diff --git a/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.el.png b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.el.png new file mode 100644 index 00000000..280f2fe0 Binary files /dev/null and b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.el.png differ diff --git a/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.th.png b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.th.png new file mode 100644 index 00000000..280f2fe0 Binary files /dev/null and b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.th.png differ diff --git a/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.el.jpg b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.el.jpg new file mode 100644 index 00000000..89b581ef Binary files /dev/null and b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.el.jpg differ diff --git a/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.th.jpg b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.th.jpg new file mode 100644 index 00000000..89b581ef Binary files /dev/null and b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.th.jpg differ diff --git a/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.el.jpg b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.el.jpg new file mode 100644 index 00000000..6efd2da1 Binary files /dev/null and b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.el.jpg differ diff --git a/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.th.jpg b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.th.jpg new file mode 100644 index 00000000..6efd2da1 Binary files /dev/null and b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.th.jpg differ diff --git a/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.el.png b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.el.png new file mode 100644 index 00000000..348fe7a0 Binary files /dev/null and b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.el.png differ diff --git a/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.th.png b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.th.png new file mode 100644 index 00000000..348fe7a0 Binary files /dev/null and b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.th.png differ diff --git a/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.el.png b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.el.png new file mode 100644 index 00000000..a69e73f4 Binary files /dev/null and b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.el.png differ diff --git a/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.th.png b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.th.png new file mode 100644 index 00000000..a69e73f4 Binary files /dev/null and b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.th.png differ diff --git a/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.el.png b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.el.png new file mode 100644 index 00000000..49b0ca9b Binary files /dev/null and b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.el.png differ diff --git a/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.th.png b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.th.png new file mode 100644 index 00000000..49b0ca9b Binary files /dev/null and b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.th.png differ diff --git a/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.el.png b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.el.png new file mode 100644 index 00000000..458a3c95 Binary files /dev/null and b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.el.png differ diff --git a/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.th.png b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.th.png new file mode 100644 index 00000000..458a3c95 Binary files /dev/null and b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.th.png differ diff --git a/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.el.png b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.el.png new file mode 100644 index 00000000..90b687c2 Binary files /dev/null and b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.el.png differ diff --git a/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.th.png b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.th.png new file mode 100644 index 00000000..90b687c2 Binary files /dev/null and b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.th.png differ diff --git a/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.el.png b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.el.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.el.png differ diff --git a/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.th.png b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.th.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.th.png differ diff --git a/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.el.png b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.el.png new file mode 100644 index 00000000..e7ea8ab6 Binary files /dev/null and b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.el.png differ diff --git a/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.th.png b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.th.png new file mode 100644 index 00000000..e7ea8ab6 Binary files /dev/null and b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.th.png differ diff --git a/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.el.png b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.el.png new file mode 100644 index 00000000..6f138cf9 Binary files /dev/null and b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.el.png differ diff --git a/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.th.png b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.th.png new file mode 100644 index 00000000..6f138cf9 Binary files /dev/null and b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.th.png differ diff --git a/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.el.png b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.el.png new file mode 100644 index 00000000..2f5f2861 Binary files /dev/null and b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.el.png differ diff --git a/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.th.png b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.th.png new file mode 100644 index 00000000..2f5f2861 Binary files /dev/null and b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.th.png differ diff --git a/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.el.png b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.el.png new file mode 100644 index 00000000..f2f1b63e Binary files /dev/null and b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.el.png differ diff --git a/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.th.png b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.th.png new file mode 100644 index 00000000..f2f1b63e Binary files /dev/null and b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.th.png differ diff --git a/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.el.png b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.el.png new file mode 100644 index 00000000..5643c164 Binary files /dev/null and b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.el.png differ diff --git a/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.th.png b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.th.png new file mode 100644 index 00000000..5643c164 Binary files /dev/null and b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.th.png differ diff --git a/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.el.png b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.el.png new file mode 100644 index 00000000..73fa30d1 Binary files /dev/null and b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.el.png differ diff --git a/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.th.png b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.th.png new file mode 100644 index 00000000..73fa30d1 Binary files /dev/null and b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.th.png differ diff --git a/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.el.png b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.el.png new file mode 100644 index 00000000..eee39f7d Binary files /dev/null and b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.el.png differ diff --git a/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.th.png b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.th.png new file mode 100644 index 00000000..eee39f7d Binary files /dev/null and b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.th.png differ diff --git a/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.el.png b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.el.png new file mode 100644 index 00000000..5a0fb117 Binary files /dev/null and b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.el.png differ diff --git a/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.th.png b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.th.png new file mode 100644 index 00000000..5a0fb117 Binary files /dev/null and b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.th.png differ diff --git a/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.el.png b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.el.png new file mode 100644 index 00000000..27ddbfee Binary files /dev/null and b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.el.png differ diff --git a/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.th.png b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.th.png new file mode 100644 index 00000000..27ddbfee Binary files /dev/null and b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.th.png differ diff --git a/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.el.png b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.el.png new file mode 100644 index 00000000..ee07bd10 Binary files /dev/null and b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.el.png differ diff --git a/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.th.png b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.th.png new file mode 100644 index 00000000..ee07bd10 Binary files /dev/null and b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.th.png differ diff --git a/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.el.png b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.el.png new file mode 100644 index 00000000..37a2464a Binary files /dev/null and b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.el.png differ diff --git a/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.th.png b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.th.png new file mode 100644 index 00000000..37a2464a Binary files /dev/null and b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.th.png differ diff --git a/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.el.png b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.el.png new file mode 100644 index 00000000..d852153c Binary files /dev/null and b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.el.png differ diff --git a/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.th.png b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.th.png new file mode 100644 index 00000000..d852153c Binary files /dev/null and b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.th.png differ diff --git a/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.el.png b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.el.png new file mode 100644 index 00000000..a457ac8d Binary files /dev/null and b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.el.png differ diff --git a/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.th.png b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.th.png new file mode 100644 index 00000000..a457ac8d Binary files /dev/null and b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.th.png differ diff --git a/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.el.png b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.el.png new file mode 100644 index 00000000..3eccd326 Binary files /dev/null and b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.el.png differ diff --git a/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.th.png b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.th.png new file mode 100644 index 00000000..3eccd326 Binary files /dev/null and b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.th.png differ diff --git a/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.el.png b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.el.png new file mode 100644 index 00000000..49083372 Binary files /dev/null and b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.el.png differ diff --git a/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.th.png b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.th.png new file mode 100644 index 00000000..49083372 Binary files /dev/null and b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.th.png differ diff --git a/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.el.png b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.el.png new file mode 100644 index 00000000..1b4a94e5 Binary files /dev/null and b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.el.png differ diff --git a/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.th.png b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.th.png new file mode 100644 index 00000000..1b4a94e5 Binary files /dev/null and b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.th.png differ diff --git a/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.el.png b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.el.png new file mode 100644 index 00000000..8589e88f Binary files /dev/null and b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.el.png differ diff --git a/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.th.png b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.th.png new file mode 100644 index 00000000..8589e88f Binary files /dev/null and b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.th.png differ diff --git a/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.el.png b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.el.png new file mode 100644 index 00000000..e1246f56 Binary files /dev/null and b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.el.png differ diff --git a/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.th.png b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.th.png new file mode 100644 index 00000000..e1246f56 Binary files /dev/null and b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.th.png differ diff --git a/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.el.png b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.el.png new file mode 100644 index 00000000..db66a52b Binary files /dev/null and b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.el.png differ diff --git a/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.th.png b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.th.png new file mode 100644 index 00000000..db66a52b Binary files /dev/null and b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.th.png differ diff --git a/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.el.png b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.el.png new file mode 100644 index 00000000..66c76c2f Binary files /dev/null and b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.el.png differ diff --git a/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.th.png b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.th.png new file mode 100644 index 00000000..66c76c2f Binary files /dev/null and b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.th.png differ diff --git a/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.el.png b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.el.png new file mode 100644 index 00000000..450b824c Binary files /dev/null and b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.el.png differ diff --git a/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.th.png b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.th.png new file mode 100644 index 00000000..450b824c Binary files /dev/null and b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.th.png differ diff --git a/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.el.png b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.el.png new file mode 100644 index 00000000..615bc7a9 Binary files /dev/null and b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.el.png differ diff --git a/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.th.png b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.th.png new file mode 100644 index 00000000..615bc7a9 Binary files /dev/null and b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.th.png differ diff --git a/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.el.png b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.el.png new file mode 100644 index 00000000..3c9e2930 Binary files /dev/null and b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.el.png differ diff --git a/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.th.png b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.th.png new file mode 100644 index 00000000..3c9e2930 Binary files /dev/null and b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.th.png differ diff --git a/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.el.png b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.el.png new file mode 100644 index 00000000..e4bb0186 Binary files /dev/null and b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.el.png differ diff --git a/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.th.png b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.th.png new file mode 100644 index 00000000..e4bb0186 Binary files /dev/null and b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.th.png differ diff --git a/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.el.png b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.el.png new file mode 100644 index 00000000..91e4cba6 Binary files /dev/null and b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.el.png differ diff --git a/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.th.png b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.th.png new file mode 100644 index 00000000..91e4cba6 Binary files /dev/null and b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.th.png differ diff --git a/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.el.png b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.el.png new file mode 100644 index 00000000..91230d0c Binary files /dev/null and b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.el.png differ diff --git a/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.th.png b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.th.png new file mode 100644 index 00000000..91230d0c Binary files /dev/null and b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.th.png differ diff --git a/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.el.png b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.el.png new file mode 100644 index 00000000..128cd4a9 Binary files /dev/null and b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.el.png differ diff --git a/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.th.png b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.th.png new file mode 100644 index 00000000..128cd4a9 Binary files /dev/null and b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.th.png differ diff --git a/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.el.png b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.el.png new file mode 100644 index 00000000..8d62d827 Binary files /dev/null and b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.el.png differ diff --git a/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.th.png b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.th.png new file mode 100644 index 00000000..8d62d827 Binary files /dev/null and b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.th.png differ diff --git a/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.el.png b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.el.png new file mode 100644 index 00000000..a84ab661 Binary files /dev/null and b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.el.png differ diff --git a/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.th.png b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.th.png new file mode 100644 index 00000000..a84ab661 Binary files /dev/null and b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.th.png differ diff --git a/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.el.png b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.el.png new file mode 100644 index 00000000..4c88d3d3 Binary files /dev/null and b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.el.png differ diff --git a/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.th.png b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.th.png new file mode 100644 index 00000000..4c88d3d3 Binary files /dev/null and b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.th.png differ diff --git a/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.el.png b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.el.png new file mode 100644 index 00000000..bc1895b8 Binary files /dev/null and b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.el.png differ diff --git a/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.th.png b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.th.png new file mode 100644 index 00000000..bc1895b8 Binary files /dev/null and b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.th.png differ diff --git a/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.el.png b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.el.png new file mode 100644 index 00000000..d8ff3180 Binary files /dev/null and b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.el.png differ diff --git a/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.th.png b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.th.png new file mode 100644 index 00000000..d8ff3180 Binary files /dev/null and b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.th.png differ diff --git a/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.el.png b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.el.png new file mode 100644 index 00000000..06b86a65 Binary files /dev/null and b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.el.png differ diff --git a/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.th.png b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.th.png new file mode 100644 index 00000000..06b86a65 Binary files /dev/null and b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.th.png differ diff --git a/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.el.png b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.el.png new file mode 100644 index 00000000..ac7aa47a Binary files /dev/null and b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.el.png differ diff --git a/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.th.png b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.th.png new file mode 100644 index 00000000..ac7aa47a Binary files /dev/null and b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.th.png differ diff --git a/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.el.png b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.el.png new file mode 100644 index 00000000..20480a22 Binary files /dev/null and b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.el.png differ diff --git a/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.th.png b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.th.png new file mode 100644 index 00000000..20480a22 Binary files /dev/null and b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.th.png differ diff --git a/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.el.png b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.el.png new file mode 100644 index 00000000..9d90f435 Binary files /dev/null and b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.el.png differ diff --git a/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.th.png b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.th.png new file mode 100644 index 00000000..9d90f435 Binary files /dev/null and b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.th.png differ diff --git a/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.el.png b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.el.png new file mode 100644 index 00000000..27b0ea2c Binary files /dev/null and b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.el.png differ diff --git a/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.th.png b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.th.png new file mode 100644 index 00000000..27b0ea2c Binary files /dev/null and b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.th.png differ diff --git a/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.el.png b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.el.png new file mode 100644 index 00000000..3526a6d0 Binary files /dev/null and b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.el.png differ diff --git a/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.th.png b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.th.png new file mode 100644 index 00000000..3526a6d0 Binary files /dev/null and b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.th.png differ diff --git a/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.el.png b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.el.png new file mode 100644 index 00000000..855d442e Binary files /dev/null and b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.el.png differ diff --git a/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.th.png b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.th.png new file mode 100644 index 00000000..855d442e Binary files /dev/null and b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.th.png differ diff --git a/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.el.png b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.el.png new file mode 100644 index 00000000..aed3d813 Binary files /dev/null and b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.el.png differ diff --git a/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.th.png b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.th.png new file mode 100644 index 00000000..aed3d813 Binary files /dev/null and b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.th.png differ diff --git a/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.el.png b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.el.png new file mode 100644 index 00000000..9bfca6c2 Binary files /dev/null and b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.el.png differ diff --git a/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.th.png b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.th.png new file mode 100644 index 00000000..9bfca6c2 Binary files /dev/null and b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.th.png differ diff --git a/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.el.png b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.el.png new file mode 100644 index 00000000..0490e302 Binary files /dev/null and b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.el.png differ diff --git a/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.th.png b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.th.png new file mode 100644 index 00000000..0490e302 Binary files /dev/null and b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.th.png differ diff --git a/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.el.png b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.el.png new file mode 100644 index 00000000..676e2378 Binary files /dev/null and b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.el.png differ diff --git a/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.th.png b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.th.png new file mode 100644 index 00000000..676e2378 Binary files /dev/null and b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.th.png differ diff --git a/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.el.png b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.el.png new file mode 100644 index 00000000..280e18c3 Binary files /dev/null and b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.el.png differ diff --git a/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.th.png b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.th.png new file mode 100644 index 00000000..280e18c3 Binary files /dev/null and b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.th.png differ diff --git a/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.el.png b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.el.png new file mode 100644 index 00000000..bb70a905 Binary files /dev/null and b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.el.png differ diff --git a/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.th.png b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.th.png new file mode 100644 index 00000000..bb70a905 Binary files /dev/null and b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.th.png differ diff --git a/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.el.png b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.el.png new file mode 100644 index 00000000..c0860d6e Binary files /dev/null and b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.el.png differ diff --git a/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.th.png b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.th.png new file mode 100644 index 00000000..c0860d6e Binary files /dev/null and b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.th.png differ diff --git a/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.el.png b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.el.png new file mode 100644 index 00000000..9a34d708 Binary files /dev/null and b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.el.png differ diff --git a/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.th.png b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.th.png new file mode 100644 index 00000000..9a34d708 Binary files /dev/null and b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.th.png differ diff --git a/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.el.png b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.el.png new file mode 100644 index 00000000..2c683d8b Binary files /dev/null and b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.el.png differ diff --git a/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.th.png b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.th.png new file mode 100644 index 00000000..2c683d8b Binary files /dev/null and b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.th.png differ diff --git a/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.el.png b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.el.png new file mode 100644 index 00000000..1ba4c5b0 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.el.png differ diff --git a/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.th.png b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.th.png new file mode 100644 index 00000000..1ba4c5b0 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.th.png differ diff --git a/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.el.png b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.el.png new file mode 100644 index 00000000..93aa3743 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.el.png differ diff --git a/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.th.png b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.th.png new file mode 100644 index 00000000..93aa3743 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.th.png differ diff --git a/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.el.png b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.el.png new file mode 100644 index 00000000..3089e5e1 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.el.png differ diff --git a/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.th.png b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.th.png new file mode 100644 index 00000000..3089e5e1 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.th.png differ diff --git a/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.el.png b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.el.png new file mode 100644 index 00000000..53468420 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.el.png differ diff --git a/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.th.png b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.th.png new file mode 100644 index 00000000..53468420 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.th.png differ diff --git a/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.el.png b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.el.png new file mode 100644 index 00000000..003dc174 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.el.png differ diff --git a/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.th.png b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.th.png new file mode 100644 index 00000000..003dc174 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.th.png differ diff --git a/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.el.png b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.el.png new file mode 100644 index 00000000..3c0d2f87 Binary files /dev/null and b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.el.png differ diff --git a/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.th.png b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.th.png new file mode 100644 index 00000000..3c0d2f87 Binary files /dev/null and b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.th.png differ diff --git a/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.el.png b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.el.png new file mode 100644 index 00000000..56f285f2 Binary files /dev/null and b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.el.png differ diff --git a/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.th.png b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.th.png new file mode 100644 index 00000000..56f285f2 Binary files /dev/null and b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.th.png differ diff --git a/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.el.png b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.el.png new file mode 100644 index 00000000..ec8bbe2f Binary files /dev/null and b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.el.png differ diff --git a/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.th.png b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.th.png new file mode 100644 index 00000000..ec8bbe2f Binary files /dev/null and b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.th.png differ diff --git a/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.el.png b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.el.png new file mode 100644 index 00000000..bbaae894 Binary files /dev/null and b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.el.png differ diff --git a/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.th.png b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.th.png new file mode 100644 index 00000000..bbaae894 Binary files /dev/null and b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.th.png differ diff --git a/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.el.png b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.el.png new file mode 100644 index 00000000..ef71f6da Binary files /dev/null and b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.el.png differ diff --git a/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.th.png b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.th.png new file mode 100644 index 00000000..ef71f6da Binary files /dev/null and b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.th.png differ diff --git a/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.el.png b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.el.png new file mode 100644 index 00000000..4e9390eb Binary files /dev/null and b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.el.png differ diff --git a/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.th.png b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.th.png new file mode 100644 index 00000000..4e9390eb Binary files /dev/null and b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.th.png differ diff --git a/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.el.png b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.el.png new file mode 100644 index 00000000..16d7af80 Binary files /dev/null and b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.el.png differ diff --git a/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.th.png b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.th.png new file mode 100644 index 00000000..16d7af80 Binary files /dev/null and b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.th.png differ diff --git a/translations/el/1-getting-started/README.md b/translations/el/1-getting-started/README.md new file mode 100644 index 00000000..2f63916b --- /dev/null +++ b/translations/el/1-getting-started/README.md @@ -0,0 +1,30 @@ + +# Ξεκινώντας με το IoT + +Σε αυτήν την ενότητα του προγράμματος σπουδών, θα εισαχθείτε στο Διαδίκτυο των Πραγμάτων (IoT) και θα μάθετε τις βασικές έννοιες, συμπεριλαμβανομένης της δημιουργίας του πρώτου σας έργου IoT 'Hello World' που συνδέεται με το cloud. Αυτό το έργο είναι ένα νυχτερινό φως που ανάβει καθώς τα επίπεδα φωτός που μετριούνται από έναν αισθητήρα μειώνονται. + +![Το LED συνδεδεμένο στο WIO ανάβει και σβήνει καθώς αλλάζουν τα επίπεδα φωτός](../../../images/wio-running-assignment-1-1.gif) + +## Θέματα + +1. [Εισαγωγή στο IoT](lessons/1-introduction-to-iot/README.md) +1. [Μια βαθύτερη ματιά στο IoT](lessons/2-deeper-dive/README.md) +1. [Αλληλεπίδραση με τον φυσικό κόσμο μέσω αισθητήρων και ενεργοποιητών](lessons/3-sensors-and-actuators/README.md) +1. [Συνδέστε τη συσκευή σας στο Διαδίκτυο](lessons/4-connect-internet/README.md) + +## Συντελεστές + +Όλα τα μαθήματα γράφτηκαν με ♥️ από τον [Jim Bennett](https://GitHub.com/JimBobBennett) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/1-introduction-to-iot/README.md b/translations/el/1-getting-started/lessons/1-introduction-to-iot/README.md new file mode 100644 index 00000000..02f9955a --- /dev/null +++ b/translations/el/1-getting-started/lessons/1-introduction-to-iot/README.md @@ -0,0 +1,227 @@ + +# Εισαγωγή στο IoT + +![Μια σκίτσο-σημείωση επισκόπησης αυτού του μαθήματος](../../../../../translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.el.jpg) + +> Σκίτσο-σημείωση από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +Αυτό το μάθημα διδάχθηκε ως μέρος της σειράς [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) από το [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Το μάθημα παρουσιάστηκε σε 2 βίντεο - ένα μάθημα διάρκειας 1 ώρας και μία ώρα γραφείου για βαθύτερη ανάλυση των θεμάτων και απαντήσεις σε ερωτήσεις. + +[![Μάθημα 1: Εισαγωγή στο IoT](https://img.youtube.com/vi/bVFfcYh6UBw/0.jpg)](https://youtu.be/bVFfcYh6UBw) + +[![Μάθημα 1: Εισαγωγή στο IoT - Ώρες γραφείου](https://img.youtube.com/vi/YI772q5v3yI/0.jpg)](https://youtu.be/YI772q5v3yI) + +> 🎥 Κάντε κλικ στις παραπάνω εικόνες για να παρακολουθήσετε τα βίντεο + +## Ερωτηματολόγιο πριν το μάθημα + +[Ερωτηματολόγιο πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1) + +## Εισαγωγή + +Αυτό το μάθημα καλύπτει ορισμένα εισαγωγικά θέματα γύρω από το Διαδίκτυο των Πραγμάτων (IoT) και σας καθοδηγεί στη ρύθμιση του υλικού σας. + +Σε αυτό το μάθημα θα καλύψουμε: + +* [Τι είναι το 'Διαδίκτυο των Πραγμάτων';](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Συσκευές IoT](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Ρύθμιση της συσκευής σας](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Εφαρμογές του IoT](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Παραδείγματα συσκευών IoT γύρω σας](../../../../../1-getting-started/lessons/1-introduction-to-iot) + +## Τι είναι το 'Διαδίκτυο των Πραγμάτων'; + +Ο όρος 'Διαδίκτυο των Πραγμάτων' επινοήθηκε από τον [Kevin Ashton](https://wikipedia.org/wiki/Kevin_Ashton) το 1999, για να περιγράψει τη σύνδεση του Διαδικτύου με τον φυσικό κόσμο μέσω αισθητήρων. Έκτοτε, ο όρος χρησιμοποιείται για να περιγράψει οποιαδήποτε συσκευή αλληλεπιδρά με τον φυσικό κόσμο γύρω της, είτε συλλέγοντας δεδομένα από αισθητήρες είτε παρέχοντας αλληλεπιδράσεις στον πραγματικό κόσμο μέσω ενεργοποιητών (συσκευές που κάνουν κάτι, όπως να ανάψουν έναν διακόπτη ή ένα LED), συνήθως συνδεδεμένες με άλλες συσκευές ή το Διαδίκτυο. + +> **Αισθητήρες** συλλέγουν πληροφορίες από τον κόσμο, όπως μέτρηση ταχύτητας, θερμοκρασίας ή τοποθεσίας. +> +> **Ενεργοποιητές** μετατρέπουν ηλεκτρικά σήματα σε αλληλεπιδράσεις στον πραγματικό κόσμο, όπως ενεργοποίηση ενός διακόπτη, άναμμα φώτων, παραγωγή ήχων ή αποστολή σημάτων ελέγχου σε άλλο υλικό, π.χ. για να ενεργοποιηθεί μια πρίζα. + +Το IoT ως τεχνολογικός τομέας περιλαμβάνει περισσότερα από απλές συσκευές - περιλαμβάνει υπηρεσίες που βασίζονται στο cloud για την επεξεργασία δεδομένων από αισθητήρες ή την αποστολή αιτημάτων σε ενεργοποιητές συνδεδεμένους με συσκευές IoT. Περιλαμβάνει επίσης συσκευές που δεν έχουν ή δεν χρειάζονται σύνδεση στο Διαδίκτυο, συχνά αναφερόμενες ως συσκευές άκρου. Αυτές είναι συσκευές που μπορούν να επεξεργαστούν και να ανταποκριθούν στα δεδομένα αισθητήρων μόνες τους, συνήθως χρησιμοποιώντας μοντέλα AI που έχουν εκπαιδευτεί στο cloud. + +Το IoT είναι ένας ταχέως αναπτυσσόμενος τεχνολογικός τομέας. Υπολογίζεται ότι μέχρι το τέλος του 2020, 30 δισεκατομμύρια συσκευές IoT είχαν αναπτυχθεί και συνδεθεί στο Διαδίκτυο. Στο μέλλον, εκτιμάται ότι μέχρι το 2025, οι συσκευές IoT θα συλλέγουν σχεδόν 80 zettabytes δεδομένων ή 80 τρισεκατομμύρια gigabytes. Αυτό είναι τεράστιος όγκος δεδομένων! + +![Γράφημα που δείχνει τις ενεργές συσκευές IoT με την πάροδο του χρόνου, με ανοδική τάση από λιγότερο από 5 δισεκατομμύρια το 2015 σε πάνω από 30 δισεκατομμύρια το 2025](../../../../../images/connected-iot-devices.svg) + +✅ Κάντε λίγη έρευνα: Πόσα από τα δεδομένα που παράγονται από συσκευές IoT χρησιμοποιούνται πραγματικά και πόσα αγνοούνται; Γιατί αγνοείται τόσο μεγάλος όγκος δεδομένων; + +Αυτά τα δεδομένα είναι το κλειδί για την επιτυχία του IoT. Για να γίνετε επιτυχημένος προγραμματιστής IoT, πρέπει να κατανοήσετε ποια δεδομένα χρειάζεται να συλλέξετε, πώς να τα συλλέξετε, πώς να λαμβάνετε αποφάσεις βάσει αυτών και πώς να χρησιμοποιείτε αυτές τις αποφάσεις για να αλληλεπιδράσετε με τον φυσικό κόσμο, αν χρειαστεί. + +## Συσκευές IoT + +Το **T** στο IoT αντιπροσωπεύει τα **Πράγματα** - συσκευές που αλληλεπιδρούν με τον φυσικό κόσμο γύρω τους είτε συλλέγοντας δεδομένα από αισθητήρες είτε παρέχοντας αλληλεπιδράσεις στον πραγματικό κόσμο μέσω ενεργοποιητών. + +Οι συσκευές για παραγωγή ή εμπορική χρήση, όπως οι καταναλωτικοί ιχνηλάτες φυσικής κατάστασης ή οι βιομηχανικοί ελεγκτές μηχανών, είναι συνήθως κατασκευασμένες κατά παραγγελία. Χρησιμοποιούν προσαρμοσμένες πλακέτες κυκλωμάτων, ίσως ακόμη και προσαρμοσμένους επεξεργαστές, σχεδιασμένους για να καλύπτουν τις ανάγκες μιας συγκεκριμένης εργασίας, είτε πρόκειται για το να είναι αρκετά μικρές ώστε να χωρούν σε έναν καρπό είτε αρκετά ανθεκτικές για να λειτουργούν σε περιβάλλοντα υψηλής θερμοκρασίας, πίεσης ή δονήσεων. + +Ως προγραμματιστής που μαθαίνει για το IoT ή δημιουργεί ένα πρωτότυπο συσκευής, θα χρειαστεί να ξεκινήσετε με ένα κιτ ανάπτυξης. Αυτές είναι γενικής χρήσης συσκευές IoT σχεδιασμένες για προγραμματιστές, συχνά με χαρακτηριστικά που δεν θα υπήρχαν σε μια συσκευή παραγωγής, όπως εξωτερικές ακίδες για σύνδεση αισθητήρων ή ενεργοποιητών, υλικό για υποστήριξη αποσφαλμάτωσης ή πρόσθετους πόρους που θα αύξαναν το κόστος σε μια μεγάλη παραγωγή. + +Αυτά τα κιτ ανάπτυξης συνήθως χωρίζονται σε δύο κατηγορίες - μικροελεγκτές και υπολογιστές μονού πίνακα. Αυτά θα παρουσιαστούν εδώ, και θα τα αναλύσουμε περισσότερο στο επόμενο μάθημα. + +> 💁 Το τηλέφωνό σας μπορεί επίσης να θεωρηθεί ως μια γενικής χρήσης συσκευή IoT, με ενσωματωμένους αισθητήρες και ενεργοποιητές, με διαφορετικές εφαρμογές να χρησιμοποιούν τους αισθητήρες και τους ενεργοποιητές με διαφορετικούς τρόπους και με διαφορετικές υπηρεσίες cloud. Μπορείτε ακόμη να βρείτε ορισμένα μαθήματα IoT που χρησιμοποιούν μια εφαρμογή τηλεφώνου ως συσκευή IoT. + +### Μικροελεγκτές + +Ένας μικροελεγκτής (επίσης γνωστός ως MCU, συντομογραφία του microcontroller unit) είναι ένας μικρός υπολογιστής που αποτελείται από: + +🧠 Έναν ή περισσότερους κεντρικούς επεξεργαστές (CPUs) - τον 'εγκέφαλο' του μικροελεγκτή που εκτελεί το πρόγραμμά σας + +💾 Μνήμη (RAM και μνήμη προγράμματος) - όπου αποθηκεύεται το πρόγραμμά σας, τα δεδομένα και οι μεταβλητές + +🔌 Προγραμματιζόμενες συνδέσεις εισόδου/εξόδου (I/O) - για επικοινωνία με εξωτερικές περιφερειακές συσκευές (συνδεδεμένες συσκευές) όπως αισθητήρες και ενεργοποιητές + +Οι μικροελεγκτές είναι συνήθως χαμηλού κόστους υπολογιστικές συσκευές, με μέσες τιμές για αυτές που χρησιμοποιούνται σε προσαρμοσμένο υλικό να πέφτουν γύρω στα 0,50 δολάρια ΗΠΑ, και ορισμένες συσκευές να κοστίζουν μόλις 0,03 δολάρια ΗΠΑ. Τα κιτ ανάπτυξης μπορούν να ξεκινήσουν από μόλις 4 δολάρια ΗΠΑ, με το κόστος να αυξάνεται καθώς προστίθενται περισσότερα χαρακτηριστικά. Το [Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html), ένα κιτ ανάπτυξης μικροελεγκτή από τη [Seeed studios](https://www.seeedstudio.com) που διαθέτει αισθητήρες, ενεργοποιητές, WiFi και οθόνη, κοστίζει περίπου 30 δολάρια ΗΠΑ. + +![Ένα Wio Terminal](../../../../../translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.el.png) + +> 💁 Όταν ψάχνετε στο Διαδίκτυο για μικροελεγκτές, να είστε προσεκτικοί με την αναζήτηση του όρου **MCU**, καθώς αυτό θα επιστρέψει πολλά αποτελέσματα για το Marvel Cinematic Universe, όχι για μικροελεγκτές. + +Οι μικροελεγκτές έχουν σχεδιαστεί για να προγραμματίζονται ώστε να εκτελούν έναν περιορισμένο αριθμό πολύ συγκεκριμένων εργασιών, αντί να είναι γενικής χρήσης υπολογιστές όπως οι υπολογιστές PC ή Mac. Εκτός από πολύ συγκεκριμένα σενάρια, δεν μπορείτε να συνδέσετε οθόνη, πληκτρολόγιο και ποντίκι και να τα χρησιμοποιήσετε για γενικούς σκοπούς. + +Τα κιτ ανάπτυξης μικροελεγκτών συνήθως συνοδεύονται από πρόσθετους ενσωματωμένους αισθητήρες και ενεργοποιητές. Οι περισσότερες πλακέτες θα έχουν ένα ή περισσότερα LED που μπορείτε να προγραμματίσετε, μαζί με άλλες συσκευές όπως τυπικές υποδοχές για την προσθήκη περισσότερων αισθητήρων ή ενεργοποιητών χρησιμοποιώντας διάφορα οικοσυστήματα κατασκευαστών ή ενσωματωμένους αισθητήρες (συνήθως τους πιο δημοφιλείς, όπως αισθητήρες θερμοκρασίας). Ορισμένοι μικροελεγκτές διαθέτουν ενσωματωμένη ασύρματη συνδεσιμότητα όπως Bluetooth ή WiFi ή έχουν πρόσθετους μικροελεγκτές στην πλακέτα για να προσθέσουν αυτή τη συνδεσιμότητα. + +> 💁 Οι μικροελεγκτές συνήθως προγραμματίζονται σε C/C++. + +### Υπολογιστές μονού πίνακα + +Ένας υπολογιστής μονού πίνακα είναι μια μικρή υπολογιστική συσκευή που περιέχει όλα τα στοιχεία ενός πλήρους υπολογιστή σε μια μικρή πλακέτα. Αυτές είναι συσκευές που έχουν προδιαγραφές κοντά σε έναν επιτραπέζιο ή φορητό υπολογιστή PC ή Mac, τρέχουν ένα πλήρες λειτουργικό σύστημα, αλλά είναι μικρότερες, καταναλώνουν λιγότερη ενέργεια και είναι σημαντικά φθηνότερες. + +![Ένα Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.el.jpg) + +Το Raspberry Pi είναι ένας από τους πιο δημοφιλείς υπολογιστές μονού πίνακα. + +Όπως ένας μικροελεγκτής, οι υπολογιστές μονού πίνακα διαθέτουν CPU, μνήμη και ακίδες εισόδου/εξόδου, αλλά έχουν πρόσθετα χαρακτηριστικά όπως ένα τσιπ γραφικών για σύνδεση οθονών, εξόδους ήχου και θύρες USB για σύνδεση πληκτρολογίων, ποντικιών και άλλων τυπικών USB συσκευών όπως κάμερες ή εξωτερική αποθήκευση. Τα προγράμματα αποθηκεύονται σε κάρτες SD ή σκληρούς δίσκους μαζί με το λειτουργικό σύστημα, αντί για ένα τσιπ μνήμης ενσωματωμένο στην πλακέτα. + +> 🎓 Μπορείτε να σκεφτείτε έναν υπολογιστή μονού πίνακα ως μια μικρότερη, φθηνότερη έκδοση του PC ή Mac που χρησιμοποιείτε αυτή τη στιγμή, με την προσθήκη ακίδων GPIO (γενικής χρήσης εισόδου/εξόδου) για αλληλεπίδραση με αισθητήρες και ενεργοποιητές. + +Οι υπολογιστές μονού πίνακα είναι πλήρως εξοπλισμένοι υπολογιστές, οπότε μπορούν να προγραμματιστούν σε οποιαδήποτε γλώσσα. Οι συσκευές IoT συνήθως προγραμματίζονται σε Python. + +### Επιλογές υλικού για τα υπόλοιπα μαθήματα + +Όλα τα επόμενα μαθήματα περιλαμβάνουν εργασίες που χρησιμοποιούν μια συσκευή IoT για αλληλεπίδραση με τον φυσικό κόσμο και επικοινωνία με το cloud. Κάθε μάθημα υποστηρίζει 3 επιλογές συσκευών - Arduino (χρησιμοποιώντας ένα Seeed Studios Wio Terminal) ή έναν υπολογιστή μονού πίνακα, είτε μια φυσική συσκευή (ένα Raspberry Pi 4) είτε έναν εικονικό υπολογιστή μονού πίνακα που τρέχει στον υπολογιστή σας. + +Μπορείτε να διαβάσετε για το υλικό που χρειάζεται για να ολοκληρώσετε όλες τις εργασίες στον [οδηγό υλικού](../../../hardware.md). + +> 💁 Δεν χρειάζεται να αγοράσετε κανένα υλικό IoT για να ολοκληρώσετε τις εργασίες, μπορείτε να κάνετε τα πάντα χρησιμοποιώντας έναν εικονικό υπολογιστή μονού πίνακα. + +Ποιο υλικό θα επιλέξετε εξαρτάται από το τι έχετε διαθέσιμο είτε στο σπίτι είτε στο σχολείο σας, και από τη γλώσσα προγραμματισμού που γνωρίζετε ή σκοπεύετε να μάθετε. Και οι δύο παραλλαγές υλικού θα χρησιμοποιούν το ίδιο οικοσύστημα αισθητήρων, οπότε αν ξεκινήσετε με τη μία επιλογή, μπορείτε να αλλάξετε στην άλλη χωρίς να χρειαστεί να αντικαταστήσετε το μεγαλύτερο μέρος του εξοπλισμού. Ο εικονικός υπολογιστής μονού πίνακα θα είναι ισοδύναμος με την εκμάθηση σε ένα Raspberry Pi, με τον περισσότερο κώδικα να μπορεί να μεταφερθεί στο Pi αν τελικά αποκτήσετε μια συσκευή και αισθητήρες. + +### Κιτ ανάπτυξης Arduino + +Αν σας ενδιαφέρει να μάθετε ανάπτυξη μικροελεγκτών, μπορείτε να ολοκληρώσετε τις εργασίες χρησιμοποιώντας μια συσκευή Arduino. Θα χρειαστείτε μια βασική κατανόηση του προγραμματισμού σε C/C++, καθώς τα μαθήματα θα διδάσκουν μόνο τον κώδικα που είναι σχετικός με το πλαίσιο Arduino, τους αισθητήρες και τους ενεργοποιητές που χρησιμοποιούνται, και τις βιβλιοθήκες που αλληλεπιδρούν με το cloud. + +Οι εργασίες θα χρησιμοποιούν το [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) με την επέκταση [PlatformIO για ανάπτυξη μικροελεγκτών](https://platformio.org). Μπορείτε επίσης να χρησιμοποιήσετε το Arduino IDE αν είστε εξοικειωμένοι με αυτό το εργαλείο, καθώς δεν θα παρέχονται οδηγίες. + +### Κιτ ανάπτυξης υπολογιστή μονού πίνακα + +Αν σας ενδιαφέρει να μάθετε ανάπτυξη IoT χρησιμοποιώντας υπολογιστές μονού πίνακα, μπορείτε να ολοκληρώσετε τις εργασίες χρησιμοποιώντας ένα Raspberry Pi ή μια εικονική συσκευή που τρέχει στον υπολογιστή σας. + +Θα χρειαστείτε μια βασική κατανόηση του προγραμματισμού σε Python, καθώς τα μαθήματα θα διδάσκουν μόνο τον κώδικα που είναι σχετικός με τους αισθητήρες και τους ενεργοποιητές που χρησιμοποιούνται, και τις βιβλιοθήκες που αλληλεπιδρούν με το cloud +> 💁 Αν δεν έχετε ακόμα συσκευή, ανατρέξτε στον [οδηγό υλικού](../../../hardware.md) για να σας βοηθήσει να αποφασίσετε ποια συσκευή θα χρησιμοποιήσετε και ποιο επιπλέον υλικό χρειάζεται να αγοράσετε. Δεν είναι απαραίτητο να αγοράσετε υλικό, καθώς όλα τα έργα μπορούν να εκτελεστούν σε εικονικό υλικό. +Αυτές οι οδηγίες περιλαμβάνουν συνδέσμους σε ιστότοπους τρίτων από τους δημιουργούς του υλικού ή των εργαλείων που θα χρησιμοποιήσετε. Αυτό γίνεται για να διασφαλιστεί ότι χρησιμοποιείτε πάντα τις πιο ενημερωμένες οδηγίες για τα διάφορα εργαλεία και υλικά. + +Ακολουθήστε τον αντίστοιχο οδηγό για να ρυθμίσετε τη συσκευή σας και να ολοκληρώσετε ένα έργο 'Hello World'. Αυτό θα είναι το πρώτο βήμα για τη δημιουργία ενός IoT φωτιστικού νύχτας κατά τη διάρκεια των 4 μαθημάτων σε αυτό το εισαγωγικό μέρος. + +* [Arduino - Wio Terminal](wio-terminal.md) +* [Μονοπλακέτα υπολογιστής - Raspberry Pi](pi.md) +* [Μονοπλακέτα υπολογιστής - Εικονική συσκευή](virtual-device.md) + +✅ Θα χρησιμοποιήσετε το VS Code τόσο για το Arduino όσο και για τους μονοπλακέτα υπολογιστές. Αν δεν το έχετε χρησιμοποιήσει πριν, διαβάστε περισσότερα γι' αυτό στον [ιστότοπο του VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn). + +## Εφαρμογές του IoT + +Το IoT καλύπτει ένα τεράστιο φάσμα χρήσεων, σε μερικές ευρείες κατηγορίες: + +* Καταναλωτικό IoT +* Εμπορικό IoT +* Βιομηχανικό IoT +* IoT Υποδομών + +✅ Κάντε λίγη έρευνα: Για κάθε μία από τις παρακάτω περιοχές, βρείτε ένα συγκεκριμένο παράδειγμα που δεν αναφέρεται στο κείμενο. + +### Καταναλωτικό IoT + +Το καταναλωτικό IoT αναφέρεται σε IoT συσκευές που οι καταναλωτές αγοράζουν και χρησιμοποιούν στο σπίτι. Ορισμένες από αυτές τις συσκευές είναι εξαιρετικά χρήσιμες, όπως έξυπνα ηχεία, έξυπνα συστήματα θέρμανσης και ρομποτικές σκούπες. Άλλες είναι αμφίβολης χρησιμότητας, όπως βρύσες που ελέγχονται με φωνή και δεν μπορείτε να τις κλείσετε επειδή ο φωνητικός έλεγχος δεν σας ακούει πάνω από τον ήχο του τρεχούμενου νερού. + +Οι καταναλωτικές IoT συσκευές δίνουν τη δυνατότητα στους ανθρώπους να πετυχαίνουν περισσότερα στο περιβάλλον τους, ειδικά στο 1 δισεκατομμύριο ανθρώπων που έχουν κάποια αναπηρία. Οι ρομποτικές σκούπες μπορούν να προσφέρουν καθαρά πατώματα σε άτομα με κινητικά προβλήματα που δεν μπορούν να σκουπίσουν μόνα τους, οι φούρνοι που ελέγχονται με φωνή επιτρέπουν σε άτομα με περιορισμένη όραση ή κινητικό έλεγχο να ζεστάνουν τους φούρνους τους μόνο με τη φωνή τους, ενώ οι συσκευές παρακολούθησης υγείας επιτρέπουν στους ασθενείς να παρακολουθούν χρόνιες παθήσεις με πιο τακτικές και λεπτομερείς ενημερώσεις για την κατάστασή τους. Αυτές οι συσκευές γίνονται τόσο διαδεδομένες που ακόμη και μικρά παιδιά τις χρησιμοποιούν στην καθημερινότητά τους, για παράδειγμα, μαθητές που κάνουν εικονική εκπαίδευση κατά τη διάρκεια της πανδημίας COVID, ρυθμίζοντας χρονοδιακόπτες σε έξυπνες οικιακές συσκευές για να παρακολουθούν τη σχολική τους εργασία ή ξυπνητήρια για να τους υπενθυμίζουν τις επερχόμενες συναντήσεις της τάξης. + +✅ Ποιες καταναλωτικές IoT συσκευές έχετε πάνω σας ή στο σπίτι σας; + +### Εμπορικό IoT + +Το εμπορικό IoT καλύπτει τη χρήση του IoT στον χώρο εργασίας. Σε ένα γραφείο, μπορεί να υπάρχουν αισθητήρες πληρότητας και ανιχνευτές κίνησης για τη διαχείριση του φωτισμού και της θέρμανσης, ώστε να λειτουργούν μόνο όταν χρειάζεται, μειώνοντας το κόστος και τις εκπομπές άνθρακα. Σε ένα εργοστάσιο, οι IoT συσκευές μπορούν να παρακολουθούν κινδύνους ασφαλείας, όπως εργαζόμενους που δεν φορούν κράνη ή θόρυβο που έχει φτάσει σε επικίνδυνα επίπεδα. Στο λιανικό εμπόριο, οι IoT συσκευές μπορούν να μετρούν τη θερμοκρασία των ψυκτικών αποθηκευτικών χώρων, ειδοποιώντας τον ιδιοκτήτη του καταστήματος αν ένα ψυγείο ή καταψύκτης είναι εκτός της απαιτούμενης θερμοκρασίας, ή μπορούν να παρακολουθούν αντικείμενα στα ράφια για να καθοδηγούν τους υπαλλήλους να αναπληρώσουν προϊόντα που έχουν πωληθεί. Η βιομηχανία μεταφορών βασίζεται όλο και περισσότερο στο IoT για την παρακολούθηση της θέσης των οχημάτων, την καταγραφή των χιλιομέτρων στον δρόμο για χρέωση χρήσης δρόμων, την παρακολούθηση των ωρών και της συμμόρφωσης με τα διαλείμματα των οδηγών ή την ειδοποίηση του προσωπικού όταν ένα όχημα πλησιάζει σε ένα σταθμό για να προετοιμαστεί για φόρτωση ή εκφόρτωση. + +✅ Ποιες εμπορικές IoT συσκευές έχετε στο σχολείο ή στον χώρο εργασίας σας; + +### Βιομηχανικό IoT (IIoT) + +Το βιομηχανικό IoT, ή IIoT, είναι η χρήση IoT συσκευών για τον έλεγχο και τη διαχείριση μηχανημάτων σε μεγάλη κλίμακα. Αυτό καλύπτει ένα ευρύ φάσμα χρήσεων, από εργοστάσια έως ψηφιακή γεωργία. + +Τα εργοστάσια χρησιμοποιούν IoT συσκευές με πολλούς διαφορετικούς τρόπους. Τα μηχανήματα μπορούν να παρακολουθούνται με πολλαπλούς αισθητήρες για την καταγραφή παραμέτρων όπως η θερμοκρασία, οι δονήσεις και η ταχύτητα περιστροφής. Αυτά τα δεδομένα μπορούν να παρακολουθούνται ώστε να σταματήσει το μηχάνημα αν βγει εκτός ορισμένων ορίων - για παράδειγμα, αν υπερθερμανθεί και χρειαστεί να απενεργοποιηθεί. Αυτά τα δεδομένα μπορούν επίσης να συλλέγονται και να αναλύονται με την πάροδο του χρόνου για την πρόβλεψη συντήρησης, όπου μοντέλα AI θα εξετάζουν τα δεδομένα που οδηγούν σε μια βλάβη και θα τα χρησιμοποιούν για να προβλέψουν άλλες βλάβες πριν συμβούν. + +Η ψηφιακή γεωργία είναι σημαντική αν ο πλανήτης θέλει να θρέψει τον αυξανόμενο πληθυσμό, ειδικά για τα 2 δισεκατομμύρια ανθρώπους σε 500 εκατομμύρια νοικοκυριά που επιβιώνουν από [γεωργία επιβίωσης](https://wikipedia.org/wiki/Subsistence_agriculture). Η ψηφιακή γεωργία μπορεί να κυμαίνεται από αισθητήρες λίγων δολαρίων έως τεράστιες εμπορικές εγκαταστάσεις. Ένας αγρότης μπορεί να ξεκινήσει παρακολουθώντας τις θερμοκρασίες και χρησιμοποιώντας [ημέρες βαθμού ανάπτυξης](https://wikipedia.org/wiki/Growing_degree-day) για να προβλέψει πότε μια καλλιέργεια θα είναι έτοιμη για συγκομιδή. Μπορούν να συνδέσουν την παρακολούθηση της υγρασίας του εδάφους με αυτοματοποιημένα συστήματα ποτίσματος για να δώσουν στα φυτά τους όσο νερό χρειάζονται, αλλά όχι περισσότερο, ώστε να διασφαλίσουν ότι οι καλλιέργειες τους δεν θα στεγνώσουν χωρίς να σπαταλήσουν νερό. Οι αγρότες προχωρούν ακόμη περισσότερο χρησιμοποιώντας drones, δεδομένα από δορυφόρους και AI για την παρακολούθηση της ανάπτυξης των καλλιεργειών, των ασθενειών και της ποιότητας του εδάφους σε τεράστιες εκτάσεις γεωργικής γης. + +✅ Ποιες άλλες IoT συσκευές θα μπορούσαν να βοηθήσουν τους αγρότες; + +### IoT Υποδομών + +Το IoT Υποδομών παρακολουθεί και ελέγχει τις τοπικές και παγκόσμιες υποδομές που χρησιμοποιούν οι άνθρωποι καθημερινά. + +[Έξυπνες πόλεις](https://wikipedia.org/wiki/Smart_city) είναι αστικές περιοχές που χρησιμοποιούν IoT συσκευές για τη συλλογή δεδομένων σχετικά με την πόλη και τη χρήση αυτών για τη βελτίωση της λειτουργίας της πόλης. Αυτές οι πόλεις συνήθως λειτουργούν με συνεργασίες μεταξύ τοπικών κυβερνήσεων, ακαδημαϊκών ιδρυμάτων και τοπικών επιχειρήσεων, παρακολουθώντας και διαχειριζόμενες πράγματα που ποικίλλουν από τις μεταφορές έως τη στάθμευση και τη ρύπανση. Για παράδειγμα, στην Κοπεγχάγη της Δανίας, η ατμοσφαιρική ρύπανση είναι σημαντική για τους τοπικούς κατοίκους, οπότε μετριέται και τα δεδομένα χρησιμοποιούνται για την παροχή πληροφοριών σχετικά με τις καθαρότερες διαδρομές για ποδηλασία και τζόκινγκ. + +[Έξυπνα δίκτυα ηλεκτρικής ενέργειας](https://wikipedia.org/wiki/Smart_grid) επιτρέπουν καλύτερη ανάλυση της ζήτησης ενέργειας συλλέγοντας δεδομένα χρήσης σε επίπεδο μεμονωμένων κατοικιών. Αυτά τα δεδομένα μπορούν να καθοδηγήσουν αποφάσεις σε εθνικό επίπεδο, όπως πού να κατασκευαστούν νέοι σταθμοί παραγωγής ενέργειας, και σε προσωπικό επίπεδο, παρέχοντας στους χρήστες πληροφορίες για το πόση ενέργεια χρησιμοποιούν, πότε τη χρησιμοποιούν και ακόμη και προτάσεις για τη μείωση του κόστους, όπως η φόρτιση ηλεκτρικών αυτοκινήτων τη νύχτα. + +✅ Αν μπορούσατε να προσθέσετε IoT συσκευές για να μετρήσετε κάτι όπου ζείτε, τι θα ήταν; + +## Παραδείγματα IoT συσκευών που μπορεί να έχετε γύρω σας + +Θα εκπλαγείτε από το πόσες IoT συσκευές έχετε γύρω σας. Γράφω αυτό από το σπίτι και έχω τις εξής συσκευές συνδεδεμένες στο Διαδίκτυο με έξυπνες λειτουργίες όπως έλεγχος μέσω εφαρμογής, φωνητικός έλεγχος ή η δυνατότητα να μου στέλνουν δεδομένα μέσω του τηλεφώνου μου: + +* Πολλαπλά έξυπνα ηχεία +* Ψυγείο, πλυντήριο πιάτων, φούρνος και φούρνος μικροκυμάτων +* Μετρητής ηλεκτρικής ενέργειας για ηλιακούς συλλέκτες +* Έξυπνες πρίζες +* Κουδούνι με κάμερα και κάμερες ασφαλείας +* Έξυπνος θερμοστάτης με πολλαπλούς έξυπνους αισθητήρες δωματίου +* Ανοιχτήρι γκαραζόπορτας +* Συστήματα ψυχαγωγίας στο σπίτι και τηλεοράσεις με φωνητικό έλεγχο +* Φώτα +* Συσκευές παρακολούθησης φυσικής κατάστασης και υγείας + +Όλοι αυτοί οι τύποι συσκευών έχουν αισθητήρες και/ή ενεργοποιητές και επικοινωνούν με το Διαδίκτυο. Μπορώ να δω από το τηλέφωνό μου αν η γκαραζόπορτα μου είναι ανοιχτή και να ζητήσω από το έξυπνο ηχείο μου να την κλείσει για μένα. Μπορώ ακόμη και να την ρυθμίσω σε χρονοδιακόπτη ώστε αν είναι ακόμα ανοιχτή τη νύχτα, να κλείσει αυτόματα. Όταν χτυπάει το κουδούνι μου, μπορώ να δω από το τηλέφωνό μου ποιος είναι εκεί όπου κι αν βρίσκομαι στον κόσμο και να μιλήσω μαζί του μέσω ενός ηχείου και μικροφώνου ενσωματωμένου στο κουδούνι. Μπορώ να παρακολουθώ τη γλυκόζη στο αίμα μου, τον καρδιακό ρυθμό και τα μοτίβα ύπνου, αναζητώντας μοτίβα στα δεδομένα για να βελτιώσω την υγεία μου. Μπορώ να ελέγχω τα φώτα μου μέσω του cloud και να κάθομαι στο σκοτάδι όταν η σύνδεση στο Διαδίκτυο πέφτει. + +--- + +## 🚀 Πρόκληση + +Καταγράψτε όσες IoT συσκευές μπορείτε που βρίσκονται στο σπίτι, το σχολείο ή τον χώρο εργασίας σας - μπορεί να είναι περισσότερες από όσες νομίζετε! + +## Κουίζ μετά το μάθημα + +[Κουίζ μετά το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/2) + +## Ανασκόπηση & Αυτομελέτη + +Διαβάστε για τα οφέλη και τις αποτυχίες των καταναλωτικών IoT έργων. Ελέγξτε ειδησεογραφικούς ιστότοπους για άρθρα σχετικά με περιπτώσεις που έχουν αποτύχει, όπως θέματα ιδιωτικότητας, προβλήματα υλικού ή προβλήματα που προκαλούνται από έλλειψη συνδεσιμότητας. + +Μερικά παραδείγματα: + +* Δείτε τον λογαριασμό Twitter **[Internet of Sh*t](https://twitter.com/internetofshit)** *(προειδοποίηση για βωμολοχίες)* για μερικά καλά παραδείγματα αποτυχιών με καταναλωτικό IoT. +* [c|net - Το Apple Watch μου έσωσε τη ζωή μου: 5 άνθρωποι μοιράζονται τις ιστορίες τους](https://www.cnet.com/news/apple-watch-lifesaving-health-features-read-5-peoples-stories/) +* [c|net - Τεχνικός της ADT παραδέχεται ενοχή για παρακολούθηση των ροών κάμερας πελατών για χρόνια](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on-customer-camera-feeds-for-years/) *(προειδοποίηση για μη συναινετική παρακολούθηση)* + +## Εργασία + +[Ερευνήστε ένα IoT έργο](assignment.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/1-introduction-to-iot/assignment.md b/translations/el/1-getting-started/lessons/1-introduction-to-iot/assignment.md new file mode 100644 index 00000000..1b177cee --- /dev/null +++ b/translations/el/1-getting-started/lessons/1-introduction-to-iot/assignment.md @@ -0,0 +1,27 @@ + +# Εξερεύνηση ενός έργου IoT + +## Οδηγίες + +Υπάρχουν πολλά μεγάλα και μικρά έργα IoT που υλοποιούνται παγκοσμίως, από έξυπνες φάρμες έως έξυπνες πόλεις, στην παρακολούθηση της υγείας, στις μεταφορές και στη χρήση δημόσιων χώρων. + +Αναζητήστε στο διαδίκτυο λεπτομέρειες για ένα έργο που σας ενδιαφέρει, ιδανικά ένα κοντά στην περιοχή που ζείτε. Εξηγήστε τα πλεονεκτήματα και τα μειονεκτήματα του έργου, όπως ποια οφέλη προκύπτουν από αυτό, τυχόν προβλήματα που προκαλεί και πώς λαμβάνεται υπόψη η ιδιωτικότητα. + +## Κριτήρια αξιολόγησης + +| Κριτήρια | Εξαιρετικό | Επαρκές | Χρειάζεται βελτίωση | +| -------- | ---------- | -------- | ------------------- | +| Εξήγηση πλεονεκτημάτων και μειονεκτημάτων | Παρείχε σαφή εξήγηση των πλεονεκτημάτων και μειονεκτημάτων του έργου | Παρείχε σύντομη εξήγηση των πλεονεκτημάτων και μειονεκτημάτων | Δεν εξήγησε τα πλεονεκτήματα ή τα μειονεκτήματα | + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/1-introduction-to-iot/pi.md b/translations/el/1-getting-started/lessons/1-introduction-to-iot/pi.md new file mode 100644 index 00000000..35e158a9 --- /dev/null +++ b/translations/el/1-getting-started/lessons/1-introduction-to-iot/pi.md @@ -0,0 +1,258 @@ + +# Raspberry Pi + +Το [Raspberry Pi](https://raspberrypi.org) είναι ένας υπολογιστής σε μία μόνο πλακέτα. Μπορείτε να προσθέσετε αισθητήρες και ενεργοποιητές χρησιμοποιώντας μια μεγάλη ποικιλία συσκευών και οικοσυστημάτων, και για αυτά τα μαθήματα θα χρησιμοποιήσετε ένα οικοσύστημα υλικού που ονομάζεται [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html). Θα προγραμματίσετε το Pi σας και θα έχετε πρόσβαση στους αισθητήρες Grove χρησιμοποιώντας Python. + +![Ένα Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.el.jpg) + +## Ρύθμιση + +Αν χρησιμοποιείτε ένα Raspberry Pi ως υλικό IoT, έχετε δύο επιλογές - μπορείτε να δουλέψετε μέσα από όλα αυτά τα μαθήματα και να προγραμματίσετε απευθείας στο Pi, ή μπορείτε να συνδεθείτε απομακρυσμένα σε ένα 'headless' Pi και να προγραμματίσετε από τον υπολογιστή σας. + +Πριν ξεκινήσετε, πρέπει επίσης να συνδέσετε το Grove Base Hat στο Pi σας. + +### Εργασία - Ρύθμιση + +Εγκαταστήστε το Grove Base Hat στο Pi σας και διαμορφώστε το Pi. + +1. Συνδέστε το Grove Base Hat στο Pi σας. Η υποδοχή στο Hat εφαρμόζει πάνω σε όλα τα GPIO pins του Pi, γλιστρώντας μέχρι κάτω για να καθίσει σταθερά στη βάση. Καλύπτει το Pi. + + ![Τοποθέτηση του Grove Hat](../../../../../images/pi-grove-hat-fitting.gif) + +1. Αποφασίστε πώς θέλετε να προγραμματίσετε το Pi σας και πηγαίνετε στην αντίστοιχη ενότητα παρακάτω: + + * [Εργασία απευθείας στο Pi σας](../../../../../1-getting-started/lessons/1-introduction-to-iot) + * [Απομακρυσμένη πρόσβαση για προγραμματισμό του Pi](../../../../../1-getting-started/lessons/1-introduction-to-iot) + +### Εργασία απευθείας στο Pi σας + +Αν θέλετε να δουλέψετε απευθείας στο Pi σας, μπορείτε να χρησιμοποιήσετε την έκδοση desktop του Raspberry Pi OS και να εγκαταστήσετε όλα τα εργαλεία που χρειάζεστε. + +#### Εργασία - Εργασία απευθείας στο Pi σας + +Ρυθμίστε το Pi σας για ανάπτυξη. + +1. Ακολουθήστε τις οδηγίες στον [οδηγό ρύθμισης Raspberry Pi](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up) για να ρυθμίσετε το Pi σας, να το συνδέσετε σε πληκτρολόγιο/ποντίκι/οθόνη, να το συνδέσετε στο δίκτυο WiFi ή ethernet και να ενημερώσετε το λογισμικό. + +Για να προγραμματίσετε το Pi χρησιμοποιώντας τους αισθητήρες και ενεργοποιητές Grove, θα χρειαστεί να εγκαταστήσετε έναν επεξεργαστή κώδικα για να γράψετε τον κώδικα της συσκευής, καθώς και διάφορες βιβλιοθήκες και εργαλεία που αλληλεπιδρούν με το υλικό Grove. + +1. Μόλις το Pi σας επανεκκινήσει, ανοίξτε το Terminal κάνοντας κλικ στο εικονίδιο **Terminal** στη γραμμή μενού στην κορυφή ή επιλέξτε *Menu -> Accessories -> Terminal* + +1. Εκτελέστε την παρακάτω εντολή για να βεβαιωθείτε ότι το λειτουργικό σύστημα και το εγκατεστημένο λογισμικό είναι ενημερωμένα: + + ```sh + sudo apt update && sudo apt full-upgrade --yes + ``` + +1. Εκτελέστε τις παρακάτω εντολές για να εγκαταστήσετε όλες τις απαραίτητες βιβλιοθήκες για το υλικό 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 + ``` + + Αυτό ξεκινά με την εγκατάσταση του Git, μαζί με το Pip για την εγκατάσταση πακέτων Python. + + Ένα από τα ισχυρά χαρακτηριστικά της Python είναι η δυνατότητα εγκατάστασης [πακέτων Pip](https://pypi.org) - αυτά είναι πακέτα κώδικα γραμμένα από άλλους και δημοσιευμένα στο Διαδίκτυο. Μπορείτε να εγκαταστήσετε ένα πακέτο Pip στον υπολογιστή σας με μία εντολή και στη συνέχεια να χρησιμοποιήσετε αυτό το πακέτο στον κώδικά σας. + + Τα πακέτα Python του Seeed Grove πρέπει να εγκατασταθούν από τον πηγαίο κώδικα. Αυτές οι εντολές θα κλωνοποιήσουν το αποθετήριο που περιέχει τον πηγαίο κώδικα για αυτό το πακέτο και στη συνέχεια θα το εγκαταστήσουν τοπικά. + + > 💁 Από προεπιλογή, όταν εγκαθιστάτε ένα πακέτο, είναι διαθέσιμο παντού στον υπολογιστή σας, και αυτό μπορεί να οδηγήσει σε προβλήματα με τις εκδόσεις των πακέτων - όπως μια εφαρμογή που εξαρτάται από μια έκδοση ενός πακέτου που δεν λειτουργεί όταν εγκαθιστάτε μια νέα έκδοση για μια διαφορετική εφαρμογή. Για να αντιμετωπίσετε αυτό το πρόβλημα, μπορείτε να χρησιμοποιήσετε ένα [εικονικό περιβάλλον Python](https://docs.python.org/3/library/venv.html), ουσιαστικά ένα αντίγραφο της Python σε έναν ειδικό φάκελο, και όταν εγκαθιστάτε πακέτα Pip, αυτά εγκαθίστανται μόνο σε αυτόν τον φάκελο. Δεν θα χρησιμοποιείτε εικονικά περιβάλλοντα όταν χρησιμοποιείτε το Pi σας. Το σενάριο εγκατάστασης του Grove εγκαθιστά τα πακέτα Python του Grove παγκοσμίως, οπότε για να χρησιμοποιήσετε ένα εικονικό περιβάλλον θα πρέπει να ρυθμίσετε ένα εικονικό περιβάλλον και στη συνέχεια να επανεγκαταστήσετε χειροκίνητα τα πακέτα Grove μέσα σε αυτό το περιβάλλον. Είναι πιο εύκολο να χρησιμοποιείτε παγκόσμια πακέτα, ειδικά καθώς πολλοί προγραμματιστές Pi θα επαναφέρουν μια καθαρή κάρτα SD για κάθε έργο. + + Τέλος, αυτό ενεργοποιεί τη διεπαφή I2C. + +1. Επανεκκινήστε το Pi είτε χρησιμοποιώντας το μενού είτε εκτελώντας την παρακάτω εντολή στο Terminal: + + ```sh + sudo reboot + ``` + +1. Μόλις το Pi επανεκκινήσει, ανοίξτε ξανά το Terminal και εκτελέστε την παρακάτω εντολή για να εγκαταστήσετε το [Visual Studio Code (VS Code)](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) - αυτός είναι ο επεξεργαστής που θα χρησιμοποιήσετε για να γράψετε τον κώδικα της συσκευής σας σε Python. + + ```sh + sudo apt install code + ``` + + Μόλις εγκατασταθεί, το VS Code θα είναι διαθέσιμο από το επάνω μενού. + + > 💁 Είστε ελεύθεροι να χρησιμοποιήσετε οποιοδήποτε IDE ή επεξεργαστή Python για αυτά τα μαθήματα αν έχετε κάποιο προτιμώμενο εργαλείο, αλλά τα μαθήματα θα δώσουν οδηγίες βασισμένες στη χρήση του VS Code. + +1. Εγκαταστήστε το Pylance. Αυτό είναι μια επέκταση για το VS Code που παρέχει υποστήριξη γλώσσας Python. Ανατρέξτε στην [τεκμηρίωση της επέκτασης Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) για οδηγίες σχετικά με την εγκατάσταση αυτής της επέκτασης στο VS Code. + +### Απομακρυσμένη πρόσβαση για προγραμματισμό του Pi + +Αντί να προγραμματίζετε απευθείας στο Pi, μπορεί να λειτουργεί 'headless', δηλαδή χωρίς να είναι συνδεδεμένο σε πληκτρολόγιο/ποντίκι/οθόνη, και να το διαμορφώσετε και να το προγραμματίσετε από τον υπολογιστή σας, χρησιμοποιώντας το Visual Studio Code. + +#### Ρύθμιση του Pi OS + +Για να προγραμματίσετε απομακρυσμένα, το Pi OS πρέπει να εγκατασταθεί σε μια κάρτα SD. + +##### Εργασία - Ρύθμιση του Pi OS + +Ρυθμίστε το headless Pi OS. + +1. Κατεβάστε το **Raspberry Pi Imager** από τη [σελίδα λογισμικού Raspberry Pi OS](https://www.raspberrypi.org/software/) και εγκαταστήστε το. + +1. Εισάγετε μια κάρτα SD στον υπολογιστή σας, χρησιμοποιώντας έναν προσαρμογέα αν χρειάζεται. + +1. Εκκινήστε το Raspberry Pi Imager. + +1. Από το Raspberry Pi Imager, επιλέξτε το κουμπί **CHOOSE OS**, στη συνέχεια επιλέξτε *Raspberry Pi OS (Other)*, ακολουθούμενο από *Raspberry Pi OS Lite (32-bit)*. + + ![Το Raspberry Pi Imager με επιλεγμένο το Raspberry Pi OS Lite](../../../../../translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.el.png) + + > 💁 Το Raspberry Pi OS Lite είναι μια έκδοση του Raspberry Pi OS που δεν έχει το desktop UI ή εργαλεία βασισμένα σε UI. Αυτά δεν χρειάζονται για ένα headless Pi και κάνουν την εγκατάσταση μικρότερη και τον χρόνο εκκίνησης πιο γρήγορο. + +1. Επιλέξτε το κουμπί **CHOOSE STORAGE**, στη συνέχεια επιλέξτε την κάρτα SD σας. + +1. Εκκινήστε τις **Advanced Options** πατώντας `Ctrl+Shift+X`. Αυτές οι επιλογές επιτρέπουν κάποια προ-διαμόρφωση του Raspberry Pi OS πριν εγγραφεί στην κάρτα SD. + + 1. Ελέγξτε το πλαίσιο **Enable SSH** και ορίστε έναν κωδικό πρόσβασης για τον χρήστη `pi`. Αυτός είναι ο κωδικός πρόσβασης που θα χρησιμοποιήσετε για να συνδεθείτε στο Pi αργότερα. + + 1. Αν σκοπεύετε να συνδεθείτε στο Pi μέσω WiFi, ελέγξτε το πλαίσιο **Configure WiFi** και εισάγετε το SSID και τον κωδικό πρόσβασης του WiFi σας, καθώς και επιλέξτε τη χώρα του WiFi σας. Δεν χρειάζεται να το κάνετε αυτό αν θα χρησιμοποιήσετε καλώδιο ethernet. Βεβαιωθείτε ότι το δίκτυο στο οποίο συνδέεστε είναι το ίδιο με αυτό του υπολογιστή σας. + + 1. Ελέγξτε το πλαίσιο **Set locale settings** και ορίστε τη χώρα και τη ζώνη ώρας σας. + + 1. Επιλέξτε το κουμπί **SAVE**. + +1. Επιλέξτε το κουμπί **WRITE** για να εγγράψετε το OS στην κάρτα SD. Αν χρησιμοποιείτε macOS, θα σας ζητηθεί να εισάγετε τον κωδικό πρόσβασής σας καθώς το υποκείμενο εργαλείο που εγγράφει εικόνες δίσκου χρειάζεται προνομιακή πρόσβαση. + +Το OS θα εγγραφεί στην κάρτα SD και μόλις ολοκληρωθεί η κάρτα θα εξαιρεθεί από το λειτουργικό σύστημα και θα ειδοποιηθείτε. Αφαιρέστε την κάρτα SD από τον υπολογιστή σας, εισάγετέ την στο Pi, ενεργοποιήστε το Pi και περιμένετε περίπου 2 λεπτά για να εκκινήσει σωστά. + +#### Σύνδεση στο Pi + +Το επόμενο βήμα είναι να αποκτήσετε απομακρυσμένη πρόσβαση στο Pi. Μπορείτε να το κάνετε αυτό χρησιμοποιώντας `ssh`, το οποίο είναι διαθέσιμο σε macOS, Linux και πρόσφατες εκδόσεις των Windows. + +##### Εργασία - Σύνδεση στο Pi + +Αποκτήστε απομακρυσμένη πρόσβαση στο Pi. + +1. Εκκινήστε ένα Terminal ή Command Prompt και εισάγετε την παρακάτω εντολή για να συνδεθείτε στο Pi: + + ```sh + ssh pi@raspberrypi.local + ``` + + Αν χρησιμοποιείτε Windows σε παλαιότερη έκδοση που δεν έχει εγκατεστημένο το `ssh`, μπορείτε να χρησιμοποιήσετε το OpenSSH. Μπορείτε να βρείτε τις οδηγίες εγκατάστασης στην [τεκμηρίωση εγκατάστασης OpenSSH](https://docs.microsoft.com//windows-server/administration/openssh/openssh_install_firstuse?WT.mc_id=academic-17441-jabenn). + +1. Αυτό θα πρέπει να συνδεθεί στο Pi σας και να ζητήσει τον κωδικό πρόσβασης. + + Η δυνατότητα εύρεσης υπολογιστών στο δίκτυό σας χρησιμοποιώντας `.local` είναι μια σχετικά πρόσφατη προσθήκη στο Linux και στα Windows. Αν χρησιμοποιείτε Linux ή Windows και λάβετε οποιαδήποτε σφάλματα σχετικά με το ότι το Hostname δεν βρέθηκε, θα χρειαστεί να εγκαταστήσετε πρόσθετο λογισμικό για να ενεργοποιήσετε το ZeroConf networking (επίσης αναφερόμενο από την Apple ως Bonjour): + + 1. Αν χρησιμοποιείτε Linux, εγκαταστήστε το Avahi χρησιμοποιώντας την παρακάτω εντολή: + + ```sh + sudo apt-get install avahi-daemon + ``` + + 1. Αν χρησιμοποιείτε Windows, ο ευκολότερος τρόπος για να ενεργοποιήσετε το ZeroConf είναι να εγκαταστήσετε το [Bonjour Print Services for Windows](http://support.apple.com/kb/DL999). Μπορείτε επίσης να εγκαταστήσετε το [iTunes for Windows](https://www.apple.com/itunes/download/) για να αποκτήσετε μια νεότερη έκδοση του εργαλείου (η οποία δεν είναι διαθέσιμη ως αυτόνομη). + + > 💁 Αν δεν μπορείτε να συνδεθείτε χρησιμοποιώντας `raspberrypi.local`, τότε μπορείτε να χρησιμοποιήσετε τη διεύθυνση IP του Pi σας. Ανατρέξτε στην [τεκμηρίωση διεύθυνσης IP του Raspberry Pi](https://www.raspberrypi.org/documentation/remote-access/ip-address.md) για οδηγίες σχετικά με διάφορους τρόπους για να βρείτε τη διεύθυνση IP. + +1. Εισάγετε τον κωδικό πρόσβασης που ορίσατε στις Advanced Options του Raspberry Pi Imager. + +#### Διαμόρφωση λογισμικού στο Pi + +Μόλις συνδεθείτε στο Pi, πρέπει να βεβαιωθείτε ότι το λειτουργικό σύστημα είναι ενημερωμένο και να εγκαταστήσετε διάφορες βιβλιοθήκες και εργαλεία που αλληλεπιδρούν με το υλικό Grove. + +##### Εργασία - Διαμόρφωση λογισμικού στο Pi + +Διαμορφώστε το εγκατεστημένο λογισμικό του Pi και εγκαταστήστε τις βιβλιοθήκες Grove. + +1. Από τη συνεδρία `ssh` σας, εκτελέστε την παρακάτω εντολή για να ενημερώσετε και στη συνέχεια να επανεκκινήσετε το Pi: + + ```sh + sudo apt update && sudo apt full-upgrade --yes && sudo reboot + ``` + + Το Pi θα ενημερωθεί και θα επανεκκινήσει. Η συνεδρία `ssh` θα τερματιστεί όταν το Pi επανεκκινήσει, οπότε αφήστε το για περίπου 30 δευτερόλεπτα και στη συνέχεια συνδεθείτε ξανά. + +1. Από τη συνεδρία `ssh` που επανασυνδέθηκε, εκτελέστε τις παρακάτω εντολές για να εγκαταστήσετε όλες τις απαραίτητες βιβλιοθήκες για το υλικό 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 + ``` + + Αυτό ξεκινά με την εγκατάσταση του Git, μαζί με το Pip για την εγκατάσταση πακέτων Python. + + Ένα από τα ισχυρά χαρακτηριστικά της Python είναι η δυνατότητα εγκατάστασης [πακέτων Pip](https://pypi.org) - αυτά είναι πακέτα κώδικα γραμμένα από άλλους και δημοσιευμένα στο Διαδίκτυο. Μπορείτε να εγκαταστήσετε ένα πακέτο Pip στον υπολογιστή σας με μία εντολή και στη συνέχεια να χρησιμοποιήσετε αυτό το πακέτο στον κώδικά σας. + + Τα πακέτα Python του Seeed Grove πρέπει να εγκατασταθούν από τον πηγαίο κώδικα. Αυτές οι εντολές θα κλωνοποιήσουν το αποθετήριο που περιέχει τον πηγαίο κώδικα για αυτό το πακέτο και στη συνέχεια θα το εγκαταστήσουν τοπικά. + + > 💁 Από προεπιλογή, όταν εγκαθιστάτε ένα πακέτο, είναι διαθέσιμο παντού στον υπολογιστή σας, και αυτό μπορεί να οδηγήσει σε προβλήματα με τις εκδόσεις των πακέτων - όπως μια εφαρμογή που εξαρτάται από μια έκδοση ενός πακέτου που δεν λειτουργεί όταν εγκαθιστάτε μια νέα έκδοση για μια διαφορετική εφαρμογή. Για να αντιμετωπίσετε αυτό το πρόβλημα, μπορείτε να χρησιμοποιήσετε ένα [εικονικό περιβάλλον Python](https://docs.python.org/3/library/venv.html), ουσιαστικά ένα αντίγραφο της Python σε έναν ειδικό φάκελο, και όταν εγκαθιστάτε πακέτα Pip, αυτά εγκαθίστανται μόνο σε αυτόν τον φάκελο. Δεν θα χρησιμοποιείτε εικονικά περιβάλλοντα όταν χρησιμοποιείτε το Pi σας. Το σενάριο εγκατάστασης του Grove εγκαθιστά τα πακέτα Python του Grove παγκοσμίως, οπότε για να χρησιμοποιήσετε ένα εικονικό περιβάλλον θα πρέπει να ρυθμίσετε ένα εικονικό περιβάλλον και στη συνέχεια να επανεγκαταστήσετε χειροκίνητα τα πακέτα +Είναι παραδοσιακό όταν ξεκινάτε με μια νέα γλώσσα προγραμματισμού ή τεχνολογία να δημιουργείτε μια εφαρμογή 'Hello World' - μια μικρή εφαρμογή που εμφανίζει κάτι όπως το κείμενο `"Hello World"` για να δείξετε ότι όλα τα εργαλεία έχουν ρυθμιστεί σωστά. + +Η εφαρμογή Hello World για το Pi θα διασφαλίσει ότι έχετε εγκαταστήσει σωστά το Python και το Visual Studio Code. + +Αυτή η εφαρμογή θα βρίσκεται σε έναν φάκελο που ονομάζεται `nightlight`, και θα επαναχρησιμοποιηθεί με διαφορετικό κώδικα σε επόμενα μέρη αυτής της εργασίας για να δημιουργηθεί η εφαρμογή nightlight. + +### Εργασία - hello world + +Δημιουργήστε την εφαρμογή Hello World. + +1. Εκκινήστε το VS Code, είτε απευθείας στο Pi, είτε στον υπολογιστή σας συνδεδεμένο με το Pi χρησιμοποιώντας την επέκταση Remote SSH. + +1. Εκκινήστε το τερματικό του VS Code επιλέγοντας *Terminal -> New Terminal*, ή πατώντας `` CTRL+` ``. Θα ανοίξει στον αρχικό κατάλογο του χρήστη `pi`. + +1. Εκτελέστε τις παρακάτω εντολές για να δημιουργήσετε έναν κατάλογο για τον κώδικά σας και να δημιουργήσετε ένα αρχείο Python που ονομάζεται `app.py` μέσα σε αυτόν τον κατάλογο: + + ```sh + mkdir nightlight + cd nightlight + touch app.py + ``` + +1. Ανοίξτε αυτόν τον φάκελο στο VS Code επιλέγοντας *File -> Open...* και επιλέγοντας τον φάκελο *nightlight*, στη συνέχεια επιλέξτε **OK**. + + ![Το παράθυρο διαλόγου του VS Code που δείχνει τον φάκελο nightlight](../../../../../translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.el.png) + +1. Ανοίξτε το αρχείο `app.py` από τον εξερευνητή του VS Code και προσθέστε τον παρακάτω κώδικα: + + ```python + print('Hello World!') + ``` + + Η συνάρτηση `print` εκτυπώνει ό,τι της περαστεί στην κονσόλα. + +1. Από το τερματικό του VS Code, εκτελέστε τα παρακάτω για να τρέξετε την εφαρμογή Python: + + ```sh + python app.py + ``` + + > 💁 Ίσως χρειαστεί να καλέσετε ρητά το `python3` για να εκτελέσετε αυτόν τον κώδικα αν έχετε εγκατεστημένο το Python 2 εκτός από το Python 3 (την πιο πρόσφατη έκδοση). Αν έχετε εγκατεστημένο το Python 2, τότε η κλήση του `python` θα χρησιμοποιήσει το Python 2 αντί για το Python 3. Από προεπιλογή, οι πιο πρόσφατες εκδόσεις του Raspberry Pi OS έχουν μόνο το Python 3 εγκατεστημένο. + + Η παρακάτω έξοδος θα εμφανιστεί στο τερματικό: + + ```output + pi@raspberrypi:~/nightlight $ python3 app.py + Hello World! + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code/pi](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/pi). + +😀 Το πρόγραμμα 'Hello World' σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md b/translations/el/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md new file mode 100644 index 00000000..8687e235 --- /dev/null +++ b/translations/el/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md @@ -0,0 +1,245 @@ + +# Εικονικός υπολογιστής μονού πίνακα + +Αντί να αγοράσετε μια συσκευή IoT μαζί με αισθητήρες και ενεργοποιητές, μπορείτε να χρησιμοποιήσετε τον υπολογιστή σας για να προσομοιώσετε το υλικό IoT. Το [έργο CounterFit](https://github.com/CounterFit-IoT/CounterFit) σας επιτρέπει να εκτελείτε μια εφαρμογή τοπικά που προσομοιώνει υλικό IoT, όπως αισθητήρες και ενεργοποιητές, και να έχετε πρόσβαση σε αυτούς μέσω τοπικού κώδικα Python, γραμμένου με τον ίδιο τρόπο όπως θα γράφατε σε ένα Raspberry Pi χρησιμοποιώντας φυσικό υλικό. + +## Ρύθμιση + +Για να χρησιμοποιήσετε το CounterFit, θα χρειαστεί να εγκαταστήσετε δωρεάν λογισμικό στον υπολογιστή σας. + +### Εργασία + +Εγκαταστήστε το απαραίτητο λογισμικό. + +1. Εγκαταστήστε την Python. Ανατρέξτε στη [σελίδα λήψεων της Python](https://www.python.org/downloads/) για οδηγίες σχετικά με την εγκατάσταση της τελευταίας έκδοσης της Python. + +1. Εγκαταστήστε το Visual Studio Code (VS Code). Αυτός είναι ο επεξεργαστής που θα χρησιμοποιήσετε για να γράψετε τον κώδικα της εικονικής σας συσκευής σε Python. Ανατρέξτε στην [τεκμηρίωση του VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) για οδηγίες σχετικά με την εγκατάσταση του VS Code. + + > 💁 Είστε ελεύθεροι να χρησιμοποιήσετε οποιοδήποτε IDE ή επεξεργαστή για Python αν έχετε κάποιο προτιμώμενο εργαλείο, αλλά τα μαθήματα θα παρέχουν οδηγίες βασισμένες στη χρήση του VS Code. + +1. Εγκαταστήστε την επέκταση Pylance για το VS Code. Αυτή είναι μια επέκταση για το VS Code που παρέχει υποστήριξη για τη γλώσσα Python. Ανατρέξτε στην [τεκμηρίωση της επέκτασης Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) για οδηγίες σχετικά με την εγκατάσταση αυτής της επέκτασης στο VS Code. + +Οι οδηγίες για την εγκατάσταση και τη ρύθμιση της εφαρμογής CounterFit θα δοθούν τη στιγμή που απαιτείται στις οδηγίες της εργασίας, καθώς εγκαθίσταται ανά έργο. + +## Hello world + +Είναι παραδοσιακό όταν ξεκινάτε με μια νέα γλώσσα προγραμματισμού ή τεχνολογία να δημιουργείτε μια εφαρμογή 'Hello World' - μια μικρή εφαρμογή που εμφανίζει κάτι όπως το κείμενο `"Hello World"` για να δείξει ότι όλα τα εργαλεία έχουν ρυθμιστεί σωστά. + +Η εφαρμογή Hello World για το εικονικό υλικό IoT θα διασφαλίσει ότι έχετε εγκαταστήσει σωστά την Python και το Visual Studio Code. Θα συνδεθεί επίσης στο CounterFit για τους εικονικούς αισθητήρες και ενεργοποιητές IoT. Δεν θα χρησιμοποιήσει κανένα υλικό, απλώς θα συνδεθεί για να αποδείξει ότι όλα λειτουργούν. + +Αυτή η εφαρμογή θα βρίσκεται σε έναν φάκελο που ονομάζεται `nightlight` και θα επαναχρησιμοποιηθεί με διαφορετικό κώδικα σε μεταγενέστερα μέρη αυτής της εργασίας για να δημιουργηθεί η εφαρμογή nightlight. + +### Ρύθμιση ενός εικονικού περιβάλλοντος Python + +Ένα από τα ισχυρά χαρακτηριστικά της Python είναι η δυνατότητα εγκατάστασης [πακέτων Pip](https://pypi.org) - αυτά είναι πακέτα κώδικα γραμμένα από άλλους και δημοσιευμένα στο Διαδίκτυο. Μπορείτε να εγκαταστήσετε ένα πακέτο Pip στον υπολογιστή σας με μία εντολή και στη συνέχεια να χρησιμοποιήσετε αυτό το πακέτο στον κώδικά σας. Θα χρησιμοποιήσετε το Pip για να εγκαταστήσετε ένα πακέτο για να επικοινωνήσετε με το CounterFit. + +Από προεπιλογή, όταν εγκαθιστάτε ένα πακέτο, είναι διαθέσιμο παντού στον υπολογιστή σας, και αυτό μπορεί να οδηγήσει σε προβλήματα με τις εκδόσεις των πακέτων - όπως μια εφαρμογή που εξαρτάται από μια έκδοση ενός πακέτου που δεν λειτουργεί όταν εγκαθιστάτε μια νέα έκδοση για μια διαφορετική εφαρμογή. Για να παρακάμψετε αυτό το πρόβλημα, μπορείτε να χρησιμοποιήσετε ένα [εικονικό περιβάλλον Python](https://docs.python.org/3/library/venv.html), ουσιαστικά ένα αντίγραφο της Python σε έναν αφιερωμένο φάκελο, και όταν εγκαθιστάτε πακέτα Pip, αυτά εγκαθίστανται μόνο σε αυτόν τον φάκελο. + +> 💁 Αν χρησιμοποιείτε Raspberry Pi, τότε δεν ρυθμίσατε ένα εικονικό περιβάλλον σε αυτή τη συσκευή για να διαχειριστείτε τα πακέτα Pip, αντίθετα χρησιμοποιείτε παγκόσμια πακέτα, καθώς τα πακέτα Grove εγκαθίστανται παγκοσμίως από το σενάριο εγκατάστασης. + +#### Εργασία - ρύθμιση ενός εικονικού περιβάλλοντος Python + +Ρυθμίστε ένα εικονικό περιβάλλον Python και εγκαταστήστε τα πακέτα Pip για το CounterFit. + +1. Από το τερματικό ή τη γραμμή εντολών σας, εκτελέστε τα παρακάτω σε μια τοποθεσία της επιλογής σας για να δημιουργήσετε και να μεταβείτε σε έναν νέο κατάλογο: + + ```sh + mkdir nightlight + cd nightlight + ``` + +1. Τώρα εκτελέστε τα παρακάτω για να δημιουργήσετε ένα εικονικό περιβάλλον στον φάκελο `.venv`: + + ```sh + python3 -m venv .venv + ``` + + > 💁 Πρέπει να καλέσετε ρητά το `python3` για να δημιουργήσετε το εικονικό περιβάλλον, σε περίπτωση που έχετε εγκατεστημένη την Python 2 εκτός από την Python 3 (την τελευταία έκδοση). Αν έχετε εγκατεστημένη την Python 2, τότε η κλήση του `python` θα χρησιμοποιήσει την Python 2 αντί για την Python 3. + +1. Ενεργοποιήστε το εικονικό περιβάλλον: + + * Στα Windows: + * Αν χρησιμοποιείτε το Command Prompt ή το Command Prompt μέσω του Windows Terminal, εκτελέστε: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Αν χρησιμοποιείτε το PowerShell, εκτελέστε: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + > Αν λάβετε ένα σφάλμα σχετικά με την απενεργοποίηση εκτέλεσης σεναρίων σε αυτό το σύστημα, θα χρειαστεί να ενεργοποιήσετε την εκτέλεση σεναρίων ορίζοντας μια κατάλληλη πολιτική εκτέλεσης. Μπορείτε να το κάνετε αυτό εκκινώντας το PowerShell ως διαχειριστής και εκτελώντας την παρακάτω εντολή: + + ```powershell + Set-ExecutionPolicy -ExecutionPolicy Unrestricted + ``` + + Εισάγετε `Y` όταν σας ζητηθεί επιβεβαίωση. Στη συνέχεια, επανεκκινήστε το PowerShell και δοκιμάστε ξανά. + + Μπορείτε να επαναφέρετε αυτήν την πολιτική εκτέλεσης αργότερα, αν χρειαστεί. Μπορείτε να διαβάσετε περισσότερα σχετικά με αυτό στη [σελίδα Πολιτικών Εκτέλεσης στα Microsoft Docs](https://docs.microsoft.com/powershell/module/microsoft.powershell.core/about/about_execution_policies?WT.mc_id=academic-17441-jabenn). + + * Σε macOS ή Linux, εκτελέστε: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Αυτές οι εντολές πρέπει να εκτελούνται από την ίδια τοποθεσία όπου εκτελέσατε την εντολή για να δημιουργήσετε το εικονικό περιβάλλον. Δεν θα χρειαστεί ποτέ να μεταβείτε στον φάκελο `.venv`, θα πρέπει πάντα να εκτελείτε την εντολή ενεργοποίησης και οποιεσδήποτε εντολές για την εγκατάσταση πακέτων ή την εκτέλεση κώδικα από τον φάκελο που βρισκόσασταν όταν δημιουργήσατε το εικονικό περιβάλλον. + +1. Μόλις ενεργοποιηθεί το εικονικό περιβάλλον, η προεπιλεγμένη εντολή `python` θα εκτελεί την έκδοση της Python που χρησιμοποιήθηκε για τη δημιουργία του εικονικού περιβάλλοντος. Εκτελέστε τα παρακάτω για να δείτε την έκδοση: + + ```sh + python --version + ``` + + Η έξοδος θα πρέπει να περιέχει τα εξής: + + ```output + (.venv) ➜ nightlight python --version + Python 3.9.1 + ``` + + > 💁 Η έκδοση της Python σας μπορεί να είναι διαφορετική - αρκεί να είναι η έκδοση 3.6 ή νεότερη, είστε εντάξει. Αν όχι, διαγράψτε αυτόν τον φάκελο, εγκαταστήστε μια νεότερη έκδοση της Python και δοκιμάστε ξανά. + +1. Εκτελέστε τις παρακάτω εντολές για να εγκαταστήσετε τα πακέτα Pip για το CounterFit. Αυτά τα πακέτα περιλαμβάνουν την κύρια εφαρμογή CounterFit καθώς και shims για το υλικό Grove. Αυτά τα shims σας επιτρέπουν να γράφετε κώδικα σαν να προγραμματίζατε χρησιμοποιώντας φυσικούς αισθητήρες και ενεργοποιητές από το οικοσύστημα Grove, αλλά συνδεδεμένους σε εικονικές συσκευές IoT. + + ```sh + pip install CounterFit + pip install counterfit-connection + pip install counterfit-shims-grove + ``` + + Αυτά τα πακέτα pip θα εγκατασταθούν μόνο στο εικονικό περιβάλλον και δεν θα είναι διαθέσιμα εκτός αυτού. + +### Γράψτε τον κώδικα + +Μόλις το εικονικό περιβάλλον Python είναι έτοιμο, μπορείτε να γράψετε τον κώδικα για την εφαρμογή 'Hello World'. + +#### Εργασία - γράψτε τον κώδικα + +Δημιουργήστε μια εφαρμογή Python για να εκτυπώσετε `"Hello World"` στην κονσόλα. + +1. Από το τερματικό ή τη γραμμή εντολών σας, εκτελέστε τα παρακάτω μέσα στο εικονικό περιβάλλον για να δημιουργήσετε ένα αρχείο Python που ονομάζεται `app.py`: + + * Στα Windows εκτελέστε: + + ```cmd + type nul > app.py + ``` + + * Σε macOS ή Linux, εκτελέστε: + + ```cmd + touch app.py + ``` + +1. Ανοίξτε τον τρέχοντα φάκελο στο VS Code: + + ```sh + code . + ``` + + > 💁 Αν το τερματικό σας επιστρέψει `command not found` σε macOS, σημαίνει ότι το VS Code δεν έχει προστεθεί στο PATH σας. Μπορείτε να προσθέσετε το VS Code στο PATH σας ακολουθώντας τις οδηγίες στην [ενότητα Εκκίνηση από τη γραμμή εντολών της τεκμηρίωσης του VS Code](https://code.visualstudio.com/docs/setup/mac?WT.mc_id=academic-17441-jabenn#_launching-from-the-command-line) και να εκτελέσετε την εντολή μετά. Το VS Code προστίθεται στο PATH από προεπιλογή στα Windows και Linux. + +1. Όταν το VS Code εκκινήσει, θα ενεργοποιήσει το εικονικό περιβάλλον Python. Το επιλεγμένο εικονικό περιβάλλον θα εμφανιστεί στη γραμμή κατάστασης στο κάτω μέρος: + + ![Το VS Code δείχνει το επιλεγμένο εικονικό περιβάλλον](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.el.png) + +1. Αν το τερματικό του VS Code είναι ήδη ανοιχτό όταν ξεκινά το VS Code, δεν θα έχει ενεργοποιηθεί το εικονικό περιβάλλον σε αυτό. Το πιο εύκολο πράγμα που μπορείτε να κάνετε είναι να τερματίσετε το τερματικό χρησιμοποιώντας το κουμπί **Kill the active terminal instance**: + + ![Κουμπί Kill the active terminal instance στο VS Code](../../../../../translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.el.png) + + Μπορείτε να καταλάβετε αν το τερματικό έχει ενεργοποιημένο το εικονικό περιβάλλον, καθώς το όνομα του εικονικού περιβάλλοντος θα είναι πρόθεμα στην προτροπή του τερματικού. Για παράδειγμα, μπορεί να είναι: + + ```sh + (.venv) ➜ nightlight + ``` + + Αν δεν έχετε `.venv` ως πρόθεμα στην προτροπή, το εικονικό περιβάλλον δεν είναι ενεργό στο τερματικό. + +1. Εκκινήστε ένα νέο τερματικό στο VS Code επιλέγοντας *Terminal -> New Terminal*, ή πατώντας `` CTRL+` ``. Το νέο τερματικό θα φορτώσει το εικονικό περιβάλλον και η κλήση για την ενεργοποίησή του θα εμφανιστεί στο τερματικό. Η προτροπή θα έχει επίσης το όνομα του εικονικού περιβάλλοντος (`.venv`): + + ```output + ➜ nightlight source .venv/bin/activate + (.venv) ➜ nightlight + ``` + +1. Ανοίξτε το αρχείο `app.py` από τον εξερευνητή του VS Code και προσθέστε τον παρακάτω κώδικα: + + ```python + print('Hello World!') + ``` + + Η συνάρτηση `print` εκτυπώνει ό,τι της δίνεται στην κονσόλα. + +1. Από το τερματικό του VS Code, εκτελέστε τα παρακάτω για να εκτελέσετε την εφαρμογή Python: + + ```sh + python app.py + ``` + + Η έξοδος θα περιέχει τα εξής: + + ```output + (.venv) ➜ nightlight python app.py + Hello World! + ``` + +😀 Το πρόγραμμα 'Hello World' σας ήταν επιτυχές! + +### Συνδέστε το 'υλικό' + +Ως δεύτερο βήμα 'Hello World', θα εκτελέσετε την εφαρμογή CounterFit και θα συνδέσετε τον κώδικά σας με αυτήν. Αυτό είναι το εικονικό ισοδύναμο της σύνδεσης κάποιου υλικού IoT σε ένα dev kit. + +#### Εργασία - συνδέστε το 'υλικό' + +1. Από το τερματικό του VS Code, εκκινήστε την εφαρμογή CounterFit με την παρακάτω εντολή: + + ```sh + counterfit + ``` + + Η εφαρμογή θα ξεκινήσει να εκτελείται και θα ανοίξει στον περιηγητή σας: + + ![Η εφαρμογή Counter Fit εκτελείται σε περιηγητή](../../../../../translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.el.png) + + Θα εμφανίζεται ως *Disconnected*, με το LED στην επάνω δεξιά γωνία να είναι σβηστό. + +1. Προσθέστε τον παρακάτω κώδικα στην αρχή του `app.py`: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + + Αυτός ο κώδικας εισάγει την κλάση `CounterFitConnection` από τη μονάδα `counterfit_connection`, η οποία προέρχεται από το πακέτο pip `counterfit-connection` που εγκαταστήσατε νωρίτερα. Στη συνέχεια, αρχικοποιεί μια σύνδεση με την εφαρμογή CounterFit που εκτελείται στη διεύθυνση `127.0.0.1`, η οποία είναι μια διεύθυνση IP που μπορείτε πάντα να χρησιμοποιείτε για πρόσβαση στον τοπικό σας υπολογιστή (συχνά αναφέρεται ως *localhost*), στη θύρα 5000. + + > 💁 Αν έχετε άλλες εφαρμογές που εκτελούνται στη θύρα 5000, μπορείτε να αλλάξετε αυτό ενημερώνοντας τη θύρα στον κώδικα και εκτελώντας το CounterFit χρησιμοποιώντας `CounterFit --port `, αντικαθιστώντας το `` με τη θύρα που θέλετε να χρησιμοποιήσετε. + +1. Θα χρειαστεί να εκκινήσετε ένα νέο τερματικό στο VS Code επιλέγοντας το κουμπί **Create a new integrated terminal**. Αυτό συμβαίνει επειδή η εφαρμογή CounterFit εκτελείται στο τρέχον τερματικό. + + ![Κουμπί Create a new integrated terminal στο VS Code](../../../../../translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.el.png) + +1. Στο νέο αυτό τερματικό, εκτελέστε το αρχείο `app.py` όπως πριν. Η κατάσταση του CounterFit θα αλλάξει σε **Connected** και το LED θα ανάψει. + + ![Το Counter Fit δείχνει ότι είναι συνδεδεμένο](../../../../../translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.el.png) + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code/virtual-device](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/virtual-device). + +😀 Η σύνδεσή σας με το υλικό ήταν επιτυχής! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md b/translations/el/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md new file mode 100644 index 00000000..8795c384 --- /dev/null +++ b/translations/el/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md @@ -0,0 +1,222 @@ + +# Wio Terminal + +Το [Wio Terminal από την Seeed Studios](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) είναι ένας μικροελεγκτής συμβατός με Arduino, με ενσωματωμένο WiFi, αισθητήρες και ενεργοποιητές, καθώς και θύρες για την προσθήκη περισσότερων αισθητήρων και ενεργοποιητών, χρησιμοποιώντας ένα οικοσύστημα υλικού που ονομάζεται [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html). + +![Ένα Wio Terminal από την Seeed Studios](../../../../../translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.el.png) + +## Ρύθμιση + +Για να χρησιμοποιήσετε το Wio Terminal, θα χρειαστεί να εγκαταστήσετε δωρεάν λογισμικό στον υπολογιστή σας. Θα χρειαστεί επίσης να ενημερώσετε το firmware του Wio Terminal πριν το συνδέσετε στο WiFi. + +### Εργασία - Ρύθμιση + +Εγκαταστήστε το απαραίτητο λογισμικό και ενημερώστε το firmware. + +1. Εγκαταστήστε το Visual Studio Code (VS Code). Αυτός είναι ο επεξεργαστής που θα χρησιμοποιήσετε για να γράψετε τον κώδικα της συσκευής σας σε C/C++. Ανατρέξτε στην [τεκμηρίωση του VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) για οδηγίες εγκατάστασης. + + > 💁 Ένα άλλο δημοφιλές IDE για ανάπτυξη με Arduino είναι το [Arduino IDE](https://www.arduino.cc/en/software). Αν είστε ήδη εξοικειωμένοι με αυτό το εργαλείο, μπορείτε να το χρησιμοποιήσετε αντί για το VS Code και το PlatformIO, αλλά τα μαθήματα θα παρέχουν οδηγίες βασισμένες στη χρήση του VS Code. + +1. Εγκαταστήστε την επέκταση PlatformIO για το VS Code. Αυτή είναι μια επέκταση που υποστηρίζει τον προγραμματισμό μικροελεγκτών σε C/C++. Ανατρέξτε στην [τεκμηρίωση της επέκτασης PlatformIO](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=platformio.platformio-ide) για οδηγίες εγκατάστασης. Αυτή η επέκταση εξαρτάται από την επέκταση Microsoft C/C++, η οποία εγκαθίσταται αυτόματα με την εγκατάσταση του PlatformIO. + +1. Συνδέστε το Wio Terminal στον υπολογιστή σας. Το Wio Terminal διαθέτει μια θύρα USB-C στο κάτω μέρος, η οποία πρέπει να συνδεθεί σε μια θύρα USB του υπολογιστή σας. Το Wio Terminal συνοδεύεται από ένα καλώδιο USB-C σε USB-A, αλλά αν ο υπολογιστής σας διαθέτει μόνο θύρες USB-C, θα χρειαστείτε είτε ένα καλώδιο USB-C είτε έναν προσαρμογέα USB-A σε USB-C. + +1. Ακολουθήστε τις οδηγίες στην [τεκμηρίωση WiFi Overview του Wio Terminal Wiki](https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/) για να ρυθμίσετε το Wio Terminal και να ενημερώσετε το firmware. + +## Hello world + +Είναι παραδοσιακό όταν ξεκινάτε με μια νέα γλώσσα προγραμματισμού ή τεχνολογία να δημιουργείτε μια εφαρμογή 'Hello World' - μια μικρή εφαρμογή που εμφανίζει κάτι όπως το κείμενο `"Hello World"` για να επιβεβαιώσετε ότι όλα τα εργαλεία έχουν ρυθμιστεί σωστά. + +Η εφαρμογή Hello World για το Wio Terminal θα διασφαλίσει ότι έχετε εγκαταστήσει σωστά το Visual Studio Code με το PlatformIO και ότι είναι έτοιμο για ανάπτυξη μικροελεγκτών. + +### Δημιουργία έργου PlatformIO + +Το πρώτο βήμα είναι να δημιουργήσετε ένα νέο έργο χρησιμοποιώντας το PlatformIO, ρυθμισμένο για το Wio Terminal. + +#### Εργασία - Δημιουργία έργου PlatformIO + +Δημιουργήστε το έργο PlatformIO. + +1. Συνδέστε το Wio Terminal στον υπολογιστή σας. + +1. Εκκινήστε το VS Code. + +1. Το εικονίδιο του PlatformIO θα βρίσκεται στη γραμμή μενού στο πλάι: + + ![Η επιλογή μενού του PlatformIO](../../../../../translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.el.png) + + Επιλέξτε αυτό το στοιχείο μενού και στη συνέχεια επιλέξτε *PIO Home -> Open*. + + ![Η επιλογή ανοίγματος του PlatformIO](../../../../../translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.el.png) + +1. Από την οθόνη υποδοχής, επιλέξτε το κουμπί **+ New Project**. + + ![Το κουμπί νέου έργου](../../../../../translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.el.png) + +1. Ρυθμίστε το έργο στον *Οδηγό Έργου*: + + 1. Ονομάστε το έργο σας `nightlight`. + + 1. Από το αναπτυσσόμενο μενού *Board*, πληκτρολογήστε `WIO` για να φιλτράρετε τις πλακέτες και επιλέξτε *Seeeduino Wio Terminal*. + + 1. Αφήστε το *Framework* ως *Arduino*. + + 1. Είτε αφήστε επιλεγμένο το *Use default location* είτε αποεπιλέξτε το και επιλέξτε μια τοποθεσία για το έργο σας. + + 1. Επιλέξτε το κουμπί **Finish**. + + ![Ο ολοκληρωμένος οδηγός έργου](../../../../../translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.el.png) + + Το PlatformIO θα κατεβάσει τα απαραίτητα στοιχεία για τη μεταγλώττιση κώδικα για το Wio Terminal και θα δημιουργήσει το έργο σας. Αυτό μπορεί να διαρκέσει μερικά λεπτά. + +### Εξερεύνηση του έργου PlatformIO + +Ο εξερευνητής του VS Code θα εμφανίσει έναν αριθμό αρχείων και φακέλων που δημιουργήθηκαν από τον οδηγό του PlatformIO. + +#### Φάκελοι + +* `.pio` - αυτός ο φάκελος περιέχει προσωρινά δεδομένα που χρειάζεται το PlatformIO, όπως βιβλιοθήκες ή μεταγλωττισμένο κώδικα. Δημιουργείται αυτόματα αν διαγραφεί και δεν χρειάζεται να τον προσθέσετε στον έλεγχο πηγαίου κώδικα αν μοιράζεστε το έργο σας σε ιστότοπους όπως το GitHub. +* `.vscode` - αυτός ο φάκελος περιέχει τη ρύθμιση που χρησιμοποιείται από το PlatformIO και το VS Code. Δημιουργείται αυτόματα αν διαγραφεί και δεν χρειάζεται να τον προσθέσετε στον έλεγχο πηγαίου κώδικα αν μοιράζεστε το έργο σας σε ιστότοπους όπως το GitHub. +* `include` - αυτός ο φάκελος είναι για εξωτερικά αρχεία κεφαλίδας που χρειάζονται όταν προσθέτετε επιπλέον βιβλιοθήκες στον κώδικά σας. Δεν θα χρησιμοποιήσετε αυτόν τον φάκελο σε αυτά τα μαθήματα. +* `lib` - αυτός ο φάκελος είναι για εξωτερικές βιβλιοθήκες που θέλετε να καλέσετε από τον κώδικά σας. Δεν θα χρησιμοποιήσετε αυτόν τον φάκελο σε αυτά τα μαθήματα. +* `src` - αυτός ο φάκελος περιέχει τον κύριο πηγαίο κώδικα της εφαρμογής σας. Αρχικά, θα περιέχει ένα μόνο αρχείο - `main.cpp`. +* `test` - αυτός ο φάκελος είναι για τυχόν μονάδες δοκιμών για τον κώδικά σας. + +#### Αρχεία + +* `main.cpp` - αυτό το αρχείο στον φάκελο `src` περιέχει το σημείο εισόδου για την εφαρμογή σας. Ανοίξτε αυτό το αρχείο και θα περιέχει τον ακόλουθο κώδικα: + + ```cpp + #include + + void setup() { + // put your setup code here, to run once: + } + + void loop() { + // put your main code here, to run repeatedly: + } + ``` + + Όταν η συσκευή ξεκινά, το πλαίσιο Arduino θα εκτελέσει τη συνάρτηση `setup` μία φορά και στη συνέχεια θα εκτελεί επανειλημμένα τη συνάρτηση `loop` μέχρι να απενεργοποιηθεί η συσκευή. + +* `.gitignore` - αυτό το αρχείο παραθέτει τα αρχεία και τους φακέλους που πρέπει να αγνοηθούν όταν προσθέτετε τον κώδικά σας στον έλεγχο πηγαίου κώδικα, όπως όταν τον ανεβάζετε σε ένα αποθετήριο στο GitHub. + +* `platformio.ini` - αυτό το αρχείο περιέχει τη ρύθμιση για τη συσκευή και την εφαρμογή σας. Ανοίξτε αυτό το αρχείο και θα περιέχει τον ακόλουθο κώδικα: + + ```ini + [env:seeed_wio_terminal] + platform = atmelsam + board = seeed_wio_terminal + framework = arduino + ``` + + Η ενότητα `[env:seeed_wio_terminal]` έχει ρυθμίσεις για το Wio Terminal. Μπορείτε να έχετε πολλές ενότητες `env` ώστε ο κώδικάς σας να μπορεί να μεταγλωττιστεί για πολλές πλακέτες. + + Οι υπόλοιπες τιμές αντιστοιχούν στη ρύθμιση από τον οδηγό έργου: + + * `platform = atmelsam` ορίζει το υλικό που χρησιμοποιεί το Wio Terminal (ένας μικροελεγκτής βασισμένος στο ATSAMD51). + * `board = seeed_wio_terminal` ορίζει τον τύπο της πλακέτας μικροελεγκτή (το Wio Terminal). + * `framework = arduino` ορίζει ότι αυτό το έργο χρησιμοποιεί το πλαίσιο Arduino. + +### Γράψτε την εφαρμογή Hello World + +Είστε πλέον έτοιμοι να γράψετε την εφαρμογή Hello World. + +#### Εργασία - Γράψτε την εφαρμογή Hello World + +Γράψτε την εφαρμογή Hello World. + +1. Ανοίξτε το αρχείο `main.cpp` στο VS Code. + +1. Αλλάξτε τον κώδικα ώστε να ταιριάζει με τον ακόλουθο: + + ```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); + } + ``` + + Η συνάρτηση `setup` αρχικοποιεί μια σύνδεση με τη σειριακή θύρα - σε αυτή την περίπτωση, τη θύρα USB που χρησιμοποιείται για τη σύνδεση του Wio Terminal με τον υπολογιστή σας. Η παράμετρος `9600` είναι η [ταχύτητα baud](https://wikipedia.org/wiki/Symbol_rate) (γνωστή και ως ρυθμός συμβόλων), ή η ταχύτητα με την οποία τα δεδομένα θα αποστέλλονται μέσω της σειριακής θύρας σε bits ανά δευτερόλεπτο. Αυτή η ρύθμιση σημαίνει ότι 9.600 bits (0s και 1s) δεδομένων αποστέλλονται κάθε δευτερόλεπτο. Στη συνέχεια, περιμένει να είναι έτοιμη η σειριακή θύρα. + + Η συνάρτηση `loop` στέλνει τη γραμμή `Hello World!` στη σειριακή θύρα, ώστε οι χαρακτήρες του `Hello World!` μαζί με έναν χαρακτήρα νέας γραμμής να αποστέλλονται. Στη συνέχεια, κοιμάται για 5.000 χιλιοστά του δευτερολέπτου ή 5 δευτερόλεπτα. Μετά το τέλος της `loop`, εκτελείται ξανά, και ξανά, και ούτω καθεξής όσο η μικροελεγκτής είναι ενεργοποιημένος. + +1. Βάλτε το Wio Terminal σε λειτουργία μεταφόρτωσης. Θα χρειαστεί να το κάνετε αυτό κάθε φορά που ανεβάζετε νέο κώδικα στη συσκευή: + + 1. Τραβήξτε δύο φορές γρήγορα τον διακόπτη τροφοδοσίας προς τα κάτω - θα επιστρέψει στη θέση ενεργοποίησης κάθε φορά. + + 1. Ελέγξτε το μπλε LED κατάστασης στη δεξιά πλευρά της θύρας USB. Θα πρέπει να αναβοσβήνει. + + [![Ένα βίντεο που δείχνει πώς να βάλετε το Wio Terminal σε λειτουργία μεταφόρτωσης](https://img.youtube.com/vi/LeKU_7zLRrQ/0.jpg)](https://youtu.be/LeKU_7zLRrQ) + + Κάντε κλικ στην παραπάνω εικόνα για να δείτε ένα βίντεο που δείχνει πώς να το κάνετε αυτό. + +1. Μεταγλωττίστε και ανεβάστε τον κώδικα στο Wio Terminal. + + 1. Ανοίξτε το command palette του VS Code. + + 1. Πληκτρολογήστε `PlatformIO Upload` για να αναζητήσετε την επιλογή μεταφόρτωσης και επιλέξτε *PlatformIO: Upload*. + + ![Η επιλογή μεταφόρτωσης του PlatformIO στο command palette](../../../../../translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.el.png) + + Το PlatformIO θα μεταγλωττίσει αυτόματα τον κώδικα αν χρειάζεται πριν τον ανεβάσει. + + 1. Ο κώδικας θα μεταγλωττιστεί και θα ανέβει στο Wio Terminal. + + > 💁 Αν χρησιμοποιείτε macOS, θα εμφανιστεί μια ειδοποίηση για *DISK NOT EJECTED PROPERLY*. Αυτό συμβαίνει επειδή το Wio Terminal προσαρτάται ως δίσκος κατά τη διαδικασία εγγραφής και αποσυνδέεται όταν ο μεταγλωττισμένος κώδικας γράφεται στη συσκευή. Μπορείτε να αγνοήσετε αυτή την ειδοποίηση. + + ⚠️ Αν λάβετε σφάλματα σχετικά με τη μη διαθεσιμότητα της θύρας μεταφόρτωσης, βεβαιωθείτε πρώτα ότι το Wio Terminal είναι συνδεδεμένο στον υπολογιστή σας, ενεργοποιημένο με τον διακόπτη στη δεξιά πλευρά της οθόνης και σε λειτουργία μεταφόρτωσης. Το πράσινο φως στο κάτω μέρος πρέπει να είναι αναμμένο και το μπλε φως να αναβοσβήνει. Αν εξακολουθείτε να λαμβάνετε το σφάλμα, τραβήξτε τον διακόπτη ενεργοποίησης/απενεργοποίησης δύο φορές γρήγορα ξανά για να αναγκάσετε το Wio Terminal να μπει σε λειτουργία μεταφόρτωσης και δοκιμάστε ξανά τη μεταφόρτωση. + +Το PlatformIO διαθέτει ένα Serial Monitor που μπορεί να παρακολουθεί δεδομένα που αποστέλλονται μέσω του καλωδίου USB από το Wio Terminal. Αυτό σας επιτρέπει να παρακολουθείτε τα δεδομένα που αποστέλλονται από την εντολή `Serial.println("Hello World");`. + +1. Ανοίξτε το command palette του VS Code. + +1. Πληκτρολογήστε `PlatformIO Serial` για να αναζητήσετε την επιλογή Serial Monitor και επιλέξτε *PlatformIO: Serial Monitor*. + + ![Η επιλογή Serial Monitor του PlatformIO στο command palette](../../../../../translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.el.png) + + Ένα νέο τερματικό θα ανοίξει και τα δεδομένα που αποστέλλονται μέσω της σειριακής θύρας θα εμφανίζονται σε αυτό το τερματικό: + + ```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` θα εκτυπώνεται στο Serial Monitor κάθε 5 δευτερόλεπτα. + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code/wio-terminal](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/wio-terminal). + +😀 Το πρόγραμμα 'Hello World' σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/2-deeper-dive/README.md b/translations/el/1-getting-started/lessons/2-deeper-dive/README.md new file mode 100644 index 00000000..5590bb9f --- /dev/null +++ b/translations/el/1-getting-started/lessons/2-deeper-dive/README.md @@ -0,0 +1,238 @@ + +# Μια βαθύτερη ματιά στο IoT + +![Μια επισκόπηση του μαθήματος σε σκίτσο](../../../../../translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.el.jpg) + +> Σκίτσο από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +Αυτό το μάθημα διδάχθηκε ως μέρος της σειράς [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) από το [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Το μάθημα παρουσιάστηκε σε 2 βίντεο - ένα μάθημα διάρκειας 1 ώρας και μία ώρα γραφείου για βαθύτερη ανάλυση και απαντήσεις σε ερωτήσεις. + +[![Μάθημα 2: Μια βαθύτερη ματιά στο IoT](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M) + +[![Μάθημα 2: Μια βαθύτερη ματιά στο IoT - Ώρες γραφείου](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E) + +> 🎥 Κάντε κλικ στις παραπάνω εικόνες για να παρακολουθήσετε τα βίντεο + +## Ερωτηματολόγιο πριν το μάθημα + +[Ερωτηματολόγιο πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3) + +## Εισαγωγή + +Αυτό το μάθημα εμβαθύνει σε ορισμένες από τις έννοιες που καλύφθηκαν στο προηγούμενο μάθημα. + +Σε αυτό το μάθημα θα καλύψουμε: + +* [Συστατικά μιας εφαρμογής IoT](../../../../../1-getting-started/lessons/2-deeper-dive) +* [Βαθύτερη ανάλυση των μικροελεγκτών](../../../../../1-getting-started/lessons/2-deeper-dive) +* [Βαθύτερη ανάλυση των υπολογιστών μονού πίνακα](../../../../../1-getting-started/lessons/2-deeper-dive) + +## Συστατικά μιας εφαρμογής IoT + +Τα δύο βασικά συστατικά μιας εφαρμογής IoT είναι το *Διαδίκτυο* και το *πράγμα*. Ας δούμε αυτά τα δύο συστατικά με περισσότερες λεπτομέρειες. + +### Το Πράγμα + +![Ένα Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.el.jpg) + +Το **Πράγμα** στο IoT αναφέρεται σε μια συσκευή που μπορεί να αλληλεπιδράσει με τον φυσικό κόσμο. Αυτές οι συσκευές είναι συνήθως μικροί, οικονομικοί υπολογιστές, που λειτουργούν σε χαμηλές ταχύτητες και καταναλώνουν λίγη ενέργεια - για παράδειγμα, απλοί μικροελεγκτές με λίγα kilobytes RAM (σε αντίθεση με τα gigabytes σε έναν υπολογιστή) που λειτουργούν σε μερικές εκατοντάδες megahertz (σε αντίθεση με τα gigahertz σε έναν υπολογιστή), αλλά καταναλώνουν τόσο λίγη ενέργεια που μπορούν να λειτουργούν για εβδομάδες, μήνες ή ακόμα και χρόνια με μπαταρίες. + +Αυτές οι συσκευές αλληλεπιδρούν με τον φυσικό κόσμο είτε χρησιμοποιώντας αισθητήρες για να συλλέξουν δεδομένα από το περιβάλλον τους είτε ελέγχοντας εξόδους ή ενεργοποιητές για να κάνουν φυσικές αλλαγές. Ένα τυπικό παράδειγμα είναι ένας έξυπνος θερμοστάτης - μια συσκευή που διαθέτει αισθητήρα θερμοκρασίας, έναν τρόπο ρύθμισης της επιθυμητής θερμοκρασίας, όπως ένας διακόπτης ή μια οθόνη αφής, και μια σύνδεση με ένα σύστημα θέρμανσης ή ψύξης που μπορεί να ενεργοποιηθεί όταν η ανιχνευόμενη θερμοκρασία είναι εκτός του επιθυμητού εύρους. Ο αισθητήρας θερμοκρασίας ανιχνεύει ότι το δωμάτιο είναι πολύ κρύο και ένας ενεργοποιητής ενεργοποιεί τη θέρμανση. + +![Διάγραμμα που δείχνει τη θερμοκρασία και έναν διακόπτη ως εισόδους σε μια συσκευή IoT, και τον έλεγχο ενός θερμαντήρα ως έξοδο](../../../../../translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.el.png) + +Υπάρχει μια τεράστια ποικιλία διαφορετικών πραγμάτων που μπορούν να λειτουργήσουν ως συσκευές IoT, από εξειδικευμένο υλικό που ανιχνεύει ένα πράγμα, έως γενικής χρήσης συσκευές, ακόμα και το smartphone σας! Ένα smartphone μπορεί να χρησιμοποιήσει αισθητήρες για να ανιχνεύσει τον κόσμο γύρω του και ενεργοποιητές για να αλληλεπιδράσει με τον κόσμο - για παράδειγμα, χρησιμοποιώντας έναν αισθητήρα GPS για να ανιχνεύσει την τοποθεσία σας και ένα ηχείο για να σας δώσει οδηγίες πλοήγησης προς έναν προορισμό. + +✅ Σκεφτείτε άλλα συστήματα γύρω σας που διαβάζουν δεδομένα από έναν αισθητήρα και τα χρησιμοποιούν για να πάρουν αποφάσεις. Ένα παράδειγμα θα μπορούσε να είναι ο θερμοστάτης ενός φούρνου. Μπορείτε να βρείτε περισσότερα; + +### Το Διαδίκτυο + +Η πλευρά του **Διαδικτύου** σε μια εφαρμογή IoT αποτελείται από εφαρμογές στις οποίες μπορεί να συνδεθεί η συσκευή IoT για να στείλει και να λάβει δεδομένα, καθώς και άλλες εφαρμογές που μπορούν να επεξεργαστούν τα δεδομένα από τη συσκευή IoT και να βοηθήσουν στη λήψη αποφάσεων σχετικά με το ποιες εντολές θα σταλούν στους ενεργοποιητές της συσκευής IoT. + +Μια τυπική ρύθμιση θα ήταν η ύπαρξη μιας υπηρεσίας cloud στην οποία συνδέεται η συσκευή IoT, και αυτή η υπηρεσία cloud χειρίζεται πράγματα όπως η ασφάλεια, καθώς και η λήψη μηνυμάτων από τη συσκευή IoT και η αποστολή μηνυμάτων πίσω στη συσκευή. Αυτή η υπηρεσία cloud θα συνδεθεί στη συνέχεια με άλλες εφαρμογές που μπορούν να επεξεργαστούν ή να αποθηκεύσουν δεδομένα από αισθητήρες ή να χρησιμοποιήσουν τα δεδομένα αισθητήρων με δεδομένα από άλλα συστήματα για να πάρουν αποφάσεις. + +Οι συσκευές επίσης δεν συνδέονται πάντα απευθείας στο Διαδίκτυο μέσω WiFi ή ενσύρματων συνδέσεων. Ορισμένες συσκευές χρησιμοποιούν δικτύωση mesh για να επικοινωνούν μεταξύ τους μέσω τεχνολογιών όπως το Bluetooth, συνδεόμενες μέσω μιας συσκευής hub που έχει σύνδεση στο Διαδίκτυο. + +Στο παράδειγμα ενός έξυπνου θερμοστάτη, ο θερμοστάτης θα συνδεθεί χρησιμοποιώντας το WiFi του σπιτιού σε μια υπηρεσία cloud. Θα στείλει τα δεδομένα θερμοκρασίας σε αυτή την υπηρεσία cloud, και από εκεί θα γραφτούν σε μια βάση δεδομένων, επιτρέποντας στον ιδιοκτήτη του σπιτιού να ελέγξει τις τρέχουσες και παρελθούσες θερμοκρασίες μέσω μιας εφαρμογής στο τηλέφωνο. Μια άλλη υπηρεσία στο cloud θα γνωρίζει ποια θερμοκρασία θέλει ο ιδιοκτήτης και θα στέλνει μηνύματα πίσω στη συσκευή IoT μέσω της υπηρεσίας cloud για να πει στο σύστημα θέρμανσης να ενεργοποιηθεί ή να απενεργοποιηθεί. + +![Διάγραμμα που δείχνει τη θερμοκρασία και έναν διακόπτη ως εισόδους σε μια συσκευή IoT, τη συσκευή IoT με αμφίδρομη επικοινωνία με το cloud, το οποίο με τη σειρά του έχει αμφίδρομη επικοινωνία με ένα τηλέφωνο, και τον έλεγχο ενός θερμαντήρα ως έξοδο από τη συσκευή IoT](../../../../../translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.el.png) + +Μια ακόμα πιο έξυπνη έκδοση θα μπορούσε να χρησιμοποιεί AI στο cloud με δεδομένα από άλλους αισθητήρες συνδεδεμένους σε άλλες συσκευές IoT, όπως αισθητήρες παρουσίας που ανιχνεύουν ποια δωμάτια χρησιμοποιούνται, καθώς και δεδομένα όπως ο καιρός και το ημερολόγιό σας, για να παίρνει αποφάσεις σχετικά με τη ρύθμιση της θερμοκρασίας με έξυπνο τρόπο. Για παράδειγμα, θα μπορούσε να απενεργοποιήσει τη θέρμανση αν διαβάσει από το ημερολόγιό σας ότι είστε σε διακοπές ή να απενεργοποιήσει τη θέρμανση ανά δωμάτιο ανάλογα με το ποια δωμάτια χρησιμοποιείτε, μαθαίνοντας από τα δεδομένα για να γίνεται όλο και πιο ακριβής με την πάροδο του χρόνου. + +![Διάγραμμα που δείχνει πολλαπλούς αισθητήρες θερμοκρασίας και έναν διακόπτη ως εισόδους σε μια συσκευή IoT, τη συσκευή IoT με αμφίδρομη επικοινωνία με το cloud, το οποίο με τη σειρά του έχει αμφίδρομη επικοινωνία με ένα τηλέφωνο, ένα ημερολόγιο και μια υπηρεσία καιρού, και τον έλεγχο ενός θερμαντήρα ως έξοδο από τη συσκευή IoT](../../../../../translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.el.png) + +✅ Ποια άλλα δεδομένα θα μπορούσαν να βοηθήσουν έναν θερμοστάτη συνδεδεμένο στο Διαδίκτυο να γίνει πιο έξυπνος; + +### IoT στο Edge + +Παρόλο που το I στο IoT σημαίνει Διαδίκτυο, αυτές οι συσκευές δεν χρειάζεται να συνδέονται στο Διαδίκτυο. Σε ορισμένες περιπτώσεις, οι συσκευές μπορούν να συνδέονται σε συσκευές 'edge' - πύλες που λειτουργούν στο τοπικό σας δίκτυο, επιτρέποντας την επεξεργασία δεδομένων χωρίς να γίνεται κλήση μέσω του Διαδικτύου. Αυτό μπορεί να είναι ταχύτερο όταν έχετε πολλά δεδομένα ή αργή σύνδεση στο Διαδίκτυο, επιτρέπει τη λειτουργία εκτός σύνδεσης όπου η σύνδεση στο Διαδίκτυο δεν είναι δυνατή, όπως σε ένα πλοίο ή σε μια περιοχή καταστροφής κατά την ανταπόκριση σε ανθρωπιστική κρίση, και επιτρέπει τη διατήρηση της ιδιωτικότητας των δεδομένων. Ορισμένες συσκευές περιέχουν κώδικα επεξεργασίας που δημιουργείται με εργαλεία cloud και εκτελείται τοπικά για τη συλλογή και την απόκριση σε δεδομένα χωρίς τη χρήση σύνδεσης στο Διαδίκτυο για τη λήψη απόφασης. + +Ένα παράδειγμα αυτού είναι μια έξυπνη οικιακή συσκευή όπως το Apple HomePod, το Amazon Alexa ή το Google Home, που ακούει τη φωνή σας χρησιμοποιώντας μοντέλα AI που έχουν εκπαιδευτεί στο cloud, αλλά εκτελούνται τοπικά στη συσκευή. Αυτές οι συσκευές 'ξυπνούν' όταν ακουστεί μια συγκεκριμένη λέξη ή φράση και μόνο τότε στέλνουν την ομιλία σας μέσω του Διαδικτύου για επεξεργασία. Η συσκευή σταματά να στέλνει ομιλία σε ένα κατάλληλο σημείο, όπως όταν ανιχνεύει μια παύση στην ομιλία σας. Ό,τι λέτε πριν ξυπνήσει η συσκευή με τη λέξη αφύπνισης και ό,τι λέτε αφού η συσκευή σταματήσει να ακούει δεν θα σταλεί μέσω του Διαδικτύου στον πάροχο της συσκευής και, επομένως, θα παραμείνει ιδιωτικό. + +✅ Σκεφτείτε άλλα σενάρια όπου η ιδιωτικότητα είναι σημαντική, ώστε η επεξεργασία δεδομένων να γίνεται καλύτερα στο edge παρά στο cloud. Υπόδειξη - σκεφτείτε συσκευές IoT με κάμερες ή άλλες συσκευές απεικόνισης. + +### Ασφάλεια στο IoT + +Με οποιαδήποτε σύνδεση στο Διαδίκτυο, η ασφάλεια είναι μια σημαντική παράμετρος. Υπάρχει ένα παλιό αστείο που λέει ότι 'το S στο IoT σημαίνει Ασφάλεια' - δεν υπάρχει 'S' στο IoT, υπονοώντας ότι δεν είναι ασφαλές. + +Οι συσκευές IoT συνδέονται σε μια υπηρεσία cloud και, επομένως, είναι τόσο ασφαλείς όσο αυτή η υπηρεσία cloud - αν η υπηρεσία cloud επιτρέπει σε οποιαδήποτε συσκευή να συνδεθεί, τότε μπορούν να σταλούν κακόβουλα δεδομένα ή να πραγματοποιηθούν επιθέσεις ιών. Αυτό μπορεί να έχει πολύ πραγματικές συνέπειες, καθώς οι συσκευές IoT αλληλεπιδρούν και ελέγχουν άλλες συσκευές. Για παράδειγμα, το [σκουλήκι Stuxnet](https://wikipedia.org/wiki/Stuxnet) χειραγώγησε βαλβίδες σε φυγοκεντρητές για να τις καταστρέψει. Χάκερς έχουν επίσης εκμεταλλευτεί [κακή ασφάλεια για να αποκτήσουν πρόσβαση σε μόνιτορ μωρών](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) και άλλες οικιακές συσκευές παρακολούθησης. + +> 💁 Μερικές φορές οι συσκευές IoT και οι συσκευές edge λειτουργούν σε ένα δίκτυο εντελώς απομονωμένο από το Διαδίκτυο για να διατηρήσουν τα δεδομένα ιδιωτικά και ασφαλή. Αυτό είναι γνωστό ως [air-gapping](https://wikipedia.org/wiki/Air_gap_(networking)). + +## Βαθύτερη ανάλυση των μικροελεγκτών + +Στο προηγούμενο μάθημα, παρουσιάσαμε τους μικροελεγκτές. Ας τους εξετάσουμε τώρα πιο αναλυτικά. + +### CPU + +Η CPU είναι ο 'εγκέφαλος' του μικροελεγκτή. Είναι ο επεξεργαστής που εκτελεί τον κώδικά σας και μπορεί να στέλνει δεδομένα σε και να λαμβάνει δεδομένα από οποιαδήποτε συνδεδεμένη συσκευή. Οι CPU μπορούν να περιέχουν έναν ή περισσότερους πυρήνες - ουσιαστικά έναν ή περισσότερους επεξεργαστές που μπορούν να συνεργαστούν για να εκτελέσουν τον κώδικά σας. + +Οι CPU βασίζονται σε ένα ρολόι που χτυπά εκατομμύρια ή δισεκατομμύρια φορές το δευτερόλεπτο. Κάθε χτύπος, ή κύκλος, συγχρονίζει τις ενέργειες που μπορεί να εκτελέσει η CPU. Με κάθε χτύπο, η CPU μπορεί να εκτελέσει μια εντολή από ένα πρόγραμμα, όπως να ανακτήσει δεδομένα από μια εξωτερική συσκευή ή να εκτελέσει έναν μαθηματικό υπολογισμό. Αυτή η τακτική κυκλικότητα επιτρέπει την ολοκλήρωση όλων των ενεργειών πριν από την επεξεργασία της επόμενης εντολής. + +Όσο πιο γρήγορος είναι ο κύκλος του ρολογιού, τόσες περισσότερες εντολές μπορούν να επεξεργαστούν ανά δευτερόλεπτο και, επομένως, τόσο πιο γρήγορη είναι η CPU. Οι ταχύτητες των CPU μετρώνται σε [Hertz (Hz)](https://wikipedia.org/wiki/Hertz), μια τυπική μονάδα όπου 1 Hz σημαίνει έναν κύκλο ή χτύπο ρολογιού ανά δευτερόλεπτο. + +> 🎓 Οι ταχύτητες των CPU συχνά δίνονται σε MHz ή GHz. 1MHz είναι 1 εκατομμύριο Hz, 1GHz είναι 1 δισεκατομμύριο Hz. + +> 💁 Οι CPU εκτελούν προγράμματα χρησιμοποιώντας τον [κύκλο fetch-decode-execute](https://wikipedia.org/wiki/Instruction_cycle). Για κάθε χτύπο ρολογιού, η CPU θα ανακτήσει την επόμενη εντολή από τη μνήμη, θα την αποκωδικοποιήσει και στη συνέχεια θα την εκτελέσει, όπως χρησιμοποιώντας μια αριθμητική λογική μονάδα (ALU) για να προσθέσει 2 αριθμούς. Ορισμένες εκτελέσεις θα χρειαστούν πολλούς χτύπους για να ολοκληρωθούν, οπότε ο επόμενος κύκλος θα εκτελεστεί στον επόμενο χτύπο μετά την ολοκλήρωση της εντολής. + +![Οι κύκλοι fetch-decode-execute που δείχνουν την ανάκτηση μιας εντολής από το πρόγραμμα που είναι αποθηκευμένο στη RAM, την αποκωδικοποίησή της και την εκτέλεσή της σε μια CPU](../../../../../translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.el.png) + +Οι μικροελεγκτές έχουν πολύ χαμηλότερες ταχύτητες ρολογιού από τους επιτραπέζιους ή φορητούς υπολογιστές ή ακόμα και από τα περισσότερα smartphones. Για παράδειγμα, το Wio Terminal έχει μια CPU που λειτουργεί στα 120MHz ή 120 +🎓 Η μνήμη προγράμματος αποθηκεύει τον κώδικά σας και παραμένει όταν δεν υπάρχει ρεύμα. +🎓 Η RAM χρησιμοποιείται για την εκτέλεση του προγράμματός σας και επαναφέρεται όταν δεν υπάρχει τροφοδοσία + +Όπως και με την CPU, η μνήμη σε έναν μικροελεγκτή είναι κατά πολύ μικρότερη από αυτήν ενός PC ή Mac. Ένας τυπικός υπολογιστής μπορεί να έχει 8 Gigabytes (GB) RAM, ή 8.000.000.000 bytes, με κάθε byte να έχει αρκετό χώρο για να αποθηκεύσει ένα γράμμα ή έναν αριθμό από 0-255. Ένας μικροελεγκτής θα έχει μόνο Kilobytes (KB) RAM, με ένα kilobyte να είναι 1.000 bytes. Το Wio terminal που αναφέρθηκε παραπάνω έχει 192KB RAM, ή 192.000 bytes - πάνω από 40.000 φορές λιγότερο από έναν μέσο υπολογιστή! + +Το παρακάτω διάγραμμα δείχνει τη σχετική διαφορά μεγέθους μεταξύ 192KB και 8GB - η μικρή κουκκίδα στο κέντρο αντιπροσωπεύει τα 192KB. + +![Σύγκριση μεταξύ 192KB και 8GB - πάνω από 40.000 φορές μεγαλύτερο](../../../../../translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.el.png) + +Ο χώρος αποθήκευσης προγραμμάτων είναι επίσης μικρότερος από έναν υπολογιστή. Ένας τυπικός υπολογιστής μπορεί να έχει σκληρό δίσκο 500GB για αποθήκευση προγραμμάτων, ενώ ένας μικροελεγκτής μπορεί να έχει μόνο kilobytes ή ίσως λίγα megabytes (MB) αποθηκευτικού χώρου (1MB είναι 1.000KB, ή 1.000.000 bytes). Το Wio terminal έχει 4MB αποθηκευτικού χώρου για προγράμματα. + +✅ Κάντε λίγη έρευνα: Πόση RAM και αποθηκευτικό χώρο έχει ο υπολογιστής που χρησιμοποιείτε για να διαβάσετε αυτό; Πώς συγκρίνεται με έναν μικροελεγκτή; + +### Είσοδος/Έξοδος + +Οι μικροελεγκτές χρειάζονται συνδέσεις εισόδου και εξόδου (I/O) για να διαβάζουν δεδομένα από αισθητήρες και να στέλνουν σήματα ελέγχου σε ενεργοποιητές. Συνήθως περιέχουν έναν αριθμό γενικής χρήσης ακίδων εισόδου/εξόδου (GPIO). Αυτές οι ακίδες μπορούν να ρυθμιστούν μέσω λογισμικού ως είσοδος (δηλαδή λαμβάνουν ένα σήμα) ή έξοδος (στέλνουν ένα σήμα). + +🧠⬅️ Οι ακίδες εισόδου χρησιμοποιούνται για να διαβάζουν τιμές από αισθητήρες + +🧠➡️ Οι ακίδες εξόδου στέλνουν οδηγίες σε ενεργοποιητές + +✅ Θα μάθετε περισσότερα για αυτό σε επόμενο μάθημα. + +#### Εργασία + +Ερευνήστε το Wio Terminal. + +Αν χρησιμοποιείτε το Wio Terminal για αυτά τα μαθήματα, βρείτε τις ακίδες GPIO. Βρείτε την ενότητα *Pinout diagram* στη [σελίδα προϊόντος του Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) για να μάθετε ποιες ακίδες είναι ποιες. Το Wio Terminal συνοδεύεται από ένα αυτοκόλλητο που μπορείτε να τοποθετήσετε στο πίσω μέρος με αριθμούς ακίδων, οπότε προσθέστε το τώρα αν δεν το έχετε ήδη κάνει. + +### Φυσικό μέγεθος + +Οι μικροελεγκτές είναι συνήθως μικροί σε μέγεθος, με τον μικρότερο, έναν [Freescale Kinetis KL03 MCU να είναι αρκετά μικρός ώστε να χωράει στην εσοχή μιας μπάλας γκολφ](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/). Μόνο η CPU σε έναν υπολογιστή μπορεί να έχει μέγεθος 40mm x 40mm, και αυτό δεν περιλαμβάνει τις ψύκτρες και τους ανεμιστήρες που χρειάζονται για να διασφαλίσουν ότι η CPU μπορεί να λειτουργεί για περισσότερα από λίγα δευτερόλεπτα χωρίς υπερθέρμανση, σημαντικά μεγαλύτερη από έναν πλήρη μικροελεγκτή. Το Wio terminal developer kit με μικροελεγκτή, θήκη, οθόνη και μια σειρά από συνδέσεις και εξαρτήματα δεν είναι πολύ μεγαλύτερο από μια γυμνή CPU Intel i9, και σημαντικά μικρότερο από την CPU με ψύκτρα και ανεμιστήρα! + +| Συσκευή | Μέγεθος | +| ------------------------------- | --------------------- | +| Freescale Kinetis KL03 | 1.6mm x 2mm x 1mm | +| Wio terminal | 72mm x 57mm x 12mm | +| Intel i9 CPU, Heat sink and fan | 136mm x 145mm x 103mm | + +### Πλατφόρμες και λειτουργικά συστήματα + +Λόγω της χαμηλής ταχύτητας και του μικρού μεγέθους μνήμης, οι μικροελεγκτές δεν εκτελούν λειτουργικό σύστημα (OS) με την έννοια του desktop. Το λειτουργικό σύστημα που κάνει τον υπολογιστή σας να λειτουργεί (Windows, Linux ή macOS) χρειάζεται πολλή μνήμη και επεξεργαστική ισχύ για να εκτελεί εργασίες που είναι εντελώς περιττές για έναν μικροελεγκτή. Θυμηθείτε ότι οι μικροελεγκτές συνήθως προγραμματίζονται για να εκτελούν μία ή περισσότερες πολύ συγκεκριμένες εργασίες, σε αντίθεση με έναν γενικής χρήσης υπολογιστή όπως ένα PC ή Mac που πρέπει να υποστηρίζει ένα περιβάλλον χρήστη, να παίζει μουσική ή ταινίες, να παρέχει εργαλεία για τη συγγραφή εγγράφων ή κώδικα, να παίζει παιχνίδια ή να περιηγείται στο Διαδίκτυο. + +Για να προγραμματίσετε έναν μικροελεγκτή χωρίς OS χρειάζεστε κάποια εργαλεία που σας επιτρέπουν να δημιουργήσετε τον κώδικά σας με τρόπο που ο μικροελεγκτής μπορεί να εκτελέσει, χρησιμοποιώντας APIs που μπορούν να επικοινωνούν με οποιαδήποτε περιφερειακά. Κάθε μικροελεγκτής είναι διαφορετικός, οπότε οι κατασκευαστές συνήθως υποστηρίζουν τυπικές πλατφόρμες που σας επιτρέπουν να ακολουθήσετε μια τυπική 'συνταγή' για να δημιουργήσετε τον κώδικά σας και να τον εκτελέσετε σε οποιονδήποτε μικροελεγκτή που υποστηρίζει αυτήν την πλατφόρμα. + +Μπορείτε να προγραμματίσετε μικροελεγκτές χρησιμοποιώντας ένα OS - συχνά αναφερόμενο ως λειτουργικό σύστημα πραγματικού χρόνου (RTOS), καθώς αυτά έχουν σχεδιαστεί για να χειρίζονται την αποστολή δεδομένων προς και από περιφερειακά σε πραγματικό χρόνο. Αυτά τα λειτουργικά συστήματα είναι πολύ ελαφριά και παρέχουν χαρακτηριστικά όπως: + +* Πολυνηματική λειτουργία, που επιτρέπει στον κώδικά σας να εκτελεί περισσότερα από ένα μπλοκ κώδικα ταυτόχρονα, είτε σε πολλούς πυρήνες είτε εναλλάξ σε έναν πυρήνα +* Δικτύωση για ασφαλή επικοινωνία μέσω του Διαδικτύου +* Στοιχεία γραφικού περιβάλλοντος χρήστη (GUI) για τη δημιουργία περιβαλλόντων χρήστη (UI) σε συσκευές που διαθέτουν οθόνες. + +✅ Διαβάστε για διαφορετικά RTOS: [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 + +![Το λογότυπο του Arduino](../../../../../images/arduino-logo.svg) + +[Arduino](https://www.arduino.cc) είναι πιθανώς η πιο δημοφιλής πλατφόρμα μικροελεγκτών, ειδικά μεταξύ μαθητών, χομπιστών και δημιουργών. Το Arduino είναι μια πλατφόρμα ηλεκτρονικών ανοιχτού κώδικα που συνδυάζει λογισμικό και υλικό. Μπορείτε να αγοράσετε συμβατές πλακέτες Arduino από την ίδια την Arduino ή από άλλους κατασκευαστές και να προγραμματίσετε χρησιμοποιώντας την πλατφόρμα Arduino. + +Οι πλακέτες Arduino προγραμματίζονται σε C ή C++. Η χρήση της C/C++ επιτρέπει στον κώδικά σας να μεταγλωττίζεται πολύ μικρός και να εκτελείται γρήγορα, κάτι που είναι απαραίτητο σε μια περιορισμένη συσκευή όπως ένας μικροελεγκτής. Ο πυρήνας μιας εφαρμογής Arduino αναφέρεται ως sketch και είναι κώδικας C/C++ με 2 συναρτήσεις - `setup` και `loop`. Όταν η πλακέτα εκκινείται, ο κώδικας της πλατφόρμας Arduino θα εκτελέσει τη συνάρτηση `setup` μία φορά και στη συνέχεια θα εκτελέσει τη συνάρτηση `loop` ξανά και ξανά, εκτελώντας την συνεχώς μέχρι να απενεργοποιηθεί η τροφοδοσία. + +Θα γράφατε τον κώδικα αρχικοποίησης στη συνάρτηση `setup`, όπως η σύνδεση σε WiFi και υπηρεσίες cloud ή η αρχικοποίηση ακίδων για είσοδο και έξοδο. Ο κώδικας της συνάρτησης `loop` θα περιείχε κώδικα επεξεργασίας, όπως η ανάγνωση από έναν αισθητήρα και η αποστολή της τιμής στο cloud. Συνήθως θα περιλαμβάνατε μια καθυστέρηση σε κάθε βρόχο, για παράδειγμα, αν θέλετε μόνο δεδομένα αισθητήρα να αποστέλλονται κάθε 10 δευτερόλεπτα, θα προσθέτατε μια καθυστέρηση 10 δευτερολέπτων στο τέλος του βρόχου, ώστε ο μικροελεγκτής να κοιμάται, εξοικονομώντας ενέργεια, και στη συνέχεια να εκτελεί ξανά τον βρόχο όταν χρειάζεται 10 δευτερόλεπτα αργότερα. + +![Ένα sketch Arduino που εκτελεί πρώτα το setup και στη συνέχεια εκτελεί επανειλημμένα το loop](../../../../../translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.el.png) + +✅ Αυτή η αρχιτεκτονική προγράμματος είναι γνωστή ως *event loop* ή *message loop*. Πολλές εφαρμογές χρησιμοποιούν αυτό το μοντέλο και είναι το πρότυπο για τις περισσότερες εφαρμογές desktop που εκτελούνται σε λειτουργικά συστήματα όπως Windows, macOS ή Linux. Ο βρόχος `loop` ακούει για μηνύματα από στοιχεία περιβάλλοντος χρήστη όπως κουμπιά ή συσκευές όπως το πληκτρολόγιο και ανταποκρίνεται σε αυτά. Μπορείτε να διαβάσετε περισσότερα σε αυτό το [άρθρο για το event loop](https://wikipedia.org/wiki/Event_loop). + +Το Arduino παρέχει τυπικές βιβλιοθήκες για την αλληλεπίδραση με μικροελεγκτές και τις ακίδες I/O, με διαφορετικές υλοποιήσεις κάτω από την επιφάνεια για να εκτελούνται σε διαφορετικούς μικροελεγκτές. Για παράδειγμα, η συνάρτηση [`delay`](https://www.arduino.cc/reference/en/language/functions/time/delay/) θα σταματήσει το πρόγραμμα για μια δεδομένη χρονική περίοδο, η συνάρτηση [`digitalRead`](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/) θα διαβάσει μια τιμή `HIGH` ή `LOW` από τη δεδομένη ακίδα, ανεξάρτητα από την πλακέτα στην οποία εκτελείται ο κώδικας. Αυτές οι τυπικές βιβλιοθήκες σημαίνουν ότι ο κώδικας Arduino που γράφτηκε για μια πλακέτα μπορεί να μεταγλωττιστεί ξανά για οποιαδήποτε άλλη πλακέτα Arduino και να εκτελεστεί, υποθέτοντας ότι οι ακίδες είναι οι ίδιες και οι πλακέτες υποστηρίζουν τα ίδια χαρακτηριστικά. + +Υπάρχει ένα μεγάλο οικοσύστημα βιβλιοθηκών τρίτων για το Arduino που σας επιτρέπουν να προσθέσετε επιπλέον δυνατότητες στα έργα σας Arduino, όπως η χρήση αισθητήρων και ενεργοποιητών ή η σύνδεση σε υπηρεσίες IoT cloud. + +##### Εργασία + +Ερευνήστε το Wio Terminal. + +Αν χρησιμοποιείτε το Wio Terminal για αυτά τα μαθήματα, ξαναδιαβάστε τον κώδικα που γράψατε στο προηγούμενο μάθημα. Βρείτε τις συναρτήσεις `setup` και `loop`. Παρακολουθήστε την σειριακή έξοδο για την επαναλαμβανόμενη κλήση της συνάρτησης `loop`. Δοκιμάστε να προσθέσετε κώδικα στη συνάρτηση `setup` για να γράψετε στη σειριακή θύρα και παρατηρήστε ότι αυτός ο κώδικας καλείται μόνο μία φορά κάθε φορά που κάνετε επανεκκίνηση. Δοκιμάστε να επανεκκινήσετε τη συσκευή σας με τον διακόπτη τροφοδοσίας στο πλάι για να δείξετε ότι αυτό καλείται κάθε φορά που η συσκευή επανεκκινείται. + +## Βαθύτερη ανάλυση στους υπολογιστές μονού πίνακα + +Στο προηγούμενο μάθημα, παρουσιάσαμε τους υπολογιστές μονού πίνακα. Ας τους εξετάσουμε τώρα πιο βαθιά. + +### Raspberry Pi + +![Το λογότυπο του Raspberry Pi](../../../../../translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.el.png) + +Το [Raspberry Pi Foundation](https://www.raspberrypi.org) είναι ένας φιλανθρωπικός οργανισμός από το Ηνωμένο Βασίλειο που ιδρύθηκε το 2009 για να προωθήσει τη μελέτη της επιστήμης των υπολογιστών, ειδικά σε σχολικό επίπεδο. Στο πλαίσιο αυτής της αποστολής, ανέπτυξαν έναν υπολογιστή μονού πίνακα, που ονομάζεται Raspberry Pi. Τα Raspberry Pi είναι διαθέσιμα σε 3 παραλλαγές - μια πλήρους μεγέθους έκδοση, το μικρότερο Pi Zero, και μια μονάδα υπολογισμού που μπορεί να ενσωματωθεί στην τελική σας συσκευή IoT. + +![Ένα Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.el.jpg) + +Η τελευταία έκδοση του πλήρους μεγέθους Raspberry Pi είναι το Raspberry Pi 4B. Αυτό διαθέτει έναν τετραπύρηνο (4 πυρήνες) επεξεργαστή που λειτουργεί στα 1.5GHz, 2, 4 ή 8GB RAM, gigabit ethernet, WiFi, 2 θύρες HDMI που υποστηρίζουν οθόνες 4k, μια θύρα ήχου και σύνθετης εξόδου βίντεο, θύρες USB (2 USB 2.0, 2 USB 3.0), 40 ακίδες GPIO, έναν σύνδεσμο κάμερας για μια μονάδα κάμερας Raspberry Pi, και μια υποδοχή κάρτας SD. Όλα αυτά σε μια πλακέτα που είναι 88mm x 58mm x 19.5mm και τροφοδοτείται από μια τροφοδοσία USB-C 3A. Αυτά ξεκινούν από US$35, πολύ φθηνότερα από έναν υπολογιστή ή Mac. + +> 💁 Υπάρχει επίσης ένα Pi400, ένας υπολογιστής όλα σε ένα με ένα Pi4 ενσωματωμένο σε πληκτρολόγιο. + +![Ένα Raspberry Pi Zero](../../../../../translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.el.jpg) + +Το Pi Zero είναι πολύ μικρότερο, με χαμηλότερη ισχύ. Διαθέτει έναν μονοπύρηνο επεξεργαστή 1GHz, 512MB RAM, WiFi (στο μοντέλο Zero W), μια θύρα HDMI, μια θύρα micro-USB, 40 ακίδες GPIO, έναν σύνδεσμο κάμερας για μια μονάδα κάμερας Raspberry Pi, και μια υποδοχή κάρτας SD. Έχει διαστάσεις 65mm x 30mm x 5mm και καταναλώνει πολύ λίγη ενέργεια. Το Zero κοστίζει US$5, ενώ η έκδοση W με WiFi κοστίζει US$10. + +> 🎓 Οι επεξεργαστές και στα δύο αυτά είναι ARM, σε αντίθεση με τους επεξεργαστές Intel/AMD x86 ή x64 που βρίσκονται στους περισσότερους υπολογιστές και Mac. Αυτοί είναι παρόμοιοι με τους επεξεργαστές που βρίσκονται σε ορισμένους μικροελεγκτές, καθώς και σχεδόν σε όλα τα κινητά τηλέφωνα, το Microsoft Surface X και τους νέους υπολογιστές Mac με Apple Silicon. + +Όλες οι παραλλαγές του Raspberry Pi εκτελούν μια έκδοση του Debian Linux που ονομάζεται Raspberry Pi OS. Αυτό είναι διαθέσιμο ως lite έκδοση χωρίς desktop, που είναι ιδανική για 'headless' έργα όπου δεν χρειάζεστε οθόνη, ή μια πλήρη έκδοση με πλήρες περιβάλλον desktop, με πρόγραμμα περιήγησης ιστού, εφαρμογές γραφείου, εργαλεία προγραμματισμού και παιχνίδια. Δεδομένου ότι το OS είναι μια έκδοση του +### Χρήση μονοπλακέτων υπολογιστών σε επαγγελματικές αναπτύξεις IoT + +Οι μονοπλακέτοι υπολογιστές χρησιμοποιούνται για επαγγελματικές αναπτύξεις IoT, όχι μόνο ως κιτ ανάπτυξης. Μπορούν να προσφέρουν έναν ισχυρό τρόπο ελέγχου του υλικού και εκτέλεσης σύνθετων εργασιών, όπως η εκτέλεση μοντέλων μηχανικής μάθησης. Για παράδειγμα, υπάρχει το [Raspberry Pi 4 compute module](https://www.raspberrypi.org/blog/raspberry-pi-compute-module-4/) που παρέχει όλη τη δύναμη ενός Raspberry Pi 4, αλλά σε μια πιο συμπαγή και οικονομική μορφή χωρίς τα περισσότερα από τα θύρα, σχεδιασμένο για εγκατάσταση σε προσαρμοσμένο υλικό. + +--- + +## 🚀 Πρόκληση + +Η πρόκληση στο τελευταίο μάθημα ήταν να καταγράψετε όσο το δυνατόν περισσότερες IoT συσκευές που υπάρχουν στο σπίτι, το σχολείο ή τον χώρο εργασίας σας. Για κάθε συσκευή αυτής της λίστας, πιστεύετε ότι βασίζονται σε μικροελεγκτές, μονοπλακέτους υπολογιστές ή ακόμα και σε έναν συνδυασμό και των δύο; + +## Κουίζ μετά το μάθημα + +[Κουίζ μετά το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4) + +## Ανασκόπηση & Αυτομελέτη + +* Διαβάστε τον [οδηγό έναρξης Arduino](https://www.arduino.cc/en/Guide/Introduction) για να κατανοήσετε περισσότερα σχετικά με την πλατφόρμα Arduino. +* Διαβάστε την [εισαγωγή στο Raspberry Pi 4](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) για να μάθετε περισσότερα για τα Raspberry Pi. +* Μάθετε περισσότερα για κάποιες από τις έννοιες και τα ακρωνύμια στο άρθρο [What the FAQ are CPUs, MPUs, MCUs, and GPUs στο Electrical Engineering Journal](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/). + +✅ Χρησιμοποιήστε αυτούς τους οδηγούς, μαζί με τα κόστη που εμφανίζονται ακολουθώντας τους συνδέσμους στον [οδηγό υλικού](../../../hardware.md), για να αποφασίσετε ποια πλατφόρμα υλικού θέλετε να χρησιμοποιήσετε ή αν προτιμάτε να χρησιμοποιήσετε μια εικονική συσκευή. + +## Εργασία + +[Σύγκριση και αντίθεση μικροελεγκτών και μονοπλακέτων υπολογιστών](assignment.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/2-deeper-dive/assignment.md b/translations/el/1-getting-started/lessons/2-deeper-dive/assignment.md new file mode 100644 index 00000000..ab547ceb --- /dev/null +++ b/translations/el/1-getting-started/lessons/2-deeper-dive/assignment.md @@ -0,0 +1,26 @@ + +# Σύγκριση και αντίθεση μικροελεγκτών και υπολογιστών μονού πίνακα + +## Οδηγίες + +Αυτό το μάθημα κάλυψε τους μικροελεγκτές και τους υπολογιστές μονού πίνακα. Δημιουργήστε έναν πίνακα που να συγκρίνει και να αντιπαραβάλλει αυτά τα δύο, και σημειώστε τουλάχιστον 2 λόγους για τους οποίους θα χρησιμοποιούσατε έναν μικροελεγκτή αντί για έναν υπολογιστή μονού πίνακα, καθώς και τουλάχιστον 2 λόγους για τους οποίους θα χρησιμοποιούσατε έναν υπολογιστή μονού πίνακα αντί για έναν μικροελεγκτή. + +## Κριτήρια Αξιολόγησης + +| Κριτήρια | Άριστο | Επαρκές | Χρειάζεται Βελτίωση | +| -------- | ------- | -------- | ------------------- | +| Δημιουργία πίνακα που συγκρίνει μικροελεγκτές με υπολογιστές μονού πίνακα | Δημιουργήθηκε λίστα με πολλαπλά στοιχεία που συγκρίνουν και αντιπαραβάλλουν σωστά | Δημιουργήθηκε λίστα με μόνο λίγα στοιχεία | Δημιουργήθηκε μόνο ένα στοιχείο ή δεν υπήρξε σύγκριση και αντίθεση | +| Λόγοι για τη χρήση του ενός αντί του άλλου | Παρείχε 2 ή περισσότερους λόγους για τους μικροελεγκτές και 2 ή περισσότερους για τους υπολογιστές μονού πίνακα | Παρείχε μόνο 1-2 λόγους για έναν μικροελεγκτή και 1-2 λόγους για έναν υπολογιστή μονού πίνακα | Δεν παρείχε 1 ή περισσότερους λόγους για έναν μικροελεγκτή ή για έναν υπολογιστή μονού πίνακα | + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/3-sensors-and-actuators/README.md b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/README.md new file mode 100644 index 00000000..4145fe71 --- /dev/null +++ b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/README.md @@ -0,0 +1,200 @@ + +# Αλληλεπίδραση με τον φυσικό κόσμο μέσω αισθητήρων και ενεργοποιητών + +![Μια συνοπτική εικόνα αυτής της ενότητας](../../../../../translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.el.jpg) + +> Σχεδιαστικό σημείωμα από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +Αυτή η ενότητα διδάχθηκε ως μέρος της σειράς [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) από το [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Η ενότητα παρουσιάστηκε σε 2 βίντεο - ένα μάθημα διάρκειας 1 ώρας και μια ώρα γραφείου για πιο βαθιά ανάλυση και απαντήσεις σε ερωτήσεις. + +[![Ενότητα 3: Αλληλεπίδραση με τον Φυσικό Κόσμο μέσω Αισθητήρων και Ενεργοποιητών](https://img.youtube.com/vi/Lqalu1v6aF4/0.jpg)](https://youtu.be/Lqalu1v6aF4) + +[![Ενότητα 3: Αλληλεπίδραση με τον Φυσικό Κόσμο μέσω Αισθητήρων και Ενεργοποιητών - Ώρα γραφείου](https://img.youtube.com/vi/qR3ekcMlLWA/0.jpg)](https://youtu.be/qR3ekcMlLWA) + +> 🎥 Κάντε κλικ στις παραπάνω εικόνες για να παρακολουθήσετε τα βίντεο + +## Ερωτηματολόγιο πριν το μάθημα + +[Ερωτηματολόγιο πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5) + +## Εισαγωγή + +Αυτή η ενότητα εισάγει δύο σημαντικές έννοιες για τη συσκευή IoT σας - τους αισθητήρες και τους ενεργοποιητές. Θα ασχοληθείτε πρακτικά με αυτά, προσθέτοντας έναν αισθητήρα φωτός στο IoT πρότζεκτ σας και στη συνέχεια ένα LED που ελέγχεται από τα επίπεδα φωτός, δημιουργώντας ουσιαστικά ένα νυχτερινό φως. + +Σε αυτή την ενότητα θα καλύψουμε: + +* [Τι είναι οι αισθητήρες;](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Χρήση ενός αισθητήρα](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Τύποι αισθητήρων](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Τι είναι οι ενεργοποιητές;](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Χρήση ενός ενεργοποιητή](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Τύποι ενεργοποιητών](../../../../../1-getting-started/lessons/3-sensors-and-actuators) + +## Τι είναι οι αισθητήρες; + +Οι αισθητήρες είναι συσκευές υλικού που αντιλαμβάνονται τον φυσικό κόσμο - δηλαδή μετρούν μία ή περισσότερες ιδιότητες γύρω τους και στέλνουν την πληροφορία σε μια συσκευή IoT. Οι αισθητήρες καλύπτουν μια τεράστια γκάμα συσκευών, καθώς υπάρχουν τόσα πολλά πράγματα που μπορούν να μετρηθούν, από φυσικές ιδιότητες όπως η θερμοκρασία του αέρα έως φυσικές αλληλεπιδράσεις όπως η κίνηση. + +Μερικοί κοινοί αισθητήρες περιλαμβάνουν: + +* Αισθητήρες θερμοκρασίας - αυτοί αντιλαμβάνονται τη θερμοκρασία του αέρα ή τη θερμοκρασία του αντικειμένου στο οποίο είναι βυθισμένοι. Για χομπίστες και προγραμματιστές, συχνά συνδυάζονται με αισθητήρες πίεσης αέρα και υγρασίας σε μία συσκευή. +* Κουμπιά - αντιλαμβάνονται πότε έχουν πατηθεί. +* Αισθητήρες φωτός - ανιχνεύουν επίπεδα φωτός και μπορεί να είναι για συγκεκριμένα χρώματα, UV φως, IR φως ή γενικό ορατό φως. +* Κάμερες - αντιλαμβάνονται μια οπτική αναπαράσταση του κόσμου τραβώντας φωτογραφίες ή μεταδίδοντας βίντεο. +* Επιταχυνσιόμετρα - αντιλαμβάνονται κίνηση σε πολλαπλές κατευθύνσεις. +* Μικρόφωνα - αντιλαμβάνονται ήχο, είτε γενικά επίπεδα ήχου είτε κατευθυντικό ήχο. + +✅ Κάντε λίγη έρευνα. Τι αισθητήρες έχει το κινητό σας; + +Όλοι οι αισθητήρες έχουν ένα κοινό χαρακτηριστικό - μετατρέπουν αυτό που αντιλαμβάνονται σε ένα ηλεκτρικό σήμα που μπορεί να ερμηνευθεί από μια συσκευή IoT. Το πώς ερμηνεύεται αυτό το ηλεκτρικό σήμα εξαρτάται από τον αισθητήρα, καθώς και από το πρωτόκολλο επικοινωνίας που χρησιμοποιείται για την επικοινωνία με τη συσκευή IoT. + +## Χρήση ενός αισθητήρα + +Ακολουθήστε τον αντίστοιχο οδηγό παρακάτω για να προσθέσετε έναν αισθητήρα στη συσκευή IoT σας: + +* [Arduino - Wio Terminal](wio-terminal-sensor.md) +* [Υπολογιστής μονού πίνακα - Raspberry Pi](pi-sensor.md) +* [Υπολογιστής μονού πίνακα - Εικονική συσκευή](virtual-device-sensor.md) + +## Τύποι αισθητήρων + +Οι αισθητήρες είναι είτε αναλογικοί είτε ψηφιακοί. + +### Αναλογικοί αισθητήρες + +Μερικοί από τους πιο βασικούς αισθητήρες είναι οι αναλογικοί αισθητήρες. Αυτοί οι αισθητήρες λαμβάνουν μια τάση από τη συσκευή IoT, τα εξαρτήματα του αισθητήρα προσαρμόζουν αυτή την τάση και η τάση που επιστρέφεται από τον αισθητήρα μετριέται για να δώσει την τιμή του αισθητήρα. + +> 🎓 Η τάση είναι ένα μέτρο του πόση ώθηση υπάρχει για να μετακινηθεί η ηλεκτρική ενέργεια από ένα μέρος σε άλλο, όπως από τον θετικό πόλο μιας μπαταρίας στον αρνητικό πόλο. Για παράδειγμα, μια τυπική μπαταρία AA είναι 1.5V (V είναι το σύμβολο για τα βολτ) και μπορεί να ωθήσει την ηλεκτρική ενέργεια με δύναμη 1.5V από τον θετικό πόλο στον αρνητικό πόλο. Διαφορετικά ηλεκτρικά εξαρτήματα απαιτούν διαφορετικές τάσεις για να λειτουργήσουν, για παράδειγμα, ένα LED μπορεί να ανάψει με 2-3V, αλλά μια λάμπα πυρακτώσεως 100W θα χρειαστεί 240V. Μπορείτε να διαβάσετε περισσότερα για την τάση στη [σελίδα της Wikipedia για την τάση](https://wikipedia.org/wiki/Voltage). + +Ένα παράδειγμα αυτού είναι ένα ποτενσιόμετρο. Πρόκειται για έναν περιστροφικό διακόπτη που μπορείτε να γυρίσετε μεταξύ δύο θέσεων και ο αισθητήρας μετρά την περιστροφή. + +![Ένα ποτενσιόμετρο ρυθμισμένο σε μεσαίο σημείο που λαμβάνει 5 βολτ και επιστρέφει 3.8 βολτ](../../../../../translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.el.png) + +Η συσκευή IoT θα στείλει ένα ηλεκτρικό σήμα στο ποτενσιόμετρο με μια τάση, όπως 5 βολτ (5V). Καθώς το ποτενσιόμετρο ρυθμίζεται, αλλάζει την τάση που βγαίνει από την άλλη πλευρά. Φανταστείτε ότι έχετε ένα ποτενσιόμετρο με ετικέτα ως περιστροφικό διακόπτη που πηγαίνει από 0 έως [11](https://wikipedia.org/wiki/Up_to_eleven), όπως ένας διακόπτης έντασης σε έναν ενισχυτή. Όταν το ποτενσιόμετρο είναι στη θέση πλήρους απενεργοποίησης (0), τότε 0V (0 βολτ) θα βγαίνουν. Όταν είναι στη θέση πλήρους ενεργοποίησης (11), 5V (5 βολτ) θα βγαίνουν. + +> 🎓 Αυτή είναι μια υπεραπλούστευση, και μπορείτε να διαβάσετε περισσότερα για τα ποτενσιόμετρα και τις μεταβλητές αντιστάσεις στη [σελίδα της Wikipedia για το ποτενσιόμετρο](https://wikipedia.org/wiki/Potentiometer). + +Η τάση που βγαίνει από τον αισθητήρα διαβάζεται από τη συσκευή IoT και η συσκευή μπορεί να ανταποκριθεί σε αυτήν. Ανάλογα με τον αισθητήρα, αυτή η τάση μπορεί να είναι μια αυθαίρετη τιμή ή να αντιστοιχεί σε μια τυπική μονάδα. Για παράδειγμα, ένας αναλογικός αισθητήρας θερμοκρασίας βασισμένος σε έναν [θεμίστορα](https://wikipedia.org/wiki/Thermistor) αλλάζει την αντίστασή του ανάλογα με τη θερμοκρασία. Η τάση εξόδου μπορεί στη συνέχεια να μετατραπεί σε θερμοκρασία σε Kelvin, και αντίστοιχα σε °C ή °F, μέσω υπολογισμών στον κώδικα. + +✅ Τι πιστεύετε ότι συμβαίνει αν ο αισθητήρας επιστρέψει υψηλότερη τάση από αυτή που στάλθηκε (για παράδειγμα από μια εξωτερική πηγή ενέργειας); ⛔️ ΜΗΝ το δοκιμάσετε. + +#### Μετατροπή από αναλογικό σε ψηφιακό + +Οι συσκευές IoT είναι ψηφιακές - δεν μπορούν να λειτουργήσουν με αναλογικές τιμές, λειτουργούν μόνο με 0 και 1. Αυτό σημαίνει ότι οι αναλογικές τιμές αισθητήρων πρέπει να μετατραπούν σε ψηφιακό σήμα πριν μπορέσουν να επεξεργαστούν. Πολλές συσκευές IoT διαθέτουν μετατροπείς αναλογικού σε ψηφιακό (ADCs) για να μετατρέψουν τις αναλογικές εισόδους σε ψηφιακές αναπαραστάσεις της τιμής τους. Οι αισθητήρες μπορούν επίσης να λειτουργούν με ADCs μέσω μιας συνδετικής πλακέτας. Για παράδειγμα, στο οικοσύστημα Seeed Grove με ένα Raspberry Pi, οι αναλογικοί αισθητήρες συνδέονται σε συγκεκριμένες θύρες σε ένα 'hat' που κάθεται πάνω στο Pi συνδεδεμένο στις ακίδες GPIO του Pi, και αυτό το hat διαθέτει ADC για να μετατρέψει την τάση σε ψηφιακό σήμα που μπορεί να σταλεί από τις ακίδες GPIO του Pi. + +Φανταστείτε ότι έχετε έναν αναλογικό αισθητήρα φωτός συνδεδεμένο σε μια συσκευή IoT που χρησιμοποιεί 3.3V και επιστρέφει μια τιμή 1V. Αυτή η τιμή 1V δεν σημαίνει τίποτα στον ψηφιακό κόσμο, οπότε πρέπει να μετατραπεί. Η τάση θα μετατραπεί σε αναλογική τιμή χρησιμοποιώντας μια κλίμακα ανάλογα με τη συσκευή και τον αισθητήρα. Ένα παράδειγμα είναι ο αισθητήρας φωτός Seeed Grove που εξάγει τιμές από 0 έως 1,023. Για αυτόν τον αισθητήρα που λειτουργεί στα 3.3V, μια έξοδος 1V θα ήταν μια τιμή 300. Μια συσκευή IoT δεν μπορεί να χειριστεί το 300 ως αναλογική τιμή, οπότε η τιμή θα μετατραπεί σε `0000000100101100`, τη δυαδική αναπαράσταση του 300 από το Grove hat. Αυτό στη συνέχεια θα επεξεργαστεί από τη συσκευή IoT. + +✅ Αν δεν γνωρίζετε τη δυαδική αναπαράσταση, κάντε λίγη έρευνα για να μάθετε πώς οι αριθμοί αναπαρίστανται με 0 και 1. Το [μάθημα εισαγωγής στη δυαδική αναπαράσταση από το BBC Bitesize](https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1) είναι ένα εξαιρετικό σημείο εκκίνησης. + +Από την πλευρά του προγραμματισμού, όλα αυτά συνήθως χειρίζονται από βιβλιοθήκες που συνοδεύουν τους αισθητήρες, οπότε δεν χρειάζεται να ανησυχείτε για αυτή τη μετατροπή μόνοι σας. Για τον αισθητήρα φωτός Grove, θα χρησιμοποιούσατε τη βιβλιοθήκη Python και θα καλούσατε την ιδιότητα `light`, ή τη βιβλιοθήκη Arduino και θα καλούσατε τη `analogRead` για να λάβετε μια τιμή 300. + +### Ψηφιακοί αισθητήρες + +Οι ψηφιακοί αισθητήρες, όπως οι αναλογικοί αισθητήρες, ανιχνεύουν τον κόσμο γύρω τους χρησιμοποιώντας αλλαγές στην ηλεκτρική τάση. Η διαφορά είναι ότι εξάγουν ένα ψηφιακό σήμα, είτε μετρώντας μόνο δύο καταστάσεις είτε χρησιμοποιώντας έναν ενσωματωμένο ADC. Οι ψηφιακοί αισθητήρες γίνονται όλο και πιο συνηθισμένοι για να αποφεύγεται η ανάγκη χρήσης ADC είτε σε μια συνδετική πλακέτα είτε στη συσκευή IoT. + +Ο απλούστερος ψηφιακός αισθητήρας είναι ένα κουμπί ή ένας διακόπτης. Πρόκειται για έναν αισθητήρα με δύο καταστάσεις, ενεργοποιημένο ή απενεργοποιημένο. + +![Ένα κουμπί λαμβάνει 5 βολτ. Όταν δεν πατιέται επιστρέφει 0 βολτ, όταν πατιέται επιστρέφει 5 βολτ](../../../../../translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.el.png) + +Οι ακίδες σε συσκευές IoT όπως οι ακίδες GPIO μπορούν να μετρήσουν αυτό το σήμα απευθείας ως 0 ή 1. Αν η τάση που στάλθηκε είναι ίδια με την τάση που επιστρέφεται, η τιμή που διαβάζεται είναι 1, διαφορετικά η τιμή που διαβάζεται είναι 0. Δεν υπάρχει ανάγκη για μετατροπή του σήματος, μπορεί να είναι μόνο 1 ή 0. + +> 💁 Οι τάσεις δεν είναι ποτέ ακριβείς, ειδικά καθώς τα εξαρτήματα σε έναν αισθητήρα θα έχουν κάποια αντίσταση, οπότε υπάρχει συνήθως μια ανοχή. Για παράδειγμα, οι ακίδες GPIO σε ένα Raspberry Pi λειτουργούν στα 3.3V και διαβάζουν ένα σήμα επιστροφής πάνω από 1.8V ως 1, κάτω από 1.8V ως 0. + +* 3.3V εισέρχονται στο κουμπί. Το κουμπί είναι απενεργοποιημένο, οπότε 0V βγαίνουν, δίνοντας μια τιμή 0 +* 3.3V εισέρχονται στο κουμπί. Το κουμπί είναι ενεργοποιημένο, οπότε 3.3V βγαίνουν, δίνοντας μια τιμή 1 + +Πιο προηγμένοι ψηφιακοί αισθητήρες διαβάζουν αναλογικές τιμές και στη συνέχεια τις μετατρέπουν χρησιμοποιώντας ενσωματωμένους ADC σε ψηφιακά σήματα. Για παράδειγμα, ένας ψηφιακός αισθητήρας θερμοκρασίας θα εξακολουθεί να χρησιμοποιεί ένα θερμοζεύγος με τον ίδιο τρόπο όπως ένας αναλογικός αισθητήρας και θα εξακολουθεί να μετρά την αλλαγή στην τάση που προκαλείται από την αντίσταση του θερμοζεύγους στη τρέχουσα θερμοκρασία. Αντί να επιστρέφει μια αναλογική τιμή και να βασίζεται στη συσκευή ή στη συνδετική πλακέτα για να τη μετατρέψει σε ψηφιακό σήμα, ένας ADC ενσωματωμένος στον αισθητήρα θα μετατρέψει την τιμή και θα την στείλει ως μια σειρά από 0 και 1 στη συσκευή IoT. Αυτά τα 0 και 1 στέλνονται με τον ίδιο τρόπο όπως το ψηφιακό σήμα για ένα κουμπί, με το 1 να είναι πλήρης τάση και το 0 να είναι 0V. + +![Ένας ψηφιακός αισθητήρας θερμοκρασίας που μετατρέπει μια αναλογική μέτρηση σε δυαδικά δεδομένα με 0 ως 0 βολτ και 1 ως 5 βολτ πριν τα στείλει σε μια συσκευή IoT](../../../../../translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.el.png) + +Η αποστολή ψηφιακών δεδομένων επιτρέπει στους αισθητήρες να γίνονται πιο περίπλοκοι και να στέλνουν πιο λεπτομερή δεδομένα, ακόμη και κρυπτογραφημένα δεδομένα για ασφαλείς αισθητήρες. Ένα παράδειγμα είναι μια κάμερα. Πρόκειται για έναν αισθητήρα που καταγράφει μια εικόνα και την στέλνει ως ψηφιακά δεδομένα που περιέχουν αυτή την εικόνα, συνήθως σε συμπιεσμένη μορφή όπως JPEG, για να διαβαστεί από τη συσκευή IoT. Μπορεί ακόμη και να μεταδίδει βίντεο καταγράφοντας εικόνες και στέλνοντας είτε την πλήρη εικόνα καρέ-καρέ είτε μια συμπιεσμένη ροή βίντεο. + +## Τι είναι οι ενεργοποιητές; + +Οι ενεργοποιητές είναι το αντίθετο των αισθητήρων - μετατρέπουν ένα ηλεκτρικό σή +![Ένα φως που είναι χαμηλής έντασης σε χαμηλή τάση και πιο φωτεινό σε υψηλή τάση](../../../../../translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.el.png) + +Όπως και με τους αισθητήρες, η πραγματική συσκευή IoT λειτουργεί με ψηφιακά σήματα, όχι αναλογικά. Αυτό σημαίνει ότι για να στείλει ένα αναλογικό σήμα, η συσκευή IoT χρειάζεται έναν μετατροπέα ψηφιακού σε αναλογικό σήμα (DAC), είτε απευθείας στη συσκευή IoT είτε σε μια πλακέτα σύνδεσης. Αυτός ο μετατροπέας μετατρέπει τα 0 και 1 της συσκευής IoT σε αναλογική τάση που μπορεί να χρησιμοποιήσει ο ενεργοποιητής. + +✅ Τι πιστεύετε ότι θα συμβεί αν η συσκευή IoT στείλει υψηλότερη τάση από αυτή που μπορεί να διαχειριστεί ο ενεργοποιητής; +⛔️ ΜΗΝ το δοκιμάσετε. + +#### Διαμόρφωση πλάτους παλμού (Pulse-Width Modulation) + +Μια άλλη επιλογή για τη μετατροπή ψηφιακών σημάτων από μια συσκευή IoT σε αναλογικό σήμα είναι η διαμόρφωση πλάτους παλμού (PWM). Αυτό περιλαμβάνει την αποστολή πολλών σύντομων ψηφιακών παλμών που λειτουργούν σαν να ήταν αναλογικό σήμα. + +Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το PWM για να ελέγξετε την ταχύτητα ενός κινητήρα. + +Φανταστείτε ότι ελέγχετε έναν κινητήρα με παροχή 5V. Στέλνετε έναν σύντομο παλμό στον κινητήρα σας, ενεργοποιώντας την τάση στα 5V για δύο εκατοστά του δευτερολέπτου (0,02s). Σε αυτό το διάστημα, ο κινητήρας μπορεί να περιστραφεί κατά ένα δέκατο της περιστροφής, ή 36°. Το σήμα στη συνέχεια διακόπτεται για δύο εκατοστά του δευτερολέπτου (0,02s), στέλνοντας ένα χαμηλό σήμα (0V). Κάθε κύκλος ενεργοποίησης και απενεργοποίησης διαρκεί 0,04s. Ο κύκλος επαναλαμβάνεται. + +![Διαμόρφωση πλάτους παλμού περιστροφής κινητήρα στις 150 RPM](../../../../../translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.el.png) + +Αυτό σημαίνει ότι σε ένα δευτερόλεπτο έχετε 25 παλμούς των 5V διάρκειας 0,02s που περιστρέφουν τον κινητήρα, καθένας ακολουθούμενος από παύση 0,02s στα 0V που δεν περιστρέφει τον κινητήρα. Κάθε παλμός περιστρέφει τον κινητήρα κατά ένα δέκατο της περιστροφής, που σημαίνει ότι ο κινητήρας ολοκληρώνει 2,5 περιστροφές ανά δευτερόλεπτο. Έχετε χρησιμοποιήσει ένα ψηφιακό σήμα για να περιστρέψετε τον κινητήρα με 2,5 περιστροφές ανά δευτερόλεπτο ή 150 [περιστροφές ανά λεπτό](https://wikipedia.org/wiki/Revolutions_per_minute) (μια μη τυπική μονάδα μέτρησης της ταχύτητας περιστροφής). + +```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 +``` + +> 🎓 Όταν ένα σήμα PWM είναι ενεργό για το μισό χρόνο και ανενεργό για το άλλο μισό, αναφέρεται ως [κύκλος λειτουργίας 50%](https://wikipedia.org/wiki/Duty_cycle). Οι κύκλοι λειτουργίας μετρώνται ως το ποσοστό του χρόνου που το σήμα βρίσκεται σε κατάσταση ενεργοποίησης σε σύγκριση με την κατάσταση απενεργοποίησης. + +![Διαμόρφωση πλάτους παλμού περιστροφής κινητήρα στις 75 RPM](../../../../../translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.el.png) + +Μπορείτε να αλλάξετε την ταχύτητα του κινητήρα αλλάζοντας το μέγεθος των παλμών. Για παράδειγμα, με τον ίδιο κινητήρα μπορείτε να διατηρήσετε τον ίδιο χρόνο κύκλου 0,04s, με τον παλμό ενεργοποίησης να μειώνεται στο μισό (0,01s) και τον παλμό απενεργοποίησης να αυξάνεται σε 0,03s. Έχετε τον ίδιο αριθμό παλμών ανά δευτερόλεπτο (25), αλλά κάθε παλμός ενεργοποίησης έχει τη μισή διάρκεια. Ένας παλμός με μισή διάρκεια περιστρέφει τον κινητήρα κατά ένα εικοστό της περιστροφής, και με 25 παλμούς ανά δευτερόλεπτο θα ολοκληρώσει 1,25 περιστροφές ανά δευτερόλεπτο ή 75rpm. Αλλάζοντας την ταχύτητα των παλμών ενός ψηφιακού σήματος, έχετε μειώσει στο μισό την ταχύτητα ενός αναλογικού κινητήρα. + +```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 +``` + +✅ Πώς θα διατηρούσατε την περιστροφή του κινητήρα ομαλή, ειδικά σε χαμηλές ταχύτητες; Θα χρησιμοποιούσατε μικρό αριθμό μακρών παλμών με μεγάλες παύσεις ή πολλούς πολύ σύντομους παλμούς με πολύ σύντομες παύσεις; + +> 💁 Ορισμένοι αισθητήρες χρησιμοποιούν επίσης PWM για να μετατρέψουν αναλογικά σήματα σε ψηφιακά. + +> 🎓 Μπορείτε να διαβάσετε περισσότερα για τη διαμόρφωση πλάτους παλμού στη [σελίδα της Wikipedia για τη διαμόρφωση πλάτους παλμού](https://wikipedia.org/wiki/Pulse-width_modulation). + +### Ψηφιακοί ενεργοποιητές + +Οι ψηφιακοί ενεργοποιητές, όπως και οι ψηφιακοί αισθητήρες, είτε έχουν δύο καταστάσεις που ελέγχονται από υψηλή ή χαμηλή τάση είτε έχουν ενσωματωμένο DAC ώστε να μπορούν να μετατρέψουν ένα ψηφιακό σήμα σε αναλογικό. + +Ένας απλός ψηφιακός ενεργοποιητής είναι ένα LED. Όταν μια συσκευή στέλνει ένα ψηφιακό σήμα 1, στέλνεται μια υψηλή τάση που ανάβει το LED. Όταν στέλνεται ένα ψηφιακό σήμα 0, η τάση πέφτει στα 0V και το LED σβήνει. + +![Ένα LED είναι σβηστό στα 0V και αναμμένο στα 5V](../../../../../translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.el.png) + +✅ Ποιοι άλλοι απλοί ενεργοποιητές δύο καταστάσεων μπορείτε να σκεφτείτε; Ένα παράδειγμα είναι ένας ηλεκτρομαγνήτης (solenoid), ο οποίος μπορεί να ενεργοποιηθεί για να κάνει πράγματα όπως να μετακινήσει έναν σύρτη πόρτας για να κλειδώσει/ξεκλειδώσει μια πόρτα. + +Πιο προηγμένοι ψηφιακοί ενεργοποιητές, όπως οι οθόνες, απαιτούν τα ψηφιακά δεδομένα να αποστέλλονται σε συγκεκριμένες μορφές. Συνήθως συνοδεύονται από βιβλιοθήκες που διευκολύνουν την αποστολή των σωστών δεδομένων για τον έλεγχό τους. + +--- + +## 🚀 Πρόκληση + +Η πρόκληση στις δύο τελευταίες ενότητες ήταν να καταγράψετε όσες περισσότερες συσκευές IoT μπορείτε που βρίσκονται στο σπίτι, το σχολείο ή τον χώρο εργασίας σας και να αποφασίσετε αν είναι βασισμένες σε μικροελεγκτές ή σε υπολογιστές μονού πίνακα ή ακόμα και σε συνδυασμό και των δύο. + +Για κάθε συσκευή που καταγράψατε, ποιοι αισθητήρες και ενεργοποιητές είναι συνδεδεμένοι σε αυτές; Ποιος είναι ο σκοπός κάθε αισθητήρα και ενεργοποιητή που είναι συνδεδεμένος σε αυτές τις συσκευές; + +## Κουίζ μετά το μάθημα + +[Κουίζ μετά το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6) + +## Ανασκόπηση & Αυτομελέτη + +* Διαβάστε για τον ηλεκτρισμό και τα κυκλώματα στο [ThingLearn](http://thinglearn.jenlooper.com/curriculum/). +* Διαβάστε για τους διαφορετικούς τύπους αισθητήρων θερμοκρασίας στον [οδηγό αισθητήρων θερμοκρασίας του Seeed Studios](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/). +* Διαβάστε για τα LED στη [σελίδα της Wikipedia για τα LED](https://wikipedia.org/wiki/Light-emitting_diode). + +## Εργασία + +[Έρευνα για αισθητήρες και ενεργοποιητές](assignment.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/3-sensors-and-actuators/assignment.md b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/assignment.md new file mode 100644 index 00000000..70b61fbd --- /dev/null +++ b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/assignment.md @@ -0,0 +1,31 @@ + +# Έρευνα αισθητήρων και ενεργοποιητών + +## Οδηγίες + +Αυτό το μάθημα κάλυψε τους αισθητήρες και τους ενεργοποιητές. Ερευνήστε και περιγράψτε έναν αισθητήρα και έναν ενεργοποιητή που μπορούν να χρησιμοποιηθούν με ένα IoT dev kit, συμπεριλαμβανομένων: + +* Τι κάνει +* Τα ηλεκτρονικά/υλικό που χρησιμοποιούνται στο εσωτερικό του +* Αν είναι αναλογικός ή ψηφιακός +* Ποια είναι οι μονάδες και το εύρος εισόδων ή μετρήσεων + +## Κριτήρια Αξιολόγησης + +| Κριτήρια | Εξαιρετικό | Επαρκές | Χρειάζεται Βελτίωση | +| -------- | ---------- | -------- | ------------------- | +| Περιγραφή αισθητήρα | Περιγράφηκε ένας αισθητήρας με λεπτομέρειες για όλες τις 4 ενότητες που αναφέρονται παραπάνω. | Περιγράφηκε ένας αισθητήρας, αλλά δόθηκαν λεπτομέρειες μόνο για 2-3 από τις παραπάνω ενότητες. | Περιγράφηκε ένας αισθητήρας, αλλά δόθηκαν λεπτομέρειες μόνο για 1 από τις παραπάνω ενότητες. | +| Περιγραφή ενεργοποιητή | Περιγράφηκε ένας ενεργοποιητής με λεπτομέρειες για όλες τις 4 ενότητες που αναφέρονται παραπάνω. | Περιγράφηκε ένας ενεργοποιητής, αλλά δόθηκαν λεπτομέρειες μόνο για 2-3 από τις παραπάνω ενότητες. | Περιγράφηκε ένας ενεργοποιητής, αλλά δόθηκαν λεπτομέρειες μόνο για 1 από τις παραπάνω ενότητες. | + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md new file mode 100644 index 00000000..6ae89491 --- /dev/null +++ b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md @@ -0,0 +1,130 @@ + +# Κατασκευή φωτιστικού νυκτός - Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε ένα LED στο Raspberry Pi σας και θα το χρησιμοποιήσετε για να δημιουργήσετε ένα φωτιστικό νυκτός. + +## Υλικό + +Το φωτιστικό νυκτός χρειάζεται τώρα έναν ενεργοποιητή. + +Ο ενεργοποιητής είναι ένα **LED**, μια [δίοδος εκπομπής φωτός](https://wikipedia.org/wiki/Light-emitting_diode) που εκπέμπει φως όταν περνάει ρεύμα μέσα από αυτήν. Πρόκειται για έναν ψηφιακό ενεργοποιητή που έχει δύο καταστάσεις, ενεργοποιημένο και απενεργοποιημένο. Στέλνοντας μια τιμή 1, το LED ενεργοποιείται, ενώ με τιμή 0 απενεργοποιείται. Το LED είναι ένας εξωτερικός ενεργοποιητής Grove και πρέπει να συνδεθεί στο Grove Base hat του Raspberry Pi. + +Η λογική του φωτιστικού νυκτός σε ψευδοκώδικα είναι: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Σύνδεση του LED + +Το Grove LED έρχεται ως μονάδα με μια επιλογή από LEDs, επιτρέποντάς σας να επιλέξετε το χρώμα. + +#### Εργασία - σύνδεση του LED + +Συνδέστε το LED. + +![Ένα Grove LED](../../../../../translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.el.png) + +1. Επιλέξτε το αγαπημένο σας LED και εισάγετε τα ποδαράκια του στις δύο τρύπες της μονάδας LED. + + Τα LEDs είναι διόδοι εκπομπής φωτός, και οι διόδοι είναι ηλεκτρονικές συσκευές που μπορούν να μεταφέρουν ρεύμα μόνο προς μία κατεύθυνση. Αυτό σημαίνει ότι το LED πρέπει να συνδεθεί με τη σωστή φορά, διαφορετικά δεν θα λειτουργήσει. + + Ένα από τα ποδαράκια του LED είναι η θετική ακίδα, ενώ το άλλο είναι η αρνητική ακίδα. Το LED δεν είναι τέλεια στρογγυλό και είναι ελαφρώς πιο επίπεδο από τη μία πλευρά. Η ελαφρώς πιο επίπεδη πλευρά είναι η αρνητική ακίδα. Όταν συνδέετε το LED στη μονάδα, βεβαιωθείτε ότι η ακίδα από την στρογγυλεμένη πλευρά συνδέεται στην υποδοχή που είναι σημειωμένη με **+** στην εξωτερική πλευρά της μονάδας, και η επίπεδη πλευρά συνδέεται στην υποδοχή πιο κοντά στο κέντρο της μονάδας. + +1. Η μονάδα LED διαθέτει ένα περιστροφικό κουμπί που σας επιτρέπει να ελέγχετε τη φωτεινότητα. Γυρίστε το όλο προς τα πάνω αρχικά, περιστρέφοντάς το αντίθετα από τη φορά των δεικτών του ρολογιού όσο πάει, χρησιμοποιώντας ένα μικρό κατσαβίδι Phillips. + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή της μονάδας LED. Θα μπει μόνο με μία συγκεκριμένη φορά. + +1. Με το Raspberry Pi απενεργοποιημένο, συνδέστε το άλλο άκρο του καλωδίου Grove στην ψηφιακή υποδοχή σημειωμένη ως **D5** στο Grove Base hat που είναι συνδεδεμένο στο Pi. Αυτή η υποδοχή είναι η δεύτερη από τα αριστερά, στη σειρά των υποδοχών δίπλα στις ακίδες GPIO. + +![Το Grove LED συνδεδεμένο στην υποδοχή D5](../../../../../translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.el.png) + +## Προγραμματισμός του φωτιστικού νυκτός + +Το φωτιστικό νυκτός μπορεί τώρα να προγραμματιστεί χρησιμοποιώντας τον αισθητήρα φωτός Grove και το Grove LED. + +### Εργασία - προγραμματισμός του φωτιστικού νυκτός + +Προγραμματίστε το φωτιστικό νυκτός. + +1. Ενεργοποιήστε το Pi και περιμένετε να εκκινήσει. + +1. Ανοίξτε το project του φωτιστικού νυκτός στο VS Code που δημιουργήσατε στο προηγούμενο μέρος αυτής της εργασίας, είτε τρέχοντας απευθείας στο Pi είτε συνδεδεμένοι μέσω της επέκτασης Remote SSH. + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py` για να εισάγετε μια απαιτούμενη βιβλιοθήκη. Αυτό πρέπει να προστεθεί στην κορυφή, κάτω από τις άλλες γραμμές `import`. + + ```python + from grove.grove_led import GroveLed + ``` + + Η δήλωση `from grove.grove_led import GroveLed` εισάγει το `GroveLed` από τις βιβλιοθήκες Python του Grove. Αυτή η βιβλιοθήκη περιέχει κώδικα για την αλληλεπίδραση με ένα Grove LED. + +1. Προσθέστε τον παρακάτω κώδικα μετά τη δήλωση `light_sensor` για να δημιουργήσετε μια παρουσία της κλάσης που διαχειρίζεται το LED: + + ```python + led = GroveLed(5) + ``` + + Η γραμμή `led = GroveLed(5)` δημιουργεί μια παρουσία της κλάσης `GroveLed` συνδέοντας στην ακίδα **D5** - την ψηφιακή ακίδα Grove στην οποία είναι συνδεδεμένο το LED. + + > 💁 Όλες οι υποδοχές έχουν μοναδικούς αριθμούς ακίδων. Οι ακίδες 0, 2, 4 και 6 είναι αναλογικές ακίδες, ενώ οι ακίδες 5, 16, 18, 22, 24 και 26 είναι ψηφιακές ακίδες. + +1. Προσθέστε έναν έλεγχο μέσα στη `while` loop, και πριν από το `time.sleep` για να ελέγξετε τα επίπεδα φωτός και να ενεργοποιήσετε ή να απενεργοποιήσετε το LED: + + ```python + if light < 300: + led.on() + else: + led.off() + ``` + + Αυτός ο κώδικας ελέγχει την τιμή `light`. Αν αυτή είναι μικρότερη από 300, καλεί τη μέθοδο `on` της κλάσης `GroveLed`, η οποία στέλνει μια ψηφιακή τιμή 1 στο LED, ενεργοποιώντας το. Αν η τιμή φωτός είναι μεγαλύτερη ή ίση με 300, καλεί τη μέθοδο `off`, στέλνοντας μια ψηφιακή τιμή 0 στο LED, απενεργοποιώντας το. + + > 💁 Αυτός ο κώδικας πρέπει να είναι εσοχή στο ίδιο επίπεδο με τη γραμμή `print('Light level:', light)` για να βρίσκεται μέσα στη while loop! + + > 💁 Όταν στέλνετε ψηφιακές τιμές σε ενεργοποιητές, μια τιμή 0 είναι 0V, και μια τιμή 1 είναι η μέγιστη τάση για τη συσκευή. Για το Raspberry Pi με αισθητήρες και ενεργοποιητές Grove, η τάση 1 είναι 3.3V. + +1. Από το Terminal του VS Code, τρέξτε το παρακάτω για να εκτελέσετε την εφαρμογή Python: + + ```sh + python3 app.py + ``` + + Οι τιμές φωτός θα εμφανιστούν στην κονσόλα. + + ```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. Καλύψτε και αποκαλύψτε τον αισθητήρα φωτός. Παρατηρήστε πώς το LED θα ανάψει αν το επίπεδο φωτός είναι 300 ή λιγότερο, και θα σβήσει όταν το επίπεδο φωτός είναι μεγαλύτερο από 300. + + > 💁 Αν το LED δεν ανάψει, βεβαιωθείτε ότι είναι συνδεδεμένο με τη σωστή φορά και ότι το περιστροφικό κουμπί είναι ρυθμισμένο στο μέγιστο. + +![Το LED συνδεδεμένο στο Pi που ανάβει και σβήνει καθώς αλλάζει το επίπεδο φωτός](../../../../../images/pi-running-assignment-1-1.gif) + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-actuator/pi](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/pi). + +😀 Το πρόγραμμα του φωτιστικού νυκτός σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md new file mode 100644 index 00000000..1df7eab2 --- /dev/null +++ b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md @@ -0,0 +1,110 @@ + +# Κατασκευή νυχτερινού φωτός - Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν αισθητήρα φωτός στο Raspberry Pi σας. + +## Υλικό + +Ο αισθητήρας για αυτό το μάθημα είναι ένας **αισθητήρας φωτός** που χρησιμοποιεί μια [φωτοδίοδο](https://wikipedia.org/wiki/Photodiode) για να μετατρέψει το φως σε ηλεκτρικό σήμα. Πρόκειται για έναν αναλογικό αισθητήρα που στέλνει μια ακέραια τιμή από 0 έως 1.000, υποδεικνύοντας μια σχετική ποσότητα φωτός που δεν αντιστοιχεί σε καμία τυπική μονάδα μέτρησης όπως το [lux](https://wikipedia.org/wiki/Lux). + +Ο αισθητήρας φωτός είναι ένας εξωτερικός αισθητήρας Grove και πρέπει να συνδεθεί στο Grove Base hat του Raspberry Pi. + +### Σύνδεση του αισθητήρα φωτός + +Ο αισθητήρας φωτός Grove που χρησιμοποιείται για την ανίχνευση των επιπέδων φωτός πρέπει να συνδεθεί στο Raspberry Pi. + +#### Εργασία - σύνδεση του αισθητήρα φωτός + +Συνδέστε τον αισθητήρα φωτός. + +![Αισθητήρας φωτός Grove](../../../../../translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.el.png) + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του αισθητήρα φωτός. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. + +1. Με το Raspberry Pi απενεργοποιημένο, συνδέστε το άλλο άκρο του καλωδίου Grove στην αναλογική υποδοχή με την ένδειξη **A0** στο Grove Base hat που είναι συνδεδεμένο στο Pi. Αυτή η υποδοχή είναι η δεύτερη από δεξιά, στη σειρά των υποδοχών δίπλα στις ακίδες GPIO. + +![Ο αισθητήρας φωτός Grove συνδεδεμένος στην υποδοχή A0](../../../../../translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.el.png) + +## Προγραμματισμός του αισθητήρα φωτός + +Η συσκευή μπορεί τώρα να προγραμματιστεί χρησιμοποιώντας τον αισθητήρα φωτός Grove. + +### Εργασία - προγραμματισμός του αισθητήρα φωτός + +Προγραμματίστε τη συσκευή. + +1. Ενεργοποιήστε το Pi και περιμένετε να εκκινήσει. + +1. Ανοίξτε το έργο νυχτερινού φωτός στο VS Code που δημιουργήσατε στο προηγούμενο μέρος αυτής της εργασίας, είτε εκτελείται απευθείας στο Pi είτε συνδέεται χρησιμοποιώντας την επέκταση Remote SSH. + +1. Ανοίξτε το αρχείο `app.py` και αφαιρέστε όλο τον κώδικα από αυτό. + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py` για να εισάγετε κάποιες απαιτούμενες βιβλιοθήκες: + + ```python + import time + from grove.grove_light_sensor_v1_2 import GroveLightSensor + ``` + + Η δήλωση `import time` εισάγει τη μονάδα `time` που θα χρησιμοποιηθεί αργότερα σε αυτή την εργασία. + + Η δήλωση `from grove.grove_light_sensor_v1_2 import GroveLightSensor` εισάγει τον `GroveLightSensor` από τις βιβλιοθήκες Python του Grove. Αυτή η βιβλιοθήκη περιέχει κώδικα για την αλληλεπίδραση με έναν αισθητήρα φωτός Grove και εγκαταστάθηκε παγκοσμίως κατά τη ρύθμιση του Pi. + +1. Προσθέστε τον παρακάτω κώδικα μετά τον παραπάνω κώδικα για να δημιουργήσετε μια παρουσία της κλάσης που διαχειρίζεται τον αισθητήρα φωτός: + + ```python + light_sensor = GroveLightSensor(0) + ``` + + Η γραμμή `light_sensor = GroveLightSensor(0)` δημιουργεί μια παρουσία της κλάσης `GroveLightSensor` συνδέοντας στην ακίδα **A0** - την αναλογική ακίδα Grove στην οποία είναι συνδεδεμένος ο αισθητήρας φωτός. + +1. Προσθέστε έναν άπειρο βρόχο μετά τον παραπάνω κώδικα για να ελέγχετε την τιμή του αισθητήρα φωτός και να την εκτυπώνετε στην κονσόλα: + + ```python + while True: + light = light_sensor.light + print('Light level:', light) + ``` + + Αυτό θα διαβάσει το τρέχον επίπεδο φωτός σε κλίμακα από 0-1.023 χρησιμοποιώντας την ιδιότητα `light` της κλάσης `GroveLightSensor`. Αυτή η ιδιότητα διαβάζει την αναλογική τιμή από την ακίδα. Αυτή η τιμή στη συνέχεια εκτυπώνεται στην κονσόλα. + +1. Προσθέστε μια μικρή παύση ενός δευτερολέπτου στο τέλος του `loop`, καθώς τα επίπεδα φωτός δεν χρειάζεται να ελέγχονται συνεχώς. Μια παύση μειώνει την κατανάλωση ενέργειας της συσκευής. + + ```python + time.sleep(1) + ``` + +1. Από το τερματικό του VS Code, εκτελέστε την ακόλουθη εντολή για να εκτελέσετε την εφαρμογή Python: + + ```sh + python3 app.py + ``` + + Οι τιμές φωτός θα εμφανιστούν στην κονσόλα. Καλύψτε και αποκαλύψτε τον αισθητήρα φωτός και οι τιμές θα αλλάξουν: + + ```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 + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-sensor/pi](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/pi). + +😀 Η προσθήκη ενός αισθητήρα στο πρόγραμμα νυχτερινού φωτός σας ήταν επιτυχής! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md new file mode 100644 index 00000000..48776e7e --- /dev/null +++ b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md @@ -0,0 +1,124 @@ + +# Κατασκευή νυχτερινού φωτισμού - Εικονικό IoT Υλικό + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε ένα LED στη εικονική IoT συσκευή σας και θα το χρησιμοποιήσετε για να δημιουργήσετε έναν νυχτερινό φωτισμό. + +## Εικονικό Υλικό + +Ο νυχτερινός φωτισμός χρειάζεται έναν ενεργοποιητή, που δημιουργείται στην εφαρμογή CounterFit. + +Ο ενεργοποιητής είναι ένα **LED**. Σε μια φυσική IoT συσκευή, θα ήταν μια [δίοδος εκπομπής φωτός](https://wikipedia.org/wiki/Light-emitting_diode) που εκπέμπει φως όταν περνάει ρεύμα μέσα από αυτή. Πρόκειται για έναν ψηφιακό ενεργοποιητή που έχει 2 καταστάσεις, ενεργοποιημένο και απενεργοποιημένο. Στέλνοντας μια τιμή 1 ενεργοποιείται το LED, ενώ η τιμή 0 το απενεργοποιεί. + +Η λογική του νυχτερινού φωτισμού σε ψευδοκώδικα είναι: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Προσθήκη του ενεργοποιητή στο CounterFit + +Για να χρησιμοποιήσετε ένα εικονικό LED, πρέπει να το προσθέσετε στην εφαρμογή CounterFit. + +#### Εργασία - προσθήκη του ενεργοποιητή στο CounterFit + +Προσθέστε το LED στην εφαρμογή CounterFit. + +1. Βεβαιωθείτε ότι η διαδικτυακή εφαρμογή CounterFit λειτουργεί από το προηγούμενο μέρος αυτής της εργασίας. Αν όχι, ξεκινήστε την και προσθέστε ξανά τον αισθητήρα φωτός. + +1. Δημιουργήστε ένα LED: + + 1. Στο πλαίσιο *Create actuator* στον πίνακα *Actuator*, ανοίξτε το αναπτυσσόμενο μενού *Actuator type* και επιλέξτε *LED*. + + 1. Ορίστε το *Pin* σε *5*. + + 1. Επιλέξτε το κουμπί **Add** για να δημιουργήσετε το LED στο Pin 5. + + ![Οι ρυθμίσεις του LED](../../../../../translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.el.png) + + Το LED θα δημιουργηθεί και θα εμφανιστεί στη λίστα των ενεργοποιητών. + + ![Το LED δημιουργήθηκε](../../../../../translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.el.png) + + Αφού δημιουργηθεί το LED, μπορείτε να αλλάξετε το χρώμα χρησιμοποιώντας τον επιλογέα *Color*. Επιλέξτε το κουμπί **Set** για να αλλάξετε το χρώμα αφού το επιλέξετε. + +### Προγραμματισμός του νυχτερινού φωτισμού + +Ο νυχτερινός φωτισμός μπορεί τώρα να προγραμματιστεί χρησιμοποιώντας τον αισθητήρα φωτός και το LED του CounterFit. + +#### Εργασία - προγραμματισμός του νυχτερινού φωτισμού + +Προγραμματίστε τον νυχτερινό φωτισμό. + +1. Ανοίξτε το έργο νυχτερινού φωτισμού στο VS Code που δημιουργήσατε στο προηγούμενο μέρος αυτής της εργασίας. Τερματίστε και δημιουργήστε ξανά το τερματικό για να βεβαιωθείτε ότι λειτουργεί χρησιμοποιώντας το εικονικό περιβάλλον, αν χρειάζεται. + +1. Ανοίξτε το αρχείο `app.py`. + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py` για να εισάγετε μια απαιτούμενη βιβλιοθήκη. Αυτό πρέπει να προστεθεί στην κορυφή, κάτω από τις άλλες γραμμές `import`. + + ```python + from counterfit_shims_grove.grove_led import GroveLed + ``` + + Η δήλωση `from counterfit_shims_grove.grove_led import GroveLed` εισάγει το `GroveLed` από τις βιβλιοθήκες Python του CounterFit Grove shim. Αυτή η βιβλιοθήκη περιέχει κώδικα για την αλληλεπίδραση με ένα LED που δημιουργήθηκε στην εφαρμογή CounterFit. + +1. Προσθέστε τον παρακάτω κώδικα μετά τη δήλωση `light_sensor` για να δημιουργήσετε μια παρουσία της κλάσης που διαχειρίζεται το LED: + + ```python + led = GroveLed(5) + ``` + + Η γραμμή `led = GroveLed(5)` δημιουργεί μια παρουσία της κλάσης `GroveLed` συνδέοντας στο pin **5** - το pin του CounterFit Grove στο οποίο είναι συνδεδεμένο το LED. + +1. Προσθέστε έναν έλεγχο μέσα στη `while` loop, και πριν από το `time.sleep` για να ελέγξετε τα επίπεδα φωτός και να ενεργοποιήσετε ή να απενεργοποιήσετε το LED: + + ```python + if light < 300: + led.on() + else: + led.off() + ``` + + Αυτός ο κώδικας ελέγχει την τιμή `light`. Αν αυτή είναι μικρότερη από 300, καλεί τη μέθοδο `on` της κλάσης `GroveLed`, η οποία στέλνει μια ψηφιακή τιμή 1 στο LED, ενεργοποιώντας το. Αν η τιμή του φωτός είναι μεγαλύτερη ή ίση με 300, καλεί τη μέθοδο `off`, στέλνοντας μια ψηφιακή τιμή 0 στο LED, απενεργοποιώντας το. + + > 💁 Αυτός ο κώδικας πρέπει να είναι εσοχή στο ίδιο επίπεδο με τη γραμμή `print('Light level:', light)` για να βρίσκεται μέσα στη while loop! + +1. Από το τερματικό του VS Code, εκτελέστε την παρακάτω εντολή για να εκτελέσετε την εφαρμογή Python: + + ```sh + python3 app.py + ``` + + Οι τιμές φωτός θα εμφανιστούν στην κονσόλα. + + ```output + (.venv) ➜ GroveTest python3 app.py + Light level: 143 + Light level: 244 + Light level: 246 + Light level: 253 + ``` + +1. Αλλάξτε τις ρυθμίσεις *Value* ή *Random* για να μεταβάλετε το επίπεδο φωτός πάνω και κάτω από το 300. Το LED θα ενεργοποιείται και απενεργοποιείται. + +![Το LED στην εφαρμογή CounterFit ενεργοποιείται και απενεργοποιείται καθώς αλλάζει το επίπεδο φωτός](../../../../../images/virtual-device-running-assignment-1-1.gif) + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-actuator/virtual-device](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/virtual-device). + +😀 Το πρόγραμμα του νυχτερινού φωτισμού σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md new file mode 100644 index 00000000..2c55f2c5 --- /dev/null +++ b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md @@ -0,0 +1,124 @@ + +# Δημιουργία ενός νυχτερινού φωτιστικού - Εικονικό IoT Υλικό + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν αισθητήρα φωτός στη συσκευή IoT σας. + +## Εικονικό Υλικό + +Το νυχτερινό φωτιστικό χρειάζεται έναν αισθητήρα, ο οποίος δημιουργείται στην εφαρμογή CounterFit. + +Ο αισθητήρας είναι ένας **αισθητήρας φωτός**. Σε μια φυσική συσκευή IoT, θα ήταν μια [φωτοδίοδος](https://wikipedia.org/wiki/Photodiode) που μετατρέπει το φως σε ηλεκτρικό σήμα. Οι αισθητήρες φωτός είναι αναλογικοί αισθητήρες που στέλνουν μια ακέραια τιμή που υποδεικνύει μια σχετική ποσότητα φωτός, η οποία δεν αντιστοιχεί σε κάποια τυποποιημένη μονάδα μέτρησης όπως το [lux](https://wikipedia.org/wiki/Lux). + +### Προσθήκη των αισθητήρων στο CounterFit + +Για να χρησιμοποιήσετε έναν εικονικό αισθητήρα φωτός, πρέπει να τον προσθέσετε στην εφαρμογή CounterFit. + +#### Εργασία - προσθήκη των αισθητήρων στο CounterFit + +Προσθέστε τον αισθητήρα φωτός στην εφαρμογή CounterFit. + +1. Βεβαιωθείτε ότι η διαδικτυακή εφαρμογή CounterFit εκτελείται από το προηγούμενο μέρος αυτής της άσκησης. Αν όχι, ξεκινήστε την. + +1. Δημιουργήστε έναν αισθητήρα φωτός: + + 1. Στο πλαίσιο *Create sensor* στον πίνακα *Sensors*, ανοίξτε το αναπτυσσόμενο μενού *Sensor type* και επιλέξτε *Light*. + + 1. Αφήστε τη ρύθμιση *Units* ως *NoUnits*. + + 1. Βεβαιωθείτε ότι το *Pin* είναι ρυθμισμένο στο *0*. + + 1. Επιλέξτε το κουμπί **Add** για να δημιουργήσετε τον αισθητήρα φωτός στο Pin 0. + + ![Οι ρυθμίσεις του αισθητήρα φωτός](../../../../../translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.el.png) + + Ο αισθητήρας φωτός θα δημιουργηθεί και θα εμφανιστεί στη λίστα των αισθητήρων. + + ![Ο αισθητήρας φωτός δημιουργήθηκε](../../../../../translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.el.png) + +## Προγραμματισμός του αισθητήρα φωτός + +Η συσκευή μπορεί τώρα να προγραμματιστεί για να χρησιμοποιεί τον ενσωματωμένο αισθητήρα φωτός. + +### Εργασία - προγραμματισμός του αισθητήρα φωτός + +Προγραμματίστε τη συσκευή. + +1. Ανοίξτε το έργο του νυχτερινού φωτιστικού στο VS Code που δημιουργήσατε στο προηγούμενο μέρος αυτής της άσκησης. Τερματίστε και επανεκκινήστε το τερματικό για να βεβαιωθείτε ότι εκτελείται χρησιμοποιώντας το εικονικό περιβάλλον, αν χρειάζεται. + +1. Ανοίξτε το αρχείο `app.py`. + +1. Προσθέστε τον παρακάτω κώδικα στην κορυφή του αρχείου `app.py` μαζί με τις υπόλοιπες δηλώσεις `import` για να εισάγετε τις απαιτούμενες βιβλιοθήκες: + + ```python + import time + from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor + ``` + + Η δήλωση `import time` εισάγει τη μονάδα `time` της Python, η οποία θα χρησιμοποιηθεί αργότερα σε αυτή την άσκηση. + + Η δήλωση `from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor` εισάγει την κλάση `GroveLightSensor` από τις βιβλιοθήκες Python CounterFit Grove shim. Αυτή η βιβλιοθήκη περιέχει κώδικα για την αλληλεπίδραση με έναν αισθητήρα φωτός που δημιουργήθηκε στην εφαρμογή CounterFit. + +1. Προσθέστε τον παρακάτω κώδικα στο τέλος του αρχείου για να δημιουργήσετε στιγμιότυπα κλάσεων που διαχειρίζονται τον αισθητήρα φωτός: + + ```python + light_sensor = GroveLightSensor(0) + ``` + + Η γραμμή `light_sensor = GroveLightSensor(0)` δημιουργεί ένα στιγμιότυπο της κλάσης `GroveLightSensor` συνδέοντας το στο pin **0** - το CounterFit Grove pin στο οποίο είναι συνδεδεμένος ο αισθητήρας φωτός. + +1. Προσθέστε έναν ατέρμονο βρόχο μετά τον παραπάνω κώδικα για να διαβάζει την τιμή του αισθητήρα φωτός και να την εμφανίζει στην κονσόλα: + + ```python + while True: + light = light_sensor.light + print('Light level:', light) + ``` + + Αυτό θα διαβάσει το τρέχον επίπεδο φωτός χρησιμοποιώντας την ιδιότητα `light` της κλάσης `GroveLightSensor`. Αυτή η ιδιότητα διαβάζει την αναλογική τιμή από το pin. Αυτή η τιμή στη συνέχεια εμφανίζεται στην κονσόλα. + +1. Προσθέστε μια μικρή παύση ενός δευτερολέπτου στο τέλος του βρόχου `while`, καθώς τα επίπεδα φωτός δεν χρειάζεται να ελέγχονται συνεχώς. Μια παύση μειώνει την κατανάλωση ενέργειας της συσκευής. + + ```python + time.sleep(1) + ``` + +1. Από το Τερματικό του VS Code, εκτελέστε την παρακάτω εντολή για να εκτελέσετε την εφαρμογή Python: + + ```sh + python3 app.py + ``` + + Οι τιμές φωτός θα εμφανιστούν στην κονσόλα. Αρχικά, αυτή η τιμή θα είναι 0. + +1. Από την εφαρμογή CounterFit, αλλάξτε την τιμή του αισθητήρα φωτός που θα διαβάζεται από την εφαρμογή. Μπορείτε να το κάνετε αυτό με δύο τρόπους: + + * Εισάγετε έναν αριθμό στο πλαίσιο *Value* του αισθητήρα φωτός και στη συνέχεια επιλέξτε το κουμπί **Set**. Ο αριθμός που εισάγετε θα είναι η τιμή που επιστρέφει ο αισθητήρας. + + * Επιλέξτε το πλαίσιο *Random* και εισάγετε μια τιμή *Min* και *Max*, στη συνέχεια επιλέξτε το κουμπί **Set**. Κάθε φορά που ο αισθητήρας διαβάζει μια τιμή, θα διαβάζει έναν τυχαίο αριθμό μεταξύ *Min* και *Max*. + + Οι τιμές που ορίζετε θα εμφανίζονται στην κονσόλα. Αλλάξτε την *Value* ή τις ρυθμίσεις *Random* για να αλλάξετε την τιμή. + + ```output + (.venv) ➜ GroveTest python3 app.py + Light level: 143 + Light level: 244 + Light level: 246 + Light level: 253 + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-sensor/virtual-device](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/virtual-device). + +😀 Το πρόγραμμα του νυχτερινού φωτιστικού σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md new file mode 100644 index 00000000..1b297919 --- /dev/null +++ b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md @@ -0,0 +1,124 @@ + +# Κατασκευή φωτάκι νυκτός - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε ένα LED στο Wio Terminal σας και θα το χρησιμοποιήσετε για να δημιουργήσετε ένα φωτάκι νυκτός. + +## Υλικό + +Το φωτάκι νυκτός χρειάζεται τώρα έναν ενεργοποιητή. + +Ο ενεργοποιητής είναι ένα **LED**, μια [δίοδος εκπομπής φωτός](https://wikipedia.org/wiki/Light-emitting_diode) που εκπέμπει φως όταν περνάει ρεύμα μέσα από αυτή. Πρόκειται για έναν ψηφιακό ενεργοποιητή που έχει δύο καταστάσεις, ενεργοποιημένο και απενεργοποιημένο. Στέλνοντας μια τιμή 1 ενεργοποιείται το LED, ενώ με τιμή 0 απενεργοποιείται. Αυτός είναι ένας εξωτερικός ενεργοποιητής Grove που πρέπει να συνδεθεί στο Wio Terminal. + +Η λογική του φωτακιού νυκτός σε ψευδοκώδικα είναι: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Σύνδεση του LED + +Το Grove LED έρχεται ως μονάδα με μια επιλογή από LEDs, επιτρέποντάς σας να επιλέξετε το χρώμα. + +#### Εργασία - σύνδεση του LED + +Συνδέστε το LED. + +![Ένα Grove LED](../../../../../translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.el.png) + +1. Επιλέξτε το αγαπημένο σας LED και εισάγετε τα ποδαράκια του στις δύο τρύπες της μονάδας LED. + + Τα LEDs είναι διόδοι εκπομπής φωτός, και οι διόδοι είναι ηλεκτρονικές συσκευές που μπορούν να μεταφέρουν ρεύμα μόνο προς μία κατεύθυνση. Αυτό σημαίνει ότι το LED πρέπει να συνδεθεί σωστά, αλλιώς δεν θα λειτουργήσει. + + Ένα από τα ποδαράκια του LED είναι η θετική ακίδα, ενώ το άλλο είναι η αρνητική ακίδα. Το LED δεν είναι τέλεια στρογγυλό και είναι ελαφρώς πιο επίπεδο από τη μία πλευρά. Η ελαφρώς πιο επίπεδη πλευρά είναι η αρνητική ακίδα. Όταν συνδέετε το LED στη μονάδα, βεβαιωθείτε ότι η ακίδα από την στρογγυλεμένη πλευρά συνδέεται στην υποδοχή που είναι σημειωμένη με **+** στην εξωτερική πλευρά της μονάδας, και η επίπεδη πλευρά συνδέεται στην υποδοχή πιο κοντά στο κέντρο της μονάδας. + +1. Η μονάδα LED διαθέτει ένα περιστροφικό κουμπί που σας επιτρέπει να ελέγχετε τη φωτεινότητα. Γυρίστε το όλο προς τα πάνω αρχικά, περιστρέφοντάς το αντίθετα από τη φορά των δεικτών του ρολογιού όσο πάει, χρησιμοποιώντας ένα μικρό κατσαβίδι Phillips. + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή της μονάδας LED. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. + +1. Με το Wio Terminal αποσυνδεδεμένο από τον υπολογιστή σας ή άλλη πηγή ενέργειας, συνδέστε το άλλο άκρο του καλωδίου Grove στην δεξιά υποδοχή Grove του Wio Terminal, όπως κοιτάτε την οθόνη. Αυτή είναι η υποδοχή που βρίσκεται πιο μακριά από το κουμπί ενεργοποίησης. + + > 💁 Η δεξιά υποδοχή Grove μπορεί να χρησιμοποιηθεί με αναλογικούς ή ψηφιακούς αισθητήρες και ενεργοποιητές. Η αριστερή υποδοχή είναι για I2C και ψηφιακούς αισθητήρες και ενεργοποιητές μόνο. Το I2C θα καλυφθεί σε επόμενο μάθημα. + +![Το Grove LED συνδεδεμένο στη δεξιά υποδοχή](../../../../../translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.el.png) + +## Προγραμματισμός του φωτακιού νυκτός + +Το φωτάκι νυκτός μπορεί τώρα να προγραμματιστεί χρησιμοποιώντας τον ενσωματωμένο αισθητήρα φωτός και το Grove LED. + +### Εργασία - προγραμματισμός του φωτακιού νυκτός + +Προγραμματίστε το φωτάκι νυκτός. + +1. Ανοίξτε το project του φωτακιού νυκτός στο VS Code που δημιουργήσατε στο προηγούμενο μέρος αυτής της εργασίας. + +1. Προσθέστε την παρακάτω γραμμή στο τέλος της συνάρτησης `setup`: + + ```cpp + pinMode(D0, OUTPUT); + ``` + + Αυτή η γραμμή διαμορφώνει την ακίδα που χρησιμοποιείται για την επικοινωνία με το LED μέσω της θύρας Grove. + + Η ακίδα `D0` είναι η ψηφιακή ακίδα για τη δεξιά υποδοχή Grove. Αυτή η ακίδα ορίζεται ως `OUTPUT`, που σημαίνει ότι συνδέεται με έναν ενεργοποιητή και δεδομένα θα γραφτούν στην ακίδα. + +1. Προσθέστε τον παρακάτω κώδικα αμέσως πριν από την `delay` στη συνάρτηση loop: + + ```cpp + if (light < 300) + { + digitalWrite(D0, HIGH); + } + else + { + digitalWrite(D0, LOW); + } + ``` + + Αυτός ο κώδικας ελέγχει την τιμή `light`. Αν αυτή είναι μικρότερη από 300, στέλνει μια τιμή `HIGH` στην ψηφιακή ακίδα `D0`. Αυτή η τιμή `HIGH` είναι 1, ενεργοποιώντας το LED. Αν η τιμή του φωτός είναι μεγαλύτερη ή ίση με 300, στέλνεται μια τιμή `LOW` 0 στην ακίδα, απενεργοποιώντας το LED. + + > 💁 Όταν στέλνετε ψηφιακές τιμές σε ενεργοποιητές, μια τιμή LOW είναι 0v, και μια τιμή HIGH είναι η μέγιστη τάση για τη συσκευή. Για το Wio Terminal, η τάση HIGH είναι 3.3V. + +1. Επανασυνδέστε το Wio Terminal στον υπολογιστή σας και ανεβάστε τον νέο κώδικα όπως κάνατε πριν. + +1. Συνδέστε το Serial Monitor. Οι τιμές φωτός θα εμφανίζονται στο τερματικό. + + ```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. Καλύψτε και αποκαλύψτε τον αισθητήρα φωτός. Παρατηρήστε πώς το LED θα ανάψει αν το επίπεδο φωτός είναι 300 ή λιγότερο, και θα σβήσει όταν το επίπεδο φωτός είναι μεγαλύτερο από 300. + +![Το LED συνδεδεμένο στο WIO ενεργοποιείται και απενεργοποιείται καθώς αλλάζει το επίπεδο φωτός](../../../../../images/wio-running-assignment-1-1.gif) + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-actuator/wio-terminal](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/wio-terminal). + +😀 Το πρόγραμμα του φωτακιού νυκτός ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md new file mode 100644 index 00000000..0331ea64 --- /dev/null +++ b/translations/el/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md @@ -0,0 +1,87 @@ + +# Προσθήκη αισθητήρα - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα χρησιμοποιήσετε τον αισθητήρα φωτός στο Wio Terminal σας. + +## Υλικό + +Ο αισθητήρας για αυτό το μάθημα είναι ένας **αισθητήρας φωτός** που χρησιμοποιεί μια [φωτοδίοδο](https://wikipedia.org/wiki/Photodiode) για να μετατρέπει το φως σε ηλεκτρικό σήμα. Πρόκειται για έναν αναλογικό αισθητήρα που στέλνει μια ακέραια τιμή από 0 έως 1.023, υποδεικνύοντας μια σχετική ποσότητα φωτός που δεν αντιστοιχεί σε καμία τυπική μονάδα μέτρησης, όπως το [lux](https://wikipedia.org/wiki/Lux). + +Ο αισθητήρας φωτός είναι ενσωματωμένος στο Wio Terminal και είναι ορατός μέσα από το διαφανές πλαστικό παράθυρο στο πίσω μέρος. + +![Ο αισθητήρας φωτός στο πίσω μέρος του Wio Terminal](../../../../../translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.el.png) + +## Προγραμματισμός του αισθητήρα φωτός + +Η συσκευή μπορεί τώρα να προγραμματιστεί για να χρησιμοποιεί τον ενσωματωμένο αισθητήρα φωτός. + +### Εργασία + +Προγραμματίστε τη συσκευή. + +1. Ανοίξτε το έργο nightlight στο VS Code που δημιουργήσατε στο προηγούμενο μέρος αυτής της άσκησης. + +1. Προσθέστε την παρακάτω γραμμή στο τέλος της συνάρτησης `setup`: + + ```cpp + pinMode(WIO_LIGHT, INPUT); + ``` + + Αυτή η γραμμή διαμορφώνει τις ακίδες που χρησιμοποιούνται για την επικοινωνία με το υλικό του αισθητήρα. + + Η ακίδα `WIO_LIGHT` είναι ο αριθμός της ακίδας GPIO που συνδέεται με τον ενσωματωμένο αισθητήρα φωτός. Αυτή η ακίδα ορίζεται ως `INPUT`, που σημαίνει ότι συνδέεται με έναν αισθητήρα και δεδομένα θα διαβάζονται από την ακίδα. + +1. Διαγράψτε τα περιεχόμενα της συνάρτησης `loop`. + +1. Προσθέστε τον παρακάτω κώδικα στη τώρα κενή συνάρτηση `loop`. + + ```cpp + int light = analogRead(WIO_LIGHT); + Serial.print("Light value: "); + Serial.println(light); + ``` + + Αυτός ο κώδικας διαβάζει μια αναλογική τιμή από την ακίδα `WIO_LIGHT`. Διαβάζει μια τιμή από 0-1.023 από τον ενσωματωμένο αισθητήρα φωτός. Αυτή η τιμή στη συνέχεια αποστέλλεται στη σειριακή θύρα, ώστε να μπορείτε να τη διαβάσετε στο Serial Monitor όταν εκτελείται αυτός ο κώδικας. Η εντολή `Serial.print` γράφει το κείμενο χωρίς νέα γραμμή στο τέλος, έτσι κάθε γραμμή θα ξεκινά με `Light value:` και θα τελειώνει με την πραγματική τιμή φωτός. + +1. Προσθέστε μια μικρή καθυστέρηση ενός δευτερολέπτου (1.000ms) στο τέλος της `loop`, καθώς τα επίπεδα φωτός δεν χρειάζεται να ελέγχονται συνεχώς. Μια καθυστέρηση μειώνει την κατανάλωση ενέργειας της συσκευής. + + ```cpp + delay(1000); + ``` + +1. Επανασυνδέστε το Wio Terminal στον υπολογιστή σας και ανεβάστε τον νέο κώδικα όπως κάνατε προηγουμένως. + +1. Συνδέστε το Serial Monitor. Οι τιμές φωτός θα εμφανίζονται στο τερματικό. Καλύψτε και αποκαλύψτε τον αισθητήρα φωτός στο πίσω μέρος του Wio Terminal, και οι τιμές θα αλλάξουν. + + ```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 + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-sensor/wio-terminal](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/wio-terminal). + +😀 Η προσθήκη ενός αισθητήρα στο πρόγραμμα nightlight σας ήταν επιτυχής! + +--- + +**Αποποίηση Ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/4-connect-internet/README.md b/translations/el/1-getting-started/lessons/4-connect-internet/README.md new file mode 100644 index 00000000..21c59c2d --- /dev/null +++ b/translations/el/1-getting-started/lessons/4-connect-internet/README.md @@ -0,0 +1,413 @@ + +# Συνδέστε τη συσκευή σας στο Διαδίκτυο + +![Μια σκίτσο-σημείωση για αυτήν την ενότητα](../../../../../translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.el.jpg) + +> Σκίτσο-σημείωση από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +Αυτή η ενότητα διδάχθηκε ως μέρος της σειράς [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) από το [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Η ενότητα παρουσιάστηκε σε 2 βίντεο - ένα μάθημα διάρκειας 1 ώρας και μία ώρα γραφείου για βαθύτερη ανάλυση και απαντήσεις σε ερωτήσεις. + +[![Μάθημα 4: Συνδέστε τη συσκευή σας στο Διαδίκτυο](https://img.youtube.com/vi/O4dd172mZhs/0.jpg)](https://youtu.be/O4dd172mZhs) + +[![Μάθημα 4: Συνδέστε τη συσκευή σας στο Διαδίκτυο - Ώρες γραφείου](https://img.youtube.com/vi/j-cVCzRDE2Q/0.jpg)](https://youtu.be/j-cVCzRDE2Q) + +> 🎥 Κάντε κλικ στις παραπάνω εικόνες για να παρακολουθήσετε τα βίντεο + +## Ερωτηματολόγιο πριν το μάθημα + +[Ερωτηματολόγιο πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/7) + +## Εισαγωγή + +Το **I** στο IoT σημαίνει **Internet** - η συνδεσιμότητα στο cloud και οι υπηρεσίες που επιτρέπουν πολλές από τις λειτουργίες των συσκευών IoT, από τη συλλογή μετρήσεων από τους αισθητήρες που είναι συνδεδεμένοι στη συσκευή, μέχρι την αποστολή μηνυμάτων για τον έλεγχο των ενεργοποιητών. Οι συσκευές IoT συνήθως συνδέονται σε μία υπηρεσία IoT στο cloud χρησιμοποιώντας ένα πρότυπο πρωτόκολλο επικοινωνίας, και αυτή η υπηρεσία συνδέεται με την υπόλοιπη εφαρμογή IoT σας, από υπηρεσίες AI για έξυπνες αποφάσεις σχετικά με τα δεδομένα σας, μέχρι εφαρμογές ιστού για έλεγχο ή αναφορές. + +> 🎓 Τα δεδομένα που συλλέγονται από αισθητήρες και αποστέλλονται στο cloud ονομάζονται τηλεμετρία. + +Οι συσκευές IoT μπορούν να λαμβάνουν μηνύματα από το cloud. Συχνά, αυτά τα μηνύματα περιέχουν εντολές - δηλαδή οδηγίες για την εκτέλεση μιας ενέργειας είτε εσωτερικά (όπως επανεκκίνηση ή ενημέρωση λογισμικού), είτε μέσω ενός ενεργοποιητή (όπως το άναμμα ενός φωτός). + +Αυτή η ενότητα εισάγει ορισμένα από τα πρωτόκολλα επικοινωνίας που μπορούν να χρησιμοποιήσουν οι συσκευές IoT για να συνδεθούν στο cloud, καθώς και τους τύπους δεδομένων που μπορεί να στείλουν ή να λάβουν. Θα ασχοληθείτε πρακτικά με αυτά, προσθέτοντας έλεγχο μέσω Διαδικτύου στο νυχτερινό σας φως, μεταφέροντας τη λογική ελέγχου του LED σε κώδικα 'server' που εκτελείται τοπικά. + +Σε αυτή την ενότητα θα καλύψουμε: + +* [Πρωτόκολλα επικοινωνίας](../../../../../1-getting-started/lessons/4-connect-internet) +* [Message Queueing Telemetry Transport (MQTT)](../../../../../1-getting-started/lessons/4-connect-internet) +* [Τηλεμετρία](../../../../../1-getting-started/lessons/4-connect-internet) +* [Εντολές](../../../../../1-getting-started/lessons/4-connect-internet) + +## Πρωτόκολλα επικοινωνίας + +Υπάρχουν αρκετά δημοφιλή πρωτόκολλα επικοινωνίας που χρησιμοποιούν οι συσκευές IoT για να επικοινωνούν με το Διαδίκτυο. Τα πιο δημοφιλή βασίζονται σε μηνύματα δημοσίευσης/εγγραφής μέσω κάποιου είδους broker. Οι συσκευές IoT συνδέονται στον broker και δημοσιεύουν τηλεμετρία και εγγράφονται σε εντολές. Οι υπηρεσίες cloud επίσης συνδέονται στον broker και εγγράφονται σε όλα τα μηνύματα τηλεμετρίας και δημοσιεύουν εντολές είτε σε συγκεκριμένες συσκευές, είτε σε ομάδες συσκευών. + +![Οι συσκευές IoT συνδέονται σε έναν broker και δημοσιεύουν τηλεμετρία και εγγράφονται σε εντολές. Οι υπηρεσίες cloud συνδέονται στον broker και εγγράφονται σε όλη την τηλεμετρία και στέλνουν εντολές σε συγκεκριμένες συσκευές.](../../../../../translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.el.png) + +Το MQTT είναι το πιο δημοφιλές πρωτόκολλο επικοινωνίας για συσκευές IoT και καλύπτεται σε αυτή την ενότητα. Άλλα πρωτόκολλα περιλαμβάνουν τα AMQP και HTTP/HTTPS. + +## Message Queueing Telemetry Transport (MQTT) + +[MQTT](http://mqtt.org) είναι ένα ελαφρύ, ανοιχτό πρότυπο πρωτόκολλο ανταλλαγής μηνυμάτων που μπορεί να στέλνει μηνύματα μεταξύ συσκευών. Σχεδιάστηκε το 1999 για την παρακολούθηση αγωγών πετρελαίου, πριν κυκλοφορήσει ως ανοιχτό πρότυπο 15 χρόνια αργότερα από την IBM. + +Το MQTT έχει έναν broker και πολλούς πελάτες. Όλοι οι πελάτες συνδέονται στον broker, και ο broker δρομολογεί μηνύματα στους σχετικούς πελάτες. Τα μηνύματα δρομολογούνται χρησιμοποιώντας ονομασμένα θέματα (topics), αντί να αποστέλλονται απευθείας σε έναν συγκεκριμένο πελάτη. Ένας πελάτης μπορεί να δημοσιεύσει σε ένα θέμα, και οποιοσδήποτε πελάτης εγγραφεί σε αυτό το θέμα θα λάβει το μήνυμα. + +![Συσκευή IoT που δημοσιεύει τηλεμετρία στο θέμα /telemetry, και η υπηρεσία cloud εγγράφεται σε αυτό το θέμα](../../../../../translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.el.png) + +✅ Κάντε έρευνα. Εάν έχετε πολλές συσκευές IoT, πώς μπορείτε να διασφαλίσετε ότι ο broker MQTT μπορεί να διαχειριστεί όλα τα μηνύματα; + +### Συνδέστε τη συσκευή IoT σας στο MQTT + +Το πρώτο βήμα για την προσθήκη ελέγχου μέσω Διαδικτύου στο νυχτερινό σας φως είναι η σύνδεσή του σε έναν broker MQTT. + +#### Εργασία + +Συνδέστε τη συσκευή σας σε έναν broker MQTT. + +Σε αυτό το μέρος της ενότητας, θα συνδέσετε το νυχτερινό σας φως IoT στο Διαδίκτυο για να επιτρέψετε τον απομακρυσμένο έλεγχο. Αργότερα σε αυτή την ενότητα, η συσκευή IoT σας θα στείλει ένα μήνυμα τηλεμετρίας μέσω MQTT σε έναν δημόσιο broker MQTT με το επίπεδο φωτός, όπου θα ληφθεί από κάποιον κώδικα server που θα γράψετε. Αυτός ο κώδικας θα ελέγξει το επίπεδο φωτός και θα στείλει ένα μήνυμα εντολής πίσω στη συσκευή, λέγοντάς της να ανάψει ή να σβήσει το LED. + +Μια πραγματική περίπτωση χρήσης για μια τέτοια ρύθμιση θα μπορούσε να είναι η συλλογή δεδομένων από πολλούς αισθητήρες φωτός πριν αποφασιστεί να ανάψουν τα φώτα, σε έναν χώρο με πολλά φώτα, όπως ένα στάδιο. Αυτό θα μπορούσε να αποτρέψει την ενεργοποίηση των φώτων εάν μόνο ένας αισθητήρας καλυπτόταν από σύννεφα ή πουλί, αλλά οι άλλοι αισθητήρες ανίχνευαν αρκετό φως. + +✅ Ποιες άλλες καταστάσεις θα απαιτούσαν την αξιολόγηση δεδομένων από πολλούς αισθητήρες πριν σταλούν εντολές; + +Αντί να ασχοληθείτε με την πολυπλοκότητα της ρύθμισης ενός broker MQTT ως μέρος αυτής της εργασίας, μπορείτε να χρησιμοποιήσετε έναν δημόσιο δοκιμαστικό server που εκτελεί το [Eclipse Mosquitto](https://www.mosquitto.org), έναν ανοιχτού κώδικα broker MQTT. Αυτός ο δοκιμαστικός broker είναι δημόσια διαθέσιμος στο [test.mosquitto.org](https://test.mosquitto.org) και δεν απαιτεί τη δημιουργία λογαριασμού, καθιστώντας τον ένα εξαιρετικό εργαλείο για τη δοκιμή πελατών και servers MQTT. + +> 💁 Αυτός ο δοκιμαστικός broker είναι δημόσιος και μη ασφαλής. Οποιοσδήποτε θα μπορούσε να ακούει τι δημοσιεύετε, οπότε δεν πρέπει να χρησιμοποιείται με δεδομένα που πρέπει να παραμείνουν ιδιωτικά. + +![Διάγραμμα ροής της εργασίας που δείχνει την ανάγνωση και τον έλεγχο των επιπέδων φωτός, και τον έλεγχο του LED](../../../../../translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.el.png) + +Ακολουθήστε το σχετικό βήμα παρακάτω για να συνδέσετε τη συσκευή σας στον broker MQTT: + +* [Arduino - Wio Terminal](wio-terminal-mqtt.md) +* [Υπολογιστής μονού πίνακα - Raspberry Pi/Εικονική συσκευή IoT](single-board-computer-mqtt.md) + +### Μια βαθύτερη ματιά στο MQTT + +Τα θέματα (topics) μπορούν να έχουν ιεραρχία, και οι πελάτες μπορούν να εγγραφούν σε διαφορετικά επίπεδα της ιεραρχίας χρησιμοποιώντας χαρακτήρες μπαλαντέρ. Για παράδειγμα, μπορείτε να στείλετε μηνύματα τηλεμετρίας θερμοκρασίας στο θέμα `/telemetry/temperature` και μηνύματα υγρασίας στο θέμα `/telemetry/humidity`, και στη συνέχεια στην εφαρμογή cloud σας να εγγραφείτε στο θέμα `/telemetry/*` για να λαμβάνετε και τα μηνύματα θερμοκρασίας και υγρασίας. + +Τα μηνύματα μπορούν να σταλούν με ποιότητα υπηρεσίας (QoS), η οποία καθορίζει την εγγύηση λήψης του μηνύματος. + +* Μία φορά το πολύ - το μήνυμα αποστέλλεται μόνο μία φορά και ο πελάτης και ο broker δεν λαμβάνουν επιπλέον μέτρα για την επιβεβαίωση της παράδοσης (fire and forget). +* Τουλάχιστον μία φορά - το μήνυμα επαναλαμβάνεται από τον αποστολέα πολλές φορές μέχρι να ληφθεί επιβεβαίωση (acknowledged delivery). +* Ακριβώς μία φορά - ο αποστολέας και ο παραλήπτης εμπλέκονται σε μια διαδικασία δύο επιπέδων για να διασφαλίσουν ότι μόνο ένα αντίγραφο του μηνύματος λαμβάνεται (assured delivery). + +✅ Ποιες καταστάσεις μπορεί να απαιτούν ένα μήνυμα με διασφαλισμένη παράδοση αντί για ένα μήνυμα fire and forget; + +Παρόλο που το όνομα είναι Message Queueing (MQTT), δεν υποστηρίζει ουσιαστικά ουρές μηνυμάτων. Αυτό σημαίνει ότι αν ένας πελάτης αποσυνδεθεί και επανασυνδεθεί, δεν θα λάβει μηνύματα που στάλθηκαν κατά τη διάρκεια της αποσύνδεσης, εκτός από αυτά που είχε ήδη αρχίσει να επεξεργάζεται μέσω της διαδικασίας QoS. Τα μηνύματα μπορούν να έχουν μια σημαία διατήρησης (retained flag). Αν αυτή η σημαία είναι ενεργοποιημένη, ο broker MQTT θα αποθηκεύσει το τελευταίο μήνυμα που στάλθηκε σε ένα θέμα με αυτή τη σημαία και θα το στείλει σε οποιονδήποτε πελάτη εγγραφεί αργότερα στο θέμα. Με αυτόν τον τρόπο, οι πελάτες θα λαμβάνουν πάντα το πιο πρόσφατο μήνυμα. + +Το MQTT υποστηρίζει επίσης μια λειτουργία keep alive που ελέγχει αν η σύνδεση είναι ακόμα ενεργή κατά τη διάρκεια μεγάλων διαστημάτων μεταξύ μηνυμάτων. + +> 🦟 [Mosquitto από το Eclipse Foundation](https://mosquitto.org) προσφέρει έναν δωρεάν broker MQTT που μπορείτε να εκτελέσετε μόνοι σας για να πειραματιστείτε με το MQTT, καθώς και έναν δημόσιο broker MQTT που μπορείτε να χρησιμοποιήσετε για να δοκιμάσετε τον κώδικά σας, φιλοξενούμενο στο [test.mosquitto.org](https://test.mosquitto.org). + +Οι συνδέσεις MQTT μπορούν να είναι δημόσιες και ανοιχτές, ή κρυπτογραφημένες και ασφαλείς χρησιμοποιώντας ονόματα χρήστη και κωδικούς πρόσβασης, ή πιστοποιητικά. + +> 💁 Το MQTT επικοινωνεί μέσω TCP/IP, το ίδιο υποκείμενο πρωτόκολλο δικτύου όπως το HTTP, αλλά σε διαφορετική θύρα. Μπορείτε επίσης να χρησιμοποιήσετε το MQTT μέσω websockets για να επικοινωνήσετε με εφαρμογές ιστού που εκτελούνται σε πρόγραμμα περιήγησης, ή σε περιπτώσεις όπου τα firewalls ή άλλοι κανόνες δικτύου μπλοκάρουν τις τυπικές συνδέσεις MQTT. + +## Τηλεμετρία + +Η λέξη τηλεμετρία προέρχεται από ελληνικές ρίζες που σημαίνουν μέτρηση από απόσταση. Η τηλεμετρία είναι η πράξη συλλογής δεδομένων από αισθητήρες και αποστολής τους στο cloud. + +> 💁 Μία από τις πρώτες συσκευές τηλεμετρίας εφευρέθηκε στη Γαλλία το 1874 και έστελνε σε πραγματικό χρόνο δεδομένα καιρού και βάθους χιονιού από το Mont Blanc στο Παρίσι. Χρησιμοποιούσε φυσικά καλώδια, καθώς οι ασύρματες τεχνολογίες δεν ήταν διαθέσιμες εκείνη την εποχή. + +Ας επιστρέψουμε στο παράδειγμα του έξυπνου θερμοστάτη από το Μάθημα 1. + +![Ένας θερμοστάτης συνδεδεμένος στο Διαδίκτυο που χρησιμοποιεί πολλούς αισθητήρες δωματίου](../../../../../translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.el.png) + +Ο θερμοστάτης διαθέτει αισθητήρες θερμοκρασίας για τη συλλογή τηλεμετρίας. Πιθανότατα θα έχει έναν ενσωματωμένο αισθητήρα θερμοκρασίας και μπορεί να συνδέεται με πολλούς εξωτερικούς αισθητήρες θερμοκρασίας μέσω ενός ασύρματου πρωτοκόλλου όπως το [Bluetooth Low Energy](https://wikipedia.org/wiki/Bluetooth_Low_Energy) (BLE). + +Ένα παράδειγμα δεδομένων τηλεμετρίας που θα μπορούσε να στείλει είναι: + +| Όνομα | Τιμή | Περιγραφή | +| ---- | ----- | ----------- | +| `thermostat_temperature` | 18°C | Η θερμοκρασία που μετρήθηκε από τον ενσωματωμένο αισθητήρα θερμοκρασίας του θερμοστάτη | +| `livingroom_temperature` | 19°C | Η θερμοκρασία που μετρήθηκε από έναν απομακρυσμένο αισθητήρα θερμοκρασίας που έχει ονομαστεί `livingroom` για να προσδιορίσει το δωμάτιο στο οποίο βρίσκεται | +| `bedroom_temperature` | 21°C | Η θερμοκρασία που μετρήθηκε από έναν απομακρυσμένο αισθητήρα θερμοκρασίας που έχει ονομαστεί `bedroom` για να προσδιορίσει το δωμάτιο στο οποίο βρίσκεται | + +Η υπηρεσία cloud μπορεί στη συνέχεια να χρησιμοποιήσει αυτά τα δεδομένα τηλεμετρίας για να λάβει αποφάσεις σχετικά με τις εντολές που θα στείλει για τον έλεγχο της θέρμανσης. + +### Αποστολή τηλεμετρίας από τη συσκευή IoT σας + +Το επόμενο βήμα για την προσθήκη ελέγχου μέσω Διαδικτύου στο νυχτερινό σας φως είναι η αποστολή της τηλεμετρίας του επιπέδου φωτός στον broker MQTT σε ένα θέμα τηλεμετρίας. + +#### Εργασία - αποστολή τηλεμετρίας από τη συσκευή IoT σας + +Στείλτε τηλεμετρία επιπέδου φωτός στον broker MQTT. + +Τα δεδομένα αποστέλλονται κωδικοποιημένα ως JSON - συντομογραφία του JavaScript Object Notation, ένα πρότυπο για την κωδικοποίηση δεδομένων σε κείμενο χρησιμοποιώντας ζεύγη κλειδιού/τιμής. + +✅ Αν δεν έχετε συναντήσει το JSON πριν, μπορείτε να μάθετε περισσότερα γι' αυτό στην [τεκμηρίωση του JSON.org](https://www.json.org/). + +Ακολουθήστε το σχετικό βήμα παρακάτω για να στείλετε τηλεμετρία από τη συσκευή σας στον broker MQTT: + +* [Arduino - Wio Terminal](wio-terminal-telemetry.md) +* [Υπολογιστής μονού πίνακα - Raspberry Pi/Εικονική συσκευή IoT](single-board-computer-telemetry.md) + +### Λήψη τηλεμετρίας από τον broker MQTT + +Δεν έχει νόημα να στέλνετε τηλεμετρία αν δεν υπάρχει κάτι στην άλλη άκρη για να την ακούσει. Η τηλεμετρία του επιπέδου φωτός χρειάζεται κάτι να την ακούει για να επεξεργαστεί τα δεδομένα. Αυτός ο 'server' κώδικας είναι ο τύπος κώδικα που θα αναπτύξετε σε μια υπηρεσία cloud ως μέρος μιας μεγαλύτερης εφαρμογής IoT, αλλά εδώ θα εκτελέσετε αυτόν τον κ +💁 Είστε ελεύθεροι να χρησιμοποιήσετε οποιοδήποτε Python IDE ή επεξεργαστή για αυτά τα μαθήματα αν έχετε κάποιο προτιμώμενο εργαλείο, αλλά τα μαθήματα θα παρέχουν οδηγίες βασισμένες στη χρήση του VS Code. +1. Εγκαταστήστε την επέκταση Pylance για το VS Code. Αυτή είναι μια επέκταση για το VS Code που παρέχει υποστήριξη για τη γλώσσα Python. Ανατρέξτε στην [τεκμηρίωση της επέκτασης Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) για οδηγίες σχετικά με την εγκατάστασή της στο VS Code. + +#### Ρύθμιση ενός εικονικού περιβάλλοντος Python + +Ένα από τα ισχυρά χαρακτηριστικά της Python είναι η δυνατότητα εγκατάστασης [πακέτων pip](https://pypi.org) - αυτά είναι πακέτα κώδικα που έχουν γραφτεί από άλλους και δημοσιευτεί στο Διαδίκτυο. Μπορείτε να εγκαταστήσετε ένα πακέτο pip στον υπολογιστή σας με μία εντολή και στη συνέχεια να χρησιμοποιήσετε αυτό το πακέτο στον κώδικά σας. Θα χρησιμοποιήσετε το pip για να εγκαταστήσετε ένα πακέτο για επικοινωνία μέσω MQTT. + +Από προεπιλογή, όταν εγκαθιστάτε ένα πακέτο, αυτό είναι διαθέσιμο παντού στον υπολογιστή σας, κάτι που μπορεί να οδηγήσει σε προβλήματα με τις εκδόσεις των πακέτων - όπως όταν μια εφαρμογή εξαρτάται από μια συγκεκριμένη έκδοση ενός πακέτου που δεν λειτουργεί σωστά όταν εγκαταστήσετε μια νεότερη έκδοση για μια άλλη εφαρμογή. Για να παρακάμψετε αυτό το πρόβλημα, μπορείτε να χρησιμοποιήσετε ένα [εικονικό περιβάλλον Python](https://docs.python.org/3/library/venv.html), ουσιαστικά ένα αντίγραφο της Python σε έναν αφιερωμένο φάκελο, και όταν εγκαθιστάτε πακέτα pip, αυτά εγκαθίστανται μόνο σε αυτόν τον φάκελο. + +##### Εργασία - Ρύθμιση ενός εικονικού περιβάλλοντος Python + +Ρυθμίστε ένα εικονικό περιβάλλον Python και εγκαταστήστε τα πακέτα pip για MQTT. + +1. Από το τερματικό ή τη γραμμή εντολών σας, εκτελέστε τα παρακάτω σε μια τοποθεσία της επιλογής σας για να δημιουργήσετε και να μεταβείτε σε έναν νέο φάκελο: + + ```sh + mkdir nightlight-server + cd nightlight-server + ``` + +1. Τώρα εκτελέστε τα παρακάτω για να δημιουργήσετε ένα εικονικό περιβάλλον στον φάκελο `.venv`: + + ```sh + python3 -m venv .venv + ``` + + > 💁 Πρέπει να καλέσετε ρητά το `python3` για να δημιουργήσετε το εικονικό περιβάλλον, σε περίπτωση που έχετε εγκατεστημένο το Python 2 εκτός από το Python 3 (την τελευταία έκδοση). Αν έχετε εγκατεστημένο το Python 2, τότε η κλήση του `python` θα χρησιμοποιήσει το Python 2 αντί για το Python 3. + +1. Ενεργοποιήστε το εικονικό περιβάλλον: + + * Στα Windows: + * Αν χρησιμοποιείτε το Command Prompt ή το Command Prompt μέσω του Windows Terminal, εκτελέστε: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Αν χρησιμοποιείτε το PowerShell, εκτελέστε: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + * Σε macOS ή Linux, εκτελέστε: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Αυτές οι εντολές πρέπει να εκτελούνται από την ίδια τοποθεσία όπου εκτελέσατε την εντολή για να δημιουργήσετε το εικονικό περιβάλλον. Δεν θα χρειαστεί ποτέ να μεταβείτε στον φάκελο `.venv`, θα πρέπει πάντα να εκτελείτε την εντολή ενεργοποίησης και οποιεσδήποτε εντολές για την εγκατάσταση πακέτων ή την εκτέλεση κώδικα από τον φάκελο όπου ήσασταν όταν δημιουργήσατε το εικονικό περιβάλλον. + +1. Μόλις ενεργοποιηθεί το εικονικό περιβάλλον, η προεπιλεγμένη εντολή `python` θα εκτελεί την έκδοση της Python που χρησιμοποιήθηκε για τη δημιουργία του εικονικού περιβάλλοντος. Εκτελέστε τα παρακάτω για να δείτε την έκδοση: + + ```sh + python --version + ``` + + Η έξοδος θα είναι παρόμοια με την παρακάτω: + + ```output + (.venv) ➜ nightlight-server python --version + Python 3.9.1 + ``` + + > 💁 Η έκδοση της Python σας μπορεί να είναι διαφορετική - αρκεί να είναι η έκδοση 3.6 ή νεότερη, είστε εντάξει. Αν όχι, διαγράψτε αυτόν τον φάκελο, εγκαταστήστε μια νεότερη έκδοση της Python και δοκιμάστε ξανά. + +1. Εκτελέστε τις παρακάτω εντολές για να εγκαταστήσετε το πακέτο pip για το [Paho-MQTT](https://pypi.org/project/paho-mqtt/), μια δημοφιλή βιβλιοθήκη MQTT. + + ```sh + pip install paho-mqtt + ``` + + Αυτό το πακέτο pip θα εγκατασταθεί μόνο στο εικονικό περιβάλλον και δεν θα είναι διαθέσιμο εκτός αυτού. + +#### Γράψτε τον κώδικα του διακομιστή + +Ο κώδικας του διακομιστή μπορεί τώρα να γραφτεί σε Python. + +##### Εργασία - Γράψτε τον κώδικα του διακομιστή + +Γράψτε τον κώδικα του διακομιστή. + +1. Από το τερματικό ή τη γραμμή εντολών σας, εκτελέστε τα παρακάτω μέσα στο εικονικό περιβάλλον για να δημιουργήσετε ένα αρχείο Python που ονομάζεται `app.py`: + + * Στα Windows εκτελέστε: + + ```cmd + type nul > app.py + ``` + + * Σε macOS ή Linux, εκτελέστε: + + ```cmd + touch app.py + ``` + +1. Ανοίξτε τον τρέχοντα φάκελο στο VS Code: + + ```sh + code . + ``` + +1. Όταν ξεκινήσει το VS Code, θα ενεργοποιήσει το εικονικό περιβάλλον Python. Αυτό θα αναφερθεί στη γραμμή κατάστασης στο κάτω μέρος: + + ![Το VS Code δείχνει το επιλεγμένο εικονικό περιβάλλον](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.el.png) + +1. Αν το τερματικό του VS Code είναι ήδη ανοιχτό όταν ξεκινά το VS Code, δεν θα έχει ενεργοποιηθεί το εικονικό περιβάλλον σε αυτό. Το πιο εύκολο πράγμα που μπορείτε να κάνετε είναι να τερματίσετε το τερματικό χρησιμοποιώντας το κουμπί **Kill the active terminal instance**: + + ![Το κουμπί Kill the active terminal instance στο VS Code](../../../../../translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.el.png) + +1. Εκκινήστε ένα νέο τερματικό στο VS Code επιλέγοντας *Terminal -> New Terminal*, ή πατώντας `` CTRL+` ``. Το νέο τερματικό θα φορτώσει το εικονικό περιβάλλον, με την κλήση για ενεργοποίηση να εμφανίζεται στο τερματικό. Το όνομα του εικονικού περιβάλλοντος (`.venv`) θα εμφανίζεται επίσης στην προτροπή: + + ```output + ➜ nightlight-server source .venv/bin/activate + (.venv) ➜ nightlight + ``` + +1. Ανοίξτε το αρχείο `app.py` από τον εξερευνητή του VS Code και προσθέστε τον παρακάτω κώδικα: + + ```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) + ``` + + Αντικαταστήστε το `` στη γραμμή 6 με το μοναδικό ID που χρησιμοποιήσατε κατά τη δημιουργία του κώδικα της συσκευής σας. + + ⚠️ Αυτό **πρέπει** να είναι το ίδιο ID που χρησιμοποιήσατε στη συσκευή σας, αλλιώς ο κώδικας του διακομιστή δεν θα εγγραφεί ή δημοσιεύσει στο σωστό θέμα. + + Αυτός ο κώδικας δημιουργεί έναν πελάτη MQTT με ένα μοναδικό όνομα και συνδέεται στον broker *test.mosquitto.org*. Στη συνέχεια, ξεκινά έναν βρόχο επεξεργασίας που εκτελείται σε ένα παρασκήνιο νήμα, ακούγοντας μηνύματα σε οποιαδήποτε εγγεγραμμένα θέματα. + + Ο πελάτης εγγράφεται στη συνέχεια σε μηνύματα στο θέμα τηλεμετρίας και ορίζει μια συνάρτηση που καλείται όταν λαμβάνεται ένα μήνυμα. Όταν λαμβάνεται ένα μήνυμα τηλεμετρίας, καλείται η συνάρτηση `handle_telemetry`, εκτυπώνοντας το μήνυμα που λήφθηκε στην κονσόλα. + + Τέλος, ένας άπειρος βρόχος διατηρεί την εφαρμογή σε λειτουργία. Ο πελάτης MQTT ακούει μηνύματα σε ένα παρασκήνιο νήμα και εκτελείται όσο η κύρια εφαρμογή είναι σε λειτουργία. + +1. Από το τερματικό του VS Code, εκτελέστε τα παρακάτω για να εκτελέσετε την εφαρμογή Python σας: + + ```sh + python app.py + ``` + + Η εφαρμογή θα ξεκινήσει να ακούει μηνύματα από τη συσκευή IoT. + +1. Βεβαιωθείτε ότι η συσκευή σας λειτουργεί και στέλνει μηνύματα τηλεμετρίας. Ρυθμίστε τα επίπεδα φωτός που ανιχνεύονται από τη φυσική ή εικονική συσκευή σας. Τα μηνύματα που λαμβάνονται θα εκτυπωθούν στο τερματικό. + + ```output + (.venv) ➜ nightlight-server python app.py + Message received: {'light': 0} + Message received: {'light': 400} + ``` + + Το αρχείο app.py στο εικονικό περιβάλλον nightlight πρέπει να εκτελείται για να λαμβάνει το αρχείο app.py στο εικονικό περιβάλλον nightlight-server τα μηνύματα που αποστέλλονται. + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-server/server](../../../../../1-getting-started/lessons/4-connect-internet/code-server/server). + +### Πόσο συχνά πρέπει να αποστέλλεται τηλεμετρία; + +Μια σημαντική παράμετρος με την τηλεμετρία είναι πόσο συχνά πρέπει να μετράτε και να αποστέλλετε τα δεδομένα. Η απάντηση είναι - εξαρτάται. Αν μετράτε συχνά, μπορείτε να ανταποκριθείτε γρηγορότερα στις αλλαγές, αλλά χρησιμοποιείτε περισσότερη ενέργεια, περισσότερο εύρος ζώνης, δημιουργείτε περισσότερα δεδομένα και χρειάζεστε περισσότερους πόρους στο cloud για την επεξεργασία τους. Πρέπει να μετράτε αρκετά συχνά, αλλά όχι υπερβολικά συχνά. + +Για έναν θερμοστάτη, η μέτρηση κάθε λίγα λεπτά είναι πιθανώς αρκετή, καθώς οι θερμοκρασίες δεν αλλάζουν τόσο συχνά. Αν μετράτε μόνο μία φορά την ημέρα, μπορεί να καταλήξετε να θερμαίνετε το σπίτι σας για τις θερμοκρασίες της νύχτας κατά τη διάρκεια μιας ηλιόλουστης ημέρας, ενώ αν μετράτε κάθε δευτερόλεπτο, θα έχετε χιλιάδες περιττές μετρήσεις που θα καταναλώσουν το εύρος ζώνης του χρήστη και θα αυξήσουν το κόστος επεξεργασίας και αποθήκευσης στο cloud. + +Αν παρακολουθείτε δεδομένα γύρω από ένα μηχάνημα σε ένα εργοστάσιο που, αν αποτύχει, μπορεί να προκαλέσει καταστροφικές ζημιές και απώλειες εκατομμυρίων, τότε η μέτρηση πολλές φορές το δευτερόλεπτο μπορεί να είναι απαραίτητη. Είναι καλύτερο να σπαταλήσετε εύρος ζώνης παρά να χάσετε τηλεμετρία που δείχνει ότι ένα μηχάνημα χρειάζεται επισκευή πριν σπάσει. + +> 💁 Σε αυτήν την περίπτωση, μπορεί να εξετάσετε τη χρήση μιας συσκευής edge για την επεξεργασία της τηλεμετρίας πρώτα, ώστε να μειώσετε την εξάρτηση από το Διαδίκτυο. + +### Απώλεια συνδεσιμότητας + +Οι συνδέσεις στο Διαδίκτυο μπορεί να είναι αναξιόπιστες, με συχνές διακοπές. Τι πρέπει να κάνει μια συσκευή IoT σε αυτές τις περιπτώσεις - να χάσει τα δεδομένα ή να τα αποθηκεύσει μέχρι να αποκατασταθεί η συνδεσιμότητα; Και πάλι, η απάντηση είναι ότι εξαρτάται. + +Για έναν θερμοστάτη, τα δεδομένα μπορούν πιθανώς να χαθούν μόλις ληφθεί μια νέα μέτρηση θερμοκρασίας. Το σύστημα θέρμανσης δεν ενδιαφέρεται ότι πριν από 20 λεπτά η θερμοκρασία ήταν 20.5°C αν τώρα είναι 19°C, καθώς η τρέχουσα θερμοκρασία καθορίζει αν η θέρμανση πρέπει να είναι ενεργοποιημένη ή όχι. + +Για μηχανήματα, μπορεί να θέλετε να διατηρήσετε τα δεδομένα, ειδικά αν χρησιμοποιούνται για την ανίχνευση τάσεων. Υπάρχουν μοντέλα μηχανικής μάθησης που μπορούν να ανιχνεύσουν ανωμαλίες σε ροές δεδομένων εξετάζοντας δεδομένα από μια καθορισμένη χρονική περίοδο (όπως την τελευταία ώρα) και εντοπίζοντας ανώμαλα δεδομένα. Αυτό χρησιμοποιείται συχνά για προγνωστική συντήρηση, εντοπίζοντας ενδείξεις ότι κάτι μπορεί να χαλάσει σύντομα, ώστε να μπορείτε να το επισκευάσετε ή να το αντικαταστήσετε πριν συμβεί αυτό. Μπορεί να θέλετε κάθε κομμάτι τηλεμετρίας για ένα μηχάνημα να αποστέλλεται, ώστε να μπορεί να επεξεργαστεί για ανίχνευση ανωμαλιών, οπότε μόλις η συσκευή IoT μπορέσει να επανασυνδεθεί, θα στείλει όλη την τηλεμετρία που δημιουργήθηκε κατά τη διάρκεια της διακοπής του Διαδικτύου. + +Οι σχεδιαστές συσκευών IoT θα πρέπει επίσης να εξετάσουν αν η συσκευή IoT μπορεί να χρησιμοποιηθεί κατά τη διάρκεια μιας διακοπής του Διαδικτύου ή απώλειας σήματος λόγω τοποθεσίας. Ένας έξυπνος θερμοστάτης θα πρέπει να μπορεί να λαμβάνει κάποιες περιορισμένες αποφάσεις για τον έλεγχο της θέρμανσης αν δεν μπορεί να στείλει τηλεμετρία στο cloud λόγω διακοπής. + +[![Αυτό το Ferrari "έμεινε" επειδή κάποιος προσπάθησε να το αναβαθμίσει υπογείως όπου δεν υπάρχει σήμα κινητής τηλεφωνίας](../../../../../translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.el.png)](https://twitter.com/internetofshit/status/1315736960082808832) + +Για να χειριστεί το MQTT μια απώλεια συνδεσιμότητας, ο κώδικας της συσκευής και του διακομιστή θα πρέπει να είναι υπεύθυνος για τη διασφάλιση της παράδοσης των μηνυμάτων αν αυτό είναι απαραίτητο, για παράδειγμα απαιτώντας όλα τα μηνύματα που αποστέλλονται να απαντώνται με επιπλέον μηνύματα σε ένα θέμα απάντησης, και αν όχι, να τοποθετούνται σε ουρά χειροκίνητα για να αναπαραχθούν αργότερα. + +## Εντολές + +Οι εντολές είναι μηνύματα που αποστέλλονται από το cloud σε μια συσκευή, δίνοντάς της οδηγίες να κάνει κάτι. Τις περισσότερες φορές αυτό περιλαμβάνει την παροχή κάποιου είδους εξόδου μέσω ενός ενεργοποιητή, αλλά μπορεί να είναι και μια οδηγία για την ίδια τη συσκευή, όπως να επανεκκινήσει ή να συλλέξει επιπλέον τηλεμετρία και να την επιστρέψει ως απάντηση στην εντολή. + +![Ένας θερμοστάτης συνδεδεμένος στο Διαδίκτυο που λαμβάνει εντολή να ενεργοποιήσει τη θέρμανση](../../../../../translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.el.png) + +Ένας θερμοστάτης θα μπορούσε να λάβει μια εντολή από το cloud να ενεργοποιήσει τη θέρμανση. Με βάση τα δεδομένα τηλεμετρίας από όλους τους αισθητήρες, αν η υπηρεσία cloud έχει αποφασίσει ότι η θέρμανση πρέπει να είναι ενεργοποιημένη, τότε στέλνει τη σχετική εντολή. + +### Αποστολή εντολών στον broker MQTT + +Το επόμενο βήμα για το νυχτερινό φως που ελέγχεται μέσω Διαδικτύου είναι ο κώδικας του διακομιστή να στείλει μια εντολή πίσω στη συσκευή IoT για να ελέγξει το φως με βάση τα επίπεδα φωτός που ανιχνεύει. + +1. Ανοίξτε τον κώδικα του διακομιστή στο VS Code. + +1. Προσθέστε την παρακάτω γραμμή μετά τη δήλωση του `client_telemetry_topic` για να ορίσετε ποιο θέμα θα χρησιμοποιηθεί για την αποστολή εντολών: + + ```python + server_command_topic = id + '/commands' + ``` + +1. Προσθέστε τον παρακάτω κώδικα στο τέλος της συνάρτησης `handle_telemetry`: + + ```python + command = { 'led_on' : payload['light'] < 300 } + print("Sending message:", command) + + client.publish(server_command_topic, json.dumps(command)) + ``` + + Αυτό στέλνει ένα μήνυμα JSON στο θέμα εντολών με την τιμή του `led_on` να ορίζεται σε true ή false ανάλογα με το αν το φως είναι μικρότερο από 300 ή όχι. Αν το φως είναι μικρότερο από 300, αποστέλλεται true για να δώσει εντολή στη συσκευή να ανάψει το LED. + +1. Εκτελέστε τον κώδικα όπως πριν. + +1. Ρυθμίστε τα επίπεδα φωτός +Για αυτές τις συσκευές, σκεφτείτε ποια μηνύματα μπορεί να στέλνουν ή να λαμβάνουν. Τι τηλεμετρία στέλνουν; Ποια μηνύματα ή εντολές μπορεί να λαμβάνουν; Πιστεύετε ότι είναι ασφαλείς; + +## Κουίζ μετά τη διάλεξη + +[Κουίζ μετά τη διάλεξη](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8) + +## Ανασκόπηση & Αυτομελέτη + +Διαβάστε περισσότερα για το MQTT στη [σελίδα της Wikipedia για το MQTT](https://wikipedia.org/wiki/MQTT). + +Δοκιμάστε να εκτελέσετε έναν MQTT broker μόνοι σας χρησιμοποιώντας το [Mosquitto](https://www.mosquitto.org) και συνδεθείτε σε αυτόν από τη συσκευή IoT και τον κώδικα του διακομιστή σας. + +> 💁 Συμβουλή - από προεπιλογή, το Mosquitto δεν επιτρέπει ανώνυμες συνδέσεις (δηλαδή συνδέσεις χωρίς όνομα χρήστη και κωδικό πρόσβασης) και δεν επιτρέπει συνδέσεις από υπολογιστές εκτός αυτού στον οποίο εκτελείται. +> Μπορείτε να διορθώσετε αυτό το ζήτημα με ένα [`mosquitto.conf` αρχείο ρυθμίσεων](https://www.mosquitto.org/man/mosquitto-conf-5.html) με το εξής: +> +> ```sh +> listener 1883 0.0.0.0 +> allow_anonymous true +> ``` + +## Εργασία + +[Συγκρίνετε και αντιπαραβάλετε το MQTT με άλλα πρωτόκολλα επικοινωνίας](assignment.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/4-connect-internet/assignment.md b/translations/el/1-getting-started/lessons/4-connect-internet/assignment.md new file mode 100644 index 00000000..326c6cd0 --- /dev/null +++ b/translations/el/1-getting-started/lessons/4-connect-internet/assignment.md @@ -0,0 +1,28 @@ + +# Σύγκριση και αντίθεση του MQTT με άλλα πρωτόκολλα επικοινωνίας + +## Οδηγίες + +Αυτό το μάθημα κάλυψε το MQTT ως πρωτόκολλο επικοινωνίας. Υπάρχουν και άλλα, όπως τα AMQP και HTTP/HTTPS. + +Ερευνήστε και τα δύο και συγκρίνετε/αντιπαραβάλετε τα με το MQTT. Σκεφτείτε τη χρήση ενέργειας, την ασφάλεια και τη διατήρηση μηνυμάτων σε περίπτωση απώλειας συνδέσεων. + +## Κριτήρια Αξιολόγησης + +| Κριτήριο | Εξαιρετικό | Επαρκές | Χρειάζεται Βελτίωση | +| -------- | ---------- | -------- | ------------------- | +| Σύγκριση AMQP με MQTT | Μπορεί να συγκρίνει και να αντιπαραβάλλει το AMQP με το MQTT και καλύπτει τη χρήση ενέργειας, την ασφάλεια και τη διατήρηση μηνυμάτων. | Μπορεί εν μέρει να συγκρίνει και να αντιπαραβάλλει το AMQP με το MQTT και καλύπτει δύο από τα εξής: χρήση ενέργειας, ασφάλεια και διατήρηση μηνυμάτων. | Μπορεί εν μέρει να συγκρίνει και να αντιπαραβάλλει το AMQP με το MQTT και καλύπτει ένα από τα εξής: χρήση ενέργειας, ασφάλεια και διατήρηση μηνυμάτων. | +| Σύγκριση HTTP/HTTPS με MQTT | Μπορεί να συγκρίνει και να αντιπαραβάλλει το HTTP/HTTPS με το MQTT και καλύπτει τη χρήση ενέργειας, την ασφάλεια και τη διατήρηση μηνυμάτων. | Μπορεί εν μέρει να συγκρίνει και να αντιπαραβάλλει το HTTP/HTTPS με το MQTT και καλύπτει δύο από τα εξής: χρήση ενέργειας, ασφάλεια και διατήρηση μηνυμάτων. | Μπορεί εν μέρει να συγκρίνει και να αντιπαραβάλλει το HTTP/HTTPS με το MQTT και καλύπτει ένα από τα εξής: χρήση ενέργειας, ασφάλεια και διατήρηση μηνυμάτων. | + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md b/translations/el/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md new file mode 100644 index 00000000..5b410eab --- /dev/null +++ b/translations/el/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md @@ -0,0 +1,67 @@ + +# Ελέγξτε το νυχτερινό σας φως μέσω του Διαδικτύου - Εικονικό IoT Υλικό και Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα εγγραφείτε σε εντολές που αποστέλλονται από έναν MQTT broker προς το Raspberry Pi ή την εικονική IoT συσκευή σας. + +## Εγγραφή σε εντολές + +Το επόμενο βήμα είναι να εγγραφείτε στις εντολές που αποστέλλονται από τον MQTT broker και να ανταποκριθείτε σε αυτές. + +### Εργασία + +Εγγραφείτε σε εντολές. + +1. Ανοίξτε το έργο του νυχτερινού φωτός στο VS Code. + +1. Αν χρησιμοποιείτε μια εικονική IoT συσκευή, βεβαιωθείτε ότι το τερματικό εκτελεί το εικονικό περιβάλλον. Αν χρησιμοποιείτε Raspberry Pi, δεν θα χρησιμοποιήσετε εικονικό περιβάλλον. + +1. Προσθέστε τον παρακάτω κώδικα μετά τους ορισμούς του `client_telemetry_topic`: + + ```python + server_command_topic = id + '/commands' + ``` + + Το `server_command_topic` είναι το MQTT θέμα στο οποίο η συσκευή θα εγγραφεί για να λαμβάνει εντολές για το LED. + +1. Προσθέστε τον παρακάτω κώδικα ακριβώς πάνω από την κύρια επανάληψη, μετά τη γραμμή `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 + ``` + + Αυτός ο κώδικας ορίζει μια συνάρτηση, `handle_command`, που διαβάζει ένα μήνυμα ως έγγραφο JSON και αναζητά την τιμή της ιδιότητας `led_on`. Αν είναι ρυθμισμένη σε `True`, το LED ανάβει, διαφορετικά σβήνει. + + Ο MQTT client εγγράφεται στο θέμα στο οποίο ο server θα στέλνει μηνύματα και ορίζει τη συνάρτηση `handle_command` να καλείται όταν λαμβάνεται ένα μήνυμα. + + > 💁 Ο χειριστής `on_message` καλείται για όλα τα θέματα στα οποία έχει εγγραφεί. Αν αργότερα γράψετε κώδικα που ακούει σε πολλαπλά θέματα, μπορείτε να πάρετε το θέμα στο οποίο στάλθηκε το μήνυμα από το αντικείμενο `message` που περνά στη συνάρτηση χειρισμού. + +1. Εκτελέστε τον κώδικα με τον ίδιο τρόπο που εκτελέσατε τον κώδικα από το προηγούμενο μέρος της εργασίας. Αν χρησιμοποιείτε μια εικονική IoT συσκευή, βεβαιωθείτε ότι η εφαρμογή CounterFit εκτελείται και ότι ο αισθητήρας φωτός και το LED έχουν δημιουργηθεί στις σωστές ακίδες. + +1. Ρυθμίστε τα επίπεδα φωτός που ανιχνεύονται από τη φυσική ή εικονική συσκευή σας. Τα μηνύματα που λαμβάνονται και οι εντολές που αποστέλλονται θα εμφανίζονται στο τερματικό. Το LED θα ανάβει και θα σβήνει ανάλογα με το επίπεδο φωτός. + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-commands/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/virtual-device) ή στον φάκελο [code-commands/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/pi). + +😀 Έχετε προγραμματίσει με επιτυχία τη συσκευή σας να ανταποκρίνεται σε εντολές από έναν MQTT broker. + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md b/translations/el/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md new file mode 100644 index 00000000..3bb31938 --- /dev/null +++ b/translations/el/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md @@ -0,0 +1,93 @@ + +# Ελέγξτε το νυχτερινό σας φως μέσω του Διαδικτύου - Εικονικό IoT Υλικό και Raspberry Pi + +Η συσκευή IoT πρέπει να προγραμματιστεί ώστε να επικοινωνεί με το *test.mosquitto.org* χρησιμοποιώντας το MQTT για να στέλνει τιμές τηλεμετρίας με την ανάγνωση του αισθητήρα φωτός και να λαμβάνει εντολές για τον έλεγχο του LED. + +Σε αυτό το μέρος του μαθήματος, θα συνδέσετε το Raspberry Pi ή την εικονική συσκευή IoT σας με έναν MQTT broker. + +## Εγκατάσταση του πακέτου πελάτη MQTT + +Για να επικοινωνήσετε με τον MQTT broker, πρέπει να εγκαταστήσετε μια βιβλιοθήκη MQTT μέσω pip είτε στο Pi σας είτε στο εικονικό περιβάλλον σας, αν χρησιμοποιείτε εικονική συσκευή. + +### Εργασία + +Εγκαταστήστε το πακέτο pip + +1. Ανοίξτε το έργο του νυχτερινού φωτός στο VS Code. + +1. Αν χρησιμοποιείτε εικονική συσκευή IoT, βεβαιωθείτε ότι το τερματικό εκτελεί το εικονικό περιβάλλον. Αν χρησιμοποιείτε Raspberry Pi, δεν θα χρησιμοποιήσετε εικονικό περιβάλλον. + +1. Εκτελέστε την παρακάτω εντολή για να εγκαταστήσετε το πακέτο MQTT μέσω pip: + + ```sh + pip3 install paho-mqtt + ``` + +## Προγραμματίστε τη συσκευή + +Η συσκευή είναι έτοιμη για προγραμματισμό. + +### Εργασία + +Γράψτε τον κώδικα της συσκευής. + +1. Προσθέστε την παρακάτω εισαγωγή στην κορυφή του αρχείου `app.py`: + + ```python + import paho.mqtt.client as mqtt + ``` + + Η βιβλιοθήκη `paho.mqtt.client` επιτρέπει στην εφαρμογή σας να επικοινωνεί μέσω MQTT. + +1. Προσθέστε τον παρακάτω κώδικα μετά τους ορισμούς του αισθητήρα φωτός και του LED: + + ```python + id = '' + + client_name = id + 'nightlight_client' + ``` + + Αντικαταστήστε το `` με ένα μοναδικό ID που θα χρησιμοποιηθεί ως όνομα για αυτόν τον πελάτη της συσκευής και αργότερα για τα θέματα που αυτή η συσκευή δημοσιεύει και εγγράφεται. Ο broker *test.mosquitto.org* είναι δημόσιος και χρησιμοποιείται από πολλούς ανθρώπους, συμπεριλαμβανομένων άλλων μαθητών που εργάζονται σε αυτήν την εργασία. Έχοντας ένα μοναδικό όνομα πελάτη MQTT και μοναδικά ονόματα θεμάτων διασφαλίζεται ότι ο κώδικάς σας δεν θα συγκρουστεί με άλλους. Θα χρειαστείτε επίσης αυτό το ID όταν δημιουργείτε τον κώδικα του διακομιστή αργότερα σε αυτήν την εργασία. + + > 💁 Μπορείτε να χρησιμοποιήσετε έναν ιστότοπο όπως το [GUIDGen](https://www.guidgen.com) για να δημιουργήσετε ένα μοναδικό ID. + + Το `client_name` είναι ένα μοναδικό όνομα για αυτόν τον πελάτη MQTT στον broker. + +1. Προσθέστε τον παρακάτω κώδικα κάτω από αυτόν τον νέο κώδικα για να δημιουργήσετε ένα αντικείμενο πελάτη MQTT και να συνδεθείτε με τον MQTT broker: + + ```python + mqtt_client = mqtt.Client(client_name) + mqtt_client.connect('test.mosquitto.org') + + mqtt_client.loop_start() + + print("MQTT connected!") + ``` + + Αυτός ο κώδικας δημιουργεί το αντικείμενο πελάτη, συνδέεται με τον δημόσιο MQTT broker και ξεκινά έναν βρόχο επεξεργασίας που εκτελείται σε ένα νήμα παρασκηνίου, ακούγοντας μηνύματα σε οποιαδήποτε εγγεγραμμένα θέματα. + +1. Εκτελέστε τον κώδικα με τον ίδιο τρόπο που εκτελέσατε τον κώδικα από το προηγούμενο μέρος της εργασίας. Αν χρησιμοποιείτε εικονική συσκευή IoT, βεβαιωθείτε ότι η εφαρμογή CounterFit εκτελείται και ότι ο αισθητήρας φωτός και το LED έχουν δημιουργηθεί στις σωστές ακίδες. + + ```output + (.venv) ➜ nightlight python app.py + MQTT connected! + Light level: 0 + Light level: 0 + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-mqtt/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/virtual-device) ή στον φάκελο [code-mqtt/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/pi). + +😀 Έχετε συνδέσει επιτυχώς τη συσκευή σας με έναν MQTT broker. + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md b/translations/el/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md new file mode 100644 index 00000000..b370a1a8 --- /dev/null +++ b/translations/el/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md @@ -0,0 +1,74 @@ + +# Ελέγξτε το νυχτερινό φως σας μέσω του Διαδικτύου - Εικονικό IoT Υλικό και Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα στείλετε τηλεμετρία με επίπεδα φωτός από το Raspberry Pi ή την εικονική IoT συσκευή σας σε έναν MQTT broker. + +## Δημοσίευση τηλεμετρίας + +Το επόμενο βήμα είναι να δημιουργήσετε ένα έγγραφο JSON με τηλεμετρία και να το στείλετε στον MQTT broker. + +### Εργασία + +Δημοσιεύστε τηλεμετρία στον MQTT broker. + +1. Ανοίξτε το έργο του νυχτερινού φωτός στο VS Code. + +1. Εάν χρησιμοποιείτε μια εικονική IoT συσκευή, βεβαιωθείτε ότι το τερματικό εκτελεί το εικονικό περιβάλλον. Εάν χρησιμοποιείτε Raspberry Pi, δεν θα χρησιμοποιείτε εικονικό περιβάλλον. + +1. Προσθέστε την ακόλουθη εισαγωγή στην κορυφή του αρχείου `app.py`: + + ```python + import json + ``` + + Η βιβλιοθήκη `json` χρησιμοποιείται για την κωδικοποίηση της τηλεμετρίας ως έγγραφο JSON. + +1. Προσθέστε το ακόλουθο μετά τη δήλωση του `client_name`: + + ```python + client_telemetry_topic = id + '/telemetry' + ``` + + Το `client_telemetry_topic` είναι το MQTT θέμα στο οποίο η συσκευή θα δημοσιεύει τα επίπεδα φωτός. + +1. Αντικαταστήστε το περιεχόμενο του βρόχου `while True:` στο τέλος του αρχείου με το ακόλουθο: + + ```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) + ``` + + Αυτός ο κώδικας συσκευάζει το επίπεδο φωτός σε ένα έγγραφο JSON και το δημοσιεύει στον MQTT broker. Στη συνέχεια, κάνει παύση για να μειώσει τη συχνότητα αποστολής μηνυμάτων. + +1. Εκτελέστε τον κώδικα με τον ίδιο τρόπο που εκτελέσατε τον κώδικα από το προηγούμενο μέρος της εργασίας. Εάν χρησιμοποιείτε μια εικονική IoT συσκευή, βεβαιωθείτε ότι η εφαρμογή CounterFit εκτελείται και ότι ο αισθητήρας φωτός και το LED έχουν δημιουργηθεί στις σωστές ακίδες. + + ```output + (.venv) ➜ nightlight python app.py + MQTT connected! + Sending telemetry {"light": 0} + Sending telemetry {"light": 0} + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-telemetry/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/virtual-device) ή στον φάκελο [code-telemetry/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/pi). + +😀 Έχετε στείλει με επιτυχία τηλεμετρία από τη συσκευή σας. + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md b/translations/el/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md new file mode 100644 index 00000000..7a9795ba --- /dev/null +++ b/translations/el/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md @@ -0,0 +1,93 @@ + +# Ελέγξτε το νυχτερινό σας φως μέσω του Διαδικτύου - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα εγγραφείτε σε εντολές που αποστέλλονται από έναν MQTT broker στο Wio Terminal σας. + +## Εγγραφή σε εντολές + +Το επόμενο βήμα είναι να εγγραφείτε στις εντολές που αποστέλλονται από τον MQTT broker και να ανταποκριθείτε σε αυτές. + +### Εργασία + +Εγγραφείτε σε εντολές. + +1. Ανοίξτε το έργο του νυχτερινού φωτός στο VS Code. + +1. Προσθέστε τον παρακάτω κώδικα στο τέλος του αρχείου `config.h` για να ορίσετε το όνομα του θέματος για τις εντολές: + + ```cpp + const string SERVER_COMMAND_TOPIC = ID + "/commands"; + ``` + + Το `SERVER_COMMAND_TOPIC` είναι το θέμα στο οποίο η συσκευή θα εγγραφεί για να λαμβάνει εντολές για το LED. + +1. Προσθέστε την παρακάτω γραμμή στο τέλος της συνάρτησης `reconnectMQTTClient` για να εγγραφείτε στο θέμα εντολών όταν ο MQTT client επανασυνδέεται: + + ```cpp + client.subscribe(SERVER_COMMAND_TOPIC.c_str()); + ``` + +1. Προσθέστε τον παρακάτω κώδικα κάτω από τη συνάρτηση `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); + } + ``` + + Αυτή η συνάρτηση θα είναι η callback που θα καλείται από τον MQTT client όταν λαμβάνει ένα μήνυμα από τον server. + + Το μήνυμα λαμβάνεται ως πίνακας από unsigned 8-bit ακέραιους, οπότε πρέπει να μετατραπεί σε πίνακα χαρακτήρων για να αντιμετωπιστεί ως κείμενο. + + Το μήνυμα περιέχει ένα έγγραφο JSON, το οποίο αποκωδικοποιείται χρησιμοποιώντας τη βιβλιοθήκη ArduinoJson. Η ιδιότητα `led_on` του εγγράφου JSON διαβάζεται, και ανάλογα με την τιμή της, το LED ανάβει ή σβήνει. + +1. Προσθέστε τον παρακάτω κώδικα στη συνάρτηση `createMQTTClient`: + + ```cpp + client.setCallback(clientCallback); + ``` + + Αυτός ο κώδικας ορίζει τη `clientCallback` ως τη callback που θα καλείται όταν λαμβάνεται ένα μήνυμα από τον MQTT broker. + + > 💁 Ο χειριστής `clientCallback` καλείται για όλα τα θέματα στα οποία έχει γίνει εγγραφή. Εάν αργότερα γράψετε κώδικα που ακούει σε πολλαπλά θέματα, μπορείτε να λάβετε το θέμα στο οποίο στάλθηκε το μήνυμα από την παράμετρο `topic` που περνά στη συνάρτηση callback. + +1. Μεταφορτώστε τον κώδικα στο Wio Terminal σας και χρησιμοποιήστε το Serial Monitor για να δείτε τα επίπεδα φωτός που αποστέλλονται στον MQTT broker. + +1. Ρυθμίστε τα επίπεδα φωτός που ανιχνεύονται από τη φυσική ή εικονική σας συσκευή. Θα δείτε μηνύματα να λαμβάνονται και εντολές να αποστέλλονται στο τερματικό. Θα δείτε επίσης το LED να ανάβει και να σβήνει ανάλογα με το επίπεδο φωτός. + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-commands/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal). + +😀 Έχετε προγραμματίσει με επιτυχία τη συσκευή σας να ανταποκρίνεται σε εντολές από έναν MQTT broker. + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md b/translations/el/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md new file mode 100644 index 00000000..6cb8762a --- /dev/null +++ b/translations/el/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md @@ -0,0 +1,251 @@ + +# Ελέγξτε το νυχτερινό σας φως μέσω του Διαδικτύου - Wio Terminal + +Η συσκευή IoT πρέπει να προγραμματιστεί ώστε να επικοινωνεί με το *test.mosquitto.org* χρησιμοποιώντας το MQTT για να στέλνει τιμές τηλεμετρίας με την ανάγνωση του αισθητήρα φωτός και να λαμβάνει εντολές για τον έλεγχο του LED. + +Σε αυτό το μέρος του μαθήματος, θα συνδέσετε το Wio Terminal σας με έναν MQTT broker. + +## Εγκατάσταση των βιβλιοθηκών WiFi και MQTT για Arduino + +Για να επικοινωνήσετε με τον MQTT broker, πρέπει να εγκαταστήσετε κάποιες βιβλιοθήκες Arduino για να χρησιμοποιήσετε το τσιπ WiFi στο Wio Terminal και να επικοινωνήσετε με το MQTT. Κατά την ανάπτυξη για συσκευές Arduino, μπορείτε να χρησιμοποιήσετε μια μεγάλη ποικιλία βιβλιοθηκών που περιέχουν κώδικα ανοιχτού κώδικα και υλοποιούν ένα ευρύ φάσμα δυνατοτήτων. Η Seeed δημοσιεύει βιβλιοθήκες για το Wio Terminal που του επιτρέπουν να επικοινωνεί μέσω WiFi. Άλλοι προγραμματιστές έχουν δημοσιεύσει βιβλιοθήκες για την επικοινωνία με MQTT brokers, και θα χρησιμοποιήσετε αυτές τις βιβλιοθήκες με τη συσκευή σας. + +Αυτές οι βιβλιοθήκες παρέχονται ως πηγαίος κώδικας που μπορεί να εισαχθεί αυτόματα στο PlatformIO και να μεταγλωττιστεί για τη συσκευή σας. Με αυτόν τον τρόπο, οι βιβλιοθήκες Arduino θα λειτουργούν σε οποιαδήποτε συσκευή υποστηρίζει το πλαίσιο Arduino, υπό την προϋπόθεση ότι η συσκευή διαθέτει οποιοδήποτε συγκεκριμένο υλικό που απαιτείται από τη βιβλιοθήκη. Ορισμένες βιβλιοθήκες, όπως οι βιβλιοθήκες WiFi της Seeed, είναι συγκεκριμένες για ορισμένο υλικό. + +Οι βιβλιοθήκες μπορούν να εγκατασταθούν παγκοσμίως και να μεταγλωττιστούν αν χρειαστεί ή σε ένα συγκεκριμένο έργο. Για αυτήν την εργασία, οι βιβλιοθήκες θα εγκατασταθούν στο έργο. + +✅ Μπορείτε να μάθετε περισσότερα για τη διαχείριση βιβλιοθηκών και πώς να βρείτε και να εγκαταστήσετε βιβλιοθήκες στην [τεκμηρίωση βιβλιοθηκών του PlatformIO](https://docs.platformio.org/en/latest/librarymanager/index.html). + +### Εργασία - εγκατάσταση των βιβλιοθηκών WiFi και MQTT για Arduino + +Εγκαταστήστε τις βιβλιοθήκες Arduino. + +1. Ανοίξτε το έργο nightlight στο VS Code. + +1. Προσθέστε τα παρακάτω στο τέλος του αρχείου `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 + ``` + + Αυτό εισάγει τις βιβλιοθήκες WiFi της Seeed. Η σύνταξη `@ ` αναφέρεται σε έναν συγκεκριμένο αριθμό έκδοσης της βιβλιοθήκης. + + > 💁 Μπορείτε να αφαιρέσετε το `@ ` για να χρησιμοποιείτε πάντα την πιο πρόσφατη έκδοση των βιβλιοθηκών, αλλά δεν υπάρχουν εγγυήσεις ότι οι νεότερες εκδόσεις θα λειτουργούν με τον παρακάτω κώδικα. Ο κώδικας εδώ έχει δοκιμαστεί με αυτήν την έκδοση των βιβλιοθηκών. + + Αυτό είναι όλο που χρειάζεται να κάνετε για να προσθέσετε τις βιβλιοθήκες. Την επόμενη φορά που το PlatformIO θα κατασκευάσει το έργο, θα κατεβάσει τον πηγαίο κώδικα αυτών των βιβλιοθηκών και θα τον μεταγλωττίσει στο έργο σας. + +1. Προσθέστε τα παρακάτω στο `lib_deps`: + + ```ini + knolleary/PubSubClient @ 2.8 + ``` + + Αυτό εισάγει το [PubSubClient](https://github.com/knolleary/pubsubclient), έναν MQTT client για Arduino. + +## Σύνδεση στο WiFi + +Το Wio Terminal μπορεί τώρα να συνδεθεί στο WiFi. + +### Εργασία - σύνδεση στο WiFi + +Συνδέστε το Wio Terminal στο WiFi. + +1. Δημιουργήστε ένα νέο αρχείο στον φάκελο `src` με όνομα `config.h`. Μπορείτε να το κάνετε αυτό επιλέγοντας τον φάκελο `src` ή το αρχείο `main.cpp` μέσα και επιλέγοντας το κουμπί **New file** από τον εξερευνητή. Αυτό το κουμπί εμφανίζεται μόνο όταν ο δείκτης σας είναι πάνω από τον εξερευνητή. + + ![Το κουμπί νέου αρχείου](../../../../../translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.el.png) + +1. Προσθέστε τον παρακάτω κώδικα σε αυτό το αρχείο για να ορίσετε σταθερές για τα διαπιστευτήρια του WiFi σας: + + ```cpp + #pragma once + + #include + + using namespace std; + + // WiFi credentials + const char *SSID = ""; + const char *PASSWORD = ""; + ``` + + Αντικαταστήστε το `` με το SSID του WiFi σας. Αντικαταστήστε το `` με τον κωδικό πρόσβασης του WiFi σας. + +1. Ανοίξτε το αρχείο `main.cpp`. + +1. Προσθέστε τις παρακάτω οδηγίες `#include` στην κορυφή του αρχείου: + + ```cpp + #include + #include + #include + + #include "config.h" + ``` + + Αυτό περιλαμβάνει αρχεία κεφαλίδας για τις βιβλιοθήκες που προσθέσατε νωρίτερα, καθώς και το αρχείο κεφαλίδας config. Αυτά τα αρχεία κεφαλίδας είναι απαραίτητα για να πείτε στο PlatformIO να φέρει τον κώδικα από τις βιβλιοθήκες. Χωρίς να συμπεριλάβετε ρητά αυτά τα αρχεία κεφαλίδας, ορισμένος κώδικας δεν θα μεταγλωττιστεί και θα λάβετε σφάλματα μεταγλώττισης. + +1. Προσθέστε τον παρακάτω κώδικα πάνω από τη συνάρτηση `setup`: + + ```cpp + void connectWiFi() + { + while (WiFi.status() != WL_CONNECTED) + { + Serial.println("Connecting to WiFi.."); + WiFi.begin(SSID, PASSWORD); + delay(500); + } + + Serial.println("Connected!"); + } + ``` + + Αυτός ο κώδικας επαναλαμβάνεται όσο η συσκευή δεν είναι συνδεδεμένη στο WiFi και προσπαθεί να συνδεθεί χρησιμοποιώντας το SSID και τον κωδικό πρόσβασης από το αρχείο κεφαλίδας config. + +1. Προσθέστε μια κλήση σε αυτήν τη συνάρτηση στο κάτω μέρος της συνάρτησης `setup`, αφού έχουν διαμορφωθεί οι ακροδέκτες. + + ```cpp + connectWiFi(); + ``` + +1. Μεταφορτώστε αυτόν τον κώδικα στη συσκευή σας για να ελέγξετε ότι η σύνδεση WiFi λειτουργεί. Θα πρέπει να δείτε αυτό στην οθόνη σειριακής παρακολούθησης. + + ```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! + ``` + +## Σύνδεση στο MQTT + +Μόλις το Wio Terminal συνδεθεί στο WiFi, μπορεί να συνδεθεί στον MQTT broker. + +### Εργασία - σύνδεση στο MQTT + +Συνδεθείτε στον MQTT broker. + +1. Προσθέστε τον παρακάτω κώδικα στο κάτω μέρος του αρχείου `config.h` για να ορίσετε τις λεπτομέρειες σύνδεσης για τον MQTT broker: + + ```cpp + // MQTT settings + const string ID = ""; + + const string BROKER = "test.mosquitto.org"; + const string CLIENT_NAME = ID + "nightlight_client"; + ``` + + Αντικαταστήστε το `` με ένα μοναδικό ID που θα χρησιμοποιηθεί ως όνομα του client της συσκευής αυτής και αργότερα για τα θέματα που αυτή η συσκευή δημοσιεύει και εγγράφεται. Ο broker *test.mosquitto.org* είναι δημόσιος και χρησιμοποιείται από πολλούς ανθρώπους, συμπεριλαμβανομένων άλλων μαθητών που εργάζονται σε αυτήν την εργασία. Έχοντας ένα μοναδικό όνομα client MQTT και ονόματα θεμάτων διασφαλίζει ότι ο κώδικάς σας δεν θα συγκρουστεί με κανενός άλλου. Θα χρειαστείτε επίσης αυτό το ID όταν δημιουργείτε τον κώδικα του server αργότερα σε αυτήν την εργασία. + + > 💁 Μπορείτε να χρησιμοποιήσετε έναν ιστότοπο όπως το [GUIDGen](https://www.guidgen.com) για να δημιουργήσετε ένα μοναδικό ID. + + Το `BROKER` είναι το URL του MQTT broker. + + Το `CLIENT_NAME` είναι ένα μοναδικό όνομα για αυτόν τον MQTT client στον broker. + +1. Ανοίξτε το αρχείο `main.cpp` και προσθέστε τον παρακάτω κώδικα κάτω από τη συνάρτηση `connectWiFi` και πάνω από τη συνάρτηση `setup`: + + ```cpp + WiFiClient wioClient; + PubSubClient client(wioClient); + ``` + + Αυτός ο κώδικας δημιουργεί έναν WiFi client χρησιμοποιώντας τις βιβλιοθήκες WiFi του Wio Terminal και τον χρησιμοποιεί για να δημιουργήσει έναν MQTT client. + +1. Κάτω από αυτόν τον κώδικα, προσθέστε τα εξής: + + ```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); + } + } + } + ``` + + Αυτή η συνάρτηση δοκιμάζει τη σύνδεση με τον MQTT broker και επανασυνδέεται αν δεν είναι συνδεδεμένη. Επαναλαμβάνεται συνεχώς όσο δεν είναι συνδεδεμένη και προσπαθεί να συνδεθεί χρησιμοποιώντας το μοναδικό όνομα client που ορίζεται στο αρχείο κεφαλίδας config. + + Αν η σύνδεση αποτύχει, επαναπροσπαθεί μετά από 5 δευτερόλεπτα. + +1. Προσθέστε τον παρακάτω κώδικα κάτω από τη συνάρτηση `reconnectMQTTClient`: + + ```cpp + void createMQTTClient() + { + client.setServer(BROKER.c_str(), 1883); + reconnectMQTTClient(); + } + ``` + + Αυτός ο κώδικας ορίζει τον MQTT broker για τον client, καθώς και τη ρύθμιση της επιστροφής κλήσης όταν λαμβάνεται ένα μήνυμα. Στη συνέχεια, προσπαθεί να συνδεθεί στον broker. + +1. Καλέστε τη συνάρτηση `createMQTTClient` στη συνάρτηση `setup` αφού συνδεθεί το WiFi. + +1. Αντικαταστήστε ολόκληρη τη συνάρτηση `loop` με τα εξής: + + ```cpp + void loop() + { + reconnectMQTTClient(); + client.loop(); + + delay(2000); + } + ``` + + Αυτός ο κώδικας ξεκινά με την επανασύνδεση στον MQTT broker. Αυτές οι συνδέσεις μπορεί να διακοπούν εύκολα, οπότε αξίζει να ελέγχετε τακτικά και να επανασυνδέεστε αν χρειάζεται. Στη συνέχεια, καλεί τη μέθοδο `loop` στον MQTT client για να επεξεργαστεί τυχόν μηνύματα που έρχονται στο θέμα στο οποίο έχει εγγραφεί. Αυτή η εφαρμογή είναι μονονηματική, οπότε τα μηνύματα δεν μπορούν να ληφθούν σε ένα νήμα παρασκηνίου, επομένως πρέπει να διατεθεί χρόνος στο κύριο νήμα για την επεξεργασία τυχόν μηνυμάτων που περιμένουν στη σύνδεση δικτύου. + + Τέλος, μια καθυστέρηση 2 δευτερολέπτων διασφαλίζει ότι τα επίπεδα φωτός δεν αποστέλλονται πολύ συχνά και μειώνει την κατανάλωση ενέργειας της συσκευής. + +1. Μεταφορτώστε τον κώδικα στο Wio Terminal σας και χρησιμοποιήστε τη Σειριακή Παρακολούθηση για να δείτε τη συσκευή να συνδέεται στο WiFi και το 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 + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-mqtt/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal). + +😀 Έχετε συνδέσει με επιτυχία τη συσκευή σας σε έναν MQTT broker. + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md b/translations/el/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md new file mode 100644 index 00000000..f97bf4be --- /dev/null +++ b/translations/el/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md @@ -0,0 +1,93 @@ + +# Ελέγξτε το νυχτερινό σας φως μέσω του Διαδικτύου - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα στείλετε τηλεμετρία με επίπεδα φωτός από το Wio Terminal σας στον MQTT broker. + +## Εγκατάσταση των βιβλιοθηκών JSON για Arduino + +Ένας δημοφιλής τρόπος για να στέλνετε μηνύματα μέσω MQTT είναι χρησιμοποιώντας JSON. Υπάρχει μια βιβλιοθήκη για Arduino που κάνει την ανάγνωση και τη συγγραφή εγγράφων JSON πιο εύκολη. + +### Εργασία + +Εγκαταστήστε τη βιβλιοθήκη Arduino JSON. + +1. Ανοίξτε το έργο του νυχτερινού φωτός στο VS Code. + +1. Προσθέστε την παρακάτω γραμμή στη λίστα `lib_deps` στο αρχείο `platformio.ini`: + + ```ini + bblanchon/ArduinoJson @ 6.17.3 + ``` + + Αυτό εισάγει το [ArduinoJson](https://arduinojson.org), μια βιβλιοθήκη JSON για Arduino. + +## Δημοσίευση τηλεμετρίας + +Το επόμενο βήμα είναι να δημιουργήσετε ένα έγγραφο JSON με τηλεμετρία και να το στείλετε στον MQTT broker. + +### Εργασία - δημοσίευση τηλεμετρίας + +Δημοσιεύστε τηλεμετρία στον MQTT broker. + +1. Προσθέστε τον παρακάτω κώδικα στο τέλος του αρχείου `config.h` για να ορίσετε το όνομα του θέματος τηλεμετρίας για τον MQTT broker: + + ```cpp + const string CLIENT_TELEMETRY_TOPIC = ID + "/telemetry"; + ``` + + Το `CLIENT_TELEMETRY_TOPIC` είναι το θέμα στο οποίο η συσκευή θα δημοσιεύει τα επίπεδα φωτός. + +1. Ανοίξτε το αρχείο `main.cpp`. + +1. Προσθέστε την παρακάτω οδηγία `#include` στην κορυφή του αρχείου: + + ```cpp + #include + ``` + +1. Προσθέστε τον παρακάτω κώδικα μέσα στη συνάρτηση `loop`, ακριβώς πριν από το `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()); + ``` + + Αυτός ο κώδικας διαβάζει το επίπεδο φωτός και δημιουργεί ένα έγγραφο JSON χρησιμοποιώντας το ArduinoJson που περιέχει αυτό το επίπεδο. Στη συνέχεια, αυτό μετατρέπεται σε συμβολοσειρά και δημοσιεύεται στο θέμα τηλεμετρίας MQTT από τον MQTT client. + +1. Μεταφορτώστε τον κώδικα στο Wio Terminal σας και χρησιμοποιήστε το Serial Monitor για να δείτε τα επίπεδα φωτός που αποστέλλονται στον MQTT broker. + + ```output + Connecting to WiFi.. + Connected! + Attempting MQTT connection...connected + Sending telemetry {"light":652} + Sending telemetry {"light":612} + Sending telemetry {"light":583} + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-telemetry/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal). + +😀 Έχετε στείλει επιτυχώς τηλεμετρία από τη συσκευή σας. + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/README.md b/translations/el/2-farm/README.md new file mode 100644 index 00000000..f4591fd0 --- /dev/null +++ b/translations/el/2-farm/README.md @@ -0,0 +1,34 @@ + +# Γεωργία με IoT + +Καθώς ο πληθυσμός αυξάνεται, αυξάνεται και η ζήτηση για γεωργία. Η ποσότητα της διαθέσιμης γης δεν αλλάζει, αλλά το κλίμα μεταβάλλεται - δημιουργώντας ακόμα περισσότερες προκλήσεις για τους αγρότες, ειδικά για τους 2 δισεκατομμύρια [αγρότες επιβίωσης](https://wikipedia.org/wiki/Subsistence_agriculture) που βασίζονται σε ό,τι καλλιεργούν για να φάνε και να θρέψουν τις οικογένειές τους. Το IoT μπορεί να βοηθήσει τους αγρότες να παίρνουν πιο έξυπνες αποφάσεις για το τι να καλλιεργήσουν και πότε να συγκομίσουν, να αυξήσουν τις αποδόσεις, να μειώσουν την ποσότητα χειρωνακτικής εργασίας και να εντοπίσουν και να αντιμετωπίσουν τα παράσιτα. + +Σε αυτά τα 6 μαθήματα θα μάθετε πώς να εφαρμόσετε το Διαδίκτυο των Πραγμάτων για να βελτιώσετε και να αυτοματοποιήσετε τη γεωργία. + +> 💁 Αυτά τα μαθήματα θα χρησιμοποιήσουν κάποιους πόρους στο cloud. Εάν δεν ολοκληρώσετε όλα τα μαθήματα αυτού του έργου, βεβαιωθείτε ότι έχετε [Καθαρίσει το έργο σας](../clean-up.md). + +## Θέματα + +1. [Πρόβλεψη ανάπτυξης φυτών με IoT](lessons/1-predict-plant-growth/README.md) +1. [Ανίχνευση υγρασίας εδάφους](lessons/2-detect-soil-moisture/README.md) +1. [Αυτοματοποιημένο πότισμα φυτών](lessons/3-automated-plant-watering/README.md) +1. [Μεταφορά του φυτού σας στο cloud](lessons/4-migrate-your-plant-to-the-cloud/README.md) +1. [Μεταφορά της λογικής της εφαρμογής σας στο cloud](lessons/5-migrate-application-to-the-cloud/README.md) +1. [Διατήρηση της ασφάλειας του φυτού σας](lessons/6-keep-your-plant-secure/README.md) + +## Συντελεστές + +Όλα τα μαθήματα γράφτηκαν με ♥️ από τον [Jim Bennett](https://GitHub.com/JimBobBennett) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/1-predict-plant-growth/README.md b/translations/el/2-farm/lessons/1-predict-plant-growth/README.md new file mode 100644 index 00000000..b3dbe458 --- /dev/null +++ b/translations/el/2-farm/lessons/1-predict-plant-growth/README.md @@ -0,0 +1,221 @@ + +## Προβλέψτε την ανάπτυξη φυτών με IoT + +![Μια σκίτσα που συνοψίζει το μάθημα](../../../../../translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.el.jpg) + +> Σκίτσα από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +## Ερωτηματολόγιο πριν το μάθημα + +[Ερωτηματολόγιο πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/9) + +## Εισαγωγή + +Τα φυτά χρειάζονται ορισμένα πράγματα για να αναπτυχθούν - νερό, διοξείδιο του άνθρακα, θρεπτικά συστατικά, φως και θερμότητα. Σε αυτό το μάθημα, θα μάθετε πώς να υπολογίζετε τους ρυθμούς ανάπτυξης και ωρίμανσης των φυτών μετρώντας τη θερμοκρασία του αέρα. + +Σε αυτό το μάθημα θα καλύψουμε: + +* [Ψηφιακή γεωργία](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Γιατί είναι σημαντική η θερμοκρασία στη γεωργία;](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Μέτρηση της θερμοκρασίας περιβάλλοντος](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Ημέρες βαθμών ανάπτυξης (GDD)](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Υπολογισμός GDD χρησιμοποιώντας δεδομένα από αισθητήρες θερμοκρασίας](../../../../../2-farm/lessons/1-predict-plant-growth) + +## Ψηφιακή γεωργία + +Η Ψηφιακή Γεωργία μεταμορφώνει τον τρόπο που καλλιεργούμε, χρησιμοποιώντας εργαλεία για τη συλλογή, αποθήκευση και ανάλυση δεδομένων από τη γεωργία. Βρισκόμαστε σε μια περίοδο που περιγράφεται ως η 'Τέταρτη Βιομηχανική Επανάσταση' από το Παγκόσμιο Οικονομικό Φόρουμ, και η άνοδος της ψηφιακής γεωργίας έχει χαρακτηριστεί ως η 'Τέταρτη Γεωργική Επανάσταση', ή 'Γεωργία 4.0'. + +> 🎓 Ο όρος Ψηφιακή Γεωργία περιλαμβάνει επίσης ολόκληρη την 'αλυσίδα αξίας της γεωργίας', δηλαδή όλη τη διαδρομή από το αγρόκτημα στο τραπέζι. Περιλαμβάνει την παρακολούθηση της ποιότητας των προϊόντων καθώς μεταφέρονται και επεξεργάζονται, συστήματα αποθήκευσης και ηλεκτρονικού εμπορίου, ακόμη και εφαρμογές ενοικίασης τρακτέρ! + +Αυτές οι αλλαγές επιτρέπουν στους αγρότες να αυξήσουν τις αποδόσεις, να χρησιμοποιούν λιγότερα λιπάσματα και φυτοφάρμακα και να ποτίζουν πιο αποτελεσματικά. Παρόλο που χρησιμοποιούνται κυρίως σε πλουσιότερες χώρες, οι αισθητήρες και άλλες συσκευές μειώνουν σταδιακά το κόστος τους, καθιστώντας τους πιο προσιτούς στις αναπτυσσόμενες χώρες. + +Μερικές τεχνικές που επιτρέπονται από την ψηφιακή γεωργία είναι: + +* Μέτρηση θερμοκρασίας - η μέτρηση της θερμοκρασίας επιτρέπει στους αγρότες να προβλέπουν την ανάπτυξη και την ωρίμανση των φυτών. +* Αυτόματο πότισμα - μέτρηση της υγρασίας του εδάφους και ενεργοποίηση των συστημάτων άρδευσης όταν το έδαφος είναι πολύ ξηρό, αντί για προγραμματισμένο πότισμα. Το προγραμματισμένο πότισμα μπορεί να οδηγήσει σε υπο-πότισμα κατά τη διάρκεια μιας ζεστής, ξηρής περιόδου ή υπερ-πότισμα κατά τη διάρκεια βροχής. Με το πότισμα μόνο όταν το έδαφος το χρειάζεται, οι αγρότες μπορούν να βελτιστοποιήσουν τη χρήση του νερού. +* Έλεγχος παρασίτων - οι αγρότες μπορούν να χρησιμοποιούν κάμερες σε αυτόματα ρομπότ ή drones για να ελέγχουν για παράσιτα και να εφαρμόζουν φυτοφάρμακα μόνο όπου χρειάζεται, μειώνοντας την ποσότητα των φυτοφαρμάκων που χρησιμοποιούνται και την απορροή φυτοφαρμάκων στις τοπικές πηγές νερού. + +✅ Κάντε λίγη έρευνα. Ποιες άλλες τεχνικές χρησιμοποιούνται για τη βελτίωση των γεωργικών αποδόσεων; + +> 🎓 Ο όρος 'Ακριβής Γεωργία' χρησιμοποιείται για να ορίσει την παρατήρηση, μέτρηση και αντίδραση στις καλλιέργειες σε βάση ανά χωράφι ή ακόμη και σε τμήματα ενός χωραφιού. Αυτό περιλαμβάνει τη μέτρηση των επιπέδων νερού, θρεπτικών συστατικών και παρασίτων και την ακριβή αντίδραση, όπως το πότισμα μόνο ενός μικρού τμήματος ενός χωραφιού. + +## Γιατί είναι σημαντική η θερμοκρασία στη γεωργία; + +Όταν μαθαίνουμε για τα φυτά, οι περισσότεροι μαθητές διδάσκονται για την ανάγκη νερού, φωτός, διοξειδίου του άνθρακα και θρεπτικών συστατικών. Τα φυτά χρειάζονται επίσης ζεστασιά για να αναπτυχθούν - γι' αυτό τα φυτά ανθίζουν την άνοιξη καθώς η θερμοκρασία αυξάνεται, γιατί οι γάλανθοι ή οι νάρκισσοι μπορούν να φυτρώσουν νωρίς λόγω μιας σύντομης ζεστής περιόδου, και γιατί τα θερμοκήπια είναι τόσο αποτελεσματικά στην ανάπτυξη φυτών. + +> 🎓 Τα θερμοκήπια και τα θερμοσπίτια κάνουν παρόμοια δουλειά, αλλά με μια σημαντική διαφορά. Τα θερμοσπίτια θερμαίνονται τεχνητά και επιτρέπουν στους αγρότες να ελέγχουν τη θερμοκρασία πιο ακριβώς, ενώ τα θερμοκήπια βασίζονται στον ήλιο για ζεστασιά και συνήθως ο μόνος έλεγχος είναι τα παράθυρα ή άλλες ανοίξεις για να αφήσουν τη θερμότητα να βγει. + +Τα φυτά έχουν μια βασική ή ελάχιστη θερμοκρασία, μια βέλτιστη θερμοκρασία και μια μέγιστη θερμοκρασία, όλες βασισμένες στις μέσες ημερήσιες θερμοκρασίες. + +* Βασική θερμοκρασία - αυτή είναι η ελάχιστη μέση ημερήσια θερμοκρασία που χρειάζεται ένα φυτό για να αναπτυχθεί. +* Βέλτιστη θερμοκρασία - αυτή είναι η καλύτερη μέση ημερήσια θερμοκρασία για τη μέγιστη ανάπτυξη. +* Μέγιστη θερμοκρασία - αυτή είναι η μέγιστη θερμοκρασία που μπορεί να αντέξει ένα φυτό. Πάνω από αυτήν, το φυτό θα σταματήσει την ανάπτυξή του σε μια προσπάθεια να διατηρήσει νερό και να επιβιώσει. + +> 💁 Αυτές είναι μέσες θερμοκρασίες, υπολογισμένες από τις ημερήσιες και νυχτερινές θερμοκρασίες. Τα φυτά χρειάζονται επίσης διαφορετικές θερμοκρασίες μέρα και νύχτα για να φωτοσυνθέσουν πιο αποτελεσματικά και να εξοικονομήσουν ενέργεια τη νύχτα. + +Κάθε είδος φυτού έχει διαφορετικές τιμές για τη βασική, βέλτιστη και μέγιστη θερμοκρασία. Γι' αυτό ορισμένα φυτά ευδοκιμούν σε ζεστές χώρες, ενώ άλλα σε πιο ψυχρές. + +✅ Κάντε λίγη έρευνα. Για οποιαδήποτε φυτά έχετε στον κήπο σας, στο σχολείο ή στο τοπικό πάρκο, δείτε αν μπορείτε να βρείτε τη βασική θερμοκρασία τους. + +![Γράφημα που δείχνει τον ρυθμό ανάπτυξης να αυξάνεται καθώς αυξάνεται η θερμοκρασία, και να μειώνεται όταν η θερμοκρασία γίνεται πολύ υψηλή](../../../../../translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.el.png) + +Το παραπάνω γράφημα δείχνει ένα παράδειγμα γραφήματος ρυθμού ανάπτυξης σε σχέση με τη θερμοκρασία. Μέχρι τη βασική θερμοκρασία δεν υπάρχει ανάπτυξη. Ο ρυθμός ανάπτυξης αυξάνεται μέχρι τη βέλτιστη θερμοκρασία και στη συνέχεια μειώνεται μετά την κορύφωση. + +Το σχήμα αυτού του γραφήματος διαφέρει από είδος φυτού σε είδος φυτού. Ορισμένα έχουν πιο απότομες πτώσεις πάνω από τη βέλτιστη θερμοκρασία, ενώ άλλα έχουν πιο αργές αυξήσεις από τη βασική στη βέλτιστη θερμοκρασία. + +> 💁 Για να επιτύχει ο αγρότης την καλύτερη ανάπτυξη, θα πρέπει να γνωρίζει τις τρεις τιμές θερμοκρασίας και να κατανοεί το σχήμα των γραφημάτων για τα φυτά που καλλιεργεί. + +Εάν ένας αγρότης έχει έλεγχο της θερμοκρασίας, για παράδειγμα σε ένα εμπορικό θερμοκήπιο, τότε μπορεί να βελτιστοποιήσει τις συνθήκες για τα φυτά του. Ένα εμπορικό θερμοκήπιο που καλλιεργεί ντομάτες, για παράδειγμα, θα έχει τη θερμοκρασία ρυθμισμένη γύρω στους 25°C κατά τη διάρκεια της ημέρας και 20°C τη νύχτα για την ταχύτερη ανάπτυξη. + +> 🍅 Συνδυάζοντας αυτές τις θερμοκρασίες με τεχνητό φωτισμό, λιπάσματα και ελεγχόμενα επίπεδα διοξειδίου του άνθρακα, οι εμπορικοί καλλιεργητές μπορούν να καλλιεργούν και να συγκομίζουν όλο το χρόνο. + +## Μέτρηση της θερμοκρασίας περιβάλλοντος + +Οι αισθητήρες θερμοκρασίας μπορούν να χρησιμοποιηθούν με συσκευές IoT για τη μέτρηση της θερμοκρασίας περιβάλλοντος. + +### Εργασία - μέτρηση θερμοκρασίας + +Ακολουθήστε τον αντίστοιχο οδηγό για να παρακολουθήσετε τις θερμοκρασίες χρησιμοποιώντας τη συσκευή IoT σας: + +* [Arduino - Wio Terminal](wio-terminal-temp.md) +* [Υπολογιστής μονού πίνακα - Raspberry Pi](pi-temp.md) +* [Υπολογιστής μονού πίνακα - Εικονική συσκευή](virtual-device-temp.md) + +## Ημέρες βαθμών ανάπτυξης + +Οι ημέρες βαθμών ανάπτυξης (γνωστές και ως μονάδες βαθμών ανάπτυξης) είναι ένας τρόπος μέτρησης της ανάπτυξης των φυτών με βάση τη θερμοκρασία. Υποθέτοντας ότι ένα φυτό έχει αρκετό νερό, θρεπτικά συστατικά και διοξείδιο του άνθρακα, η θερμοκρασία καθορίζει τον ρυθμό ανάπτυξης. + +Οι ημέρες βαθμών ανάπτυξης, ή GDD, υπολογίζονται ανά ημέρα ως η μέση θερμοκρασία σε βαθμούς Κελσίου για μια ημέρα πάνω από τη βασική θερμοκρασία του φυτού. Κάθε φυτό χρειάζεται έναν συγκεκριμένο αριθμό GDD για να αναπτυχθεί, να ανθίσει ή να παράγει και να ωριμάσει μια καλλιέργεια. Όσο περισσότερα GDD κάθε μέρα, τόσο πιο γρήγορα θα αναπτυχθεί το φυτό. + +> 🇺🇸 Για τους Αμερικανούς, οι ημέρες βαθμών ανάπτυξης μπορούν επίσης να υπολογιστούν χρησιμοποιώντας Φαρενάιτ. 5 GDD (σε Κελσίου) ισοδυναμούν με 9 GDD (σε Φαρενάιτ). + +Η πλήρης φόρμουλα για GDD είναι λίγο περίπλοκη, αλλά υπάρχει μια απλοποιημένη εξίσωση που χρησιμοποιείται συχνά ως καλή προσέγγιση: + +![GDD = T max + T min divided by 2, all minus T base](../../../../../translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.el.png) + +* **GDD** - αυτός είναι ο αριθμός των ημερών βαθμών ανάπτυξης +* **T max** - αυτή είναι η μέγιστη ημερήσια θερμοκρασία σε βαθμούς Κελσίου +* **T min** - αυτή είναι η ελάχιστη ημερήσια θερμοκρασία σε βαθμούς Κελσίου +* **T base** - αυτή είναι η βασική θερμοκρασία του φυτού σε βαθμούς Κελσίου + +> 💁 Υπάρχουν παραλλαγές που ασχολούνται με θερμοκρασίες πάνω από 30°C ή κάτω από τη βασική θερμοκρασία, αλλά θα τις αγνοήσουμε προς το παρόν. + +### Παράδειγμα - Καλαμπόκι 🌽 + +Ανάλογα με την ποικιλία, το καλαμπόκι χρειάζεται μεταξύ 800 και 2,700 GDD για να ωριμάσει, με βασική θερμοκρασία 10°C. + +Την πρώτη ημέρα πάνω από τη βασική θερμοκρασία, μετρήθηκαν οι εξής θερμοκρασίες: + +| Μέτρηση | Θερμοκρασία °C | +| :---------- | :-----: | +| Μέγιστη | 16 | +| Ελάχιστη | 12 | + +Βάζοντας αυτούς τους αριθμούς στον υπολογισμό: + +* T max = 16 +* T min = 12 +* T base = 10 + +Αυτό δίνει τον υπολογισμό: + +![GDD = 16 + 12 divided by 2, all minus 10, giving an answer of 4](../../../../../translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.el.png) + +Το καλαμπόκι έλαβε 4 GDD εκείνη την ημέρα. Υποθέτοντας μια ποικιλία καλαμποκιού που χρειάζεται 800 GDD για να ωριμάσει, θα χρειαστεί άλλες 796 GDD για να φτάσει στην ωριμότητα. + +✅ Κάντε λίγη έρευνα. Για οποιαδήποτε φυτά έχετε στον κήπο σας, στο σχολείο ή στο τοπικό πάρκο, δείτε αν μπορείτε να βρείτε τον αριθμό των GDD που απαιτούνται για να φτάσουν στην ωριμότητα ή να παράγουν καλλιέργειες. + +## Υπολογισμός GDD χρησιμοποιώντας δεδομένα από αισθητήρες θερμοκρασίας + +Τα φυτά δεν αναπτύσσονται σε σταθερές ημερομηνίες - για παράδειγμα, δεν μπορείτε να φυτέψετε έναν σπόρο και να γνωρίζετε ότι το φυτό θα δώσει καρπούς ακριβώς 100 ημέρες αργότερα. Αντίθετα, ως αγρότης μπορείτε να έχετε μια γενική ιδέα για το πόσο χρόνο χρειάζεται ένα φυτό για να αναπτυχθεί και στη συνέχεια να ελέγχετε καθημερινά για να δείτε πότε οι καλλιέργειες είναι έτοιμες. + +Αυτό έχει μεγάλο αντίκτυπο στην εργασία σε μια μεγάλη φάρμα και υπάρχει ο κίνδυνος ο αγρότης να χάσει καλλιέργειες που είναι έτοιμες απροσδόκητα νωρίς. Μετρώντας τις θερμοκρασίες, ο αγρότης μπορεί να υπολογίσει τα GDD που έχει λάβει ένα φυτό, επιτρέποντάς του να ελέγχει μόνο κοντά στην αναμενόμενη ωριμότητα. + +Με τη συλλογή δεδομένων θερμοκρασίας χρησιμοποιώντας μια συσκευή IoT, ένας αγρότης μπορεί να ειδοποιηθεί αυτόματα όταν τα φυτά πλησιάζουν στην ωριμότητα. Μια τυπική αρχιτεκτονική για αυτό είναι να μετράνε οι συσκευές IoT τη θερμοκρασία και στη συνέχεια να δημοσιεύουν αυτά τα δεδομένα τηλεμετρίας μέσω του Διαδικτύου χρησιμοποιώντας κάτι όπως το MQTT. Ο κώδικας του διακομιστή στη συνέχεια ακούει αυτά τα δεδομένα και τα αποθηκεύει κάπου, όπως σε μια βάση δεδομένων. Αυτό σημαίνει ότι τα δεδομένα μπορούν να αναλυθούν αργότερα, όπως μια νυχτερινή εργασία για τον υπολογισμό των GDD της ημέρας, την προσθήκη των συνολικών GDD για κάθε καλλιέργεια μέχρι στιγμής και την ειδοποίηση εάν ένα φυτό πλησιάζει στην ωριμότητα. + +![Τα δεδομένα τηλεμετρίας αποστέλλονται σε έναν διακομιστή και στη συνέχεια αποθηκεύονται σε μια βάση δεδομένων](../../../../../translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.el.png) + +Ο κώδικας του διακομιστή μπορεί επίσης να εμπλουτίσει τα δεδομένα προσθέτοντας επιπλέον πληροφορίες. Για παράδειγμα, η συσκευή IoT μπορεί να δημοσιεύσει έναν αναγνωριστικό για να υποδείξει ποια συσκευή είναι, και ο κώδικας του διακομιστή μπορεί να χρησιμοποιήσει αυτόν τον αναγνωριστικό για να βρει την τοποθεσία της συσκευής και ποιες καλλιέργειες παρακολουθεί. Μπορεί επίσης να προσθέσει βασικά δεδομένα όπως την τρέχουσα ώρα, καθώς ορισμένες συσκευές IoT δεν διαθέτουν το απαραίτητο υλικό για να παρακολουθούν με ακρίβεια την ώρα ή απαιτούν πρόσθετο κώδικα για να διαβάσουν την τρέχουσα ώρα μέσω του Διαδικτύου. + +✅ Γιατί πιστεύετε ότι διαφορετικά χωράφια μπορεί να έχουν διαφορετικές θερμοκρασίες; + +### Εργασία - δημοσίευση πληροφοριών θερμοκρασίας + +Ακολουθήστε τον αντίστοι +Αυτός ο κώδικας ανοίγει το αρχείο CSV και προσθέτει μια νέα γραμμή στο τέλος. Η γραμμή περιέχει την τρέχουσα ημερομηνία και ώρα σε μορφή κατανοητή από τον άνθρωπο, ακολουθούμενη από τη θερμοκρασία που λαμβάνεται από τη συσκευή IoT. Τα δεδομένα αποθηκεύονται σε [μορφή ISO 8601](https://wikipedia.org/wiki/ISO_8601) με τη ζώνη ώρας, αλλά χωρίς μικροδευτερόλεπτα. + +1. Εκτελέστε αυτόν τον κώδικα όπως και πριν, διασφαλίζοντας ότι η συσκευή IoT σας στέλνει δεδομένα. Ένα αρχείο CSV με όνομα `temperature.csv` θα δημιουργηθεί στον ίδιο φάκελο. Αν το ανοίξετε, θα δείτε ημερομηνίες/ώρες και μετρήσεις θερμοκρασίας: + + ```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. Εκτελέστε αυτόν τον κώδικα για κάποιο χρονικό διάστημα ώστε να συλλέξετε δεδομένα. Ιδανικά, θα πρέπει να τον εκτελέσετε για μια ολόκληρη ημέρα για να συγκεντρώσετε αρκετά δεδομένα για τους υπολογισμούς GDD. + + +> 💁 Αν χρησιμοποιείτε Εικονική Συσκευή IoT, επιλέξτε το τυχαίο checkbox και ορίστε ένα εύρος για να αποφύγετε την επιστροφή της ίδιας θερμοκρασίας κάθε φορά που επιστρέφεται η τιμή θερμοκρασίας. + ![Επιλέξτε το τυχαίο checkbox και ορίστε ένα εύρος](../../../../../translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.el.png) + + > 💁 Αν θέλετε να το εκτελέσετε για μια ολόκληρη ημέρα, τότε πρέπει να διασφαλίσετε ότι ο υπολογιστής στον οποίο εκτελείται ο κώδικας του διακομιστή σας δεν θα μπει σε κατάσταση ύπνου, είτε αλλάζοντας τις ρυθμίσεις ενέργειας, είτε εκτελώντας κάτι όπως [αυτό το Python script για να διατηρήσετε το σύστημα ενεργό](https://github.com/jaqsparow/keep-system-active). + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-server/temperature-sensor-server](../../../../../2-farm/lessons/1-predict-plant-growth/code-server/temperature-sensor-server). + +### Εργασία - Υπολογισμός GDD χρησιμοποιώντας τα αποθηκευμένα δεδομένα + +Αφού ο διακομιστής έχει καταγράψει δεδομένα θερμοκρασίας, μπορεί να υπολογιστεί το GDD για ένα φυτό. + +Τα βήματα για να το κάνετε αυτό χειροκίνητα είναι: + +1. Βρείτε τη βασική θερμοκρασία για το φυτό. Για παράδειγμα, για τις φράουλες η βασική θερμοκρασία είναι 10°C. + +1. Από το `temperature.csv`, βρείτε τις υψηλότερες και χαμηλότερες θερμοκρασίες της ημέρας. + +1. Χρησιμοποιήστε τον υπολογισμό GDD που δόθηκε νωρίτερα για να υπολογίσετε το GDD. + +Για παράδειγμα, αν η υψηλότερη θερμοκρασία της ημέρας είναι 25°C και η χαμηλότερη είναι 12°C: + +![GDD = 25 + 12 διαιρούμενο με το 2, και μετά αφαιρούμε 10 από το αποτέλεσμα, δίνοντας 8.5](../../../../../translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.el.png) + +* 25 + 12 = 37 +* 37 / 2 = 18.5 +* 18.5 - 10 = 8.5 + +Επομένως, οι φράουλες έχουν λάβει **8.5** GDD. Οι φράουλες χρειάζονται περίπου 250 GDD για να καρποφορήσουν, οπότε υπάρχει ακόμα δρόμος. + +--- + +## 🚀 Πρόκληση + +Τα φυτά χρειάζονται περισσότερα από θερμότητα για να αναπτυχθούν. Τι άλλα πράγματα χρειάζονται; + +Για αυτά, βρείτε αν υπάρχουν αισθητήρες που μπορούν να τα μετρήσουν. Τι γίνεται με ενεργοποιητές για να ελέγξετε αυτά τα επίπεδα; Πώς θα συνδυάζατε μία ή περισσότερες συσκευές IoT για να βελτιστοποιήσετε την ανάπτυξη των φυτών; + +## Κουίζ μετά το μάθημα + +[Κουίζ μετά το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/10) + +## Ανασκόπηση & Αυτομελέτη + +* Διαβάστε περισσότερα για την ψηφιακή γεωργία στη [σελίδα Wikipedia για την Ψηφιακή Γεωργία](https://wikipedia.org/wiki/Digital_agriculture). Επίσης, διαβάστε περισσότερα για την ακριβή γεωργία στη [σελίδα Wikipedia για την Ακριβή Γεωργία](https://wikipedia.org/wiki/Precision_agriculture). +* Ο πλήρης υπολογισμός των βαθμοημερών ανάπτυξης (GDD) είναι πιο περίπλοκος από τον απλοποιημένο που δόθηκε εδώ. Διαβάστε περισσότερα για την πιο περίπλοκη εξίσωση και πώς να αντιμετωπίσετε θερμοκρασίες κάτω από τη βασική στη [σελίδα Wikipedia για τις Βαθμοημέρες Ανάπτυξης](https://wikipedia.org/wiki/Growing_degree-day). +* Τα τρόφιμα μπορεί να είναι σπάνια στο μέλλον αν συνεχίσουμε να χρησιμοποιούμε τις ίδιες μεθόδους γεωργίας. Μάθετε περισσότερα για τις τεχνολογικές μεθόδους γεωργίας σε αυτό το [βίντεο για τις Υψηλής Τεχνολογίας Φάρμες του Μέλλοντος στο YouTube](https://www.youtube.com/watch?v=KIEOuKD9KX8). + +## Εργασία + +[Οπτικοποιήστε τα δεδομένα GDD χρησιμοποιώντας ένα Jupyter Notebook](assignment.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/1-predict-plant-growth/assignment.md b/translations/el/2-farm/lessons/1-predict-plant-growth/assignment.md new file mode 100644 index 00000000..649a97ac --- /dev/null +++ b/translations/el/2-farm/lessons/1-predict-plant-growth/assignment.md @@ -0,0 +1,57 @@ + +# Οπτικοποίηση δεδομένων GDD χρησιμοποιώντας ένα Jupyter Notebook + +## Οδηγίες + +Σε αυτό το μάθημα συλλέξατε δεδομένα GDD χρησιμοποιώντας έναν αισθητήρα IoT. Για να έχετε καλά δεδομένα GDD, πρέπει να συλλέξετε δεδομένα για πολλές ημέρες. Για να βοηθηθείτε στην οπτικοποίηση των δεδομένων θερμοκρασίας και τον υπολογισμό του GDD, μπορείτε να χρησιμοποιήσετε εργαλεία όπως το [Jupyter Notebooks](https://jupyter.org) για να αναλύσετε τα δεδομένα. + +Ξεκινήστε συλλέγοντας δεδομένα για μερικές ημέρες. Θα χρειαστεί να βεβαιωθείτε ότι ο κώδικας του server σας λειτουργεί συνεχώς όσο λειτουργεί η συσκευή IoT σας, είτε προσαρμόζοντας τις ρυθμίσεις διαχείρισης ενέργειας είτε εκτελώντας κάτι όπως [αυτό το Python script για να διατηρεί το σύστημα ενεργό](https://github.com/jaqsparow/keep-system-active). + +Μόλις έχετε δεδομένα θερμοκρασίας, μπορείτε να χρησιμοποιήσετε το Jupyter Notebook που βρίσκεται σε αυτό το repo για να τα οπτικοποιήσετε και να υπολογίσετε το GDD. Τα Jupyter notebooks συνδυάζουν κώδικα και οδηγίες σε μπλοκ που ονομάζονται *cells*, συχνά με κώδικα σε Python. Μπορείτε να διαβάσετε τις οδηγίες και στη συνέχεια να εκτελέσετε κάθε μπλοκ κώδικα, μπλοκ προς μπλοκ. Μπορείτε επίσης να επεξεργαστείτε τον κώδικα. Σε αυτό το notebook, για παράδειγμα, μπορείτε να επεξεργαστείτε τη βασική θερμοκρασία που χρησιμοποιείται για τον υπολογισμό του GDD για το φυτό σας. + +1. Δημιουργήστε έναν φάκελο με όνομα `gdd-calculation` + +1. Κατεβάστε το αρχείο [gdd.ipynb](./code-notebook/gdd.ipynb) και αντιγράψτε το στον φάκελο `gdd-calculation`. + +1. Αντιγράψτε το αρχείο `temperature.csv` που δημιουργήθηκε από τον MQTT server. + +1. Δημιουργήστε ένα νέο Python virtual environment στον φάκελο `gdd-calculation`. + +1. Εγκαταστήστε μερικά pip packages για τα Jupyter notebooks, μαζί με βιβλιοθήκες που χρειάζονται για τη διαχείριση και την απεικόνιση των δεδομένων: + + ```sh + pip install --upgrade pip + pip install pandas + pip install matplotlib + pip install jupyter + ``` + +1. Εκτελέστε το notebook στο Jupyter: + + ```sh + jupyter notebook gdd.ipynb + ``` + + Το Jupyter θα ξεκινήσει και θα ανοίξει το notebook στον browser σας. Ακολουθήστε τις οδηγίες στο notebook για να οπτικοποιήσετε τις μετρηθείσες θερμοκρασίες και να υπολογίσετε τις ημέρες ανάπτυξης (GDD). + + ![Το jupyter notebook](../../../../../translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.el.png) + +## Κριτήρια Αξιολόγησης + +| Κριτήριο | Εξαιρετικό | Επαρκές | Χρειάζεται Βελτίωση | +| -------- | ---------- | -------- | ------------------- | +| Συλλογή δεδομένων | Συλλογή τουλάχιστον 2 πλήρων ημερών δεδομένων | Συλλογή τουλάχιστον 1 πλήρους ημέρας δεδομένων | Συλλογή κάποιων δεδομένων | +| Υπολογισμός GDD | Επιτυχής εκτέλεση του notebook και υπολογισμός του GDD | Επιτυχής εκτέλεση του notebook | Αδυναμία εκτέλεσης του notebook | + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb b/translations/el/2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb new file mode 100644 index 00000000..a6fc67d4 --- /dev/null +++ b/translations/el/2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb @@ -0,0 +1,167 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Ημέρες Αθροιστικής Θερμοκρασίας\n", + "\n", + "Αυτό το σημειωματάριο φορτώνει δεδομένα θερμοκρασίας αποθηκευμένα σε ένα αρχείο CSV και τα αναλύει. Δημιουργεί γραφήματα των θερμοκρασιών, δείχνει τη μέγιστη και ελάχιστη τιμή για κάθε ημέρα και υπολογίζει τις ΗΑΘ.\n", + "\n", + "Για να χρησιμοποιήσετε αυτό το σημειωματάριο:\n", + "\n", + "* Αντιγράψτε το αρχείο `temperature.csv` στον ίδιο φάκελο με αυτό το σημειωματάριο\n", + "* Εκτελέστε όλα τα κελιά χρησιμοποιώντας το κουμπί **▶︎ Εκτέλεση** παραπάνω. Αυτό θα εκτελέσει το επιλεγμένο κελί και στη συνέχεια θα προχωρήσει στο επόμενο.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Στο παρακάτω κελί, ορίστε την `base_temperature` στη βασική θερμοκρασία του φυτού.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "base_temperature = 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Το αρχείο CSV πρέπει τώρα να φορτωθεί, χρησιμοποιώντας pandas\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Read the temperature CSV file\n", + "df = pd.read_csv('temperature.csv')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(20, 10))\n", + "plt.plot(df['date'], df['temperature'])\n", + "plt.xticks(rotation='vertical');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Μόλις διαβαστούν τα δεδομένα, μπορούν να ομαδοποιηθούν κατά τη στήλη `date`, και να εξαχθούν οι ελάχιστες και μέγιστες θερμοκρασίες για κάθε ημερομηνία.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Convert datetimes to pure dates so we can group by the date\n", + "df['date'] = pd.to_datetime(df['date']).dt.date\n", + "\n", + "# Group the data by date so it can be analyzed by date\n", + "data_by_date = df.groupby('date')\n", + "\n", + "# Get the minimum and maximum temperatures for each date\n", + "min_by_date = data_by_date.min()\n", + "max_by_date = data_by_date.max()\n", + "\n", + "# Join the min and max temperatures into one dataframe and flatten it\n", + "min_max_by_date = min_by_date.join(max_by_date, on='date', lsuffix='_min', rsuffix='_max')\n", + "min_max_by_date = min_max_by_date.reset_index()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Η GDD μπορεί να υπολογιστεί χρησιμοποιώντας την τυπική εξίσωση GDD\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def calculate_gdd(row):\n", + " return ((row['temperature_max'] + row['temperature_min']) / 2) - base_temperature\n", + "\n", + "# Calculate the GDD for each row\n", + "min_max_by_date['gdd'] = min_max_by_date.apply (lambda row: calculate_gdd(row), axis=1)\n", + "\n", + "# Print the results\n", + "print(min_max_by_date[['date', 'gdd']].to_string(index=False))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n---\n\n**Αποποίηση ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "metadata": { + "interpreter": { + "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + } + }, + "coopTranslator": { + "original_hash": "8fcf954f6042f0bf3601a2c836a09574", + "translation_date": "2025-08-27T22:15:16+00:00", + "source_file": "2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb", + "language_code": "el" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/translations/el/2-farm/lessons/1-predict-plant-growth/pi-temp.md b/translations/el/2-farm/lessons/1-predict-plant-growth/pi-temp.md new file mode 100644 index 00000000..660f45be --- /dev/null +++ b/translations/el/2-farm/lessons/1-predict-plant-growth/pi-temp.md @@ -0,0 +1,125 @@ + +# Μέτρηση θερμοκρασίας - Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν αισθητήρα θερμοκρασίας στο Raspberry Pi σας. + +## Υλικό + +Ο αισθητήρας που θα χρησιμοποιήσετε είναι ένας [αισθητήρας υγρασίας και θερμοκρασίας DHT11](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html), ο οποίος συνδυάζει 2 αισθητήρες σε μία συσκευασία. Είναι αρκετά δημοφιλής, με πολλούς εμπορικά διαθέσιμους αισθητήρες που συνδυάζουν θερμοκρασία, υγρασία και μερικές φορές ατμοσφαιρική πίεση. Το στοιχείο του αισθητήρα θερμοκρασίας είναι ένας θερμίστορας αρνητικού συντελεστή θερμοκρασίας (NTC), ένας θερμίστορας όπου η αντίσταση μειώνεται καθώς αυξάνεται η θερμοκρασία. + +Πρόκειται για έναν ψηφιακό αισθητήρα, οπότε διαθέτει ενσωματωμένο ADC για τη δημιουργία ενός ψηφιακού σήματος που περιέχει τα δεδομένα θερμοκρασίας και υγρασίας, τα οποία μπορεί να διαβάσει ο μικροελεγκτής. + +### Σύνδεση του αισθητήρα θερμοκρασίας + +Ο αισθητήρας θερμοκρασίας Grove μπορεί να συνδεθεί στο Raspberry Pi. + +#### Εργασία + +Συνδέστε τον αισθητήρα θερμοκρασίας. + +![Αισθητήρας θερμοκρασίας Grove](../../../../../translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.el.png) + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του αισθητήρα υγρασίας και θερμοκρασίας. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. + +1. Με το Raspberry Pi απενεργοποιημένο, συνδέστε το άλλο άκρο του καλωδίου Grove στην ψηφιακή υποδοχή με την ένδειξη **D5** στο Grove Base hat που είναι συνδεδεμένο στο Pi. Αυτή η υποδοχή είναι η δεύτερη από τα αριστερά, στη σειρά των υποδοχών δίπλα στα GPIO pins. + +![Ο αισθητήρας θερμοκρασίας Grove συνδεδεμένος στην υποδοχή A0](../../../../../translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.el.png) + +## Προγραμματισμός του αισθητήρα θερμοκρασίας + +Η συσκευή μπορεί τώρα να προγραμματιστεί για να χρησιμοποιήσει τον συνδεδεμένο αισθητήρα θερμοκρασίας. + +### Εργασία + +Προγραμματίστε τη συσκευή. + +1. Ενεργοποιήστε το Pi και περιμένετε να εκκινήσει. + +1. Εκκινήστε το VS Code, είτε απευθείας στο Pi είτε συνδεθείτε μέσω της επέκτασης Remote SSH. + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη ρύθμιση και την εκκίνηση του VS Code στο μάθημα 1, αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. Από το τερματικό, δημιουργήστε έναν νέο φάκελο στον κατάλογο home του χρήστη `pi` με όνομα `temperature-sensor`. Δημιουργήστε ένα αρχείο σε αυτόν τον φάκελο με όνομα `app.py`: + + ```sh + mkdir temperature-sensor + cd temperature-sensor + touch app.py + ``` + +1. Ανοίξτε αυτόν τον φάκελο στο VS Code. + +1. Για να χρησιμοποιήσετε τον αισθητήρα θερμοκρασίας και υγρασίας, πρέπει να εγκατασταθεί ένα επιπλέον πακέτο Pip. Από το τερματικό στο VS Code, εκτελέστε την παρακάτω εντολή για να εγκαταστήσετε αυτό το πακέτο Pip στο Pi: + + ```sh + pip3 install seeed-python-dht + ``` + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py` για να εισαγάγετε τις απαιτούμενες βιβλιοθήκες: + + ```python + import time + from seeed_dht import DHT + ``` + + Η δήλωση `from seeed_dht import DHT` εισάγει την κλάση `DHT` για την αλληλεπίδραση με έναν αισθητήρα θερμοκρασίας Grove από το module `seeed_dht`. + +1. Προσθέστε τον παρακάτω κώδικα μετά τον παραπάνω για να δημιουργήσετε μια παρουσία της κλάσης που διαχειρίζεται τον αισθητήρα θερμοκρασίας: + + ```python + sensor = DHT("11", 5) + ``` + + Αυτό δηλώνει μια παρουσία της κλάσης `DHT` που διαχειρίζεται τον **Ψ**ηφιακό **Α**ισθητήρα **Θ**ερμοκρασίας και **Υ**γρασίας. Η πρώτη παράμετρος ενημερώνει τον κώδικα ότι ο αισθητήρας που χρησιμοποιείται είναι ο *DHT11* - η βιβλιοθήκη που χρησιμοποιείτε υποστηρίζει και άλλες παραλλαγές αυτού του αισθητήρα. Η δεύτερη παράμετρος ενημερώνει τον κώδικα ότι ο αισθητήρας είναι συνδεδεμένος στην ψηφιακή θύρα `D5` στο Grove base hat. + + > ✅ Θυμηθείτε, όλες οι υποδοχές έχουν μοναδικούς αριθμούς ακίδων. Οι ακίδες 0, 2, 4 και 6 είναι αναλογικές, ενώ οι ακίδες 5, 16, 18, 22, 24 και 26 είναι ψηφιακές. + +1. Προσθέστε έναν ατέρμονα βρόχο μετά τον παραπάνω κώδικα για να διαβάσετε την τιμή του αισθητήρα θερμοκρασίας και να την εκτυπώσετε στην κονσόλα: + + ```python + while True: + _, temp = sensor.read() + print(f'Temperature {temp}°C') + ``` + + Η κλήση `sensor.read()` επιστρέφει μια πλειάδα με την υγρασία και τη θερμοκρασία. Χρειάζεστε μόνο την τιμή της θερμοκρασίας, οπότε η υγρασία αγνοείται. Η τιμή της θερμοκρασίας στη συνέχεια εκτυπώνεται στην κονσόλα. + +1. Προσθέστε μια μικρή παύση δέκα δευτερολέπτων στο τέλος του `loop`, καθώς τα επίπεδα θερμοκρασίας δεν χρειάζεται να ελέγχονται συνεχώς. Μια παύση μειώνει την κατανάλωση ενέργειας της συσκευής. + + ```python + time.sleep(10) + ``` + +1. Από το τερματικό του VS Code, εκτελέστε την παρακάτω εντολή για να τρέξετε την εφαρμογή Python: + + ```sh + python3 app.py + ``` + + Θα πρέπει να δείτε τιμές θερμοκρασίας να εμφανίζονται στην κονσόλα. Χρησιμοποιήστε κάτι για να ζεστάνετε τον αισθητήρα, όπως να τον πιέσετε με τον αντίχειρά σας ή να χρησιμοποιήσετε έναν ανεμιστήρα, για να δείτε τις τιμές να αλλάζουν: + + ```output + pi@raspberrypi:~/temperature-sensor $ python3 app.py + Temperature 26°C + Temperature 26°C + Temperature 28°C + Temperature 30°C + Temperature 32°C + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-temperature/pi](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/pi). + +😀 Το πρόγραμμα του αισθητήρα θερμοκρασίας σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md b/translations/el/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md new file mode 100644 index 00000000..3cbb293b --- /dev/null +++ b/translations/el/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md @@ -0,0 +1,71 @@ + +# Δημοσίευση θερμοκρασίας - Εικονικό IoT Υλικό και Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα δημοσιεύσετε τις τιμές θερμοκρασίας που ανιχνεύονται από το Raspberry Pi ή την Εικονική IoT Συσκευή μέσω MQTT, ώστε να μπορούν να χρησιμοποιηθούν αργότερα για τον υπολογισμό του GDD. + +## Δημοσίευση της θερμοκρασίας + +Αφού διαβαστεί η θερμοκρασία, μπορεί να δημοσιευθεί μέσω MQTT σε κάποιον κώδικα "server" που θα διαβάσει τις τιμές και θα τις αποθηκεύσει, έτοιμες για χρήση στον υπολογισμό του GDD. + +### Εργασία - δημοσίευση της θερμοκρασίας + +Προγραμματίστε τη συσκευή ώστε να δημοσιεύει τα δεδομένα θερμοκρασίας. + +1. Ανοίξτε το έργο της εφαρμογής `temperature-sensor` αν δεν είναι ήδη ανοιχτό. + +1. Επαναλάβετε τα βήματα που κάνατε στο μάθημα 4 για να συνδεθείτε στο MQTT και να στείλετε τηλεμετρία. Θα χρησιμοποιήσετε τον ίδιο δημόσιο broker Mosquitto. + + Τα βήματα για αυτό είναι: + + - Προσθέστε το πακέτο pip για MQTT + - Προσθέστε τον κώδικα για σύνδεση στον broker MQTT + - Προσθέστε τον κώδικα για δημοσίευση τηλεμετρίας + + > ⚠️ Ανατρέξτε στις [οδηγίες για σύνδεση στο MQTT](../../../1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md) και στις [οδηγίες για αποστολή τηλεμετρίας](../../../1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md) από το μάθημα 4, αν χρειαστεί. + +1. Βεβαιωθείτε ότι το `client_name` αντικατοπτρίζει το όνομα αυτού του έργου: + + ```python + client_name = id + 'temperature_sensor_client' + ``` + +1. Για την τηλεμετρία, αντί να στείλετε μια τιμή φωτεινότητας, στείλτε την τιμή θερμοκρασίας που διαβάζεται από τον αισθητήρα DHT σε μια ιδιότητα του JSON εγγράφου που ονομάζεται `temperature`: + + ```python + _, temp = sensor.read() + telemetry = json.dumps({'temperature' : temp}) + ``` + +1. Η τιμή της θερμοκρασίας δεν χρειάζεται να διαβάζεται πολύ συχνά - δεν θα αλλάξει πολύ σε σύντομο χρονικό διάστημα, οπότε ορίστε το `time.sleep` στα 10 λεπτά: + + ```cpp + time.sleep(10 * 60); + ``` + + > 💁 Η συνάρτηση `sleep` λαμβάνει τον χρόνο σε δευτερόλεπτα, οπότε για να είναι πιο εύκολο να διαβαστεί, η τιμή περνάει ως αποτέλεσμα ενός υπολογισμού. 60 δευτερόλεπτα σε ένα λεπτό, οπότε 10 x (60 δευτερόλεπτα σε ένα λεπτό) δίνει καθυστέρηση 10 λεπτών. + +1. Εκτελέστε τον κώδικα με τον ίδιο τρόπο που εκτελέσατε τον κώδικα από το προηγούμενο μέρος της εργασίας. Αν χρησιμοποιείτε μια εικονική IoT συσκευή, βεβαιωθείτε ότι η εφαρμογή CounterFit είναι ενεργοποιημένη και οι αισθητήρες υγρασίας και θερμοκρασίας έχουν δημιουργηθεί στις σωστές ακίδες. + + ```output + pi@raspberrypi:~/temperature-sensor $ python3 app.py + MQTT connected! + Sending telemetry {"temperature": 25} + Sending telemetry {"temperature": 25} + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-publish-temperature/virtual-device](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/virtual-device) ή στον φάκελο [code-publish-temperature/pi](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/pi). + +😀 Έχετε δημοσιεύσει με επιτυχία τη θερμοκρασία ως τηλεμετρία από τη συσκευή σας. + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md b/translations/el/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md new file mode 100644 index 00000000..39b33b67 --- /dev/null +++ b/translations/el/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md @@ -0,0 +1,154 @@ + +# Μέτρηση θερμοκρασίας - Εικονικό IoT Υλικό + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν αισθητήρα θερμοκρασίας στη εικονική IoT συσκευή σας. + +## Εικονικό Υλικό + +Η εικονική IoT συσκευή θα χρησιμοποιήσει έναν προσομοιωμένο αισθητήρα Grove Digital Υγρασίας και Θερμοκρασίας. Αυτό διατηρεί το εργαστήριο ίδιο με τη χρήση ενός Raspberry Pi με έναν φυσικό αισθητήρα Grove DHT11. + +Ο αισθητήρας συνδυάζει έναν **αισθητήρα θερμοκρασίας** με έναν **αισθητήρα υγρασίας**, αλλά σε αυτό το εργαστήριο ενδιαφέρεστε μόνο για το τμήμα του αισθητήρα θερμοκρασίας. Σε μια φυσική IoT συσκευή, ο αισθητήρας θερμοκρασίας θα ήταν ένας [θεμίστορας](https://wikipedia.org/wiki/Thermistor) που μετρά τη θερμοκρασία ανιχνεύοντας μια αλλαγή στην αντίσταση καθώς αλλάζει η θερμοκρασία. Οι αισθητήρες θερμοκρασίας είναι συνήθως ψηφιακοί αισθητήρες που εσωτερικά μετατρέπουν την μετρημένη αντίσταση σε θερμοκρασία σε βαθμούς Κελσίου (ή Κέλβιν, ή Φαρενάιτ). + +### Προσθήκη αισθητήρων στο CounterFit + +Για να χρησιμοποιήσετε έναν εικονικό αισθητήρα υγρασίας και θερμοκρασίας, πρέπει να προσθέσετε τους δύο αισθητήρες στην εφαρμογή CounterFit. + +#### Εργασία - προσθήκη αισθητήρων στο CounterFit + +Προσθέστε τους αισθητήρες υγρασίας και θερμοκρασίας στην εφαρμογή CounterFit. + +1. Δημιουργήστε μια νέα εφαρμογή Python στον υπολογιστή σας σε έναν φάκελο που ονομάζεται `temperature-sensor` με ένα μόνο αρχείο που ονομάζεται `app.py` και ένα εικονικό περιβάλλον Python, και προσθέστε τα πακέτα pip του CounterFit. + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη δημιουργία και ρύθμιση ενός CounterFit Python project στο μάθημα 1 αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Εγκαταστήστε ένα επιπλέον πακέτο Pip για την εγκατάσταση ενός CounterFit shim για τον αισθητήρα DHT11. Βεβαιωθείτε ότι το εγκαθιστάτε από ένα τερματικό με ενεργοποιημένο το εικονικό περιβάλλον. + + ```sh + pip install counterfit-shims-seeed-python-dht + ``` + +1. Βεβαιωθείτε ότι η εφαρμογή web του CounterFit είναι σε λειτουργία. + +1. Δημιουργήστε έναν αισθητήρα υγρασίας: + + 1. Στο πλαίσιο *Create sensor* στο τμήμα *Sensors*, ανοίξτε το πλαίσιο *Sensor type* και επιλέξτε *Humidity*. + + 1. Αφήστε τις *Units* ρυθμισμένες σε *Percentage*. + + 1. Βεβαιωθείτε ότι το *Pin* είναι ρυθμισμένο στο *5*. + + 1. Επιλέξτε το κουμπί **Add** για να δημιουργήσετε τον αισθητήρα υγρασίας στο Pin 5. + + ![Οι ρυθμίσεις του αισθητήρα υγρασίας](../../../../../translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.el.png) + + Ο αισθητήρας υγρασίας θα δημιουργηθεί και θα εμφανιστεί στη λίστα αισθητήρων. + + ![Ο αισθητήρας υγρασίας δημιουργήθηκε](../../../../../translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.el.png) + +1. Δημιουργήστε έναν αισθητήρα θερμοκρασίας: + + 1. Στο πλαίσιο *Create sensor* στο τμήμα *Sensors*, ανοίξτε το πλαίσιο *Sensor type* και επιλέξτε *Temperature*. + + 1. Αφήστε τις *Units* ρυθμισμένες σε *Celsius*. + + 1. Βεβαιωθείτε ότι το *Pin* είναι ρυθμισμένο στο *6*. + + 1. Επιλέξτε το κουμπί **Add** για να δημιουργήσετε τον αισθητήρα θερμοκρασίας στο Pin 6. + + ![Οι ρυθμίσεις του αισθητήρα θερμοκρασίας](../../../../../translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.el.png) + + Ο αισθητήρας θερμοκρασίας θα δημιουργηθεί και θα εμφανιστεί στη λίστα αισθητήρων. + + ![Ο αισθητήρας θερμοκρασίας δημιουργήθηκε](../../../../../translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.el.png) + +## Προγραμματισμός της εφαρμογής αισθητήρα θερμοκρασίας + +Η εφαρμογή αισθητήρα θερμοκρασίας μπορεί τώρα να προγραμματιστεί χρησιμοποιώντας τους αισθητήρες του CounterFit. + +### Εργασία - προγραμματισμός της εφαρμογής αισθητήρα θερμοκρασίας + +Προγραμματίστε την εφαρμογή αισθητήρα θερμοκρασίας. + +1. Βεβαιωθείτε ότι η εφαρμογή `temperature-sensor` είναι ανοιχτή στο VS Code. + +1. Ανοίξτε το αρχείο `app.py`. + +1. Προσθέστε τον παρακάτω κώδικα στην κορυφή του `app.py` για να συνδέσετε την εφαρμογή στο CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py` για να εισάγετε τις απαιτούμενες βιβλιοθήκες: + + ```python + import time + from counterfit_shims_seeed_python_dht import DHT + ``` + + Η δήλωση `from seeed_dht import DHT` εισάγει την κλάση `DHT` για την αλληλεπίδραση με έναν εικονικό αισθητήρα θερμοκρασίας Grove χρησιμοποιώντας ένα shim από το module `counterfit_shims_seeed_python_dht`. + +1. Προσθέστε τον παρακάτω κώδικα μετά τον παραπάνω κώδικα για να δημιουργήσετε μια παρουσία της κλάσης που διαχειρίζεται τον εικονικό αισθητήρα υγρασίας και θερμοκρασίας: + + ```python + sensor = DHT("11", 5) + ``` + + Αυτό δηλώνει μια παρουσία της κλάσης `DHT` που διαχειρίζεται τον εικονικό **D**igital **H**umidity και **T**emperature αισθητήρα. Η πρώτη παράμετρος λέει στον κώδικα ότι ο αισθητήρας που χρησιμοποιείται είναι ένας εικονικός αισθητήρας *DHT11*. Η δεύτερη παράμετρος λέει στον κώδικα ότι ο αισθητήρας είναι συνδεδεμένος στη θύρα `5`. + + > 💁 Το CounterFit προσομοιώνει αυτόν τον συνδυασμένο αισθητήρα υγρασίας και θερμοκρασίας συνδέοντας σε 2 αισθητήρες, έναν αισθητήρα υγρασίας στο pin που δίνεται όταν δημιουργείται η κλάση `DHT`, και έναν αισθητήρα θερμοκρασίας που λειτουργεί στο επόμενο pin. Αν ο αισθητήρας υγρασίας είναι στο pin 5, το shim αναμένει ότι ο αισθητήρας θερμοκρασίας θα είναι στο pin 6. + +1. Προσθέστε έναν άπειρο βρόχο μετά τον παραπάνω κώδικα για να ελέγχετε την τιμή του αισθητήρα θερμοκρασίας και να την εκτυπώνετε στην κονσόλα: + + ```python + while True: + _, temp = sensor.read() + print(f'Temperature {temp}°C') + ``` + + Η κλήση στο `sensor.read()` επιστρέφει ένα tuple με υγρασία και θερμοκρασία. Χρειάζεστε μόνο την τιμή της θερμοκρασίας, οπότε η υγρασία αγνοείται. Η τιμή της θερμοκρασίας στη συνέχεια εκτυπώνεται στην κονσόλα. + +1. Προσθέστε μια μικρή παύση δέκα δευτερολέπτων στο τέλος του `loop`, καθώς τα επίπεδα θερμοκρασίας δεν χρειάζεται να ελέγχονται συνεχώς. Μια παύση μειώνει την κατανάλωση ενέργειας της συσκευής. + + ```python + time.sleep(10) + ``` + +1. Από το τερματικό του VS Code με ενεργοποιημένο το εικονικό περιβάλλον, εκτελέστε το παρακάτω για να εκτελέσετε την εφαρμογή Python: + + ```sh + python app.py + ``` + +1. Από την εφαρμογή CounterFit, αλλάξτε την τιμή του αισθητήρα θερμοκρασίας που θα διαβαστεί από την εφαρμογή. Μπορείτε να το κάνετε με δύο τρόπους: + + * Εισάγετε έναν αριθμό στο πλαίσιο *Value* για τον αισθητήρα θερμοκρασίας και στη συνέχεια επιλέξτε το κουμπί **Set**. Ο αριθμός που εισάγετε θα είναι η τιμή που επιστρέφει ο αισθητήρας. + + * Επιλέξτε το πλαίσιο *Random* και εισάγετε μια *Min* και *Max* τιμή, στη συνέχεια επιλέξτε το κουμπί **Set**. Κάθε φορά που ο αισθητήρας διαβάζει μια τιμή, θα διαβάζει έναν τυχαίο αριθμό μεταξύ *Min* και *Max*. + + Θα πρέπει να βλέπετε τις τιμές που ορίσατε να εμφανίζονται στην κονσόλα. Αλλάξτε την *Value* ή τις ρυθμίσεις *Random* για να δείτε την αλλαγή της τιμής. + + ```output + (.venv) ➜ temperature-sensor python app.py + Temperature 28.25°C + Temperature 30.71°C + Temperature 25.17°C + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-temperature/virtual-device](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/virtual-device). + +😀 Το πρόγραμμα του αισθητήρα θερμοκρασίας σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική μετάφραση από ανθρώπους. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md b/translations/el/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md new file mode 100644 index 00000000..3bb65ba2 --- /dev/null +++ b/translations/el/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md @@ -0,0 +1,82 @@ + +# Δημοσίευση θερμοκρασίας - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα δημοσιεύσετε τις τιμές θερμοκρασίας που ανιχνεύονται από το Wio Terminal μέσω MQTT, ώστε να μπορούν να χρησιμοποιηθούν αργότερα για τον υπολογισμό του GDD. + +## Δημοσίευση της θερμοκρασίας + +Αφού διαβαστεί η θερμοκρασία, μπορεί να δημοσιευθεί μέσω MQTT σε κάποιον κώδικα 'server', ο οποίος θα διαβάσει τις τιμές και θα τις αποθηκεύσει, ώστε να είναι έτοιμες για τον υπολογισμό του GDD. Οι μικροελεγκτές δεν διαβάζουν την ώρα από το Διαδίκτυο ούτε παρακολουθούν την ώρα με ρολόι πραγματικού χρόνου από προεπιλογή. Η συσκευή πρέπει να προγραμματιστεί για να το κάνει αυτό, εφόσον διαθέτει το απαραίτητο υλικό. + +Για να απλοποιηθούν τα πράγματα σε αυτό το μάθημα, η ώρα δεν θα αποστέλλεται μαζί με τα δεδομένα του αισθητήρα. Αντίθετα, μπορεί να προστεθεί από τον κώδικα του server αργότερα, όταν λάβει τα μηνύματα. + +### Εργασία + +Προγραμματίστε τη συσκευή ώστε να δημοσιεύει τα δεδομένα θερμοκρασίας. + +1. Ανοίξτε το έργο `temperature-sensor` του Wio Terminal. + +1. Επαναλάβετε τα βήματα που κάνατε στο μάθημα 4 για να συνδεθείτε στο MQTT και να στείλετε τηλεμετρία. Θα χρησιμοποιήσετε τον ίδιο δημόσιο broker Mosquitto. + + Τα βήματα για αυτό είναι: + + - Προσθέστε τις βιβλιοθήκες Seeed WiFi και MQTT στο αρχείο `.ini` + - Προσθέστε το αρχείο ρυθμίσεων και τον κώδικα για σύνδεση στο WiFi + - Προσθέστε τον κώδικα για σύνδεση στον broker MQTT + - Προσθέστε τον κώδικα για δημοσίευση τηλεμετρίας + + > ⚠️ Ανατρέξτε στις [οδηγίες για σύνδεση στο MQTT](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md) και στις [οδηγίες για αποστολή τηλεμετρίας](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md) από το μάθημα 4, αν χρειαστεί. + +1. Βεβαιωθείτε ότι το `CLIENT_NAME` στο αρχείο κεφαλίδας `config.h` αντικατοπτρίζει αυτό το έργο: + + ```cpp + const string CLIENT_NAME = ID + "temperature_sensor_client"; + ``` + +1. Για την τηλεμετρία, αντί να στείλετε μια τιμή φωτός, στείλτε την τιμή θερμοκρασίας που διαβάζεται από τον αισθητήρα DHT σε μια ιδιότητα του εγγράφου JSON που ονομάζεται `temperature`, αλλάζοντας τη συνάρτηση `loop` στο `main.cpp`: + + ```cpp + float temp_hum_val[2] = {0}; + dht.readTempAndHumidity(temp_hum_val); + + DynamicJsonDocument doc(1024); + doc["temperature"] = temp_hum_val[1]; + ``` + +1. Η τιμή της θερμοκρασίας δεν χρειάζεται να διαβάζεται πολύ συχνά - δεν θα αλλάζει πολύ σε σύντομο χρονικό διάστημα, οπότε ορίστε την `delay` στη συνάρτηση `loop` στα 10 λεπτά: + + ```cpp + delay(10 * 60 * 1000); + ``` + + > 💁 Η συνάρτηση `delay` λαμβάνει τον χρόνο σε χιλιοστά του δευτερολέπτου, οπότε για να είναι πιο ευανάγνωστη, η τιμή περνάει ως αποτέλεσμα ενός υπολογισμού. 1.000ms σε ένα δευτερόλεπτο, 60s σε ένα λεπτό, οπότε 10 x (60s σε ένα λεπτό) x (1000ms σε ένα δευτερόλεπτο) δίνει καθυστέρηση 10 λεπτών. + +1. Μεταφορτώστε αυτό στο Wio Terminal σας και χρησιμοποιήστε τον σειριακό παρακολουθητή για να δείτε τη θερμοκρασία που αποστέλλεται στον broker 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} + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-publish-temperature/wio-terminal](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal). + +😀 Έχετε δημοσιεύσει με επιτυχία τη θερμοκρασία ως τηλεμετρία από τη συσκευή σας. + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md b/translations/el/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md new file mode 100644 index 00000000..d1105781 --- /dev/null +++ b/translations/el/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md @@ -0,0 +1,143 @@ + +# Μέτρηση θερμοκρασίας - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν αισθητήρα θερμοκρασίας στο Wio Terminal σας και θα διαβάσετε τις τιμές θερμοκρασίας από αυτόν. + +## Υλικό + +Το Wio Terminal χρειάζεται έναν αισθητήρα θερμοκρασίας. + +Ο αισθητήρας που θα χρησιμοποιήσετε είναι ο [αισθητήρας υγρασίας και θερμοκρασίας DHT11](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html), που συνδυάζει δύο αισθητήρες σε μία συσκευασία. Είναι αρκετά δημοφιλής, με αρκετούς εμπορικά διαθέσιμους αισθητήρες που συνδυάζουν θερμοκρασία, υγρασία και μερικές φορές ατμοσφαιρική πίεση. Το στοιχείο του αισθητήρα θερμοκρασίας είναι ένας θερμίστορας αρνητικού συντελεστή θερμοκρασίας (NTC), ένας θερμίστορας όπου η αντίσταση μειώνεται καθώς αυξάνεται η θερμοκρασία. + +Πρόκειται για έναν ψηφιακό αισθητήρα, οπότε διαθέτει ενσωματωμένο ADC για τη δημιουργία ψηφιακού σήματος που περιέχει δεδομένα θερμοκρασίας και υγρασίας, τα οποία μπορεί να διαβάσει ο μικροελεγκτής. + +### Σύνδεση του αισθητήρα θερμοκρασίας + +Ο αισθητήρας θερμοκρασίας Grove μπορεί να συνδεθεί στη ψηφιακή θύρα του Wio Terminal. + +#### Εργασία - σύνδεση του αισθητήρα θερμοκρασίας + +Συνδέστε τον αισθητήρα θερμοκρασίας. + +![Αισθητήρας θερμοκρασίας Grove](../../../../../translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.el.png) + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του αισθητήρα υγρασίας και θερμοκρασίας. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. + +1. Με το Wio Terminal αποσυνδεδεμένο από τον υπολογιστή σας ή άλλη πηγή τροφοδοσίας, συνδέστε το άλλο άκρο του καλωδίου Grove στην δεξιά υποδοχή Grove του Wio Terminal, όπως κοιτάτε την οθόνη. Αυτή είναι η υποδοχή που βρίσκεται πιο μακριά από το κουμπί τροφοδοσίας. + +![Ο αισθητήρας θερμοκρασίας Grove συνδεδεμένος στη δεξιά υποδοχή](../../../../../translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.el.png) + +## Προγραμματισμός του αισθητήρα θερμοκρασίας + +Το Wio Terminal μπορεί τώρα να προγραμματιστεί για να χρησιμοποιήσει τον συνδεδεμένο αισθητήρα θερμοκρασίας. + +### Εργασία - προγραμματισμός του αισθητήρα θερμοκρασίας + +Προγραμματίστε τη συσκευή. + +1. Δημιουργήστε ένα ολοκαίνουργιο έργο Wio Terminal χρησιμοποιώντας το PlatformIO. Ονομάστε αυτό το έργο `temperature-sensor`. Προσθέστε κώδικα στη συνάρτηση `setup` για να ρυθμίσετε τη σειριακή θύρα. + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη δημιουργία ενός έργου PlatformIO στο έργο 1, μάθημα 1, αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#create-a-platformio-project). + +1. Προσθέστε μια εξάρτηση βιβλιοθήκης για τη βιβλιοθήκη Seeed Grove Humidity and Temperature sensor στο αρχείο `platformio.ini` του έργου: + + ```ini + lib_deps = + seeed-studio/Grove Temperature And Humidity Sensor @ 1.0.1 + ``` + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για την προσθήκη βιβλιοθηκών σε ένα έργο PlatformIO στο έργο 1, μάθημα 4, αν χρειαστεί](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md#install-the-wifi-and-mqtt-arduino-libraries). + +1. Προσθέστε τις ακόλουθες οδηγίες `#include` στην κορυφή του αρχείου, κάτω από την υπάρχουσα `#include `: + + ```cpp + #include + #include + ``` + + Αυτές εισάγουν αρχεία που χρειάζονται για την αλληλεπίδραση με τον αισθητήρα. Το αρχείο κεφαλίδας `DHT.h` περιέχει τον κώδικα για τον ίδιο τον αισθητήρα, και η προσθήκη του `SPI.h` διασφαλίζει ότι ο κώδικας που χρειάζεται για την επικοινωνία με τον αισθητήρα συνδέεται κατά τη μεταγλώττιση της εφαρμογής. + +1. Πριν από τη συνάρτηση `setup`, δηλώστε τον αισθητήρα DHT: + + ```cpp + DHT dht(D0, DHT11); + ``` + + Αυτό δηλώνει μια παρουσία της κλάσης `DHT` που διαχειρίζεται τον **Ψ**ηφιακό αισθητήρα **Υ**γρασίας και **Θ**ερμοκρασίας. Αυτός είναι συνδεδεμένος στη θύρα `D0`, τη δεξιά υποδοχή Grove του Wio Terminal. Η δεύτερη παράμετρος ενημερώνει τον κώδικα ότι ο αισθητήρας που χρησιμοποιείται είναι ο *DHT11* - η βιβλιοθήκη που χρησιμοποιείτε υποστηρίζει άλλες παραλλαγές αυτού του αισθητήρα. + +1. Στη συνάρτηση `setup`, προσθέστε κώδικα για τη ρύθμιση της σειριακής σύνδεσης: + + ```cpp + void setup() + { + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + } + ``` + +1. Στο τέλος της συνάρτησης `setup`, μετά την τελευταία `delay`, προσθέστε μια κλήση για την εκκίνηση του αισθητήρα DHT: + + ```cpp + dht.begin(); + ``` + +1. Στη συνάρτηση `loop`, προσθέστε κώδικα για να καλέσετε τον αισθητήρα και να εκτυπώσετε τη θερμοκρασία στη σειριακή θύρα: + + ```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); + } + ``` + + Αυτός ο κώδικας δηλώνει έναν κενό πίνακα 2 float και τον περνάει στην κλήση `readTempAndHumidity` της παρουσίας `DHT`. Αυτή η κλήση γεμίζει τον πίνακα με 2 τιμές - η υγρασία μπαίνει στο 0ο στοιχείο του πίνακα (θυμηθείτε ότι στους πίνακες C++ η αρίθμηση ξεκινά από το 0, οπότε το 0ο στοιχείο είναι το "πρώτο" στοιχείο του πίνακα), και η θερμοκρασία μπαίνει στο 1ο στοιχείο. + + Η θερμοκρασία διαβάζεται από το 1ο στοιχείο του πίνακα και εκτυπώνεται στη σειριακή θύρα. + + > 🇺🇸 Η θερμοκρασία διαβάζεται σε Κελσίου. Για τους Αμερικανούς, για να τη μετατρέψετε σε Φαρενάιτ, διαιρέστε την τιμή σε Κελσίου με το 5, πολλαπλασιάστε με το 9 και προσθέστε 32. Για παράδειγμα, μια μέτρηση θερμοκρασίας 20°C γίνεται ((20/5)*9) + 32 = 68°F. + +1. Δημιουργήστε και ανεβάστε τον κώδικα στο Wio Terminal. + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη δημιουργία ενός έργου PlatformIO στο έργο 1, μάθημα 1, αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#write-the-hello-world-app). + +1. Μόλις ανεβεί, μπορείτε να παρακολουθήσετε τη θερμοκρασία χρησιμοποιώντας τον σειριακό παρατηρητή: + + ```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 + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-temperature/wio-terminal](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/wio-terminal). + +😀 Το πρόγραμμα του αισθητήρα θερμοκρασίας σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/2-detect-soil-moisture/README.md b/translations/el/2-farm/lessons/2-detect-soil-moisture/README.md new file mode 100644 index 00000000..c085071a --- /dev/null +++ b/translations/el/2-farm/lessons/2-detect-soil-moisture/README.md @@ -0,0 +1,139 @@ + +C, προφέρεται *I-squared-C*, είναι ένα πρωτόκολλο πολλαπλών ελεγκτών και περιφερειακών, όπου κάθε συνδεδεμένη συσκευή μπορεί να λειτουργήσει είτε ως ελεγκτής είτε ως περιφερειακή συσκευή, επικοινωνώντας μέσω του I²C bus (το όνομα για ένα σύστημα επικοινωνίας που μεταφέρει δεδομένα). Τα δεδομένα αποστέλλονται ως πακέτα με διεύθυνση, με κάθε πακέτο να περιέχει τη διεύθυνση της συνδεδεμένης συσκευής για την οποία προορίζεται. + +> 💁 Αυτό το μοντέλο παλαιότερα αναφερόταν ως master/slave, αλλά αυτή η ορολογία εγκαταλείπεται λόγω της σύνδεσής της με τη δουλεία. Η [Open Source Hardware Association έχει υιοθετήσει τους όρους controller/peripheral](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/), αλλά μπορεί να εξακολουθείτε να βλέπετε αναφορές στην παλιά ορολογία. + +Οι συσκευές έχουν μια διεύθυνση που χρησιμοποιείται όταν συνδέονται στο I²C bus, και συνήθως είναι προεπιλεγμένη στη συσκευή. Για παράδειγμα, κάθε τύπος αισθητήρα Grove από την Seeed έχει την ίδια διεύθυνση, έτσι όλοι οι αισθητήρες φωτός έχουν την ίδια διεύθυνση, όλοι οι διακόπτες έχουν μια διεύθυνση διαφορετική από αυτή των αισθητήρων φωτός. Ορισμένες συσκευές έχουν τρόπους να αλλάξουν τη διεύθυνση, αλλάζοντας τις ρυθμίσεις των jumpers ή συγκολλώντας ακροδέκτες μαζί. + +Το I²C έχει ένα bus που αποτελείται από 2 κύρια καλώδια, μαζί με 2 καλώδια τροφοδοσίας: + +| Καλώδιο | Όνομα | Περιγραφή | +| ---- | --------- | ----------- | +| SDA | Serial Data | Αυτό το καλώδιο χρησιμοποιείται για την αποστολή δεδομένων μεταξύ συσκευών. | +| SCL | Serial Clock | Αυτό το καλώδιο στέλνει ένα σήμα ρολογιού με ρυθμό που καθορίζεται από τον ελεγκτή. | +| VCC | Voltage common collector | Η τροφοδοσία για τις συσκευές. Αυτό συνδέεται με τα καλώδια SDA και SCL για να παρέχει την τροφοδοσία τους μέσω ενός pull-up αντιστάτη που απενεργοποιεί το σήμα όταν καμία συσκευή δεν είναι ελεγκτής. | +| GND | Ground | Παρέχει κοινή γείωση για το ηλεκτρικό κύκλωμα. | + +![I2C bus με 3 συσκευές συνδεδεμένες στα καλώδια SDA και SCL, μοιράζοντας ένα κοινό καλώδιο γείωσης](../../../../../translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.el.png) + +Για να σταλούν δεδομένα, μια συσκευή θα εκδώσει μια συνθήκη εκκίνησης για να δείξει ότι είναι έτοιμη να στείλει δεδομένα. Στη συνέχεια, θα γίνει ο ελεγκτής. Ο ελεγκτής στη συνέχεια στέλνει τη διεύθυνση της συσκευής με την οποία θέλει να επικοινωνήσει, μαζί με το αν θέλει να διαβάσει ή να γράψει δεδομένα. Μετά τη μετάδοση των δεδομένων, ο ελεγκτής στέλνει μια συνθήκη τερματισμού για να υποδείξει ότι έχει τελειώσει. Μετά από αυτό, μια άλλη συσκευή μπορεί να γίνει ελεγκτής και να στείλει ή να λάβει δεδομένα. + +Το I2C έχει όρια ταχύτητας, με 3 διαφορετικές λειτουργίες που τρέχουν σε σταθερές ταχύτητες. Η πιο γρήγορη είναι η λειτουργία Υψηλής Ταχύτητας με μέγιστη ταχύτητα 3.4Mbps (megabits ανά δευτερόλεπτο), αν και πολύ λίγες συσκευές υποστηρίζουν αυτή την ταχύτητα. Το Raspberry Pi, για παράδειγμα, περιορίζεται στη γρήγορη λειτουργία στα 400Kbps (kilobits ανά δευτερόλεπτο). Η τυπική λειτουργία τρέχει στα 100Kbps. + +> 💁 Εάν χρησιμοποιείτε ένα Raspberry Pi με ένα Grove Base hat ως το υλικό IoT σας, θα μπορείτε να δείτε αρκετές υποδοχές I2C στην πλακέτα που μπορείτε να χρησιμοποιήσετε για να επικοινωνήσετε με αισθητήρες I2C. Οι αναλογικοί αισθητήρες Grove χρησιμοποιούν επίσης το I2C με έναν ADC για να στέλνουν αναλογικές τιμές ως ψηφιακά δεδομένα, έτσι ο αισθητήρας φωτός που χρησιμοποιήσατε προσομοίαζε μια αναλογική ακίδα, με την τιμή να αποστέλλεται μέσω I2C καθώς το Raspberry Pi υποστηρίζει μόνο ψηφιακές ακίδες. + +### Universal asynchronous receiver-transmitter (UART) + +Το UART περιλαμβάνει φυσικά κυκλώματα που επιτρέπουν σε δύο συσκευές να επικοινωνούν. Κάθε συσκευή έχει 2 ακίδες επικοινωνίας - μετάδοση (Tx) και λήψη (Rx), με την ακίδα Tx της πρώτης συσκευής να συνδέεται με την ακίδα Rx της δεύτερης, και την ακίδα Tx της δεύτερης συσκευής να συνδέεται με την ακίδα Rx της πρώτης. Αυτό επιτρέπει την αποστολή δεδομένων και προς τις δύο κατευθύνσεις. + +* Η συσκευή 1 μεταδίδει δεδομένα από την ακίδα Tx της, τα οποία λαμβάνονται από τη συσκευή 2 στην ακίδα Rx της +* Η συσκευή 1 λαμβάνει δεδομένα στην ακίδα Rx της που μεταδίδονται από τη συσκευή 2 από την ακίδα Tx της + +![UART με την ακίδα Tx σε ένα τσιπ συνδεδεμένη με την ακίδα Rx σε άλλο τσιπ, και αντίστροφα](../../../../../translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.el.png) + +> 🎓 Τα δεδομένα αποστέλλονται ένα bit τη φορά, και αυτό είναι γνωστό ως *σειριακή* επικοινωνία. Τα περισσότερα λειτουργικά συστήματα και μικροελεγκτές έχουν *σειριακές θύρες*, δηλαδή συνδέσεις που μπορούν να στείλουν και να λάβουν σειριακά δεδομένα και είναι διαθέσιμες στον κώδικά σας. + +Οι συσκευές UART έχουν έναν [ρυθμό baud](https://wikipedia.org/wiki/Symbol_rate) (γνωστός και ως ρυθμός συμβόλων), που είναι η ταχύτητα με την οποία τα δεδομένα θα αποστέλλονται και θα λαμβάνονται σε bits ανά δευτερόλεπτο. Ένας κοινός ρυθμός baud είναι 9,600, που σημαίνει ότι 9,600 bits (0s και 1s) δεδομένων αποστέλλονται κάθε δευτερόλεπτο. + +Το UART χρησιμοποιεί bits έναρξης και τερματισμού - δηλαδή στέλνει ένα bit έναρξης για να υποδείξει ότι πρόκειται να στείλει ένα byte (8 bits) δεδομένων, και στη συνέχεια ένα bit τερματισμού αφού στείλει τα 8 bits. + +Η ταχύτητα του UART εξαρτάται από το υλικό, αλλά ακόμη και οι πιο γρήγορες υλοποιήσεις δεν υπερβαίνουν τα 6.5 Mbps (megabits ανά δευτερόλεπτο, ή εκατομμύρια bits, 0 ή 1, που αποστέλλονται ανά δευτερόλεπτο). + +Μπορείτε να χρησιμοποιήσετε το UART μέσω ακίδων GPIO - μπορείτε να ορίσετε μία ακίδα ως Tx και μία άλλη ως Rx, και στη συνέχεια να τις συνδέσετε σε μια άλλη συσκευή. + +> 💁 Εάν χρησιμοποιείτε ένα Raspberry Pi με ένα Grove Base hat ως το υλικό IoT σας, θα μπορείτε να δείτε μια υποδοχή UART στην πλακέτα που μπορείτε να χρησιμοποιήσετε για να επικοινωνήσετε με αισθητήρες που χρησιμοποιούν το πρωτόκολλο UART. + +### Serial Peripheral Interface (SPI) + +Το SPI έχει σχεδιαστεί για επικοινωνία σε μικρές αποστάσεις, όπως σε έναν μικροελεγκτή για να επικοινωνεί με μια συσκευή αποθήκευσης όπως η μνήμη flash. Βασίζεται σε ένα μοντέλο ελεγκτή/περιφερειακής συσκευής με έναν μόνο ελεγκτή (συνήθως ο επεξεργαστής της συσκευής IoT) που αλληλεπιδρά με πολλαπλές περιφερειακές συσκευές. Ο ελεγκτής ελέγχει τα πάντα επιλέγοντας μια περιφερειακή συσκευή και στέλνοντας ή ζητώντας δεδομένα. + +> 💁 Όπως και το I2C, οι όροι ελεγκτής και περιφερειακή συσκευή είναι πρόσφατες αλλαγές, οπότε μπορεί να δείτε τους παλαιότερους όρους να χρησιμοποιούνται ακόμα. + +Οι ελεγκτές SPI χρησιμοποιούν 3 καλώδια, μαζί με 1 επιπλέον καλώδιο ανά περιφερειακή συσκευή. Οι περιφερειακές συσκευές χρησιμοποιούν 4 καλώδια. Αυτά τα καλώδια είναι: + +| Καλώδιο | Όνομα | Περιγραφή | +| ---- | --------- | ----------- | +| COPI | Έξοδος Ελεγκτή, Είσοδος Περιφερειακής Συσκευής | Αυτό το καλώδιο χρησιμοποιείται για την αποστολή δεδομένων από τον ελεγκτή στην περιφερειακή συσκευή. | +| CIPO | Είσοδος Ελεγκτή, Έξοδος Περιφερειακής Συσκευής | Αυτό το καλώδιο χρησιμοποιείται για την αποστολή δεδομένων από την περιφερειακή συσκευή στον ελεγκτή. | +| SCLK | Σειριακό Ρολόι | Αυτό το καλώδιο στέλνει ένα σήμα ρολογιού με ρυθμό που ορίζεται από τον ελεγκτή. | +| CS | Επιλογή Τσιπ | Ο ελεγκτής έχει πολλαπλά καλώδια, ένα ανά περιφερειακή συσκευή, και κάθε καλώδιο συνδέεται με το καλώδιο CS στην αντίστοιχη περιφερειακή συσκευή. | + +![SPI με έναν ελεγκτή και δύο περιφερειακές συσκευές](../../../../../translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.el.png) + +Το καλώδιο CS χρησιμοποιείται για την ενεργοποίηση μιας περιφερειακής συσκευής τη φορά, επικοινωνώντας μέσω των καλωδίων COPI και CIPO. Όταν ο ελεγκτής χρειάζεται να αλλάξει περιφερειακή συσκευή, απενεργοποιεί το καλώδιο CS που συνδέεται με την τρέχουσα ενεργή περιφερειακή συσκευή, και στη συνέχεια ενεργοποιεί το καλώδιο που συνδέεται με την περιφερειακή συσκευή με την οποία θέλει να επικοινωνήσει στη συνέχεια. + +Το SPI είναι *πλήρους διπλής κατεύθυνσης*, που σημαίνει ότι ο ελεγκτής μπορεί να στείλει και να λάβει δεδομένα ταυτόχρονα από την ίδια περιφερειακή συσκευή χρησιμοποιώντας τα καλώδια COPI και CIPO. Το SPI χρησιμοποιεί ένα σήμα ρολογιού στο καλώδιο SCLK για να διατηρεί τις συσκευές συγχρονισμένες, οπότε σε αντίθεση με την αποστολή απευθείας μέσω UART δεν χρειάζεται bits έναρξης και τερματισμού. + +Δεν υπάρχουν καθορισμένα όρια ταχύτητας για το SPI, με υλοποιήσεις που συχνά μπορούν να μεταδώσουν πολλαπλά megabytes δεδομένων ανά δευτερόλεπτο. + +Τα κιτ ανάπτυξης IoT συχνά υποστηρίζουν το SPI μέσω ορισμένων ακίδων GPIO. Για παράδειγμα, σε ένα Raspberry Pi μπορείτε να χρησιμοποιήσετε τις ακίδες GPIO 19, 21, 23, 24 και 26 για SPI. + +### Ασύρματη επικοινωνία + +Ορισμένοι αισθητήρες μπορούν να επικοινωνούν μέσω τυπικών ασύρματων πρωτοκόλλων, όπως Bluetooth (κυρίως Bluetooth Low Energy, ή BLE), LoRaWAN (ένα πρωτόκολλο δικτύωσης χαμηλής ισχύος μεγάλης εμβέλειας), ή WiFi. Αυτά επιτρέπουν τη χρήση απομακρυσμένων αισθητήρων που δεν συνδέονται φυσικά με μια συσκευή IoT. + +Ένα τέτοιο παράδειγμα είναι οι εμπορικοί αισθητήρες υγρασίας εδάφους. Αυτοί μετρούν την υγρασία του εδάφους σε ένα χωράφι και στη συνέχεια στέλνουν τα δεδομένα μέσω LoRaWAN σε μια κεντρική συσκευή, η οποία επεξεργάζεται τα δεδομένα ή τα στέλνει μέσω του Διαδικτύου. Αυτό επιτρέπει στον αισθητήρα να βρίσκεται μακριά από τη συσκευή IoT που διαχειρίζεται τα δεδομένα, μειώνοντας την κατανάλωση ενέργειας και την ανάγκη για μεγάλα δίκτυα WiFi ή μακριά καλώδια. + +Το BLE είναι δημοφιλές για προηγμένους αισθητήρες όπως οι συσκευές παρακολούθησης φυσικής κατάστασης που φοριούνται στον καρπό. Αυτές συνδυάζουν πολλαπλούς αισθητήρες και στέλνουν τα δεδομένα των αισθητήρων σε μια συσκευή IoT, όπως το τηλέφωνό σας, μέσω BLE. + +✅ Έχετε αισθητήρες Bluetooth πάνω σας, στο σπίτι σας ή στο σχολείο σας; Αυτοί μπορεί να περιλαμβάνουν αισθητήρες θερμοκρασίας, αισθητήρες παρουσίας, συσκευές εντοπισμού και συσκευές φυσικής κατάστασης. + +Ένας δημοφιλής τρόπος για τη σύνδεση εμπορικών συσκευών είναι το Zigbee. Το Zigbee χρησιμοποιεί WiFi για να σχηματίσει δικτυακά πλέγματα μεταξύ συσκευών, όπου κάθε συσκευή συνδέεται με όσο το δυνατόν περισσότερες κοντινές συσκευές, σχηματίζοντας έναν μεγάλο αριθμό συνδέσεων σαν ιστός αράχνης. Όταν μια συσκευή θέλει να στείλει ένα μήνυμα στο Διαδίκτυο, μπορεί να το στείλει στις κοντινότερες συσκευές, οι οποίες στη συνέχεια το προωθούν σε άλλες κοντινές συσκευές και ούτω καθεξής, μέχρι να φτάσει σε έναν συντονιστή και να σταλεί στο Διαδίκτυο. + +> 🐝 Το όνομα Zigbee αναφέρεται στον χορό "ζιγκ-ζαγκ" των μελισσών μετά την επιστροφή τους στην κυψέλη. + +## Μέτρηση επιπέδων υγρασίας στο έδαφος + +Μπορείτε να μετρήσετε το επίπεδο υγρασίας στο έδαφος χρησιμοποιώντας έναν αισθητήρα υγρασίας εδάφους, μια συσκευή IoT και ένα φυτό εσωτερικού χώρου ή ένα κοντινό κομμάτι εδάφους. + +### Εργασία - μέτρηση υγρασίας εδάφους + +Ακολουθήστε τον αντίστοιχο οδηγό για να μετρήσετε την υγρασία του εδάφους χρησιμοποιώντας τη συσκευή IoT σας: + +* [Arduino - Wio Terminal](wio-terminal-soil-moisture.md) +* [Υπολογιστής μονού πίνακα - Raspberry Pi](pi-soil-moisture.md) +* [Υπολογιστής μονού πίνακα - Εικονική συσκευή](virtual-device-soil-moisture.md) + +## Βαθμονόμηση αισθητήρων + +Οι αισθητήρες βασίζονται στη μέτρηση ηλεκτρικών ιδιοτήτων όπως η αντίσταση ή η χωρητικότητα. + +> 🎓 Η αντίσταση, μετρημένη σε ohms (Ω), είναι το πόση αντίσταση υπάρχει στη ροή του ηλεκτρικού ρεύματος μέσα από κάτι. Όταν εφαρμόζεται τάση σε ένα υλικό, η ποσότητα του ρεύματος που περνάει εξαρτάται από την αντίσταση του υλικού. Μπορείτε να διαβάσετε περισσότερα στη [σελίδα για την ηλεκτρική αντίσταση στη Wikipedia](https://wikipedia.org/wiki/Electrical_resistance_and_conductance). + +> 🎓 Η χωρητικότητα, μετρημένη σε farads (F), είναι η ικανότητα ενός εξαρτήματος ή κυκλώματος να συλλέγει και να αποθηκεύει ηλεκτρική ενέργεια. Μπορείτε να διαβάσετε περισσότερα για τη χωρητικότητα στη [σελίδα για τη χωρητικότητα στη Wikipedia](https://wikipedia.org/wiki/Capacitance). + +Αυτές οι μετρήσεις δεν είναι πάντα χρήσιμες - φανταστείτε έναν αισθητήρα θερμοκρασίας που σας δίνει μια μέτρηση 22.5KΩ! Αντίθετα, η τιμή που μετράται πρέπει να μετατραπεί σε μια χρήσιμη μονάδα μέσω βαθμονόμησης - δηλαδή αντιστοίχιση των τιμών που μετρήθηκαν με την ποσότητα που μετρήθηκε, ώστε να επιτρέπεται η μετατροπή νέων μετρήσεων στη σωστή μονάδα. + +Ορισμένοι αισθητήρες έρχονται προ-βαθμονομημένοι. Για παράδειγμα, ο αισθητήρας θερμοκρασίας που χρησιμοποιήσατε στο προηγούμενο μάθημα ήταν ήδη βαθμονομημένος ώστε να μπορεί να επιστρέψει μια μέτρηση θερμοκρασίας σε °C. Στο εργοστάσιο, ο πρώτος αισθητήρας που δημιουργήθηκε θα εκτεθεί σε μια σειρά γνωστών θερμοκρασιών και η αντίσταση θα μετρηθεί. Αυτό θα χρησιμοποιηθεί για τη δημιουργία ενός υπολογισμού που μπορεί να μετατρέψει από την τιμή που μετρήθηκε σε Ω (η μονάδα της αντίστασης) σε °C. + +> 💁 Ο τύπος για τον υπολογισμό της αντίστασης από τη θερμοκρασία ονομάζεται [εξίσωση Steinhart–Hart](https://wikipedia.org/wiki/Steinhart–Hart_equation). + +### Βαθμονόμηση αισθητήρα υγρασίας εδάφους + +Η υγρασία του εδάφους μετριέται χρησιμοποιώντας τη βαρύτητα ή τον όγκο του νερού. + +* Η βαρύτητα είναι το βάρος του νερού σε μια μονάδα βάρους εδάφους, μετρημένο ως ο αριθμός των κιλών νερού ανά κιλό ξηρού εδάφους +* Ο όγκος είναι ο όγκος του νερού σε μια μονάδα όγκου εδάφους, μετρημένος ως ο αριθμός των κυβικών μέτρων νερού ανά κυβικά μέτρα ξηρού εδάφους + +> 🇺🇸 Για τους Αμερικανούς, λόγω της συνέπειας των μονάδων, αυτά μπορούν να μετρηθούν σε λίβρες αντί για κιλά ή σε κυβικά πόδια αντί για κυβικά μέτρα. + +Οι αισθητήρες υγρασίας εδάφους μετρούν ηλεκτρική αντίσταση ή χωρητικότητα - αυτό όχι μόνο ποικίλλει ανάλογα με την υγρασία του εδάφους, αλλά και με τον τύπο του εδάφους, καθώς τα συστατικά του εδάφους μπορούν να αλλάξουν τα ηλεκτρικά χαρακτηριστικά του. Ιδανικά, οι αισθητήρες πρέπει να βαθμονομηθούν - δηλαδή να ληφθούν μετρήσεις από τον αισθητήρα και να συγκριθούν με μετρήσεις που βρέθηκαν χρησιμοποιώντας μια πιο επιστημονική προσέγγιση. Για παράδειγμα, ένα εργαστήριο μπορεί να υπολογίσει τη βαρύτητα της υγρασίας του εδάφους χρησιμοποιώντας δείγματα από ένα συγκεκριμένο χωράφι που λαμβάνονται μερικές φορές τον χρόνο, και αυτοί οι αριθμοί να χρησιμοποιηθούν για τη βαθμονόμηση του αισθητήρα, αντιστοιχίζοντας την ένδειξη του αισθητήρα με τη βαρύτητα της υγρασίας του εδάφους. + +![Γράφημα τάσης έναντι περιεχομένου υγρασίας εδάφους](../../../../../translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.el.png) + +Το παραπάνω γράφημα δείχνει πώς να βαθμονομήσετε έναν αισθητήρα. Η τάση καταγράφεται για ένα δείγμα εδάφους που στη συνέχεια μετριέται σε ένα εργαστήριο συγκρίνοντας το υγρό βάρος με το ξηρό βάρος (μετρώντας το βάρος υγρό, στη συνέχεια στεγνώνοντας σε φούρνο και μετρώντας το ξηρό). Αφού ληφθούν μερικές μετρήσεις, αυτές μπορούν να σχεδιαστούν σε ένα γράφημα και να προσαρμοστεί μια γραμμή στα σημεία. Αυτή η γραμμή μπορεί στη συνέχεια να χρησιμοποιηθεί για τη μετατροπή των μετρήσεων του αισθητήρα υγρασίας εδάφους που λαμβάνονται από μια συσκευή IoT σε πραγματικές μετρήσεις υγρασίας εδάφους. + +💁 Για τους αισθητήρες υγρασίας εδάφους με αντίσταση, η τάση αυξάνεται καθώς αυξάνεται η υγρασία του εδάφους. Για τους αισθη + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/2-detect-soil-moisture/assignment.md b/translations/el/2-farm/lessons/2-detect-soil-moisture/assignment.md new file mode 100644 index 00000000..c428ab3e --- /dev/null +++ b/translations/el/2-farm/lessons/2-detect-soil-moisture/assignment.md @@ -0,0 +1,61 @@ + +# Καλιμπράρετε τον αισθητήρα σας + +## Οδηγίες + +Σε αυτό το μάθημα συλλέξατε μετρήσεις από τον αισθητήρα υγρασίας εδάφους, οι οποίες καταγράφονται ως τιμές από 0-1023. Για να μετατρέψετε αυτές τις τιμές σε πραγματικές μετρήσεις υγρασίας εδάφους, πρέπει να καλιμπράρετε τον αισθητήρα σας. Αυτό μπορεί να γίνει λαμβάνοντας μετρήσεις από δείγματα εδάφους και υπολογίζοντας την υγρασία εδάφους με τη μέθοδο της βαρύτητας από αυτά τα δείγματα. + +Θα χρειαστεί να επαναλάβετε αυτά τα βήματα πολλές φορές για να συλλέξετε τις απαραίτητες μετρήσεις, χρησιμοποιώντας κάθε φορά χώμα με διαφορετική υγρασία. + +1. Πάρτε μια μέτρηση υγρασίας εδάφους χρησιμοποιώντας τον αισθητήρα υγρασίας εδάφους. Καταγράψτε αυτήν τη μέτρηση. + +1. Πάρτε ένα δείγμα εδάφους και ζυγίστε το. Καταγράψτε αυτό το βάρος. + +1. Στεγνώστε το χώμα - ένας ζεστός φούρνος στους 110°C (230°F) για μερικές ώρες είναι η καλύτερη μέθοδος. Μπορείτε να το κάνετε αυτό στον ήλιο ή να το τοποθετήσετε σε ένα ζεστό, ξηρό μέρος μέχρι το χώμα να στεγνώσει εντελώς. Θα πρέπει να είναι σε μορφή σκόνης και χαλαρό. + + > 💁 Σε ένα εργαστήριο, για τα πιο ακριβή αποτελέσματα, θα στεγνώνατε το χώμα σε φούρνο για 48-72 ώρες. Αν έχετε φούρνους ξήρανσης στο σχολείο σας, δείτε αν μπορείτε να τους χρησιμοποιήσετε για μεγαλύτερο χρονικό διάστημα. Όσο περισσότερο στεγνώσει το δείγμα, τόσο πιο ακριβή θα είναι τα αποτελέσματα. + +1. Ζυγίστε ξανά το χώμα. + + > 🔥 Αν το στεγνώσατε σε φούρνο, βεβαιωθείτε ότι έχει κρυώσει πρώτα! + +Η υγρασία εδάφους με τη μέθοδο της βαρύτητας υπολογίζεται ως: + +![Η υγρασία εδάφους % είναι το βάρος του υγρού εδάφους μείον το βάρος του ξηρού εδάφους, διαιρεμένο με το βάρος του ξηρού εδάφους, επί 100](../../../../../translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.el.png) + +* W - το βάρος του υγρού εδάφους +* W - το βάρος του ξηρού εδάφους + +Για παράδειγμα, ας πούμε ότι έχετε ένα δείγμα εδάφους που ζυγίζει 212g υγρό και 197g ξηρό. + +![Η συμπληρωμένη εξίσωση](../../../../../translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.el.png) + +* W = 212g +* W = 197g +* 212 - 197 = 15 +* 15 / 197 = 0.076 +* 0.076 * 100 = 7.6% + +Σε αυτό το παράδειγμα, το χώμα έχει υγρασία εδάφους με τη μέθοδο της βαρύτητας 7.6%. + +Μόλις έχετε τις μετρήσεις για τουλάχιστον 3 δείγματα, σχεδιάστε ένα γράφημα της υγρασίας εδάφους % σε σχέση με τη μέτρηση του αισθητήρα υγρασίας εδάφους και προσθέστε μια γραμμή που να ταιριάζει καλύτερα στα σημεία. Στη συνέχεια, μπορείτε να χρησιμοποιήσετε αυτό το γράφημα για να υπολογίσετε την υγρασία εδάφους με τη μέθοδο της βαρύτητας για μια δεδομένη μέτρηση αισθητήρα, διαβάζοντας την τιμή από τη γραμμή. + +## Κριτήρια Αξιολόγησης + +| Κριτήρια | Εξαιρετικό | Επαρκές | Χρειάζεται Βελτίωση | +| -------- | --------- | -------- | ----------------- | +| Συλλογή δεδομένων καλιμπραρίσματος | Συλλογή τουλάχιστον 3 δειγμάτων καλιμπραρίσματος | Συλλογή τουλάχιστον 2 δειγμάτων καλιμπραρίσματος | Συλλογή τουλάχιστον 1 δείγματος καλιμπραρίσματος | +| Δημιουργία καλιμπραρισμένης μέτρησης | Επιτυχής σχεδίαση του γραφήματος καλιμπραρίσματος και λήψη μέτρησης από τον αισθητήρα, και μετατροπή της σε υγρασία εδάφους με τη μέθοδο της βαρύτητας | Επιτυχής σχεδίαση του γραφήματος καλιμπραρίσματος | Αδυναμία σχεδίασης του γραφήματος | + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md b/translations/el/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md new file mode 100644 index 00000000..6a81d43e --- /dev/null +++ b/translations/el/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md @@ -0,0 +1,108 @@ + +# Μέτρηση υγρασίας εδάφους - Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν χωρητικό αισθητήρα υγρασίας εδάφους στο Raspberry Pi σας και θα διαβάσετε τιμές από αυτόν. + +## Υλικό + +Το Raspberry Pi χρειάζεται έναν χωρητικό αισθητήρα υγρασίας εδάφους. + +Ο αισθητήρας που θα χρησιμοποιήσετε είναι ένας [Capacitive Soil Moisture Sensor](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), ο οποίος μετρά την υγρασία του εδάφους ανιχνεύοντας τη χωρητικότητα του εδάφους, μια ιδιότητα που αλλάζει καθώς αλλάζει η υγρασία του εδάφους. Όσο αυξάνεται η υγρασία του εδάφους, η τάση μειώνεται. + +Αυτός είναι ένας αναλογικός αισθητήρας, οπότε χρησιμοποιεί μια αναλογική ακίδα και τον 10-bit ADC στο Grove Base Hat του Pi για να μετατρέψει την τάση σε ψηφιακό σήμα από 1-1,023. Στη συνέχεια, αυτό αποστέλλεται μέσω I2C μέσω των ακίδων GPIO του Pi. + +### Σύνδεση του αισθητήρα υγρασίας εδάφους + +Ο αισθητήρας υγρασίας εδάφους Grove μπορεί να συνδεθεί στο Raspberry Pi. + +#### Εργασία - σύνδεση του αισθητήρα υγρασίας εδάφους + +Συνδέστε τον αισθητήρα υγρασίας εδάφους. + +![Αισθητήρας υγρασίας εδάφους Grove](../../../../../translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.el.png) + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του αισθητήρα υγρασίας εδάφους. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. + +1. Με το Raspberry Pi απενεργοποιημένο, συνδέστε το άλλο άκρο του καλωδίου Grove στην αναλογική υποδοχή με την ένδειξη **A0** στο Grove Base Hat που είναι συνδεδεμένο στο Pi. Αυτή η υποδοχή είναι η δεύτερη από τα δεξιά, στη σειρά των υποδοχών δίπλα στις ακίδες GPIO. + +![Ο αισθητήρας υγρασίας εδάφους Grove συνδεδεμένος στην υποδοχή A0](../../../../../translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.el.png) + +1. Εισάγετε τον αισθητήρα υγρασίας εδάφους στο έδαφος. Έχει μια 'γραμμή μέγιστης θέσης' - μια λευκή γραμμή πάνω στον αισθητήρα. Εισάγετε τον αισθητήρα μέχρι τη γραμμή αυτή, αλλά όχι πέρα από αυτήν. + +![Ο αισθητήρας υγρασίας εδάφους Grove στο έδαφος](../../../../../translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.el.png) + +## Προγραμματισμός του αισθητήρα υγρασίας εδάφους + +Το Raspberry Pi μπορεί τώρα να προγραμματιστεί για να χρησιμοποιήσει τον συνδεδεμένο αισθητήρα υγρασίας εδάφους. + +### Εργασία - προγραμματισμός του αισθητήρα υγρασίας εδάφους + +Προγραμματίστε τη συσκευή. + +1. Ενεργοποιήστε το Pi και περιμένετε να εκκινήσει. + +1. Εκκινήστε το VS Code, είτε απευθείας στο Pi είτε συνδεθείτε μέσω της επέκτασης Remote SSH. + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη ρύθμιση και την εκκίνηση του VS Code στο nightlight - μάθημα 1, αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. Από το τερματικό, δημιουργήστε έναν νέο φάκελο στον κατάλογο του χρήστη `pi` με όνομα `soil-moisture-sensor`. Δημιουργήστε ένα αρχείο σε αυτόν τον φάκελο με όνομα `app.py`. + +1. Ανοίξτε αυτόν τον φάκελο στο VS Code. + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py` για να εισάγετε κάποιες απαιτούμενες βιβλιοθήκες: + + ```python + import time + from grove.adc import ADC + ``` + + Η δήλωση `import time` εισάγει τη μονάδα `time`, η οποία θα χρησιμοποιηθεί αργότερα σε αυτήν την εργασία. + + Η δήλωση `from grove.adc import ADC` εισάγει το `ADC` από τις βιβλιοθήκες Python του Grove. Αυτή η βιβλιοθήκη περιέχει κώδικα για την αλληλεπίδραση με τον αναλογικό σε ψηφιακό μετατροπέα στο Pi Base Hat και την ανάγνωση τάσεων από αναλογικούς αισθητήρες. + +1. Προσθέστε τον παρακάτω κώδικα κάτω από αυτό για να δημιουργήσετε μια παρουσία της κλάσης `ADC`: + + ```python + adc = ADC() + ``` + +1. Προσθέστε έναν άπειρο βρόχο που διαβάζει από αυτόν τον ADC στην ακίδα A0 και γράφει το αποτέλεσμα στην κονσόλα. Αυτός ο βρόχος μπορεί στη συνέχεια να κοιμάται για 10 δευτερόλεπτα μεταξύ των αναγνώσεων. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. Εκτελέστε την εφαρμογή Python. Θα δείτε τις μετρήσεις υγρασίας εδάφους να γράφονται στην κονσόλα. Προσθέστε λίγο νερό στο έδαφος ή αφαιρέστε τον αισθητήρα από το έδαφος και δείτε την τιμή να αλλάζει. + + ```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 + ``` + + Στο παραπάνω παράδειγμα εξόδου, μπορείτε να δείτε την πτώση της τάσης καθώς προστίθεται νερό. + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code/pi](../../../../../2-farm/lessons/2-detect-soil-moisture/code/pi). + +😀 Το πρόγραμμα του αισθητήρα υγρασίας εδάφους σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md b/translations/el/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md new file mode 100644 index 00000000..f454b135 --- /dev/null +++ b/translations/el/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md @@ -0,0 +1,123 @@ + +# Μέτρηση υγρασίας εδάφους - Εικονικό IoT Υλικό + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν χωρητικό αισθητήρα υγρασίας εδάφους στη εικονική IoT συσκευή σας και θα διαβάσετε τιμές από αυτόν. + +## Εικονικό Υλικό + +Η εικονική IoT συσκευή θα χρησιμοποιήσει έναν προσομοιωμένο χωρητικό αισθητήρα υγρασίας εδάφους Grove. Αυτό διατηρεί το εργαστήριο ίδιο με τη χρήση ενός Raspberry Pi με έναν φυσικό χωρητικό αισθητήρα υγρασίας εδάφους Grove. + +Σε μια φυσική IoT συσκευή, ο αισθητήρας υγρασίας εδάφους θα ήταν ένας χωρητικός αισθητήρας που μετρά την υγρασία του εδάφους ανιχνεύοντας τη χωρητικότητα του εδάφους, μια ιδιότητα που αλλάζει καθώς αλλάζει η υγρασία του εδάφους. Καθώς αυξάνεται η υγρασία του εδάφους, η τάση μειώνεται. + +Αυτός είναι ένας αναλογικός αισθητήρας, οπότε χρησιμοποιεί έναν προσομοιωμένο 10-bit ADC για να αναφέρει μια τιμή από 1-1,023. + +### Προσθήκη του αισθητήρα υγρασίας εδάφους στο CounterFit + +Για να χρησιμοποιήσετε έναν εικονικό αισθητήρα υγρασίας εδάφους, πρέπει να τον προσθέσετε στην εφαρμογή CounterFit. + +#### Εργασία - Προσθήκη του αισθητήρα υγρασίας εδάφους στο CounterFit + +Προσθέστε τον αισθητήρα υγρασίας εδάφους στην εφαρμογή CounterFit. + +1. Δημιουργήστε μια νέα εφαρμογή Python στον υπολογιστή σας σε έναν φάκελο που ονομάζεται `soil-moisture-sensor` με ένα μόνο αρχείο που ονομάζεται `app.py` και ένα εικονικό περιβάλλον Python, και προσθέστε τα πακέτα pip του CounterFit. + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη δημιουργία και ρύθμιση ενός CounterFit Python project στο μάθημα 1 αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Βεβαιωθείτε ότι η εφαρμογή ιστού CounterFit είναι ενεργοποιημένη. + +1. Δημιουργήστε έναν αισθητήρα υγρασίας εδάφους: + + 1. Στο πλαίσιο *Create sensor* στον πίνακα *Sensors*, ανοίξτε το πλαίσιο *Sensor type* και επιλέξτε *Soil Moisture*. + + 1. Αφήστε τις *Units* ρυθμισμένες σε *NoUnits*. + + 1. Βεβαιωθείτε ότι το *Pin* είναι ρυθμισμένο στο *0*. + + 1. Επιλέξτε το κουμπί **Add** για να δημιουργήσετε τον αισθητήρα *Soil Moisture* στο Pin 0. + + ![Οι ρυθμίσεις του αισθητήρα υγρασίας εδάφους](../../../../../translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.el.png) + + Ο αισθητήρας υγρασίας εδάφους θα δημιουργηθεί και θα εμφανιστεί στη λίστα αισθητήρων. + + ![Ο αισθητήρας υγρασίας εδάφους δημιουργήθηκε](../../../../../translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.el.png) + +## Προγραμματισμός της εφαρμογής του αισθητήρα υγρασίας εδάφους + +Η εφαρμογή του αισθητήρα υγρασίας εδάφους μπορεί τώρα να προγραμματιστεί χρησιμοποιώντας τους αισθητήρες του CounterFit. + +### Εργασία - Προγραμματισμός της εφαρμογής του αισθητήρα υγρασίας εδάφους + +Προγραμματίστε την εφαρμογή του αισθητήρα υγρασίας εδάφους. + +1. Βεβαιωθείτε ότι η εφαρμογή `soil-moisture-sensor` είναι ανοιχτή στο VS Code. + +1. Ανοίξτε το αρχείο `app.py`. + +1. Προσθέστε τον παρακάτω κώδικα στην κορυφή του `app.py` για να συνδέσετε την εφαρμογή στο CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py` για να εισάγετε κάποιες απαιτούμενες βιβλιοθήκες: + + ```python + import time + from counterfit_shims_grove.adc import ADC + ``` + + Η δήλωση `import time` εισάγει το module `time` που θα χρησιμοποιηθεί αργότερα σε αυτήν την εργασία. + + Η δήλωση `from counterfit_shims_grove.adc import ADC` εισάγει την κλάση `ADC` για να αλληλεπιδράσει με έναν εικονικό αναλογικό σε ψηφιακό μετατροπέα που μπορεί να συνδεθεί με έναν αισθητήρα του CounterFit. + +1. Προσθέστε τον παρακάτω κώδικα κάτω από αυτό για να δημιουργήσετε μια παρουσία της κλάσης `ADC`: + + ```python + adc = ADC() + ``` + +1. Προσθέστε έναν άπειρο βρόχο που διαβάζει από αυτόν τον ADC στο pin 0 και γράφει το αποτέλεσμα στην κονσόλα. Αυτός ο βρόχος μπορεί στη συνέχεια να κοιμάται για 10 δευτερόλεπτα μεταξύ των αναγνώσεων. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. Από την εφαρμογή CounterFit, αλλάξτε την τιμή του αισθητήρα υγρασίας εδάφους που θα διαβαστεί από την εφαρμογή. Μπορείτε να το κάνετε αυτό με δύο τρόπους: + + * Εισάγετε έναν αριθμό στο πλαίσιο *Value* για τον αισθητήρα υγρασίας εδάφους και στη συνέχεια επιλέξτε το κουμπί **Set**. Ο αριθμός που εισάγετε θα είναι η τιμή που επιστρέφεται από τον αισθητήρα. + + * Ελέγξτε το πλαίσιο *Random* και εισάγετε μια τιμή *Min* και *Max*, και στη συνέχεια επιλέξτε το κουμπί **Set**. Κάθε φορά που ο αισθητήρας διαβάζει μια τιμή, θα διαβάζει έναν τυχαίο αριθμό μεταξύ *Min* και *Max*. + +1. Εκτελέστε την εφαρμογή Python. Θα δείτε τις μετρήσεις υγρασίας εδάφους να γράφονται στην κονσόλα. Αλλάξτε τις ρυθμίσεις *Value* ή *Random* για να δείτε την τιμή να αλλάζει. + + ```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 + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code/virtual-device](../../../../../2-farm/lessons/2-detect-soil-moisture/code/virtual-device). + +😀 Το πρόγραμμα του αισθητήρα υγρασίας εδάφους σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md b/translations/el/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md new file mode 100644 index 00000000..53f7281d --- /dev/null +++ b/translations/el/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md @@ -0,0 +1,117 @@ + +# Μέτρηση υγρασίας εδάφους - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν χωρητικό αισθητήρα υγρασίας εδάφους στο Wio Terminal σας και θα διαβάσετε τιμές από αυτόν. + +## Υλικό + +Το Wio Terminal χρειάζεται έναν χωρητικό αισθητήρα υγρασίας εδάφους. + +Ο αισθητήρας που θα χρησιμοποιήσετε είναι ένας [Χωρητικός Αισθητήρας Υγρασίας Εδάφους](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), ο οποίος μετρά την υγρασία του εδάφους ανιχνεύοντας τη χωρητικότητα του εδάφους, μια ιδιότητα που αλλάζει καθώς αλλάζει η υγρασία του εδάφους. Όσο αυξάνεται η υγρασία του εδάφους, η τάση μειώνεται. + +Πρόκειται για έναν αναλογικό αισθητήρα, οπότε συνδέεται σε αναλογικές ακίδες του Wio Terminal, χρησιμοποιώντας έναν ενσωματωμένο ADC για τη δημιουργία μιας τιμής από 0-1.023. + +### Σύνδεση του αισθητήρα υγρασίας εδάφους + +Ο αισθητήρας υγρασίας εδάφους Grove μπορεί να συνδεθεί στη διαμορφώσιμη αναλογική/ψηφιακή θύρα του Wio Terminal. + +#### Εργασία - σύνδεση του αισθητήρα υγρασίας εδάφους + +Συνδέστε τον αισθητήρα υγρασίας εδάφους. + +![Ένας αισθητήρας υγρασίας εδάφους Grove](../../../../../translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.el.png) + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του αισθητήρα υγρασίας εδάφους. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. + +1. Με το Wio Terminal αποσυνδεδεμένο από τον υπολογιστή σας ή άλλη πηγή τροφοδοσίας, συνδέστε το άλλο άκρο του καλωδίου Grove στη δεξιά υποδοχή Grove του Wio Terminal, όπως κοιτάτε την οθόνη. Αυτή είναι η υποδοχή που βρίσκεται πιο μακριά από το κουμπί τροφοδοσίας. + +![Ο αισθητήρας υγρασίας εδάφους Grove συνδεδεμένος στη δεξιά υποδοχή](../../../../../translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.el.png) + +1. Εισάγετε τον αισθητήρα υγρασίας εδάφους στο έδαφος. Διαθέτει μια 'γραμμή μέγιστης θέσης' - μια λευκή γραμμή κατά μήκος του αισθητήρα. Εισάγετε τον αισθητήρα μέχρι τη γραμμή αυτή, αλλά όχι πιο πέρα. + +![Ο αισθητήρας υγρασίας εδάφους Grove στο έδαφος](../../../../../translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.el.png) + +1. Τώρα μπορείτε να συνδέσετε το Wio Terminal στον υπολογιστή σας. + +## Προγραμματισμός του αισθητήρα υγρασίας εδάφους + +Το Wio Terminal μπορεί τώρα να προγραμματιστεί για να χρησιμοποιεί τον συνδεδεμένο αισθητήρα υγρασίας εδάφους. + +### Εργασία - προγραμματισμός του αισθητήρα υγρασίας εδάφους + +Προγραμματίστε τη συσκευή. + +1. Δημιουργήστε ένα ολοκαίνουργιο έργο Wio Terminal χρησιμοποιώντας το PlatformIO. Ονομάστε αυτό το έργο `soil-moisture-sensor`. Προσθέστε κώδικα στη συνάρτηση `setup` για να διαμορφώσετε τη σειριακή θύρα. + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη δημιουργία ενός έργου PlatformIO στο έργο 1, μάθημα 1, αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#create-a-platformio-project). + +1. Δεν υπάρχει βιβλιοθήκη για αυτόν τον αισθητήρα, αλλά μπορείτε να διαβάσετε από την αναλογική ακίδα χρησιμοποιώντας τη ενσωματωμένη συνάρτηση [`analogRead`](https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/) του Arduino. Ξεκινήστε διαμορφώνοντας την αναλογική ακίδα για είσοδο, ώστε να μπορούν να διαβαστούν τιμές από αυτήν, προσθέτοντας τα εξής στη συνάρτηση `setup`. + + ```cpp + pinMode(A0, INPUT); + ``` + + Αυτό ορίζει την ακίδα `A0`, τη συνδυασμένη αναλογική/ψηφιακή ακίδα, ως ακίδα εισόδου από την οποία μπορεί να διαβαστεί τάση. + +1. Προσθέστε τα εξής στη συνάρτηση `loop` για να διαβάσετε την τάση από αυτήν την ακίδα: + + ```cpp + int soil_moisture = analogRead(A0); + ``` + +1. Κάτω από αυτόν τον κώδικα, προσθέστε τον παρακάτω κώδικα για να εκτυπώσετε την τιμή στη σειριακή θύρα: + + ```cpp + Serial.print("Soil Moisture: "); + Serial.println(soil_moisture); + ``` + +1. Τέλος, προσθέστε μια καθυστέρηση στο τέλος 10 δευτερολέπτων: + + ```cpp + delay(10000); + ``` + +1. Δημιουργήστε και ανεβάστε τον κώδικα στο Wio Terminal. + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη δημιουργία ενός έργου PlatformIO στο έργο 1, μάθημα 1, αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#write-the-hello-world-app). + +1. Μόλις ανεβάσετε τον κώδικα, μπορείτε να παρακολουθήσετε την υγρασία του εδάφους χρησιμοποιώντας τον σειριακό παρακολουθητή. Προσθέστε λίγο νερό στο έδαφος ή αφαιρέστε τον αισθητήρα από το έδαφος και δείτε την τιμή να αλλάζει. + + ```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 + ``` + + Στο παραπάνω παράδειγμα εξόδου, μπορείτε να δείτε την πτώση της τάσης καθώς προστίθεται νερό. + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code/wio-terminal](../../../../../2-farm/lessons/2-detect-soil-moisture/code/wio-terminal). + +😀 Το πρόγραμμα του αισθητήρα υγρασίας εδάφους σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/3-automated-plant-watering/README.md b/translations/el/2-farm/lessons/3-automated-plant-watering/README.md new file mode 100644 index 00000000..4ff63ae0 --- /dev/null +++ b/translations/el/2-farm/lessons/3-automated-plant-watering/README.md @@ -0,0 +1,306 @@ + +# Αυτόματο πότισμα φυτών + +![Μια συνοπτική παρουσίαση του μαθήματος](../../../../../translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.el.jpg) + +> Σκίτσο από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +Αυτό το μάθημα διδάχθηκε ως μέρος της σειράς [IoT for Beginners Project 2 - Digital Agriculture](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) από το [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Αυτόματο πότισμα φυτών με IoT](https://img.youtube.com/vi/g9FfZwv9R58/0.jpg)](https://youtu.be/g9FfZwv9R58) + +## Ερωτηματολόγιο πριν το μάθημα + +[Ερωτηματολόγιο πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/13) + +## Εισαγωγή + +Στο προηγούμενο μάθημα, μάθατε πώς να παρακολουθείτε την υγρασία του εδάφους. Σε αυτό το μάθημα, θα μάθετε πώς να κατασκευάσετε τα βασικά εξαρτήματα ενός αυτόματου συστήματος ποτίσματος που ανταποκρίνεται στην υγρασία του εδάφους. Θα μάθετε επίσης για το χρόνο απόκρισης - πώς οι αισθητήρες μπορεί να χρειάζονται χρόνο για να ανταποκριθούν στις αλλαγές και πώς οι ενεργοποιητές μπορεί να χρειάζονται χρόνο για να αλλάξουν τις ιδιότητες που μετρούν οι αισθητήρες. + +Σε αυτό το μάθημα θα καλύψουμε: + +* [Έλεγχος συσκευών υψηλής ισχύος από συσκευή IoT χαμηλής ισχύος](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Έλεγχος ενός ρελέ](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Έλεγχος του φυτού σας μέσω MQTT](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Χρονισμός αισθητήρων και ενεργοποιητών](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Προσθήκη χρονισμού στον διακομιστή ελέγχου του φυτού σας](../../../../../2-farm/lessons/3-automated-plant-watering) + +## Έλεγχος συσκευών υψηλής ισχύος από συσκευή IoT χαμηλής ισχύος + +Οι συσκευές IoT χρησιμοποιούν χαμηλή τάση. Ενώ αυτό είναι αρκετό για αισθητήρες και ενεργοποιητές χαμηλής ισχύος όπως τα LED, δεν είναι αρκετό για να ελέγξει μεγαλύτερο εξοπλισμό, όπως μια αντλία νερού που χρησιμοποιείται για άρδευση. Ακόμα και μικρές αντλίες που θα μπορούσατε να χρησιμοποιήσετε για φυτά εσωτερικού χώρου καταναλώνουν υπερβολικό ρεύμα για ένα κιτ ανάπτυξης IoT και θα μπορούσαν να προκαλέσουν ζημιά στην πλακέτα. + +> 🎓 Το ρεύμα, που μετριέται σε Αμπέρ (A), είναι η ποσότητα ηλεκτρισμού που κινείται μέσα σε ένα κύκλωμα. Η τάση παρέχει την ώθηση, ενώ το ρεύμα είναι το πόσο ωθείται. Μπορείτε να διαβάσετε περισσότερα για το ρεύμα στη [σελίδα για το ηλεκτρικό ρεύμα στη Wikipedia](https://wikipedia.org/wiki/Electric_current). + +Η λύση σε αυτό είναι να συνδέσετε την αντλία σε μια εξωτερική πηγή ενέργειας και να χρησιμοποιήσετε έναν ενεργοποιητή για να την ενεργοποιήσετε, παρόμοια με το πώς θα ανάβατε ένα φως. Χρειάζεται μια μικρή ποσότητα ενέργειας (με τη μορφή ενέργειας από το σώμα σας) για να γυρίσετε έναν διακόπτη, και αυτό συνδέει το φως με το ηλεκτρικό δίκτυο που λειτουργεί στα 110v/240v. + +![Ένας διακόπτης ανάβει ένα φως](../../../../../translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.el.png) + +> 🎓 [Ηλεκτρικό δίκτυο](https://wikipedia.org/wiki/Mains_electricity) αναφέρεται στην ηλεκτρική ενέργεια που παρέχεται σε σπίτια και επιχειρήσεις μέσω εθνικών υποδομών σε πολλές περιοχές του κόσμου. + +✅ Οι συσκευές IoT συνήθως παρέχουν 3.3V ή 5V, με λιγότερο από 1 αμπέρ (1A) ρεύματος. Συγκρίνετε αυτό με το ηλεκτρικό δίκτυο που είναι συνήθως στα 230V (120V στη Βόρεια Αμερική και 100V στην Ιαπωνία) και μπορεί να παρέχει ισχύ για συσκευές που καταναλώνουν 30A. + +Υπάρχουν διάφοροι ενεργοποιητές που μπορούν να το κάνουν αυτό, συμπεριλαμβανομένων μηχανικών συσκευών που μπορείτε να προσαρμόσετε σε υπάρχοντες διακόπτες για να μιμηθούν ένα δάχτυλο που τους ανάβει. Ο πιο δημοφιλής είναι το ρελέ. + +### Ρελέ + +Ένα ρελέ είναι ένας ηλεκτρομηχανικός διακόπτης που μετατρέπει ένα ηλεκτρικό σήμα σε μηχανική κίνηση που ενεργοποιεί έναν διακόπτη. Ο πυρήνας ενός ρελέ είναι ένας ηλεκτρομαγνήτης. + +> 🎓 [Ηλεκτρομαγνήτες](https://wikipedia.org/wiki/Electromagnet) είναι μαγνήτες που δημιουργούνται περνώντας ηλεκτρισμό μέσα από ένα πηνίο σύρματος. Όταν ο ηλεκτρισμός είναι ενεργοποιημένος, το πηνίο μαγνητίζεται. Όταν ο ηλεκτρισμός απενεργοποιείται, το πηνίο χάνει τη μαγνητική του ιδιότητα. + +![Όταν είναι ενεργοποιημένο, ο ηλεκτρομαγνήτης δημιουργεί μαγνητικό πεδίο, ενεργοποιώντας τον διακόπτη του κυκλώματος εξόδου](../../../../../translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.el.png) + +Σε ένα ρελέ, ένα κύκλωμα ελέγχου τροφοδοτεί τον ηλεκτρομαγνήτη. Όταν ο ηλεκτρομαγνήτης είναι ενεργοποιημένος, τραβά έναν μοχλό που κινεί έναν διακόπτη, κλείνοντας ένα ζεύγος επαφών και ολοκληρώνοντας ένα κύκλωμα εξόδου. + +![Όταν είναι απενεργοποιημένο, ο ηλεκτρομαγνήτης δεν δημιουργεί μαγνητικό πεδίο, απενεργοποιώντας τον διακόπτη του κυκλώματος εξόδου](../../../../../translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.el.png) + +Όταν το κύκλωμα ελέγχου είναι απενεργοποιημένο, ο ηλεκτρομαγνήτης απενεργοποιείται, απελευθερώνοντας τον μοχλό και ανοίγοντας τις επαφές, απενεργοποιώντας το κύκλωμα εξόδου. Τα ρελέ είναι ψηφιακοί ενεργοποιητές - ένα υψηλό σήμα στο ρελέ το ενεργοποιεί, ένα χαμηλό σήμα το απενεργοποιεί. + +Το κύκλωμα εξόδου μπορεί να χρησιμοποιηθεί για την τροφοδοσία πρόσθετου εξοπλισμού, όπως ένα σύστημα άρδευσης. Η συσκευή IoT μπορεί να ενεργοποιήσει το ρελέ, ολοκληρώνοντας το κύκλωμα εξόδου που τροφοδοτεί το σύστημα άρδευσης, και τα φυτά ποτίζονται. Στη συνέχεια, η συσκευή IoT μπορεί να απενεργοποιήσει το ρελέ, διακόπτοντας την τροφοδοσία στο σύστημα άρδευσης, σταματώντας το νερό. + +![Ένα ρελέ ενεργοποιείται, ενεργοποιώντας μια αντλία που στέλνει νερό σε ένα φυτό](../../../../../images/strawberry-pump.gif) + +Στο παραπάνω βίντεο, ένα ρελέ ενεργοποιείται. Ένα LED στο ρελέ ανάβει για να υποδείξει ότι είναι ενεργοποιημένο (ορισμένες πλακέτες ρελέ έχουν LED για να υποδεικνύουν αν το ρελέ είναι ενεργοποιημένο ή απενεργοποιημένο), και η ισχύς αποστέλλεται στην αντλία, ενεργοποιώντας την και αντλώντας νερό σε ένα φυτό. + +> 💁 Τα ρελέ μπορούν επίσης να χρησιμοποιηθούν για την εναλλαγή μεταξύ δύο κυκλωμάτων εξόδου αντί να ενεργοποιούν ή να απενεργοποιούν ένα. Καθώς ο μοχλός κινείται, μετακινεί έναν διακόπτη από την ολοκλήρωση ενός κυκλώματος εξόδου στην ολοκλήρωση ενός άλλου κυκλώματος εξόδου, συνήθως μοιράζοντας μια κοινή σύνδεση ισχύος ή γείωσης. + +✅ Κάντε μια έρευνα: Υπάρχουν πολλοί τύποι ρελέ, με διαφορές όπως αν το κύκλωμα ελέγχου ενεργοποιεί ή απενεργοποιεί το ρελέ όταν εφαρμόζεται ισχύς, ή αν υπάρχουν πολλαπλά κυκλώματα εξόδου. Μάθετε για αυτούς τους διαφορετικούς τύπους. + +Όταν ο μοχλός κινείται, συνήθως μπορείτε να τον ακούσετε να κάνει επαφή με τον ηλεκτρομαγνήτη με έναν καθαρό ήχο "κλικ". + +> 💁 Ένα ρελέ μπορεί να συνδεθεί έτσι ώστε η σύνδεση να διακόπτει την τροφοδοσία στο ίδιο το ρελέ, απενεργοποιώντας το, το οποίο στη συνέχεια στέλνει ξανά ισχύ στο ρελέ, ενεργοποιώντας το ξανά, και ούτω καθεξής. Αυτό σημαίνει ότι το ρελέ θα κάνει κλικ πολύ γρήγορα, δημιουργώντας έναν ήχο βουητού. Έτσι λειτουργούσαν μερικά από τα πρώτα κουδούνια πόρτας. + +### Ισχύς ρελέ + +Ο ηλεκτρομαγνήτης δεν χρειάζεται πολλή ισχύ για να ενεργοποιηθεί και να τραβήξει τον μοχλό, μπορεί να ελεγχθεί χρησιμοποιώντας την έξοδο 3.3V ή 5V από ένα κιτ ανάπτυξης IoT. Το κύκλωμα εξόδου μπορεί να μεταφέρει πολύ περισσότερη ισχύ, ανάλογα με το ρελέ, συμπεριλαμβανομένης της τάσης δικτύου ή ακόμα και υψηλότερων επιπέδων ισχύος για βιομηχανική χρήση. Με αυτόν τον τρόπο, ένα κιτ ανάπτυξης IoT μπορεί να ελέγξει ένα σύστημα άρδευσης, από μια μικρή αντλία για ένα μόνο φυτό, έως ένα τεράστιο βιομηχανικό σύστημα για μια ολόκληρη εμπορική φάρμα. + +![Ένα ρελέ Grove με το κύκλωμα ελέγχου, το κύκλωμα εξόδου και το ρελέ επισημασμένα](../../../../../translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.el.png) + +Η παραπάνω εικόνα δείχνει ένα ρελέ Grove. Το κύκλωμα ελέγχου συνδέεται με μια συσκευή IoT και ενεργοποιεί ή απενεργοποιεί το ρελέ χρησιμοποιώντας 3.3V ή 5V. Το κύκλωμα εξόδου έχει δύο ακροδέκτες, οποιοσδήποτε από αυτούς μπορεί να είναι ισχύς ή γείωση. Το κύκλωμα εξόδου μπορεί να χειριστεί έως 250V στα 10A, αρκετό για μια σειρά από συσκευές που λειτουργούν με τάση δικτύου. Μπορείτε να βρείτε ρελέ που μπορούν να χειριστούν ακόμα υψηλότερα επίπεδα ισχύος. + +![Μια αντλία συνδεδεμένη μέσω ενός ρελέ](../../../../../translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.el.png) + +Στην παραπάνω εικόνα, η ισχύς παρέχεται σε μια αντλία μέσω ενός ρελέ. Υπάρχει ένα κόκκινο καλώδιο που συνδέει τον ακροδέκτη +5V μιας τροφοδοσίας USB με έναν ακροδέκτη του κυκλώματος εξόδου του ρελέ, και ένα άλλο κόκκινο καλώδιο που συνδέει τον άλλο ακροδέκτη του κυκλώματος εξόδου με την αντλία. Ένα μαύρο καλώδιο συνδέει την αντλία με τη γείωση της τροφοδοσίας USB. Όταν το ρελέ ενεργοποιείται, ολοκληρώνει το κύκλωμα, στέλνοντας 5V στην αντλία, ενεργοποιώντας την αντλία. + +## Έλεγχος ενός ρελέ + +Μπορείτε να ελέγξετε ένα ρελέ από το κιτ ανάπτυξης IoT σας. + +### Εργασία - έλεγχος ενός ρελέ + +Ακολουθήστε τον αντίστοιχο οδηγό για να ελέγξετε ένα ρελέ χρησιμοποιώντας τη συσκευή IoT σας: + +* [Arduino - Wio Terminal](wio-terminal-relay.md) +* [Υπολογιστής μονού πίνακα - Raspberry Pi](pi-relay.md) +* [Υπολογιστής μονού πίνακα - Εικονική συσκευή](virtual-device-relay.md) + +## Έλεγχος του φυτού σας μέσω MQTT + +Μέχρι στιγμής, το ρελέ σας ελέγχεται απευθείας από τη συσκευή IoT με βάση μια μόνο μέτρηση υγρασίας εδάφους. Σε ένα εμπορικό σύστημα άρδευσης, η λογική ελέγχου θα είναι κεντρική, επιτρέποντας τη λήψη αποφάσεων για το πότισμα χρησιμοποιώντας δεδομένα από πολλούς αισθητήρες και επιτρέποντας οποιαδήποτε διαμόρφωση να αλλάζει σε ένα μόνο σημείο. Για να προσομοιώσετε αυτό, μπορείτε να ελέγξετε το ρελέ μέσω MQTT. + +### Εργασία - έλεγχος του ρελέ μέσω MQTT + +1. Προσθέστε τις αντίστοιχες βιβλιοθήκες MQTT/pip πακέτα και κώδικα στο έργο σας `soil-moisture-sensor` για να συνδεθείτε στο MQTT. Ονομάστε το client ID ως `soilmoisturesensor_client` με πρόθεμα το ID σας. + + > ⚠️ Μπορείτε να ανατρέξετε στις [οδηγίες για τη σύνδεση στο MQTT στο έργο 1, μάθημα 4 αν χρειαστεί](../../../1-getting-started/lessons/4-connect-internet/README.md#connect-your-iot-device-to-mqtt). + +1. Προσθέστε τον αντίστοιχο κώδικα συσκευής για την αποστολή τηλεμετρίας με τις ρυθμίσεις υγρασίας εδάφους. Για το μήνυμα τηλεμετρίας, ονομάστε την ιδιότητα `soil_moisture`. + + > ⚠️ Μπορείτε να ανατρέξετε στις [οδηγίες για την αποστολή τηλεμετρίας στο MQTT στο έργο 1, μάθημα 4 αν χρειαστεί](../../../1-getting-started/lessons/4-connect-internet/README.md#send-telemetry-from-your-iot-device). + +1. Δημιουργήστε κάποιον τοπικό κώδικα διακομιστή για να εγγραφείτε στην τηλεμετρία και να στείλετε μια εντολή για τον έλεγχο του ρελέ σε έναν φάκελο που ονομάζεται `soil-moisture-sensor-server`. Ονομάστε την ιδιότητα στο μήνυμα εντολής `relay_on` και ορίστε το client ID ως `soilmoisturesensor_server` με πρόθεμα το ID σας. Διατηρήστε την ίδια δομή με τον κώδικα διακομιστή που γράψατε για το έργο 1, μάθημα 4, καθώς θα προσθέσετε σε αυτόν τον κώδικα αργότερα σε αυτό το μάθημα. + + > ⚠️ Μπορείτε να ανατρέξετε στις [οδηγίες για την αποστολή τηλεμετρίας στο MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#write-the-server-code) και [την αποστολή εντολών μέσω MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#send-commands-to-the-mqtt-broker) στο έργο 1, μάθημα 4 αν χρειαστεί. + +1. Προσθέστε τον αντίστοιχο κώδικα συσκευής για τον έλεγχο του ρελέ από τις ληφθείσες εντολές, χρησιμοποιώντας την ιδιότητα `relay_on` από το μήνυμα. Στείλτε true για `relay_on` αν η `soil_moisture` είναι μεγαλύτερη από 450, διαφορετικά στείλτε false, όπως η λογική που προσθέσατε για τη συσκευή IoT νωρίτερα. + + > ⚠️ Μπορείτε να ανατρέξετε στις [οδηγίες για την απόκριση σε εντολές από το MQTT στο έργο 1, μάθημα 4 αν χρειαστεί](../../../1-getting-started/lessons/4-connect-internet/README.md#handle-commands-on-the-iot-device). + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-mqtt](../../../../../2-farm/lessons/3-automated-plant-watering/code-mqtt). + +Βεβαιωθείτε ότι ο κώδικας εκτελείται στη συσκευή και τον τοπικό διακομιστή σας και δοκιμά +💁 Αν ποτίσατε πολύ κοντά στον αισθητήρα, μπορεί να παρατηρήσατε ότι η ένδειξη έπεσε γρήγορα και μετά ανέβηκε ξανά - αυτό συμβαίνει επειδή το νερό κοντά στον αισθητήρα εξαπλώνεται στο υπόλοιπο έδαφος, μειώνοντας την υγρασία του εδάφους γύρω από τον αισθητήρα. +![Μια μέτρηση υγρασίας εδάφους 658 δεν αλλάζει κατά τη διάρκεια του ποτίσματος, πέφτει μόνο στο 320 μετά το πότισμα όταν το νερό έχει διαπεράσει το έδαφος](../../../../../translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.el.png) + +Στο παραπάνω διάγραμμα, μια μέτρηση υγρασίας εδάφους δείχνει 658. Το φυτό ποτίζεται, αλλά αυτή η μέτρηση δεν αλλάζει αμέσως, καθώς το νερό δεν έχει φτάσει ακόμα στον αισθητήρα. Το πότισμα μπορεί να ολοκληρωθεί πριν το νερό φτάσει στον αισθητήρα και η τιμή πέσει για να αντικατοπτρίσει το νέο επίπεδο υγρασίας. + +Αν γράφατε κώδικα για να ελέγξετε ένα σύστημα άρδευσης μέσω ενός ρελέ με βάση τα επίπεδα υγρασίας του εδάφους, θα έπρεπε να λάβετε υπόψη αυτή την καθυστέρηση και να ενσωματώσετε πιο έξυπνο χρονισμό στη συσκευή IoT σας. + +✅ Σκεφτείτε πώς θα μπορούσατε να το κάνετε αυτό. + +### Έλεγχος χρονισμού αισθητήρα και ενεργοποιητή + +Φανταστείτε ότι σας έχει ανατεθεί να κατασκευάσετε ένα σύστημα άρδευσης για μια φάρμα. Με βάση τον τύπο του εδάφους, το ιδανικό επίπεδο υγρασίας του εδάφους για τα φυτά που καλλιεργούνται έχει βρεθεί ότι αντιστοιχεί σε μια αναλογική τάση μέτρησης 400-450. + +Θα μπορούσατε να προγραμματίσετε τη συσκευή με τον ίδιο τρόπο όπως το νυχτερινό φως - κάθε φορά που ο αισθητήρας διαβάζει πάνω από 450, ενεργοποιήστε ένα ρελέ για να ενεργοποιήσετε μια αντλία. Το πρόβλημα είναι ότι το νερό χρειάζεται χρόνο για να φτάσει από την αντλία, μέσω του εδάφους, στον αισθητήρα. Ο αισθητήρας θα σταματήσει το νερό όταν ανιχνεύσει επίπεδο 450, αλλά το επίπεδο υγρασίας θα συνεχίσει να πέφτει καθώς το αντλημένο νερό συνεχίζει να διαπερνά το έδαφος. Το τελικό αποτέλεσμα είναι σπατάλη νερού και ο κίνδυνος ζημιάς στις ρίζες. + +✅ Θυμηθείτε - το υπερβολικό νερό μπορεί να είναι εξίσου κακό για τα φυτά όσο και η έλλειψη νερού, και σπαταλά έναν πολύτιμο πόρο. + +Η καλύτερη λύση είναι να κατανοήσετε ότι υπάρχει καθυστέρηση μεταξύ της ενεργοποίησης του ενεργοποιητή και της αλλαγής της ιδιότητας που διαβάζει ο αισθητήρας. Αυτό σημαίνει ότι όχι μόνο ο αισθητήρας πρέπει να περιμένει λίγο πριν μετρήσει ξανά την τιμή, αλλά και ο ενεργοποιητής πρέπει να απενεργοποιηθεί για λίγο πριν γίνει η επόμενη μέτρηση του αισθητήρα. + +Πόσο χρόνο πρέπει να είναι ενεργοποιημένο το ρελέ κάθε φορά; Είναι καλύτερο να είστε προσεκτικοί και να ενεργοποιείτε το ρελέ μόνο για λίγο, στη συνέχεια να περιμένετε να διαπεράσει το νερό και μετά να ξαναελέγξετε τα επίπεδα υγρασίας. Άλλωστε, μπορείτε πάντα να το ενεργοποιήσετε ξανά για να προσθέσετε περισσότερο νερό, δεν μπορείτε να αφαιρέσετε νερό από το έδαφος. + +> 💁 Αυτός ο τύπος ελέγχου χρονισμού είναι πολύ συγκεκριμένος για τη συσκευή IoT που κατασκευάζετε, την ιδιότητα που μετράτε και τους αισθητήρες και ενεργοποιητές που χρησιμοποιούνται. + +![Ένα φυτό φράουλας συνδεδεμένο με νερό μέσω αντλίας, με την αντλία συνδεδεμένη σε ρελέ. Το ρελέ και ένας αισθητήρας υγρασίας εδάφους στο φυτό είναι συνδεδεμένα σε ένα Raspberry Pi](../../../../../translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.el.png) + +Για παράδειγμα, έχω ένα φυτό φράουλας με έναν αισθητήρα υγρασίας εδάφους και μια αντλία που ελέγχεται από ένα ρελέ. Έχω παρατηρήσει ότι όταν προσθέτω νερό χρειάζονται περίπου 20 δευτερόλεπτα για να σταθεροποιηθεί η μέτρηση υγρασίας του εδάφους. Αυτό σημαίνει ότι πρέπει να απενεργοποιήσω το ρελέ και να περιμένω 20 δευτερόλεπτα πριν ελέγξω τα επίπεδα υγρασίας. Προτιμώ να έχω λιγότερο νερό παρά υπερβολικό - μπορώ πάντα να ενεργοποιήσω ξανά την αντλία, αλλά δεν μπορώ να αφαιρέσω νερό από το φυτό. + +![Βήμα 1, μέτρηση. Βήμα 2, προσθήκη νερού. Βήμα 3, αναμονή για να διαπεράσει το νερό το έδαφος. Βήμα 4, επαναληπτική μέτρηση](../../../../../translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.el.png) + +Αυτό σημαίνει ότι η καλύτερη διαδικασία θα ήταν ένας κύκλος ποτίσματος που μοιάζει με: + +* Ενεργοποίηση της αντλίας για 5 δευτερόλεπτα +* Αναμονή 20 δευτερολέπτων +* Έλεγχος της υγρασίας του εδάφους +* Αν το επίπεδο είναι ακόμα πάνω από το απαιτούμενο, επαναλάβετε τα παραπάνω βήματα + +Τα 5 δευτερόλεπτα μπορεί να είναι υπερβολικά για την αντλία, ειδικά αν τα επίπεδα υγρασίας είναι μόνο ελαφρώς πάνω από το απαιτούμενο επίπεδο. Ο καλύτερος τρόπος για να γνωρίζετε τι χρονισμό να χρησιμοποιήσετε είναι να το δοκιμάσετε και στη συνέχεια να προσαρμόσετε όταν έχετε δεδομένα από τον αισθητήρα, με έναν συνεχή κύκλο ανατροφοδότησης. Αυτό μπορεί να οδηγήσει ακόμη και σε πιο λεπτομερή χρονισμό, όπως η ενεργοποίηση της αντλίας για 1 δευτερόλεπτο για κάθε 100 πάνω από το απαιτούμενο επίπεδο υγρασίας του εδάφους, αντί για σταθερά 5 δευτερόλεπτα. + +✅ Κάντε μια έρευνα: Υπάρχουν άλλες παραμέτρους χρονισμού που πρέπει να ληφθούν υπόψη; Μπορεί το φυτό να ποτίζεται οποιαδήποτε στιγμή που η υγρασία του εδάφους είναι πολύ χαμηλή ή υπάρχουν συγκεκριμένες ώρες της ημέρας που είναι καλές και κακές για το πότισμα των φυτών; + +> 💁 Οι προβλέψεις καιρού μπορούν επίσης να ληφθούν υπόψη κατά τον έλεγχο αυτοματοποιημένων συστημάτων ποτίσματος για εξωτερική καλλιέργεια. Αν αναμένεται βροχή, τότε το πότισμα μπορεί να αναβληθεί μέχρι να τελειώσει η βροχή. Σε εκείνο το σημείο το έδαφος μπορεί να είναι αρκετά υγρό ώστε να μην χρειάζεται πότισμα, πολύ πιο αποτελεσματικό από το να σπαταλάτε νερό ποτίζοντας λίγο πριν τη βροχή. + +## Προσθέστε χρονισμό στον διακομιστή ελέγχου φυτών σας + +Ο κώδικας του διακομιστή μπορεί να τροποποιηθεί για να προσθέσει έλεγχο γύρω από τον χρονισμό του κύκλου ποτίσματος και την αναμονή για να αλλάξουν τα επίπεδα υγρασίας του εδάφους. Η λογική του διακομιστή για τον έλεγχο του χρονισμού του ρελέ είναι: + +1. Λήψη μηνύματος τηλεμετρίας +1. Έλεγχος του επιπέδου υγρασίας του εδάφους +1. Αν είναι εντάξει, μην κάνετε τίποτα. Αν η μέτρηση είναι πολύ υψηλή (που σημαίνει ότι η υγρασία του εδάφους είναι πολύ χαμηλή), τότε: + 1. Στείλτε εντολή για ενεργοποίηση του ρελέ + 1. Περιμένετε 5 δευτερόλεπτα + 1. Στείλτε εντολή για απενεργοποίηση του ρελέ + 1. Περιμένετε 20 δευτερόλεπτα για να σταθεροποιηθούν τα επίπεδα υγρασίας του εδάφους + +Ο κύκλος ποτίσματος, η διαδικασία από τη λήψη του μηνύματος τηλεμετρίας μέχρι την ετοιμότητα για επεξεργασία των επιπέδων υγρασίας του εδάφους ξανά, διαρκεί περίπου 25 δευτερόλεπτα. Στέλνουμε επίπεδα υγρασίας του εδάφους κάθε 10 δευτερόλεπτα, οπότε υπάρχει επικάλυψη όπου λαμβάνεται ένα μήνυμα ενώ ο διακομιστής περιμένει να σταθεροποιηθούν τα επίπεδα υγρασίας του εδάφους, κάτι που θα μπορούσε να ξεκινήσει έναν άλλο κύκλο ποτίσματος. + +Υπάρχουν δύο επιλογές για να αντιμετωπιστεί αυτό: + +* Αλλάξτε τον κώδικα της συσκευής IoT ώστε να στέλνει τηλεμετρία μόνο κάθε λεπτό, έτσι ώστε ο κύκλος ποτίσματος να ολοκληρωθεί πριν σταλεί το επόμενο μήνυμα +* Αποσυνδεθείτε από την τηλεμετρία κατά τη διάρκεια του κύκλου ποτίσματος + +Η πρώτη επιλογή δεν είναι πάντα καλή λύση για μεγάλες φάρμες. Ο αγρότης μπορεί να θέλει να καταγράψει τα επίπεδα υγρασίας του εδάφους καθώς το έδαφος ποτίζεται για μετέπειτα ανάλυση, για παράδειγμα για να γνωρίζει τη ροή του νερού σε διαφορετικές περιοχές της φάρμας ώστε να καθοδηγήσει πιο στοχευμένο πότισμα. Η δεύτερη επιλογή είναι καλύτερη - ο κώδικας απλώς αγνοεί την τηλεμετρία όταν δεν μπορεί να τη χρησιμοποιήσει, αλλά η τηλεμετρία εξακολουθεί να υπάρχει για άλλες υπηρεσίες που μπορεί να την εγγραφούν. + +> 💁 Τα δεδομένα IoT δεν αποστέλλονται μόνο από μία συσκευή σε μία υπηρεσία, αντίθετα πολλές συσκευές μπορούν να στέλνουν δεδομένα σε έναν μεσολαβητή και πολλές υπηρεσίες μπορούν να ακούν τα δεδομένα από τον μεσολαβητή. Για παράδειγμα, μία υπηρεσία θα μπορούσε να ακούει δεδομένα υγρασίας εδάφους και να τα αποθηκεύει σε μια βάση δεδομένων για ανάλυση αργότερα. Μια άλλη υπηρεσία μπορεί επίσης να ακούει την ίδια τηλεμετρία για να ελέγχει ένα σύστημα άρδευσης. + +### Εργασία - προσθέστε χρονισμό στον διακομιστή ελέγχου φυτών σας + +Ενημερώστε τον κώδικα του διακομιστή σας ώστε να λειτουργεί το ρελέ για 5 δευτερόλεπτα και στη συνέχεια να περιμένει 20 δευτερόλεπτα. + +1. Ανοίξτε τον φάκελο `soil-moisture-sensor-server` στο VS Code αν δεν είναι ήδη ανοιχτός. Βεβαιωθείτε ότι το εικονικό περιβάλλον είναι ενεργοποιημένο. + +1. Ανοίξτε το αρχείο `app.py` + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py` κάτω από τις υπάρχουσες εισαγωγές: + + ```python + import threading + ``` + + Αυτή η δήλωση εισάγει το `threading` από τις βιβλιοθήκες της Python, το οποίο επιτρέπει στην Python να εκτελεί άλλο κώδικα ενώ περιμένει. + +1. Προσθέστε τον παρακάτω κώδικα πριν από τη συνάρτηση `handle_telemetry` που χειρίζεται τα μηνύματα τηλεμετρίας που λαμβάνονται από τον κώδικα του διακομιστή: + + ```python + water_time = 5 + wait_time = 20 + ``` + + Αυτό ορίζει πόσο χρόνο θα λειτουργεί το ρελέ (`water_time`) και πόσο χρόνο θα περιμένει μετά για να ελέγξει την υγρασία του εδάφους (`wait_time`). + +1. Κάτω από αυτόν τον κώδικα, προσθέστε τον παρακάτω: + + ```python + def send_relay_command(client, state): + command = { 'relay_on' : state } + print("Sending message:", command) + client.publish(server_command_topic, json.dumps(command)) + ``` + + Αυτός ο κώδικας ορίζει μια συνάρτηση που ονομάζεται `send_relay_command` που στέλνει μια εντολή μέσω MQTT για να ελέγξει το ρελέ. Η τηλεμετρία δημιουργείται ως λεξικό και στη συνέχεια μετατρέπεται σε συμβολοσειρά JSON. Η τιμή που περνάει στο `state` καθορίζει αν το ρελέ πρέπει να είναι ενεργοποιημένο ή απενεργοποιημένο. + +1. Μετά τη συνάρτηση `send_relay_code`, προσθέστε τον παρακάτω κώδικα: + + ```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) + ``` + + Αυτό ορίζει μια συνάρτηση για τον έλεγχο του ρελέ με βάση τον απαιτούμενο χρονισμό. Ξεκινά με την αποσύνδεση από την τηλεμετρία ώστε τα μηνύματα υγρασίας εδάφους να μην επεξεργάζονται ενώ γίνεται το πότισμα. Στη συνέχεια στέλνει μια εντολή για να ενεργοποιήσει το ρελέ. Μετά περιμένει για το `water_time` πριν στείλει μια εντολή για να απενεργοποιήσει το ρελέ. Τέλος, περιμένει για να σταθεροποιηθούν τα επίπεδα υγρασίας του εδάφους για `wait_time` δευτερόλεπτα. Στη συνέχεια επανασυνδέεται στην τηλεμετρία. + +1. Αλλάξτε τη συνάρτηση `handle_telemetry` στην εξής: + + ```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() + ``` + + Αυτός ο κώδικας ελέγχει το επίπεδο υγρασίας του εδάφους. Αν είναι μεγαλύτερο από 450, το έδαφος χρειάζεται πότισμα, οπότε καλεί τη συνάρτηση `control_relay`. Αυτή η συνάρτηση εκτελείται σε ξεχωριστό νήμα, που τρέχει στο παρασκήνιο. + +1. Βεβαιωθείτε ότι η συσκευή IoT σας λειτουργεί και στη συνέχεια εκτελέστε αυτόν τον κώδικα. Αλλάξτε τα επίπεδα υγρασίας του εδάφους και παρατηρήστε τι συμβαίνει στο ρελέ - θα πρέπει να ενεργοποιείται για 5 δευτερόλεπτα και στη συνέχεια να παραμένει απενεργοποιημένο για τουλάχιστον 20 δευτερόλεπτα, ενεργοποιούμενο μόνο αν τα επίπεδα υγρασίας του εδάφους δεν είναι επαρκή. + + ```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} + ``` + + Ένας καλός τρόπος για να δοκιμάσετε αυτό σε ένα προσομοιωμένο σύστημα άρδευσης είναι να χρησιμοποιήσετε ξηρό έδαφος και στη συνέχεια να ρίξετε νερό χειροκίνητα ενώ το ρελέ είναι ενεργοποιημένο, σταματώντας να ρίχνετε όταν το ρελέ απενεργοποιείται. + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-timing](../../../../../2-farm/lessons/3-automated-plant-watering/code-timing). + +> 💁 Αν θέλετε να χρησιμοποιήσετε μια αντλία για να κατασκευάσετε ένα πραγματικό σύστημα άρδευσης, τότε μπορείτε να χρησιμοποιήσετε μια [6V αντλία νερού](https://www.seeedstudio.com/6V-Mini-Water-Pump-p-1945.html) με μια [τροφοδοσία USB](https://www.adafruit.com/product/3628). Βεβαιωθείτε ότι η τροφοδοσία προς ή από την αντλία είναι συνδεδεμένη μέσω του ρελέ. + +--- + +## 🚀 Πρόκληση + +Μπορείτε να σκεφτείτε άλλες συσκευές IoT ή άλλες ηλεκτρικές συσκευές που έχουν παρόμοιο πρόβλημα όπου χρειάζεται χρόνος για να φτάσουν τα αποτελέσματα του ενεργοποιητή στον αισθητήρα; Πιθανότατα έχετε μερικές στο σπίτι ή στο σχολείο σας. + +* Ποιες ιδιότητες μετρούν; +* Πόσο χρόνο χρειάζεται για να αλλάξει η ιδιότητα μετά τη χρήση του ενεργοποιητή; +* Είναι εντάξει η ιδιότητα να αλλάξει πέρα από την απαιτούμενη τιμή; +* Πώς μπορεί να επιστραφεί στην απαιτούμενη τιμή αν χρειαστεί; + +## Κουίζ μετά τη διάλεξη + +[Κουίζ μετά τη διάλεξη](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/14) + +## Ανασκόπηση & Αυτομελέτη + +* Διαβάστε περισσότερα για τα ρελέ, συμπεριλαμβανομένης της ιστορικής τους χρήσης σε τηλεφωνικά κέντρα, στη [σελίδα Wikipedia για τα ρελέ](https://wikipedia.org/wiki/Relay). + +## Εργασία + +[Κατασκευάστε έναν πιο αποδοτικό κύκλο ποτίσματος](assignment.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/3-automated-plant-watering/assignment.md b/translations/el/2-farm/lessons/3-automated-plant-watering/assignment.md new file mode 100644 index 00000000..7fab7a46 --- /dev/null +++ b/translations/el/2-farm/lessons/3-automated-plant-watering/assignment.md @@ -0,0 +1,54 @@ + +# Δημιουργία ενός πιο αποδοτικού κύκλου ποτίσματος + +## Οδηγίες + +Αυτό το μάθημα κάλυψε τον τρόπο ελέγχου ενός ρελέ μέσω δεδομένων αισθητήρα, και αυτό το ρελέ θα μπορούσε με τη σειρά του να ελέγξει μια αντλία για ένα σύστημα άρδευσης. Για ένα συγκεκριμένο σώμα εδάφους, η λειτουργία μιας αντλίας για ένα σταθερό χρονικό διάστημα θα πρέπει πάντα να έχει την ίδια επίδραση στην υγρασία του εδάφους. Αυτό σημαίνει ότι μπορείτε να αποκτήσετε μια ιδέα για το πόσα δευτερόλεπτα άρδευσης αντιστοιχούν σε μια συγκεκριμένη πτώση της μέτρησης υγρασίας του εδάφους. Χρησιμοποιώντας αυτά τα δεδομένα, μπορείτε να δημιουργήσετε ένα πιο ελεγχόμενο σύστημα άρδευσης. + +Για αυτήν την εργασία, θα υπολογίσετε πόσο χρόνο πρέπει να λειτουργεί η αντλία για μια συγκεκριμένη αύξηση της υγρασίας του εδάφους. + +> ⚠️ Εάν χρησιμοποιείτε εικονικό IoT υλικό, μπορείτε να ακολουθήσετε αυτήν τη διαδικασία, αλλά να προσομοιώσετε τα αποτελέσματα αυξάνοντας τη μέτρηση υγρασίας του εδάφους χειροκίνητα κατά ένα σταθερό ποσό ανά δευτερόλεπτο που το ρελέ είναι ενεργοποιημένο. + +1. Ξεκινήστε με ξηρό έδαφος. Μετρήστε την υγρασία του εδάφους. + +1. Προσθέστε μια σταθερή ποσότητα νερού, είτε λειτουργώντας την αντλία για 1 δευτερόλεπτο είτε ρίχνοντας μια σταθερή ποσότητα νερού. + + > Η αντλία θα πρέπει πάντα να λειτουργεί με σταθερό ρυθμό, ώστε κάθε δευτερόλεπτο που λειτουργεί να παρέχει την ίδια ποσότητα νερού. + +1. Περιμένετε μέχρι να σταθεροποιηθεί το επίπεδο υγρασίας του εδάφους και πάρτε μια μέτρηση. + +1. Επαναλάβετε αυτή τη διαδικασία πολλές φορές και δημιουργήστε έναν πίνακα με τα αποτελέσματα. Ένα παράδειγμα αυτού του πίνακα δίνεται παρακάτω. + + | Συνολικός Χρόνος Αντλίας | Υγρασία Εδάφους | Μείωση | + | --- | --: | -: | + | Ξηρό | 643 | 0 | + | 1δ | 621 | 22 | + | 2δ | 601 | 20 | + | 3δ | 579 | 22 | + | 4δ | 560 | 19 | + | 5δ | 539 | 21 | + | 6δ | 521 | 18 | + +1. Υπολογίστε τη μέση αύξηση της υγρασίας του εδάφους ανά δευτερόλεπτο νερού. Στο παραπάνω παράδειγμα, κάθε δευτερόλεπτο νερού μειώνει τη μέτρηση κατά μέσο όρο 20.3. + +1. Χρησιμοποιήστε αυτά τα δεδομένα για να βελτιώσετε την αποδοτικότητα του κώδικα του διακομιστή σας, λειτουργώντας την αντλία για τον απαιτούμενο χρόνο ώστε να φτάσει η υγρασία του εδάφους στο επιθυμητό επίπεδο. + +## Κριτήρια Αξιολόγησης + +| Κριτήριο | Εξαιρετικό | Επαρκές | Χρειάζεται Βελτίωση | +| -------- | --------- | -------- | ----------------- | +| Καταγραφή δεδομένων υγρασίας εδάφους | Μπορεί να καταγράψει πολλαπλές μετρήσεις μετά την προσθήκη σταθερών ποσοτήτων νερού | Μπορεί να καταγράψει κάποιες μετρήσεις με σταθερές ποσότητες νερού | Μπορεί να καταγράψει μόνο μία ή δύο μετρήσεις ή δεν μπορεί να χρησιμοποιήσει σταθερές ποσότητες νερού | +| Ρύθμιση του κώδικα του διακομιστή | Μπορεί να υπολογίσει τη μέση μείωση της μέτρησης υγρασίας του εδάφους και να ενημερώσει τον κώδικα του διακομιστή για να χρησιμοποιήσει αυτήν την τιμή | Μπορεί να υπολογίσει τη μέση μείωση, αλλά δεν μπορεί να ενημερώσει τον κώδικα του διακομιστή, ή δεν μπορεί να υπολογίσει σωστά τη μέση μείωση, αλλά χρησιμοποιεί αυτήν την τιμή για να ενημερώσει σωστά τον κώδικα του διακομιστή | Δεν μπορεί να υπολογίσει τη μέση μείωση ή να ενημερώσει τον κώδικα του διακομιστή | + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/3-automated-plant-watering/pi-relay.md b/translations/el/2-farm/lessons/3-automated-plant-watering/pi-relay.md new file mode 100644 index 00000000..0848a1d5 --- /dev/null +++ b/translations/el/2-farm/lessons/3-automated-plant-watering/pi-relay.md @@ -0,0 +1,123 @@ + +# Έλεγχος ενός ρελέ - Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε ένα ρελέ στο Raspberry Pi σας, εκτός από τον αισθητήρα υγρασίας εδάφους, και θα το ελέγξετε με βάση το επίπεδο υγρασίας του εδάφους. + +## Υλικό + +Το Raspberry Pi χρειάζεται ένα ρελέ. + +Το ρελέ που θα χρησιμοποιήσετε είναι ένα [Grove relay](https://www.seeedstudio.com/Grove-Relay.html), ένα ρελέ που είναι κανονικά ανοιχτό (δηλαδή το κύκλωμα εξόδου είναι ανοιχτό ή αποσυνδεδεμένο όταν δεν υπάρχει σήμα που αποστέλλεται στο ρελέ) και μπορεί να χειριστεί κυκλώματα εξόδου έως 250V και 10A. + +Πρόκειται για έναν ψηφιακό ενεργοποιητή, οπότε συνδέεται σε μια ψηφιακή ακίδα στο Grove Base Hat. + +### Σύνδεση του ρελέ + +Το ρελέ Grove μπορεί να συνδεθεί στο Raspberry Pi. + +#### Εργασία + +Συνδέστε το ρελέ. + +![Ένα ρελέ Grove](../../../../../translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.el.png) + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του ρελέ. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. + +1. Με το Raspberry Pi απενεργοποιημένο, συνδέστε το άλλο άκρο του καλωδίου Grove στην ψηφιακή υποδοχή με την ένδειξη **D5** στο Grove Base Hat που είναι συνδεδεμένο στο Pi. Αυτή η υποδοχή είναι η δεύτερη από τα αριστερά, στη σειρά των υποδοχών δίπλα στις ακίδες GPIO. Αφήστε τον αισθητήρα υγρασίας εδάφους συνδεδεμένο στην υποδοχή **A0**. + +![Το ρελέ Grove συνδεδεμένο στην υποδοχή D5 και ο αισθητήρας υγρασίας εδάφους συνδεδεμένος στην υποδοχή A0](../../../../../translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.el.png) + +1. Εισάγετε τον αισθητήρα υγρασίας εδάφους στο έδαφος, αν δεν το έχετε ήδη κάνει από το προηγούμενο μάθημα. + +## Προγραμματισμός του ρελέ + +Το Raspberry Pi μπορεί τώρα να προγραμματιστεί για να χρησιμοποιεί το συνδεδεμένο ρελέ. + +### Εργασία + +Προγραμματίστε τη συσκευή. + +1. Ενεργοποιήστε το Pi και περιμένετε να εκκινήσει. + +1. Ανοίξτε το έργο `soil-moisture-sensor` από το προηγούμενο μάθημα στο VS Code, αν δεν είναι ήδη ανοιχτό. Θα προσθέσετε σε αυτό το έργο. + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py` κάτω από τις υπάρχουσες εισαγωγές: + + ```python + from grove.grove_relay import GroveRelay + ``` + + Αυτή η δήλωση εισάγει το `GroveRelay` από τις βιβλιοθήκες Python του Grove για αλληλεπίδραση με το ρελέ Grove. + +1. Προσθέστε τον παρακάτω κώδικα κάτω από τη δήλωση της κλάσης `ADC` για να δημιουργήσετε μια παρουσία του `GroveRelay`: + + ```python + relay = GroveRelay(5) + ``` + + Αυτό δημιουργεί ένα ρελέ χρησιμοποιώντας την ακίδα **D5**, την ψηφιακή ακίδα στην οποία συνδέσατε το ρελέ. + +1. Για να δοκιμάσετε ότι το ρελέ λειτουργεί, προσθέστε τα εξής στο βρόχο `while True:`: + + ```python + relay.on() + time.sleep(.5) + relay.off() + ``` + + Ο κώδικας ενεργοποιεί το ρελέ, περιμένει 0,5 δευτερόλεπτα και στη συνέχεια απενεργοποιεί το ρελέ. + +1. Εκτελέστε την εφαρμογή Python. Το ρελέ θα ενεργοποιείται και απενεργοποιείται κάθε 10 δευτερόλεπτα, με καθυστέρηση μισού δευτερολέπτου μεταξύ της ενεργοποίησης και της απενεργοποίησης. Θα ακούσετε το ρελέ να κάνει κλικ όταν ενεργοποιείται και να κάνει κλικ όταν απενεργοποιείται. Ένα LED στην πλακέτα Grove θα ανάψει όταν το ρελέ είναι ενεργοποιημένο και θα σβήσει όταν είναι απενεργοποιημένο. + + ![Το ρελέ ενεργοποιείται και απενεργοποιείται](../../../../../images/relay-turn-on-off.gif) + +## Έλεγχος του ρελέ από την υγρασία του εδάφους + +Τώρα που το ρελέ λειτουργεί, μπορεί να ελεγχθεί σε απόκριση στις μετρήσεις υγρασίας του εδάφους. + +### Εργασία + +Ελέγξτε το ρελέ. + +1. Διαγράψτε τις 3 γραμμές κώδικα που προσθέσατε για να δοκιμάσετε το ρελέ. Αντικαταστήστε τις με τον παρακάτω κώδικα: + + ```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() + ``` + + Αυτός ο κώδικας ελέγχει το επίπεδο υγρασίας του εδάφους από τον αισθητήρα υγρασίας εδάφους. Αν είναι πάνω από 450, ενεργοποιεί το ρελέ και το απενεργοποιεί όταν πέσει κάτω από 450. + + > 💁 Θυμηθείτε ότι ο χωρητικός αισθητήρας υγρασίας εδάφους διαβάζει: όσο χαμηλότερο είναι το επίπεδο υγρασίας του εδάφους, τόσο περισσότερη υγρασία υπάρχει στο έδαφος και αντίστροφα. + +1. Εκτελέστε την εφαρμογή Python. Θα δείτε το ρελέ να ενεργοποιείται ή να απενεργοποιείται ανάλογα με το επίπεδο υγρασίας του εδάφους. Δοκιμάστε σε ξηρό έδαφος και στη συνέχεια προσθέστε νερό. + + ```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. + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-relay/pi](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/pi). + +😀 Το πρόγραμμα ελέγχου του ρελέ από τον αισθητήρα υγρασίας εδάφους ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md b/translations/el/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md new file mode 100644 index 00000000..c7321843 --- /dev/null +++ b/translations/el/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md @@ -0,0 +1,127 @@ + +# Έλεγχος ενός ρελέ - Εικονικό IoT Υλικό + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε ένα ρελέ στη εικονική IoT συσκευή σας, εκτός από τον αισθητήρα υγρασίας εδάφους, και θα το ελέγξετε με βάση το επίπεδο υγρασίας του εδάφους. + +## Εικονικό Υλικό + +Η εικονική IoT συσκευή θα χρησιμοποιήσει ένα προσομοιωμένο ρελέ Grove. Αυτό διατηρεί το εργαστήριο ίδιο με τη χρήση ενός Raspberry Pi με ένα φυσικό ρελέ Grove. + +Σε μια φυσική IoT συσκευή, το ρελέ θα ήταν ένα ρελέ κανονικά ανοιχτό (που σημαίνει ότι το κύκλωμα εξόδου είναι ανοιχτό ή αποσυνδεδεμένο όταν δεν υπάρχει σήμα που αποστέλλεται στο ρελέ). Ένα τέτοιο ρελέ μπορεί να χειριστεί κυκλώματα εξόδου έως 250V και 10A. + +### Προσθήκη του ρελέ στο CounterFit + +Για να χρησιμοποιήσετε ένα εικονικό ρελέ, πρέπει να το προσθέσετε στην εφαρμογή CounterFit. + +#### Εργασία + +Προσθέστε το ρελέ στην εφαρμογή CounterFit. + +1. Ανοίξτε το έργο `soil-moisture-sensor` από το προηγούμενο μάθημα στο VS Code αν δεν είναι ήδη ανοιχτό. Θα προσθέσετε σε αυτό το έργο. + +1. Βεβαιωθείτε ότι η διαδικτυακή εφαρμογή CounterFit είναι ενεργοποιημένη. + +1. Δημιουργήστε ένα ρελέ: + + 1. Στο πλαίσιο *Create actuator* στον πίνακα *Actuators*, ανοίξτε το αναπτυσσόμενο μενού *Actuator type* και επιλέξτε *Relay*. + + 1. Ορίστε το *Pin* σε *5*. + + 1. Επιλέξτε το κουμπί **Add** για να δημιουργήσετε το ρελέ στο Pin 5. + + ![Οι ρυθμίσεις του ρελέ](../../../../../translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.el.png) + + Το ρελέ θα δημιουργηθεί και θα εμφανιστεί στη λίστα των ενεργοποιητών. + + ![Το ρελέ που δημιουργήθηκε](../../../../../translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.el.png) + +## Προγραμματισμός του ρελέ + +Η εφαρμογή του αισθητήρα υγρασίας εδάφους μπορεί τώρα να προγραμματιστεί για να χρησιμοποιεί το εικονικό ρελέ. + +### Εργασία + +Προγραμματίστε την εικονική συσκευή. + +1. Ανοίξτε το έργο `soil-moisture-sensor` από το προηγούμενο μάθημα στο VS Code αν δεν είναι ήδη ανοιχτό. Θα προσθέσετε σε αυτό το έργο. + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `app.py` κάτω από τις υπάρχουσες εισαγωγές: + + ```python + from counterfit_shims_grove.grove_relay import GroveRelay + ``` + + Αυτή η δήλωση εισάγει το `GroveRelay` από τις βιβλιοθήκες Python shim του Grove για να αλληλεπιδράσει με το εικονικό ρελέ Grove. + +1. Προσθέστε τον παρακάτω κώδικα κάτω από τη δήλωση της κλάσης `ADC` για να δημιουργήσετε μια παρουσία του `GroveRelay`: + + ```python + relay = GroveRelay(5) + ``` + + Αυτό δημιουργεί ένα ρελέ χρησιμοποιώντας το pin **5**, το pin στο οποίο συνδέσατε το ρελέ. + +1. Για να δοκιμάσετε ότι το ρελέ λειτουργεί, προσθέστε τα παρακάτω στον βρόχο `while True:`: + + ```python + relay.on() + time.sleep(.5) + relay.off() + ``` + + Ο κώδικας ενεργοποιεί το ρελέ, περιμένει 0.5 δευτερόλεπτα και στη συνέχεια απενεργοποιεί το ρελέ. + +1. Εκτελέστε την εφαρμογή Python. Το ρελέ θα ενεργοποιείται και απενεργοποιείται κάθε 10 δευτερόλεπτα, με καθυστέρηση μισού δευτερολέπτου μεταξύ της ενεργοποίησης και απενεργοποίησης. Θα δείτε το εικονικό ρελέ στην εφαρμογή CounterFit να κλείνει και να ανοίγει καθώς το ρελέ ενεργοποιείται και απενεργοποιείται. + + ![Το εικονικό ρελέ ενεργοποιείται και απενεργοποιείται](../../../../../images/virtual-relay-turn-on-off.gif) + +## Έλεγχος του ρελέ από την υγρασία του εδάφους + +Τώρα που το ρελέ λειτουργεί, μπορεί να ελεγχθεί σε απόκριση στις μετρήσεις υγρασίας του εδάφους. + +### Εργασία + +Ελέγξτε το ρελέ. + +1. Διαγράψτε τις 3 γραμμές κώδικα που προσθέσατε για να δοκιμάσετε το ρελέ. Αντικαταστήστε τις με τον παρακάτω κώδικα στη θέση τους: + + ```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() + ``` + + Αυτός ο κώδικας ελέγχει το επίπεδο υγρασίας του εδάφους από τον αισθητήρα υγρασίας εδάφους. Αν είναι πάνω από 450, ενεργοποιεί το ρελέ, απενεργοποιώντας το αν πέσει κάτω από 450. + + > 💁 Θυμηθείτε ότι ο χωρητικός αισθητήρας υγρασίας εδάφους διαβάζει: όσο χαμηλότερο είναι το επίπεδο υγρασίας του εδάφους, τόσο περισσότερη υγρασία υπάρχει στο έδαφος και αντίστροφα. + +1. Εκτελέστε την εφαρμογή Python. Θα δείτε το ρελέ να ενεργοποιείται ή να απενεργοποιείται ανάλογα με τα επίπεδα υγρασίας του εδάφους. Αλλάξτε τις ρυθμίσεις *Value* ή *Random* για τον αισθητήρα υγρασίας εδάφους για να δείτε την αλλαγή της τιμής. + + ```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. + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-relay/virtual-device](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/virtual-device). + +😀 Το πρόγραμμα ελέγχου του εικονικού αισθητήρα υγρασίας εδάφους με ρελέ ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md b/translations/el/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md new file mode 100644 index 00000000..c5dab4ae --- /dev/null +++ b/translations/el/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md @@ -0,0 +1,121 @@ + +# Έλεγχος ενός ρελέ - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε ένα ρελέ στο Wio Terminal σας, εκτός από τον αισθητήρα υγρασίας εδάφους, και θα το ελέγχετε με βάση το επίπεδο υγρασίας του εδάφους. + +## Υλικό + +Το Wio Terminal χρειάζεται ένα ρελέ. + +Το ρελέ που θα χρησιμοποιήσετε είναι ένα [Grove relay](https://www.seeedstudio.com/Grove-Relay.html), ένα κανονικά ανοιχτό ρελέ (που σημαίνει ότι το κύκλωμα εξόδου είναι ανοιχτό ή αποσυνδεδεμένο όταν δεν αποστέλλεται σήμα στο ρελέ) που μπορεί να χειριστεί κυκλώματα εξόδου έως 250V και 10A. + +Πρόκειται για έναν ψηφιακό ενεργοποιητή, οπότε συνδέεται σε ψηφιακές ακίδες στο Wio Terminal. Η συνδυασμένη θύρα αναλογικού/ψηφιακού είναι ήδη σε χρήση με τον αισθητήρα υγρασίας εδάφους, οπότε αυτό συνδέεται στην άλλη θύρα, η οποία είναι μια συνδυασμένη θύρα I²C και ψηφιακή. + +### Σύνδεση του ρελέ + +Το Grove relay μπορεί να συνδεθεί στη ψηφιακή θύρα του Wio Terminal. + +#### Εργασία + +Συνδέστε το ρελέ. + +![Ένα Grove relay](../../../../../translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.el.png) + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του ρελέ. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. + +1. Με το Wio Terminal αποσυνδεδεμένο από τον υπολογιστή σας ή άλλη πηγή τροφοδοσίας, συνδέστε το άλλο άκρο του καλωδίου Grove στην αριστερή υποδοχή Grove του Wio Terminal, όπως κοιτάτε την οθόνη. Αφήστε τον αισθητήρα υγρασίας εδάφους συνδεδεμένο στη δεξιά υποδοχή. + +![Το Grove relay συνδεδεμένο στην αριστερή υποδοχή και ο αισθητήρας υγρασίας εδάφους συνδεδεμένος στη δεξιά υποδοχή](../../../../../translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.el.png) + +1. Τοποθετήστε τον αισθητήρα υγρασίας εδάφους στο έδαφος, αν δεν είναι ήδη από το προηγούμενο μάθημα. + +## Προγραμματισμός του ρελέ + +Το Wio Terminal μπορεί τώρα να προγραμματιστεί για να χρησιμοποιεί το συνδεδεμένο ρελέ. + +### Εργασία + +Προγραμματίστε τη συσκευή. + +1. Ανοίξτε το έργο `soil-moisture-sensor` από το προηγούμενο μάθημα στο VS Code, αν δεν είναι ήδη ανοιχτό. Θα προσθέσετε σε αυτό το έργο. + +2. Δεν υπάρχει βιβλιοθήκη για αυτόν τον ενεργοποιητή - είναι ένας ψηφιακός ενεργοποιητής που ελέγχεται από ένα υψηλό ή χαμηλό σήμα. Για να τον ενεργοποιήσετε, στέλνετε ένα υψηλό σήμα στην ακίδα (3.3V), για να τον απενεργοποιήσετε στέλνετε ένα χαμηλό σήμα (0V). Μπορείτε να το κάνετε αυτό χρησιμοποιώντας τη λειτουργία [`digitalWrite`](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/) της Arduino. Ξεκινήστε προσθέτοντας το παρακάτω στο τέλος της συνάρτησης `setup` για να ρυθμίσετε τη συνδυασμένη θύρα I²C/ψηφιακή ως ακίδα εξόδου για να στείλετε τάση στο ρελέ: + + ```cpp + pinMode(PIN_WIRE_SCL, OUTPUT); + ``` + + Το `PIN_WIRE_SCL` είναι ο αριθμός της θύρας για τη συνδυασμένη θύρα I²C/ψηφιακή. + +1. Για να δοκιμάσετε αν το ρελέ λειτουργεί, προσθέστε το παρακάτω στη συνάρτηση `loop`, κάτω από την τελική `delay`: + + ```cpp + digitalWrite(PIN_WIRE_SCL, HIGH); + delay(500); + digitalWrite(PIN_WIRE_SCL, LOW); + ``` + + Ο κώδικας στέλνει ένα υψηλό σήμα στην ακίδα που είναι συνδεδεμένο το ρελέ για να το ενεργοποιήσει, περιμένει 500ms (μισό δευτερόλεπτο), και στη συνέχεια στέλνει ένα χαμηλό σήμα για να το απενεργοποιήσει. + +1. Δημιουργήστε και ανεβάστε τον κώδικα στο Wio Terminal. + +1. Μόλις ανέβει, το ρελέ θα ενεργοποιείται και θα απενεργοποιείται κάθε 10 δευτερόλεπτα, με μισό δευτερόλεπτο καθυστέρηση μεταξύ ενεργοποίησης και απενεργοποίησης. Θα ακούσετε το ρελέ να κάνει κλικ όταν ενεργοποιείται και όταν απενεργοποιείται. Ένα LED στην πλακέτα Grove θα ανάβει όταν το ρελέ είναι ενεργοποιημένο και θα σβήνει όταν είναι απενεργοποιημένο. + + ![Το ρελέ ενεργοποιείται και απενεργοποιείται](../../../../../images/relay-turn-on-off.gif) + +## Έλεγχος του ρελέ από την υγρασία του εδάφους + +Τώρα που το ρελέ λειτουργεί, μπορεί να ελέγχεται σε απόκριση στις μετρήσεις υγρασίας του εδάφους. + +### Εργασία + +Ελέγξτε το ρελέ. + +1. Διαγράψτε τις 3 γραμμές κώδικα που προσθέσατε για να δοκιμάσετε το ρελέ. Αντικαταστήστε τις με τον παρακάτω κώδικα: + + ```cpp + if (soil_moisture > 450) + { + Serial.println("Soil Moisture is too low, turning relay on."); + digitalWrite(PIN_WIRE_SCL, HIGH); + } + else + { + Serial.println("Soil Moisture is ok, turning relay off."); + digitalWrite(PIN_WIRE_SCL, LOW); + } + ``` + + Αυτός ο κώδικας ελέγχει το επίπεδο υγρασίας του εδάφους από τον αισθητήρα υγρασίας εδάφους. Αν είναι πάνω από 450, ενεργοποιεί το ρελέ, και το απενεργοποιεί όταν πέφτει κάτω από 450. + + > 💁 Θυμηθείτε ότι ο χωρητικός αισθητήρας υγρασίας εδάφους διαβάζει: όσο χαμηλότερο είναι το επίπεδο υγρασίας, τόσο περισσότερη υγρασία υπάρχει στο έδαφος και το αντίστροφο. + +1. Δημιουργήστε και ανεβάστε τον κώδικα στο Wio Terminal. + +1. Παρακολουθήστε τη συσκευή μέσω του σειριακού παραθύρου. Θα δείτε το ρελέ να ενεργοποιείται ή να απενεργοποιείται ανάλογα με το επίπεδο υγρασίας του εδάφους. Δοκιμάστε σε ξηρό έδαφος και στη συνέχεια προσθέστε νερό. + + ```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. + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-relay/wio-terminal](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/wio-terminal). + +😀 Το πρόγραμμα ελέγχου του ρελέ από τον αισθητήρα υγρασίας εδάφους ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md b/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md new file mode 100644 index 00000000..c9fc9a14 --- /dev/null +++ b/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md @@ -0,0 +1,434 @@ + +# Μεταφέρετε το φυτό σας στο cloud + +![Μια επισκόπηση του μαθήματος σε μορφή σκίτσου](../../../../../translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.el.jpg) + +> Σκίτσο από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +Αυτό το μάθημα διδάχθηκε ως μέρος της σειράς [IoT for Beginners Project 2 - Digital Agriculture](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) από το [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Συνδέστε τη συσκευή σας στο cloud με το Azure IoT Hub](https://img.youtube.com/vi/bNxjopXkhvk/0.jpg)](https://youtu.be/bNxjopXkhvk) + +## Ερωτήσεις πριν το μάθημα + +[Ερωτήσεις πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/15) + +## Εισαγωγή + +Στο προηγούμενο μάθημα, μάθατε πώς να συνδέσετε το φυτό σας σε έναν MQTT broker και να ελέγξετε ένα ρελέ μέσω κώδικα που εκτελείται τοπικά. Αυτό αποτελεί τη βάση ενός αυτοματοποιημένου συστήματος ποτίσματος συνδεδεμένου στο διαδίκτυο, το οποίο μπορεί να χρησιμοποιηθεί από μεμονωμένα φυτά στο σπίτι έως και εμπορικές φάρμες. + +Η συσκευή IoT επικοινωνούσε με έναν δημόσιο MQTT broker για να δείξει τις βασικές αρχές, αλλά αυτός δεν είναι ο πιο αξιόπιστος ή ασφαλής τρόπος. Σε αυτό το μάθημα θα μάθετε για το cloud και τις δυνατότητες IoT που παρέχονται από δημόσιες υπηρεσίες cloud. Θα μάθετε επίσης πώς να μεταφέρετε το φυτό σας από τον δημόσιο MQTT broker σε μία από αυτές τις υπηρεσίες cloud. + +Σε αυτό το μάθημα θα καλύψουμε: + +* [Τι είναι το cloud;](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Δημιουργία συνδρομής στο cloud](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Υπηρεσίες IoT στο cloud](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Δημιουργία υπηρεσίας IoT στο cloud](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Επικοινωνία με το IoT Hub](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Σύνδεση της συσκευής σας με την υπηρεσία IoT](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) + +## Τι είναι το cloud; + +Πριν από το cloud, όταν μια εταιρεία ήθελε να παρέχει υπηρεσίες στους υπαλλήλους της (όπως βάσεις δεδομένων ή αποθήκευση αρχείων) ή στο κοινό (όπως ιστοσελίδες), έπρεπε να δημιουργήσει και να λειτουργήσει ένα data center. Αυτό μπορούσε να είναι από ένα δωμάτιο με λίγους υπολογιστές έως ένα κτίριο με πολλούς υπολογιστές. Η εταιρεία έπρεπε να διαχειρίζεται τα πάντα, όπως: + +* Αγορά υπολογιστών +* Συντήρηση υλικού +* Παροχή ενέργειας και ψύξη +* Δικτύωση +* Ασφάλεια, συμπεριλαμβανομένης της ασφάλειας του κτιρίου και του λογισμικού στους υπολογιστές +* Εγκατάσταση και ενημερώσεις λογισμικού + +Αυτό μπορούσε να είναι πολύ ακριβό, να απαιτεί ένα ευρύ φάσμα εξειδικευμένων υπαλλήλων και να είναι πολύ αργό στις αλλαγές όταν χρειάζεται. Για παράδειγμα, αν ένα ηλεκτρονικό κατάστημα έπρεπε να προετοιμαστεί για μια πολυάσχολη εορταστική περίοδο, θα έπρεπε να σχεδιάσει μήνες νωρίτερα για να αγοράσει περισσότερο υλικό, να το ρυθμίσει, να εγκαταστήσει το λογισμικό και να διαχειριστεί τη διαδικασία πωλήσεων. Μετά την εορταστική περίοδο, όταν οι πωλήσεις μειώνονταν, θα έμεναν με υπολογιστές που είχαν πληρώσει και δεν χρησιμοποιούνταν μέχρι την επόμενη πολυάσχολη περίοδο. + +✅ Πιστεύετε ότι αυτό θα επέτρεπε στις εταιρείες να κινηθούν γρήγορα; Αν ένας διαδικτυακός πωλητής ρούχων γινόταν ξαφνικά δημοφιλής λόγω μιας διασημότητας που φορούσε τα ρούχα του, θα μπορούσε να αυξήσει γρήγορα την υπολογιστική του ισχύ για να υποστηρίξει την ξαφνική αύξηση των παραγγελιών; + +### Ο υπολογιστής κάποιου άλλου + +Το cloud συχνά αναφέρεται χιουμοριστικά ως "ο υπολογιστής κάποιου άλλου". Η αρχική ιδέα ήταν απλή - αντί να αγοράζετε υπολογιστές, νοικιάζετε τον υπολογιστή κάποιου άλλου. Κάποιος άλλος, ένας πάροχος cloud computing, θα διαχειριζόταν τεράστια data centers. Θα ήταν υπεύθυνος για την αγορά και εγκατάσταση του υλικού, τη διαχείριση της ενέργειας και της ψύξης, τη δικτύωση, την ασφάλεια του κτιρίου, τις ενημερώσεις υλικού και λογισμικού, τα πάντα. Ως πελάτης, θα νοικιάζατε τους υπολογιστές που χρειάζεστε, νοικιάζοντας περισσότερους όταν αυξάνεται η ζήτηση και μειώνοντας τον αριθμό που νοικιάζετε όταν η ζήτηση πέφτει. Αυτά τα data centers βρίσκονται σε όλο τον κόσμο. + +![Ένα data center του Microsoft cloud](../../../../../translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.el.png) +![Προγραμματισμένη επέκταση ενός data center του Microsoft cloud](../../../../../translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.el.png) + +Αυτά τα data centers μπορούν να έχουν μέγεθος πολλών τετραγωνικών χιλιομέτρων. Οι παραπάνω εικόνες τραβήχτηκαν πριν από λίγα χρόνια σε ένα data center του Microsoft cloud και δείχνουν το αρχικό μέγεθος, καθώς και μια προγραμματισμένη επέκταση. Η περιοχή που έχει καθαριστεί για την επέκταση είναι πάνω από 5 τετραγωνικά χιλιόμετρα. + +> 💁 Αυτά τα data centers απαιτούν τόσο μεγάλες ποσότητες ενέργειας που ορισμένα έχουν δικούς τους σταθμούς παραγωγής ενέργειας. Λόγω του μεγέθους τους και του επιπέδου επένδυσης από τους παρόχους cloud, είναι συνήθως πολύ φιλικά προς το περιβάλλον. Είναι πιο αποδοτικά από έναν μεγάλο αριθμό μικρών data centers, λειτουργούν κυρίως με ανανεώσιμες πηγές ενέργειας και οι πάροχοι cloud εργάζονται σκληρά για να μειώσουν τα απόβλητα, να περιορίσουν τη χρήση νερού και να αναδασώσουν περιοχές που έχουν αποψιλωθεί για την κατασκευή data centers. Μπορείτε να διαβάσετε περισσότερα για το πώς ένας πάροχος cloud εργάζεται για τη βιωσιμότητα στον [ιστότοπο βιωσιμότητας του Azure](https://azure.microsoft.com/global-infrastructure/sustainability/?WT.mc_id=academic-17441-jabenn). + +✅ Κάντε έρευνα: Διαβάστε για τους μεγάλους παρόχους cloud όπως το [Azure από τη Microsoft](https://azure.microsoft.com/?WT.mc_id=academic-17441-jabenn) ή το [GCP από την Google](https://cloud.google.com). Πόσα data centers έχουν και πού βρίσκονται στον κόσμο; + +Η χρήση του cloud μειώνει το κόστος για τις εταιρείες και τους επιτρέπει να επικεντρωθούν σε αυτό που κάνουν καλύτερα, αφήνοντας την εξειδίκευση στο cloud computing στα χέρια του παρόχου. Οι εταιρείες δεν χρειάζεται πλέον να νοικιάζουν ή να αγοράζουν χώρο σε data centers, να πληρώνουν διαφορετικούς παρόχους για συνδεσιμότητα και ενέργεια ή να απασχολούν ειδικούς. Αντίθετα, μπορούν να πληρώνουν έναν μηνιαίο λογαριασμό στον πάροχο cloud για να φροντίζει τα πάντα. + +Ο πάροχος cloud μπορεί στη συνέχεια να χρησιμοποιήσει οικονομίες κλίμακας για να μειώσει το κόστος, αγοράζοντας υπολογιστές μαζικά σε χαμηλότερες τιμές, επενδύοντας σε εργαλεία για να μειώσει το φόρτο εργασίας για τη συντήρηση, ακόμη και σχεδιάζοντας και κατασκευάζοντας το δικό του υλικό για να βελτιώσει την προσφορά του cloud. + +### Microsoft Azure + +Το Azure είναι το cloud για προγραμματιστές από τη Microsoft, και αυτό είναι το cloud που θα χρησιμοποιήσετε για αυτά τα μαθήματα. Το παρακάτω βίντεο δίνει μια σύντομη επισκόπηση του Azure: + +[![Επισκόπηση του Azure βίντεο](../../../../../translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.el.png)](https://www.microsoft.com/videoplayer/embed/RE4Ibng?WT.mc_id=academic-17441-jabenn) + +## Δημιουργία συνδρομής στο cloud + +Για να χρησιμοποιήσετε υπηρεσίες στο cloud, θα χρειαστεί να εγγραφείτε για μια συνδρομή με έναν πάροχο cloud. Για αυτό το μάθημα, θα εγγραφείτε για μια συνδρομή στο Microsoft Azure. Αν έχετε ήδη συνδρομή στο Azure, μπορείτε να παραλείψετε αυτήν την εργασία. Οι λεπτομέρειες της συνδρομής που περιγράφονται εδώ είναι σωστές τη στιγμή της γραφής, αλλά μπορεί να αλλάξουν. + +> 💁 Αν έχετε πρόσβαση σε αυτά τα μαθήματα μέσω του σχολείου σας, μπορεί να έχετε ήδη διαθέσιμη μια συνδρομή στο Azure. Ελέγξτε με τον δάσκαλό σας. + +Υπάρχουν δύο διαφορετικοί τύποι δωρεάν συνδρομής στο Azure που μπορείτε να εγγραφείτε: + +* **Azure για Φοιτητές** - Αυτή είναι μια συνδρομή σχεδιασμένη για φοιτητές 18+. Δεν χρειάζεστε πιστωτική κάρτα για να εγγραφείτε και χρησιμοποιείτε τη σχολική σας διεύθυνση email για να επαληθεύσετε ότι είστε φοιτητής. Όταν εγγραφείτε, λαμβάνετε 100$ για να ξοδέψετε σε πόρους cloud, μαζί με δωρεάν υπηρεσίες, συμπεριλαμβανομένης μιας δωρεάν έκδοσης μιας υπηρεσίας IoT. Αυτό διαρκεί 12 μήνες και μπορείτε να το ανανεώσετε κάθε χρόνο που παραμένετε φοιτητής. + +* **Δωρεάν συνδρομή στο Azure** - Αυτή είναι μια συνδρομή για οποιονδήποτε δεν είναι φοιτητής. Θα χρειαστείτε πιστωτική κάρτα για να εγγραφείτε στη συνδρομή, αλλά η κάρτα σας δεν θα χρεωθεί, χρησιμοποιείται μόνο για να επαληθευτεί ότι είστε πραγματικός άνθρωπος και όχι bot. Λαμβάνετε 200$ πίστωσης για να χρησιμοποιήσετε τις πρώτες 30 ημέρες σε οποιαδήποτε υπηρεσία, μαζί με δωρεάν επίπεδα υπηρεσιών του Azure. Μόλις εξαντληθεί η πίστωσή σας, η κάρτα σας δεν θα χρεωθεί εκτός αν μετατρέψετε τη συνδρομή σας σε συνδρομή πληρωμής ανά χρήση. + +> 💁 Η Microsoft προσφέρει μια συνδρομή Azure για Φοιτητές Starter για φοιτητές κάτω των 18 ετών, αλλά τη στιγμή της γραφής αυτή δεν υποστηρίζει υπηρεσίες IoT. + +### Εργασία - εγγραφή για δωρεάν συνδρομή στο cloud + +Αν είστε φοιτητής ηλικίας 18+, τότε μπορείτε να εγγραφείτε για μια συνδρομή Azure για Φοιτητές. Θα χρειαστεί να επαληθεύσετε με μια σχολική διεύθυνση email. Μπορείτε να το κάνετε με δύο τρόπους: + +* Εγγραφείτε για το πακέτο προγραμματιστών φοιτητών GitHub στο [education.github.com/pack](https://education.github.com/pack). Αυτό σας δίνει πρόσβαση σε μια σειρά εργαλείων και προσφορών, συμπεριλαμβανομένων του GitHub και του Microsoft Azure. Μόλις εγγραφείτε στο πακέτο προγραμματιστών, μπορείτε να ενεργοποιήσετε την προσφορά Azure για Φοιτητές. + +* Εγγραφείτε απευθείας για έναν λογαριασμό Azure για Φοιτητές στο [azure.microsoft.com/free/students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-17441-jabenn). + +> ⚠️ Αν η σχολική σας διεύθυνση email δεν αναγνωρίζεται, υποβάλετε ένα [θέμα σε αυτό το repo](https://github.com/Microsoft/IoT-For-Beginners/issues) και θα δούμε αν μπορεί να προστεθεί στη λίστα επιτρεπόμενων του Azure για Φοιτητές. + +Αν δεν είστε φοιτητής ή δεν έχετε έγκυρη σχολική διεύθυνση email, τότε μπορείτε να εγγραφείτε για μια δωρεάν συνδρομή στο Azure. + +* Εγγραφείτε για μια δωρεάν συνδρομή στο Azure στο [azure.microsoft.com/free](https://azure.microsoft.com/free/?WT.mc_id=academic-17441-jabenn) + +## Υπηρεσίες IoT στο cloud + +Ο δημόσιος δοκιμαστικός MQTT broker που χρησιμοποιούσατε είναι ένα εξαιρετικό εργαλείο για εκμάθηση, αλλά έχει αρκετά μειονεκτήματα ως εργαλείο για εμπορική χρήση: + +* Αξιοπιστία - είναι μια δωρεάν υπηρεσία χωρίς εγγυήσεις και μπορεί να απενεργοποιηθεί ανά πάσα στιγμή +* Ασφάλεια - είναι δημόσια, οπότε οποιοσδήποτε μπορεί να ακούσει την τηλεμετρία σας ή να στείλει εντολές για να ελέγξει το υλικό σας +* Απόδοση - είναι σχεδιασμένη για λίγα δοκιμαστικά μηνύματα, οπότε δεν θα μπορούσε να διαχειριστεί μεγάλο όγκο μηνυμάτων +* Ανακάλυψη - δεν υπάρχει τρόπος να γνωρίζετε ποιες συσκευές είναι συνδεδεμένες + +Οι υπηρεσίες IoT στο cloud λύνουν αυτά τα προβλήματα. Διατηρούνται από μεγάλους παρόχους cloud που επενδύουν σημαντικά στην αξιοπιστία και είναι διαθέσιμοι για να διορθώσουν τυχόν προβλήματα που μπορεί να προκύψουν. Έχουν ενσωματωμένη ασφάλεια για να αποτρέψουν τους χάκερ από το να διαβάσουν τα δεδομένα σας ή να στείλουν κακόβουλες εντολές. Είναι επίσης υψηλής απόδοσης, ικανές να διαχειριστούν εκατομμύρια μηνύματα κάθε μέρα, εκμεταλλευόμενες το cloud για να κλιμακωθούν όπως χρειάζεται. + +> 💁 Παρόλο που πληρώνετε για αυτά τα πλεονεκτήματα με μηνιαία χρέωση, οι περισσότεροι πάροχοι cloud προσφέρουν μια δωρεάν έκδοση της υπηρεσίας IoT τους με περιορισμένο αριθμό μηνυμάτων ανά ημέρα ή συσκευών που μπορούν να συνδεθούν. Αυτή η δωρεάν έκδοση είναι συνήθως υπεραρκετή για έναν προγραμματιστή να μάθει για την υπηρεσία. Σε αυτό το μάθημα θα χρησιμοποιήσετε μια δωρεάν έκδοση. + +Οι συσκευές IoT συνδέονται με μια υπηρεσία cloud είτε χρησιμοποιώντας ένα SDK συσκευής (μια βιβλιοθήκη που παρέχει κώδικα για να λειτουργήσει με τις δυνατότητες της υπηρεσίας) είτε απευθείας μέσω ενός πρωτοκόλλου επικοινωνίας όπως το MQTT ή το HTTP. Το SDK συσκευής είναι συνήθως η πιο εύκολη διαδρομή, καθώς χειρίζεται τα πάντα για εσάς, όπως το να γνωρίζει ποια θέματα να δημοσιεύσει ή να εγγραφεί και πώς να χειριστεί την ασφάλεια. + +![Οι συσκευές συνδέονται με μια υπηρεσία χρησιμοποιώντας ένα SDK συσκευής. Ο κώδικας του server συνδέεται επίσης με την υπηρεσία μέσω ενός SDK](../../../../../translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.el.png) + +Η συσκευή σας στη συνέχεια επικοινωνεί με άλλα μέρη της εφαρμογής σας μέσω αυτής της υπηρεσίας - παρόμοια με το πώς στέλνατε τηλεμετρία και λαμβάνατε εντολές μέσω MQTT. Αυτό γίνεται συνήθως χρησιμοποιώντας ένα SDK υπηρεσίας ή μια παρόμοια βιβλιοθήκη. Τα μηνύματα έρχονται από τη συσκευή σας στην υπηρεσία, όπου άλλα μέρη της εφαρμογής σας μπορούν να τα διαβάσουν, και τα μηνύματα μπορούν να σταλούν πίσω στη συσκευή σας. + +![Οι συσκευές χωρίς έγκυρο μυστικό κλειδί δεν μπορούν να συνδεθούν με την υπηρεσία IoT](../../../../../translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.el.png) + +Αυτές οι υπηρεσίες εφαρμόζουν ασφάλεια γνωρίζοντας όλες τις συσκευές που μπορούν να συνδεθούν και να στείλουν δεδομένα, είτε με την προεγγραφή των συσκευών στην υπηρεσία είτε δίνοντας στις συσκευές μυστικά κλειδιά ή πιστοποιητικά που μπορούν να χρησιμοποιήσουν για να εγγραφούν στην υπηρεσία την πρώτη φορά που συνδέονται. Άγνωστες συσκευές δεν μπορούν να συνδεθούν, αν προσπαθήσουν η υπηρεσία απορρίπτει τη σύνδεση και αγνοεί τα μηνύματα +💁 Οι υπηρεσίες IoT υλοποιούν επίσης πρόσθετες δυνατότητες, και οι πάροχοι cloud διαθέτουν επιπλέον υπηρεσίες και εφαρμογές που μπορούν να συνδεθούν με την υπηρεσία. Για παράδειγμα, αν θέλετε να αποθηκεύσετε όλα τα μηνύματα τηλεμετρίας που στέλνονται από όλες τις συσκευές σε μια βάση δεδομένων, συνήθως χρειάζονται μόνο λίγα κλικ στο εργαλείο διαμόρφωσης του παρόχου cloud για να συνδέσετε την υπηρεσία με μια βάση δεδομένων και να μεταφέρετε τα δεδομένα. +## Δημιουργία υπηρεσίας IoT στο cloud + +Τώρα που έχετε μια συνδρομή Azure, μπορείτε να εγγραφείτε σε μια υπηρεσία IoT. Η υπηρεσία IoT της Microsoft ονομάζεται Azure IoT Hub. + +![Το λογότυπο του Azure IoT Hub](../../../../../translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.el.png) + +Το παρακάτω βίντεο παρέχει μια σύντομη επισκόπηση του Azure IoT Hub: + +[![Επισκόπηση του βίντεο Azure IoT Hub](https://img.youtube.com/vi/smuZaZZXKsU/0.jpg)](https://www.youtube.com/watch?v=smuZaZZXKsU) + +> 🎥 Κάντε κλικ στην παραπάνω εικόνα για να παρακολουθήσετε το βίντεο + +✅ Αφιερώστε λίγο χρόνο για να κάνετε έρευνα και να διαβάσετε την επισκόπηση του IoT Hub στη [τεκμηρίωση του Microsoft IoT Hub](https://docs.microsoft.com/azure/iot-hub/about-iot-hub?WT.mc_id=academic-17441-jabenn). + +Οι υπηρεσίες cloud που είναι διαθέσιμες στο Azure μπορούν να ρυθμιστούν μέσω μιας διαδικτυακής πύλης ή μέσω μιας διεπαφής γραμμής εντολών (CLI). Για αυτήν την εργασία, θα χρησιμοποιήσετε το CLI. + +### Εργασία - εγκατάσταση του Azure CLI + +Για να χρησιμοποιήσετε το Azure CLI, πρέπει πρώτα να το εγκαταστήσετε στον υπολογιστή σας ή στο Mac σας. + +1. Ακολουθήστε τις οδηγίες στη [τεκμηρίωση του Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli?WT.mc_id=academic-17441-jabenn) για να εγκαταστήσετε το CLI. + +1. Το Azure CLI υποστηρίζει έναν αριθμό επεκτάσεων που προσθέτουν δυνατότητες για τη διαχείριση μιας ευρείας γκάμας υπηρεσιών Azure. Εγκαταστήστε την επέκταση IoT εκτελώντας την παρακάτω εντολή από τη γραμμή εντολών ή το τερματικό σας: + + ```sh + az extension add --name azure-iot + ``` + +1. Από τη γραμμή εντολών ή το τερματικό σας, εκτελέστε την παρακάτω εντολή για να συνδεθείτε στη συνδρομή σας στο Azure μέσω του Azure CLI. + + ```sh + az login + ``` + + Θα ανοίξει μια ιστοσελίδα στον προεπιλεγμένο σας περιηγητή. Συνδεθείτε χρησιμοποιώντας τον λογαριασμό που χρησιμοποιήσατε για να εγγραφείτε στη συνδρομή σας στο Azure. Μόλις συνδεθείτε, μπορείτε να κλείσετε την καρτέλα του περιηγητή. + +1. Εάν έχετε πολλές συνδρομές Azure, όπως μια που παρέχεται από το σχολείο σας και τη δική σας συνδρομή Azure for Students, θα χρειαστεί να επιλέξετε ποια θέλετε να χρησιμοποιήσετε. Εκτελέστε την παρακάτω εντολή για να δείτε όλες τις συνδρομές στις οποίες έχετε πρόσβαση: + + ```sh + az account list --output table + ``` + + Στην έξοδο, θα δείτε το όνομα κάθε συνδρομής μαζί με το `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 + ``` + + Για να επιλέξετε τη συνδρομή που θέλετε να χρησιμοποιήσετε, χρησιμοποιήστε την παρακάτω εντολή: + + ```sh + az account set --subscription + ``` + + Αντικαταστήστε το `` με το Id της συνδρομής που θέλετε να χρησιμοποιήσετε. Αφού εκτελέσετε αυτήν την εντολή, εκτελέστε ξανά την εντολή για να δείτε τους λογαριασμούς σας. Θα δείτε ότι η στήλη `IsDefault` θα έχει την τιμή `True` για τη συνδρομή που μόλις ορίσατε. + +### Εργασία - δημιουργία ομάδας πόρων + +Οι υπηρεσίες Azure, όπως οι περιπτώσεις IoT Hub, οι εικονικές μηχανές, οι βάσεις δεδομένων ή οι υπηρεσίες AI, αναφέρονται ως **πόροι**. Κάθε πόρος πρέπει να ανήκει σε μια **Ομάδα Πόρων**, μια λογική ομαδοποίηση ενός ή περισσότερων πόρων. + +> 💁 Η χρήση ομάδων πόρων σημαίνει ότι μπορείτε να διαχειριστείτε πολλές υπηρεσίες ταυτόχρονα. Για παράδειγμα, μόλις ολοκληρώσετε όλα τα μαθήματα για αυτό το έργο, μπορείτε να διαγράψετε την ομάδα πόρων και όλοι οι πόροι σε αυτήν θα διαγραφούν αυτόματα. + +1. Υπάρχουν πολλά κέντρα δεδομένων Azure σε όλο τον κόσμο, χωρισμένα σε περιοχές. Όταν δημιουργείτε έναν πόρο ή μια ομάδα πόρων Azure, πρέπει να καθορίσετε πού θέλετε να δημιουργηθεί. Εκτελέστε την παρακάτω εντολή για να λάβετε τη λίστα των τοποθεσιών: + + ```sh + az account list-locations --output table + ``` + + Θα δείτε μια λίστα τοποθεσιών. Αυτή η λίστα θα είναι μεγάλη. + + > 💁 Τη στιγμή της συγγραφής, υπάρχουν 65 τοποθεσίες στις οποίες μπορείτε να αναπτύξετε. + + ```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 + ... + ``` + + Σημειώστε την τιμή από τη στήλη `Name` της περιοχής που βρίσκεται πιο κοντά σας. Μπορείτε να βρείτε τις περιοχές σε έναν χάρτη στη [σελίδα γεωγραφιών του Azure](https://azure.microsoft.com/global-infrastructure/geographies/?WT.mc_id=academic-17441-jabenn). + +1. Εκτελέστε την παρακάτω εντολή για να δημιουργήσετε μια ομάδα πόρων με το όνομα `soil-moisture-sensor`. Τα ονόματα των ομάδων πόρων πρέπει να είναι μοναδικά στη συνδρομή σας. + + ```sh + az group create --name soil-moisture-sensor \ + --location + ``` + + Αντικαταστήστε το `` με την τοποθεσία που επιλέξατε στο προηγούμενο βήμα. + +### Εργασία - δημιουργία IoT Hub + +Μπορείτε τώρα να δημιουργήσετε έναν πόρο IoT Hub στην ομάδα πόρων σας. + +1. Χρησιμοποιήστε την παρακάτω εντολή για να δημιουργήσετε τον πόρο IoT Hub: + + ```sh + az iot hub create --resource-group soil-moisture-sensor \ + --sku F1 \ + --partition-count 2 \ + --name + ``` + + Αντικαταστήστε το `` με ένα όνομα για το hub σας. Αυτό το όνομα πρέπει να είναι μοναδικό παγκοσμίως - δηλαδή κανένα άλλο IoT Hub που έχει δημιουργηθεί από οποιονδήποτε δεν μπορεί να έχει το ίδιο όνομα. Αυτό το όνομα χρησιμοποιείται σε μια διεύθυνση URL που δείχνει στο hub, οπότε πρέπει να είναι μοναδικό. Χρησιμοποιήστε κάτι όπως `soil-moisture-sensor-` και προσθέστε έναν μοναδικό αναγνωριστικό στο τέλος, όπως μερικές τυχαίες λέξεις ή το όνομά σας. + + Η επιλογή `--sku F1` υποδεικνύει τη χρήση της δωρεάν βαθμίδας. Η δωρεάν βαθμίδα υποστηρίζει 8.000 μηνύματα την ημέρα μαζί με τις περισσότερες δυνατότητες των βαθμίδων πλήρους τιμής. + + > 🎓 Οι διαφορετικές βαθμίδες τιμολόγησης των υπηρεσιών Azure αναφέρονται ως επίπεδα. Κάθε επίπεδο έχει διαφορετικό κόστος και παρέχει διαφορετικές δυνατότητες ή όγκους δεδομένων. + + > 💁 Εάν θέλετε να μάθετε περισσότερα για την τιμολόγηση, μπορείτε να δείτε τον [οδηγό τιμολόγησης του Azure IoT Hub](https://azure.microsoft.com/pricing/details/iot-hub/?WT.mc_id=academic-17441-jabenn). + + Η επιλογή `--partition-count 2` ορίζει πόσα ρεύματα δεδομένων υποστηρίζει το IoT Hub. Περισσότερα partitions μειώνουν την απόφραξη δεδομένων όταν πολλαπλές συσκευές διαβάζουν και γράφουν από το IoT Hub. Τα partitions είναι εκτός του πεδίου αυτών των μαθημάτων, αλλά αυτή η τιμή πρέπει να οριστεί για να δημιουργηθεί ένα IoT Hub δωρεάν βαθμίδας. + + > 💁 Μπορείτε να έχετε μόνο ένα IoT Hub δωρεάν βαθμίδας ανά συνδρομή. + +Το IoT Hub θα δημιουργηθεί. Μπορεί να χρειαστεί ένα λεπτό για να ολοκληρωθεί. + +## Επικοινωνία με το IoT Hub + +Στο προηγούμενο μάθημα, χρησιμοποιήσατε το MQTT και στείλατε μηνύματα μπρος-πίσω σε διαφορετικά θέματα, με τα διαφορετικά θέματα να έχουν διαφορετικούς σκοπούς. Αντί να στέλνετε μηνύματα σε διαφορετικά θέματα, το IoT Hub έχει έναν αριθμό καθορισμένων τρόπων για τη συσκευή να επικοινωνεί με το Hub ή το Hub να επικοινωνεί με τη συσκευή. + +> 💁 Στο παρασκήνιο, αυτή η επικοινωνία μεταξύ του IoT Hub και της συσκευής σας μπορεί να χρησιμοποιεί MQTT, HTTPS ή AMQP. + +* Μηνύματα από συσκευή προς cloud (D2C) - αυτά είναι μηνύματα που αποστέλλονται από μια συσκευή στο IoT Hub, όπως τηλεμετρία. Στη συνέχεια, μπορούν να διαβαστούν από το IoT Hub από τον κώδικα της εφαρμογής σας. + + > 🎓 Στο παρασκήνιο, το IoT Hub χρησιμοποιεί μια υπηρεσία Azure που ονομάζεται [Event Hubs](https://docs.microsoft.com/azure/event-hubs/?WT.mc_id=academic-17441-jabenn). Όταν γράφετε κώδικα για να διαβάσετε μηνύματα που αποστέλλονται στο hub, αυτά συχνά ονομάζονται γεγονότα. + +* Μηνύματα από cloud προς συσκευή (C2D) - αυτά είναι μηνύματα που αποστέλλονται από τον κώδικα της εφαρμογής, μέσω ενός IoT Hub, σε μια συσκευή IoT. + +* Αιτήματα άμεσων μεθόδων - αυτά είναι μηνύματα που αποστέλλονται από τον κώδικα της εφαρμογής μέσω ενός IoT Hub σε μια συσκευή IoT για να ζητηθεί από τη συσκευή να κάνει κάτι, όπως να ελέγξει έναν ενεργοποιητή. Αυτά τα μηνύματα απαιτούν απάντηση, ώστε ο κώδικας της εφαρμογής σας να μπορεί να διαπιστώσει εάν επεξεργάστηκαν με επιτυχία. + +* Δίδυμα συσκευών - αυτά είναι έγγραφα JSON που διατηρούνται συγχρονισμένα μεταξύ της συσκευής και του IoT Hub και χρησιμοποιούνται για την αποθήκευση ρυθμίσεων ή άλλων ιδιοτήτων που είτε αναφέρονται από τη συσκευή είτε πρέπει να οριστούν στη συσκευή (γνωστά ως επιθυμητά) από το IoT Hub. + +Το IoT Hub μπορεί να αποθηκεύσει μηνύματα και αιτήματα άμεσων μεθόδων για μια ρυθμιζόμενη χρονική περίοδο (με προεπιλογή μία ημέρα), οπότε αν μια συσκευή ή ο κώδικας της εφαρμογής χάσει τη σύνδεση, μπορεί να ανακτήσει τα μηνύματα που στάλθηκαν ενώ ήταν εκτός σύνδεσης μόλις επανασυνδεθεί. Τα δίδυμα συσκευών διατηρούνται μόνιμα στο IoT Hub, οπότε οποιαδήποτε στιγμή μια συσκευή μπορεί να επανασυνδεθεί και να λάβει το πιο πρόσφατο δίδυμο συσκευής. + +✅ Κάντε έρευνα: Διαβάστε περισσότερα για αυτούς τους τύπους μηνυμάτων στις [οδηγίες επικοινωνίας από συσκευή προς cloud](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-d2c-guidance?WT.mc_id=academic-17441-jabenn) και στις [οδηγίες επικοινωνίας από cloud προς συσκευή](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-c2d-guidance?WT.mc_id=academic-17441-jabenn) στη τεκμηρίωση του IoT Hub. + +## Συνδέστε τη συσκευή σας με την υπηρεσία IoT + +Μόλις δημιουργηθεί το hub, η συσκευή IoT σας μπορεί να συνδεθεί σε αυτό. Μόνο εγγεγραμμένες συσκευές μπορούν να συνδεθούν σε μια υπηρεσία, οπότε θα χρειαστεί να εγγράψετε πρώτα τη συσκευή σας. Όταν εγγραφείτε, μπορείτε να λάβετε μια συμβολοσειρά σύνδεσης που η συσκευή μπορεί να χρησιμοποιήσει για να συνδεθεί. Αυτή η συμβολοσειρά σύνδεσης είναι συγκεκριμένη για τη συσκευή και περιέχει πληροφορίες σχετικά με το IoT Hub, τη συσκευή και ένα μυστικό κλειδί που θα επιτρέψει σε αυτήν τη συσκευή να συνδεθεί. + +> 🎓 Μια συμβολοσειρά σύνδεσης είναι ένας γενικός όρος για ένα κομμάτι κειμένου που περιέχει λεπτομέρειες σύνδεσης. Χρησιμοποιούνται κατά τη σύνδεση σε IoT Hubs, βάσεις δεδομένων και πολλές άλλες υπηρεσίες. Συνήθως αποτελούνται από έναν αναγνωριστικό για την υπηρεσία, όπως μια διεύθυνση URL, και πληροφορίες ασφαλείας, όπως ένα μυστικό κλειδί. Αυτές περνούν σε SDKs για να συνδεθούν με την υπηρεσία. + +> ⚠️ Οι συμβολοσειρές σύνδεσης πρέπει να διατηρούνται ασφαλείς! Η ασφάλεια θα καλυφθεί με περισσότερες λεπτομέρειες σε ένα μελλοντικό μάθημα. + +### Εργασία - εγγραφή της συσκευής IoT σας + +Η συσκευή IoT μπορεί να εγγραφεί στο IoT Hub σας χρησιμοποιώντας το Azure CLI. + +1. Εκτελέστε την παρακάτω εντολή για να εγγράψετε μια συσκευή: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor \ + --hub-name + ``` + + Αντικαταστήστε το `` με το όνομα που χρησιμοποιήσατε για το IoT Hub σας. + + Αυτό θα δημιουργήσει μια συσκευή με ID `soil-moisture-sensor`. + +1. Όταν η συσκευή IoT σας συνδεθεί στο IoT Hub σας χρησιμοποιώντας το SDK, θα χρειαστεί να χρησιμοποιήσει μια συμβολοσειρά σύνδεσης που παρέχει τη διεύθυνση URL του hub, μαζί με ένα μυστικό κλειδί. Εκτελέστε την παρακάτω εντολή για να λάβετε τη συμβολοσειρά σύνδεσης: + + ```sh + az iot hub device-identity connection-string show --device-id soil-moisture-sensor \ + --output table \ + --hub-name + ``` + + Αντικαταστήστε το `` με το όνομα που χρησιμοποιήσατε για το IoT Hub σας. + +1. Αποθηκεύστε τη συμβολοσειρά σύνδεσης που εμφανίζεται στην έξοδο, καθώς θα τη χρειαστείτε αργότερα. + +### Εργασία - συνδέστε τη συσκευή IoT σας στο cloud + +Ακολουθήστε τον σχετικό οδηγό για να συνδέσετε τη συσκευή IoT σας στο cloud: + +* [Arduino - Wio Terminal](wio-terminal-connect-hub.md) +* [Υπολογιστής μονού πίνακα - Raspberry Pi/Εικονική συσκευή IoT](single-board-computer-connect-hub.md) + +### Εργασία - παρακολούθηση γεγονότων + +Προς το παρόν, δεν θα ενημερώσετε τον κώδικα του διακομιστή σας. Αντίθετα, μπορείτε να χρησιμοποιήσετε το Azure CLI για να παρακολουθήσετε γεγονότα από τη συσκευή IoT σας. + +1. Βεβαιωθείτε ότι η συσκευή IoT σας λειτουργεί και στέλνει τιμές τηλεμετρίας υγρασίας εδάφους. + +1. Εκτελέστε την παρακάτω εντολή στη γραμμή εντολών ή στο τερματικό σας για να παρακολουθήσετε μηνύματα που αποστέλλονται στο IoT Hub σας: + + ```sh + az iot hub monitor-events --hub-name + ``` + + Αντικαταστήστε το `` με το όνομα που χρησιμοποιήσατε για το IoT Hub σας. + + Θα δείτε μηνύματα να εμφανίζονται στην έξοδο της κονσόλας καθώς αποστέλλονται από τη συσκευή 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}" + } + } + ``` + + Το περιεχόμενο του `payload` θα ταιριάζει με το μήνυμα που αποστέλλεται από τη συσκευή IoT σας. + + > Τη στιγμή της συγγραφής, η επέκταση `az iot` δεν λειτουργεί πλήρως σε συσκευές Apple Silicon. Εάν χρησιμοποιείτε συσκευή Apple Silicon, θα χρειαστεί να παρακολουθήσετε τα μηνύματα με διαφορετικό τρόπο, όπως χρησιμοποιώντας τα [Azure IoT Tools για το Visual Studio Code](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-vscode-iot-toolkit-cloud-device-messaging). + +1. Αυτά τα μηνύματα έχουν έναν αριθμό ιδιοτήτων που επισυνάπτονται αυτόματα, όπως η χρονική σήμανση που στάλθηκαν. Αυτές είναι γνωστές ως *annotations*. Για να δείτε όλες τις σημειώσεις μηνυμάτων, χρησιμοποιήστε την παρακάτω εντολή: + + ```sh + az iot hub monitor-events --properties anno --hub-name + ``` + + Αντικαταστήστε το `` με το όνομα που χρησιμοποιήσατε για το IoT Hub σας. + + Θα δείτε μηνύματα να εμφανίζονται στην έξοδο της κονσόλας καθώς αποστέλλονται από τη συσκευή 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}" + } + } + ``` + + Οι χρονικές τιμές στις σημειώσεις είναι σε [χρόνο UNIX](https://wikipedia.org/wiki/Unix_time), που αντιπροσωπεύει τον αριθμό των δευτερολέπτων από τα μεσάνυχτα της 1ης Ιανουαρίου 1970. + + Έξοδος από την παρακολούθηση γεγονότων όταν τελειώσετε. + +### Εργ + +` με το όνομα που χρησιμοποιήσατε για το IoT Hub σας. + +Αυτό στέλνει ένα αίτημα άμεσης μεθόδου για τη μέθοδο που καθορίζεται από το `method-name`. Οι άμεσες μέθοδοι μπορούν να περιλαμβάνουν ένα payload που περιέχει δεδομένα για τη μέθοδο, και αυτό μπορεί να καθοριστεί στην παράμετρο `method-payload` ως JSON. + +Θα δείτε το ρελέ να ενεργοποιείται και την αντίστοιχη έξοδο από τη συσκευή IoT σας: + +```output + Direct method received - relay_on + ``` + +1. Επαναλάβετε το παραπάνω βήμα, αλλά ορίστε το `--method-name` σε `relay_off`. Θα δείτε το ρελέ να απενεργοποιείται και την αντίστοιχη έξοδο από τη συσκευή IoT. + +--- + +## 🚀 Πρόκληση + +Η δωρεάν βαθμίδα του IoT Hub επιτρέπει 8.000 μηνύματα την ημέρα. Ο κώδικας που γράψατε στέλνει μηνύματα τηλεμετρίας κάθε 10 δευτερόλεπτα. Πόσα μηνύματα την ημέρα αντιστοιχούν σε ένα μήνυμα κάθε 10 δευτερόλεπτα; + +Σκεφτείτε πόσο συχνά πρέπει να αποστέλλονται οι μετρήσεις υγρασίας του εδάφους. Πώς μπορείτε να αλλάξετε τον κώδικά σας ώστε να παραμείνετε εντός της δωρεάν βαθμίδας και να ελέγχετε όσο συχνά χρειάζεται αλλά όχι υπερβολικά συχνά; Τι θα γινόταν αν θέλατε να προσθέσετε μια δεύτερη συσκευή; + +## Κουίζ μετά το μάθημα + +[Κουίζ μετά το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/16) + +## Ανασκόπηση & Αυτομελέτη + +Το IoT Hub SDK είναι ανοιχτού κώδικα τόσο για Arduino όσο και για Python. Στα αποθετήρια κώδικα στο GitHub υπάρχουν αρκετά παραδείγματα που δείχνουν πώς να δουλέψετε με διαφορετικές λειτουργίες του IoT Hub. + +* Εάν χρησιμοποιείτε Wio Terminal, δείτε τα [παραδείγματα Arduino στο GitHub](https://github.com/Azure/azure-iot-pal-arduino/tree/master/pal/samples) +* Εάν χρησιμοποιείτε Raspberry Pi ή Εικονική συσκευή, δείτε τα [παραδείγματα Python στο GitHub](https://github.com/Azure/azure-iot-sdk-python/tree/master/azure-iot-hub/samples) + +## Εργασία + +[Μάθετε για τις υπηρεσίες cloud](assignment.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md b/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md new file mode 100644 index 00000000..7fc636d8 --- /dev/null +++ b/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md @@ -0,0 +1,33 @@ + +# Μάθετε για τις υπηρεσίες cloud + +## Οδηγίες + +Τα cloud, όπως το Azure της Microsoft, προσφέρουν περισσότερα από απλή ενοικίαση υπολογιστικών πόρων. Οι κύριοι τύποι προσφορών cloud περιλαμβάνουν: + +* Υποδομή ως υπηρεσία (IaaS) +* Πλατφόρμα ως υπηρεσία (PaaS) +* Χωρίς διακομιστές (Serverless) +* Λογισμικό ως υπηρεσία (SaaS) + +Μάθετε για αυτούς τους διαφορετικούς τύπους προσφορών και εξηγήστε τι είναι και πώς διαφέρουν. Εξηγήστε ποιες προσφορές είναι σχετικές για προγραμματιστές IoT. + +## Κριτήρια Αξιολόγησης + +| Κριτήρια | Εξαιρετικό | Επαρκές | Χρειάζεται Βελτίωση | +| -------- | ---------- | -------- | ------------------- | +| Εξήγηση των διαφορετικών προσφορών cloud | Παρείχε σαφείς εξηγήσεις για όλους τους 4 τύπους προσφορών | Μπόρεσε να εξηγήσει 3 τύπους προσφορών | Μπόρεσε να εξηγήσει μόνο 1 ή 2 από τις προσφορές | +| Εξήγηση ποια προσφορά είναι σχετική για IoT | Παρείχε μια εξήγηση για το ποιες προσφορές είναι σχετικές για προγραμματιστές IoT και γιατί | Παρείχε μια εξήγηση για το ποιες προσφορές είναι σχετικές για προγραμματιστές IoT αλλά όχι γιατί | Δεν μπόρεσε να εξηγήσει ποιες προσφορές είναι σχετικές για προγραμματιστές IoT | + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md b/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md new file mode 100644 index 00000000..2c3599ae --- /dev/null +++ b/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md @@ -0,0 +1,130 @@ + +# Συνδέστε τη συσκευή IoT σας με το cloud - Εικονικό Υλικό IoT και Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα συνδέσετε την εικονική συσκευή IoT ή το Raspberry Pi σας με το IoT Hub, για να στέλνετε τηλεμετρία και να λαμβάνετε εντολές. + +## Συνδέστε τη συσκευή σας με το IoT Hub + +Το επόμενο βήμα είναι να συνδέσετε τη συσκευή σας με το IoT Hub. + +### Εργασία - σύνδεση με το IoT Hub + +1. Ανοίξτε τον φάκελο `soil-moisture-sensor` στο VS Code. Βεβαιωθείτε ότι το εικονικό περιβάλλον εκτελείται στο τερματικό, αν χρησιμοποιείτε εικονική συσκευή IoT. + +1. Εγκαταστήστε μερικά επιπλέον πακέτα Pip: + + ```sh + pip3 install azure-iot-device + ``` + + Το `azure-iot-device` είναι μια βιβλιοθήκη για την επικοινωνία με το IoT Hub. + +1. Προσθέστε τις παρακάτω εισαγωγές στην κορυφή του αρχείου `app.py`, κάτω από τις υπάρχουσες εισαγωγές: + + ```python + from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse + ``` + + Αυτός ο κώδικας εισάγει το SDK για την επικοινωνία με το IoT Hub. + +1. Αφαιρέστε τη γραμμή `import paho.mqtt.client as mqtt`, καθώς αυτή η βιβλιοθήκη δεν είναι πλέον απαραίτητη. Αφαιρέστε όλο τον κώδικα MQTT, συμπεριλαμβανομένων των ονομάτων θεμάτων, όλου του κώδικα που χρησιμοποιεί το `mqtt_client` και τη `handle_command`. Κρατήστε τη βρόχο `while True:`, απλώς διαγράψτε τη γραμμή `mqtt_client.publish` από αυτή τη βρόχο. + +1. Προσθέστε τον παρακάτω κώδικα κάτω από τις δηλώσεις εισαγωγής: + + ```python + connection_string = "" + ``` + + Αντικαταστήστε το `` με τη συμβολοσειρά σύνδεσης που ανακτήσατε για τη συσκευή νωρίτερα σε αυτό το μάθημα. + + > 💁 Αυτό δεν είναι η καλύτερη πρακτική. Οι συμβολοσειρές σύνδεσης δεν πρέπει ποτέ να αποθηκεύονται στον πηγαίο κώδικα, καθώς μπορεί να ελεγχθούν σε σύστημα ελέγχου πηγαίου κώδικα και να βρεθούν από οποιονδήποτε. Το κάνουμε αυτό εδώ για λόγους απλότητας. Ιδανικά, θα πρέπει να χρησιμοποιήσετε κάτι όπως μια μεταβλητή περιβάλλοντος και ένα εργαλείο όπως το [`python-dotenv`](https://pypi.org/project/python-dotenv/). Θα μάθετε περισσότερα για αυτό σε ένα επόμενο μάθημα. + +1. Κάτω από αυτόν τον κώδικα, προσθέστε τα παρακάτω για να δημιουργήσετε ένα αντικείμενο πελάτη συσκευής που μπορεί να επικοινωνεί με το IoT Hub και να το συνδέσετε: + + ```python + device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) + + print('Connecting') + device_client.connect() + print('Connected') + ``` + +1. Εκτελέστε αυτόν τον κώδικα. Θα δείτε τη συσκευή σας να συνδέεται. + + ```output + pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py + Connecting + Connected + Soil moisture: 379 + ``` + +## Αποστολή τηλεμετρίας + +Τώρα που η συσκευή σας είναι συνδεδεμένη, μπορείτε να στείλετε τηλεμετρία στο IoT Hub αντί για τον διαμεσολαβητή MQTT. + +### Εργασία - αποστολή τηλεμετρίας + +1. Προσθέστε τον παρακάτω κώδικα μέσα στη βρόχο `while True`, ακριβώς πριν από την εντολή sleep: + + ```python + message = Message(json.dumps({ 'soil_moisture': soil_moisture })) + device_client.send_message(message) + ``` + + Αυτός ο κώδικας δημιουργεί ένα `Message` του IoT Hub που περιέχει την ένδειξη υγρασίας εδάφους ως συμβολοσειρά JSON και το στέλνει στο IoT Hub ως μήνυμα από τη συσκευή προς το cloud. + +## Διαχείριση εντολών + +Η συσκευή σας πρέπει να διαχειρίζεται μια εντολή από τον κώδικα του διακομιστή για τον έλεγχο του ρελέ. Αυτή αποστέλλεται ως αίτημα άμεσης μεθόδου. + +## Εργασία - διαχείριση αιτήματος άμεσης μεθόδου + +1. Προσθέστε τον παρακάτω κώδικα πριν από τη βρόχο `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() + ``` + + Αυτός ο κώδικας ορίζει μια μέθοδο, `handle_method_request`, που θα καλείται όταν το IoT Hub καλεί μια άμεση μέθοδο. Κάθε άμεση μέθοδος έχει ένα όνομα, και αυτός ο κώδικας αναμένει μια μέθοδο που ονομάζεται `relay_on` για να ενεργοποιήσει το ρελέ και `relay_off` για να το απενεργοποιήσει. + + > 💁 Αυτό θα μπορούσε επίσης να υλοποιηθεί σε ένα μόνο αίτημα άμεσης μεθόδου, περνώντας την επιθυμητή κατάσταση του ρελέ σε ένα φορτίο που μπορεί να περαστεί με το αίτημα μεθόδου και να είναι διαθέσιμο από το αντικείμενο `request`. + +1. Οι άμεσες μέθοδοι απαιτούν μια απάντηση για να ενημερώσουν τον κώδικα που τις κάλεσε ότι έχουν διαχειριστεί. Προσθέστε τον παρακάτω κώδικα στο τέλος της συνάρτησης `handle_method_request` για να δημιουργήσετε μια απάντηση στο αίτημα: + + ```python + method_response = MethodResponse.create_from_method_request(request, 200) + device_client.send_method_response(method_response) + ``` + + Αυτός ο κώδικας στέλνει μια απάντηση στο αίτημα άμεσης μεθόδου με κωδικό κατάστασης HTTP 200 και το επιστρέφει στο IoT Hub. + +1. Προσθέστε τον παρακάτω κώδικα κάτω από αυτόν τον ορισμό συνάρτησης: + + ```python + device_client.on_method_request_received = handle_method_request + ``` + + Αυτός ο κώδικας ενημερώνει τον πελάτη του IoT Hub να καλεί τη συνάρτηση `handle_method_request` όταν καλείται μια άμεση μέθοδος. + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code/pi](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/pi) ή [code/virtual-device](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/virtual-device). + +😀 Το πρόγραμμα του αισθητήρα υγρασίας εδάφους σας είναι συνδεδεμένο με το IoT Hub σας! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md b/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md new file mode 100644 index 00000000..ce07c1dd --- /dev/null +++ b/translations/el/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md @@ -0,0 +1,306 @@ + +# Συνδέστε τη συσκευή IoT σας στο cloud - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα συνδέσετε το Wio Terminal σας με το IoT Hub, για να στείλετε τηλεμετρία και να λαμβάνετε εντολές. + +## Συνδέστε τη συσκευή σας στο IoT Hub + +Το επόμενο βήμα είναι να συνδέσετε τη συσκευή σας στο IoT Hub. + +### Εργασία - σύνδεση με το IoT Hub + +1. Ανοίξτε το έργο `soil-moisture-sensor` στο VS Code. + +1. Ανοίξτε το αρχείο `platformio.ini`. Αφαιρέστε την εξάρτηση της βιβλιοθήκης `knolleary/PubSubClient`. Αυτή χρησιμοποιήθηκε για τη σύνδεση με τον δημόσιο MQTT broker και δεν είναι απαραίτητη για τη σύνδεση με το IoT Hub. + +1. Προσθέστε τις παρακάτω εξαρτήσεις βιβλιοθηκών: + + ```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 + ``` + + Η βιβλιοθήκη `Seeed Arduino RTC` παρέχει κώδικα για την αλληλεπίδραση με ένα ρολόι πραγματικού χρόνου στο Wio Terminal, που χρησιμοποιείται για την παρακολούθηση του χρόνου. Οι υπόλοιπες βιβλιοθήκες επιτρέπουν στη συσκευή IoT σας να συνδεθεί με το IoT Hub. + +1. Προσθέστε το παρακάτω στο τέλος του αρχείου `platformio.ini`: + + ```ini + build_flags = + -DDONT_USE_UPLOADTOBLOB + ``` + + Αυτό ορίζει μια σημαία του μεταγλωττιστή που είναι απαραίτητη κατά τη μεταγλώττιση του κώδικα Arduino IoT Hub. + +1. Ανοίξτε το αρχείο κεφαλίδας `config.h`. Αφαιρέστε όλες τις ρυθμίσεις MQTT και προσθέστε την παρακάτω σταθερά για τη συμβολοσειρά σύνδεσης της συσκευής: + + ```cpp + // IoT Hub settings + const char *CONNECTION_STRING = ""; + ``` + + Αντικαταστήστε το `` με τη συμβολοσειρά σύνδεσης για τη συσκευή σας που αντιγράψατε νωρίτερα. + +1. Η σύνδεση με το IoT Hub χρησιμοποιεί ένα διακριτικό που βασίζεται στον χρόνο. Αυτό σημαίνει ότι η συσκευή IoT πρέπει να γνωρίζει την τρέχουσα ώρα. Σε αντίθεση με λειτουργικά συστήματα όπως τα Windows, macOS ή Linux, οι μικροελεγκτές δεν συγχρονίζουν αυτόματα την τρέχουσα ώρα μέσω του Διαδικτύου. Αυτό σημαίνει ότι θα χρειαστεί να προσθέσετε κώδικα για να λάβετε την τρέχουσα ώρα από έναν [NTP](https://wikipedia.org/wiki/Network_Time_Protocol) server. Μόλις ληφθεί η ώρα, μπορεί να αποθηκευτεί σε ένα ρολόι πραγματικού χρόνου στο Wio Terminal, επιτρέποντας την ανάκτηση της σωστής ώρας αργότερα, εφόσον η συσκευή δεν χάσει την τροφοδοσία. Προσθέστε ένα νέο αρχείο που ονομάζεται `ntp.h` με τον παρακάτω κώδικα: + + ```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); + } + ``` + + Οι λεπτομέρειες αυτού του κώδικα είναι εκτός του πεδίου αυτού του μαθήματος. Ορίζει μια συνάρτηση που ονομάζεται `initTime` που λαμβάνει την τρέχουσα ώρα από έναν NTP server και τη χρησιμοποιεί για να ρυθμίσει το ρολόι στο Wio Terminal. + +1. Ανοίξτε το αρχείο `main.cpp` και αφαιρέστε όλο τον κώδικα MQTT, συμπεριλαμβανομένου του αρχείου κεφαλίδας `PubSubClient.h`, της δήλωσης της μεταβλητής `PubSubClient`, των μεθόδων `reconnectMQTTClient` και `createMQTTClient`, και οποιωνδήποτε κλήσεων σε αυτές τις μεταβλητές και μεθόδους. Αυτό το αρχείο θα πρέπει να περιέχει μόνο κώδικα για τη σύνδεση στο WiFi, τη λήψη της υγρασίας του εδάφους και τη δημιουργία ενός JSON εγγράφου με αυτήν. + +1. Προσθέστε τις παρακάτω οδηγίες `#include` στην κορυφή του αρχείου `main.cpp` για να συμπεριλάβετε αρχεία κεφαλίδας για τις βιβλιοθήκες IoT Hub και για τη ρύθμιση της ώρας: + + ```cpp + #include + #include + #include + #include "ntp.h" + ``` + +1. Προσθέστε την παρακάτω κλήση στο τέλος της συνάρτησης `setup` για να ρυθμίσετε την τρέχουσα ώρα: + + ```cpp + initTime(); + ``` + +1. Προσθέστε την παρακάτω δήλωση μεταβλητής στην κορυφή του αρχείου, ακριβώς κάτω από τις οδηγίες `include`: + + ```cpp + IOTHUB_DEVICE_CLIENT_LL_HANDLE _device_ll_handle; + ``` + + Αυτό δηλώνει ένα `IOTHUB_DEVICE_CLIENT_LL_HANDLE`, μια λαβή για τη σύνδεση με το IoT Hub. + +1. Κάτω από αυτό, προσθέστε τον παρακάτω κώδικα: + + ```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"); + } + } + ``` + + Αυτό δηλώνει μια συνάρτηση επιστροφής που θα καλείται όταν η σύνδεση με το IoT Hub αλλάζει κατάσταση, όπως σύνδεση ή αποσύνδεση. Η κατάσταση αποστέλλεται στη σειριακή θύρα. + +1. Κάτω από αυτό, προσθέστε μια συνάρτηση για τη σύνδεση με το 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); + } + ``` + + Αυτός ο κώδικας αρχικοποιεί τον κώδικα της βιβλιοθήκης IoT Hub και στη συνέχεια δημιουργεί μια σύνδεση χρησιμοποιώντας τη συμβολοσειρά σύνδεσης στο αρχείο κεφαλίδας `config.h`. Αυτή η σύνδεση βασίζεται στο MQTT. Εάν η σύνδεση αποτύχει, αυτό αποστέλλεται στη σειριακή θύρα - αν το δείτε στην έξοδο, ελέγξτε τη συμβολοσειρά σύνδεσης. Τέλος, η συνάρτηση επιστροφής κατάστασης σύνδεσης ρυθμίζεται. + +1. Καλέστε αυτήν τη συνάρτηση στη συνάρτηση `setup` κάτω από την κλήση στη `initTime`: + + ```cpp + connectIoTHub(); + ``` + +1. Όπως και με τον πελάτη MQTT, αυτός ο κώδικας εκτελείται σε ένα μόνο νήμα, οπότε χρειάζεται χρόνο για να επεξεργαστεί μηνύματα που αποστέλλονται από το hub και προς το hub. Προσθέστε το παρακάτω στην κορυφή της συνάρτησης `loop` για να το κάνετε αυτό: + + ```cpp + IoTHubDeviceClient_LL_DoWork(_device_ll_handle); + ``` + +1. Δημιουργήστε και ανεβάστε αυτόν τον κώδικα. Θα δείτε τη σύνδεση στη σειριακή οθόνη: + + ```output + Connecting to WiFi.. + Connected! + Fetched NTP epoch time is: 1619983687 + Sending telemetry {"soil_moisture":391} + The device client is connected to iothub + ``` + + Στην έξοδο μπορείτε να δείτε την ώρα NTP να λαμβάνεται, ακολουθούμενη από τη σύνδεση του πελάτη της συσκευής. Μπορεί να χρειαστούν μερικά δευτερόλεπτα για να συνδεθεί, οπότε μπορεί να δείτε την υγρασία του εδάφους στην έξοδο ενώ η συσκευή συνδέεται. + + > 💁 Μπορείτε να μετατρέψετε την ώρα UNIX για το NTP σε μια πιο ευανάγνωστη μορφή χρησιμοποιώντας έναν ιστότοπο όπως το [unixtimestamp.com](https://www.unixtimestamp.com). + +## Αποστολή τηλεμετρίας + +Τώρα που η συσκευή σας είναι συνδεδεμένη, μπορείτε να στείλετε τηλεμετρία στο IoT Hub αντί για τον MQTT broker. + +### Εργασία - αποστολή τηλεμετρίας + +1. Προσθέστε την παρακάτω συνάρτηση πάνω από τη συνάρτηση `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); + } + ``` + + Αυτός ο κώδικας δημιουργεί ένα μήνυμα IoT Hub από μια συμβολοσειρά που περνά ως παράμετρος, το στέλνει στο hub και στη συνέχεια καθαρίζει το αντικείμενο μηνύματος. + +1. Καλέστε αυτόν τον κώδικα στη συνάρτηση `loop`, ακριβώς μετά τη γραμμή όπου η τηλεμετρία αποστέλλεται στη σειριακή θύρα: + + ```cpp + sendTelemetry(telemetry.c_str()); + ``` + +## Διαχείριση εντολών + +Η συσκευή σας πρέπει να διαχειρίζεται μια εντολή από τον κώδικα του server για τον έλεγχο του ρελέ. Αυτό αποστέλλεται ως αίτημα άμεσης μεθόδου. + +## Εργασία - διαχείριση αιτήματος άμεσης μεθόδου + +1. Προσθέστε τον παρακάτω κώδικα πριν από τη συνάρτηση `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); + } + } + ``` + + Αυτός ο κώδικας ορίζει μια μέθοδο επιστροφής που η βιβλιοθήκη IoT Hub μπορεί να καλέσει όταν λαμβάνει ένα αίτημα άμεσης μεθόδου. Η μέθοδος που ζητείται αποστέλλεται στην παράμετρο `method_name`. Αυτή η συνάρτηση εκτυπώνει τη μέθοδο που καλείται στη σειριακή θύρα και στη συνέχεια ενεργοποιεί ή απενεργοποιεί το ρελέ ανάλογα με το όνομα της μεθόδου. + + > 💁 Αυτό θα μπορούσε επίσης να υλοποιηθεί σε ένα μόνο αίτημα άμεσης μεθόδου, περνώντας την επιθυμητή κατάσταση του ρελέ σε ένα payload που μπορεί να περάσει με το αίτημα μεθόδου και να είναι διαθέσιμο από την παράμετρο `payload`. + +1. Προσθέστε τον παρακάτω κώδικα στο τέλος της συνάρτησης `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; + ``` + + Τα αιτήματα άμεσης μεθόδου χρειάζονται μια απάντηση, και η απάντηση είναι σε δύο μέρη - μια απάντηση ως κείμενο και ένας κωδικός επιστροφής. Αυτός ο κώδικας θα δημιουργήσει ένα αποτέλεσμα ως το παρακάτω JSON έγγραφο: + + ```JSON + { + "Result": "" + } + ``` + + Αυτό στη συνέχεια αντιγράφεται στην παράμετρο `response` και το μέγεθος αυτής της απάντησης ορίζεται στην παράμετρο `response_size`. Αυτός ο κώδικας στη συνέχεια επιστρέφει `IOTHUB_CLIENT_OK` για να δείξει ότι η μέθοδος χειρίστηκε σωστά. + +1. Συνδέστε τη συνάρτηση επιστροφής προσθέτοντας το παρακάτω στο τέλος της συνάρτησης `connectIoTHub`: + + ```cpp + IoTHubClient_LL_SetDeviceMethodCallback(_device_ll_handle, directMethodCallback, NULL); + ``` + +1. Η συνάρτηση `loop` θα καλεί τη συνάρτηση `IoTHubDeviceClient_LL_DoWork` για να επεξεργαστεί γεγονότα που αποστέλλονται από το IoT Hub. Αυτό καλείται μόνο κάθε 10 δευτερόλεπτα λόγω της `delay`, που σημαίνει ότι οι άμεσες μέθοδοι επεξεργάζονται μόνο κάθε 10 δευτερόλεπτα. Για να γίνει αυτό πιο αποτελεσματικό, η καθυστέρηση των 10 δευτερολέπτων μπορεί να υλοποιηθεί ως πολλές μικρότερες καθυστερήσεις, καλώντας τη `IoTHubDeviceClient_LL_DoWork` κάθε φορά. Για να το κάνετε αυτό, προσθέστε τον παρακάτω κώδικα πάνω από τη συνάρτηση `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); + } + ``` + + Αυτός ο κώδικας θα επαναλαμβάνεται συνεχώς, καλώντας τη `IoTHubDeviceClient_LL_DoWork` και καθυστερώντας για 100ms κάθε φορά. Θα το κάνει αυτό όσες φορές χρειάζεται για να καθυστερήσει για το χρονικό διάστημα που δίνεται στην παράμετρο `delay_time`. Αυτό σημαίνει ότι η συσκευή περιμένει το πολύ 100ms για να επεξεργαστεί αιτήματα άμεσης μεθόδου. + +1. Στη συνάρτηση `loop`, αφαιρέστε την κλήση στη `IoTHubDeviceClient_LL_DoWork` και αντικαταστήστε την κλήση `delay(10000)` με το παρακάτω για να καλέσετε αυτήν τη νέα συνάρτηση: + + ```cpp + work_delay(10000); + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code/wio-terminal](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal). + +😀 Το πρόγραμμα του αισθητήρα υγρασίας του εδάφους σας είναι συνδεδεμένο με το IoT Hub σας! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/5-migrate-application-to-the-cloud/README.md b/translations/el/2-farm/lessons/5-migrate-application-to-the-cloud/README.md new file mode 100644 index 00000000..04d406a2 --- /dev/null +++ b/translations/el/2-farm/lessons/5-migrate-application-to-the-cloud/README.md @@ -0,0 +1,613 @@ + +# Μεταφέρετε τη λογική της εφαρμογής σας στο cloud + +![Σχεδιάγραμμα επισκόπησης αυτού του μαθήματος](../../../../../translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.el.jpg) + +> Σχεδιάγραμμα από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +Αυτό το μάθημα διδάχθηκε ως μέρος της σειράς [IoT for Beginners Project 2 - Digital Agriculture](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) από το [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Ελέγξτε τη συσκευή IoT σας με serverless κώδικα](https://img.youtube.com/vi/VVZDcs5u1_I/0.jpg)](https://youtu.be/VVZDcs5u1_I) + +## Ερωτηματολόγιο πριν το μάθημα + +[Ερωτηματολόγιο πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/17) + +## Εισαγωγή + +Στο προηγούμενο μάθημα, μάθατε πώς να συνδέσετε την παρακολούθηση υγρασίας του εδάφους των φυτών σας και τον έλεγχο του ρελέ σε μια υπηρεσία IoT που βασίζεται στο cloud. Το επόμενο βήμα είναι να μεταφέρετε τον κώδικα του server που ελέγχει το χρονισμό του ρελέ στο cloud. Σε αυτό το μάθημα θα μάθετε πώς να το κάνετε αυτό χρησιμοποιώντας serverless functions. + +Σε αυτό το μάθημα θα καλύψουμε: + +* [Τι είναι το serverless;](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Δημιουργία μιας serverless εφαρμογής](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Δημιουργία ενός event trigger για IoT Hub](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Αποστολή αιτημάτων direct method από serverless κώδικα](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Ανάπτυξη του serverless κώδικα σας στο cloud](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) + +## Τι είναι το serverless; + +Το serverless, ή serverless computing, περιλαμβάνει τη δημιουργία μικρών μπλοκ κώδικα που εκτελούνται στο cloud ως απάντηση σε διάφορα είδη γεγονότων. Όταν συμβαίνει το γεγονός, ο κώδικας σας εκτελείται και λαμβάνει δεδομένα σχετικά με το γεγονός. Αυτά τα γεγονότα μπορεί να προέρχονται από διάφορες πηγές, όπως αιτήματα web, μηνύματα σε μια ουρά, αλλαγές δεδομένων σε μια βάση δεδομένων ή μηνύματα που αποστέλλονται σε μια υπηρεσία IoT από συσκευές IoT. + +![Γεγονότα που αποστέλλονται από μια υπηρεσία IoT σε μια serverless υπηρεσία, όλα επεξεργάζονται ταυτόχρονα από πολλαπλές λειτουργίες](../../../../../translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.el.png) + +> 💁 Αν έχετε χρησιμοποιήσει triggers σε βάσεις δεδομένων, μπορείτε να το σκεφτείτε ως κάτι αντίστοιχο: κώδικας που ενεργοποιείται από ένα γεγονός, όπως η εισαγωγή μιας γραμμής. + +![Όταν πολλά γεγονότα αποστέλλονται ταυτόχρονα, η serverless υπηρεσία κλιμακώνεται για να τα επεξεργαστεί όλα ταυτόχρονα](../../../../../translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.el.png) + +Ο κώδικας σας εκτελείται μόνο όταν συμβαίνει το γεγονός, δεν παραμένει ενεργός σε άλλες στιγμές. Το γεγονός συμβαίνει, ο κώδικας σας φορτώνεται και εκτελείται. Αυτό καθιστά το serverless πολύ κλιμακούμενο - αν πολλά γεγονότα συμβούν ταυτόχρονα, ο πάροχος cloud μπορεί να εκτελέσει τη λειτουργία σας όσες φορές χρειαστεί ταυτόχρονα, χρησιμοποιώντας τους διαθέσιμους servers. Το μειονέκτημα είναι ότι αν χρειαστεί να μοιραστείτε πληροφορίες μεταξύ των γεγονότων, πρέπει να τις αποθηκεύσετε κάπου, όπως σε μια βάση δεδομένων, αντί να τις κρατάτε στη μνήμη. + +Ο κώδικας σας γράφεται ως μια λειτουργία που λαμβάνει λεπτομέρειες για το γεγονός ως παράμετρο. Μπορείτε να χρησιμοποιήσετε μια ευρεία γκάμα γλωσσών προγραμματισμού για να γράψετε αυτές τις serverless λειτουργίες. + +> 🎓 Το serverless αναφέρεται επίσης ως Functions as a Service (FaaS), καθώς κάθε trigger γεγονότος υλοποιείται ως μια λειτουργία στον κώδικα. + +Παρά το όνομα, το serverless χρησιμοποιεί πράγματι servers. Το όνομα προέρχεται από το γεγονός ότι ως προγραμματιστής δεν χρειάζεται να ασχοληθείτε με τους servers που απαιτούνται για την εκτέλεση του κώδικα σας, το μόνο που σας ενδιαφέρει είναι ότι ο κώδικας σας εκτελείται ως απάντηση σε ένα γεγονός. Ο πάροχος cloud διαθέτει ένα serverless *runtime* που διαχειρίζεται την κατανομή servers, δικτύωσης, αποθήκευσης, CPU, μνήμης και όλων των άλλων που χρειάζονται για την εκτέλεση του κώδικα σας. Αυτό το μοντέλο σημαίνει ότι δεν πληρώνετε ανά server για την υπηρεσία, καθώς δεν υπάρχει server. Αντίθετα, πληρώνετε για τον χρόνο που ο κώδικας σας εκτελείται και για την ποσότητα μνήμης που χρησιμοποιείται. + +> 💰 Το serverless είναι ένας από τους πιο οικονομικούς τρόπους εκτέλεσης κώδικα στο cloud. Για παράδειγμα, τη στιγμή που γράφεται αυτό, ένας πάροχος cloud επιτρέπει σε όλες τις serverless λειτουργίες σας να εκτελούνται συνολικά 1.000.000 φορές το μήνα πριν αρχίσει να σας χρεώνει, και μετά από αυτό χρεώνει 0,20 USD για κάθε 1.000.000 εκτελέσεις. Όταν ο κώδικας σας δεν εκτελείται, δεν πληρώνετε. + +Ως προγραμματιστής IoT, το serverless μοντέλο είναι ιδανικό. Μπορείτε να γράψετε μια λειτουργία που καλείται ως απάντηση σε μηνύματα που αποστέλλονται από οποιαδήποτε συσκευή IoT συνδεδεμένη στην υπηρεσία IoT που φιλοξενείται στο cloud. Ο κώδικας σας θα χειρίζεται όλα τα μηνύματα που αποστέλλονται, αλλά θα εκτελείται μόνο όταν χρειάζεται. + +✅ Ανατρέξτε στον κώδικα που γράψατε ως server κώδικα που ακούει μηνύματα μέσω MQTT. Πώς θα μπορούσε να εκτελεστεί στο cloud χρησιμοποιώντας serverless; Πώς πιστεύετε ότι ο κώδικας θα μπορούσε να τροποποιηθεί για να υποστηρίξει το serverless computing; + +> 💁 Το serverless μοντέλο επεκτείνεται και σε άλλες υπηρεσίες cloud εκτός από την εκτέλεση κώδικα. Για παράδειγμα, serverless βάσεις δεδομένων είναι διαθέσιμες στο cloud χρησιμοποιώντας ένα serverless μοντέλο τιμολόγησης, όπου πληρώνετε ανά αίτημα που γίνεται στη βάση δεδομένων, όπως ένα query ή μια εισαγωγή, συνήθως με τιμολόγηση που βασίζεται στο πόση εργασία απαιτείται για την εξυπηρέτηση του αιτήματος. Για παράδειγμα, μια απλή επιλογή μιας γραμμής με βάση ένα primary key θα κοστίσει λιγότερο από μια περίπλοκη λειτουργία που ενώνει πολλούς πίνακες και επιστρέφει χιλιάδες γραμμές. + +## Δημιουργία μιας serverless εφαρμογής + +Η υπηρεσία serverless computing της Microsoft ονομάζεται Azure Functions. + +![Το λογότυπο του Azure Functions](../../../../../translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.el.png) + +Το σύντομο βίντεο παρακάτω παρέχει μια επισκόπηση του Azure Functions. + +[![Βίντεο επισκόπησης του Azure Functions](https://img.youtube.com/vi/8-jz5f_JyEQ/0.jpg)](https://www.youtube.com/watch?v=8-jz5f_JyEQ) + +> 🎥 Κάντε κλικ στην εικόνα παραπάνω για να παρακολουθήσετε το βίντεο. + +✅ Αφιερώστε λίγο χρόνο για να κάνετε έρευνα και να διαβάσετε την επισκόπηση του Azure Functions στη [τεκμηρίωση του Microsoft Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-overview?WT.mc_id=academic-17441-jabenn). + +Για να γράψετε Azure Functions, ξεκινάτε με μια εφαρμογή Azure Functions στη γλώσσα της επιλογής σας. Το Azure Functions υποστηρίζει εξ ορισμού Python, JavaScript, TypeScript, C#, F#, Java και Powershell. Σε αυτό το μάθημα θα μάθετε πώς να γράψετε μια εφαρμογή Azure Functions σε Python. + +> 💁 Το Azure Functions υποστηρίζει επίσης custom handlers, ώστε να μπορείτε να γράψετε τις λειτουργίες σας σε οποιαδήποτε γλώσσα υποστηρίζει HTTP αιτήματα, συμπεριλαμβανομένων παλαιότερων γλωσσών όπως η COBOL. + +Οι εφαρμογές Functions αποτελούνται από ένα ή περισσότερα *triggers* - λειτουργίες που ανταποκρίνονται σε γεγονότα. Μπορείτε να έχετε πολλαπλά triggers μέσα σε μια εφαρμογή Functions, όλα μοιράζονται κοινή διαμόρφωση. Για παράδειγμα, στο αρχείο διαμόρφωσης της εφαρμογής Functions μπορείτε να έχετε τις λεπτομέρειες σύνδεσης του IoT Hub σας, και όλες οι λειτουργίες στην εφαρμογή μπορούν να χρησιμοποιήσουν αυτές τις λεπτομέρειες για να συνδεθούν και να ακούσουν για γεγονότα. + +### Εργασία - εγκατάσταση των εργαλείων Azure Functions + +> Τη στιγμή που γράφεται αυτό, τα εργαλεία κώδικα του Azure Functions δεν λειτουργούν πλήρως σε Apple Silicon με έργα Python. Θα χρειαστεί να χρησιμοποιήσετε έναν Mac με Intel, έναν υπολογιστή Windows ή έναν υπολογιστή Linux. + +Ένα εξαιρετικό χαρακτηριστικό του Azure Functions είναι ότι μπορείτε να τα εκτελέσετε τοπικά. Το ίδιο runtime που χρησιμοποιείται στο cloud μπορεί να εκτελεστεί στον υπολογιστή σας, επιτρέποντάς σας να γράψετε κώδικα που ανταποκρίνεται σε μηνύματα IoT και να τον εκτελέσετε τοπικά. Μπορείτε ακόμη και να κάνετε debug στον κώδικα σας καθώς χειρίζεται γεγονότα. Μόλις είστε ικανοποιημένοι με τον κώδικα σας, μπορείτε να τον αναπτύξετε στο cloud. + +Τα εργαλεία Azure Functions είναι διαθέσιμα ως CLI, γνωστά ως Azure Functions Core Tools. + +1. Εγκαταστήστε τα Azure Functions Core Tools ακολουθώντας τις οδηγίες στη [τεκμηρίωση του Azure Functions Core Tools](https://docs.microsoft.com/azure/azure-functions/functions-run-local?WT.mc_id=academic-17441-jabenn). + +1. Εγκαταστήστε την επέκταση Azure Functions για το VS Code. Αυτή η επέκταση παρέχει υποστήριξη για τη δημιουργία, το debugging και την ανάπτυξη Azure Functions. Ανατρέξτε στη [τεκμηρίωση της επέκτασης Azure Functions](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-azuretools.vscode-azurefunctions) για οδηγίες σχετικά με την εγκατάσταση αυτής της επέκτασης στο VS Code. + +Όταν αναπτύσσετε την εφαρμογή Azure Functions σας στο cloud, χρειάζεται να χρησιμοποιήσει μια μικρή ποσότητα αποθήκευσης στο cloud για να αποθηκεύσει πράγματα όπως τα αρχεία της εφαρμογής και τα αρχεία καταγραφής. Όταν εκτελείτε την εφαρμογή Functions σας τοπικά, πρέπει να συνδεθείτε σε αποθήκευση cloud, αλλά αντί να χρησιμοποιήσετε πραγματική αποθήκευση cloud, μπορείτε να χρησιμοποιήσετε έναν εξομοιωτή αποθήκευσης που ονομάζεται [Azurite](https://github.com/Azure/Azurite). Αυτός εκτελείται τοπικά αλλά λειτουργεί σαν αποθήκευση cloud. + +> 🎓 Στο Azure, η αποθήκευση που χρησιμοποιεί το Azure Functions είναι ένας Azure Storage Account. Αυτοί οι λογαριασμοί μπορούν να αποθηκεύουν αρχεία, blobs, δεδομένα σε πίνακες ή δεδομένα σε ουρές. Μπορείτε να μοιραστείτε έναν λογαριασμό αποθήκευσης μεταξύ πολλών εφαρμογών, όπως μια εφαρμογή Functions και μια web εφαρμογή. + +1. Το Azurite είναι μια εφαρμογή Node.js, οπότε θα χρειαστεί να εγκαταστήσετε το Node.js. Μπορείτε να βρείτε τις οδηγίες λήψης και εγκατάστασης στον [ιστότοπο του Node.js](https://nodejs.org/). Αν χρησιμοποιείτε Mac, μπορείτε επίσης να το εγκαταστήσετε από το [Homebrew](https://formulae.brew.sh/formula/node). + +1. Εγκαταστήστε το Azurite χρησιμοποιώντας την παρακάτω εντολή (`npm` είναι ένα εργαλείο που εγκαθίσταται όταν εγκαθιστάτε το Node.js): + + ```sh + npm install -g azurite + ``` + +1. Δημιουργήστε έναν φάκελο που ονομάζεται `azurite` για να χρησιμοποιήσει το Azurite για την αποθήκευση δεδομένων: + + ```sh + mkdir azurite + ``` + +1. Εκτελέστε το Azurite, περνώντας του αυτόν τον νέο φάκελο: + + ```sh + azurite --location azurite + ``` + + Ο εξομοιωτής αποθήκευσης Azurite θα ξεκινήσει και θα είναι έτοιμος για σύνδεση από το τοπικό runtime 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 + ``` + +### Εργασία - δημιουργία ενός έργου Azure Functions + +Το CLI του Azure Functions μπορεί να χρησιμοποιηθεί για τη δημιουργία μιας νέας εφαρμογής Functions. + +1. Δημιουργήστε έναν φάκελο για την εφαρμογή Functions σας και μεταβείτε σε αυτόν. Ονομάστε τον `soil-moisture-trigger`. + + ```sh + mkdir soil-moisture-trigger + cd soil-moisture-trigger + ``` + +1. Δημιουργήστε ένα εικονικό περιβάλλον Python μέσα σε αυτόν τον φάκελο: + + ```sh + python3 -m venv .venv + ``` + +1. Ενεργοποιήστε το εικονικό περιβάλλον: + + * Στα Windows: + * Αν χρησιμοποιείτε το Command Prompt ή το Command Prompt μέσω του Windows Terminal, εκτελέστε: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Αν χρησιμοποιείτε PowerShell, εκτελέστε: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + * Σε macOS ή Linux, εκτελέστε: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Αυτές οι εντολές πρέπει να εκτελούνται από την ίδια τοποθεσία που εκτελέσατε την εντολή για τη δημιουργία του εικονικού περιβάλλοντος. Δεν θα χρειαστεί ποτέ να μεταβείτε στον φάκελο `.venv`, θα πρέπει πάντα να εκτελείτε την εντολή ενεργοποίησης και οποιεσδήποτε εντολές για την εγκατάσταση πακέτων ή την εκτέλεση κώδικα από τον φάκελο που ήσασταν όταν δημιουργήσατε το εικονικό περιβάλλον. + +1. Εκτελέστε την παρακάτω εντολή για να δημιουργήσετε μια εφαρμογή Functions σε αυτόν τον φάκελο: + + ```sh + func init --worker-runtime python soil-moisture-trigger + ``` + + Αυτό θα δημιουργήσει τρία αρχεία μέσα στον τρέχοντα φάκελο: + + * `host.json` - αυτό το JSON έγγραφο περιέχει ρυθμίσεις για την εφαρμογή Functions σας. Δεν θα χρειαστεί να τροποποιήσετε αυτές τις ρυθμίσεις. + * `local.settings.json` - αυτό το JSON έγγραφο περιέχει ρυθμίσεις που η εφαρμογή σας θα χρησιμοποιεί όταν εκτελείται τοπικά, όπως strings σύνδεσης για το IoT Hub σας. Αυτές οι ρυθμίσεις είναι μόνο τοπικές και δεν πρέπει να προστεθούν στον έλεγχο πηγαίου κώδικα. Όταν αναπτύσσετε την εφαρμογή στο cloud, αυτές οι ρυθμίσεις δεν αναπτύσσονται, αντίθετα οι ρυθμίσεις σας φορτώνονται από τις ρυθμίσεις εφαρμογής. Αυτό θα καλυφθεί αργότερα σε αυτό το μάθημα. + * `requirements.txt` - αυτό είναι ένα [Pip requirements αρχείο](https://pip.pypa.io/en/stable/user_guide/#requirements-files) που περιέχει τα Pip πακέτα που χρειάζονται για την εκτέλεση της εφαρμογής Functions σας. + +1. Το αρχείο `local.settings.json` έχει μια ρύθμιση για τον λογαριασμό αποθήκευσης που θα χρησιμοποιήσει η εφαρμογή Functions. Αυτό προεπιλέγεται σε μια κενή ρύθμιση, οπότε πρέπει να οριστεί. Για να συνδεθείτε στον τοπικό εξομοιωτή αποθήκευσης Azurite, ορίστε αυτήν την τιμή ως εξής: + + ```json + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + ``` + +1. Εγκαταστήστε τα απαραίτητα Pip πακέτα χρησιμοποιώντας το αρχείο requirements: + + ```sh + pip install -r requirements.txt + ``` + + > 💁 Τα απαραίτητα Pip πακέτα πρέπει να βρίσκονται σε αυτό το αρχείο, ώστε όταν η εφαρμογή Functions αναπτύσσεται στο cloud, το runtime να μπορεί να διασφαλίσει ότι εγκαθιστά τα σωστά πακέτα. + +1. Για να δοκιμάσετε ότι όλα λειτουργούν σωστά, μπορείτε να ξεκινήσετε το +> ⚠️ Εάν λάβετε ειδοποίηση από το τείχος προστασίας, δώστε άδεια καθώς η εφαρμογή `func` χρειάζεται να έχει δυνατότητα ανάγνωσης και εγγραφής στο δίκτυό σας. +> ⚠️ Εάν χρησιμοποιείτε macOS, μπορεί να εμφανιστούν προειδοποιήσεις στην έξοδο: +> +> ```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. + > ``` +> +> Μπορείτε να τις αγνοήσετε, αρκεί η εφαρμογή Functions να ξεκινά σωστά και να εμφανίζει τις τρέχουσες λειτουργίες. Όπως αναφέρεται [σε αυτήν την ερώτηση στο 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), αυτές οι προειδοποιήσεις μπορούν να αγνοηθούν. + +1. Σταματήστε την εφαρμογή Functions πατώντας `ctrl+c`. + +1. Ανοίξτε τον τρέχοντα φάκελο στο VS Code, είτε ανοίγοντας το VS Code και στη συνέχεια αυτόν τον φάκελο, είτε εκτελώντας την ακόλουθη εντολή: + + ```sh + code . + ``` + + Το VS Code θα εντοπίσει το έργο Functions και θα εμφανίσει μια ειδοποίηση που λέει: + + ```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? + ``` + + ![Η ειδοποίηση](../../../../../translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.el.png) + + Επιλέξτε **Ναι** από αυτήν την ειδοποίηση. + +1. Βεβαιωθείτε ότι το Python virtual environment εκτελείται στο τερματικό του VS Code. Τερματίστε το και επανεκκινήστε το αν χρειάζεται. + +## Δημιουργία ενεργοποιητή συμβάντων IoT Hub + +Η εφαρμογή Functions είναι το κέλυφος του serverless κώδικα σας. Για να ανταποκριθείτε σε συμβάντα του IoT Hub, μπορείτε να προσθέσετε έναν ενεργοποιητή IoT Hub σε αυτήν την εφαρμογή. Αυτός ο ενεργοποιητής πρέπει να συνδεθεί στη ροή μηνυμάτων που αποστέλλονται στο IoT Hub και να ανταποκριθεί σε αυτά. Για να λάβετε αυτήν τη ροή μηνυμάτων, ο ενεργοποιητής σας πρέπει να συνδεθεί στο *event hub compatible endpoint* του IoT Hub. + +Το IoT Hub βασίζεται σε μια άλλη υπηρεσία Azure που ονομάζεται Azure Event Hubs. Το Event Hubs είναι μια υπηρεσία που σας επιτρέπει να στέλνετε και να λαμβάνετε μηνύματα, ενώ το IoT Hub επεκτείνει αυτήν τη λειτουργία προσθέτοντας δυνατότητες για συσκευές IoT. Ο τρόπος σύνδεσης για την ανάγνωση μηνυμάτων από το IoT Hub είναι ίδιος με αυτόν που θα χρησιμοποιούσατε αν χρησιμοποιούσατε το Event Hubs. + +✅ Κάντε λίγη έρευνα: Διαβάστε την επισκόπηση του Event Hubs στη [τεκμηρίωση του Azure Event Hubs](https://docs.microsoft.com/azure/event-hubs/event-hubs-about?WT.mc_id=academic-17441-jabenn). Πώς συγκρίνονται οι βασικές δυνατότητες με το IoT Hub; + +Για να συνδεθεί μια συσκευή IoT στο IoT Hub, πρέπει να χρησιμοποιήσει ένα μυστικό κλειδί που διασφαλίζει ότι μόνο επιτρεπόμενες συσκευές μπορούν να συνδεθούν. Το ίδιο ισχύει και όταν συνδέεστε για να διαβάσετε μηνύματα. Ο κώδικάς σας θα χρειαστεί μια συμβολοσειρά σύνδεσης που περιέχει ένα μυστικό κλειδί, μαζί με λεπτομέρειες του IoT Hub. + +> 💁 Η προεπιλεγμένη συμβολοσειρά σύνδεσης που λαμβάνετε έχει δικαιώματα **iothubowner**, που δίνουν σε οποιονδήποτε κώδικα τη χρησιμοποιεί πλήρη δικαιώματα στο IoT Hub. Ιδανικά, θα πρέπει να συνδεθείτε με το χαμηλότερο επίπεδο δικαιωμάτων που απαιτείται. Αυτό θα καλυφθεί στο επόμενο μάθημα. + +Μόλις ο ενεργοποιητής σας συνδεθεί, ο κώδικας μέσα στη λειτουργία θα καλείται για κάθε μήνυμα που αποστέλλεται στο IoT Hub, ανεξάρτητα από τη συσκευή που το έστειλε. Ο ενεργοποιητής θα περάσει το μήνυμα ως παράμετρο. + +### Εργασία - λήψη της συμβολοσειράς σύνδεσης του Event Hub compatible endpoint + +1. Από το τερματικό του VS Code, εκτελέστε την ακόλουθη εντολή για να λάβετε τη συμβολοσειρά σύνδεσης για το Event Hub compatible endpoint του IoT Hub: + + ```sh + az iot hub connection-string show --default-eventhub \ + --output table \ + --hub-name + ``` + + Αντικαταστήστε το `` με το όνομα που χρησιμοποιήσατε για το IoT Hub. + +1. Στο VS Code, ανοίξτε το αρχείο `local.settings.json`. Προσθέστε την ακόλουθη επιπλέον τιμή μέσα στην ενότητα `Values`: + + ```json + "IOT_HUB_CONNECTION_STRING": "" + ``` + + Αντικαταστήστε το `` με την τιμή από το προηγούμενο βήμα. Θα χρειαστεί να προσθέσετε ένα κόμμα μετά την προηγούμενη γραμμή για να είναι έγκυρο το JSON. + +### Εργασία - δημιουργία ενεργοποιητή συμβάντων + +Είστε πλέον έτοιμοι να δημιουργήσετε τον ενεργοποιητή συμβάντων. + +1. Από το τερματικό του VS Code, εκτελέστε την ακόλουθη εντολή από τον φάκελο `soil-moisture-trigger`: + + ```sh + func new --name iot-hub-trigger --template "Azure Event Hub trigger" + ``` + + Αυτό δημιουργεί μια νέα λειτουργία που ονομάζεται `iot-hub-trigger`. Ο ενεργοποιητής θα συνδεθεί στο Event Hub compatible endpoint του IoT Hub, ώστε να μπορείτε να χρησιμοποιήσετε έναν ενεργοποιητή event hub. Δεν υπάρχει συγκεκριμένος ενεργοποιητής IoT Hub. + +Αυτό θα δημιουργήσει έναν φάκελο μέσα στον φάκελο `soil-moisture-trigger` που ονομάζεται `iot-hub-trigger` και περιέχει αυτήν τη λειτουργία. Αυτός ο φάκελος θα περιέχει τα ακόλουθα αρχεία: + +* `__init__.py` - αυτό είναι το αρχείο κώδικα Python που περιέχει τον ενεργοποιητή, χρησιμοποιώντας τη συμβατική ονομασία αρχείων Python για να μετατρέψει αυτόν τον φάκελο σε Python module. + + Αυτό το αρχείο θα περιέχει τον ακόλουθο κώδικα: + + ```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')) + ``` + + Ο πυρήνας του ενεργοποιητή είναι η συνάρτηση `main`. Αυτή η συνάρτηση καλείται με τα συμβάντα από το IoT Hub. Η συνάρτηση έχει μια παράμετρο που ονομάζεται `event` και περιέχει ένα `EventHubEvent`. Κάθε φορά που ένα μήνυμα αποστέλλεται στο IoT Hub, αυτή η συνάρτηση καλείται περνώντας αυτό το μήνυμα ως `event`, μαζί με ιδιότητες που είναι ίδιες με τις σημειώσεις που είδατε στο προηγούμενο μάθημα. + + Ο πυρήνας αυτής της συνάρτησης καταγράφει το συμβάν. + +* `function.json` - αυτό περιέχει τη διαμόρφωση για τον ενεργοποιητή. Η κύρια διαμόρφωση βρίσκεται σε μια ενότητα που ονομάζεται `bindings`. Ένα binding είναι ο όρος για τη σύνδεση μεταξύ των Azure Functions και άλλων υπηρεσιών Azure. Αυτή η λειτουργία έχει ένα input binding σε ένα event hub - συνδέεται σε ένα event hub και λαμβάνει δεδομένα. + + > 💁 Μπορείτε επίσης να έχετε output bindings, ώστε η έξοδος μιας λειτουργίας να αποστέλλεται σε άλλη υπηρεσία. Για παράδειγμα, θα μπορούσατε να προσθέσετε ένα output binding σε μια βάση δεδομένων και να επιστρέψετε το συμβάν του IoT Hub από τη λειτουργία, και αυτό θα εισαχθεί αυτόματα στη βάση δεδομένων. + + ✅ Κάντε λίγη έρευνα: Διαβάστε για τα bindings στη [τεκμηρίωση των triggers και bindings των Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings?WT.mc_id=academic-17441-jabenn&tabs=python). + + Η ενότητα `bindings` περιλαμβάνει τη διαμόρφωση για το binding. Οι τιμές ενδιαφέροντος είναι: + + * `"type": "eventHubTrigger"` - αυτό λέει στη λειτουργία ότι πρέπει να ακούει συμβάντα από ένα Event Hub + * `"name": "events"` - αυτό είναι το όνομα της παραμέτρου που θα χρησιμοποιηθεί για τα συμβάντα του Event Hub. Αυτό αντιστοιχεί στο όνομα της παραμέτρου στη συνάρτηση `main` στον κώδικα Python. + * `"direction": "in"` - αυτό είναι ένα input binding, τα δεδομένα από το event hub εισέρχονται στη λειτουργία + * `"connection": ""` - αυτό ορίζει το όνομα της ρύθμισης από την οποία θα διαβαστεί η συμβολοσειρά σύνδεσης. Κατά την τοπική εκτέλεση, αυτή η ρύθμιση θα διαβαστεί από το αρχείο `local.settings.json`. + + > 💁 Η συμβολοσειρά σύνδεσης δεν μπορεί να αποθηκευτεί στο αρχείο `function.json`, πρέπει να διαβαστεί από τις ρυθμίσεις. Αυτό γίνεται για να μην εκθέσετε κατά λάθος τη συμβολοσειρά σύνδεσης. + +1. Λόγω [ενός σφάλματος στο πρότυπο των Azure Functions](https://github.com/Azure/azure-functions-templates/issues/1250), το `function.json` έχει μια λανθασμένη τιμή για το πεδίο `cardinality`. Ενημερώστε αυτό το πεδίο από `many` σε `one`: + + ```json + "cardinality": "one", + ``` + +1. Ενημερώστε την τιμή του `"connection"` στο αρχείο `function.json` ώστε να δείχνει στη νέα τιμή που προσθέσατε στο αρχείο `local.settings.json`: + + ```json + "connection": "IOT_HUB_CONNECTION_STRING", + ``` + + > 💁 Θυμηθείτε - αυτό πρέπει να δείχνει στη ρύθμιση, όχι να περιέχει την πραγματική συμβολοσειρά σύνδεσης. + +1. Η συμβολοσειρά σύνδεσης περιέχει την τιμή `eventHubName`, επομένως η τιμή για αυτό στο αρχείο `function.json` πρέπει να καθαριστεί. Ενημερώστε αυτήν την τιμή σε μια κενή συμβολοσειρά: + + ```json + "eventHubName": "", + ``` + +### Εργασία - εκτέλεση του ενεργοποιητή συμβάντων + +1. Βεβαιωθείτε ότι δεν εκτελείται ο παρατηρητής συμβάντων του IoT Hub. Εάν αυτό εκτελείται ταυτόχρονα με την εφαρμογή Functions, η εφαρμογή Functions δεν θα μπορεί να συνδεθεί και να καταναλώσει συμβάντα. + + > 💁 Πολλαπλές εφαρμογές μπορούν να συνδεθούν στα endpoints του IoT Hub χρησιμοποιώντας διαφορετικές *consumer groups*. Αυτά καλύπτονται σε επόμενο μάθημα. + +1. Για να εκτελέσετε την εφαρμογή Functions, εκτελέστε την ακόλουθη εντολή από το τερματικό του VS Code: + + ```sh + func start + ``` + + Η εφαρμογή Functions θα ξεκινήσει και θα ανακαλύψει τη λειτουργία `iot-hub-trigger`. Στη συνέχεια, θα επεξεργαστεί οποιαδήποτε συμβάντα έχουν ήδη αποσταλεί στο IoT Hub την τελευταία ημέρα. + + ```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) + ``` + + Κάθε κλήση στη λειτουργία θα περιβάλλεται από ένα μπλοκ `Executing 'Functions.iot-hub-trigger'`/`Executed 'Functions.iot-hub-trigger'` στην έξοδο, ώστε να μπορείτε να δείτε πόσα μηνύματα επεξεργάστηκαν σε κάθε κλήση λειτουργίας. + +1. Βεβαιωθείτε ότι η συσκευή IoT σας εκτελείται. Θα δείτε νέα μηνύματα υγρασίας εδάφους να εμφανίζονται στην εφαρμογή Functions. + +1. Σταματήστε και επανεκκινήστε την εφαρμογή Functions. Θα δείτε ότι δεν θα επεξεργαστεί ξανά προηγούμενα μηνύματα, θα επεξεργαστεί μόνο νέα μηνύματα. + +> 💁 Το VS Code υποστηρίζει επίσης την αποσφαλμάτωση των Functions σας. Μπορείτε να ορίσετε σημεία διακοπής κάνοντας κλικ στο περιθώριο δίπλα στην αρχή κάθε γραμμής κώδικα, ή τοποθετώντας τον κέρσορα σε μια γραμμή κώδικα και επιλέγοντας *Run -> Toggle breakpoint*, ή πατώντας `F9`. Μπορείτε να εκκινήσετε τον αποσφαλματωτή επιλέγοντας *Run -> Start debugging*, πατώντας `F5`, ή επιλέγοντας το *Run and debug* pane και επιλέγοντας το κουμπί **Start debugging**. Με αυτόν τον τρόπο μπορείτε να δείτε τις λεπτομέρειες των συμβάντων που επεξεργάζονται. + +#### Αντιμετώπιση προβλημάτων + +* Εάν λάβετε το ακόλουθο σφάλμα: + + ```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. + ``` + + Ελέγξτε ότι το Azurite εκτελείται και ότι έχετε ορίσει το `AzureWebJobsStorage` στο αρχείο `local.settings.json` σε `UseDevelopmentStorage=true`. + +* Εάν λάβετε το ακόλουθο σφάλμα: + + ```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' + ``` + + Ελέγξτε ότι έχετε ορίσει το `cardinality` στο αρχείο `function.json` σε `one`. + +* Εάν λάβετε το ακόλουθο σφάλμα: + + ```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'). + ``` + + Ελέγξτε ότι έχετε ορίσει το `eventHubName` στο αρχείο `function.json` σε μια κενή συμβολοσειρά. + +## Αποστολή αιτημάτων άμεσης μεθόδου από serverless κώδικα + +Μέχρι στιγμής, η εφαρμογή Functions σας ακούει μηνύματα από το IoT Hub χρησιμοποιώντας το Event Hub compatible endpoint. Τώρα πρέπει να στείλετε εντολές στη συσκευή IoT. Αυτό γίνεται χρησιμοποιώντας μια διαφορετική σύνδεση στο IoT Hub μέσω του *Registry Manager*. Το Registry Manager είναι ένα εργαλείο που σας επιτρέπει να δείτε ποιες συσκευές είναι εγγεγραμμένες στο IoT Hub και να επικοινωνήσετε με αυτές τις συσκευές στέλνοντας μηνύματα cloud-to-device, αιτήματα άμεσης μεθόδου ή ενημερώνοντας το device twin. Μπορείτε επίσης να το χρησιμοποιήσετε για να εγγράψετε, ενημερώσετε ή διαγράψετε συσκευές IoT από το IoT Hub. + +Για να συνδεθείτε στο Registry Manager, χρειάζεστε μια συμβολοσειρά σύνδεσης. + +### Εργασία - λήψη της συμβολοσειράς σύνδεσης του Registry Manager + +1. Για να λάβετε τη συμβολοσειρά σύνδεσης, εκτελέστε την ακόλουθη εντολή: + + ```sh + az iot hub connection-string show --policy-name service \ + --output table \ + --hub-name + ``` + + Αντικαταστήστε το `` με το όνομα που χρησιμοποιήσατε για το IoT Hub. + + Η συμβολοσειρά σύνδεσης ζητείται για την πολιτική *ServiceConnect* χρησιμοποιώντας την παράμετρο `--policy-name service`. Όταν ζητάτε μια συμβολοσειρά σύνδεσης, μπορείτε να καθορίσετε ποια δικαιώματα θα επιτρέπει αυτή η συμβολοσειρά. Η πολιτική ServiceConnect επιτρέπει στον κώδικά σας να συνδεθεί και να στείλει μηνύματα σε συσκευές IoT. + + ✅ Κάντε λίγη έρευνα: Διαβάστε για τις διαφορετικές πολιτικές στη [τεκμηρίωση δικαιωμάτων του IoT Hub](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-security#iot-hub-permissions?WT.mc_id=academic-17441-jabenn) + +1. Στο VS Code, ανοίξτε το αρχείο `local.settings.json`. Προσθέστε την ακόλουθη επιπλέον τιμή μέσα στην ενότητα `Values`: + + ```json + "REGISTRY_MANAGER_CONNECTION_STRING": "" + ``` + + Αντικαταστήστε το `` με την τιμή από το προηγούμενο βήμα. Θα χρειαστεί να προσθέσετε ένα κόμμα μετά την προηγούμενη γραμμή για να είναι έγκυρο το JSON. + +### Εργασία - αποστολή αιτήματος άμεσης μεθόδου σε μια συσκευή + +1. Το SDK για το Registry Manager είναι διαθέσιμο μέσω ενός πακέτου Pip. Προσθέστε την ακόλουθη γραμμή στο αρχείο `requirements.txt` για να προσθέσετε την εξάρτηση από αυτό το πακέτο: + + ```sh + azure-iot-hub + ``` + +1. Βεβαιωθείτε ότι το τερματικό του VS Code έχει ενεργοποιημένο το virtual environment και εκτελέστε την ακόλουθη εντολή για να εγκαταστήσετε τα πακέτα Pip: + + ```sh + pip install -r requirements.txt + ``` + +1. Προσθέστε τις ακόλουθες εισαγωγές στο αρχείο `__init__.py`: + + ```python + import json + import os + from azure.iot.hub import IoTHubRegistryManager + from azure.iot.hub.models import CloudToDeviceMethod + ``` + + Αυτό εισάγει κάποιες βιβλιοθήκες συστήματος, καθώς και τις βιβλιοθήκες για την αλληλεπίδραση με το Registry Manager και την αποστολή αιτημάτων άμεσης μεθόδου. + +1. Αφαιρέστε τον κώδικα από μέσα στη μέθοδο `main`, αλλά κρατήστε τη μέθοδο. + +1. Στη μέθοδο `main`, προσθέστε τον ακόλουθο κώδικα: + + ```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}') + ``` + + Αυτός ο κώδικας εξάγει το σώμα του συμβάντος που περιέχει το μήνυμα JSON που αποστέλλ +Αυτός ο κώδικας φορτώνει το `REGISTRY_MANAGER_CONNECTION_STRING` από το αρχείο `local.settings.json`. Οι τιμές σε αυτό το αρχείο είναι διαθέσιμες ως μεταβλητές περιβάλλοντος και μπορούν να διαβαστούν χρησιμοποιώντας τη συνάρτηση `os.environ`, η οποία επιστρέφει ένα λεξικό με όλες τις μεταβλητές περιβάλλοντος. + +> 💁 Όταν αυτός ο κώδικας αναπτυχθεί στο cloud, οι τιμές στο αρχείο `local.settings.json` θα οριστούν ως *Application Settings* και μπορούν να διαβαστούν από τις μεταβλητές περιβάλλοντος. + +Ο κώδικας στη συνέχεια δημιουργεί μια παρουσία της βοηθητικής κλάσης Registry Manager χρησιμοποιώντας το connection string. + +1. Προσθέστε τον παρακάτω κώδικα: + + ```python + registry_manager.invoke_device_method(device_id, direct_method) + + logging.info('Direct method request sent!') + ``` + + Αυτός ο κώδικας λέει στον registry manager να στείλει το αίτημα direct method στη συσκευή που έστειλε την τηλεμετρία. + + > 💁 Στις εκδόσεις της εφαρμογής που δημιουργήσατε σε προηγούμενα μαθήματα χρησιμοποιώντας MQTT, οι εντολές ελέγχου του ρελέ αποστέλλονταν σε όλες τις συσκευές. Ο κώδικας υπέθετε ότι θα είχατε μόνο μία συσκευή. Αυτή η έκδοση του κώδικα στέλνει το αίτημα method σε μία μόνο συσκευή, ώστε να λειτουργεί αν έχετε πολλαπλές εγκαταστάσεις αισθητήρων υγρασίας και ρελέ, στέλνοντας το σωστό αίτημα direct method στη σωστή συσκευή. + +1. Εκτελέστε την εφαρμογή Functions και βεβαιωθείτε ότι η IoT συσκευή σας στέλνει δεδομένα. Θα δείτε τα μηνύματα να επεξεργάζονται και τα αιτήματα direct method να αποστέλλονται. Μετακινήστε τον αισθητήρα υγρασίας εδάφους μέσα και έξω από το έδαφος για να δείτε τις τιμές να αλλάζουν και το ρελέ να ενεργοποιείται και να απενεργοποιείται. + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code/functions](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud/code/functions). + +## Αναπτύξτε τον serverless κώδικά σας στο cloud + +Ο κώδικάς σας λειτουργεί τώρα τοπικά, οπότε το επόμενο βήμα είναι να αναπτύξετε την εφαρμογή Functions στο cloud. + +### Εργασία - δημιουργήστε τους πόρους στο cloud + +Η εφαρμογή Functions σας πρέπει να αναπτυχθεί σε έναν πόρο Functions App στο Azure, που βρίσκεται μέσα στην Resource Group που δημιουργήσατε για το IoT Hub σας. Θα χρειαστεί επίσης να δημιουργήσετε έναν Storage Account στο Azure για να αντικαταστήσετε τον εξομοιωμένο που εκτελείτε τοπικά. + +1. Εκτελέστε την παρακάτω εντολή για να δημιουργήσετε έναν storage account: + + ```sh + az storage account create --resource-group soil-moisture-sensor \ + --sku Standard_LRS \ + --name + ``` + + Αντικαταστήστε το `` με ένα όνομα για τον storage account σας. Αυτό πρέπει να είναι μοναδικό παγκοσμίως, καθώς αποτελεί μέρος του URL που χρησιμοποιείται για την πρόσβαση στον storage account. Μπορείτε να χρησιμοποιήσετε μόνο πεζά γράμματα και αριθμούς για αυτό το όνομα, χωρίς άλλους χαρακτήρες, και είναι περιορισμένο σε 24 χαρακτήρες. Χρησιμοποιήστε κάτι όπως `sms` και προσθέστε έναν μοναδικό αναγνωριστικό στο τέλος, όπως κάποιες τυχαίες λέξεις ή το όνομά σας. + + Η επιλογή `--sku Standard_LRS` επιλέγει την κατηγορία τιμολόγησης, επιλέγοντας τον χαμηλότερο κόστος γενικού σκοπού λογαριασμό. Δεν υπάρχει δωρεάν κατηγορία αποθήκευσης και πληρώνετε για ό,τι χρησιμοποιείτε. Το κόστος είναι σχετικά χαμηλό, με την πιο ακριβή αποθήκευση να κοστίζει λιγότερο από 0,05 USD ανά μήνα ανά gigabyte αποθηκευμένο. + + ✅ Διαβάστε περισσότερα για την τιμολόγηση στη [σελίδα τιμολόγησης του Azure Storage Account](https://azure.microsoft.com/pricing/details/storage/?WT.mc_id=academic-17441-jabenn) + +1. Εκτελέστε την παρακάτω εντολή για να δημιουργήσετε ένα Function App: + + ```sh + az functionapp create --resource-group soil-moisture-sensor \ + --runtime python \ + --functions-version 3 \ + --os-type Linux \ + --consumption-plan-location \ + --storage-account \ + --name + ``` + + Αντικαταστήστε το `` με την τοποθεσία που χρησιμοποιήσατε κατά τη δημιουργία της Resource Group στο προηγούμενο μάθημα. + + Αντικαταστήστε το `` με το όνομα του storage account που δημιουργήσατε στο προηγούμενο βήμα. + + Αντικαταστήστε το `` με ένα μοναδικό όνομα για το Functions App σας. Αυτό πρέπει να είναι μοναδικό παγκοσμίως, καθώς αποτελεί μέρος ενός URL που μπορεί να χρησιμοποιηθεί για την πρόσβαση στο Functions App. Χρησιμοποιήστε κάτι όπως `soil-moisture-sensor-` και προσθέστε έναν μοναδικό αναγνωριστικό στο τέλος, όπως κάποιες τυχαίες λέξεις ή το όνομά σας. + + Η επιλογή `--functions-version 3` ορίζει την έκδοση του Azure Functions που θα χρησιμοποιηθεί. Η έκδοση 3 είναι η πιο πρόσφατη έκδοση. + + Η επιλογή `--os-type Linux` λέει στο Functions runtime να χρησιμοποιήσει Linux ως λειτουργικό σύστημα για τη φιλοξενία αυτών των functions. Τα Functions μπορούν να φιλοξενηθούν σε Linux ή Windows, ανάλογα με τη γλώσσα προγραμματισμού που χρησιμοποιείται. Οι εφαρμογές Python υποστηρίζονται μόνο σε Linux. + +### Εργασία - ανεβάστε τις ρυθμίσεις της εφαρμογής σας + +Όταν αναπτύξατε την εφαρμογή Functions, αποθηκεύσατε κάποιες ρυθμίσεις στο αρχείο `local.settings.json` για τα connection strings του IoT Hub σας. Αυτές πρέπει να γραφτούν στις Application Settings στο Functions App σας στο Azure, ώστε να μπορούν να χρησιμοποιηθούν από τον κώδικά σας. + +> 🎓 Το αρχείο `local.settings.json` είναι μόνο για τοπικές ρυθμίσεις ανάπτυξης και δεν πρέπει να ελέγχεται σε σύστημα ελέγχου πηγαίου κώδικα, όπως το GitHub. Όταν αναπτύσσεται στο cloud, χρησιμοποιούνται Application Settings. Τα Application Settings είναι ζεύγη κλειδιού/τιμής που φιλοξενούνται στο cloud και διαβάζονται από μεταβλητές περιβάλλοντος είτε στον κώδικά σας είτε από το runtime όταν συνδέει τον κώδικά σας με το IoT Hub. + +1. Εκτελέστε την παρακάτω εντολή για να ορίσετε τη ρύθμιση `IOT_HUB_CONNECTION_STRING` στις Application Settings του Functions App: + + ```sh + az functionapp config appsettings set --resource-group soil-moisture-sensor \ + --name \ + --settings "IOT_HUB_CONNECTION_STRING=" + ``` + + Αντικαταστήστε το `` με το όνομα που χρησιμοποιήσατε για το Functions App σας. + + Αντικαταστήστε το `` με την τιμή του `IOT_HUB_CONNECTION_STRING` από το αρχείο `local.settings.json`. + +1. Επαναλάβετε το παραπάνω βήμα, αλλά ορίστε την τιμή του `REGISTRY_MANAGER_CONNECTION_STRING` στην αντίστοιχη τιμή από το αρχείο `local.settings.json`. + +Όταν εκτελέσετε αυτές τις εντολές, θα εμφανιστεί επίσης μια λίστα με όλες τις Application Settings για το Functions App. Μπορείτε να χρησιμοποιήσετε αυτήν τη λίστα για να ελέγξετε ότι οι τιμές σας έχουν οριστεί σωστά. + +> 💁 Θα δείτε μια τιμή που έχει ήδη οριστεί για το `AzureWebJobsStorage`. Στο αρχείο `local.settings.json`, αυτή είχε οριστεί σε μια τιμή για τη χρήση του τοπικού εξομοιωτή αποθήκευσης. Όταν δημιουργήσατε το Functions App, περάσατε τον storage account ως παράμετρο και αυτό ορίστηκε αυτόματα σε αυτήν τη ρύθμιση. + +### Εργασία - αναπτύξτε το Functions App σας στο cloud + +Τώρα που το Functions App είναι έτοιμο, ο κώδικάς σας μπορεί να αναπτυχθεί. + +1. Εκτελέστε την παρακάτω εντολή από το τερματικό του VS Code για να δημοσιεύσετε το Functions App σας: + + ```sh + func azure functionapp publish + ``` + + Αντικαταστήστε το `` με το όνομα που χρησιμοποιήσατε για το Functions App σας. + +Ο κώδικας θα συσκευαστεί και θα σταλεί στο Functions App, όπου θα αναπτυχθεί και θα ξεκινήσει. Θα υπάρξει αρκετή έξοδος κονσόλας, που θα καταλήγει σε επιβεβαίωση της ανάπτυξης και μια λίστα με τις functions που αναπτύχθηκαν. Σε αυτήν την περίπτωση, η λίστα θα περιέχει μόνο το trigger. + +```output +Deployment successful. +Remote build succeeded! +Syncing triggers... +Functions in soil-moisture-sensor: + iot-hub-trigger - [eventHubTrigger] +``` + +Βεβαιωθείτε ότι η IoT συσκευή σας λειτουργεί. Αλλάξτε τα επίπεδα υγρασίας προσαρμόζοντας την υγρασία του εδάφους ή μετακινώντας τον αισθητήρα μέσα και έξω από το έδαφος. Θα δείτε το ρελέ να ενεργοποιείται και να απενεργοποιείται καθώς αλλάζει η υγρασία του εδάφους. + +--- + +## 🚀 Πρόκληση + +Στο προηγούμενο μάθημα, διαχειριστήκατε το χρονισμό για το ρελέ αποσυνδέοντας τα μηνύματα MQTT ενώ το ρελέ ήταν ενεργοποιημένο και για λίγο μετά την απενεργοποίησή του. Δεν μπορείτε να χρησιμοποιήσετε αυτήν τη μέθοδο εδώ - δεν μπορείτε να αποσυνδέσετε το IoT Hub trigger σας. + +Σκεφτείτε διαφορετικούς τρόπους με τους οποίους θα μπορούσατε να χειριστείτε αυτό στο Functions App σας. + +## Κουίζ μετά το μάθημα + +[Κουίζ μετά το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/18) + +## Ανασκόπηση & Αυτομελέτη + +* Διαβάστε για το serverless computing στη [σελίδα Serverless Computing στη Wikipedia](https://wikipedia.org/wiki/Serverless_computing) +* Διαβάστε για τη χρήση του serverless στο Azure, συμπεριλαμβανομένων περισσότερων παραδειγμάτων, στο [Go serverless for your IoT needs Azure blog post](https://azure.microsoft.com/blog/go-serverless-for-your-iot-needs/?WT.mc_id=academic-17441-jabenn) +* Μάθετε περισσότερα για το Azure Functions στο [κανάλι YouTube του Azure Functions](https://www.youtube.com/c/AzureFunctions) + +## Εργασία + +[Προσθέστε χειροκίνητο έλεγχο του ρελέ](assignment.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md b/translations/el/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md new file mode 100644 index 00000000..55cf819a --- /dev/null +++ b/translations/el/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md @@ -0,0 +1,70 @@ + +# Προσθήκη χειροκίνητου ελέγχου ρελέ + +## Οδηγίες + +Ο κώδικας χωρίς διακομιστή μπορεί να ενεργοποιηθεί από διάφορα πράγματα, συμπεριλαμβανομένων των αιτημάτων HTTP. Μπορείτε να χρησιμοποιήσετε ενεργοποιήσεις HTTP για να προσθέσετε μια χειροκίνητη παράκαμψη στον έλεγχο του ρελέ, επιτρέποντας σε κάποιον να ενεργοποιήσει ή να απενεργοποιήσει το ρελέ μέσω μιας αίτησης ιστού. + +Για αυτήν την εργασία, πρέπει να προσθέσετε δύο ενεργοποιήσεις HTTP στην εφαρμογή Functions App σας για να ενεργοποιήσετε και να απενεργοποιήσετε το ρελέ, επαναχρησιμοποιώντας όσα έχετε μάθει από αυτό το μάθημα για να στείλετε εντολές στη συσκευή. + +Μερικές συμβουλές: + +* Μπορείτε να προσθέσετε μια ενεργοποίηση HTTP στην υπάρχουσα εφαρμογή Functions App σας με την ακόλουθη εντολή: + + ```sh + func new --name --template "HTTP trigger" + ``` + + Αντικαταστήστε το `` με το όνομα για την ενεργοποίηση HTTP. Χρησιμοποιήστε κάτι όπως `relay_on` και `relay_off`. + +* Οι ενεργοποιήσεις HTTP μπορούν να έχουν έλεγχο πρόσβασης. Από προεπιλογή, απαιτούν ένα API key συγκεκριμένο για τη λειτουργία να περάσει με τη διεύθυνση URL για να εκτελεστούν. Για αυτήν την εργασία, μπορείτε να αφαιρέσετε αυτόν τον περιορισμό ώστε οποιοσδήποτε να μπορεί να εκτελέσει τη λειτουργία. Για να το κάνετε αυτό, ενημερώστε τη ρύθμιση `authLevel` στο αρχείο `function.json` για τις ενεργοποιήσεις HTTP ως εξής: + + ```json + "authLevel": "anonymous" + ``` + + > 💁 Μπορείτε να διαβάσετε περισσότερα για αυτόν τον έλεγχο πρόσβασης στην [τεκμηρίωση για τα κλειδιά πρόσβασης λειτουργιών](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?WT.mc_id=academic-17441-jabenn#authorization-keys). + +* Οι ενεργοποιήσεις HTTP από προεπιλογή υποστηρίζουν αιτήματα GET και POST. Αυτό σημαίνει ότι μπορείτε να τις καλέσετε χρησιμοποιώντας τον περιηγητή σας - οι περιηγητές ιστού κάνουν αιτήματα GET. + + Όταν εκτελείτε την εφαρμογή Functions App τοπικά, θα δείτε τη διεύθυνση URL της ενεργοποίησης: + + ```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 + ``` + + Επικολλήστε τη διεύθυνση URL στον περιηγητή σας και πατήστε `return`, ή `Ctrl+click` (`Cmd+click` σε macOS) τον σύνδεσμο στο παράθυρο τερματικού στο VS Code για να τον ανοίξετε στον προεπιλεγμένο περιηγητή σας. Αυτό θα εκτελέσει την ενεργοποίηση. + + > 💁 Παρατηρήστε ότι η διεύθυνση URL έχει `/api` μέσα της - οι ενεργοποιήσεις HTTP βρίσκονται από προεπιλογή στον υποτομέα `api`. + +* Όταν αναπτύξετε την εφαρμογή Functions App, η διεύθυνση URL της ενεργοποίησης HTTP θα είναι: + + `https://.azurewebsites.net/api/` + + Όπου το `` είναι το όνομα της εφαρμογής Functions App σας, και το `` είναι το όνομα της ενεργοποίησής σας. + +## Κριτήρια Αξιολόγησης + +| Κριτήριο | Εξαιρετικό | Επαρκές | Χρειάζεται Βελτίωση | +| -------- | --------- | -------- | ----------------- | +| Δημιουργία ενεργοποιήσεων HTTP | Δημιουργήθηκαν 2 ενεργοποιήσεις για την ενεργοποίηση και απενεργοποίηση του ρελέ, με κατάλληλα ονόματα | Δημιουργήθηκε μία ενεργοποίηση με κατάλληλο όνομα | Δεν ήταν δυνατή η δημιουργία ενεργοποιήσεων | +| Έλεγχος του ρελέ από τις ενεργοποιήσεις HTTP | Ήταν δυνατή η σύνδεση και των δύο ενεργοποιήσεων με το IoT Hub και ο κατάλληλος έλεγχος του ρελέ | Ήταν δυνατή η σύνδεση μίας ενεργοποίησης με το IoT Hub και ο κατάλληλος έλεγχος του ρελέ | Δεν ήταν δυνατή η σύνδεση των ενεργοποιήσεων με το IoT Hub | + +--- + +**Αποποίηση Ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/6-keep-your-plant-secure/README.md b/translations/el/2-farm/lessons/6-keep-your-plant-secure/README.md new file mode 100644 index 00000000..942f2d55 --- /dev/null +++ b/translations/el/2-farm/lessons/6-keep-your-plant-secure/README.md @@ -0,0 +1,175 @@ + +# Κρατήστε το φυτό σας ασφαλές + +![Μια σκιαγραφική επισκόπηση αυτού του μαθήματος](../../../../../translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.el.jpg) + +> Σκίτσο από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +## Ερωτηματολόγιο πριν το μάθημα + +[Ερωτηματολόγιο πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/19) + +## Εισαγωγή + +Στα τελευταία μαθήματα δημιουργήσατε μια συσκευή IoT για παρακολούθηση του εδάφους και τη συνδέσατε στο cloud. Αλλά τι θα γινόταν αν χάκερ που εργάζονται για έναν ανταγωνιστή αγρότη κατάφερναν να πάρουν τον έλεγχο των συσκευών σας IoT; Τι θα γινόταν αν έστελναν υψηλές μετρήσεις υγρασίας εδάφους ώστε τα φυτά σας να μην ποτίζονται ποτέ, ή αν ενεργοποιούσαν το σύστημα ποτίσματος συνεχώς, καταστρέφοντας τα φυτά σας από υπερβολικό πότισμα και σας κόστιζαν μια μικρή περιουσία σε νερό; + +Σε αυτό το μάθημα θα μάθετε πώς να ασφαλίζετε τις συσκευές IoT. Επειδή αυτό είναι το τελευταίο μάθημα για αυτό το έργο, θα μάθετε επίσης πώς να καθαρίζετε τους πόρους του cloud, μειώνοντας τυχόν πιθανά κόστη. + +Σε αυτό το μάθημα θα καλύψουμε: + +* [Γιατί χρειάζεται να ασφαλίσετε τις συσκευές IoT;](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Κρυπτογραφία](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Ασφαλίστε τις συσκευές IoT σας](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Δημιουργία και χρήση πιστοποιητικού X.509](../../../../../2-farm/lessons/6-keep-your-plant-secure) + +> 🗑 Αυτό είναι το τελευταίο μάθημα αυτού του έργου, οπότε μετά την ολοκλήρωση του μαθήματος και της εργασίας, μην ξεχάσετε να καθαρίσετε τις υπηρεσίες cloud σας. Θα χρειαστείτε τις υπηρεσίες για να ολοκληρώσετε την εργασία, οπότε βεβαιωθείτε ότι την ολοκληρώσατε πρώτα. +> +> Ανατρέξτε στον [οδηγό καθαρισμού του έργου σας](../../../clean-up.md) εάν χρειάζεστε οδηγίες για το πώς να το κάνετε. + +## Γιατί χρειάζεται να ασφαλίσετε τις συσκευές IoT; + +Η ασφάλεια IoT περιλαμβάνει τη διασφάλιση ότι μόνο οι αναμενόμενες συσκευές μπορούν να συνδεθούν στην υπηρεσία IoT του cloud σας και να στείλουν τηλεμετρία, και ότι μόνο η υπηρεσία cloud σας μπορεί να στείλει εντολές στις συσκευές σας. Τα δεδομένα IoT μπορεί επίσης να είναι προσωπικά, όπως ιατρικά ή ευαίσθητα δεδομένα, οπότε ολόκληρη η εφαρμογή σας πρέπει να λαμβάνει υπόψη την ασφάλεια για να αποτρέψει τη διαρροή αυτών των δεδομένων. + +Αν η εφαρμογή IoT σας δεν είναι ασφαλής, υπάρχουν αρκετοί κίνδυνοι: + +* Μια ψεύτικη συσκευή θα μπορούσε να στείλει λανθασμένα δεδομένα, προκαλώντας την εφαρμογή σας να αντιδράσει λανθασμένα. Για παράδειγμα, θα μπορούσαν να στείλουν συνεχώς υψηλές μετρήσεις υγρασίας εδάφους, ώστε το σύστημα άρδευσης να μην ενεργοποιείται ποτέ και τα φυτά σας να πεθαίνουν από έλλειψη νερού. +* Μη εξουσιοδοτημένοι χρήστες θα μπορούσαν να διαβάσουν δεδομένα από συσκευές IoT, συμπεριλαμβανομένων προσωπικών ή κρίσιμων για την επιχείρηση δεδομένων. +* Χάκερ θα μπορούσαν να στείλουν εντολές για να ελέγξουν μια συσκευή με τρόπο που θα μπορούσε να προκαλέσει ζημιά στη συσκευή ή στο συνδεδεμένο υλικό. +* Συνδεόμενοι σε μια συσκευή IoT, οι χάκερ θα μπορούσαν να χρησιμοποιήσουν αυτή τη σύνδεση για να αποκτήσουν πρόσβαση σε επιπλέον δίκτυα και να εισέλθουν σε ιδιωτικά συστήματα. +* Κακόβουλοι χρήστες θα μπορούσαν να αποκτήσουν πρόσβαση σε προσωπικά δεδομένα και να τα χρησιμοποιήσουν για εκβιασμό. + +Αυτά είναι σενάρια πραγματικού κόσμου και συμβαίνουν συνεχώς. Μερικά παραδείγματα δόθηκαν σε προηγούμενα μαθήματα, αλλά εδώ είναι μερικά ακόμα: + +* Το 2018, χάκερ χρησιμοποίησαν ένα ανοιχτό σημείο πρόσβασης WiFi σε ένα θερμοστάτη ενυδρείου για να αποκτήσουν πρόσβαση στο δίκτυο ενός καζίνο και να κλέψουν δεδομένα. [The Hacker News - Casino Gets Hacked Through Its Internet-Connected Fish Tank Thermometer](https://thehackernews.com/2018/04/iot-hacking-thermometer.html) +* Το 2016, το Mirai Botnet εξαπέλυσε μια επίθεση άρνησης υπηρεσίας (DDoS) εναντίον της Dyn, ενός παρόχου υπηρεσιών Internet, καταρρίπτοντας μεγάλα τμήματα του Internet. Αυτό το botnet χρησιμοποίησε κακόβουλο λογισμικό για να συνδεθεί σε συσκευές IoT όπως DVRs και κάμερες που χρησιμοποιούσαν προεπιλεγμένα ονόματα χρήστη και κωδικούς πρόσβασης, και από εκεί εξαπέλυσε την επίθεση. [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 είχε μια βάση δεδομένων χρηστών των συνδεδεμένων παιχνιδιών CloudPets διαθέσιμη δημόσια στο Internet. [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 σημείωνε δρομείς που περνούσατε και έδειχνε τις διαδρομές τους, επιτρέποντας σε αγνώστους να δουν ουσιαστικά πού ζείτε. [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/). + +✅ Κάντε μια έρευνα: Αναζητήστε περισσότερα παραδείγματα επιθέσεων και παραβιάσεων δεδομένων IoT, ειδικά με προσωπικά αντικείμενα όπως οδοντόβουρτσες ή ζυγαριές συνδεδεμένες στο Internet. Σκεφτείτε τον αντίκτυπο που θα μπορούσαν να έχουν αυτές οι επιθέσεις στα θύματα ή στους πελάτες. + +> 💁 Η ασφάλεια είναι ένα τεράστιο θέμα, και αυτό το μάθημα θα αγγίξει μόνο μερικά από τα βασικά γύρω από τη σύνδεση της συσκευής σας στο cloud. Άλλα θέματα που δεν θα καλυφθούν περιλαμβάνουν την παρακολούθηση αλλαγών δεδομένων κατά τη μεταφορά, την άμεση παραβίαση συσκευών ή τις αλλαγές στις διαμορφώσεις συσκευών. Η παραβίαση συσκευών IoT είναι τόσο μεγάλη απειλή που έχουν αναπτυχθεί εργαλεία όπως το [Azure Defender for IoT](https://azure.microsoft.com/services/azure-defender-for-iot/?WT.mc_id=academic-17441-jabenn). Αυτά τα εργαλεία είναι παρόμοια με τα εργαλεία αντι-ιών και ασφάλειας που μπορεί να έχετε στον υπολογιστή σας, απλώς σχεδιασμένα για μικρές, χαμηλής ισχύος συσκευές IoT. + +## Κρυπτογραφία + +Όταν μια συσκευή συνδέεται σε μια υπηρεσία IoT, χρησιμοποιεί ένα ID για να ταυτοποιηθεί. Το πρόβλημα είναι ότι αυτό το ID μπορεί να αντιγραφεί - ένας χάκερ θα μπορούσε να δημιουργήσει μια κακόβουλη συσκευή που χρησιμοποιεί το ίδιο ID με μια πραγματική συσκευή αλλά στέλνει ψευδή δεδομένα. + +![Τόσο οι έγκυρες όσο και οι κακόβουλες συσκευές θα μπορούσαν να χρησιμοποιούν το ίδιο ID για να στέλνουν τηλεμετρία](../../../../../translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.el.png) + +Η λύση σε αυτό είναι να μετατραπούν τα δεδομένα που αποστέλλονται σε μια κωδικοποιημένη μορφή, χρησιμοποιώντας μια τιμή γνωστή μόνο στη συσκευή και το cloud για την κωδικοποίηση των δεδομένων. Αυτή η διαδικασία ονομάζεται *κρυπτογράφηση*, και η τιμή που χρησιμοποιείται για την κρυπτογράφηση των δεδομένων ονομάζεται *κλειδί κρυπτογράφησης*. + +![Αν χρησιμοποιηθεί κρυπτογράφηση, τότε μόνο τα κρυπτογραφημένα μηνύματα θα γίνονται δεκτά, ενώ τα υπόλοιπα θα απορρίπτονται](../../../../../translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.el.png) + +Η υπηρεσία cloud μπορεί στη συνέχεια να μετατρέψει τα δεδομένα πίσω σε αναγνώσιμη μορφή, χρησιμοποιώντας μια διαδικασία που ονομάζεται *αποκρυπτογράφηση*, είτε με το ίδιο κλειδί κρυπτογράφησης είτε με ένα *κλειδί αποκρυπτογράφησης*. Αν το κρυπτογραφημένο μήνυμα δεν μπορεί να αποκρυπτογραφηθεί με το κλειδί, η συσκευή έχει παραβιαστεί και το μήνυμα απορρίπτεται. + +Η τεχνική για την κρυπτογράφηση και την αποκρυπτογράφηση ονομάζεται *κρυπτογραφία*. +💁 Εξαιτίας του χρόνου λήξης, η συσκευή IoT σας πρέπει να γνωρίζει την ακριβή ώρα, η οποία συνήθως λαμβάνεται από έναν διακομιστή [NTP](https://wikipedia.org/wiki/Network_Time_Protocol). Εάν η ώρα δεν είναι ακριβής, η σύνδεση θα αποτύχει. +Μετά τη σύνδεση, όλα τα δεδομένα που αποστέλλονται στο IoT Hub από τη συσκευή ή από το IoT Hub στη συσκευή θα κρυπτογραφούνται με το κοινόχρηστο κλειδί πρόσβασης. + +✅ Τι πιστεύετε ότι θα συμβεί αν πολλές συσκευές μοιράζονται το ίδιο connection string; + +> 💁 Είναι κακή πρακτική ασφαλείας να αποθηκεύετε αυτό το κλειδί στον κώδικα. Αν ένας χάκερ αποκτήσει τον πηγαίο κώδικά σας, μπορεί να αποκτήσει το κλειδί σας. Επίσης, είναι πιο δύσκολο κατά την κυκλοφορία του κώδικα, καθώς θα πρέπει να κάνετε επανασυμπίεση με ένα ενημερωμένο κλειδί για κάθε συσκευή. Είναι καλύτερο να φορτώνετε αυτό το κλειδί από ένα hardware security module - ένα τσιπ στη συσκευή IoT που αποθηκεύει κρυπτογραφημένες τιμές που μπορούν να διαβαστούν από τον κώδικά σας. +> +> Όταν μαθαίνετε IoT, είναι συχνά πιο εύκολο να βάλετε το κλειδί στον κώδικα, όπως κάνατε σε προηγούμενο μάθημα, αλλά πρέπει να διασφαλίσετε ότι αυτό το κλειδί δεν θα ελεγχθεί σε δημόσιο έλεγχο πηγαίου κώδικα. + +Οι συσκευές έχουν 2 κλειδιά και 2 αντίστοιχα connection strings. Αυτό σας επιτρέπει να περιστρέφετε τα κλειδιά - δηλαδή να αλλάζετε από το ένα κλειδί στο άλλο αν το πρώτο παραβιαστεί, και να αναδημιουργείτε το πρώτο κλειδί. + +### Πιστοποιητικά X.509 + +Όταν χρησιμοποιείτε ασύμμετρη κρυπτογράφηση με ένα ζεύγος δημόσιου/ιδιωτικού κλειδιού, πρέπει να παρέχετε το δημόσιο κλειδί σας σε οποιονδήποτε θέλει να σας στείλει δεδομένα. Το πρόβλημα είναι, πώς μπορεί ο παραλήπτης του κλειδιού σας να είναι σίγουρος ότι είναι πραγματικά το δημόσιο κλειδί σας και όχι κάποιου άλλου που προσποιείται ότι είστε εσείς; Αντί να παρέχετε ένα κλειδί, μπορείτε να παρέχετε το δημόσιο κλειδί σας μέσα σε ένα πιστοποιητικό που έχει επαληθευτεί από έναν αξιόπιστο τρίτο, που ονομάζεται πιστοποιητικό X.509. + +Τα πιστοποιητικά X.509 είναι ψηφιακά έγγραφα που περιέχουν το δημόσιο κλειδί του ζεύγους δημόσιου/ιδιωτικού κλειδιού. Συνήθως εκδίδονται από έναν αριθμό αξιόπιστων οργανισμών που ονομάζονται [Αρχές Πιστοποίησης](https://wikipedia.org/wiki/Certificate_authority) (CAs) και υπογράφονται ψηφιακά από την CA για να υποδειχθεί ότι το κλειδί είναι έγκυρο και προέρχεται από εσάς. Εμπιστεύεστε το πιστοποιητικό και ότι το δημόσιο κλειδί είναι από αυτόν που λέει το πιστοποιητικό, επειδή εμπιστεύεστε την CA, όπως θα εμπιστευόσασταν ένα διαβατήριο ή δίπλωμα οδήγησης επειδή εμπιστεύεστε τη χώρα που το εκδίδει. Τα πιστοποιητικά κοστίζουν χρήματα, οπότε μπορείτε επίσης να "υπογράψετε μόνοι σας", δηλαδή να δημιουργήσετε ένα πιστοποιητικό μόνοι σας που υπογράφεται από εσάς, για δοκιμαστικούς σκοπούς. + +> 💁 Δεν πρέπει ποτέ να χρησιμοποιείτε ένα αυτο-υπογεγραμμένο πιστοποιητικό για παραγωγική κυκλοφορία. + +Αυτά τα πιστοποιητικά περιέχουν διάφορα πεδία, όπως από ποιον είναι το δημόσιο κλειδί, τα στοιχεία της CA που το εξέδωσε, για πόσο καιρό είναι έγκυρο και το ίδιο το δημόσιο κλειδί. Πριν χρησιμοποιήσετε ένα πιστοποιητικό, είναι καλή πρακτική να το επαληθεύσετε ελέγχοντας ότι υπογράφηκε από την αρχική CA. + +✅ Μπορείτε να διαβάσετε μια πλήρη λίστα των πεδίων του πιστοποιητικού στο [Microsoft Understanding X.509 Public Key Certificates tutorial](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-certificates?WT.mc_id=academic-17441-jabenn#certificate-fields) + +Όταν χρησιμοποιείτε πιστοποιητικά X.509, τόσο ο αποστολέας όσο και ο παραλήπτης θα έχουν τα δικά τους δημόσια και ιδιωτικά κλειδιά, καθώς και πιστοποιητικά X.509 που περιέχουν το δημόσιο κλειδί. Στη συνέχεια, ανταλλάσσουν πιστοποιητικά X.509 με κάποιον τρόπο, χρησιμοποιώντας τα δημόσια κλειδιά του άλλου για να κρυπτογραφήσουν τα δεδομένα που στέλνουν και το δικό τους ιδιωτικό κλειδί για να αποκρυπτογραφήσουν τα δεδομένα που λαμβάνουν. + +![Αντί να μοιράζεστε ένα δημόσιο κλειδί, μπορείτε να μοιράζεστε ένα πιστοποιητικό. Ο χρήστης του πιστοποιητικού μπορεί να επαληθεύσει ότι προέρχεται από εσάς ελέγχοντας με την αρχή πιστοποίησης που το υπέγραψε.](../../../../../translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.el.png) + +Ένα μεγάλο πλεονέκτημα της χρήσης πιστοποιητικών X.509 είναι ότι μπορούν να μοιραστούν μεταξύ συσκευών. Μπορείτε να δημιουργήσετε ένα πιστοποιητικό, να το ανεβάσετε στο IoT Hub και να το χρησιμοποιήσετε για όλες τις συσκευές σας. Κάθε συσκευή χρειάζεται μόνο να γνωρίζει το ιδιωτικό κλειδί για να αποκρυπτογραφήσει τα μηνύματα που λαμβάνει από το IoT Hub. + +Το πιστοποιητικό που χρησιμοποιείται από τη συσκευή σας για να κρυπτογραφήσει μηνύματα που στέλνει στο IoT Hub δημοσιεύεται από τη Microsoft. Είναι το ίδιο πιστοποιητικό που χρησιμοποιούν πολλές υπηρεσίες Azure και μερικές φορές είναι ενσωματωμένο στα SDKs. + +> 💁 Θυμηθείτε, ένα δημόσιο κλειδί είναι ακριβώς αυτό - δημόσιο. Το δημόσιο κλειδί του Azure μπορεί να χρησιμοποιηθεί μόνο για να κρυπτογραφήσει δεδομένα που αποστέλλονται στο Azure, όχι για να τα αποκρυπτογραφήσει, οπότε μπορεί να κοινοποιηθεί παντού, συμπεριλαμβανομένου του πηγαίου κώδικα. Για παράδειγμα, μπορείτε να το δείτε στον [πηγαίο κώδικα του Azure IoT C SDK](https://github.com/Azure/azure-iot-sdk-c/blob/master/certs/certs.c). + +✅ Υπάρχει πολύ ορολογία με τα πιστοποιητικά X.509. Μπορείτε να διαβάσετε τους ορισμούς ορισμένων από τους όρους που μπορεί να συναντήσετε στον [Οδηγό για την ορολογία των πιστοποιητικών X.509](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) + +## Δημιουργία και χρήση πιστοποιητικού X.509 + +Τα βήματα για τη δημιουργία ενός πιστοποιητικού X.509 είναι: + +1. Δημιουργήστε ένα ζεύγος δημόσιου/ιδιωτικού κλειδιού. Ένας από τους πιο ευρέως χρησιμοποιούμενους αλγόριθμους για τη δημιουργία ενός ζεύγους δημόσιου/ιδιωτικού κλειδιού ονομάζεται [Rivest–Shamir–Adleman](https://wikipedia.org/wiki/RSA_(cryptosystem))(RSA). + +1. Υποβάλετε το δημόσιο κλειδί με τα σχετικά δεδομένα για υπογραφή, είτε από μια CA είτε με αυτο-υπογραφή. + +Το Azure CLI έχει εντολές για τη δημιουργία μιας νέας ταυτότητας συσκευής στο IoT Hub και τη δημιουργία αυτόματα του ζεύγους δημόσιου/ιδιωτικού κλειδιού και ενός αυτο-υπογεγραμμένου πιστοποιητικού. + +> 💁 Αν θέλετε να δείτε τα βήματα με λεπτομέρεια, αντί να χρησιμοποιήσετε το Azure CLI, μπορείτε να τα βρείτε στο [Using OpenSSL to create self-signed certificates tutorial in the Microsoft IoT Hub documentation](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-self-sign?WT.mc_id=academic-17441-jabenn) + +### Εργασία - δημιουργία ταυτότητας συσκευής χρησιμοποιώντας πιστοποιητικό X.509 + +1. Εκτελέστε την παρακάτω εντολή για να καταχωρίσετε τη νέα ταυτότητα συσκευής, δημιουργώντας αυτόματα τα κλειδιά και τα πιστοποιητικά: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor-x509 \ + --am x509_thumbprint \ + --output-dir . \ + --hub-name + ``` + + Αντικαταστήστε το `` με το όνομα που χρησιμοποιήσατε για το IoT Hub. + + Αυτό θα δημιουργήσει μια συσκευή με ID `soil-moisture-sensor-x509` για να διακρίνεται από την ταυτότητα συσκευής που δημιουργήσατε στο προηγούμενο μάθημα. Αυτή η εντολή θα δημιουργήσει επίσης 2 αρχεία στον τρέχοντα κατάλογο: + + * `soil-moisture-sensor-x509-key.pem` - αυτό το αρχείο περιέχει το ιδιωτικό κλειδί για τη συσκευή. + * `soil-moisture-sensor-x509-cert.pem` - αυτό είναι το αρχείο πιστοποιητικού X.509 για τη συσκευή. + + Κρατήστε αυτά τα αρχεία ασφαλή! Το αρχείο ιδιωτικού κλειδιού δεν πρέπει να ελεγχθεί σε δημόσιο έλεγχο πηγαίου κώδικα. + +### Εργασία - χρήση του πιστοποιητικού X.509 στον κώδικα της συσκευής σας + +Ακολουθήστε τον σχετικό οδηγό για να συνδέσετε τη συσκευή IoT σας στο cloud χρησιμοποιώντας το πιστοποιητικό X.509: + +* [Arduino - Wio Terminal](wio-terminal-x509.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-x509.md) + +--- + +## 🚀 Πρόκληση + +Υπάρχουν πολλοί τρόποι για να δημιουργήσετε, να διαχειριστείτε και να διαγράψετε υπηρεσίες Azure, όπως Resource Groups και IoT Hubs. Ένας τρόπος είναι το [Azure Portal](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) - μια διεπαφή ιστού που σας παρέχει ένα GUI για τη διαχείριση των υπηρεσιών Azure. + +Μεταβείτε στο [portal.azure.com](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) και εξερευνήστε το portal. Δείτε αν μπορείτε να δημιουργήσετε ένα IoT Hub χρησιμοποιώντας το portal και στη συνέχεια να το διαγράψετε. + +**Υπόδειξη** - όταν δημιουργείτε υπηρεσίες μέσω του portal, δεν χρειάζεται να δημιουργήσετε ένα Resource Group εκ των προτέρων, μπορεί να δημιουργηθεί κατά τη δημιουργία της υπηρεσίας. Βεβαιωθείτε ότι το διαγράφετε όταν τελειώσετε! + +Μπορείτε να βρείτε άφθονη τεκμηρίωση, tutorials και οδηγούς για το Azure Portal στη [τεκμηρίωση του Azure Portal](https://docs.microsoft.com/azure/azure-portal/?WT.mc_id=academic-17441-jabenn). + +## Κουίζ μετά το μάθημα + +[Κουίζ μετά το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/20) + +## Ανασκόπηση & Αυτομελέτη + +* Διαβάστε για την ιστορία της κρυπτογραφίας στη [σελίδα Ιστορία της κρυπτογραφίας στη Wikipedia](https://wikipedia.org/wiki/History_of_cryptography). +* Διαβάστε για τα πιστοποιητικά X.509 στη [σελίδα X.509 στη Wikipedia](https://wikipedia.org/wiki/X.509). + +## Εργασία + +[Δημιουργήστε μια νέα συσκευή IoT](assignment.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/6-keep-your-plant-secure/assignment.md b/translations/el/2-farm/lessons/6-keep-your-plant-secure/assignment.md new file mode 100644 index 00000000..868c144a --- /dev/null +++ b/translations/el/2-farm/lessons/6-keep-your-plant-secure/assignment.md @@ -0,0 +1,29 @@ + +# Δημιουργία μιας νέας συσκευής IoT + +## Οδηγίες + +Στα τελευταία 6 μαθήματα έχετε μάθει για την ψηφιακή γεωργία και πώς να χρησιμοποιείτε συσκευές IoT για τη συλλογή δεδομένων, την πρόβλεψη της ανάπτυξης φυτών και την αυτοματοποίηση του ποτίσματος βάσει μετρήσεων υγρασίας του εδάφους. + +Χρησιμοποιήστε όσα έχετε μάθει για να δημιουργήσετε μια νέα συσκευή IoT χρησιμοποιώντας έναν αισθητήρα και έναν ενεργοποιητή της επιλογής σας. Στείλτε τηλεμετρία σε ένα IoT Hub και χρησιμοποιήστε την για να ελέγξετε έναν ενεργοποιητή μέσω serverless κώδικα. Μπορείτε να χρησιμοποιήσετε έναν αισθητήρα και έναν ενεργοποιητή που έχετε ήδη χρησιμοποιήσει σε αυτό ή το προηγούμενο έργο, ή αν έχετε άλλο υλικό, δοκιμάστε κάτι νέο. + +## Κριτήρια Αξιολόγησης + +| Κριτήριο | Εξαιρετικό | Επαρκές | Χρειάζεται Βελτίωση | +| -------- | ---------- | -------- | ------------------- | +| Προγραμματισμός συσκευής IoT για χρήση αισθητήρα και ενεργοποιητή | Προγραμματίστηκε μια συσκευή IoT που λειτουργεί με αισθητήρα και ενεργοποιητή | Προγραμματίστηκε μια συσκευή IoT που λειτουργεί με αισθητήρα ή ενεργοποιητή | Δεν ήταν δυνατός ο προγραμματισμός συσκευής IoT για χρήση αισθητήρα ή ενεργοποιητή | +| Σύνδεση της συσκευής IoT με το IoT Hub | Ήταν δυνατή η ανάπτυξη ενός IoT Hub, η αποστολή τηλεμετρίας σε αυτό και η λήψη εντολών από αυτό | Ήταν δυνατή η ανάπτυξη ενός IoT Hub και είτε η αποστολή τηλεμετρίας είτε η λήψη εντολών | Δεν ήταν δυνατή η ανάπτυξη ενός IoT Hub και η επικοινωνία με αυτό από μια συσκευή IoT | +| Έλεγχος του ενεργοποιητή μέσω serverless κώδικα | Ήταν δυνατή η ανάπτυξη μιας Azure Function για τον έλεγχο της συσκευής που ενεργοποιείται από γεγονότα τηλεμετρίας | Ήταν δυνατή η ανάπτυξη μιας Azure Function που ενεργοποιείται από γεγονότα τηλεμετρίας αλλά δεν ήταν δυνατός ο έλεγχος του ενεργοποιητή | Δεν ήταν δυνατή η ανάπτυξη μιας Azure Function | + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική μετάφραση από ανθρώπους. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md b/translations/el/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md new file mode 100644 index 00000000..903c848b --- /dev/null +++ b/translations/el/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md @@ -0,0 +1,71 @@ + +# Χρησιμοποιήστε το πιστοποιητικό X.509 στον κώδικα της συσκευής σας - Εικονικό IoT Hardware και Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα συνδέσετε την εικονική συσκευή IoT ή το Raspberry Pi σας με το IoT Hub χρησιμοποιώντας το πιστοποιητικό X.509. + +## Συνδέστε τη συσκευή σας με το IoT Hub + +Το επόμενο βήμα είναι να συνδέσετε τη συσκευή σας με το IoT Hub χρησιμοποιώντας τα πιστοποιητικά X.509. + +### Εργασία - σύνδεση με το IoT Hub + +1. Αντιγράψτε τα αρχεία κλειδιού και πιστοποιητικού στον φάκελο που περιέχει τον κώδικα της συσκευής IoT σας. Εάν χρησιμοποιείτε Raspberry Pi μέσω του VS Code Remote SSH και δημιουργήσατε τα κλειδιά στον υπολογιστή ή το Mac σας, μπορείτε να σύρετε και να αποθέσετε τα αρχεία στον εξερευνητή του VS Code για να τα αντιγράψετε. + +1. Ανοίξτε το αρχείο `app.py` + +1. Για να συνδεθείτε χρησιμοποιώντας ένα πιστοποιητικό X.509, θα χρειαστείτε το όνομα του host του IoT Hub και το πιστοποιητικό X.509. Ξεκινήστε δημιουργώντας μια μεταβλητή που περιέχει το όνομα του host προσθέτοντας τον παρακάτω κώδικα πριν δημιουργηθεί ο client της συσκευής: + + ```python + host_name = "" + ``` + + Αντικαταστήστε το `` με το όνομα του host του IoT Hub σας. Μπορείτε να το βρείτε στην ενότητα `HostName` μέσα στο `connection_string`. Θα είναι το όνομα του IoT Hub σας, που τελειώνει με `.azure-devices.net`. + +1. Κάτω από αυτό, δηλώστε μια μεταβλητή με το ID της συσκευής: + + ```python + device_id = "soil-moisture-sensor-x509" + ``` + +1. Θα χρειαστείτε μια instance της κλάσης `X509` που περιέχει τα αρχεία X.509. Προσθέστε το `X509` στη λίστα των κλάσεων που εισάγονται από το module `azure.iot.device`: + + ```python + from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse, X509 + ``` + +1. Δημιουργήστε μια instance της κλάσης `X509` χρησιμοποιώντας τα αρχεία πιστοποιητικού και κλειδιού σας προσθέτοντας αυτόν τον κώδικα κάτω από τη δήλωση του `host_name`: + + ```python + x509 = X509("./soil-moisture-sensor-x509-cert.pem", "./soil-moisture-sensor-x509-key.pem") + ``` + + Αυτό θα δημιουργήσει την κλάση `X509` χρησιμοποιώντας τα αρχεία `soil-moisture-sensor-x509-cert.pem` και `soil-moisture-sensor-x509-key.pem` που δημιουργήθηκαν νωρίτερα. + +1. Αντικαταστήστε τη γραμμή κώδικα που δημιουργεί τον `device_client` από ένα connection string με την εξής: + + ```python + device_client = IoTHubDeviceClient.create_from_x509_certificate(x509, host_name, device_id) + ``` + + Αυτό θα συνδέσει χρησιμοποιώντας το πιστοποιητικό X.509 αντί για ένα connection string. + +1. Διαγράψτε τη γραμμή με τη μεταβλητή `connection_string`. + +1. Εκτελέστε τον κώδικά σας. Παρακολουθήστε τα μηνύματα που αποστέλλονται στο IoT Hub και στείλτε αιτήματα direct method όπως πριν. Θα δείτε τη συσκευή να συνδέεται και να στέλνει μετρήσεις υγρασίας εδάφους, καθώς και να λαμβάνει αιτήματα direct method. + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code/pi](../../../../../2-farm/lessons/6-keep-your-plant-secure/code/pi) ή [code/virtual-device](../../../../../2-farm/lessons/6-keep-your-plant-secure/code/virtual-device). + +😀 Το πρόγραμμα του αισθητήρα υγρασίας εδάφους σας είναι συνδεδεμένο με το IoT Hub χρησιμοποιώντας ένα πιστοποιητικό X.509! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md b/translations/el/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md new file mode 100644 index 00000000..3b4377fd --- /dev/null +++ b/translations/el/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md @@ -0,0 +1,17 @@ + +# Χρήση του πιστοποιητικού X.509 στον κώδικα της συσκευής σας - Wio Terminal + +Κατά τη στιγμή της συγγραφής, το Azure Arduino SDK δεν υποστηρίζει πιστοποιητικά X.509. Αν θέλετε να πειραματιστείτε με πιστοποιητικά X.509, μπορείτε να ανατρέξετε στις [οδηγίες για εικονική IoT συσκευή χρησιμοποιώντας το Python SDK](single-board-computer-x509.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/3-transport/README.md b/translations/el/3-transport/README.md new file mode 100644 index 00000000..e1d46a2f --- /dev/null +++ b/translations/el/3-transport/README.md @@ -0,0 +1,38 @@ + +# Μεταφορά από το αγρόκτημα στο εργοστάσιο - χρήση IoT για την παρακολούθηση παραδόσεων τροφίμων + +Πολλοί αγρότες καλλιεργούν τρόφιμα για πώληση - είτε είναι εμπορικοί αγρότες που πωλούν ό,τι παράγουν, είτε είναι αγρότες επιβίωσης που πωλούν την περίσσεια παραγωγή τους για να αγοράσουν τα απαραίτητα. Με κάποιο τρόπο, τα τρόφιμα πρέπει να φτάσουν από το αγρόκτημα στον καταναλωτή, και αυτό συνήθως βασίζεται στη μαζική μεταφορά από τα αγροκτήματα, σε κέντρα ή μονάδες επεξεργασίας, και στη συνέχεια στα καταστήματα. Για παράδειγμα, ένας αγρότης που καλλιεργεί ντομάτες θα συγκομίσει τις ντομάτες, θα τις συσκευάσει σε κουτιά, θα φορτώσει τα κουτιά σε ένα φορτηγό και θα τα παραδώσει σε μια μονάδα επεξεργασίας. Οι ντομάτες στη συνέχεια θα ταξινομηθούν και από εκεί θα παραδοθούν στους καταναλωτές με τη μορφή επεξεργασμένων τροφίμων, λιανικής πώλησης ή κατανάλωσης σε εστιατόρια. + +Το IoT μπορεί να βοηθήσει σε αυτή την αλυσίδα εφοδιασμού παρακολουθώντας τα τρόφιμα κατά τη μεταφορά - διασφαλίζοντας ότι οι οδηγοί πηγαίνουν εκεί που πρέπει, παρακολουθώντας τις τοποθεσίες των οχημάτων και λαμβάνοντας ειδοποιήσεις όταν τα οχήματα φτάνουν, ώστε τα τρόφιμα να εκφορτώνονται και να είναι έτοιμα για επεξεργασία το συντομότερο δυνατό. + +> 🎓 Μια *αλυσίδα εφοδιασμού* είναι η ακολουθία δραστηριοτήτων για την παραγωγή και παράδοση ενός προϊόντος. Για παράδειγμα, στη γεωργία ντομάτας περιλαμβάνει την προμήθεια σπόρων, εδάφους, λιπασμάτων και νερού, την καλλιέργεια ντοματών, την παράδοση ντοματών σε ένα κεντρικό κέντρο, τη μεταφορά τους στο τοπικό κέντρο ενός σούπερ μάρκετ, τη μεταφορά στο μεμονωμένο σούπερ μάρκετ, την τοποθέτησή τους στα ράφια, την πώληση σε έναν καταναλωτή και τη μεταφορά στο σπίτι για κατανάλωση. Κάθε βήμα είναι σαν τους κρίκους μιας αλυσίδας. + +> 🎓 Το κομμάτι της μεταφοράς στην αλυσίδα εφοδιασμού είναι γνωστό ως *λογιστική*. + +Σε αυτά τα 4 μαθήματα, θα μάθετε πώς να εφαρμόζετε το Διαδίκτυο των Πραγμάτων (IoT) για να βελτιώσετε την αλυσίδα εφοδιασμού παρακολουθώντας τα τρόφιμα καθώς φορτώνονται σε ένα (εικονικό) φορτηγό, το οποίο παρακολουθείται καθώς μετακινείται στον προορισμό του. Θα μάθετε για την παρακολούθηση GPS, πώς να αποθηκεύετε και να οπτικοποιείτε δεδομένα GPS, και πώς να λαμβάνετε ειδοποιήσεις όταν ένα φορτηγό φτάνει στον προορισμό του. + +> 💁 Αυτά τα μαθήματα θα χρησιμοποιήσουν κάποιους πόρους στο cloud. Αν δεν ολοκληρώσετε όλα τα μαθήματα αυτού του έργου, βεβαιωθείτε ότι έχετε [Καθαρίσει το έργο σας](../clean-up.md). + +## Θέματα + +1. [Παρακολούθηση τοποθεσίας](lessons/1-location-tracking/README.md) +1. [Αποθήκευση δεδομένων τοποθεσίας](lessons/2-store-location-data/README.md) +1. [Οπτικοποίηση δεδομένων τοποθεσίας](lessons/3-visualize-location-data/README.md) +1. [Γεωφράγματα](lessons/4-geofences/README.md) + +## Συντελεστές + +Όλα τα μαθήματα γράφτηκαν με ♥️ από την [Jen Looper](https://github.com/jlooper) και τον [Jim Bennett](https://GitHub.com/JimBobBennett) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/3-transport/lessons/1-location-tracking/README.md b/translations/el/3-transport/lessons/1-location-tracking/README.md new file mode 100644 index 00000000..6eb5cd28 --- /dev/null +++ b/translations/el/3-transport/lessons/1-location-tracking/README.md @@ -0,0 +1,206 @@ + +# Παρακολούθηση τοποθεσίας + +![Μια σκιαγραφική επισκόπηση αυτού του μαθήματος](../../../../../translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.el.jpg) + +> Σκίτσο από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +## Ερωτηματολόγιο πριν το μάθημα + +[Ερωτηματολόγιο πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/21) + +## Εισαγωγή + +Η κύρια διαδικασία για τη μεταφορά τροφίμων από έναν αγρότη σε έναν καταναλωτή περιλαμβάνει τη φόρτωση κιβωτίων προϊόντων σε φορτηγά, πλοία, αεροπλάνα ή άλλα εμπορικά μεταφορικά μέσα και την παράδοση των τροφίμων κάπου - είτε απευθείας σε έναν πελάτη, είτε σε έναν κεντρικό κόμβο ή αποθήκη για επεξεργασία. Ολόκληρη η διαδικασία από το αγρόκτημα στον καταναλωτή αποτελεί μέρος μιας διαδικασίας που ονομάζεται *αλυσίδα εφοδιασμού*. Το παρακάτω βίντεο από τη Σχολή Επιχειρήσεων W. P. Carey του Πανεπιστημίου της Αριζόνα εξηγεί την έννοια της αλυσίδας εφοδιασμού και πώς διαχειρίζεται με περισσότερες λεπτομέρειες. + +[![Τι είναι η Διαχείριση Αλυσίδας Εφοδιασμού; Ένα βίντεο από τη Σχολή Επιχειρήσεων W. P. Carey του Πανεπιστημίου της Αριζόνα](https://img.youtube.com/vi/Mi1QBxVjZAw/0.jpg)](https://www.youtube.com/watch?v=Mi1QBxVjZAw) + +> 🎥 Κάντε κλικ στην παραπάνω εικόνα για να παρακολουθήσετε το βίντεο + +Η προσθήκη συσκευών IoT μπορεί να βελτιώσει δραστικά την αλυσίδα εφοδιασμού σας, επιτρέποντάς σας να διαχειρίζεστε πού βρίσκονται τα αντικείμενα, να σχεδιάζετε καλύτερα τη μεταφορά και τη διαχείριση αγαθών και να ανταποκρίνεστε γρηγορότερα σε προβλήματα. + +Όταν διαχειρίζεστε έναν στόλο οχημάτων, όπως φορτηγά, είναι χρήσιμο να γνωρίζετε πού βρίσκεται κάθε όχημα σε μια δεδομένη στιγμή. Τα οχήματα μπορούν να εξοπλιστούν με αισθητήρες GPS που στέλνουν την τοποθεσία τους σε συστήματα IoT, επιτρέποντας στους ιδιοκτήτες να εντοπίζουν την τοποθεσία τους, να βλέπουν τη διαδρομή που έχουν ακολουθήσει και να γνωρίζουν πότε θα φτάσουν στον προορισμό τους. Τα περισσότερα οχήματα λειτουργούν εκτός κάλυψης WiFi, οπότε χρησιμοποιούν δίκτυα κινητής τηλεφωνίας για να στέλνουν αυτού του είδους τα δεδομένα. Μερικές φορές ο αισθητήρας GPS είναι ενσωματωμένος σε πιο σύνθετες συσκευές IoT, όπως ηλεκτρονικά ημερολόγια. Αυτές οι συσκευές παρακολουθούν πόσο χρόνο έχει διανύσει ένα φορτηγό για να διασφαλίσουν ότι οι οδηγοί συμμορφώνονται με τους τοπικούς νόμους για τις ώρες εργασίας. + +Σε αυτό το μάθημα θα μάθετε πώς να παρακολουθείτε την τοποθεσία ενός οχήματος χρησιμοποιώντας έναν αισθητήρα Παγκόσμιου Συστήματος Εντοπισμού Θέσης (GPS). + +Σε αυτό το μάθημα θα καλύψουμε: + +* [Συνδεδεμένα οχήματα](../../../../../3-transport/lessons/1-location-tracking) +* [Γεωχωρικές συντεταγμένες](../../../../../3-transport/lessons/1-location-tracking) +* [Παγκόσμιο Σύστημα Εντοπισμού Θέσης (GPS)](../../../../../3-transport/lessons/1-location-tracking) +* [Ανάγνωση δεδομένων αισθητήρα GPS](../../../../../3-transport/lessons/1-location-tracking) +* [Δεδομένα GPS NMEA](../../../../../3-transport/lessons/1-location-tracking) +* [Αποκωδικοποίηση δεδομένων αισθητήρα GPS](../../../../../3-transport/lessons/1-location-tracking) + +## Συνδεδεμένα οχήματα + +Το IoT μεταμορφώνει τον τρόπο μεταφοράς αγαθών δημιουργώντας στόλους *συνδεδεμένων οχημάτων*. Αυτά τα οχήματα συνδέονται με κεντρικά συστήματα πληροφορικής, αναφέροντας πληροφορίες για την τοποθεσία τους και άλλα δεδομένα αισθητήρων. Η ύπαρξη ενός στόλου συνδεδεμένων οχημάτων προσφέρει μια σειρά από οφέλη: + +* Παρακολούθηση τοποθεσίας - μπορείτε να εντοπίσετε πού βρίσκεται ένα όχημα ανά πάσα στιγμή, επιτρέποντάς σας να: + + * Λαμβάνετε ειδοποιήσεις όταν ένα όχημα πρόκειται να φτάσει σε έναν προορισμό για να προετοιμάσετε το πλήρωμα για εκφόρτωση + * Εντοπίζετε κλεμμένα οχήματα + * Συνδυάζετε δεδομένα τοποθεσίας και διαδρομής με προβλήματα κυκλοφορίας για να ανακατευθύνετε οχήματα κατά τη διάρκεια του ταξιδιού + * Συμμορφώνεστε με τη φορολογία. Ορισμένες χώρες χρεώνουν τα οχήματα για τα χιλιόμετρα που διανύουν σε δημόσιους δρόμους (όπως οι [RUC της Νέας Ζηλανδίας](https://www.nzta.govt.nz/vehicles/licensing-rego/road-user-charges/)), οπότε γνωρίζοντας πότε ένα όχημα βρίσκεται σε δημόσιους δρόμους έναντι ιδιωτικών διευκολύνεται ο υπολογισμός του οφειλόμενου φόρου. + * Γνωρίζετε πού να στείλετε συνεργεία συντήρησης σε περίπτωση βλάβης + +* Τηλεμετρία οδηγού - διασφαλίζοντας ότι οι οδηγοί τηρούν τα όρια ταχύτητας, στρίβουν με κατάλληλες ταχύτητες, φρενάρουν έγκαιρα και αποδοτικά και οδηγούν με ασφάλεια. Τα συνδεδεμένα οχήματα μπορούν επίσης να διαθέτουν κάμερες για την καταγραφή περιστατικών. Αυτό μπορεί να συνδεθεί με την ασφάλιση, προσφέροντας μειωμένα ασφάλιστρα για καλούς οδηγούς. + +* Συμμόρφωση με ώρες οδήγησης - διασφαλίζοντας ότι οι οδηγοί οδηγούν μόνο για τις νόμιμες ώρες τους, βάσει των χρόνων που ενεργοποιούν και απενεργοποιούν τον κινητήρα. + +Αυτά τα οφέλη μπορούν να συνδυαστούν - για παράδειγμα, συνδυάζοντας τη συμμόρφωση με τις ώρες οδήγησης με την παρακολούθηση τοποθεσίας για να ανακατευθύνετε τους οδηγούς εάν δεν μπορούν να φτάσουν στον προορισμό τους εντός των επιτρεπόμενων ωρών οδήγησης. Αυτά μπορούν επίσης να συνδυαστούν με άλλες τηλεμετρίες που αφορούν το όχημα, όπως δεδομένα θερμοκρασίας από φορτηγά ελεγχόμενης θερμοκρασίας, επιτρέποντας την ανακατεύθυνση οχημάτων εάν η τρέχουσα διαδρομή τους σημαίνει ότι τα αγαθά δεν μπορούν να διατηρηθούν στη σωστή θερμοκρασία. + +> 🎓 Η εφοδιαστική είναι η διαδικασία μεταφοράς αγαθών από ένα μέρος σε άλλο, όπως από ένα αγρόκτημα σε ένα σούπερ μάρκετ μέσω μίας ή περισσότερων αποθηκών. Ένας αγρότης συσκευάζει κιβώτια με ντομάτες που φορτώνονται σε ένα φορτηγό, παραδίδονται σε μια κεντρική αποθήκη και τοποθετούνται σε ένα δεύτερο φορτηγό που μπορεί να περιέχει ένα μείγμα διαφορετικών τύπων προϊόντων, τα οποία στη συνέχεια παραδίδονται σε ένα σούπερ μάρκετ. + +Ο βασικός παράγοντας της παρακολούθησης οχημάτων είναι το GPS - αισθητήρες που μπορούν να εντοπίσουν την τοποθεσία τους οπουδήποτε στη Γη. Σε αυτό το μάθημα θα μάθετε πώς να χρησιμοποιείτε έναν αισθητήρα GPS, ξεκινώντας από το πώς να ορίζετε μια τοποθεσία στη Γη. + +## Γεωχωρικές συντεταγμένες + +Οι γεωχωρικές συντεταγμένες χρησιμοποιούνται για να ορίσουν σημεία στην επιφάνεια της Γης, παρόμοια με το πώς οι συντεταγμένες μπορούν να χρησιμοποιηθούν για να σχεδιάσουν ένα pixel σε μια οθόνη υπολογιστή ή να τοποθετήσουν βελονιές σε ένα κέντημα. Για ένα μόνο σημείο, έχετε ένα ζεύγος συντεταγμένων. Για παράδειγμα, η πανεπιστημιούπολη της Microsoft στο Redmond, Washington, USA βρίσκεται στις συντεταγμένες 47.6423109, -122.1390293. + +### Γεωγραφικό πλάτος και μήκος + +Η Γη είναι μια σφαίρα - ένας τρισδιάστατος κύκλος. Εξαιτίας αυτού, τα σημεία ορίζονται διαιρώντας τη σε 360 μοίρες, όπως στη γεωμετρία των κύκλων. Το γεωγραφικό πλάτος μετρά τον αριθμό των μοιρών από βορρά προς νότο, ενώ το γεωγραφικό μήκος μετρά τον αριθμό των μοιρών από ανατολή προς δύση. + +> 💁 Κανείς δεν γνωρίζει πραγματικά τον αρχικό λόγο για τον οποίο οι κύκλοι διαιρούνται σε 360 μοίρες. Η [σελίδα για τη μοίρα (γωνία) στη Wikipedia](https://wikipedia.org/wiki/Degree_(angle)) καλύπτει μερικούς από τους πιθανούς λόγους. + +![Γραμμές γεωγραφικού πλάτους από 90° στον Βόρειο Πόλο, 45° στη μέση μεταξύ του Βόρειου Πόλου και του ισημερινού, 0° στον ισημερινό, -45° στη μέση μεταξύ του ισημερινού και του Νότιου Πόλου και -90° στον Νότιο Πόλο](../../../../../translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.el.png) + +Το γεωγραφικό πλάτος μετριέται χρησιμοποιώντας γραμμές που περιβάλλουν τη Γη και τρέχουν παράλληλα με τον ισημερινό, διαιρώντας το Βόρειο και Νότιο Ημισφαίριο σε 90° το καθένα. Ο ισημερινός βρίσκεται στις 0°, ο Βόρειος Πόλος στις 90°, γνωστός και ως 90° Βόρεια, και ο Νότιος Πόλος στις -90°, ή 90° Νότια. + +Το γεωγραφικό μήκος μετριέται ως ο αριθμός των μοιρών που μετριούνται ανατολικά και δυτικά. Η αρχή των 0° του γεωγραφικού μήκους ονομάζεται *Πρώτος Μεσημβρινός* και ορίστηκε το 1884 ως μια γραμμή από τον Βόρειο στον Νότιο Πόλο που περνά από το [Βασιλικό Αστεροσκοπείο του Greenwich, Αγγλία](https://wikipedia.org/wiki/Royal_Observatory,_Greenwich). + +![Γραμμές γεωγραφικού μήκους που εκτείνονται από -180° δυτικά του Πρώτου Μεσημβρινού, έως 0° στον Πρώτο Μεσημβρινό, έως 180° ανατολικά του Πρώτου Μεσημβρινού](../../../../../translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.el.png) + +> 🎓 Ένας μεσημβρινός είναι μια φανταστική ευθεία γραμμή που εκτείνεται από τον Βόρειο Πόλο στον Νότιο Πόλο, σχηματίζοντας ένα ημικύκλιο. + +Για να μετρήσετε το γεωγραφικό μήκος ενός σημείου, μετράτε τον αριθμό των μοιρών γύρω από τον ισημερινό από τον Πρώτο Μεσημβρινό έως έναν μεσημβρινό που περνά από αυτό το σημείο. Το γεωγραφικό μήκος εκτείνεται από -180°, ή 180° Δυτικά, μέσω 0° στον Πρώτο Μεσημβρινό, έως 180°, ή 180° Ανατολικά. Οι 180° και -180° αναφέρονται στο ίδιο σημείο, τον αντίμεσημβρινό ή 180ο μεσημβρινό. Πρόκειται για έναν μεσημβρινό στην αντίθετη πλευρά της Γης από τον Πρώτο Μεσημβρινό. + +> 💁 Ο αντίμεσημβρινός δεν πρέπει να συγχέεται με τη Διεθνή Γραμμή Ημερομηνίας, η οποία βρίσκεται περίπου στην ίδια θέση, αλλά δεν είναι ευθεία γραμμή και ποικίλλει για να προσαρμοστεί σε γεωπολιτικά όρια. + +✅ Κάντε μια έρευνα: Προσπαθήστε να βρείτε το γεωγραφικό πλάτος και μήκος της τρέχουσας τοποθεσίας σας. + +### Μοίρες, λεπτά και δευτερόλεπτα έναντι δεκαδικών μοιρών + +Παραδοσιακά, οι μετρήσεις των μοιρών γεωγραφικού πλάτους και μήκους γίνονταν χρησιμοποιώντας το εξηκονταδικό σύστημα αρίθμησης, ή βάση-60, ένα σύστημα αρίθμησης που χρησιμοποιούσαν οι Αρχαίοι Βαβυλώνιοι, οι οποίοι έκαναν τις πρώτες μετρήσεις και καταγραφές χρόνου και απόστασης. Χρησιμοποιείτε το εξηκονταδικό καθημερινά πιθανώς χωρίς να το συνειδητοποιείτε - διαιρώντας τις ώρες σε 60 λεπτά και τα λεπτά σε 60 δευτερόλεπτα. + +Το γεωγραφικό μήκος και πλάτος μετριούνται σε μοίρες, λεπτά και δευτερόλεπτα, με ένα λεπτό να είναι 1/60 της μοίρας και 1 δευτερόλεπτο να είναι 1/60 του λεπτού. + +Για παράδειγμα, στον ισημερινό: + +* 1° γεωγραφικού πλάτους είναι **111,3 χιλιόμετρα** +* 1 λεπτό γεωγραφικού πλάτους είναι 111,3/60 = **1,855 χιλιόμετρα** +* 1 δευτερόλεπτο γεωγραφικού πλάτους είναι 1,855/60 = **0,031 χιλιόμετρα** + +Το σύμβολο για ένα λεπτό είναι ένα μονό εισαγωγικό, για ένα δευτερόλεπτο είναι ένα διπλό εισαγωγικό. Για παράδειγμα, 2 μοίρες, 17 λεπτά και 43 δευτερόλεπτα γράφονται ως 2°17'43". Μέρη δευτερολέπτων δίνονται ως δεκαδικά, για παράδειγμα μισό δευτερόλεπτο είναι 0°0'0.5". + +Οι υπολογιστές δεν λειτουργούν σε βάση-60, οπότε αυτές οι συντεταγμένες δίνονται ως δεκαδικές μοίρες όταν χρησιμοποιούνται δεδομένα GPS στα περισσότερα υπολογιστικά συστήματα. Για παράδειγμα, 2°17'43" είναι 2.295277. Το σύμβολο της μοίρας συνήθως παραλείπεται. + +Οι συντεταγμένες για ένα σημείο δίνονται πάντα ως `γεωγραφικό πλάτος, γεωγραφικό μήκος`, οπότε το παράδειγμα νωρίτερα της πανεπιστημιούπολης της Microsoft στις 47.6423109,-122.117198 έχει: + +* Γεωγραφικό πλάτος 47.6423109 (47.6423109 μοίρες βόρεια του ισημερινού) +* Γεωγραφικό μήκος -122.1390293 (122.1390293 μοίρες δυτικά του Πρώτου Μεσημβρινού). + +![Η πανεπιστημιούπολη της Microsoft στις 47.6423109,-122.117198](../../../../../translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.el.png) + +## Παγκόσμιο Σύστημα Εντοπισμού Θέσης (GPS) + +Τα συστήματα GPS χρησιμοποιούν πολλούς δορυφόρους που περιφέρονται γύρω από τη Γη για να εντοπίσουν τη θέση σας. Πιθανότατα έχετε χρησιμοποιήσει συστήματα GPS χωρίς καν να το καταλάβετε - για να βρείτε την τοποθεσία σας σε μια εφαρμογή χαρτών στο τηλέφωνό σας, όπως οι Χάρτες Apple ή Google, για να δείτε πού βρίσκεται η διαδρομή σας σε μια εφαρμογή όπως το Uber ή το Lyft, ή όταν χρησιμοποιείτε δορυφορική πλοήγηση (sat-nav) στο αυτοκίνητό σας. + +> 🎓 Οι δορυφόροι στη "δορυφορική πλοήγηση" είναι δορυφόροι GPS! + +Τα συστήματα GPS λειτουργούν έχοντας έναν αριθμό δορυφόρων που στέλνουν ένα σήμα με την τρέχουσα θέση κάθε δορυφόρου και μια ακριβή χρονική σήμανση. Αυ +💁 Οι δορυφόροι περιέχουν ατομικά ρολόγια που είναι εξαιρετικά ακριβή, αλλά αποκλίνουν κατά 38 μικροδευτερόλεπτα (0.0000038 δευτερόλεπτα) την ημέρα σε σύγκριση με τα ατομικά ρολόγια στη Γη, λόγω της επιβράδυνσης του χρόνου καθώς αυξάνεται η ταχύτητα, όπως προβλέπεται από τις θεωρίες της ειδικής και γενικής σχετικότητας του Αϊνστάιν - οι δορυφόροι κινούνται ταχύτερα από την περιστροφή της Γης. Αυτή η απόκλιση έχει χρησιμοποιηθεί για να αποδειχθούν οι προβλέψεις της ειδικής και γενικής σχετικότητας και πρέπει να λαμβάνεται υπόψη στον σχεδιασμό των συστημάτων GPS. Κυριολεκτικά, ο χρόνος κυλά πιο αργά σε έναν δορυφόρο GPS. +Τα συστήματα GPS έχουν αναπτυχθεί και υλοποιηθεί από διάφορες χώρες και πολιτικές ενώσεις, όπως οι ΗΠΑ, η Ρωσία, η Ιαπωνία, η Ινδία, η ΕΕ και η Κίνα. Οι σύγχρονοι αισθητήρες GPS μπορούν να συνδεθούν με τα περισσότερα από αυτά τα συστήματα για ταχύτερες και πιο ακριβείς θέσεις. + +> 🎓 Οι ομάδες δορυφόρων σε κάθε υλοποίηση αναφέρονται ως αστερισμοί. + +## Ανάγνωση δεδομένων αισθητήρα GPS + +Οι περισσότεροι αισθητήρες GPS στέλνουν δεδομένα GPS μέσω UART. + +> ⚠️ Το UART καλύφθηκε στο [project 2, lesson 2](../../../2-farm/lessons/2-detect-soil-moisture/README.md#universal-asynchronous-receiver-transmitter-uart). Ανατρέξτε σε αυτό το μάθημα αν χρειαστεί. + +Μπορείτε να χρησιμοποιήσετε έναν αισθητήρα GPS στη συσκευή IoT σας για να λάβετε δεδομένα GPS. + +### Εργασία - σύνδεση αισθητήρα GPS και ανάγνωση δεδομένων GPS + +Ακολουθήστε τον αντίστοιχο οδηγό για να διαβάσετε δεδομένα GPS χρησιμοποιώντας τη συσκευή IoT σας: + +* [Arduino - Wio Terminal](wio-terminal-gps-sensor.md) +* [Υπολογιστής μονού πίνακα - Raspberry Pi](pi-gps-sensor.md) +* [Υπολογιστής μονού πίνακα - Εικονική συσκευή](virtual-device-gps-sensor.md) + +## Δεδομένα GPS NMEA + +Όταν εκτελέσατε τον κώδικά σας, πιθανότατα είδατε κάτι που μοιάζει με ακαταλαβίστικο κείμενο στην έξοδο. Αυτό είναι στην πραγματικότητα τυπικά δεδομένα GPS, και όλα έχουν νόημα. + +Οι αισθητήρες GPS εξάγουν δεδομένα χρησιμοποιώντας μηνύματα NMEA, σύμφωνα με το πρότυπο NMEA 0183. Το NMEA είναι ακρωνύμιο για την [National Marine Electronics Association](https://www.nmea.org), μια εμπορική οργάνωση στις ΗΠΑ που θέτει πρότυπα για την επικοινωνία μεταξύ ηλεκτρονικών συστημάτων θαλάσσης. + +> 💁 Αυτό το πρότυπο είναι ιδιόκτητο και πωλείται για τουλάχιστον 2.000 δολάρια ΗΠΑ, αλλά αρκετές πληροφορίες γι' αυτό βρίσκονται στο δημόσιο τομέα, ώστε το μεγαλύτερο μέρος του προτύπου να έχει αναστραφεί και να μπορεί να χρησιμοποιηθεί σε λογισμικό ανοιχτού κώδικα και άλλες μη εμπορικές εφαρμογές. + +Αυτά τα μηνύματα είναι βασισμένα σε κείμενο. Κάθε μήνυμα αποτελείται από μια *πρόταση* που ξεκινά με τον χαρακτήρα `$`, ακολουθούμενο από 2 χαρακτήρες που υποδεικνύουν την πηγή του μηνύματος (π.χ. GP για το σύστημα GPS των ΗΠΑ, GN για το GLONASS, το ρωσικό σύστημα GPS), και 3 χαρακτήρες που υποδεικνύουν τον τύπο του μηνύματος. Το υπόλοιπο μήνυμα είναι πεδία χωρισμένα με κόμματα, που τελειώνουν με έναν χαρακτήρα νέας γραμμής. + +Μερικοί από τους τύπους μηνυμάτων που μπορούν να ληφθούν είναι: + +| Τύπος | Περιγραφή | +| ---- | ----------- | +| GGA | Δεδομένα θέσης GPS, συμπεριλαμβανομένου του γεωγραφικού πλάτους, μήκους και υψομέτρου του αισθητήρα GPS, μαζί με τον αριθμό των δορυφόρων που είναι ορατοί για τον υπολογισμό αυτής της θέσης. | +| ZDA | Η τρέχουσα ημερομηνία και ώρα, συμπεριλαμβανομένης της τοπικής ζώνης ώρας | +| GSV | Λεπτομέρειες για τους δορυφόρους που είναι ορατοί - ορίζονται ως οι δορυφόροι από τους οποίους ο αισθητήρας GPS μπορεί να ανιχνεύσει σήματα | + +> 💁 Τα δεδομένα GPS περιλαμβάνουν χρονικές σημάνσεις, ώστε η συσκευή IoT σας να μπορεί να λαμβάνει την ώρα αν χρειαστεί από έναν αισθητήρα GPS, αντί να βασίζεται σε έναν διακομιστή NTP ή εσωτερικό ρολόι πραγματικού χρόνου. + +Το μήνυμα GGA περιλαμβάνει την τρέχουσα τοποθεσία χρησιμοποιώντας τη μορφή `(dd)dmm.mmmm`, μαζί με έναν χαρακτήρα για να υποδείξει την κατεύθυνση. Το `d` στη μορφή είναι μοίρες, το `m` είναι λεπτά, με δευτερόλεπτα ως δεκαδικά των λεπτών. Για παράδειγμα, 2°17'43" θα ήταν 217.716666667 - 2 μοίρες, 17.716666667 λεπτά. + +Ο χαρακτήρας κατεύθυνσης μπορεί να είναι `N` ή `S` για το γεωγραφικό πλάτος για να υποδείξει βόρεια ή νότια, και `E` ή `W` για το γεωγραφικό μήκος για να υποδείξει ανατολικά ή δυτικά. Για παράδειγμα, ένα γεωγραφικό πλάτος 2°17'43" θα είχε χαρακτήρα κατεύθυνσης `N`, -2°17'43" θα είχε χαρακτήρα κατεύθυνσης `S`. + +Για παράδειγμα - η πρόταση NMEA `$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67` + +* Το μέρος του γεωγραφικού πλάτους είναι `4738.538654,N`, που μετατρέπεται σε 47.6423109 σε δεκαδικές μοίρες. Το `4738.538654` είναι 47.6423109, και η κατεύθυνση είναι `N` (βόρεια), επομένως είναι θετικό γεωγραφικό πλάτος. + +* Το μέρος του γεωγραφικού μήκους είναι `12208.341758,W`, που μετατρέπεται σε -122.1390293 σε δεκαδικές μοίρες. Το `12208.341758` είναι 122.1390293°, και η κατεύθυνση είναι `W` (δυτικά), επομένως είναι αρνητικό γεωγραφικό μήκος. + +## Αποκωδικοποίηση δεδομένων αισθητήρα GPS + +Αντί να χρησιμοποιείτε τα ακατέργαστα δεδομένα NMEA, είναι καλύτερο να τα αποκωδικοποιήσετε σε μια πιο χρήσιμη μορφή. Υπάρχουν πολλές βιβλιοθήκες ανοιχτού κώδικα που μπορείτε να χρησιμοποιήσετε για να εξαγάγετε χρήσιμα δεδομένα από τα ακατέργαστα μηνύματα NMEA. + +### Εργασία - αποκωδικοποίηση δεδομένων αισθητήρα GPS + +Ακολουθήστε τον αντίστοιχο οδηγό για να αποκωδικοποιήσετε δεδομένα αισθητήρα GPS χρησιμοποιώντας τη συσκευή IoT σας: + +* [Arduino - Wio Terminal](wio-terminal-gps-decode.md) +* [Υπολογιστής μονού πίνακα - Raspberry Pi/Εικονική συσκευή IoT](single-board-computer-gps-decode.md) + +--- + +## 🚀 Πρόκληση + +Γράψτε τον δικό σας αποκωδικοποιητή NMEA! Αντί να βασίζεστε σε βιβλιοθήκες τρίτων για την αποκωδικοποίηση προτάσεων NMEA, μπορείτε να γράψετε τον δικό σας αποκωδικοποιητή για να εξαγάγετε γεωγραφικό πλάτος και μήκος από προτάσεις NMEA; + +## Κουίζ μετά το μάθημα + +[Κουίζ μετά το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/22) + +## Ανασκόπηση & Αυτομελέτη + +* Διαβάστε περισσότερα για τις Γεωχωρικές Συντεταγμένες στη [σελίδα του Γεωγραφικού συστήματος συντεταγμένων στη Wikipedia](https://wikipedia.org/wiki/Geographic_coordinate_system). +* Διαβάστε για τους Πρώτους Μεσημβρινούς σε άλλα ουράνια σώματα εκτός από τη Γη στη [σελίδα του Πρώτου Μεσημβρινού στη Wikipedia](https://wikipedia.org/wiki/Prime_meridian#Prime_meridian_on_other_planetary_bodies) +* Ερευνήστε τα διάφορα συστήματα GPS από διάφορες κυβερνήσεις και πολιτικές ενώσεις όπως η ΕΕ, η Ιαπωνία, η Ρωσία, η Ινδία και οι ΗΠΑ. + +## Εργασία + +[Ερευνήστε άλλα δεδομένα GPS](assignment.md) + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/3-transport/lessons/1-location-tracking/assignment.md b/translations/el/3-transport/lessons/1-location-tracking/assignment.md new file mode 100644 index 00000000..ba0fb24e --- /dev/null +++ b/translations/el/3-transport/lessons/1-location-tracking/assignment.md @@ -0,0 +1,29 @@ + +# Εξερεύνηση άλλων δεδομένων GPS + +## Οδηγίες + +Οι προτάσεις NMEA που προέρχονται από τον αισθητήρα GPS σας περιέχουν και άλλα δεδομένα εκτός από την τοποθεσία. Εξερευνήστε τα επιπλέον δεδομένα και χρησιμοποιήστε τα στη συσκευή IoT σας. + +Για παράδειγμα - μπορείτε να λάβετε την τρέχουσα ημερομηνία και ώρα; Εάν χρησιμοποιείτε μικροελεγκτή, μπορείτε να ρυθμίσετε το ρολόι χρησιμοποιώντας δεδομένα GPS με τον ίδιο τρόπο που το ρυθμίσατε χρησιμοποιώντας σήματα NTP στο προηγούμενο έργο; Μπορείτε να λάβετε το υψόμετρο (το ύψος σας πάνω από την επιφάνεια της θάλασσας) ή την τρέχουσα ταχύτητά σας; + +Εάν χρησιμοποιείτε μια εικονική συσκευή IoT, τότε μπορείτε να λάβετε κάποια από αυτά τα δεδομένα στέλνοντας προτάσεις NMEA που δημιουργούνται χρησιμοποιώντας εργαλεία [nmeagen.org](https://www.nmeagen.org). + +## Κριτήρια αξιολόγησης + +| Κριτήριο | Εξαιρετικό | Επαρκές | Χρειάζεται Βελτίωση | +| -------- | ---------- | -------- | ------------------- | +| Λήψη περισσότερων δεδομένων GPS | Μπορεί να λάβει και να χρησιμοποιήσει περισσότερα δεδομένα GPS, είτε ως τηλεμετρία είτε για τη ρύθμιση της συσκευής IoT | Μπορεί να λάβει περισσότερα δεδομένα GPS, αλλά δεν μπορεί να τα χρησιμοποιήσει | Δεν μπορεί να λάβει περισσότερα δεδομένα GPS | + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/3-transport/lessons/1-location-tracking/pi-gps-sensor.md b/translations/el/3-transport/lessons/1-location-tracking/pi-gps-sensor.md new file mode 100644 index 00000000..a354ac4a --- /dev/null +++ b/translations/el/3-transport/lessons/1-location-tracking/pi-gps-sensor.md @@ -0,0 +1,193 @@ + +# Ανάγνωση δεδομένων GPS - Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν αισθητήρα GPS στο Raspberry Pi σας και θα διαβάσετε τιμές από αυτόν. + +## Υλικό + +Το Raspberry Pi χρειάζεται έναν αισθητήρα GPS. + +Ο αισθητήρας που θα χρησιμοποιήσετε είναι ο [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Αυτός ο αισθητήρας μπορεί να συνδεθεί σε πολλαπλά συστήματα GPS για γρήγορη και ακριβή εντοπισμό. Ο αισθητήρας αποτελείται από 2 μέρη - τα βασικά ηλεκτρονικά του αισθητήρα και μια εξωτερική κεραία που συνδέεται με ένα λεπτό καλώδιο για να λαμβάνει τα ραδιοκύματα από τους δορυφόρους. + +Πρόκειται για έναν αισθητήρα UART, οπότε στέλνει δεδομένα GPS μέσω UART. + +## Σύνδεση του αισθητήρα GPS + +Ο αισθητήρας Grove GPS μπορεί να συνδεθεί στο Raspberry Pi. + +### Εργασία - σύνδεση του αισθητήρα GPS + +Συνδέστε τον αισθητήρα GPS. + +![Αισθητήρας Grove GPS](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.el.png) + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του αισθητήρα GPS. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. + +1. Με το Raspberry Pi απενεργοποιημένο, συνδέστε το άλλο άκρο του καλωδίου Grove στην υποδοχή UART που είναι σημειωμένη ως **UART** στο Grove Base hat που είναι συνδεδεμένο στο Pi. Αυτή η υποδοχή βρίσκεται στη μεσαία σειρά, στην πλευρά κοντά στην υποδοχή της κάρτας SD, στο αντίθετο άκρο από τις θύρες USB και την υποδοχή ethernet. + + ![Ο αισθητήρας Grove GPS συνδεδεμένος στην υποδοχή UART](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.el.png) + +1. Τοποθετήστε τον αισθητήρα GPS έτσι ώστε η συνδεδεμένη κεραία να έχει ορατότητα προς τον ουρανό - ιδανικά δίπλα σε ένα ανοιχτό παράθυρο ή έξω. Είναι πιο εύκολο να λάβετε καθαρότερο σήμα χωρίς εμπόδια μπροστά από την κεραία. + +## Προγραμματισμός του αισθητήρα GPS + +Το Raspberry Pi μπορεί τώρα να προγραμματιστεί για να χρησιμοποιήσει τον συνδεδεμένο αισθητήρα GPS. + +### Εργασία - προγραμματισμός του αισθητήρα GPS + +Προγραμματίστε τη συσκευή. + +1. Ενεργοποιήστε το Pi και περιμένετε να εκκινήσει. + +1. Ο αισθητήρας GPS έχει 2 LED - ένα μπλε LED που αναβοσβήνει όταν μεταδίδονται δεδομένα και ένα πράσινο LED που αναβοσβήνει κάθε δευτερόλεπτο όταν λαμβάνονται δεδομένα από δορυφόρους. Βεβαιωθείτε ότι το μπλε LED αναβοσβήνει όταν ενεργοποιείτε το Pi. Μετά από λίγα λεπτά, το πράσινο LED θα αρχίσει να αναβοσβήνει - αν όχι, ίσως χρειαστεί να επανατοποθετήσετε την κεραία. + +1. Εκκινήστε το VS Code, είτε απευθείας στο Pi είτε συνδεθείτε μέσω της επέκτασης Remote SSH. + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη ρύθμιση και την εκκίνηση του VS Code στο μάθημα 1 αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. Με τις νεότερες εκδόσεις του Raspberry Pi που υποστηρίζουν Bluetooth, υπάρχει μια σύγκρουση μεταξύ της σειριακής θύρας που χρησιμοποιείται για το Bluetooth και αυτής που χρησιμοποιείται από την υποδοχή Grove UART. Για να διορθώσετε αυτό, κάντε τα εξής: + + 1. Από το τερματικό του VS Code, επεξεργαστείτε το αρχείο `/boot/config.txt` χρησιμοποιώντας το `nano`, έναν ενσωματωμένο επεξεργαστή κειμένου τερματικού, με την ακόλουθη εντολή: + + ```sh + sudo nano /boot/config.txt + ``` + + > Αυτό το αρχείο δεν μπορεί να επεξεργαστεί από το VS Code καθώς χρειάζεται να το επεξεργαστείτε με δικαιώματα `sudo`, δηλαδή αυξημένα δικαιώματα. Το VS Code δεν εκτελείται με αυτά τα δικαιώματα. + + 1. Χρησιμοποιήστε τα πλήκτρα του κέρσορα για να μετακινηθείτε στο τέλος του αρχείου και αντιγράψτε τον παρακάτω κώδικα, επικολλώντας τον στο τέλος του αρχείου: + + ```ini + dtoverlay=pi3-miniuart-bt + dtoverlay=pi3-disable-bt + enable_uart=1 + ``` + + Μπορείτε να επικολλήσετε χρησιμοποιώντας τις κανονικές συντομεύσεις πληκτρολογίου για τη συσκευή σας (`Ctrl+v` στα Windows, Linux ή Raspberry Pi OS, `Cmd+v` στο macOS). + + 1. Αποθηκεύστε αυτό το αρχείο και βγείτε από το nano πατώντας `Ctrl+x`. Πατήστε `y` όταν σας ζητηθεί να αποθηκεύσετε τον τροποποιημένο buffer και στη συνέχεια πατήστε `enter` για να επιβεβαιώσετε ότι θέλετε να αντικαταστήσετε το `/boot/config.txt`. + + > Αν κάνετε κάποιο λάθος, μπορείτε να βγείτε χωρίς να αποθηκεύσετε και να επαναλάβετε αυτά τα βήματα. + + 1. Επεξεργαστείτε το αρχείο `/boot/cmdline.txt` στο nano με την ακόλουθη εντολή: + + ```sh + sudo nano /boot/cmdline.txt + ``` + + 1. Αυτό το αρχείο περιέχει έναν αριθμό ζευγών κλειδιού/τιμής χωρισμένων με κενά. Αφαιρέστε οποιαδήποτε ζεύγη κλειδιού/τιμής για το κλειδί `console`. Πιθανότατα θα μοιάζουν κάπως έτσι: + + ```output + console=serial0,115200 console=tty1 + ``` + + Μπορείτε να μετακινηθείτε σε αυτές τις εγγραφές χρησιμοποιώντας τα πλήκτρα του κέρσορα και στη συνέχεια να τις διαγράψετε χρησιμοποιώντας τα κανονικά πλήκτρα `del` ή `backspace`. + + Για παράδειγμα, αν το αρχικό σας αρχείο μοιάζει με αυτό: + + ```output + console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait + ``` + + Η νέα έκδοση θα είναι: + + ```output + root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait + ``` + + 1. Ακολουθήστε τα παραπάνω βήματα για να αποθηκεύσετε αυτό το αρχείο και να βγείτε από το nano. + + 1. Επανεκκινήστε το Pi σας και στη συνέχεια συνδεθείτε ξανά στο VS Code μόλις το Pi επανεκκινήσει. + +1. Από το τερματικό, δημιουργήστε έναν νέο φάκελο στον αρχικό κατάλογο του χρήστη `pi` με όνομα `gps-sensor`. Δημιουργήστε ένα αρχείο σε αυτόν τον φάκελο με όνομα `app.py`. + +1. Ανοίξτε αυτόν τον φάκελο στο VS Code. + +1. Το μοντέλο GPS στέλνει δεδομένα UART μέσω μιας σειριακής θύρας. Εγκαταστήστε το πακέτο Pip `pyserial` για να επικοινωνήσετε με τη σειριακή θύρα από τον κώδικα Python σας: + + ```sh + pip3 install pyserial + ``` + +1. Προσθέστε τον παρακάτω κώδικα στο αρχείο `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) + ``` + + Αυτός ο κώδικας εισάγει τη μονάδα `serial` από το πακέτο Pip `pyserial`. Στη συνέχεια, συνδέεται στη σειριακή θύρα `/dev/ttyAMA0` - αυτή είναι η διεύθυνση της σειριακής θύρας που χρησιμοποιεί το Grove Pi Base Hat για την υποδοχή UART. Στη συνέχεια, καθαρίζει οποιαδήποτε υπάρχοντα δεδομένα από αυτή τη σειριακή σύνδεση. + + Στη συνέχεια, ορίζεται μια συνάρτηση με όνομα `print_gps_data` που εκτυπώνει τη γραμμή που της δίνεται στην κονσόλα. + + Στη συνέχεια, ο κώδικας επαναλαμβάνεται για πάντα, διαβάζοντας όσες γραμμές κειμένου μπορεί από τη σειριακή θύρα σε κάθε επανάληψη. Καλεί τη συνάρτηση `print_gps_data` για κάθε γραμμή. + + Αφού διαβαστούν όλα τα δεδομένα, η επανάληψη κοιμάται για 1 δευτερόλεπτο και στη συνέχεια προσπαθεί ξανά. + +1. Εκτελέστε αυτόν τον κώδικα. Θα δείτε την ακατέργαστη έξοδο από τον αισθητήρα GPS, κάτι σαν το παρακάτω: + + ```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 + ``` + + > Αν λάβετε κάποιο από τα παρακάτω σφάλματα όταν σταματάτε και επανεκκινείτε τον κώδικα, προσθέστε ένα μπλοκ `try - except` στη while loop σας. + + ```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) + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-gps/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps/pi). + +😀 Το πρόγραμμα του αισθητήρα GPS σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md b/translations/el/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md new file mode 100644 index 00000000..761219e0 --- /dev/null +++ b/translations/el/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md @@ -0,0 +1,75 @@ + +# Αποκωδικοποίηση δεδομένων GPS - Εικονικό IoT Υλικό και Raspberry Pi + +Σε αυτό το μέρος του μαθήματος, θα αποκωδικοποιήσετε τα μηνύματα NMEA που διαβάζονται από τον αισθητήρα GPS μέσω του Raspberry Pi ή της Εικονικής IoT Συσκευής και θα εξάγετε το γεωγραφικό πλάτος και μήκος. + +## Αποκωδικοποίηση δεδομένων GPS + +Αφού διαβαστούν τα ακατέργαστα δεδομένα NMEA από τη σειριακή θύρα, μπορούν να αποκωδικοποιηθούν χρησιμοποιώντας μια βιβλιοθήκη NMEA ανοιχτού κώδικα. + +### Εργασία - αποκωδικοποίηση δεδομένων GPS + +Προγραμματίστε τη συσκευή ώστε να αποκωδικοποιεί τα δεδομένα GPS. + +1. Ανοίξτε το έργο της εφαρμογής `gps-sensor` αν δεν είναι ήδη ανοιχτό. + +1. Εγκαταστήστε το πακέτο Pip `pynmea2`. Αυτό το πακέτο περιέχει κώδικα για την αποκωδικοποίηση μηνυμάτων NMEA. + + ```sh + pip3 install pynmea2 + ``` + +1. Προσθέστε τον παρακάτω κώδικα στις εισαγωγές στο αρχείο `app.py` για να εισάγετε τη μονάδα `pynmea2`: + + ```python + import pynmea2 + ``` + +1. Αντικαταστήστε το περιεχόμενο της συνάρτησης `print_gps_data` με το παρακάτω: + + ```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') + ``` + + Αυτός ο κώδικας θα χρησιμοποιήσει τη βιβλιοθήκη `pynmea2` για να αναλύσει τη γραμμή που διαβάζεται από τη σειριακή θύρα UART. + + Αν ο τύπος πρότασης του μηνύματος είναι `GGA`, τότε πρόκειται για μήνυμα καθορισμού θέσης και επεξεργάζεται. Οι τιμές γεωγραφικού πλάτους και μήκους διαβάζονται από το μήνυμα και μετατρέπονται σε δεκαδικές μοίρες από τη μορφή NMEA `(d)ddmm.mmmm`. Η συνάρτηση `dm_to_sd` πραγματοποιεί αυτή τη μετατροπή. + + Στη συνέχεια, ελέγχεται η κατεύθυνση του γεωγραφικού πλάτους, και αν το πλάτος είναι νότιο, τότε η τιμή μετατρέπεται σε αρνητικό αριθμό. Το ίδιο ισχύει και για το γεωγραφικό μήκος, αν είναι δυτικό, τότε μετατρέπεται σε αρνητικό αριθμό. + + Τέλος, οι συντεταγμένες εκτυπώνονται στην κονσόλα, μαζί με τον αριθμό των δορυφόρων που χρησιμοποιήθηκαν για τον εντοπισμό της θέσης. + +1. Εκτελέστε τον κώδικα. Αν χρησιμοποιείτε εικονική IoT συσκευή, βεβαιωθείτε ότι η εφαρμογή CounterFit εκτελείται και ότι αποστέλλονται δεδομένα GPS. + + ```output + pi@raspberrypi:~/gps-sensor $ python3 app.py + 47.6423109,-122.1390293 - from 3 satellites + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-gps-decode/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/virtual-device) ή στον φάκελο [code-gps-decode/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/pi). + +😀 Το πρόγραμμα του αισθητήρα GPS με αποκωδικοποίηση δεδομένων ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md b/translations/el/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md new file mode 100644 index 00000000..2aeb73e3 --- /dev/null +++ b/translations/el/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md @@ -0,0 +1,144 @@ + +# Ανάγνωση δεδομένων GPS - Εικονικό IoT Υλικό + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν αισθητήρα GPS στη συσκευή IoT σας και θα διαβάσετε δεδομένα από αυτόν. + +## Εικονικό Υλικό + +Η εικονική συσκευή IoT θα χρησιμοποιήσει έναν προσομοιωμένο αισθητήρα GPS που είναι προσβάσιμος μέσω UART μέσω μιας σειριακής θύρας. + +Ένας φυσικός αισθητήρας GPS διαθέτει κεραία για να λαμβάνει ραδιοκύματα από δορυφόρους GPS και να μετατρέπει τα σήματα GPS σε δεδομένα GPS. Η εικονική έκδοση προσομοιώνει αυτή τη λειτουργία επιτρέποντάς σας είτε να ορίσετε γεωγραφικό πλάτος και μήκος, να στείλετε ακατέργαστες προτάσεις NMEA, είτε να ανεβάσετε ένα αρχείο GPX με πολλαπλές τοποθεσίες που μπορούν να επιστραφούν διαδοχικά. + +> 🎓 Οι προτάσεις NMEA θα καλυφθούν αργότερα σε αυτό το μάθημα. + +### Προσθήκη του αισθητήρα στο CounterFit + +Για να χρησιμοποιήσετε έναν εικονικό αισθητήρα GPS, πρέπει να τον προσθέσετε στην εφαρμογή CounterFit. + +#### Εργασία - προσθήκη του αισθητήρα στο CounterFit + +Προσθέστε τον αισθητήρα GPS στην εφαρμογή CounterFit. + +1. Δημιουργήστε μια νέα εφαρμογή Python στον υπολογιστή σας σε έναν φάκελο που ονομάζεται `gps-sensor` με ένα μόνο αρχείο που ονομάζεται `app.py` και ένα εικονικό περιβάλλον Python, και προσθέστε τα πακέτα pip του CounterFit. + + > ⚠️ Μπορείτε να ανατρέξετε [στις οδηγίες για τη δημιουργία και ρύθμιση ενός έργου Python CounterFit στο μάθημα 1, αν χρειαστεί](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Εγκαταστήστε ένα επιπλέον πακέτο Pip για να εγκαταστήσετε ένα CounterFit shim που μπορεί να επικοινωνεί με αισθητήρες που βασίζονται σε UART μέσω σειριακής σύνδεσης. Βεβαιωθείτε ότι το εγκαθιστάτε από ένα τερματικό με ενεργοποιημένο το εικονικό περιβάλλον. + + ```sh + pip install counterfit-shims-serial + ``` + +1. Βεβαιωθείτε ότι η εφαρμογή ιστού CounterFit εκτελείται. + +1. Δημιουργήστε έναν αισθητήρα GPS: + + 1. Στο πλαίσιο *Create sensor* στον πίνακα *Sensors*, ανοίξτε το αναπτυσσόμενο μενού *Sensor type* και επιλέξτε *UART GPS*. + + 1. Αφήστε τη *Θύρα* ρυθμισμένη σε */dev/ttyAMA0*. + + 1. Επιλέξτε το κουμπί **Add** για να δημιουργήσετε τον αισθητήρα GPS στη θύρα `/dev/ttyAMA0`. + + ![Οι ρυθμίσεις του αισθητήρα GPS](../../../../../translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.el.png) + + Ο αισθητήρας GPS θα δημιουργηθεί και θα εμφανιστεί στη λίστα αισθητήρων. + + ![Ο αισθητήρας GPS δημιουργήθηκε](../../../../../translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.el.png) + +## Προγραμματισμός του αισθητήρα GPS + +Η εικονική συσκευή IoT μπορεί τώρα να προγραμματιστεί για να χρησιμοποιεί τον εικονικό αισθητήρα GPS. + +### Εργασία - προγραμματισμός του αισθητήρα GPS + +Προγραμματίστε την εφαρμογή του αισθητήρα GPS. + +1. Βεβαιωθείτε ότι η εφαρμογή `gps-sensor` είναι ανοιχτή στο VS Code. + +1. Ανοίξτε το αρχείο `app.py`. + +1. Προσθέστε τον παρακάτω κώδικα στην κορυφή του `app.py` για να συνδέσετε την εφαρμογή στο CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Προσθέστε τον παρακάτω κώδικα κάτω από αυτό για να εισαγάγετε κάποιες απαραίτητες βιβλιοθήκες, συμπεριλαμβανομένης της βιβλιοθήκης για τη σειριακή θύρα του CounterFit: + + ```python + import time + import counterfit_shims_serial + + serial = counterfit_shims_serial.Serial('/dev/ttyAMA0') + ``` + + Αυτός ο κώδικας εισάγει τη μονάδα `serial` από το πακέτο Pip `counterfit_shims_serial`. Στη συνέχεια, συνδέεται στη σειριακή θύρα `/dev/ttyAMA0` - αυτή είναι η διεύθυνση της σειριακής θύρας που χρησιμοποιεί ο εικονικός αισθητήρας GPS για τη θύρα UART. + +1. Προσθέστε τον παρακάτω κώδικα κάτω από αυτό για να διαβάσετε από τη σειριακή θύρα και να εκτυπώσετε τις τιμές στην κονσόλα: + + ```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) + ``` + + Ορίζεται μια συνάρτηση που ονομάζεται `print_gps_data`, η οποία εκτυπώνει τη γραμμή που της δίνεται στην κονσόλα. + + Στη συνέχεια, ο κώδικας εκτελεί έναν ατέρμονο βρόχο, διαβάζοντας όσες γραμμές κειμένου μπορεί από τη σειριακή θύρα σε κάθε επανάληψη. Καλεί τη συνάρτηση `print_gps_data` για κάθε γραμμή. + + Αφού διαβαστούν όλα τα δεδομένα, ο βρόχος κάνει παύση για 1 δευτερόλεπτο και στη συνέχεια προσπαθεί ξανά. + +1. Εκτελέστε αυτόν τον κώδικα, διασφαλίζοντας ότι χρησιμοποιείτε διαφορετικό τερματικό από αυτό στο οποίο εκτελείται η εφαρμογή CounterFit, ώστε η εφαρμογή CounterFit να παραμείνει σε λειτουργία. + +1. Από την εφαρμογή CounterFit, αλλάξτε την τιμή του αισθητήρα GPS. Μπορείτε να το κάνετε με έναν από τους παρακάτω τρόπους: + + * Ορίστε την **Πηγή** σε `Lat/Lon` και ορίστε ένα συγκεκριμένο γεωγραφικό πλάτος, μήκος και αριθμό δορυφόρων που χρησιμοποιούνται για τη λήψη της θέσης GPS. Αυτή η τιμή θα σταλεί μόνο μία φορά, οπότε επιλέξτε το πλαίσιο **Repeat** για να επαναλαμβάνονται τα δεδομένα κάθε δευτερόλεπτο. + + ![Ο αισθητήρας GPS με επιλεγμένο lat lon](../../../../../translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.el.png) + + * Ορίστε την **Πηγή** σε `NMEA` και προσθέστε κάποιες προτάσεις NMEA στο πλαίσιο κειμένου. Όλες αυτές οι τιμές θα σταλούν, με καθυστέρηση 1 δευτερολέπτου πριν από κάθε νέα πρόταση GGA (θέση). + + ![Ο αισθητήρας GPS με προτάσεις NMEA](../../../../../translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.el.png) + + Μπορείτε να χρησιμοποιήσετε ένα εργαλείο όπως το [nmeagen.org](https://www.nmeagen.org) για να δημιουργήσετε αυτές τις προτάσεις σχεδιάζοντας σε έναν χάρτη. Αυτές οι τιμές θα σταλούν μόνο μία φορά, οπότε επιλέξτε το πλαίσιο **Repeat** για να επαναλαμβάνονται ένα δευτερόλεπτο μετά την αποστολή όλων. + + * Ορίστε την **Πηγή** σε GPX αρχείο και ανεβάστε ένα αρχείο GPX με τοποθεσίες διαδρομής. Μπορείτε να κατεβάσετε αρχεία GPX από διάφορους δημοφιλείς ιστότοπους χαρτογράφησης και πεζοπορίας, όπως το [AllTrails](https://www.alltrails.com/). Αυτά τα αρχεία περιέχουν πολλαπλές τοποθεσίες GPS ως διαδρομή, και ο αισθητήρας GPS θα επιστρέφει κάθε νέα τοποθεσία σε διαστήματα του 1 δευτερολέπτου. + + ![Ο αισθητήρας GPS με αρχείο GPX](../../../../../translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.el.png) + + Αυτές οι τιμές θα σταλούν μόνο μία φορά, οπότε επιλέξτε το πλαίσιο **Repeat** για να επαναλαμβάνονται ένα δευτερόλεπτο μετά την αποστολή όλων. + + Αφού ρυθμίσετε τις παραμέτρους GPS, επιλέξτε το κουμπί **Set** για να αποθηκεύσετε αυτές τις τιμές στον αισθητήρα. + +1. Θα δείτε την ακατέργαστη έξοδο από τον αισθητήρα GPS, κάτι σαν το παρακάτω: + + ```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 + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-gps/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps/virtual-device). + +😀 Το πρόγραμμα του αισθητήρα GPS σας ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md b/translations/el/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md new file mode 100644 index 00000000..2b72ebe6 --- /dev/null +++ b/translations/el/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md @@ -0,0 +1,83 @@ + +# Αποκωδικοποίηση δεδομένων GPS - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα αποκωδικοποιήσετε τα μηνύματα NMEA που διαβάζονται από τον αισθητήρα GPS μέσω του Wio Terminal και θα εξάγετε το γεωγραφικό πλάτος και μήκος. + +## Αποκωδικοποίηση δεδομένων GPS + +Αφού διαβαστούν τα ακατέργαστα δεδομένα NMEA από τη σειριακή θύρα, μπορούν να αποκωδικοποιηθούν χρησιμοποιώντας μια βιβλιοθήκη ανοιχτού κώδικα για NMEA. + +### Εργασία - αποκωδικοποίηση δεδομένων GPS + +Προγραμματίστε τη συσκευή ώστε να αποκωδικοποιεί τα δεδομένα GPS. + +1. Ανοίξτε το έργο της εφαρμογής `gps-sensor` αν δεν είναι ήδη ανοιχτό. + +1. Προσθέστε μια εξάρτηση βιβλιοθήκης για τη βιβλιοθήκη [TinyGPSPlus](https://github.com/mikalhart/TinyGPSPlus) στο αρχείο `platformio.ini` του έργου. Αυτή η βιβλιοθήκη περιέχει κώδικα για την αποκωδικοποίηση δεδομένων NMEA. + + ```ini + lib_deps = + mikalhart/TinyGPSPlus @ 1.0.2 + ``` + +1. Στο `main.cpp`, προσθέστε μια οδηγία include για τη βιβλιοθήκη TinyGPSPlus: + + ```cpp + #include + ``` + +1. Κάτω από τη δήλωση του `Serial3`, δηλώστε ένα αντικείμενο TinyGPSPlus για την επεξεργασία των προτάσεων NMEA: + + ```cpp + TinyGPSPlus gps; + ``` + +1. Αλλάξτε το περιεχόμενο της συνάρτησης `printGPSData` στο εξής: + + ```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"); + } + } + ``` + + Αυτός ο κώδικας διαβάζει τον επόμενο χαρακτήρα από τη σειριακή θύρα UART στον αποκωδικοποιητή NMEA `gps`. Μετά από κάθε χαρακτήρα, ελέγχει αν ο αποκωδικοποιητής έχει διαβάσει μια έγκυρη πρόταση και στη συνέχεια αν έχει διαβάσει μια έγκυρη τοποθεσία. Αν η τοποθεσία είναι έγκυρη, την αποστέλλει στον σειριακό παρακολουθητή, μαζί με τον αριθμό των δορυφόρων που συνέβαλαν σε αυτήν την τοποθέτηση. + +1. Δημιουργήστε και ανεβάστε τον κώδικα στο Wio Terminal. + +1. Μόλις ολοκληρωθεί η μεταφόρτωση, μπορείτε να παρακολουθήσετε τα δεδομένα τοποθεσίας GPS χρησιμοποιώντας τον σειριακό παρακολουθητή. + + ```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 + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-gps-decode/wio-terminal](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/wio-terminal). + +😀 Το πρόγραμμα του αισθητήρα GPS με αποκωδικοποίηση δεδομένων ήταν επιτυχές! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md b/translations/el/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md new file mode 100644 index 00000000..85e84f14 --- /dev/null +++ b/translations/el/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md @@ -0,0 +1,154 @@ + +# Ανάγνωση δεδομένων GPS - Wio Terminal + +Σε αυτό το μέρος του μαθήματος, θα προσθέσετε έναν αισθητήρα GPS στο Wio Terminal σας και θα διαβάσετε δεδομένα από αυτόν. + +## Υλικό + +Το Wio Terminal χρειάζεται έναν αισθητήρα GPS. + +Ο αισθητήρας που θα χρησιμοποιήσετε είναι ο [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Αυτός ο αισθητήρας μπορεί να συνδεθεί σε πολλαπλά συστήματα GPS για γρήγορη και ακριβή λήψη σήματος. Ο αισθητήρας αποτελείται από 2 μέρη - τα βασικά ηλεκτρονικά του αισθητήρα και μια εξωτερική κεραία που συνδέεται με ένα λεπτό καλώδιο για να λαμβάνει τα ραδιοκύματα από τους δορυφόρους. + +Πρόκειται για έναν αισθητήρα UART, οπότε στέλνει δεδομένα GPS μέσω UART. + +### Σύνδεση του αισθητήρα GPS + +Ο αισθητήρας Grove GPS μπορεί να συνδεθεί στο Wio Terminal. + +#### Εργασία - σύνδεση του αισθητήρα GPS + +Συνδέστε τον αισθητήρα GPS. + +![Ένας αισθητήρας Grove GPS](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.el.png) + +1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του αισθητήρα GPS. Θα μπει μόνο με έναν συγκεκριμένο τρόπο. + +1. Με το Wio Terminal αποσυνδεδεμένο από τον υπολογιστή σας ή άλλη πηγή τροφοδοσίας, συνδέστε το άλλο άκρο του καλωδίου Grove στην αριστερή υποδοχή Grove του Wio Terminal, όπως κοιτάτε την οθόνη. Αυτή είναι η υποδοχή που βρίσκεται πιο κοντά στο κουμπί τροφοδοσίας. + + ![Ο αισθητήρας Grove GPS συνδεδεμένος στην αριστερή υποδοχή](../../../../../translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.el.png) + +1. Τοποθετήστε τον αισθητήρα GPS έτσι ώστε η συνδεδεμένη κεραία να έχει ορατότητα προς τον ουρανό - ιδανικά δίπλα σε ένα ανοιχτό παράθυρο ή έξω. Είναι πιο εύκολο να λάβετε καθαρό σήμα χωρίς εμπόδια μπροστά από την κεραία. + +1. Τώρα μπορείτε να συνδέσετε το Wio Terminal στον υπολογιστή σας. + +1. Ο αισθητήρας GPS έχει 2 LED - ένα μπλε LED που αναβοσβήνει όταν μεταδίδονται δεδομένα και ένα πράσινο LED που αναβοσβήνει κάθε δευτερόλεπτο όταν λαμβάνονται δεδομένα από δορυφόρους. Βεβαιωθείτε ότι το μπλε LED αναβοσβήνει όταν ενεργοποιείτε το Wio Terminal. Μετά από λίγα λεπτά, το πράσινο LED θα αρχίσει να αναβοσβήνει - αν όχι, ίσως χρειαστεί να επανατοποθετήσετε την κεραία. + +## Προγραμματισμός του αισθητήρα GPS + +Το Wio Terminal μπορεί τώρα να προγραμματιστεί για να χρησιμοποιεί τον συνδεδεμένο αισθητήρα GPS. + +### Εργασία - προγραμματισμός του αισθητήρα GPS + +Προγραμματίστε τη συσκευή. + +1. Δημιουργήστε ένα νέο έργο Wio Terminal χρησιμοποιώντας το PlatformIO. Ονομάστε αυτό το έργο `gps-sensor`. Προσθέστε κώδικα στη συνάρτηση `setup` για να διαμορφώσετε τη σειριακή θύρα. + +1. Προσθέστε την παρακάτω οδηγία `include` στην κορυφή του αρχείου `main.cpp`. Αυτή περιλαμβάνει ένα αρχείο κεφαλίδας με συναρτήσεις για τη διαμόρφωση της αριστερής θύρας Grove για UART. + + ```cpp + #include + ``` + +1. Κάτω από αυτό, προσθέστε την παρακάτω γραμμή κώδικα για να δηλώσετε μια σύνδεση σειριακής θύρας με τη θύρα UART: + + ```cpp + static Uart Serial3(&sercom3, PIN_WIRE_SCL, PIN_WIRE_SDA, SERCOM_RX_PAD_1, UART_TX_PAD_0); + ``` + +1. Πρέπει να προσθέσετε λίγο κώδικα για να ανακατευθύνετε ορισμένους εσωτερικούς χειριστές σημάτων σε αυτή τη σειριακή θύρα. Προσθέστε τον παρακάτω κώδικα κάτω από τη δήλωση `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. Στη συνάρτηση `setup`, κάτω από τη διαμόρφωση της θύρας `Serial`, διαμορφώστε τη σειριακή θύρα UART με τον παρακάτω κώδικα: + + ```cpp + Serial3.begin(9600); + + while (!Serial3) + ; // Wait for Serial3 to be ready + + delay(1000); + ``` + +1. Κάτω από αυτόν τον κώδικα στη συνάρτηση `setup`, προσθέστε τον παρακάτω κώδικα για να συνδέσετε την υποδοχή Grove με τη σειριακή θύρα: + + ```cpp + pinPeripheral(PIN_WIRE_SCL, PIO_SERCOM_ALT); + ``` + +1. Προσθέστε την παρακάτω συνάρτηση πριν από τη συνάρτηση `loop` για να στείλετε τα δεδομένα GPS στον σειριακό παρακολουθητή: + + ```cpp + void printGPSData() + { + Serial.println(Serial3.readStringUntil('\n')); + } + ``` + +1. Στη συνάρτηση `loop`, προσθέστε τον παρακάτω κώδικα για να διαβάσετε από τη σειριακή θύρα UART και να εκτυπώσετε την έξοδο στον σειριακό παρακολουθητή: + + ```cpp + while (Serial3.available() > 0) + { + printGPSData(); + } + + delay(1000); + ``` + + Αυτός ο κώδικας διαβάζει από τη σειριακή θύρα UART. Η συνάρτηση `readStringUntil` διαβάζει μέχρι έναν χαρακτήρα τερματισμού, σε αυτή την περίπτωση μια νέα γραμμή. Αυτό θα διαβάσει μια ολόκληρη πρόταση NMEA (οι προτάσεις NMEA τερματίζονται με έναν χαρακτήρα νέας γραμμής). Όσο υπάρχουν δεδομένα που μπορούν να διαβαστούν από τη σειριακή θύρα UART, διαβάζονται και αποστέλλονται στον σειριακό παρακολουθητή μέσω της συνάρτησης `printGPSData`. Όταν δεν υπάρχουν άλλα δεδομένα για ανάγνωση, η `loop` καθυστερεί για 1 δευτερόλεπτο (1.000ms). + +1. Δημιουργήστε και ανεβάστε τον κώδικα στο Wio Terminal. + +1. Μόλις ανεβεί, μπορείτε να παρακολουθήσετε τα δεδομένα GPS χρησιμοποιώντας τον σειριακό παρακολουθητή. + + ```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 + ``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο [code-gps/wio-terminal](../../../../../3-transport/lessons/1-location-tracking/code-gps/wio-terminal). + +😀 Το πρόγραμμα του αισθητήρα GPS ολοκληρώθηκε με επιτυχία! + +--- + +**Αποποίηση ευθύνης**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/3-transport/lessons/2-store-location-data/README.md b/translations/el/3-transport/lessons/2-store-location-data/README.md new file mode 100644 index 00000000..660af232 --- /dev/null +++ b/translations/el/3-transport/lessons/2-store-location-data/README.md @@ -0,0 +1,459 @@ + +# Δεδομένα τοποθεσίας καταστήματος + +![Σχεδιαστική σημείωση για αυτήν την ενότητα](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.el.jpg) + +> Σχεδιαστική σημείωση από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση. + +## Ερωτηματολόγιο πριν την ενότητα + +[Ερωτηματολόγιο πριν την ενότητα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) + +## Εισαγωγή + +Στην προηγούμενη ενότητα, μάθατε πώς να χρησιμοποιείτε έναν αισθητήρα GPS για να καταγράφετε δεδομένα τοποθεσίας. Για να χρησιμοποιήσετε αυτά τα δεδομένα ώστε να οπτικοποιήσετε την τοποθεσία ενός φορτηγού γεμάτου τρόφιμα και το ταξίδι του, πρέπει να τα στείλετε σε μια υπηρεσία IoT στο cloud και στη συνέχεια να τα αποθηκεύσετε κάπου. + +Σε αυτήν την ενότητα θα μάθετε για τους διάφορους τρόπους αποθήκευσης δεδομένων IoT και πώς να αποθηκεύετε δεδομένα από την υπηρεσία IoT σας χρησιμοποιώντας serverless κώδικα. + +Σε αυτήν την ενότητα θα καλύψουμε: + +* [Δομημένα και μη δομημένα δεδομένα](../../../../../3-transport/lessons/2-store-location-data) +* [Αποστολή δεδομένων GPS σε IoT Hub](../../../../../3-transport/lessons/2-store-location-data) +* [Διαδρομές hot, warm και cold](../../../../../3-transport/lessons/2-store-location-data) +* [Διαχείριση συμβάντων GPS με serverless κώδικα](../../../../../3-transport/lessons/2-store-location-data) +* [Λογαριασμοί αποθήκευσης Azure](../../../../../3-transport/lessons/2-store-location-data) +* [Σύνδεση του serverless κώδικα με την αποθήκευση](../../../../../3-transport/lessons/2-store-location-data) + +## Δομημένα και μη δομημένα δεδομένα + +Τα υπολογιστικά συστήματα επεξεργάζονται δεδομένα, τα οποία έρχονται σε διάφορες μορφές και μεγέθη. Μπορεί να είναι από απλούς αριθμούς, μεγάλα κείμενα, βίντεο και εικόνες, έως δεδομένα IoT. Τα δεδομένα συνήθως χωρίζονται σε δύο κατηγορίες - *δομημένα* δεδομένα και *μη δομημένα* δεδομένα. + +* **Δομημένα δεδομένα** είναι δεδομένα με καλά καθορισμένη, αυστηρή δομή που δεν αλλάζει και συνήθως αντιστοιχούν σε πίνακες δεδομένων με σχέσεις. Ένα παράδειγμα είναι τα προσωπικά στοιχεία ενός ατόμου, όπως το όνομα, η ημερομηνία γέννησης και η διεύθυνση. + +* **Μη δομημένα δεδομένα** είναι δεδομένα χωρίς καλά καθορισμένη, αυστηρή δομή, συμπεριλαμβανομένων δεδομένων που μπορεί να αλλάζουν συχνά τη δομή τους. Ένα παράδειγμα είναι έγγραφα όπως γραπτά κείμενα ή υπολογιστικά φύλλα. + +✅ Κάντε μια έρευνα: Μπορείτε να σκεφτείτε άλλα παραδείγματα δομημένων και μη δομημένων δεδομένων; + +> 💁 Υπάρχουν επίσης ημιδομημένα δεδομένα που είναι δομημένα αλλά δεν ταιριάζουν σε σταθερούς πίνακες δεδομένων. + +Τα δεδομένα IoT συνήθως θεωρούνται μη δομημένα δεδομένα. + +Φανταστείτε ότι προσθέτετε συσκευές IoT σε έναν στόλο οχημάτων για μια μεγάλη εμπορική φάρμα. Μπορεί να θέλετε να χρησιμοποιήσετε διαφορετικές συσκευές για διαφορετικούς τύπους οχημάτων. Για παράδειγμα: + +* Για γεωργικά οχήματα όπως τρακτέρ, θέλετε δεδομένα GPS για να βεβαιωθείτε ότι εργάζονται στα σωστά χωράφια. +* Για φορτηγά μεταφοράς τροφίμων σε αποθήκες, θέλετε δεδομένα GPS καθώς και δεδομένα ταχύτητας και επιτάχυνσης για να βεβαιωθείτε ότι ο οδηγός οδηγεί με ασφάλεια, καθώς και δεδομένα ταυτότητας οδηγού και έναρξης/λήξης για συμμόρφωση με τους τοπικούς νόμους για τις ώρες εργασίας. +* Για φορτηγά ψυγεία, θέλετε επίσης δεδομένα θερμοκρασίας για να βεβαιωθείτε ότι τα τρόφιμα δεν ζεσταίνονται ή κρυώνουν υπερβολικά και χαλάνε κατά τη μεταφορά. + +Αυτά τα δεδομένα μπορεί να αλλάζουν συνεχώς. Για παράδειγμα, αν η συσκευή IoT βρίσκεται στην καμπίνα ενός φορτηγού, τότε τα δεδομένα που στέλνει μπορεί να αλλάζουν καθώς αλλάζει το τρέιλερ, για παράδειγμα στέλνοντας δεδομένα θερμοκρασίας μόνο όταν χρησιμοποιείται τρέιλερ ψυγείου. + +✅ Τι άλλα δεδομένα IoT μπορεί να καταγραφούν; Σκεφτείτε τα είδη φορτίων που μπορούν να μεταφέρουν τα φορτηγά, καθώς και δεδομένα συντήρησης. + +Αυτά τα δεδομένα ποικίλλουν από όχημα σε όχημα, αλλά όλα στέλνονται στην ίδια υπηρεσία IoT για επεξεργασία. Η υπηρεσία IoT πρέπει να μπορεί να επεξεργάζεται αυτά τα μη δομημένα δεδομένα, αποθηκεύοντάς τα με τρόπο που να επιτρέπει την αναζήτηση ή ανάλυση, αλλά να λειτουργεί με διαφορετικές δομές δεδομένων. + +### Αποθήκευση SQL vs NoSQL + +Οι βάσεις δεδομένων είναι υπηρεσίες που σας επιτρέπουν να αποθηκεύετε και να αναζητάτε δεδομένα. Οι βάσεις δεδομένων χωρίζονται σε δύο τύπους - SQL και NoSQL. + +#### Βάσεις δεδομένων SQL + +Οι πρώτες βάσεις δεδομένων ήταν Συστήματα Διαχείρισης Σχεσιακών Βάσεων Δεδομένων (RDBMS), ή σχεσιακές βάσεις δεδομένων. Αυτές είναι επίσης γνωστές ως βάσεις δεδομένων SQL λόγω της γλώσσας Structured Query Language (SQL) που χρησιμοποιείται για την αλληλεπίδραση με αυτές για την προσθήκη, αφαίρεση, ενημέρωση ή αναζήτηση δεδομένων. Αυτές οι βάσεις δεδομένων αποτελούνται από ένα σχήμα - ένα καλά καθορισμένο σύνολο πινάκων δεδομένων, παρόμοιο με ένα υπολογιστικό φύλλο. Κάθε πίνακας έχει πολλαπλές ονομασμένες στήλες. Όταν εισάγετε δεδομένα, προσθέτετε μια γραμμή στον πίνακα, τοποθετώντας τιμές σε κάθε στήλη. Αυτό διατηρεί τα δεδομένα σε μια πολύ αυστηρή δομή - αν και μπορείτε να αφήσετε στήλες κενές, αν θέλετε να προσθέσετε μια νέα στήλη πρέπει να το κάνετε στη βάση δεδομένων, συμπληρώνοντας τιμές για τις υπάρχουσες γραμμές. Αυτές οι βάσεις δεδομένων είναι σχεσιακές - δηλαδή ένας πίνακας μπορεί να έχει σχέση με έναν άλλο. + +![Μια σχεσιακή βάση δεδομένων με το ID του πίνακα Χρηστών να σχετίζεται με τη στήλη user ID του πίνακα αγορών, και το ID του πίνακα προϊόντων να σχετίζεται με το product ID του πίνακα αγορών](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.el.png) + +Για παράδειγμα, αν αποθηκεύατε τα προσωπικά στοιχεία ενός χρήστη σε έναν πίνακα, θα είχατε κάποιο είδος εσωτερικού μοναδικού ID ανά χρήστη που χρησιμοποιείται σε μια γραμμή σε έναν πίνακα που περιέχει το όνομα και τη διεύθυνση του χρήστη. Αν στη συνέχεια θέλατε να αποθηκεύσετε άλλες λεπτομέρειες για αυτόν τον χρήστη, όπως τις αγορές του, σε έναν άλλο πίνακα, θα είχατε μια στήλη στον νέο πίνακα για το ID του χρήστη. Όταν αναζητάτε έναν χρήστη, μπορείτε να χρησιμοποιήσετε το ID του για να λάβετε τα προσωπικά του στοιχεία από έναν πίνακα και τις αγορές του από έναν άλλο. + +Οι βάσεις δεδομένων SQL είναι ιδανικές για την αποθήκευση δομημένων δεδομένων και για όταν θέλετε να βεβαιωθείτε ότι τα δεδομένα ταιριάζουν με το σχήμα σας. + +✅ Αν δεν έχετε χρησιμοποιήσει SQL πριν, αφιερώστε λίγο χρόνο για να διαβάσετε σχετικά με αυτήν στη [σελίδα SQL στη Wikipedia](https://wikipedia.org/wiki/SQL). + +Μερικές γνωστές βάσεις δεδομένων SQL είναι οι Microsoft SQL Server, MySQL και PostgreSQL. + +✅ Κάντε μια έρευνα: Διαβάστε για μερικές από αυτές τις βάσεις δεδομένων SQL και τις δυνατότητές τους. + +#### Βάσεις δεδομένων NoSQL + +Οι βάσεις δεδομένων NoSQL ονομάζονται NoSQL επειδή δεν έχουν την ίδια αυστηρή δομή με τις βάσεις δεδομένων SQL. Είναι επίσης γνωστές ως βάσεις δεδομένων εγγράφων καθώς μπορούν να αποθηκεύουν μη δομημένα δεδομένα όπως έγγραφα. + +> 💁 Παρά το όνομά τους, ορισμένες βάσεις δεδομένων NoSQL σας επιτρέπουν να χρησιμοποιείτε SQL για την αναζήτηση δεδομένων. + +![Έγγραφα σε φακέλους σε μια βάση δεδομένων NoSQL](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.el.png) + +Οι βάσεις δεδομένων NoSQL δεν έχουν προκαθορισμένο σχήμα που να περιορίζει τον τρόπο αποθήκευσης δεδομένων, αντίθετα μπορείτε να εισάγετε οποιαδήποτε μη δομημένα δεδομένα, συνήθως χρησιμοποιώντας έγγραφα JSON. Αυτά τα έγγραφα μπορούν να οργανωθούν σε φακέλους, παρόμοια με αρχεία στον υπολογιστή σας. Κάθε έγγραφο μπορεί να έχει διαφορετικά πεδία από άλλα έγγραφα - για παράδειγμα, αν αποθηκεύατε δεδομένα IoT από τα γεωργικά σας οχήματα, κάποια μπορεί να έχουν πεδία για δεδομένα επιταχυνσιόμετρου και ταχύτητας, ενώ άλλα μπορεί να έχουν πεδία για τη θερμοκρασία στο τρέιλερ. Αν προσθέτατε έναν νέο τύπο φορτηγού, όπως ένα με ενσωματωμένες ζυγαριές για την παρακολούθηση του βάρους των προϊόντων που μεταφέρονται, τότε η συσκευή IoT σας θα μπορούσε να προσθέσει αυτό το νέο πεδίο και να αποθηκευτεί χωρίς αλλαγές στη βάση δεδομένων. + +Μερικές γνωστές βάσεις δεδομένων NoSQL περιλαμβάνουν τις Azure CosmosDB, MongoDB και CouchDB. + +✅ Κάντε μια έρευνα: Διαβάστε για μερικές από αυτές τις βάσεις δεδομένων NoSQL και τις δυνατότητές τους. + +Σε αυτήν την ενότητα, θα χρησιμοποιήσετε αποθήκευση NoSQL για να αποθηκεύσετε δεδομένα IoT. + +## Αποστολή δεδομένων GPS σε IoT Hub + +Στην προηγούμενη ενότητα καταγράψατε δεδομένα GPS από έναν αισθητήρα GPS συνδεδεμένο στη συσκευή IoT σας. Για να αποθηκεύσετε αυτά τα δεδομένα IoT στο cloud, πρέπει να τα στείλετε σε μια υπηρεσία IoT. Και πάλι, θα χρησιμοποιήσετε το Azure IoT Hub, την ίδια υπηρεσία IoT cloud που χρησιμοποιήσατε στο προηγούμενο έργο. + +![Αποστολή τηλεμετρίας GPS από μια συσκευή IoT στο IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.el.png) + +### Εργασία - αποστολή δεδομένων GPS σε IoT Hub + +1. Δημιουργήστε ένα νέο IoT Hub χρησιμοποιώντας το δωρεάν επίπεδο. + + > ⚠️ Μπορείτε να ανατρέξετε στις [οδηγίες για τη δημιουργία ενός IoT Hub από το έργο 2, ενότητα 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) αν χρειαστεί. + + Θυμηθείτε να δημιουργήσετε μια νέα Ομάδα Πόρων. Ονομάστε τη νέα Ομάδα Πόρων `gps-sensor` και το νέο IoT Hub ένα μοναδικό όνομα βασισμένο στο `gps-sensor`, όπως `gps-sensor-<το όνομά σας>`. + + > 💁 Αν έχετε ακόμα το IoT Hub από το προηγούμενο έργο, μπορείτε να το επαναχρησιμοποιήσετε. Θυμηθείτε να χρησιμοποιήσετε το όνομα αυτού του IoT Hub και την Ομάδα Πόρων στην οποία βρίσκεται όταν δημιουργείτε άλλες υπηρεσίες. + +1. Προσθέστε μια νέα συσκευή στο IoT Hub. Ονομάστε αυτήν τη συσκευή `gps-sensor`. Αποκτήστε τη συμβολοσειρά σύνδεσης για τη συσκευή. + +1. Ενημερώστε τον κώδικα της συσκευής σας ώστε να στέλνει τα δεδομένα GPS στο νέο IoT Hub χρησιμοποιώντας τη συμβολοσειρά σύνδεσης της συσκευής από το προηγούμενο βήμα. + + > ⚠️ Μπορείτε να ανατρέξετε στις [οδηγίες για τη σύνδεση της συσκευής σας με το IoT από το έργο 2, ενότητα 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service) αν χρειαστεί. + +1. Όταν στέλνετε τα δεδομένα GPS, κάντε το ως JSON στη παρακάτω μορφή: + + ```json + { + "gps" : + { + "lat" : , + "lon" : + } + } + ``` + +1. Στείλτε δεδομένα GPS κάθε λεπτό ώστε να μην εξαντλήσετε την ημερήσια κατανομή μηνυμάτων. + +Αν χρησιμοποιείτε το Wio Terminal, θυμηθείτε να προσθέσετε όλες τις απαραίτητες βιβλιοθήκες και να ρυθμίσετε την ώρα χρησιμοποιώντας έναν NTP server. Ο κώδικάς σας θα πρέπει επίσης να βεβαιωθεί ότι έχει διαβάσει όλα τα δεδομένα από τη σειριακή θύρα πριν στείλει την τοποθεσία GPS, χρησιμοποιώντας τον υπάρχοντα κώδικα από την προηγούμενη ενότητα. Χρησιμοποιήστε τον παρακάτω κώδικα για να κατασκευάσετε το έγγραφο JSON: + +```cpp +DynamicJsonDocument doc(1024); +doc["gps"]["lat"] = gps.location.lat(); +doc["gps"]["lon"] = gps.location.lng(); +``` + +Αν χρησιμοποιείτε μια Εικονική συσκευή IoT, θυμηθείτε να εγκαταστήσετε όλες τις απαραίτητες βιβλιοθήκες χρησιμοποιώντας ένα εικονικό περιβάλλον. + +Για το Raspberry Pi και την Εικονική συσκευή IoT, χρησιμοποιήστε τον υπάρχοντα κώδικα από την προηγούμενη ενότητα για να λάβετε τις τιμές γεωγραφικού πλάτους και μήκους και στη συνέχεια στείλτε τις στη σωστή μορφή JSON με τον παρακάτω κώδικα: + +```python +message_json = { "gps" : { "lat":lat, "lon":lon } } +print("Sending telemetry", message_json) +message = Message(json.dumps(message_json)) +``` + +> 💁 Μπορείτε να βρείτε αυτόν τον κώδικα στους φακέλους [code/wio-terminal](../../../../../3-transport/lessons/2-store-location-data/code/wio-terminal), [code/pi](../../../../../3-transport/lessons/2-store-location-data/code/pi) ή [code/virtual-device](../../../../../3-transport/lessons/2-store-location-data/code/virtual-device). + +Εκτελέστε τον κώδικα της συσκευής σας και βεβαιωθείτε ότι τα μηνύματα ρέουν στο IoT Hub χρησιμοποιώντας την εντολή CLI `az iot hub monitor-events`. + +## Διαδρομές hot, warm και cold + +Τα δεδομένα που ρέουν από μια συσκευή IoT στο cloud δεν επεξεργάζονται πάντα σε πραγματικό χρόνο. Κάποια δεδομένα χρειάζονται επεξεργασία σε πραγματικό χρόνο, άλλα μπορούν να επεξεργαστούν λίγο αργότερα και άλλα μπορούν να επεξεργαστούν πολύ αργότερα. Η ροή δεδομένων σε διαφορετικές υπηρεσίες που επεξεργάζονται τα δεδομένα σε διαφορετικούς χρόνους αναφέρεται ως διαδρομές hot, warm και cold. + +### Διαδρομή hot + +Η διαδρομή hot αναφέρεται σε δεδομένα που πρέπει να επεξεργαστούν σε πραγματικό χρόνο ή σχεδόν σε πραγματικό χρόνο. Θα χρησιμοποιούσατε δεδομένα διαδρομής hot για ειδοποιήσεις, όπως ειδοποιήσεις ότι ένα όχημα πλησιάζει σε μια αποθήκη ή ότι η θερμοκρασία σε ένα φορτηγό ψυγείο είναι πολύ υψηλή. + +Για να χρησιμοποιήσετε δεδομένα διαδρομής hot, ο κώδικάς σας θα ανταποκρίνεται σε συμβάντα μόλις ληφθούν από τις υπηρεσίες cloud σας. + +### Διαδρομή warm + +Η διαδρομή warm αναφέρεται σε δεδομένα που μπορούν να επεξεργαστούν λίγο μετά τη λήψη τους, για παράδειγμα για αναφορές ή αναλύσεις βραχυπρόθεσμου χρόνου. Θα χρησιμοποιούσατε δεδομένα διαδρομής warm για ημερήσιες αναφορές σχετικά με τη χιλιομετρική απόσταση των οχημάτων, χρησιμοποιώντας δεδομένα που συλλέχθηκαν την προηγούμενη ημέρα. + +Τα δεδομένα διαδρομής warm αποθηκεύονται μόλις ληφθούν από την υπηρεσία cloud μέσα σε κάποιο είδος αποθήκευσης που μπορεί να προσπελαστεί γρήγορα. + +### Διαδρομή cold + +Η διαδρομή cold αναφέρεται σε ιστορικά δεδομένα, αποθηκεύοντας δεδομένα για μακροχρόνια χρήση ώστε να επεξεργαστούν όποτε χρειαστεί. Για παράδειγμα, θα μπορούσατε να χρησιμοποιήσετε τη διαδρομή cold για να λάβετε ετήσιες αναφορές χιλιομετρικής απόστασης για οχήματα ή να εκτελέσετε αναλύσεις σε διαδρομές για να βρείτε την πιο βέλτιστη διαδρομή για μεί +> ⚠️ Μπορείτε να ανατρέξετε στις [οδηγίες για τη δημιουργία ενός Azure Functions Project από το project 2, μάθημα 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application) αν χρειαστεί. +1. Προσθέστε έναν ενεργοποιητή συμβάντων IoT Hub που χρησιμοποιεί το συμβατό με Event Hub endpoint του IoT Hub. + + > ⚠️ Μπορείτε να ανατρέξετε στις [οδηγίες για τη δημιουργία ενός ενεργοποιητή συμβάντων IoT Hub από το έργο 2, μάθημα 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) αν χρειαστεί. + +1. Ορίστε τη συμβολοσειρά σύνδεσης του συμβατού με Event Hub endpoint στο αρχείο `local.settings.json` και χρησιμοποιήστε το κλειδί για αυτή την καταχώρηση στο αρχείο `function.json`. + +1. Χρησιμοποιήστε την εφαρμογή Azurite ως τοπικό εξομοιωτή αποθήκευσης. + +1. Εκτελέστε την εφαρμογή των λειτουργιών σας για να βεβαιωθείτε ότι λαμβάνει συμβάντα από τη συσκευή GPS σας. Βεβαιωθείτε ότι η συσκευή IoT σας λειτουργεί επίσης και στέλνει δεδομένα GPS. + + ```output + Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} + ``` + +## Λογαριασμοί Αποθήκευσης Azure + +![Το λογότυπο του Azure Storage](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.el.png) + +Οι Λογαριασμοί Αποθήκευσης Azure είναι μια υπηρεσία γενικής αποθήκευσης που μπορεί να αποθηκεύσει δεδομένα με διάφορους τρόπους. Μπορείτε να αποθηκεύσετε δεδομένα ως blobs, σε ουρές, σε πίνακες ή ως αρχεία, και όλα αυτά ταυτόχρονα. + +### Αποθήκευση Blob + +Η λέξη *Blob* σημαίνει μεγάλα δυαδικά αντικείμενα, αλλά έχει γίνει ο όρος για οποιαδήποτε μη δομημένα δεδομένα. Μπορείτε να αποθηκεύσετε οποιαδήποτε δεδομένα στην αποθήκευση blob, από έγγραφα JSON που περιέχουν δεδομένα IoT, έως αρχεία εικόνων και ταινιών. Η αποθήκευση blob έχει την έννοια των *containers*, δηλαδή ονομασμένων "κάδων" όπου μπορείτε να αποθηκεύσετε δεδομένα, παρόμοια με πίνακες σε μια σχεσιακή βάση δεδομένων. Αυτά τα containers μπορούν να έχουν έναν ή περισσότερους φακέλους για την αποθήκευση blobs, και κάθε φάκελος μπορεί να περιέχει άλλους φακέλους, παρόμοια με τον τρόπο που αποθηκεύονται τα αρχεία στον σκληρό δίσκο του υπολογιστή σας. + +Θα χρησιμοποιήσετε την αποθήκευση blob σε αυτό το μάθημα για να αποθηκεύσετε δεδομένα IoT. + +✅ Κάντε λίγη έρευνα: Διαβάστε για την [Αποθήκευση Blob Azure](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) + +### Αποθήκευση Πινάκων + +Η αποθήκευση πινάκων σας επιτρέπει να αποθηκεύετε ημιδομημένα δεδομένα. Η αποθήκευση πινάκων είναι στην πραγματικότητα μια βάση δεδομένων NoSQL, οπότε δεν απαιτεί έναν προκαθορισμένο ορισμό πινάκων, αλλά έχει σχεδιαστεί για να αποθηκεύει δεδομένα σε έναν ή περισσότερους πίνακες, με μοναδικά κλειδιά για τον ορισμό κάθε γραμμής. + +✅ Κάντε λίγη έρευνα: Διαβάστε για την [Αποθήκευση Πινάκων Azure](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) + +### Αποθήκευση Ουρών + +Η αποθήκευση ουρών σας επιτρέπει να αποθηκεύετε μηνύματα μεγέθους έως 64KB σε μια ουρά. Μπορείτε να προσθέσετε μηνύματα στο τέλος της ουράς και να τα διαβάσετε από την αρχή. Οι ουρές αποθηκεύουν μηνύματα επ' αόριστον, εφόσον υπάρχει διαθέσιμος χώρος αποθήκευσης, επιτρέποντας την αποθήκευση μηνυμάτων μακροπρόθεσμα και την ανάγνωσή τους όταν χρειάζεται. Για παράδειγμα, αν θέλετε να εκτελέσετε μια μηνιαία εργασία για την επεξεργασία δεδομένων GPS, μπορείτε να προσθέτετε δεδομένα στην ουρά κάθε μέρα για έναν μήνα και στο τέλος του μήνα να επεξεργαστείτε όλα τα μηνύματα από την ουρά. + +✅ Κάντε λίγη έρευνα: Διαβάστε για την [Αποθήκευση Ουρών Azure](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) + +### Αποθήκευση Αρχείων + +Η αποθήκευση αρχείων είναι η αποθήκευση αρχείων στο cloud, και οποιεσδήποτε εφαρμογές ή συσκευές μπορούν να συνδεθούν χρησιμοποιώντας πρότυπα πρωτόκολλα της βιομηχανίας. Μπορείτε να γράψετε αρχεία στην αποθήκευση αρχείων και στη συνέχεια να τα προσαρτήσετε ως δίσκο στον υπολογιστή σας. + +✅ Κάντε λίγη έρευνα: Διαβάστε για την [Αποθήκευση Αρχείων Azure](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) + +## Συνδέστε τον serverless κώδικά σας με την αποθήκευση + +Η εφαρμογή λειτουργιών σας τώρα χρειάζεται να συνδεθεί με την αποθήκευση blob για να αποθηκεύσει τα μηνύματα από το IoT Hub. Υπάρχουν 2 τρόποι για να το κάνετε αυτό: + +* Μέσα στον κώδικα της λειτουργίας, συνδεθείτε με την αποθήκευση blob χρησιμοποιώντας το Python SDK για την αποθήκευση blob και γράψτε τα δεδομένα ως blobs. +* Χρησιμοποιήστε μια σύνδεση εξόδου λειτουργίας για να συνδέσετε την τιμή επιστροφής της λειτουργίας με την αποθήκευση blob και να αποθηκεύσετε αυτόματα το blob. + +Σε αυτό το μάθημα, θα χρησιμοποιήσετε το Python SDK για να δείτε πώς να αλληλεπιδράσετε με την αποθήκευση blob. + +![Αποστολή τηλεμετρίας GPS από μια συσκευή IoT στο IoT Hub, στη συνέχεια στις Azure Functions μέσω ενός ενεργοποιητή event hub, και τέλος αποθήκευση στην αποθήκευση blob](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.el.png) + +Τα δεδομένα θα αποθηκευτούν ως JSON blob με την εξής μορφή: + +```json +{ + "device_id": , + "timestamp" :