diff --git a/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.id.png b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.id.png new file mode 100644 index 00000000..1ba4f5c7 Binary files /dev/null and b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.id.png differ diff --git a/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.ms.png b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.ms.png new file mode 100644 index 00000000..1ba4f5c7 Binary files /dev/null and b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.ms.png differ diff --git a/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.tl.png b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.tl.png new file mode 100644 index 00000000..1ba4f5c7 Binary files /dev/null and b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.tl.png differ diff --git a/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.vi.png b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.vi.png new file mode 100644 index 00000000..1ba4f5c7 Binary files /dev/null and b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.vi.png differ diff --git a/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.id.png b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.id.png new file mode 100644 index 00000000..3cac91bb Binary files /dev/null and b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.id.png differ diff --git a/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.ms.png b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.ms.png new file mode 100644 index 00000000..3cac91bb Binary files /dev/null and b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.ms.png differ diff --git a/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.tl.png b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.tl.png new file mode 100644 index 00000000..3cac91bb Binary files /dev/null and b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.tl.png differ diff --git a/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.vi.png b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.vi.png new file mode 100644 index 00000000..3cac91bb Binary files /dev/null and b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.vi.png differ diff --git a/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.id.png b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.id.png new file mode 100644 index 00000000..967e6539 Binary files /dev/null and b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.id.png differ diff --git a/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.ms.png b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.ms.png new file mode 100644 index 00000000..967e6539 Binary files /dev/null and b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.ms.png differ diff --git a/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.tl.png b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.tl.png new file mode 100644 index 00000000..967e6539 Binary files /dev/null and b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.tl.png differ diff --git a/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.vi.png b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.vi.png new file mode 100644 index 00000000..967e6539 Binary files /dev/null and b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.vi.png differ diff --git a/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.id.png b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.id.png new file mode 100644 index 00000000..247c1dd6 Binary files /dev/null and b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.id.png differ diff --git a/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.ms.png b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.ms.png new file mode 100644 index 00000000..247c1dd6 Binary files /dev/null and b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.ms.png differ diff --git a/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.tl.png b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.tl.png new file mode 100644 index 00000000..247c1dd6 Binary files /dev/null and b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.tl.png differ diff --git a/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.vi.png b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.vi.png new file mode 100644 index 00000000..247c1dd6 Binary files /dev/null and b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.vi.png differ diff --git a/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.id.png b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.id.png new file mode 100644 index 00000000..e89d81c4 Binary files /dev/null and b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.id.png differ diff --git a/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.ms.png b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.ms.png new file mode 100644 index 00000000..e89d81c4 Binary files /dev/null and b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.ms.png differ diff --git a/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.tl.png b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.tl.png new file mode 100644 index 00000000..e89d81c4 Binary files /dev/null and b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.tl.png differ diff --git a/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.vi.png b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.vi.png new file mode 100644 index 00000000..e89d81c4 Binary files /dev/null and b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.vi.png differ diff --git a/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.id.png b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.id.png new file mode 100644 index 00000000..0237836d Binary files /dev/null and b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.id.png differ diff --git a/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.ms.png b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.ms.png new file mode 100644 index 00000000..0237836d Binary files /dev/null and b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.ms.png differ diff --git a/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.tl.png b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.tl.png new file mode 100644 index 00000000..0237836d Binary files /dev/null and b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.tl.png differ diff --git a/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.vi.png b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.vi.png new file mode 100644 index 00000000..0237836d Binary files /dev/null and b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.vi.png differ diff --git a/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.id.png b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.id.png new file mode 100644 index 00000000..4229fee0 Binary files /dev/null and b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.id.png differ diff --git a/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.ms.png b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.ms.png new file mode 100644 index 00000000..4229fee0 Binary files /dev/null and b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.ms.png differ diff --git a/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.tl.png b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.tl.png new file mode 100644 index 00000000..4229fee0 Binary files /dev/null and b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.tl.png differ diff --git a/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.vi.png b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.vi.png new file mode 100644 index 00000000..4229fee0 Binary files /dev/null and b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.vi.png differ diff --git a/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.id.png b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.id.png new file mode 100644 index 00000000..9b503ac8 Binary files /dev/null and b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.id.png differ diff --git a/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.ms.png b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.ms.png new file mode 100644 index 00000000..9b503ac8 Binary files /dev/null and b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.ms.png differ diff --git a/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.tl.png b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.tl.png new file mode 100644 index 00000000..9b503ac8 Binary files /dev/null and b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.tl.png differ diff --git a/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.vi.png b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.vi.png new file mode 100644 index 00000000..9b503ac8 Binary files /dev/null and b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.vi.png differ diff --git a/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.id.png b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.id.png new file mode 100644 index 00000000..c98b7aaf Binary files /dev/null and b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.id.png differ diff --git a/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.ms.png b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.ms.png new file mode 100644 index 00000000..c98b7aaf Binary files /dev/null and b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.ms.png differ diff --git a/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.tl.png b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.tl.png new file mode 100644 index 00000000..c98b7aaf Binary files /dev/null and b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.tl.png differ diff --git a/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.vi.png b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.vi.png new file mode 100644 index 00000000..c98b7aaf Binary files /dev/null and b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.vi.png differ diff --git a/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.id.png b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.id.png new file mode 100644 index 00000000..706f83bc Binary files /dev/null and b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.id.png differ diff --git a/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.ms.png b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.ms.png new file mode 100644 index 00000000..706f83bc Binary files /dev/null and b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.ms.png differ diff --git a/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.tl.png b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.tl.png new file mode 100644 index 00000000..706f83bc Binary files /dev/null and b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.tl.png differ diff --git a/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.vi.png b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.vi.png new file mode 100644 index 00000000..706f83bc Binary files /dev/null and b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.vi.png differ diff --git a/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.id.png b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.id.png new file mode 100644 index 00000000..76bec4da Binary files /dev/null and b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.id.png differ diff --git a/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.ms.png b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.ms.png new file mode 100644 index 00000000..76bec4da Binary files /dev/null and b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.ms.png differ diff --git a/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.tl.png b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.tl.png new file mode 100644 index 00000000..76bec4da Binary files /dev/null and b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.tl.png differ diff --git a/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.vi.png b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.vi.png new file mode 100644 index 00000000..76bec4da Binary files /dev/null and b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.vi.png differ diff --git a/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.id.png b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.id.png new file mode 100644 index 00000000..b49060a2 Binary files /dev/null and b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.id.png differ diff --git a/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.ms.png b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.ms.png new file mode 100644 index 00000000..b49060a2 Binary files /dev/null and b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.ms.png differ diff --git a/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.tl.png b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.tl.png new file mode 100644 index 00000000..b49060a2 Binary files /dev/null and b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.tl.png differ diff --git a/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.vi.png b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.vi.png new file mode 100644 index 00000000..b49060a2 Binary files /dev/null and b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.vi.png differ diff --git a/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.id.png b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.id.png new file mode 100644 index 00000000..3ca064d5 Binary files /dev/null and b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.id.png differ diff --git a/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.ms.png b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.ms.png new file mode 100644 index 00000000..3ca064d5 Binary files /dev/null and b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.ms.png differ diff --git a/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.tl.png b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.tl.png new file mode 100644 index 00000000..3ca064d5 Binary files /dev/null and b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.tl.png differ diff --git a/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.vi.png b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.vi.png new file mode 100644 index 00000000..3ca064d5 Binary files /dev/null and b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.vi.png differ diff --git a/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.id.png b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.id.png new file mode 100644 index 00000000..1f5f2412 Binary files /dev/null and b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.id.png differ diff --git a/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.ms.png b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.ms.png new file mode 100644 index 00000000..1f5f2412 Binary files /dev/null and b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.ms.png differ diff --git a/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.tl.png b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.tl.png new file mode 100644 index 00000000..1f5f2412 Binary files /dev/null and b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.tl.png differ diff --git a/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.vi.png b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.vi.png new file mode 100644 index 00000000..1f5f2412 Binary files /dev/null and b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.vi.png differ diff --git a/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.id.png b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.id.png new file mode 100644 index 00000000..2953cea1 Binary files /dev/null and b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.id.png differ diff --git a/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.ms.png b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.ms.png new file mode 100644 index 00000000..2953cea1 Binary files /dev/null and b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.ms.png differ diff --git a/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.tl.png b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.tl.png new file mode 100644 index 00000000..2953cea1 Binary files /dev/null and b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.tl.png differ diff --git a/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.vi.png b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.vi.png new file mode 100644 index 00000000..2953cea1 Binary files /dev/null and b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.vi.png differ diff --git a/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.id.png b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.id.png new file mode 100644 index 00000000..2ce7dedf Binary files /dev/null and b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.id.png differ diff --git a/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.ms.png b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.ms.png new file mode 100644 index 00000000..2ce7dedf Binary files /dev/null and b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.ms.png differ diff --git a/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.tl.png b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.tl.png new file mode 100644 index 00000000..2ce7dedf Binary files /dev/null and b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.tl.png differ diff --git a/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.vi.png b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.vi.png new file mode 100644 index 00000000..2ce7dedf Binary files /dev/null and b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.vi.png differ diff --git a/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.id.png b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.id.png new file mode 100644 index 00000000..157c08c6 Binary files /dev/null and b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.id.png differ diff --git a/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.ms.png b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.ms.png new file mode 100644 index 00000000..157c08c6 Binary files /dev/null and b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.ms.png differ diff --git a/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.tl.png b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.tl.png new file mode 100644 index 00000000..157c08c6 Binary files /dev/null and b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.tl.png differ diff --git a/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.vi.png b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.vi.png new file mode 100644 index 00000000..157c08c6 Binary files /dev/null and b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.vi.png differ diff --git a/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.id.png b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.id.png new file mode 100644 index 00000000..031361a6 Binary files /dev/null and b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.id.png differ diff --git a/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.ms.png b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.ms.png new file mode 100644 index 00000000..031361a6 Binary files /dev/null and b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.ms.png differ diff --git a/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.tl.png b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.tl.png new file mode 100644 index 00000000..031361a6 Binary files /dev/null and b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.tl.png differ diff --git a/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.vi.png b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.vi.png new file mode 100644 index 00000000..031361a6 Binary files /dev/null and b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.vi.png differ diff --git a/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.id.png b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.id.png new file mode 100644 index 00000000..3a43eb23 Binary files /dev/null and b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.id.png differ diff --git a/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.ms.png b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.ms.png new file mode 100644 index 00000000..3a43eb23 Binary files /dev/null and b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.ms.png differ diff --git a/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.tl.png b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.tl.png new file mode 100644 index 00000000..3a43eb23 Binary files /dev/null and b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.tl.png differ diff --git a/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.vi.png b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.vi.png new file mode 100644 index 00000000..3a43eb23 Binary files /dev/null and b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.vi.png differ diff --git a/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.id.png b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.id.png new file mode 100644 index 00000000..7c9552e3 Binary files /dev/null and b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.id.png differ diff --git a/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.ms.png b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.ms.png new file mode 100644 index 00000000..7c9552e3 Binary files /dev/null and b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.ms.png differ diff --git a/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.tl.png b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.tl.png new file mode 100644 index 00000000..7c9552e3 Binary files /dev/null and b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.tl.png differ diff --git a/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.vi.png b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.vi.png new file mode 100644 index 00000000..7c9552e3 Binary files /dev/null and b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.vi.png differ diff --git a/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.id.png b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.id.png new file mode 100644 index 00000000..78f695b7 Binary files /dev/null and b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.id.png differ diff --git a/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.ms.png b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.ms.png new file mode 100644 index 00000000..78f695b7 Binary files /dev/null and b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.ms.png differ diff --git a/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.tl.png b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.tl.png new file mode 100644 index 00000000..78f695b7 Binary files /dev/null and b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.tl.png differ diff --git a/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.vi.png b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.vi.png new file mode 100644 index 00000000..78f695b7 Binary files /dev/null and b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.vi.png differ diff --git a/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.id.png b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.id.png new file mode 100644 index 00000000..77f563fb Binary files /dev/null and b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.id.png differ diff --git a/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.ms.png b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.ms.png new file mode 100644 index 00000000..77f563fb Binary files /dev/null and b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.ms.png differ diff --git a/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.tl.png b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.tl.png new file mode 100644 index 00000000..77f563fb Binary files /dev/null and b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.tl.png differ diff --git a/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.vi.png b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.vi.png new file mode 100644 index 00000000..77f563fb Binary files /dev/null and b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.vi.png differ diff --git a/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.id.png b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.id.png new file mode 100644 index 00000000..8dccd514 Binary files /dev/null and b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.id.png differ diff --git a/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.ms.png b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.ms.png new file mode 100644 index 00000000..8dccd514 Binary files /dev/null and b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.ms.png differ diff --git a/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.tl.png b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.tl.png new file mode 100644 index 00000000..8dccd514 Binary files /dev/null and b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.tl.png differ diff --git a/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.vi.png b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.vi.png new file mode 100644 index 00000000..8dccd514 Binary files /dev/null and b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.vi.png differ diff --git a/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.id.png b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.id.png new file mode 100644 index 00000000..b75e015e Binary files /dev/null and b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.id.png differ diff --git a/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.ms.png b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.ms.png new file mode 100644 index 00000000..b75e015e Binary files /dev/null and b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.ms.png differ diff --git a/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.tl.png b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.tl.png new file mode 100644 index 00000000..b75e015e Binary files /dev/null and b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.tl.png differ diff --git a/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.vi.png b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.vi.png new file mode 100644 index 00000000..b75e015e Binary files /dev/null and b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.vi.png differ diff --git a/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.id.png b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.id.png new file mode 100644 index 00000000..5bfed282 Binary files /dev/null and b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.id.png differ diff --git a/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.ms.png b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.ms.png new file mode 100644 index 00000000..5bfed282 Binary files /dev/null and b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.ms.png differ diff --git a/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.tl.png b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.tl.png new file mode 100644 index 00000000..5bfed282 Binary files /dev/null and b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.tl.png differ diff --git a/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.vi.png b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.vi.png new file mode 100644 index 00000000..5bfed282 Binary files /dev/null and b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.vi.png differ diff --git a/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.id.png b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.id.png new file mode 100644 index 00000000..34ca765c Binary files /dev/null and b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.id.png differ diff --git a/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.ms.png b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.ms.png new file mode 100644 index 00000000..34ca765c Binary files /dev/null and b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.ms.png differ diff --git a/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.tl.png b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.tl.png new file mode 100644 index 00000000..34ca765c Binary files /dev/null and b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.tl.png differ diff --git a/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.vi.png b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.vi.png new file mode 100644 index 00000000..34ca765c Binary files /dev/null and b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.vi.png differ diff --git a/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.id.png b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.id.png new file mode 100644 index 00000000..d1f7bc09 Binary files /dev/null and b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.id.png differ diff --git a/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.ms.png b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.ms.png new file mode 100644 index 00000000..d1f7bc09 Binary files /dev/null and b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.ms.png differ diff --git a/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.tl.png b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.tl.png new file mode 100644 index 00000000..d1f7bc09 Binary files /dev/null and b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.tl.png differ diff --git a/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.vi.png b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.vi.png new file mode 100644 index 00000000..d1f7bc09 Binary files /dev/null and b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.vi.png differ diff --git a/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.id.png b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.id.png new file mode 100644 index 00000000..c215b446 Binary files /dev/null and b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.id.png differ diff --git a/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.ms.png b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.ms.png new file mode 100644 index 00000000..c215b446 Binary files /dev/null and b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.ms.png differ diff --git a/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.tl.png b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.tl.png new file mode 100644 index 00000000..c215b446 Binary files /dev/null and b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.tl.png differ diff --git a/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.vi.png b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.vi.png new file mode 100644 index 00000000..c215b446 Binary files /dev/null and b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.vi.png differ diff --git a/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.id.png b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.id.png new file mode 100644 index 00000000..63f58daa Binary files /dev/null and b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.id.png differ diff --git a/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.ms.png b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.ms.png new file mode 100644 index 00000000..63f58daa Binary files /dev/null and b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.ms.png differ diff --git a/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.tl.png b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.tl.png new file mode 100644 index 00000000..63f58daa Binary files /dev/null and b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.tl.png differ diff --git a/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.vi.png b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.vi.png new file mode 100644 index 00000000..63f58daa Binary files /dev/null and b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.vi.png differ diff --git a/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.id.png b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.id.png new file mode 100644 index 00000000..3eb38501 Binary files /dev/null and b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.id.png differ diff --git a/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.ms.png b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.ms.png new file mode 100644 index 00000000..3eb38501 Binary files /dev/null and b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.ms.png differ diff --git a/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.tl.png b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.tl.png new file mode 100644 index 00000000..3eb38501 Binary files /dev/null and b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.tl.png differ diff --git a/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.vi.png b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.vi.png new file mode 100644 index 00000000..3eb38501 Binary files /dev/null and b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.vi.png differ diff --git a/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.id.png b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.id.png new file mode 100644 index 00000000..4f960870 Binary files /dev/null and b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.id.png differ diff --git a/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.ms.png b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.ms.png new file mode 100644 index 00000000..4f960870 Binary files /dev/null and b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.ms.png differ diff --git a/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.tl.png b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.tl.png new file mode 100644 index 00000000..4f960870 Binary files /dev/null and b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.tl.png differ diff --git a/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.vi.png b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.vi.png new file mode 100644 index 00000000..4f960870 Binary files /dev/null and b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.vi.png differ diff --git a/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.id.png b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.id.png new file mode 100644 index 00000000..ca5b5882 Binary files /dev/null and b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.id.png differ diff --git a/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.ms.png b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.ms.png new file mode 100644 index 00000000..ca5b5882 Binary files /dev/null and b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.ms.png differ diff --git a/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.tl.png b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.tl.png new file mode 100644 index 00000000..ca5b5882 Binary files /dev/null and b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.tl.png differ diff --git a/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.vi.png b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.vi.png new file mode 100644 index 00000000..ca5b5882 Binary files /dev/null and b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.vi.png differ diff --git a/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.id.png b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.id.png new file mode 100644 index 00000000..2c3440cd Binary files /dev/null and b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.id.png differ diff --git a/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.ms.png b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.ms.png new file mode 100644 index 00000000..2c3440cd Binary files /dev/null and b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.ms.png differ diff --git a/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.tl.png b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.tl.png new file mode 100644 index 00000000..2c3440cd Binary files /dev/null and b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.tl.png differ diff --git a/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.vi.png b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.vi.png new file mode 100644 index 00000000..2c3440cd Binary files /dev/null and b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.vi.png differ diff --git a/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.id.png b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.id.png new file mode 100644 index 00000000..5294a9dc Binary files /dev/null and b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.id.png differ diff --git a/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.ms.png b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.ms.png new file mode 100644 index 00000000..5294a9dc Binary files /dev/null and b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.ms.png differ diff --git a/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.tl.png b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.tl.png new file mode 100644 index 00000000..5294a9dc Binary files /dev/null and b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.tl.png differ diff --git a/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.vi.png b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.vi.png new file mode 100644 index 00000000..5294a9dc Binary files /dev/null and b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.vi.png differ diff --git a/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.id.png b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.id.png new file mode 100644 index 00000000..912ac4ca Binary files /dev/null and b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.id.png differ diff --git a/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.ms.png b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.ms.png new file mode 100644 index 00000000..912ac4ca Binary files /dev/null and b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.ms.png differ diff --git a/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.tl.png b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.tl.png new file mode 100644 index 00000000..912ac4ca Binary files /dev/null and b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.tl.png differ diff --git a/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.vi.png b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.vi.png new file mode 100644 index 00000000..912ac4ca Binary files /dev/null and b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.vi.png differ diff --git a/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.id.png b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.id.png new file mode 100644 index 00000000..8e47de7d Binary files /dev/null and b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.id.png differ diff --git a/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.ms.png b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.ms.png new file mode 100644 index 00000000..8e47de7d Binary files /dev/null and b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.ms.png differ diff --git a/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.tl.png b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.tl.png new file mode 100644 index 00000000..8e47de7d Binary files /dev/null and b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.tl.png differ diff --git a/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.vi.png b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.vi.png new file mode 100644 index 00000000..8e47de7d Binary files /dev/null and b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.vi.png differ diff --git a/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.id.png b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.id.png new file mode 100644 index 00000000..b3c98d83 Binary files /dev/null and b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.id.png differ diff --git a/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.ms.png b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.ms.png new file mode 100644 index 00000000..b3c98d83 Binary files /dev/null and b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.ms.png differ diff --git a/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.tl.png b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.tl.png new file mode 100644 index 00000000..b3c98d83 Binary files /dev/null and b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.tl.png differ diff --git a/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.vi.png b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.vi.png new file mode 100644 index 00000000..b3c98d83 Binary files /dev/null and b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.vi.png differ diff --git a/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.id.png b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.id.png new file mode 100644 index 00000000..1d494613 Binary files /dev/null and b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.id.png differ diff --git a/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.ms.png b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.ms.png new file mode 100644 index 00000000..1d494613 Binary files /dev/null and b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.ms.png differ diff --git a/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.tl.png b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.tl.png new file mode 100644 index 00000000..1d494613 Binary files /dev/null and b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.tl.png differ diff --git a/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.vi.png b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.vi.png new file mode 100644 index 00000000..1d494613 Binary files /dev/null and b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.vi.png differ diff --git a/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.id.png b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.id.png new file mode 100644 index 00000000..47ced39a Binary files /dev/null and b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.id.png differ diff --git a/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.ms.png b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.ms.png new file mode 100644 index 00000000..47ced39a Binary files /dev/null and b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.ms.png differ diff --git a/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.tl.png b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.tl.png new file mode 100644 index 00000000..47ced39a Binary files /dev/null and b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.tl.png differ diff --git a/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.vi.png b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.vi.png new file mode 100644 index 00000000..47ced39a Binary files /dev/null and b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.vi.png differ diff --git a/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.id.png b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.id.png new file mode 100644 index 00000000..88d5c896 Binary files /dev/null and b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.id.png differ diff --git a/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.ms.png b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.ms.png new file mode 100644 index 00000000..88d5c896 Binary files /dev/null and b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.ms.png differ diff --git a/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.tl.png b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.tl.png new file mode 100644 index 00000000..88d5c896 Binary files /dev/null and b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.tl.png differ diff --git a/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.vi.png b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.vi.png new file mode 100644 index 00000000..88d5c896 Binary files /dev/null and b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.vi.png differ diff --git a/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.id.png b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.id.png new file mode 100644 index 00000000..e0706533 Binary files /dev/null and b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.id.png differ diff --git a/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.ms.png b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.ms.png new file mode 100644 index 00000000..e0706533 Binary files /dev/null and b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.ms.png differ diff --git a/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.tl.png b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.tl.png new file mode 100644 index 00000000..e0706533 Binary files /dev/null and b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.tl.png differ diff --git a/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.vi.png b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.vi.png new file mode 100644 index 00000000..e0706533 Binary files /dev/null and b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.vi.png differ diff --git a/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.id.png b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.id.png new file mode 100644 index 00000000..a1f17249 Binary files /dev/null and b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.id.png differ diff --git a/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.ms.png b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.ms.png new file mode 100644 index 00000000..a1f17249 Binary files /dev/null and b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.ms.png differ diff --git a/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.tl.png b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.tl.png new file mode 100644 index 00000000..a1f17249 Binary files /dev/null and b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.tl.png differ diff --git a/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.vi.png b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.vi.png new file mode 100644 index 00000000..a1f17249 Binary files /dev/null and b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.vi.png differ diff --git a/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.id.png b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.id.png new file mode 100644 index 00000000..3adc61ef Binary files /dev/null and b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.id.png differ diff --git a/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.ms.png b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.ms.png new file mode 100644 index 00000000..3adc61ef Binary files /dev/null and b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.ms.png differ diff --git a/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.tl.png b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.tl.png new file mode 100644 index 00000000..3adc61ef Binary files /dev/null and b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.tl.png differ diff --git a/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.vi.png b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.vi.png new file mode 100644 index 00000000..3adc61ef Binary files /dev/null and b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.vi.png differ diff --git a/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.id.png b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.id.png new file mode 100644 index 00000000..1c3c8d53 Binary files /dev/null and b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.id.png differ diff --git a/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.ms.png b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.ms.png new file mode 100644 index 00000000..1c3c8d53 Binary files /dev/null and b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.ms.png differ diff --git a/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.tl.png b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.tl.png new file mode 100644 index 00000000..1c3c8d53 Binary files /dev/null and b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.tl.png differ diff --git a/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.vi.png b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.vi.png new file mode 100644 index 00000000..1c3c8d53 Binary files /dev/null and b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.vi.png differ diff --git a/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.id.jpg b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.id.jpg new file mode 100644 index 00000000..0f4a9a38 Binary files /dev/null and b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.id.jpg differ diff --git a/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.ms.jpg b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.ms.jpg new file mode 100644 index 00000000..0f4a9a38 Binary files /dev/null and b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.ms.jpg differ diff --git a/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.tl.jpg b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.tl.jpg new file mode 100644 index 00000000..0f4a9a38 Binary files /dev/null and b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.tl.jpg differ diff --git a/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.vi.jpg b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.vi.jpg new file mode 100644 index 00000000..0f4a9a38 Binary files /dev/null and b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.vi.jpg differ diff --git a/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.id.png b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.id.png new file mode 100644 index 00000000..32dab60c Binary files /dev/null and b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.id.png differ diff --git a/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.ms.png b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.ms.png new file mode 100644 index 00000000..32dab60c Binary files /dev/null and b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.ms.png differ diff --git a/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.tl.png b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.tl.png new file mode 100644 index 00000000..32dab60c Binary files /dev/null and b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.tl.png differ diff --git a/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.vi.png b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.vi.png new file mode 100644 index 00000000..32dab60c Binary files /dev/null and b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.vi.png differ diff --git a/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.id.png b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.id.png new file mode 100644 index 00000000..78e9b675 Binary files /dev/null and b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.id.png differ diff --git a/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.ms.png b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.ms.png new file mode 100644 index 00000000..78e9b675 Binary files /dev/null and b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.ms.png differ diff --git a/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.tl.png b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.tl.png new file mode 100644 index 00000000..78e9b675 Binary files /dev/null and b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.tl.png differ diff --git a/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.vi.png b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.vi.png new file mode 100644 index 00000000..78e9b675 Binary files /dev/null and b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.vi.png differ diff --git a/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.id.png b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.id.png new file mode 100644 index 00000000..fb87dd71 Binary files /dev/null and b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.id.png differ diff --git a/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.ms.png b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.ms.png new file mode 100644 index 00000000..fb87dd71 Binary files /dev/null and b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.ms.png differ diff --git a/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.tl.png b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.tl.png new file mode 100644 index 00000000..fb87dd71 Binary files /dev/null and b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.tl.png differ diff --git a/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.vi.png b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.vi.png new file mode 100644 index 00000000..fb87dd71 Binary files /dev/null and b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.vi.png differ diff --git a/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.id.png b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.id.png new file mode 100644 index 00000000..acaa9a02 Binary files /dev/null and b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.id.png differ diff --git a/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.ms.png b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.ms.png new file mode 100644 index 00000000..acaa9a02 Binary files /dev/null and b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.ms.png differ diff --git a/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.tl.png b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.tl.png new file mode 100644 index 00000000..acaa9a02 Binary files /dev/null and b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.tl.png differ diff --git a/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.vi.png b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.vi.png new file mode 100644 index 00000000..acaa9a02 Binary files /dev/null and b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.vi.png differ diff --git a/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.id.png b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.id.png new file mode 100644 index 00000000..b6afaa8a Binary files /dev/null and b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.id.png differ diff --git a/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.ms.png b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.ms.png new file mode 100644 index 00000000..b6afaa8a Binary files /dev/null and b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.ms.png differ diff --git a/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.tl.png b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.tl.png new file mode 100644 index 00000000..b6afaa8a Binary files /dev/null and b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.tl.png differ diff --git a/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.vi.png b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.vi.png new file mode 100644 index 00000000..b6afaa8a Binary files /dev/null and b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.vi.png differ diff --git a/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.id.png b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.id.png new file mode 100644 index 00000000..18f92ede Binary files /dev/null and b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.id.png differ diff --git a/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.ms.png b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.ms.png new file mode 100644 index 00000000..18f92ede Binary files /dev/null and b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.ms.png differ diff --git a/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.tl.png b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.tl.png new file mode 100644 index 00000000..18f92ede Binary files /dev/null and b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.tl.png differ diff --git a/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.vi.png b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.vi.png new file mode 100644 index 00000000..18f92ede Binary files /dev/null and b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.vi.png differ diff --git a/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.id.png b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.id.png new file mode 100644 index 00000000..e1eb6df0 Binary files /dev/null and b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.id.png differ diff --git a/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.ms.png b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.ms.png new file mode 100644 index 00000000..e1eb6df0 Binary files /dev/null and b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.ms.png differ diff --git a/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.tl.png b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.tl.png new file mode 100644 index 00000000..e1eb6df0 Binary files /dev/null and b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.tl.png differ diff --git a/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.vi.png b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.vi.png new file mode 100644 index 00000000..e1eb6df0 Binary files /dev/null and b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.vi.png differ diff --git a/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.id.png b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.id.png new file mode 100644 index 00000000..dfcfde45 Binary files /dev/null and b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.id.png differ diff --git a/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.ms.png b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.ms.png new file mode 100644 index 00000000..dfcfde45 Binary files /dev/null and b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.ms.png differ diff --git a/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.tl.png b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.tl.png new file mode 100644 index 00000000..dfcfde45 Binary files /dev/null and b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.tl.png differ diff --git a/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.vi.png b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.vi.png new file mode 100644 index 00000000..dfcfde45 Binary files /dev/null and b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.vi.png differ diff --git a/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.id.png b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.id.png new file mode 100644 index 00000000..44af1896 Binary files /dev/null and b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.id.png differ diff --git a/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.ms.png b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.ms.png new file mode 100644 index 00000000..44af1896 Binary files /dev/null and b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.ms.png differ diff --git a/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.tl.png b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.tl.png new file mode 100644 index 00000000..44af1896 Binary files /dev/null and b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.tl.png differ diff --git a/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.vi.png b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.vi.png new file mode 100644 index 00000000..44af1896 Binary files /dev/null and b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.vi.png differ diff --git a/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.id.png b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.id.png new file mode 100644 index 00000000..6d749e6c Binary files /dev/null and b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.id.png differ diff --git a/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.ms.png b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.ms.png new file mode 100644 index 00000000..6d749e6c Binary files /dev/null and b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.ms.png differ diff --git a/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.tl.png b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.tl.png new file mode 100644 index 00000000..6d749e6c Binary files /dev/null and b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.tl.png differ diff --git a/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.vi.png b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.vi.png new file mode 100644 index 00000000..6d749e6c Binary files /dev/null and b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.vi.png differ diff --git a/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.id.png b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.id.png new file mode 100644 index 00000000..7485e36c Binary files /dev/null and b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.id.png differ diff --git a/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.ms.png b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.ms.png new file mode 100644 index 00000000..7485e36c Binary files /dev/null and b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.ms.png differ diff --git a/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.tl.png b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.tl.png new file mode 100644 index 00000000..7485e36c Binary files /dev/null and b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.tl.png differ diff --git a/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.vi.png b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.vi.png new file mode 100644 index 00000000..7485e36c Binary files /dev/null and b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.vi.png differ diff --git a/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.id.png b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.id.png new file mode 100644 index 00000000..0f499097 Binary files /dev/null and b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.id.png differ diff --git a/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.ms.png b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.ms.png new file mode 100644 index 00000000..0f499097 Binary files /dev/null and b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.ms.png differ diff --git a/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.tl.png b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.tl.png new file mode 100644 index 00000000..0f499097 Binary files /dev/null and b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.tl.png differ diff --git a/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.vi.png b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.vi.png new file mode 100644 index 00000000..0f499097 Binary files /dev/null and b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.vi.png differ diff --git a/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.id.png b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.id.png new file mode 100644 index 00000000..710c440c Binary files /dev/null and b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.id.png differ diff --git a/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.ms.png b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.ms.png new file mode 100644 index 00000000..710c440c Binary files /dev/null and b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.ms.png differ diff --git a/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.tl.png b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.tl.png new file mode 100644 index 00000000..710c440c Binary files /dev/null and b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.tl.png differ diff --git a/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.vi.png b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.vi.png new file mode 100644 index 00000000..710c440c Binary files /dev/null and b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.vi.png differ diff --git a/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.id.png b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.id.png new file mode 100644 index 00000000..24cecced Binary files /dev/null and b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.id.png differ diff --git a/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.ms.png b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.ms.png new file mode 100644 index 00000000..24cecced Binary files /dev/null and b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.ms.png differ diff --git a/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.tl.png b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.tl.png new file mode 100644 index 00000000..24cecced Binary files /dev/null and b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.tl.png differ diff --git a/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.vi.png b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.vi.png new file mode 100644 index 00000000..24cecced Binary files /dev/null and b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.vi.png differ diff --git a/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.id.png b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.id.png new file mode 100644 index 00000000..b36025d9 Binary files /dev/null and b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.id.png differ diff --git a/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.ms.png b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.ms.png new file mode 100644 index 00000000..b36025d9 Binary files /dev/null and b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.ms.png differ diff --git a/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.tl.png b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.tl.png new file mode 100644 index 00000000..b36025d9 Binary files /dev/null and b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.tl.png differ diff --git a/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.vi.png b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.vi.png new file mode 100644 index 00000000..b36025d9 Binary files /dev/null and b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.vi.png differ diff --git a/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.id.png b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.id.png new file mode 100644 index 00000000..b21a4bed Binary files /dev/null and b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.id.png differ diff --git a/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.ms.png b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.ms.png new file mode 100644 index 00000000..b21a4bed Binary files /dev/null and b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.ms.png differ diff --git a/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.tl.png b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.tl.png new file mode 100644 index 00000000..b21a4bed Binary files /dev/null and b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.tl.png differ diff --git a/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.vi.png b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.vi.png new file mode 100644 index 00000000..b21a4bed Binary files /dev/null and b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.vi.png differ diff --git a/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.id.png b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.id.png new file mode 100644 index 00000000..8da6f9a4 Binary files /dev/null and b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.id.png differ diff --git a/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.ms.png b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.ms.png new file mode 100644 index 00000000..8da6f9a4 Binary files /dev/null and b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.ms.png differ diff --git a/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.tl.png b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.tl.png new file mode 100644 index 00000000..8da6f9a4 Binary files /dev/null and b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.tl.png differ diff --git a/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.vi.png b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.vi.png new file mode 100644 index 00000000..8da6f9a4 Binary files /dev/null and b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.vi.png differ diff --git a/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.id.jpg b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.id.jpg new file mode 100644 index 00000000..437f3d07 Binary files /dev/null and b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.id.jpg differ diff --git a/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.ms.jpg b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.ms.jpg new file mode 100644 index 00000000..437f3d07 Binary files /dev/null and b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.ms.jpg differ diff --git a/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.tl.jpg b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.tl.jpg new file mode 100644 index 00000000..437f3d07 Binary files /dev/null and b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.tl.jpg differ diff --git a/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.vi.jpg b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.vi.jpg new file mode 100644 index 00000000..437f3d07 Binary files /dev/null and b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.vi.jpg differ diff --git a/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.id.png b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.id.png new file mode 100644 index 00000000..cc61fb13 Binary files /dev/null and b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.id.png differ diff --git a/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.ms.png b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.ms.png new file mode 100644 index 00000000..cc61fb13 Binary files /dev/null and b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.ms.png differ diff --git a/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.tl.png b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.tl.png new file mode 100644 index 00000000..cc61fb13 Binary files /dev/null and b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.tl.png differ diff --git a/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.vi.png b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.vi.png new file mode 100644 index 00000000..cc61fb13 Binary files /dev/null and b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.vi.png differ diff --git a/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.id.png b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.id.png new file mode 100644 index 00000000..3472b1d9 Binary files /dev/null and b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.id.png differ diff --git a/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.ms.png b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.ms.png new file mode 100644 index 00000000..3472b1d9 Binary files /dev/null and b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.ms.png differ diff --git a/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.tl.png b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.tl.png new file mode 100644 index 00000000..3472b1d9 Binary files /dev/null and b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.tl.png differ diff --git a/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.vi.png b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.vi.png new file mode 100644 index 00000000..3472b1d9 Binary files /dev/null and b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.vi.png differ diff --git a/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.id.png b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.id.png new file mode 100644 index 00000000..0bbca602 Binary files /dev/null and b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.id.png differ diff --git a/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.ms.png b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.ms.png new file mode 100644 index 00000000..0bbca602 Binary files /dev/null and b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.ms.png differ diff --git a/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.tl.png b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.tl.png new file mode 100644 index 00000000..0bbca602 Binary files /dev/null and b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.tl.png differ diff --git a/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.vi.png b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.vi.png new file mode 100644 index 00000000..0bbca602 Binary files /dev/null and b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.vi.png differ diff --git a/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.id.png b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.id.png new file mode 100644 index 00000000..b5775adc Binary files /dev/null and b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.id.png differ diff --git a/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.ms.png b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.ms.png new file mode 100644 index 00000000..b5775adc Binary files /dev/null and b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.ms.png differ diff --git a/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.tl.png b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.tl.png new file mode 100644 index 00000000..b5775adc Binary files /dev/null and b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.tl.png differ diff --git a/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.vi.png b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.vi.png new file mode 100644 index 00000000..b5775adc Binary files /dev/null and b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.vi.png differ diff --git a/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.id.png b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.id.png new file mode 100644 index 00000000..bc58477a Binary files /dev/null and b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.id.png differ diff --git a/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.ms.png b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.ms.png new file mode 100644 index 00000000..bc58477a Binary files /dev/null and b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.ms.png differ diff --git a/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.tl.png b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.tl.png new file mode 100644 index 00000000..bc58477a Binary files /dev/null and b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.tl.png differ diff --git a/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.vi.png b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.vi.png new file mode 100644 index 00000000..bc58477a Binary files /dev/null and b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.vi.png differ diff --git a/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.id.png b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.id.png new file mode 100644 index 00000000..1b7a40f4 Binary files /dev/null and b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.id.png differ diff --git a/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.ms.png b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.ms.png new file mode 100644 index 00000000..1b7a40f4 Binary files /dev/null and b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.ms.png differ diff --git a/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.tl.png b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.tl.png new file mode 100644 index 00000000..1b7a40f4 Binary files /dev/null and b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.tl.png differ diff --git a/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.vi.png b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.vi.png new file mode 100644 index 00000000..1b7a40f4 Binary files /dev/null and b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.vi.png differ diff --git a/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.id.png b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.id.png new file mode 100644 index 00000000..011b07a3 Binary files /dev/null and b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.id.png differ diff --git a/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.ms.png b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.ms.png new file mode 100644 index 00000000..011b07a3 Binary files /dev/null and b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.ms.png differ diff --git a/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.tl.png b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.tl.png new file mode 100644 index 00000000..011b07a3 Binary files /dev/null and b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.tl.png differ diff --git a/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.vi.png b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.vi.png new file mode 100644 index 00000000..011b07a3 Binary files /dev/null and b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.vi.png differ diff --git a/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.id.png b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.id.png new file mode 100644 index 00000000..7f9d24ef Binary files /dev/null and b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.id.png differ diff --git a/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.ms.png b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.ms.png new file mode 100644 index 00000000..7f9d24ef Binary files /dev/null and b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.ms.png differ diff --git a/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.tl.png b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.tl.png new file mode 100644 index 00000000..7f9d24ef Binary files /dev/null and b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.tl.png differ diff --git a/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.vi.png b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.vi.png new file mode 100644 index 00000000..7f9d24ef Binary files /dev/null and b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.vi.png differ diff --git a/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.id.png b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.id.png new file mode 100644 index 00000000..0c6a7067 Binary files /dev/null and b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.id.png differ diff --git a/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.ms.png b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.ms.png new file mode 100644 index 00000000..0c6a7067 Binary files /dev/null and b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.ms.png differ diff --git a/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.tl.png b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.tl.png new file mode 100644 index 00000000..0c6a7067 Binary files /dev/null and b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.tl.png differ diff --git a/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.vi.png b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.vi.png new file mode 100644 index 00000000..0c6a7067 Binary files /dev/null and b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.vi.png differ diff --git a/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.id.png b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.id.png new file mode 100644 index 00000000..8f7968a5 Binary files /dev/null and b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.id.png differ diff --git a/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.ms.png b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.ms.png new file mode 100644 index 00000000..8f7968a5 Binary files /dev/null and b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.ms.png differ diff --git a/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.tl.png b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.tl.png new file mode 100644 index 00000000..8f7968a5 Binary files /dev/null and b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.tl.png differ diff --git a/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.vi.png b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.vi.png new file mode 100644 index 00000000..8f7968a5 Binary files /dev/null and b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.vi.png differ diff --git a/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.id.png b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.id.png new file mode 100644 index 00000000..20c6036f Binary files /dev/null and b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.id.png differ diff --git a/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.ms.png b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.ms.png new file mode 100644 index 00000000..20c6036f Binary files /dev/null and b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.ms.png differ diff --git a/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.tl.png b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.tl.png new file mode 100644 index 00000000..20c6036f Binary files /dev/null and b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.tl.png differ diff --git a/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.vi.png b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.vi.png new file mode 100644 index 00000000..20c6036f Binary files /dev/null and b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.vi.png differ diff --git a/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.id.png b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.id.png new file mode 100644 index 00000000..f077b6e9 Binary files /dev/null and b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.id.png differ diff --git a/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.ms.png b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.ms.png new file mode 100644 index 00000000..f077b6e9 Binary files /dev/null and b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.ms.png differ diff --git a/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.tl.png b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.tl.png new file mode 100644 index 00000000..f077b6e9 Binary files /dev/null and b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.tl.png differ diff --git a/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.vi.png b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.vi.png new file mode 100644 index 00000000..f077b6e9 Binary files /dev/null and b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.vi.png differ diff --git a/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.id.png b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.id.png new file mode 100644 index 00000000..484206d5 Binary files /dev/null and b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.id.png differ diff --git a/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.ms.png b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.ms.png new file mode 100644 index 00000000..484206d5 Binary files /dev/null and b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.ms.png differ diff --git a/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.tl.png b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.tl.png new file mode 100644 index 00000000..484206d5 Binary files /dev/null and b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.tl.png differ diff --git a/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.vi.png b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.vi.png new file mode 100644 index 00000000..484206d5 Binary files /dev/null and b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.vi.png differ diff --git a/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.id.png b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.id.png new file mode 100644 index 00000000..9fa156e2 Binary files /dev/null and b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.id.png differ diff --git a/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.ms.png b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.ms.png new file mode 100644 index 00000000..9fa156e2 Binary files /dev/null and b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.ms.png differ diff --git a/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.tl.png b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.tl.png new file mode 100644 index 00000000..9fa156e2 Binary files /dev/null and b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.tl.png differ diff --git a/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.vi.png b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.vi.png new file mode 100644 index 00000000..9fa156e2 Binary files /dev/null and b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.vi.png differ diff --git a/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.id.png b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.id.png new file mode 100644 index 00000000..b0813972 Binary files /dev/null and b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.id.png differ diff --git a/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.ms.png b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.ms.png new file mode 100644 index 00000000..b0813972 Binary files /dev/null and b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.ms.png differ diff --git a/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.tl.png b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.tl.png new file mode 100644 index 00000000..b0813972 Binary files /dev/null and b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.tl.png differ diff --git a/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.vi.png b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.vi.png new file mode 100644 index 00000000..b0813972 Binary files /dev/null and b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.vi.png differ diff --git a/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.id.png b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.id.png new file mode 100644 index 00000000..4f2da8dc Binary files /dev/null and b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.id.png differ diff --git a/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.ms.png b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.ms.png new file mode 100644 index 00000000..4f2da8dc Binary files /dev/null and b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.ms.png differ diff --git a/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.tl.png b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.tl.png new file mode 100644 index 00000000..4f2da8dc Binary files /dev/null and b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.tl.png differ diff --git a/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.vi.png b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.vi.png new file mode 100644 index 00000000..4f2da8dc Binary files /dev/null and b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.vi.png differ diff --git a/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.id.png b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.id.png new file mode 100644 index 00000000..8ae3904c Binary files /dev/null and b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.id.png differ diff --git a/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.ms.png b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.ms.png new file mode 100644 index 00000000..8ae3904c Binary files /dev/null and b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.ms.png differ diff --git a/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.tl.png b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.tl.png new file mode 100644 index 00000000..8ae3904c Binary files /dev/null and b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.tl.png differ diff --git a/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.vi.png b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.vi.png new file mode 100644 index 00000000..8ae3904c Binary files /dev/null and b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.vi.png differ diff --git a/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.id.png b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.id.png new file mode 100644 index 00000000..ea5cbe30 Binary files /dev/null and b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.id.png differ diff --git a/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.ms.png b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.ms.png new file mode 100644 index 00000000..ea5cbe30 Binary files /dev/null and b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.ms.png differ diff --git a/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.tl.png b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.tl.png new file mode 100644 index 00000000..ea5cbe30 Binary files /dev/null and b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.tl.png differ diff --git a/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.vi.png b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.vi.png new file mode 100644 index 00000000..ea5cbe30 Binary files /dev/null and b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.vi.png differ diff --git a/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.id.png b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.id.png new file mode 100644 index 00000000..eab9fb03 Binary files /dev/null and b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.id.png differ diff --git a/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.ms.png b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.ms.png new file mode 100644 index 00000000..eab9fb03 Binary files /dev/null and b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.ms.png differ diff --git a/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.tl.png b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.tl.png new file mode 100644 index 00000000..eab9fb03 Binary files /dev/null and b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.tl.png differ diff --git a/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.vi.png b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.vi.png new file mode 100644 index 00000000..eab9fb03 Binary files /dev/null and b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.vi.png differ diff --git a/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.id.png b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.id.png new file mode 100644 index 00000000..c49c0459 Binary files /dev/null and b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.id.png differ diff --git a/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.ms.png b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.ms.png new file mode 100644 index 00000000..c49c0459 Binary files /dev/null and b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.ms.png differ diff --git a/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.tl.png b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.tl.png new file mode 100644 index 00000000..c49c0459 Binary files /dev/null and b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.tl.png differ diff --git a/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.vi.png b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.vi.png new file mode 100644 index 00000000..c49c0459 Binary files /dev/null and b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.vi.png differ diff --git a/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.id.png b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.id.png new file mode 100644 index 00000000..127b0257 Binary files /dev/null and b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.id.png differ diff --git a/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.ms.png b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.ms.png new file mode 100644 index 00000000..127b0257 Binary files /dev/null and b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.ms.png differ diff --git a/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.tl.png b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.tl.png new file mode 100644 index 00000000..127b0257 Binary files /dev/null and b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.tl.png differ diff --git a/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.vi.png b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.vi.png new file mode 100644 index 00000000..127b0257 Binary files /dev/null and b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.vi.png differ diff --git a/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.id.png b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.id.png new file mode 100644 index 00000000..0b528799 Binary files /dev/null and b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.id.png differ diff --git a/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.ms.png b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.ms.png new file mode 100644 index 00000000..0b528799 Binary files /dev/null and b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.ms.png differ diff --git a/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.tl.png b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.tl.png new file mode 100644 index 00000000..0b528799 Binary files /dev/null and b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.tl.png differ diff --git a/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.vi.png b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.vi.png new file mode 100644 index 00000000..0b528799 Binary files /dev/null and b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.vi.png differ diff --git a/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.id.png b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.id.png new file mode 100644 index 00000000..e5b04c65 Binary files /dev/null and b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.id.png differ diff --git a/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.ms.png b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.ms.png new file mode 100644 index 00000000..e5b04c65 Binary files /dev/null and b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.ms.png differ diff --git a/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.tl.png b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.tl.png new file mode 100644 index 00000000..e5b04c65 Binary files /dev/null and b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.tl.png differ diff --git a/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.vi.png b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.vi.png new file mode 100644 index 00000000..e5b04c65 Binary files /dev/null and b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.vi.png differ diff --git a/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.id.png b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.id.png new file mode 100644 index 00000000..46543926 Binary files /dev/null and b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.id.png differ diff --git a/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.ms.png b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.ms.png new file mode 100644 index 00000000..46543926 Binary files /dev/null and b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.ms.png differ diff --git a/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.tl.png b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.tl.png new file mode 100644 index 00000000..46543926 Binary files /dev/null and b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.tl.png differ diff --git a/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.vi.png b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.vi.png new file mode 100644 index 00000000..46543926 Binary files /dev/null and b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.vi.png differ diff --git a/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.id.png b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.id.png new file mode 100644 index 00000000..46e99668 Binary files /dev/null and b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.id.png differ diff --git a/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.ms.png b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.ms.png new file mode 100644 index 00000000..46e99668 Binary files /dev/null and b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.ms.png differ diff --git a/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.tl.png b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.tl.png new file mode 100644 index 00000000..46e99668 Binary files /dev/null and b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.tl.png differ diff --git a/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.vi.png b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.vi.png new file mode 100644 index 00000000..46e99668 Binary files /dev/null and b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.vi.png differ diff --git a/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.id.png b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.id.png new file mode 100644 index 00000000..c012d47d Binary files /dev/null and b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.id.png differ diff --git a/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.ms.png b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.ms.png new file mode 100644 index 00000000..c012d47d Binary files /dev/null and b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.ms.png differ diff --git a/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.tl.png b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.tl.png new file mode 100644 index 00000000..c012d47d Binary files /dev/null and b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.tl.png differ diff --git a/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.vi.png b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.vi.png new file mode 100644 index 00000000..c012d47d Binary files /dev/null and b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.vi.png differ diff --git a/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.id.png b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.id.png new file mode 100644 index 00000000..fa44061a Binary files /dev/null and b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.id.png differ diff --git a/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.ms.png b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.ms.png new file mode 100644 index 00000000..fa44061a Binary files /dev/null and b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.ms.png differ diff --git a/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.tl.png b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.tl.png new file mode 100644 index 00000000..fa44061a Binary files /dev/null and b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.tl.png differ diff --git a/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.vi.png b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.vi.png new file mode 100644 index 00000000..fa44061a Binary files /dev/null and b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.vi.png differ diff --git a/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.id.png b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.id.png new file mode 100644 index 00000000..e499b2fd Binary files /dev/null and b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.id.png differ diff --git a/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.ms.png b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.ms.png new file mode 100644 index 00000000..e499b2fd Binary files /dev/null and b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.ms.png differ diff --git a/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.tl.png b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.tl.png new file mode 100644 index 00000000..e499b2fd Binary files /dev/null and b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.tl.png differ diff --git a/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.vi.png b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.vi.png new file mode 100644 index 00000000..e499b2fd Binary files /dev/null and b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.vi.png differ diff --git a/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.id.png b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.id.png new file mode 100644 index 00000000..66e9927a Binary files /dev/null and b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.id.png differ diff --git a/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.ms.png b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.ms.png new file mode 100644 index 00000000..66e9927a Binary files /dev/null and b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.ms.png differ diff --git a/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.tl.png b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.tl.png new file mode 100644 index 00000000..66e9927a Binary files /dev/null and b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.tl.png differ diff --git a/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.vi.png b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.vi.png new file mode 100644 index 00000000..66e9927a Binary files /dev/null and b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.vi.png differ diff --git a/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.id.png b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.id.png new file mode 100644 index 00000000..e512cf63 Binary files /dev/null and b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.id.png differ diff --git a/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.ms.png b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.ms.png new file mode 100644 index 00000000..e512cf63 Binary files /dev/null and b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.ms.png differ diff --git a/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.tl.png b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.tl.png new file mode 100644 index 00000000..e512cf63 Binary files /dev/null and b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.tl.png differ diff --git a/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.vi.png b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.vi.png new file mode 100644 index 00000000..e512cf63 Binary files /dev/null and b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.vi.png differ diff --git a/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.id.png b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.id.png new file mode 100644 index 00000000..89e41b8a Binary files /dev/null and b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.id.png differ diff --git a/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.ms.png b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.ms.png new file mode 100644 index 00000000..89e41b8a Binary files /dev/null and b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.ms.png differ diff --git a/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.tl.png b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.tl.png new file mode 100644 index 00000000..89e41b8a Binary files /dev/null and b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.tl.png differ diff --git a/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.vi.png b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.vi.png new file mode 100644 index 00000000..89e41b8a Binary files /dev/null and b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.vi.png differ diff --git a/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.id.png b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.id.png new file mode 100644 index 00000000..257c3e55 Binary files /dev/null and b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.id.png differ diff --git a/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.ms.png b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.ms.png new file mode 100644 index 00000000..257c3e55 Binary files /dev/null and b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.ms.png differ diff --git a/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.tl.png b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.tl.png new file mode 100644 index 00000000..257c3e55 Binary files /dev/null and b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.tl.png differ diff --git a/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.vi.png b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.vi.png new file mode 100644 index 00000000..257c3e55 Binary files /dev/null and b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.vi.png differ diff --git a/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.id.png b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.id.png new file mode 100644 index 00000000..85a581ed Binary files /dev/null and b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.id.png differ diff --git a/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.ms.png b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.ms.png new file mode 100644 index 00000000..85a581ed Binary files /dev/null and b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.ms.png differ diff --git a/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.tl.png b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.tl.png new file mode 100644 index 00000000..85a581ed Binary files /dev/null and b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.tl.png differ diff --git a/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.vi.png b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.vi.png new file mode 100644 index 00000000..85a581ed Binary files /dev/null and b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.vi.png differ diff --git a/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.id.png b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.id.png new file mode 100644 index 00000000..c07f67c3 Binary files /dev/null and b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.id.png differ diff --git a/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.ms.png b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.ms.png new file mode 100644 index 00000000..c07f67c3 Binary files /dev/null and b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.ms.png differ diff --git a/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.tl.png b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.tl.png new file mode 100644 index 00000000..c07f67c3 Binary files /dev/null and b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.tl.png differ diff --git a/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.vi.png b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.vi.png new file mode 100644 index 00000000..c07f67c3 Binary files /dev/null and b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.vi.png differ diff --git a/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.id.png b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.id.png new file mode 100644 index 00000000..c598913b Binary files /dev/null and b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.id.png differ diff --git a/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.ms.png b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.ms.png new file mode 100644 index 00000000..c598913b Binary files /dev/null and b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.ms.png differ diff --git a/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.tl.png b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.tl.png new file mode 100644 index 00000000..c598913b Binary files /dev/null and b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.tl.png differ diff --git a/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.vi.png b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.vi.png new file mode 100644 index 00000000..c598913b Binary files /dev/null and b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.vi.png differ diff --git a/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.id.png b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.id.png new file mode 100644 index 00000000..a630a6f3 Binary files /dev/null and b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.id.png differ diff --git a/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.ms.png b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.ms.png new file mode 100644 index 00000000..a630a6f3 Binary files /dev/null and b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.ms.png differ diff --git a/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.tl.png b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.tl.png new file mode 100644 index 00000000..a630a6f3 Binary files /dev/null and b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.tl.png differ diff --git a/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.vi.png b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.vi.png new file mode 100644 index 00000000..a630a6f3 Binary files /dev/null and b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.vi.png differ diff --git a/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.id.png b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.id.png new file mode 100644 index 00000000..f63ad48d Binary files /dev/null and b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.id.png differ diff --git a/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.ms.png b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.ms.png new file mode 100644 index 00000000..f63ad48d Binary files /dev/null and b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.ms.png differ diff --git a/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.tl.png b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.tl.png new file mode 100644 index 00000000..f63ad48d Binary files /dev/null and b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.tl.png differ diff --git a/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.vi.png b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.vi.png new file mode 100644 index 00000000..f63ad48d Binary files /dev/null and b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.vi.png differ diff --git a/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.id.png b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.id.png new file mode 100644 index 00000000..73c0aea6 Binary files /dev/null and b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.id.png differ diff --git a/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.ms.png b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.ms.png new file mode 100644 index 00000000..73c0aea6 Binary files /dev/null and b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.ms.png differ diff --git a/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.tl.png b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.tl.png new file mode 100644 index 00000000..73c0aea6 Binary files /dev/null and b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.tl.png differ diff --git a/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.vi.png b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.vi.png new file mode 100644 index 00000000..73c0aea6 Binary files /dev/null and b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.vi.png differ diff --git a/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.id.png b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.id.png new file mode 100644 index 00000000..0768efbc Binary files /dev/null and b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.id.png differ diff --git a/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.ms.png b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.ms.png new file mode 100644 index 00000000..0768efbc Binary files /dev/null and b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.ms.png differ diff --git a/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.tl.png b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.tl.png new file mode 100644 index 00000000..0768efbc Binary files /dev/null and b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.tl.png differ diff --git a/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.vi.png b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.vi.png new file mode 100644 index 00000000..0768efbc Binary files /dev/null and b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.vi.png differ diff --git a/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.id.png b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.id.png new file mode 100644 index 00000000..a6c3afe8 Binary files /dev/null and b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.id.png differ diff --git a/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.ms.png b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.ms.png new file mode 100644 index 00000000..a6c3afe8 Binary files /dev/null and b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.ms.png differ diff --git a/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.tl.png b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.tl.png new file mode 100644 index 00000000..a6c3afe8 Binary files /dev/null and b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.tl.png differ diff --git a/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.vi.png b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.vi.png new file mode 100644 index 00000000..a6c3afe8 Binary files /dev/null and b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.vi.png differ diff --git a/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.id.png b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.id.png new file mode 100644 index 00000000..eed10ecb Binary files /dev/null and b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.id.png differ diff --git a/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.ms.png b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.ms.png new file mode 100644 index 00000000..eed10ecb Binary files /dev/null and b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.ms.png differ diff --git a/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.tl.png b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.tl.png new file mode 100644 index 00000000..eed10ecb Binary files /dev/null and b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.tl.png differ diff --git a/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.vi.png b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.vi.png new file mode 100644 index 00000000..eed10ecb Binary files /dev/null and b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.vi.png differ diff --git a/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.id.png b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.id.png new file mode 100644 index 00000000..4c086050 Binary files /dev/null and b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.id.png differ diff --git a/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.ms.png b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.ms.png new file mode 100644 index 00000000..4c086050 Binary files /dev/null and b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.ms.png differ diff --git a/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.tl.png b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.tl.png new file mode 100644 index 00000000..4c086050 Binary files /dev/null and b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.tl.png differ diff --git a/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.vi.png b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.vi.png new file mode 100644 index 00000000..4c086050 Binary files /dev/null and b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.vi.png differ diff --git a/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.id.png b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.id.png new file mode 100644 index 00000000..9f641588 Binary files /dev/null and b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.id.png differ diff --git a/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.ms.png b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.ms.png new file mode 100644 index 00000000..9f641588 Binary files /dev/null and b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.ms.png differ diff --git a/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.tl.png b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.tl.png new file mode 100644 index 00000000..9f641588 Binary files /dev/null and b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.tl.png differ diff --git a/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.vi.png b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.vi.png new file mode 100644 index 00000000..9f641588 Binary files /dev/null and b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.vi.png differ diff --git a/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.id.png b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.id.png new file mode 100644 index 00000000..9404843f Binary files /dev/null and b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.id.png differ diff --git a/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.ms.png b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.ms.png new file mode 100644 index 00000000..9404843f Binary files /dev/null and b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.ms.png differ diff --git a/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.tl.png b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.tl.png new file mode 100644 index 00000000..9404843f Binary files /dev/null and b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.tl.png differ diff --git a/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.vi.png b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.vi.png new file mode 100644 index 00000000..9404843f Binary files /dev/null and b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.vi.png differ diff --git a/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.id.png b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.id.png new file mode 100644 index 00000000..9636ac68 Binary files /dev/null and b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.id.png differ diff --git a/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.ms.png b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.ms.png new file mode 100644 index 00000000..9636ac68 Binary files /dev/null and b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.ms.png differ diff --git a/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.tl.png b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.tl.png new file mode 100644 index 00000000..9636ac68 Binary files /dev/null and b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.tl.png differ diff --git a/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.vi.png b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.vi.png new file mode 100644 index 00000000..9636ac68 Binary files /dev/null and b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.vi.png differ diff --git a/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.id.png b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.id.png new file mode 100644 index 00000000..38a2b35d Binary files /dev/null and b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.id.png differ diff --git a/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.ms.png b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.ms.png new file mode 100644 index 00000000..38a2b35d Binary files /dev/null and b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.ms.png differ diff --git a/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.tl.png b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.tl.png new file mode 100644 index 00000000..38a2b35d Binary files /dev/null and b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.tl.png differ diff --git a/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.vi.png b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.vi.png new file mode 100644 index 00000000..38a2b35d Binary files /dev/null and b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.vi.png differ diff --git a/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.id.png b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.id.png new file mode 100644 index 00000000..cd09e177 Binary files /dev/null and b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.id.png differ diff --git a/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.ms.png b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.ms.png new file mode 100644 index 00000000..cd09e177 Binary files /dev/null and b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.ms.png differ diff --git a/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.tl.png b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.tl.png new file mode 100644 index 00000000..cd09e177 Binary files /dev/null and b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.tl.png differ diff --git a/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.vi.png b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.vi.png new file mode 100644 index 00000000..cd09e177 Binary files /dev/null and b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.vi.png differ diff --git a/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.id.png b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.id.png new file mode 100644 index 00000000..4cc4f4bc Binary files /dev/null and b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.id.png differ diff --git a/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.ms.png b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.ms.png new file mode 100644 index 00000000..4cc4f4bc Binary files /dev/null and b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.ms.png differ diff --git a/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.tl.png b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.tl.png new file mode 100644 index 00000000..4cc4f4bc Binary files /dev/null and b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.tl.png differ diff --git a/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.vi.png b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.vi.png new file mode 100644 index 00000000..4cc4f4bc Binary files /dev/null and b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.vi.png differ diff --git a/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.id.png b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.id.png new file mode 100644 index 00000000..33e03220 Binary files /dev/null and b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.id.png differ diff --git a/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.ms.png b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.ms.png new file mode 100644 index 00000000..33e03220 Binary files /dev/null and b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.ms.png differ diff --git a/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.tl.png b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.tl.png new file mode 100644 index 00000000..33e03220 Binary files /dev/null and b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.tl.png differ diff --git a/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.vi.png b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.vi.png new file mode 100644 index 00000000..33e03220 Binary files /dev/null and b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.vi.png differ diff --git a/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.id.png b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.id.png new file mode 100644 index 00000000..489d49e3 Binary files /dev/null and b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.id.png differ diff --git a/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.ms.png b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.ms.png new file mode 100644 index 00000000..489d49e3 Binary files /dev/null and b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.ms.png differ diff --git a/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.tl.png b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.tl.png new file mode 100644 index 00000000..489d49e3 Binary files /dev/null and b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.tl.png differ diff --git a/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.vi.png b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.vi.png new file mode 100644 index 00000000..489d49e3 Binary files /dev/null and b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.vi.png differ diff --git a/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.id.png b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.id.png new file mode 100644 index 00000000..80b39b63 Binary files /dev/null and b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.id.png differ diff --git a/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.ms.png b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.ms.png new file mode 100644 index 00000000..80b39b63 Binary files /dev/null and b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.ms.png differ diff --git a/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.tl.png b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.tl.png new file mode 100644 index 00000000..80b39b63 Binary files /dev/null and b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.tl.png differ diff --git a/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.vi.png b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.vi.png new file mode 100644 index 00000000..80b39b63 Binary files /dev/null and b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.vi.png differ diff --git a/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.id.png b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.id.png new file mode 100644 index 00000000..2404a4ce Binary files /dev/null and b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.id.png differ diff --git a/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.ms.png b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.ms.png new file mode 100644 index 00000000..2404a4ce Binary files /dev/null and b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.ms.png differ diff --git a/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.tl.png b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.tl.png new file mode 100644 index 00000000..2404a4ce Binary files /dev/null and b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.tl.png differ diff --git a/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.vi.png b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.vi.png new file mode 100644 index 00000000..2404a4ce Binary files /dev/null and b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.vi.png differ diff --git a/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.id.png b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.id.png new file mode 100644 index 00000000..f884cc81 Binary files /dev/null and b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.id.png differ diff --git a/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.ms.png b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.ms.png new file mode 100644 index 00000000..f884cc81 Binary files /dev/null and b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.ms.png differ diff --git a/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.tl.png b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.tl.png new file mode 100644 index 00000000..f884cc81 Binary files /dev/null and b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.tl.png differ diff --git a/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.vi.png b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.vi.png new file mode 100644 index 00000000..f884cc81 Binary files /dev/null and b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.vi.png differ diff --git a/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.id.png b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.id.png new file mode 100644 index 00000000..9f649bd1 Binary files /dev/null and b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.id.png differ diff --git a/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.ms.png b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.ms.png new file mode 100644 index 00000000..9f649bd1 Binary files /dev/null and b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.ms.png differ diff --git a/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.tl.png b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.tl.png new file mode 100644 index 00000000..9f649bd1 Binary files /dev/null and b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.tl.png differ diff --git a/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.vi.png b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.vi.png new file mode 100644 index 00000000..9f649bd1 Binary files /dev/null and b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.vi.png differ diff --git a/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.id.png b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.id.png new file mode 100644 index 00000000..03e1fa8c Binary files /dev/null and b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.id.png differ diff --git a/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.ms.png b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.ms.png new file mode 100644 index 00000000..03e1fa8c Binary files /dev/null and b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.ms.png differ diff --git a/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.tl.png b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.tl.png new file mode 100644 index 00000000..03e1fa8c Binary files /dev/null and b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.tl.png differ diff --git a/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.vi.png b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.vi.png new file mode 100644 index 00000000..03e1fa8c Binary files /dev/null and b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.vi.png differ diff --git a/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.id.png b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.id.png new file mode 100644 index 00000000..983f836f Binary files /dev/null and b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.id.png differ diff --git a/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.ms.png b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.ms.png new file mode 100644 index 00000000..983f836f Binary files /dev/null and b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.ms.png differ diff --git a/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.tl.png b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.tl.png new file mode 100644 index 00000000..983f836f Binary files /dev/null and b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.tl.png differ diff --git a/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.vi.png b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.vi.png new file mode 100644 index 00000000..983f836f Binary files /dev/null and b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.vi.png differ diff --git a/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.id.png b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.id.png new file mode 100644 index 00000000..2aede939 Binary files /dev/null and b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.id.png differ diff --git a/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.ms.png b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.ms.png new file mode 100644 index 00000000..2aede939 Binary files /dev/null and b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.ms.png differ diff --git a/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.tl.png b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.tl.png new file mode 100644 index 00000000..2aede939 Binary files /dev/null and b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.tl.png differ diff --git a/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.vi.png b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.vi.png new file mode 100644 index 00000000..2aede939 Binary files /dev/null and b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.vi.png differ diff --git a/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.id.png b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.id.png new file mode 100644 index 00000000..7bc7bab2 Binary files /dev/null and b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.id.png differ diff --git a/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.ms.png b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.ms.png new file mode 100644 index 00000000..7bc7bab2 Binary files /dev/null and b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.ms.png differ diff --git a/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.tl.png b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.tl.png new file mode 100644 index 00000000..7bc7bab2 Binary files /dev/null and b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.tl.png differ diff --git a/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.vi.png b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.vi.png new file mode 100644 index 00000000..7bc7bab2 Binary files /dev/null and b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.vi.png differ diff --git a/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.id.png b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.id.png new file mode 100644 index 00000000..4ffd862a Binary files /dev/null and b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.id.png differ diff --git a/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.ms.png b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.ms.png new file mode 100644 index 00000000..4ffd862a Binary files /dev/null and b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.ms.png differ diff --git a/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.tl.png b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.tl.png new file mode 100644 index 00000000..4ffd862a Binary files /dev/null and b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.tl.png differ diff --git a/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.vi.png b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.vi.png new file mode 100644 index 00000000..4ffd862a Binary files /dev/null and b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.vi.png differ diff --git a/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.id.png b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.id.png new file mode 100644 index 00000000..ef506579 Binary files /dev/null and b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.id.png differ diff --git a/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.ms.png b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.ms.png new file mode 100644 index 00000000..ef506579 Binary files /dev/null and b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.ms.png differ diff --git a/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.tl.png b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.tl.png new file mode 100644 index 00000000..ef506579 Binary files /dev/null and b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.tl.png differ diff --git a/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.vi.png b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.vi.png new file mode 100644 index 00000000..ef506579 Binary files /dev/null and b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.vi.png differ diff --git a/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.id.png b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.id.png new file mode 100644 index 00000000..ddf79213 Binary files /dev/null and b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.id.png differ diff --git a/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.ms.png b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.ms.png new file mode 100644 index 00000000..ddf79213 Binary files /dev/null and b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.ms.png differ diff --git a/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.tl.png b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.tl.png new file mode 100644 index 00000000..ddf79213 Binary files /dev/null and b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.tl.png differ diff --git a/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.vi.png b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.vi.png new file mode 100644 index 00000000..ddf79213 Binary files /dev/null and b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.vi.png differ diff --git a/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.id.png b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.id.png new file mode 100644 index 00000000..1796bcce Binary files /dev/null and b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.id.png differ diff --git a/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.ms.png b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.ms.png new file mode 100644 index 00000000..1796bcce Binary files /dev/null and b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.ms.png differ diff --git a/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.tl.png b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.tl.png new file mode 100644 index 00000000..1796bcce Binary files /dev/null and b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.tl.png differ diff --git a/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.vi.png b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.vi.png new file mode 100644 index 00000000..1796bcce Binary files /dev/null and b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.vi.png differ diff --git a/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.id.png b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.id.png new file mode 100644 index 00000000..ab763666 Binary files /dev/null and b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.id.png differ diff --git a/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.ms.png b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.ms.png new file mode 100644 index 00000000..ab763666 Binary files /dev/null and b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.ms.png differ diff --git a/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.tl.png b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.tl.png new file mode 100644 index 00000000..ab763666 Binary files /dev/null and b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.tl.png differ diff --git a/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.vi.png b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.vi.png new file mode 100644 index 00000000..ab763666 Binary files /dev/null and b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.vi.png differ diff --git a/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.id.png b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.id.png new file mode 100644 index 00000000..013f247d Binary files /dev/null and b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.id.png differ diff --git a/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.ms.png b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.ms.png new file mode 100644 index 00000000..013f247d Binary files /dev/null and b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.ms.png differ diff --git a/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.tl.png b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.tl.png new file mode 100644 index 00000000..013f247d Binary files /dev/null and b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.tl.png differ diff --git a/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.vi.png b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.vi.png new file mode 100644 index 00000000..013f247d Binary files /dev/null and b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.vi.png differ diff --git a/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.id.png b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.id.png new file mode 100644 index 00000000..fd1b7753 Binary files /dev/null and b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.id.png differ diff --git a/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.ms.png b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.ms.png new file mode 100644 index 00000000..fd1b7753 Binary files /dev/null and b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.ms.png differ diff --git a/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.tl.png b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.tl.png new file mode 100644 index 00000000..fd1b7753 Binary files /dev/null and b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.tl.png differ diff --git a/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.vi.png b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.vi.png new file mode 100644 index 00000000..fd1b7753 Binary files /dev/null and b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.vi.png differ diff --git a/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.id.png b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.id.png new file mode 100644 index 00000000..55154b84 Binary files /dev/null and b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.id.png differ diff --git a/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.ms.png b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.ms.png new file mode 100644 index 00000000..55154b84 Binary files /dev/null and b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.ms.png differ diff --git a/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.tl.png b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.tl.png new file mode 100644 index 00000000..55154b84 Binary files /dev/null and b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.tl.png differ diff --git a/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.vi.png b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.vi.png new file mode 100644 index 00000000..55154b84 Binary files /dev/null and b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.vi.png differ diff --git a/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.id.png b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.id.png new file mode 100644 index 00000000..306d6f14 Binary files /dev/null and b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.id.png differ diff --git a/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.ms.png b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.ms.png new file mode 100644 index 00000000..306d6f14 Binary files /dev/null and b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.ms.png differ diff --git a/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.tl.png b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.tl.png new file mode 100644 index 00000000..306d6f14 Binary files /dev/null and b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.tl.png differ diff --git a/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.vi.png b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.vi.png new file mode 100644 index 00000000..306d6f14 Binary files /dev/null and b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.vi.png differ diff --git a/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.id.png b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.id.png new file mode 100644 index 00000000..dfb03646 Binary files /dev/null and b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.id.png differ diff --git a/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.ms.png b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.ms.png new file mode 100644 index 00000000..dfb03646 Binary files /dev/null and b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.ms.png differ diff --git a/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.tl.png b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.tl.png new file mode 100644 index 00000000..dfb03646 Binary files /dev/null and b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.tl.png differ diff --git a/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.vi.png b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.vi.png new file mode 100644 index 00000000..dfb03646 Binary files /dev/null and b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.vi.png differ diff --git a/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.id.png b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.id.png new file mode 100644 index 00000000..05208120 Binary files /dev/null and b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.id.png differ diff --git a/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.ms.png b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.ms.png new file mode 100644 index 00000000..05208120 Binary files /dev/null and b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.ms.png differ diff --git a/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.tl.png b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.tl.png new file mode 100644 index 00000000..05208120 Binary files /dev/null and b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.tl.png differ diff --git a/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.vi.png b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.vi.png new file mode 100644 index 00000000..05208120 Binary files /dev/null and b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.vi.png differ diff --git a/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.id.jpg b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.id.jpg new file mode 100644 index 00000000..e78b8c6c Binary files /dev/null and b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.id.jpg differ diff --git a/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.ms.jpg b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.ms.jpg new file mode 100644 index 00000000..e78b8c6c Binary files /dev/null and b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.ms.jpg differ diff --git a/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.tl.jpg b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.tl.jpg new file mode 100644 index 00000000..e78b8c6c Binary files /dev/null and b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.tl.jpg differ diff --git a/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.vi.jpg b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.vi.jpg new file mode 100644 index 00000000..e78b8c6c Binary files /dev/null and b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.vi.jpg differ diff --git a/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.id.png b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.id.png new file mode 100644 index 00000000..0b221a3f Binary files /dev/null and b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.id.png differ diff --git a/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.ms.png b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.ms.png new file mode 100644 index 00000000..0b221a3f Binary files /dev/null and b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.ms.png differ diff --git a/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.tl.png b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.tl.png new file mode 100644 index 00000000..0b221a3f Binary files /dev/null and b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.tl.png differ diff --git a/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.vi.png b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.vi.png new file mode 100644 index 00000000..0b221a3f Binary files /dev/null and b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.vi.png differ diff --git a/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.id.png b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.id.png new file mode 100644 index 00000000..576d3f84 Binary files /dev/null and b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.id.png differ diff --git a/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.ms.png b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.ms.png new file mode 100644 index 00000000..576d3f84 Binary files /dev/null and b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.ms.png differ diff --git a/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.tl.png b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.tl.png new file mode 100644 index 00000000..576d3f84 Binary files /dev/null and b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.tl.png differ diff --git a/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.vi.png b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.vi.png new file mode 100644 index 00000000..576d3f84 Binary files /dev/null and b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.vi.png differ diff --git a/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.id.png b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.id.png new file mode 100644 index 00000000..297ccc5e Binary files /dev/null and b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.id.png differ diff --git a/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.ms.png b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.ms.png new file mode 100644 index 00000000..297ccc5e Binary files /dev/null and b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.ms.png differ diff --git a/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.tl.png b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.tl.png new file mode 100644 index 00000000..297ccc5e Binary files /dev/null and b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.tl.png differ diff --git a/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.vi.png b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.vi.png new file mode 100644 index 00000000..297ccc5e Binary files /dev/null and b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.vi.png differ diff --git a/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.id.png b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.id.png new file mode 100644 index 00000000..89bd1ba6 Binary files /dev/null and b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.id.png differ diff --git a/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.ms.png b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.ms.png new file mode 100644 index 00000000..89bd1ba6 Binary files /dev/null and b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.ms.png differ diff --git a/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.tl.png b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.tl.png new file mode 100644 index 00000000..89bd1ba6 Binary files /dev/null and b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.tl.png differ diff --git a/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.vi.png b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.vi.png new file mode 100644 index 00000000..89bd1ba6 Binary files /dev/null and b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.vi.png differ diff --git a/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.id.jpg b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.id.jpg new file mode 100644 index 00000000..383794f2 Binary files /dev/null and b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.id.jpg differ diff --git a/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.ms.jpg b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.ms.jpg new file mode 100644 index 00000000..383794f2 Binary files /dev/null and b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.ms.jpg differ diff --git a/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.tl.jpg b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.tl.jpg new file mode 100644 index 00000000..383794f2 Binary files /dev/null and b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.tl.jpg differ diff --git a/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.vi.jpg b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.vi.jpg new file mode 100644 index 00000000..383794f2 Binary files /dev/null and b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.vi.jpg differ diff --git a/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.id.png b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.id.png new file mode 100644 index 00000000..f28538e1 Binary files /dev/null and b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.id.png differ diff --git a/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.ms.png b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.ms.png new file mode 100644 index 00000000..f28538e1 Binary files /dev/null and b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.ms.png differ diff --git a/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.tl.png b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.tl.png new file mode 100644 index 00000000..f28538e1 Binary files /dev/null and b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.tl.png differ diff --git a/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.vi.png b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.vi.png new file mode 100644 index 00000000..f28538e1 Binary files /dev/null and b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.vi.png differ diff --git a/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.id.png b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.id.png new file mode 100644 index 00000000..39431760 Binary files /dev/null and b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.id.png differ diff --git a/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.ms.png b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.ms.png new file mode 100644 index 00000000..39431760 Binary files /dev/null and b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.ms.png differ diff --git a/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.tl.png b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.tl.png new file mode 100644 index 00000000..39431760 Binary files /dev/null and b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.tl.png differ diff --git a/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.vi.png b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.vi.png new file mode 100644 index 00000000..39431760 Binary files /dev/null and b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.vi.png differ diff --git a/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.id.png b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.id.png new file mode 100644 index 00000000..46a26d45 Binary files /dev/null and b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.id.png differ diff --git a/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.ms.png b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.ms.png new file mode 100644 index 00000000..46a26d45 Binary files /dev/null and b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.ms.png differ diff --git a/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.tl.png b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.tl.png new file mode 100644 index 00000000..46a26d45 Binary files /dev/null and b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.tl.png differ diff --git a/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.vi.png b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.vi.png new file mode 100644 index 00000000..46a26d45 Binary files /dev/null and b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.vi.png differ diff --git a/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.id.png b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.id.png new file mode 100644 index 00000000..6f70239b Binary files /dev/null and b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.id.png differ diff --git a/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.ms.png b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.ms.png new file mode 100644 index 00000000..6f70239b Binary files /dev/null and b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.ms.png differ diff --git a/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.tl.png b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.tl.png new file mode 100644 index 00000000..6f70239b Binary files /dev/null and b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.tl.png differ diff --git a/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.vi.png b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.vi.png new file mode 100644 index 00000000..6f70239b Binary files /dev/null and b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.vi.png differ diff --git a/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.id.png b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.id.png new file mode 100644 index 00000000..c5cd51da Binary files /dev/null and b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.id.png differ diff --git a/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.ms.png b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.ms.png new file mode 100644 index 00000000..c5cd51da Binary files /dev/null and b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.ms.png differ diff --git a/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.tl.png b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.tl.png new file mode 100644 index 00000000..c5cd51da Binary files /dev/null and b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.tl.png differ diff --git a/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.vi.png b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.vi.png new file mode 100644 index 00000000..c5cd51da Binary files /dev/null and b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.vi.png differ diff --git a/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.id.png b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.id.png new file mode 100644 index 00000000..0328b3ea Binary files /dev/null and b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.id.png differ diff --git a/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.ms.png b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.ms.png new file mode 100644 index 00000000..0328b3ea Binary files /dev/null and b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.ms.png differ diff --git a/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.tl.png b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.tl.png new file mode 100644 index 00000000..0328b3ea Binary files /dev/null and b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.tl.png differ diff --git a/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.vi.png b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.vi.png new file mode 100644 index 00000000..0328b3ea Binary files /dev/null and b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.vi.png differ diff --git a/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.id.png b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.id.png new file mode 100644 index 00000000..b3d0d223 Binary files /dev/null and b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.id.png differ diff --git a/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.ms.png b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.ms.png new file mode 100644 index 00000000..b3d0d223 Binary files /dev/null and b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.ms.png differ diff --git a/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.tl.png b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.tl.png new file mode 100644 index 00000000..b3d0d223 Binary files /dev/null and b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.tl.png differ diff --git a/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.vi.png b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.vi.png new file mode 100644 index 00000000..b3d0d223 Binary files /dev/null and b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.vi.png differ diff --git a/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.id.png b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.id.png new file mode 100644 index 00000000..0729dbce Binary files /dev/null and b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.id.png differ diff --git a/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.ms.png b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.ms.png new file mode 100644 index 00000000..0729dbce Binary files /dev/null and b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.ms.png differ diff --git a/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.tl.png b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.tl.png new file mode 100644 index 00000000..0729dbce Binary files /dev/null and b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.tl.png differ diff --git a/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.vi.png b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.vi.png new file mode 100644 index 00000000..0729dbce Binary files /dev/null and b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.vi.png differ diff --git a/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.id.png b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.id.png new file mode 100644 index 00000000..2e3adef5 Binary files /dev/null and b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.id.png differ diff --git a/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.ms.png b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.ms.png new file mode 100644 index 00000000..2e3adef5 Binary files /dev/null and b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.ms.png differ diff --git a/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.tl.png b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.tl.png new file mode 100644 index 00000000..2e3adef5 Binary files /dev/null and b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.tl.png differ diff --git a/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.vi.png b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.vi.png new file mode 100644 index 00000000..2e3adef5 Binary files /dev/null and b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.vi.png differ diff --git a/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.id.png b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.id.png new file mode 100644 index 00000000..4e9aa9b4 Binary files /dev/null and b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.id.png differ diff --git a/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.ms.png b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.ms.png new file mode 100644 index 00000000..4e9aa9b4 Binary files /dev/null and b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.ms.png differ diff --git a/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.tl.png b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.tl.png new file mode 100644 index 00000000..4e9aa9b4 Binary files /dev/null and b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.tl.png differ diff --git a/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.vi.png b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.vi.png new file mode 100644 index 00000000..4e9aa9b4 Binary files /dev/null and b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.vi.png differ diff --git a/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.id.png b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.id.png new file mode 100644 index 00000000..766527c0 Binary files /dev/null and b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.id.png differ diff --git a/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.ms.png b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.ms.png new file mode 100644 index 00000000..766527c0 Binary files /dev/null and b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.ms.png differ diff --git a/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.tl.png b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.tl.png new file mode 100644 index 00000000..766527c0 Binary files /dev/null and b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.tl.png differ diff --git a/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.vi.png b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.vi.png new file mode 100644 index 00000000..766527c0 Binary files /dev/null and b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.vi.png differ diff --git a/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.id.png b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.id.png new file mode 100644 index 00000000..f34ad7c6 Binary files /dev/null and b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.id.png differ diff --git a/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.ms.png b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.ms.png new file mode 100644 index 00000000..f34ad7c6 Binary files /dev/null and b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.ms.png differ diff --git a/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.tl.png b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.tl.png new file mode 100644 index 00000000..f34ad7c6 Binary files /dev/null and b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.tl.png differ diff --git a/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.vi.png b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.vi.png new file mode 100644 index 00000000..f34ad7c6 Binary files /dev/null and b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.vi.png differ diff --git a/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.id.png b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.id.png new file mode 100644 index 00000000..403bb436 Binary files /dev/null and b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.id.png differ diff --git a/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.ms.png b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.ms.png new file mode 100644 index 00000000..403bb436 Binary files /dev/null and b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.ms.png differ diff --git a/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.tl.png b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.tl.png new file mode 100644 index 00000000..403bb436 Binary files /dev/null and b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.tl.png differ diff --git a/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.vi.png b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.vi.png new file mode 100644 index 00000000..403bb436 Binary files /dev/null and b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.vi.png differ diff --git a/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.id.png b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.id.png new file mode 100644 index 00000000..07398a97 Binary files /dev/null and b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.id.png differ diff --git a/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.ms.png b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.ms.png new file mode 100644 index 00000000..07398a97 Binary files /dev/null and b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.ms.png differ diff --git a/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.tl.png b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.tl.png new file mode 100644 index 00000000..07398a97 Binary files /dev/null and b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.tl.png differ diff --git a/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.vi.png b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.vi.png new file mode 100644 index 00000000..07398a97 Binary files /dev/null and b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.vi.png differ diff --git a/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.id.png b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.id.png new file mode 100644 index 00000000..83d0a29e Binary files /dev/null and b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.id.png differ diff --git a/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.ms.png b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.ms.png new file mode 100644 index 00000000..83d0a29e Binary files /dev/null and b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.ms.png differ diff --git a/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.tl.png b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.tl.png new file mode 100644 index 00000000..83d0a29e Binary files /dev/null and b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.tl.png differ diff --git a/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.vi.png b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.vi.png new file mode 100644 index 00000000..83d0a29e Binary files /dev/null and b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.vi.png differ diff --git a/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.id.png b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.id.png new file mode 100644 index 00000000..cdd566f5 Binary files /dev/null and b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.id.png differ diff --git a/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.ms.png b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.ms.png new file mode 100644 index 00000000..cdd566f5 Binary files /dev/null and b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.ms.png differ diff --git a/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.tl.png b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.tl.png new file mode 100644 index 00000000..cdd566f5 Binary files /dev/null and b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.tl.png differ diff --git a/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.vi.png b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.vi.png new file mode 100644 index 00000000..cdd566f5 Binary files /dev/null and b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.vi.png differ diff --git a/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.id.png b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.id.png new file mode 100644 index 00000000..50caa7a8 Binary files /dev/null and b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.id.png differ diff --git a/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.ms.png b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.ms.png new file mode 100644 index 00000000..50caa7a8 Binary files /dev/null and b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.ms.png differ diff --git a/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.tl.png b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.tl.png new file mode 100644 index 00000000..50caa7a8 Binary files /dev/null and b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.tl.png differ diff --git a/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.vi.png b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.vi.png new file mode 100644 index 00000000..50caa7a8 Binary files /dev/null and b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.vi.png differ diff --git a/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.id.png b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.id.png new file mode 100644 index 00000000..e68c1881 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.id.png differ diff --git a/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.ms.png b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.ms.png new file mode 100644 index 00000000..e68c1881 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.ms.png differ diff --git a/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.tl.png b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.tl.png new file mode 100644 index 00000000..e68c1881 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.tl.png differ diff --git a/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.vi.png b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.vi.png new file mode 100644 index 00000000..e68c1881 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.vi.png differ diff --git a/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.id.png b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.id.png new file mode 100644 index 00000000..357708db Binary files /dev/null and b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.id.png differ diff --git a/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.ms.png b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.ms.png new file mode 100644 index 00000000..357708db Binary files /dev/null and b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.ms.png differ diff --git a/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.tl.png b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.tl.png new file mode 100644 index 00000000..357708db Binary files /dev/null and b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.tl.png differ diff --git a/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.vi.png b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.vi.png new file mode 100644 index 00000000..357708db Binary files /dev/null and b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.vi.png differ diff --git a/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.id.png b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.id.png new file mode 100644 index 00000000..ff2cb168 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.id.png differ diff --git a/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.ms.png b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.ms.png new file mode 100644 index 00000000..ff2cb168 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.ms.png differ diff --git a/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.tl.png b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.tl.png new file mode 100644 index 00000000..ff2cb168 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.tl.png differ diff --git a/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.vi.png b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.vi.png new file mode 100644 index 00000000..ff2cb168 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.vi.png differ diff --git a/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.id.png b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.id.png new file mode 100644 index 00000000..4dd28830 Binary files /dev/null and b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.id.png differ diff --git a/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.ms.png b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.ms.png new file mode 100644 index 00000000..4dd28830 Binary files /dev/null and b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.ms.png differ diff --git a/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.tl.png b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.tl.png new file mode 100644 index 00000000..4dd28830 Binary files /dev/null and b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.tl.png differ diff --git a/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.vi.png b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.vi.png new file mode 100644 index 00000000..4dd28830 Binary files /dev/null and b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.vi.png differ diff --git a/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.id.png b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.id.png new file mode 100644 index 00000000..36a0bed7 Binary files /dev/null and b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.id.png differ diff --git a/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.ms.png b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.ms.png new file mode 100644 index 00000000..36a0bed7 Binary files /dev/null and b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.ms.png differ diff --git a/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.tl.png b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.tl.png new file mode 100644 index 00000000..36a0bed7 Binary files /dev/null and b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.tl.png differ diff --git a/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.vi.png b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.vi.png new file mode 100644 index 00000000..36a0bed7 Binary files /dev/null and b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.vi.png differ diff --git a/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.id.png b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.id.png new file mode 100644 index 00000000..43b82415 Binary files /dev/null and b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.id.png differ diff --git a/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.ms.png b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.ms.png new file mode 100644 index 00000000..43b82415 Binary files /dev/null and b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.ms.png differ diff --git a/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.tl.png b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.tl.png new file mode 100644 index 00000000..43b82415 Binary files /dev/null and b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.tl.png differ diff --git a/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.vi.png b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.vi.png new file mode 100644 index 00000000..43b82415 Binary files /dev/null and b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.vi.png differ diff --git a/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.id.png b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.id.png new file mode 100644 index 00000000..9f42e92d Binary files /dev/null and b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.id.png differ diff --git a/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.ms.png b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.ms.png new file mode 100644 index 00000000..9f42e92d Binary files /dev/null and b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.ms.png differ diff --git a/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.tl.png b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.tl.png new file mode 100644 index 00000000..9f42e92d Binary files /dev/null and b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.tl.png differ diff --git a/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.vi.png b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.vi.png new file mode 100644 index 00000000..9f42e92d Binary files /dev/null and b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.vi.png differ diff --git a/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.id.png b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.id.png new file mode 100644 index 00000000..91118b35 Binary files /dev/null and b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.id.png differ diff --git a/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.ms.png b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.ms.png new file mode 100644 index 00000000..91118b35 Binary files /dev/null and b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.ms.png differ diff --git a/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.tl.png b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.tl.png new file mode 100644 index 00000000..91118b35 Binary files /dev/null and b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.tl.png differ diff --git a/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.vi.png b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.vi.png new file mode 100644 index 00000000..91118b35 Binary files /dev/null and b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.vi.png differ diff --git a/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.id.png b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.id.png new file mode 100644 index 00000000..c1074a8e Binary files /dev/null and b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.id.png differ diff --git a/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.ms.png b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.ms.png new file mode 100644 index 00000000..c1074a8e Binary files /dev/null and b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.ms.png differ diff --git a/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.tl.png b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.tl.png new file mode 100644 index 00000000..c1074a8e Binary files /dev/null and b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.tl.png differ diff --git a/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.vi.png b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.vi.png new file mode 100644 index 00000000..c1074a8e Binary files /dev/null and b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.vi.png differ diff --git a/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.id.png b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.id.png new file mode 100644 index 00000000..a4cca4dc Binary files /dev/null and b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.id.png differ diff --git a/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.ms.png b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.ms.png new file mode 100644 index 00000000..a4cca4dc Binary files /dev/null and b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.ms.png differ diff --git a/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.tl.png b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.tl.png new file mode 100644 index 00000000..a4cca4dc Binary files /dev/null and b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.tl.png differ diff --git a/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.vi.png b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.vi.png new file mode 100644 index 00000000..a4cca4dc Binary files /dev/null and b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.vi.png differ diff --git a/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.id.png b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.id.png new file mode 100644 index 00000000..1dd02459 Binary files /dev/null and b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.id.png differ diff --git a/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.ms.png b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.ms.png new file mode 100644 index 00000000..1dd02459 Binary files /dev/null and b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.ms.png differ diff --git a/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.tl.png b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.tl.png new file mode 100644 index 00000000..1dd02459 Binary files /dev/null and b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.tl.png differ diff --git a/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.vi.png b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.vi.png new file mode 100644 index 00000000..1dd02459 Binary files /dev/null and b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.vi.png differ diff --git a/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.id.png b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.id.png new file mode 100644 index 00000000..64ba974b Binary files /dev/null and b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.id.png differ diff --git a/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.ms.png b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.ms.png new file mode 100644 index 00000000..64ba974b Binary files /dev/null and b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.ms.png differ diff --git a/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.tl.png b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.tl.png new file mode 100644 index 00000000..64ba974b Binary files /dev/null and b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.tl.png differ diff --git a/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.vi.png b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.vi.png new file mode 100644 index 00000000..64ba974b Binary files /dev/null and b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.vi.png differ diff --git a/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.id.png b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.id.png new file mode 100644 index 00000000..fd3d1f9b Binary files /dev/null and b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.id.png differ diff --git a/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.ms.png b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.ms.png new file mode 100644 index 00000000..fd3d1f9b Binary files /dev/null and b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.ms.png differ diff --git a/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.tl.png b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.tl.png new file mode 100644 index 00000000..fd3d1f9b Binary files /dev/null and b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.tl.png differ diff --git a/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.vi.png b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.vi.png new file mode 100644 index 00000000..fd3d1f9b Binary files /dev/null and b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.vi.png differ diff --git a/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.id.png b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.id.png new file mode 100644 index 00000000..f523159b Binary files /dev/null and b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.id.png differ diff --git a/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.ms.png b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.ms.png new file mode 100644 index 00000000..f523159b Binary files /dev/null and b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.ms.png differ diff --git a/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.tl.png b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.tl.png new file mode 100644 index 00000000..f523159b Binary files /dev/null and b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.tl.png differ diff --git a/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.vi.png b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.vi.png new file mode 100644 index 00000000..f523159b Binary files /dev/null and b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.vi.png differ diff --git a/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.id.png b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.id.png new file mode 100644 index 00000000..70a9bacf Binary files /dev/null and b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.id.png differ diff --git a/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.ms.png b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.ms.png new file mode 100644 index 00000000..70a9bacf Binary files /dev/null and b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.ms.png differ diff --git a/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.tl.png b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.tl.png new file mode 100644 index 00000000..70a9bacf Binary files /dev/null and b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.tl.png differ diff --git a/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.vi.png b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.vi.png new file mode 100644 index 00000000..70a9bacf Binary files /dev/null and b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.vi.png differ diff --git a/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.id.png b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.id.png new file mode 100644 index 00000000..9e30ab1c Binary files /dev/null and b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.id.png differ diff --git a/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.ms.png b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.ms.png new file mode 100644 index 00000000..9e30ab1c Binary files /dev/null and b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.ms.png differ diff --git a/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.tl.png b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.tl.png new file mode 100644 index 00000000..9e30ab1c Binary files /dev/null and b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.tl.png differ diff --git a/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.vi.png b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.vi.png new file mode 100644 index 00000000..9e30ab1c Binary files /dev/null and b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.vi.png differ diff --git a/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.id.png b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.id.png new file mode 100644 index 00000000..e9f61adc Binary files /dev/null and b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.id.png differ diff --git a/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.ms.png b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.ms.png new file mode 100644 index 00000000..e9f61adc Binary files /dev/null and b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.ms.png differ diff --git a/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.tl.png b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.tl.png new file mode 100644 index 00000000..e9f61adc Binary files /dev/null and b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.tl.png differ diff --git a/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.vi.png b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.vi.png new file mode 100644 index 00000000..e9f61adc Binary files /dev/null and b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.vi.png differ diff --git a/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.id.png b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.id.png new file mode 100644 index 00000000..a54521f7 Binary files /dev/null and b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.id.png differ diff --git a/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.ms.png b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.ms.png new file mode 100644 index 00000000..a54521f7 Binary files /dev/null and b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.ms.png differ diff --git a/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.tl.png b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.tl.png new file mode 100644 index 00000000..a54521f7 Binary files /dev/null and b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.tl.png differ diff --git a/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.vi.png b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.vi.png new file mode 100644 index 00000000..a54521f7 Binary files /dev/null and b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.vi.png differ diff --git a/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.id.png b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.id.png new file mode 100644 index 00000000..6981df8a Binary files /dev/null and b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.id.png differ diff --git a/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.ms.png b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.ms.png new file mode 100644 index 00000000..6981df8a Binary files /dev/null and b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.ms.png differ diff --git a/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.tl.png b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.tl.png new file mode 100644 index 00000000..6981df8a Binary files /dev/null and b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.tl.png differ diff --git a/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.vi.png b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.vi.png new file mode 100644 index 00000000..6981df8a Binary files /dev/null and b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.vi.png differ diff --git a/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.id.png b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.id.png new file mode 100644 index 00000000..2722c065 Binary files /dev/null and b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.id.png differ diff --git a/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.ms.png b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.ms.png new file mode 100644 index 00000000..2722c065 Binary files /dev/null and b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.ms.png differ diff --git a/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.tl.png b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.tl.png new file mode 100644 index 00000000..2722c065 Binary files /dev/null and b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.tl.png differ diff --git a/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.vi.png b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.vi.png new file mode 100644 index 00000000..2722c065 Binary files /dev/null and b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.vi.png differ diff --git a/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.id.jpg b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.id.jpg new file mode 100644 index 00000000..cce2a759 Binary files /dev/null and b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.id.jpg differ diff --git a/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.ms.jpg b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.ms.jpg new file mode 100644 index 00000000..cce2a759 Binary files /dev/null and b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.ms.jpg differ diff --git a/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.tl.jpg b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.tl.jpg new file mode 100644 index 00000000..cce2a759 Binary files /dev/null and b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.tl.jpg differ diff --git a/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.vi.jpg b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.vi.jpg new file mode 100644 index 00000000..cce2a759 Binary files /dev/null and b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.vi.jpg differ diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.id.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.id.png new file mode 100644 index 00000000..26e0ae43 Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.id.png differ diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.ms.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.ms.png new file mode 100644 index 00000000..26e0ae43 Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.ms.png differ diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.tl.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.tl.png new file mode 100644 index 00000000..26e0ae43 Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.tl.png differ diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.vi.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.vi.png new file mode 100644 index 00000000..26e0ae43 Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.vi.png differ diff --git a/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.id.png b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.id.png new file mode 100644 index 00000000..a5d549fd Binary files /dev/null and b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.id.png differ diff --git a/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.ms.png b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.ms.png new file mode 100644 index 00000000..a5d549fd Binary files /dev/null and b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.ms.png differ diff --git a/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.tl.png b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.tl.png new file mode 100644 index 00000000..a5d549fd Binary files /dev/null and b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.tl.png differ diff --git a/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.vi.png b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.vi.png new file mode 100644 index 00000000..a5d549fd Binary files /dev/null and b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.vi.png differ diff --git a/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.id.png b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.id.png new file mode 100644 index 00000000..a251745c Binary files /dev/null and b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.id.png differ diff --git a/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.ms.png b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.ms.png new file mode 100644 index 00000000..a251745c Binary files /dev/null and b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.ms.png differ diff --git a/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.tl.png b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.tl.png new file mode 100644 index 00000000..a251745c Binary files /dev/null and b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.tl.png differ diff --git a/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.vi.png b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.vi.png new file mode 100644 index 00000000..a251745c Binary files /dev/null and b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.vi.png differ diff --git a/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.id.png b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.id.png new file mode 100644 index 00000000..bb97d28e Binary files /dev/null and b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.id.png differ diff --git a/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.ms.png b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.ms.png new file mode 100644 index 00000000..bb97d28e Binary files /dev/null and b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.ms.png differ diff --git a/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.tl.png b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.tl.png new file mode 100644 index 00000000..bb97d28e Binary files /dev/null and b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.tl.png differ diff --git a/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.vi.png b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.vi.png new file mode 100644 index 00000000..bb97d28e Binary files /dev/null and b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.vi.png differ diff --git a/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.id.png b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.id.png new file mode 100644 index 00000000..e34dea22 Binary files /dev/null and b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.id.png differ diff --git a/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.ms.png b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.ms.png new file mode 100644 index 00000000..e34dea22 Binary files /dev/null and b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.ms.png differ diff --git a/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.tl.png b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.tl.png new file mode 100644 index 00000000..e34dea22 Binary files /dev/null and b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.tl.png differ diff --git a/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.vi.png b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.vi.png new file mode 100644 index 00000000..e34dea22 Binary files /dev/null and b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.vi.png differ diff --git a/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.id.png b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.id.png new file mode 100644 index 00000000..fa863501 Binary files /dev/null and b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.id.png differ diff --git a/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.ms.png b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.ms.png new file mode 100644 index 00000000..fa863501 Binary files /dev/null and b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.ms.png differ diff --git a/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.tl.png b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.tl.png new file mode 100644 index 00000000..fa863501 Binary files /dev/null and b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.tl.png differ diff --git a/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.vi.png b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.vi.png new file mode 100644 index 00000000..fa863501 Binary files /dev/null and b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.vi.png differ diff --git a/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.id.png b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.id.png new file mode 100644 index 00000000..0d0e0c48 Binary files /dev/null and b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.id.png differ diff --git a/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.ms.png b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.ms.png new file mode 100644 index 00000000..0d0e0c48 Binary files /dev/null and b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.ms.png differ diff --git a/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.tl.png b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.tl.png new file mode 100644 index 00000000..0d0e0c48 Binary files /dev/null and b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.tl.png differ diff --git a/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.vi.png b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.vi.png new file mode 100644 index 00000000..0d0e0c48 Binary files /dev/null and b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.vi.png differ diff --git a/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.id.png b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.id.png new file mode 100644 index 00000000..6f79a498 Binary files /dev/null and b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.id.png differ diff --git a/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.ms.png b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.ms.png new file mode 100644 index 00000000..6f79a498 Binary files /dev/null and b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.ms.png differ diff --git a/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.tl.png b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.tl.png new file mode 100644 index 00000000..6f79a498 Binary files /dev/null and b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.tl.png differ diff --git a/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.vi.png b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.vi.png new file mode 100644 index 00000000..6f79a498 Binary files /dev/null and b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.vi.png differ diff --git a/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.id.png b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.id.png new file mode 100644 index 00000000..8527d4cd Binary files /dev/null and b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.id.png differ diff --git a/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.ms.png b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.ms.png new file mode 100644 index 00000000..8527d4cd Binary files /dev/null and b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.ms.png differ diff --git a/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.tl.png b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.tl.png new file mode 100644 index 00000000..8527d4cd Binary files /dev/null and b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.tl.png differ diff --git a/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.vi.png b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.vi.png new file mode 100644 index 00000000..8527d4cd Binary files /dev/null and b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.vi.png differ diff --git a/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.id.png b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.id.png new file mode 100644 index 00000000..8597bf4d Binary files /dev/null and b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.id.png differ diff --git a/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.ms.png b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.ms.png new file mode 100644 index 00000000..8597bf4d Binary files /dev/null and b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.ms.png differ diff --git a/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.tl.png b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.tl.png new file mode 100644 index 00000000..8597bf4d Binary files /dev/null and b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.tl.png differ diff --git a/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.vi.png b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.vi.png new file mode 100644 index 00000000..8597bf4d Binary files /dev/null and b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.vi.png differ diff --git a/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.id.png b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.id.png new file mode 100644 index 00000000..3bf24358 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.id.png differ diff --git a/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.ms.png b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.ms.png new file mode 100644 index 00000000..3bf24358 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.ms.png differ diff --git a/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.tl.png b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.tl.png new file mode 100644 index 00000000..3bf24358 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.tl.png differ diff --git a/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.vi.png b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.vi.png new file mode 100644 index 00000000..3bf24358 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.vi.png differ diff --git a/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.id.png b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.id.png new file mode 100644 index 00000000..562f66d2 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.id.png differ diff --git a/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.ms.png b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.ms.png new file mode 100644 index 00000000..562f66d2 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.ms.png differ diff --git a/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.tl.png b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.tl.png new file mode 100644 index 00000000..562f66d2 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.tl.png differ diff --git a/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.vi.png b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.vi.png new file mode 100644 index 00000000..562f66d2 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.vi.png differ diff --git a/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.id.png b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.id.png new file mode 100644 index 00000000..2f50d53a Binary files /dev/null and b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.id.png differ diff --git a/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.ms.png b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.ms.png new file mode 100644 index 00000000..2f50d53a Binary files /dev/null and b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.ms.png differ diff --git a/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.tl.png b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.tl.png new file mode 100644 index 00000000..2f50d53a Binary files /dev/null and b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.tl.png differ diff --git a/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.vi.png b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.vi.png new file mode 100644 index 00000000..2f50d53a Binary files /dev/null and b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.vi.png differ diff --git a/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.id.png b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.id.png new file mode 100644 index 00000000..de7f343e Binary files /dev/null and b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.id.png differ diff --git a/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.ms.png b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.ms.png new file mode 100644 index 00000000..de7f343e Binary files /dev/null and b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.ms.png differ diff --git a/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.tl.png b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.tl.png new file mode 100644 index 00000000..de7f343e Binary files /dev/null and b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.tl.png differ diff --git a/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.vi.png b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.vi.png new file mode 100644 index 00000000..de7f343e Binary files /dev/null and b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.vi.png differ diff --git a/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.id.png b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.id.png new file mode 100644 index 00000000..c8b1a544 Binary files /dev/null and b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.id.png differ diff --git a/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.ms.png b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.ms.png new file mode 100644 index 00000000..c8b1a544 Binary files /dev/null and b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.ms.png differ diff --git a/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.tl.png b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.tl.png new file mode 100644 index 00000000..c8b1a544 Binary files /dev/null and b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.tl.png differ diff --git a/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.vi.png b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.vi.png new file mode 100644 index 00000000..c8b1a544 Binary files /dev/null and b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.vi.png differ diff --git a/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.id.png b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.id.png new file mode 100644 index 00000000..17d1151d Binary files /dev/null and b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.id.png differ diff --git a/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.ms.png b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.ms.png new file mode 100644 index 00000000..17d1151d Binary files /dev/null and b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.ms.png differ diff --git a/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.tl.png b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.tl.png new file mode 100644 index 00000000..17d1151d Binary files /dev/null and b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.tl.png differ diff --git a/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.vi.png b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.vi.png new file mode 100644 index 00000000..17d1151d Binary files /dev/null and b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.vi.png differ diff --git a/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.id.png b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.id.png new file mode 100644 index 00000000..ffafc104 Binary files /dev/null and b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.id.png differ diff --git a/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.ms.png b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.ms.png new file mode 100644 index 00000000..ffafc104 Binary files /dev/null and b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.ms.png differ diff --git a/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.tl.png b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.tl.png new file mode 100644 index 00000000..ffafc104 Binary files /dev/null and b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.tl.png differ diff --git a/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.vi.png b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.vi.png new file mode 100644 index 00000000..ffafc104 Binary files /dev/null and b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.vi.png differ diff --git a/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.id.png b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.id.png new file mode 100644 index 00000000..e3d86f8c Binary files /dev/null and b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.id.png differ diff --git a/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.ms.png b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.ms.png new file mode 100644 index 00000000..e3d86f8c Binary files /dev/null and b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.ms.png differ diff --git a/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.tl.png b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.tl.png new file mode 100644 index 00000000..e3d86f8c Binary files /dev/null and b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.tl.png differ diff --git a/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.vi.png b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.vi.png new file mode 100644 index 00000000..e3d86f8c Binary files /dev/null and b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.vi.png differ diff --git a/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.id.png b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.id.png new file mode 100644 index 00000000..3a4445ee Binary files /dev/null and b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.id.png differ diff --git a/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.ms.png b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.ms.png new file mode 100644 index 00000000..3a4445ee Binary files /dev/null and b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.ms.png differ diff --git a/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.tl.png b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.tl.png new file mode 100644 index 00000000..3a4445ee Binary files /dev/null and b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.tl.png differ diff --git a/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.vi.png b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.vi.png new file mode 100644 index 00000000..3a4445ee Binary files /dev/null and b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.vi.png differ diff --git a/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.id.png b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.id.png new file mode 100644 index 00000000..b2bf4d3f Binary files /dev/null and b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.id.png differ diff --git a/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.ms.png b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.ms.png new file mode 100644 index 00000000..b2bf4d3f Binary files /dev/null and b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.ms.png differ diff --git a/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.tl.png b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.tl.png new file mode 100644 index 00000000..b2bf4d3f Binary files /dev/null and b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.tl.png differ diff --git a/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.vi.png b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.vi.png new file mode 100644 index 00000000..b2bf4d3f Binary files /dev/null and b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.vi.png differ diff --git a/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.id.png b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.id.png new file mode 100644 index 00000000..467cedcd Binary files /dev/null and b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.id.png differ diff --git a/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.ms.png b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.ms.png new file mode 100644 index 00000000..467cedcd Binary files /dev/null and b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.ms.png differ diff --git a/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.tl.png b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.tl.png new file mode 100644 index 00000000..467cedcd Binary files /dev/null and b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.tl.png differ diff --git a/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.vi.png b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.vi.png new file mode 100644 index 00000000..467cedcd Binary files /dev/null and b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.vi.png differ diff --git a/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.id.png b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.id.png new file mode 100644 index 00000000..88efaa59 Binary files /dev/null and b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.id.png differ diff --git a/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.ms.png b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.ms.png new file mode 100644 index 00000000..88efaa59 Binary files /dev/null and b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.ms.png differ diff --git a/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.tl.png b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.tl.png new file mode 100644 index 00000000..88efaa59 Binary files /dev/null and b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.tl.png differ diff --git a/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.vi.png b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.vi.png new file mode 100644 index 00000000..88efaa59 Binary files /dev/null and b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.vi.png differ diff --git a/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.id.png b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.id.png new file mode 100644 index 00000000..6197ed95 Binary files /dev/null and b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.id.png differ diff --git a/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.ms.png b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.ms.png new file mode 100644 index 00000000..6197ed95 Binary files /dev/null and b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.ms.png differ diff --git a/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.tl.png b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.tl.png new file mode 100644 index 00000000..6197ed95 Binary files /dev/null and b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.tl.png differ diff --git a/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.vi.png b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.vi.png new file mode 100644 index 00000000..6197ed95 Binary files /dev/null and b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.vi.png differ diff --git a/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.id.png b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.id.png new file mode 100644 index 00000000..ec7768da Binary files /dev/null and b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.id.png differ diff --git a/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.ms.png b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.ms.png new file mode 100644 index 00000000..ec7768da Binary files /dev/null and b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.ms.png differ diff --git a/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.tl.png b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.tl.png new file mode 100644 index 00000000..ec7768da Binary files /dev/null and b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.tl.png differ diff --git a/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.vi.png b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.vi.png new file mode 100644 index 00000000..ec7768da Binary files /dev/null and b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.vi.png differ diff --git a/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.id.png b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.id.png new file mode 100644 index 00000000..f68bf461 Binary files /dev/null and b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.id.png differ diff --git a/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.ms.png b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.ms.png new file mode 100644 index 00000000..f68bf461 Binary files /dev/null and b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.ms.png differ diff --git a/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.tl.png b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.tl.png new file mode 100644 index 00000000..f68bf461 Binary files /dev/null and b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.tl.png differ diff --git a/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.vi.png b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.vi.png new file mode 100644 index 00000000..f68bf461 Binary files /dev/null and b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.vi.png differ diff --git a/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.id.png b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.id.png new file mode 100644 index 00000000..73e34cfe Binary files /dev/null and b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.id.png differ diff --git a/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.ms.png b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.ms.png new file mode 100644 index 00000000..73e34cfe Binary files /dev/null and b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.ms.png differ diff --git a/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.tl.png b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.tl.png new file mode 100644 index 00000000..73e34cfe Binary files /dev/null and b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.tl.png differ diff --git a/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.vi.png b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.vi.png new file mode 100644 index 00000000..73e34cfe Binary files /dev/null and b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.vi.png differ diff --git a/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.id.png b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.id.png new file mode 100644 index 00000000..21cc6bd0 Binary files /dev/null and b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.id.png differ diff --git a/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.ms.png b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.ms.png new file mode 100644 index 00000000..21cc6bd0 Binary files /dev/null and b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.ms.png differ diff --git a/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.tl.png b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.tl.png new file mode 100644 index 00000000..21cc6bd0 Binary files /dev/null and b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.tl.png differ diff --git a/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.vi.png b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.vi.png new file mode 100644 index 00000000..21cc6bd0 Binary files /dev/null and b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.vi.png differ diff --git a/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.id.png b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.id.png new file mode 100644 index 00000000..9c7deb23 Binary files /dev/null and b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.id.png differ diff --git a/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.ms.png b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.ms.png new file mode 100644 index 00000000..9c7deb23 Binary files /dev/null and b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.ms.png differ diff --git a/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.tl.png b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.tl.png new file mode 100644 index 00000000..9c7deb23 Binary files /dev/null and b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.tl.png differ diff --git a/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.vi.png b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.vi.png new file mode 100644 index 00000000..9c7deb23 Binary files /dev/null and b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.vi.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.id.png b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.id.png new file mode 100644 index 00000000..ddc9958b Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.id.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.ms.png b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.ms.png new file mode 100644 index 00000000..ddc9958b Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.ms.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.tl.png b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.tl.png new file mode 100644 index 00000000..ddc9958b Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.tl.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.vi.png b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.vi.png new file mode 100644 index 00000000..ddc9958b Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.vi.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.id.png b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.id.png new file mode 100644 index 00000000..d181210a Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.id.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.ms.png b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.ms.png new file mode 100644 index 00000000..d181210a Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.ms.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.tl.png b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.tl.png new file mode 100644 index 00000000..d181210a Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.tl.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.vi.png b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.vi.png new file mode 100644 index 00000000..d181210a Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.vi.png differ diff --git a/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.id.png b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.id.png new file mode 100644 index 00000000..a00ab427 Binary files /dev/null and b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.id.png differ diff --git a/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.ms.png b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.ms.png new file mode 100644 index 00000000..a00ab427 Binary files /dev/null and b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.ms.png differ diff --git a/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.tl.png b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.tl.png new file mode 100644 index 00000000..a00ab427 Binary files /dev/null and b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.tl.png differ diff --git a/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.vi.png b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.vi.png new file mode 100644 index 00000000..a00ab427 Binary files /dev/null and b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.vi.png differ diff --git a/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.id.png b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.id.png new file mode 100644 index 00000000..dedb38a3 Binary files /dev/null and b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.id.png differ diff --git a/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.ms.png b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.ms.png new file mode 100644 index 00000000..dedb38a3 Binary files /dev/null and b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.ms.png differ diff --git a/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.tl.png b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.tl.png new file mode 100644 index 00000000..dedb38a3 Binary files /dev/null and b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.tl.png differ diff --git a/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.vi.png b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.vi.png new file mode 100644 index 00000000..dedb38a3 Binary files /dev/null and b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.vi.png differ diff --git a/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.id.png b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.id.png new file mode 100644 index 00000000..2b34487d Binary files /dev/null and b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.id.png differ diff --git a/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.ms.png b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.ms.png new file mode 100644 index 00000000..2b34487d Binary files /dev/null and b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.ms.png differ diff --git a/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.tl.png b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.tl.png new file mode 100644 index 00000000..2b34487d Binary files /dev/null and b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.tl.png differ diff --git a/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.vi.png b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.vi.png new file mode 100644 index 00000000..2b34487d Binary files /dev/null and b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.vi.png differ diff --git a/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.id.png b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.id.png new file mode 100644 index 00000000..1cae68ed Binary files /dev/null and b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.id.png differ diff --git a/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.ms.png b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.ms.png new file mode 100644 index 00000000..1cae68ed Binary files /dev/null and b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.ms.png differ diff --git a/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.tl.png b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.tl.png new file mode 100644 index 00000000..1cae68ed Binary files /dev/null and b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.tl.png differ diff --git a/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.vi.png b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.vi.png new file mode 100644 index 00000000..1cae68ed Binary files /dev/null and b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.vi.png differ diff --git a/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.id.png b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.id.png new file mode 100644 index 00000000..df961cae Binary files /dev/null and b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.id.png differ diff --git a/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.ms.png b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.ms.png new file mode 100644 index 00000000..df961cae Binary files /dev/null and b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.ms.png differ diff --git a/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.tl.png b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.tl.png new file mode 100644 index 00000000..df961cae Binary files /dev/null and b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.tl.png differ diff --git a/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.vi.png b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.vi.png new file mode 100644 index 00000000..df961cae Binary files /dev/null and b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.vi.png differ diff --git a/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.id.png b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.id.png new file mode 100644 index 00000000..aaeaeff8 Binary files /dev/null and b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.id.png differ diff --git a/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.ms.png b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.ms.png new file mode 100644 index 00000000..aaeaeff8 Binary files /dev/null and b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.ms.png differ diff --git a/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.tl.png b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.tl.png new file mode 100644 index 00000000..aaeaeff8 Binary files /dev/null and b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.tl.png differ diff --git a/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.vi.png b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.vi.png new file mode 100644 index 00000000..aaeaeff8 Binary files /dev/null and b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.vi.png differ diff --git a/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.id.png b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.id.png new file mode 100644 index 00000000..7613fe86 Binary files /dev/null and b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.id.png differ diff --git a/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.ms.png b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.ms.png new file mode 100644 index 00000000..7613fe86 Binary files /dev/null and b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.ms.png differ diff --git a/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.tl.png b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.tl.png new file mode 100644 index 00000000..7613fe86 Binary files /dev/null and b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.tl.png differ diff --git a/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.vi.png b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.vi.png new file mode 100644 index 00000000..7613fe86 Binary files /dev/null and b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.vi.png differ diff --git a/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.id.png b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.id.png new file mode 100644 index 00000000..335bdf32 Binary files /dev/null and b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.id.png differ diff --git a/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.ms.png b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.ms.png new file mode 100644 index 00000000..335bdf32 Binary files /dev/null and b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.ms.png differ diff --git a/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.tl.png b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.tl.png new file mode 100644 index 00000000..335bdf32 Binary files /dev/null and b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.tl.png differ diff --git a/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.vi.png b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.vi.png new file mode 100644 index 00000000..335bdf32 Binary files /dev/null and b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.vi.png differ diff --git a/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.id.png b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.id.png new file mode 100644 index 00000000..32c8ba10 Binary files /dev/null and b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.id.png differ diff --git a/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.ms.png b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.ms.png new file mode 100644 index 00000000..32c8ba10 Binary files /dev/null and b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.ms.png differ diff --git a/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.tl.png b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.tl.png new file mode 100644 index 00000000..32c8ba10 Binary files /dev/null and b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.tl.png differ diff --git a/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.vi.png b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.vi.png new file mode 100644 index 00000000..32c8ba10 Binary files /dev/null and b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.vi.png differ diff --git a/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.id.png b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.id.png new file mode 100644 index 00000000..82802e17 Binary files /dev/null and b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.id.png differ diff --git a/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.ms.png b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.ms.png new file mode 100644 index 00000000..82802e17 Binary files /dev/null and b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.ms.png differ diff --git a/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.tl.png b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.tl.png new file mode 100644 index 00000000..82802e17 Binary files /dev/null and b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.tl.png differ diff --git a/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.vi.png b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.vi.png new file mode 100644 index 00000000..82802e17 Binary files /dev/null and b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.vi.png differ diff --git a/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.id.png b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.id.png new file mode 100644 index 00000000..8214fc2c Binary files /dev/null and b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.id.png differ diff --git a/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.ms.png b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.ms.png new file mode 100644 index 00000000..8214fc2c Binary files /dev/null and b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.ms.png differ diff --git a/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.tl.png b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.tl.png new file mode 100644 index 00000000..8214fc2c Binary files /dev/null and b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.tl.png differ diff --git a/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.vi.png b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.vi.png new file mode 100644 index 00000000..8214fc2c Binary files /dev/null and b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.vi.png differ diff --git a/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.id.png b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.id.png new file mode 100644 index 00000000..434baaad Binary files /dev/null and b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.id.png differ diff --git a/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.ms.png b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.ms.png new file mode 100644 index 00000000..434baaad Binary files /dev/null and b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.ms.png differ diff --git a/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.tl.png b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.tl.png new file mode 100644 index 00000000..434baaad Binary files /dev/null and b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.tl.png differ diff --git a/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.vi.png b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.vi.png new file mode 100644 index 00000000..434baaad Binary files /dev/null and b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.vi.png differ diff --git a/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.id.png b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.id.png new file mode 100644 index 00000000..d32271b5 Binary files /dev/null and b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.id.png differ diff --git a/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.ms.png b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.ms.png new file mode 100644 index 00000000..d32271b5 Binary files /dev/null and b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.ms.png differ diff --git a/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.tl.png b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.tl.png new file mode 100644 index 00000000..d32271b5 Binary files /dev/null and b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.tl.png differ diff --git a/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.vi.png b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.vi.png new file mode 100644 index 00000000..d32271b5 Binary files /dev/null and b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.vi.png differ diff --git a/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.id.png b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.id.png new file mode 100644 index 00000000..04cd7dc8 Binary files /dev/null and b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.id.png differ diff --git a/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.ms.png b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.ms.png new file mode 100644 index 00000000..04cd7dc8 Binary files /dev/null and b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.ms.png differ diff --git a/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.tl.png b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.tl.png new file mode 100644 index 00000000..04cd7dc8 Binary files /dev/null and b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.tl.png differ diff --git a/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.vi.png b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.vi.png new file mode 100644 index 00000000..04cd7dc8 Binary files /dev/null and b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.vi.png differ diff --git a/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.id.png b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.id.png new file mode 100644 index 00000000..a8a12bce Binary files /dev/null and b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.id.png differ diff --git a/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.ms.png b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.ms.png new file mode 100644 index 00000000..a8a12bce Binary files /dev/null and b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.ms.png differ diff --git a/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.tl.png b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.tl.png new file mode 100644 index 00000000..a8a12bce Binary files /dev/null and b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.tl.png differ diff --git a/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.vi.png b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.vi.png new file mode 100644 index 00000000..a8a12bce Binary files /dev/null and b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.vi.png differ diff --git a/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.id.jpg b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.id.jpg new file mode 100644 index 00000000..23ea98b2 Binary files /dev/null and b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.id.jpg differ diff --git a/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.ms.jpg b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.ms.jpg new file mode 100644 index 00000000..23ea98b2 Binary files /dev/null and b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.ms.jpg differ diff --git a/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.tl.jpg b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.tl.jpg new file mode 100644 index 00000000..23ea98b2 Binary files /dev/null and b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.tl.jpg differ diff --git a/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.vi.jpg b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.vi.jpg new file mode 100644 index 00000000..23ea98b2 Binary files /dev/null and b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.vi.jpg differ diff --git a/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.id.jpg b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.id.jpg new file mode 100644 index 00000000..1e3581d3 Binary files /dev/null and b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.id.jpg differ diff --git a/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.ms.jpg b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.ms.jpg new file mode 100644 index 00000000..1e3581d3 Binary files /dev/null and b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.ms.jpg differ diff --git a/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.tl.jpg b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.tl.jpg new file mode 100644 index 00000000..1e3581d3 Binary files /dev/null and b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.tl.jpg differ diff --git a/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.vi.jpg b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.vi.jpg new file mode 100644 index 00000000..1e3581d3 Binary files /dev/null and b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.vi.jpg differ diff --git a/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.id.jpg b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.id.jpg new file mode 100644 index 00000000..554ea37b Binary files /dev/null and b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.id.jpg differ diff --git a/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.ms.jpg b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.ms.jpg new file mode 100644 index 00000000..554ea37b Binary files /dev/null and b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.ms.jpg differ diff --git a/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.tl.jpg b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.tl.jpg new file mode 100644 index 00000000..554ea37b Binary files /dev/null and b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.tl.jpg differ diff --git a/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.vi.jpg b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.vi.jpg new file mode 100644 index 00000000..554ea37b Binary files /dev/null and b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.vi.jpg differ diff --git a/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.id.jpg b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.id.jpg new file mode 100644 index 00000000..427ba4c3 Binary files /dev/null and b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.id.jpg differ diff --git a/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.ms.jpg b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.ms.jpg new file mode 100644 index 00000000..427ba4c3 Binary files /dev/null and b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.ms.jpg differ diff --git a/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.tl.jpg b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.tl.jpg new file mode 100644 index 00000000..427ba4c3 Binary files /dev/null and b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.tl.jpg differ diff --git a/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.vi.jpg b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.vi.jpg new file mode 100644 index 00000000..427ba4c3 Binary files /dev/null and b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.vi.jpg differ diff --git a/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.id.jpg b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.id.jpg new file mode 100644 index 00000000..b2357285 Binary files /dev/null and b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.id.jpg differ diff --git a/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.ms.jpg b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.ms.jpg new file mode 100644 index 00000000..b2357285 Binary files /dev/null and b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.ms.jpg differ diff --git a/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.tl.jpg b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.tl.jpg new file mode 100644 index 00000000..b2357285 Binary files /dev/null and b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.tl.jpg differ diff --git a/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.vi.jpg b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.vi.jpg new file mode 100644 index 00000000..b2357285 Binary files /dev/null and b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.vi.jpg differ diff --git a/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.id.jpg b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.id.jpg new file mode 100644 index 00000000..1736ebb4 Binary files /dev/null and b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.id.jpg differ diff --git a/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.ms.jpg b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.ms.jpg new file mode 100644 index 00000000..1736ebb4 Binary files /dev/null and b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.ms.jpg differ diff --git a/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.tl.jpg b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.tl.jpg new file mode 100644 index 00000000..1736ebb4 Binary files /dev/null and b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.tl.jpg differ diff --git a/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.vi.jpg b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.vi.jpg new file mode 100644 index 00000000..1736ebb4 Binary files /dev/null and b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.vi.jpg differ diff --git a/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.id.jpg b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.id.jpg new file mode 100644 index 00000000..bf1d724f Binary files /dev/null and b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.id.jpg differ diff --git a/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.ms.jpg b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.ms.jpg new file mode 100644 index 00000000..bf1d724f Binary files /dev/null and b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.ms.jpg differ diff --git a/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.tl.jpg b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.tl.jpg new file mode 100644 index 00000000..bf1d724f Binary files /dev/null and b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.tl.jpg differ diff --git a/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.vi.jpg b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.vi.jpg new file mode 100644 index 00000000..bf1d724f Binary files /dev/null and b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.vi.jpg differ diff --git a/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.id.jpg b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.id.jpg new file mode 100644 index 00000000..bb78259a Binary files /dev/null and b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.id.jpg differ diff --git a/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.ms.jpg b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.ms.jpg new file mode 100644 index 00000000..bb78259a Binary files /dev/null and b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.ms.jpg differ diff --git a/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.tl.jpg b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.tl.jpg new file mode 100644 index 00000000..bb78259a Binary files /dev/null and b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.tl.jpg differ diff --git a/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.vi.jpg b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.vi.jpg new file mode 100644 index 00000000..bb78259a Binary files /dev/null and b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.vi.jpg differ diff --git a/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.id.jpg b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.id.jpg new file mode 100644 index 00000000..b311b568 Binary files /dev/null and b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.id.jpg differ diff --git a/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.ms.jpg b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.ms.jpg new file mode 100644 index 00000000..b311b568 Binary files /dev/null and b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.ms.jpg differ diff --git a/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.tl.jpg b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.tl.jpg new file mode 100644 index 00000000..b311b568 Binary files /dev/null and b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.tl.jpg differ diff --git a/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.vi.jpg b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.vi.jpg new file mode 100644 index 00000000..b311b568 Binary files /dev/null and b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.vi.jpg differ diff --git a/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.id.jpg b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.id.jpg new file mode 100644 index 00000000..5bd350fd Binary files /dev/null and b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.id.jpg differ diff --git a/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.ms.jpg b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.ms.jpg new file mode 100644 index 00000000..5bd350fd Binary files /dev/null and b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.ms.jpg differ diff --git a/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.tl.jpg b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.tl.jpg new file mode 100644 index 00000000..5bd350fd Binary files /dev/null and b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.tl.jpg differ diff --git a/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.vi.jpg b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.vi.jpg new file mode 100644 index 00000000..5bd350fd Binary files /dev/null and b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.vi.jpg differ diff --git a/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.id.jpg b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.id.jpg new file mode 100644 index 00000000..66fbe114 Binary files /dev/null and b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.id.jpg differ diff --git a/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.ms.jpg b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.ms.jpg new file mode 100644 index 00000000..66fbe114 Binary files /dev/null and b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.ms.jpg differ diff --git a/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.tl.jpg b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.tl.jpg new file mode 100644 index 00000000..66fbe114 Binary files /dev/null and b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.tl.jpg differ diff --git a/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.vi.jpg b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.vi.jpg new file mode 100644 index 00000000..66fbe114 Binary files /dev/null and b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.vi.jpg differ diff --git a/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.id.jpg b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.id.jpg new file mode 100644 index 00000000..050e7206 Binary files /dev/null and b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.id.jpg differ diff --git a/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.ms.jpg b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.ms.jpg new file mode 100644 index 00000000..050e7206 Binary files /dev/null and b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.ms.jpg differ diff --git a/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.tl.jpg b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.tl.jpg new file mode 100644 index 00000000..050e7206 Binary files /dev/null and b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.tl.jpg differ diff --git a/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.vi.jpg b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.vi.jpg new file mode 100644 index 00000000..050e7206 Binary files /dev/null and b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.vi.jpg differ diff --git a/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.id.jpg b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.id.jpg new file mode 100644 index 00000000..91c64faa Binary files /dev/null and b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.id.jpg differ diff --git a/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.ms.jpg b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.ms.jpg new file mode 100644 index 00000000..91c64faa Binary files /dev/null and b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.ms.jpg differ diff --git a/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.tl.jpg b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.tl.jpg new file mode 100644 index 00000000..91c64faa Binary files /dev/null and b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.tl.jpg differ diff --git a/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.vi.jpg b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.vi.jpg new file mode 100644 index 00000000..91c64faa Binary files /dev/null and b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.vi.jpg differ diff --git a/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.id.jpg b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.id.jpg new file mode 100644 index 00000000..36e1a4b3 Binary files /dev/null and b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.id.jpg differ diff --git a/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.ms.jpg b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.ms.jpg new file mode 100644 index 00000000..36e1a4b3 Binary files /dev/null and b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.ms.jpg differ diff --git a/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.tl.jpg b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.tl.jpg new file mode 100644 index 00000000..36e1a4b3 Binary files /dev/null and b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.tl.jpg differ diff --git a/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.vi.jpg b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.vi.jpg new file mode 100644 index 00000000..36e1a4b3 Binary files /dev/null and b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.vi.jpg differ diff --git a/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.id.jpg b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.id.jpg new file mode 100644 index 00000000..1b87df4c Binary files /dev/null and b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.id.jpg differ diff --git a/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.ms.jpg b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.ms.jpg new file mode 100644 index 00000000..1b87df4c Binary files /dev/null and b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.ms.jpg differ diff --git a/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.tl.jpg b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.tl.jpg new file mode 100644 index 00000000..1b87df4c Binary files /dev/null and b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.tl.jpg differ diff --git a/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.vi.jpg b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.vi.jpg new file mode 100644 index 00000000..1b87df4c Binary files /dev/null and b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.vi.jpg differ diff --git a/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.id.jpg b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.id.jpg new file mode 100644 index 00000000..8df37a22 Binary files /dev/null and b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.id.jpg differ diff --git a/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.ms.jpg b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.ms.jpg new file mode 100644 index 00000000..8df37a22 Binary files /dev/null and b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.ms.jpg differ diff --git a/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.tl.jpg b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.tl.jpg new file mode 100644 index 00000000..8df37a22 Binary files /dev/null and b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.tl.jpg differ diff --git a/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.vi.jpg b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.vi.jpg new file mode 100644 index 00000000..8df37a22 Binary files /dev/null and b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.vi.jpg differ diff --git a/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.id.jpg b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.id.jpg new file mode 100644 index 00000000..943af1b9 Binary files /dev/null and b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.id.jpg differ diff --git a/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.ms.jpg b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.ms.jpg new file mode 100644 index 00000000..943af1b9 Binary files /dev/null and b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.ms.jpg differ diff --git a/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.tl.jpg b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.tl.jpg new file mode 100644 index 00000000..943af1b9 Binary files /dev/null and b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.tl.jpg differ diff --git a/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.vi.jpg b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.vi.jpg new file mode 100644 index 00000000..943af1b9 Binary files /dev/null and b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.vi.jpg differ diff --git a/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.id.jpg b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.id.jpg new file mode 100644 index 00000000..5a96f7fb Binary files /dev/null and b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.id.jpg differ diff --git a/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.ms.jpg b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.ms.jpg new file mode 100644 index 00000000..5a96f7fb Binary files /dev/null and b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.ms.jpg differ diff --git a/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.tl.jpg b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.tl.jpg new file mode 100644 index 00000000..5a96f7fb Binary files /dev/null and b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.tl.jpg differ diff --git a/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.vi.jpg b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.vi.jpg new file mode 100644 index 00000000..5a96f7fb Binary files /dev/null and b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.vi.jpg differ diff --git a/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.id.jpg b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.id.jpg new file mode 100644 index 00000000..8f0bee50 Binary files /dev/null and b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.id.jpg differ diff --git a/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.ms.jpg b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.ms.jpg new file mode 100644 index 00000000..8f0bee50 Binary files /dev/null and b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.ms.jpg differ diff --git a/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.tl.jpg b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.tl.jpg new file mode 100644 index 00000000..8f0bee50 Binary files /dev/null and b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.tl.jpg differ diff --git a/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.vi.jpg b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.vi.jpg new file mode 100644 index 00000000..8f0bee50 Binary files /dev/null and b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.vi.jpg differ diff --git a/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.id.jpg b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.id.jpg new file mode 100644 index 00000000..4ba24109 Binary files /dev/null and b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.id.jpg differ diff --git a/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.ms.jpg b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.ms.jpg new file mode 100644 index 00000000..4ba24109 Binary files /dev/null and b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.ms.jpg differ diff --git a/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.tl.jpg b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.tl.jpg new file mode 100644 index 00000000..4ba24109 Binary files /dev/null and b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.tl.jpg differ diff --git a/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.vi.jpg b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.vi.jpg new file mode 100644 index 00000000..4ba24109 Binary files /dev/null and b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.vi.jpg differ diff --git a/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.id.jpg b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.id.jpg new file mode 100644 index 00000000..cdf0f557 Binary files /dev/null and b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.id.jpg differ diff --git a/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.ms.jpg b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.ms.jpg new file mode 100644 index 00000000..cdf0f557 Binary files /dev/null and b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.ms.jpg differ diff --git a/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.tl.jpg b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.tl.jpg new file mode 100644 index 00000000..cdf0f557 Binary files /dev/null and b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.tl.jpg differ diff --git a/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.vi.jpg b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.vi.jpg new file mode 100644 index 00000000..cdf0f557 Binary files /dev/null and b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.vi.jpg differ diff --git a/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.id.jpg b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.id.jpg new file mode 100644 index 00000000..f59ee98d Binary files /dev/null and b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.id.jpg differ diff --git a/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.ms.jpg b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.ms.jpg new file mode 100644 index 00000000..f59ee98d Binary files /dev/null and b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.ms.jpg differ diff --git a/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.tl.jpg b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.tl.jpg new file mode 100644 index 00000000..f59ee98d Binary files /dev/null and b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.tl.jpg differ diff --git a/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.vi.jpg b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.vi.jpg new file mode 100644 index 00000000..f59ee98d Binary files /dev/null and b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.vi.jpg differ diff --git a/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.id.jpg b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.id.jpg new file mode 100644 index 00000000..5bdbfd14 Binary files /dev/null and b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.id.jpg differ diff --git a/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.ms.jpg b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.ms.jpg new file mode 100644 index 00000000..5bdbfd14 Binary files /dev/null and b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.ms.jpg differ diff --git a/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.tl.jpg b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.tl.jpg new file mode 100644 index 00000000..5bdbfd14 Binary files /dev/null and b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.tl.jpg differ diff --git a/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.vi.jpg b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.vi.jpg new file mode 100644 index 00000000..5bdbfd14 Binary files /dev/null and b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.vi.jpg differ diff --git a/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.id.jpg b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.id.jpg new file mode 100644 index 00000000..b78ab3ac Binary files /dev/null and b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.id.jpg differ diff --git a/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.ms.jpg b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.ms.jpg new file mode 100644 index 00000000..b78ab3ac Binary files /dev/null and b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.ms.jpg differ diff --git a/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.tl.jpg b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.tl.jpg new file mode 100644 index 00000000..b78ab3ac Binary files /dev/null and b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.tl.jpg differ diff --git a/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.vi.jpg b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.vi.jpg new file mode 100644 index 00000000..b78ab3ac Binary files /dev/null and b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.vi.jpg differ diff --git a/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.id.png b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.id.png new file mode 100644 index 00000000..d071dffe Binary files /dev/null and b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.id.png differ diff --git a/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.ms.png b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.ms.png new file mode 100644 index 00000000..d071dffe Binary files /dev/null and b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.ms.png differ diff --git a/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.tl.png b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.tl.png new file mode 100644 index 00000000..d071dffe Binary files /dev/null and b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.tl.png differ diff --git a/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.vi.png b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.vi.png new file mode 100644 index 00000000..d071dffe Binary files /dev/null and b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.vi.png differ diff --git a/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.id.png b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.id.png new file mode 100644 index 00000000..b8947f6d Binary files /dev/null and b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.id.png differ diff --git a/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.ms.png b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.ms.png new file mode 100644 index 00000000..b8947f6d Binary files /dev/null and b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.ms.png differ diff --git a/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.tl.png b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.tl.png new file mode 100644 index 00000000..b8947f6d Binary files /dev/null and b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.tl.png differ diff --git a/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.vi.png b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.vi.png new file mode 100644 index 00000000..b8947f6d Binary files /dev/null and b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.vi.png differ diff --git a/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.id.png b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.id.png new file mode 100644 index 00000000..5c5dfb96 Binary files /dev/null and b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.id.png differ diff --git a/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.ms.png b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.ms.png new file mode 100644 index 00000000..5c5dfb96 Binary files /dev/null and b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.ms.png differ diff --git a/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.tl.png b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.tl.png new file mode 100644 index 00000000..5c5dfb96 Binary files /dev/null and b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.tl.png differ diff --git a/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.vi.png b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.vi.png new file mode 100644 index 00000000..5c5dfb96 Binary files /dev/null and b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.vi.png differ diff --git a/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.id.png b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.id.png new file mode 100644 index 00000000..663ad7e9 Binary files /dev/null and b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.id.png differ diff --git a/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.ms.png b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.ms.png new file mode 100644 index 00000000..663ad7e9 Binary files /dev/null and b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.ms.png differ diff --git a/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.tl.png b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.tl.png new file mode 100644 index 00000000..663ad7e9 Binary files /dev/null and b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.tl.png differ diff --git a/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.vi.png b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.vi.png new file mode 100644 index 00000000..663ad7e9 Binary files /dev/null and b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.vi.png differ diff --git a/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.id.png b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.id.png new file mode 100644 index 00000000..b1e33d6b Binary files /dev/null and b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.id.png differ diff --git a/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.ms.png b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.ms.png new file mode 100644 index 00000000..b1e33d6b Binary files /dev/null and b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.ms.png differ diff --git a/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.tl.png b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.tl.png new file mode 100644 index 00000000..b1e33d6b Binary files /dev/null and b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.tl.png differ diff --git a/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.vi.png b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.vi.png new file mode 100644 index 00000000..b1e33d6b Binary files /dev/null and b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.vi.png differ diff --git a/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.id.png b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.id.png new file mode 100644 index 00000000..2a03ab78 Binary files /dev/null and b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.id.png differ diff --git a/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.ms.png b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.ms.png new file mode 100644 index 00000000..2a03ab78 Binary files /dev/null and b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.ms.png differ diff --git a/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.tl.png b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.tl.png new file mode 100644 index 00000000..2a03ab78 Binary files /dev/null and b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.tl.png differ diff --git a/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.vi.png b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.vi.png new file mode 100644 index 00000000..2a03ab78 Binary files /dev/null and b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.vi.png differ diff --git a/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.id.png b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.id.png new file mode 100644 index 00000000..02ef1351 Binary files /dev/null and b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.id.png differ diff --git a/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.ms.png b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.ms.png new file mode 100644 index 00000000..02ef1351 Binary files /dev/null and b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.ms.png differ diff --git a/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.tl.png b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.tl.png new file mode 100644 index 00000000..02ef1351 Binary files /dev/null and b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.tl.png differ diff --git a/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.vi.png b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.vi.png new file mode 100644 index 00000000..02ef1351 Binary files /dev/null and b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.vi.png differ diff --git a/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.id.png b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.id.png new file mode 100644 index 00000000..33faabd1 Binary files /dev/null and b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.id.png differ diff --git a/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.ms.png b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.ms.png new file mode 100644 index 00000000..33faabd1 Binary files /dev/null and b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.ms.png differ diff --git a/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.tl.png b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.tl.png new file mode 100644 index 00000000..33faabd1 Binary files /dev/null and b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.tl.png differ diff --git a/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.vi.png b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.vi.png new file mode 100644 index 00000000..33faabd1 Binary files /dev/null and b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.vi.png differ diff --git a/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.id.png b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.id.png new file mode 100644 index 00000000..aa94da2c Binary files /dev/null and b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.id.png differ diff --git a/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.ms.png b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.ms.png new file mode 100644 index 00000000..aa94da2c Binary files /dev/null and b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.ms.png differ diff --git a/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.tl.png b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.tl.png new file mode 100644 index 00000000..aa94da2c Binary files /dev/null and b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.tl.png differ diff --git a/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.vi.png b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.vi.png new file mode 100644 index 00000000..aa94da2c Binary files /dev/null and b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.vi.png differ diff --git a/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.id.png b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.id.png new file mode 100644 index 00000000..ac000818 Binary files /dev/null and b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.id.png differ diff --git a/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.ms.png b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.ms.png new file mode 100644 index 00000000..ac000818 Binary files /dev/null and b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.ms.png differ diff --git a/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.tl.png b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.tl.png new file mode 100644 index 00000000..ac000818 Binary files /dev/null and b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.tl.png differ diff --git a/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.vi.png b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.vi.png new file mode 100644 index 00000000..ac000818 Binary files /dev/null and b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.vi.png differ diff --git a/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.id.png b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.id.png new file mode 100644 index 00000000..2fb519f5 Binary files /dev/null and b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.id.png differ diff --git a/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.ms.png b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.ms.png new file mode 100644 index 00000000..2fb519f5 Binary files /dev/null and b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.ms.png differ diff --git a/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.tl.png b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.tl.png new file mode 100644 index 00000000..2fb519f5 Binary files /dev/null and b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.tl.png differ diff --git a/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.vi.png b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.vi.png new file mode 100644 index 00000000..2fb519f5 Binary files /dev/null and b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.vi.png differ diff --git a/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.id.png b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.id.png new file mode 100644 index 00000000..48459b92 Binary files /dev/null and b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.id.png differ diff --git a/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.ms.png b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.ms.png new file mode 100644 index 00000000..48459b92 Binary files /dev/null and b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.ms.png differ diff --git a/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.tl.png b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.tl.png new file mode 100644 index 00000000..48459b92 Binary files /dev/null and b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.tl.png differ diff --git a/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.vi.png b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.vi.png new file mode 100644 index 00000000..48459b92 Binary files /dev/null and b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.vi.png differ diff --git a/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.id.png b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.id.png new file mode 100644 index 00000000..d502a579 Binary files /dev/null and b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.id.png differ diff --git a/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.ms.png b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.ms.png new file mode 100644 index 00000000..d502a579 Binary files /dev/null and b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.ms.png differ diff --git a/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.tl.png b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.tl.png new file mode 100644 index 00000000..d502a579 Binary files /dev/null and b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.tl.png differ diff --git a/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.vi.png b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.vi.png new file mode 100644 index 00000000..d502a579 Binary files /dev/null and b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.vi.png differ diff --git a/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.id.png b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.id.png new file mode 100644 index 00000000..fca45002 Binary files /dev/null and b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.id.png differ diff --git a/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.ms.png b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.ms.png new file mode 100644 index 00000000..fca45002 Binary files /dev/null and b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.ms.png differ diff --git a/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.tl.png b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.tl.png new file mode 100644 index 00000000..fca45002 Binary files /dev/null and b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.tl.png differ diff --git a/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.vi.png b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.vi.png new file mode 100644 index 00000000..fca45002 Binary files /dev/null and b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.vi.png differ diff --git a/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.id.png b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.id.png new file mode 100644 index 00000000..94aa28db Binary files /dev/null and b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.id.png differ diff --git a/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.ms.png b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.ms.png new file mode 100644 index 00000000..94aa28db Binary files /dev/null and b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.ms.png differ diff --git a/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.tl.png b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.tl.png new file mode 100644 index 00000000..94aa28db Binary files /dev/null and b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.tl.png differ diff --git a/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.vi.png b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.vi.png new file mode 100644 index 00000000..94aa28db Binary files /dev/null and b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.vi.png differ diff --git a/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.id.png b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.id.png new file mode 100644 index 00000000..894df473 Binary files /dev/null and b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.id.png differ diff --git a/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.ms.png b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.ms.png new file mode 100644 index 00000000..894df473 Binary files /dev/null and b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.ms.png differ diff --git a/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.tl.png b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.tl.png new file mode 100644 index 00000000..894df473 Binary files /dev/null and b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.tl.png differ diff --git a/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.vi.png b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.vi.png new file mode 100644 index 00000000..894df473 Binary files /dev/null and b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.vi.png differ diff --git a/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.id.png b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.id.png new file mode 100644 index 00000000..b75dfdd2 Binary files /dev/null and b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.id.png differ diff --git a/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.ms.png b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.ms.png new file mode 100644 index 00000000..b75dfdd2 Binary files /dev/null and b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.ms.png differ diff --git a/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.tl.png b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.tl.png new file mode 100644 index 00000000..b75dfdd2 Binary files /dev/null and b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.tl.png differ diff --git a/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.vi.png b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.vi.png new file mode 100644 index 00000000..b75dfdd2 Binary files /dev/null and b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.vi.png differ diff --git a/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.id.png b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.id.png new file mode 100644 index 00000000..1e7934c3 Binary files /dev/null and b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.id.png differ diff --git a/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.ms.png b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.ms.png new file mode 100644 index 00000000..1e7934c3 Binary files /dev/null and b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.ms.png differ diff --git a/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.tl.png b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.tl.png new file mode 100644 index 00000000..1e7934c3 Binary files /dev/null and b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.tl.png differ diff --git a/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.vi.png b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.vi.png new file mode 100644 index 00000000..1e7934c3 Binary files /dev/null and b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.vi.png differ diff --git a/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.id.png b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.id.png new file mode 100644 index 00000000..5bb319ec Binary files /dev/null and b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.id.png differ diff --git a/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.ms.png b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.ms.png new file mode 100644 index 00000000..5bb319ec Binary files /dev/null and b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.ms.png differ diff --git a/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.tl.png b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.tl.png new file mode 100644 index 00000000..5bb319ec Binary files /dev/null and b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.tl.png differ diff --git a/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.vi.png b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.vi.png new file mode 100644 index 00000000..5bb319ec Binary files /dev/null and b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.vi.png differ diff --git a/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.id.png b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.id.png new file mode 100644 index 00000000..d66e224f Binary files /dev/null and b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.id.png differ diff --git a/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.ms.png b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.ms.png new file mode 100644 index 00000000..d66e224f Binary files /dev/null and b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.ms.png differ diff --git a/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.tl.png b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.tl.png new file mode 100644 index 00000000..d66e224f Binary files /dev/null and b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.tl.png differ diff --git a/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.vi.png b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.vi.png new file mode 100644 index 00000000..d66e224f Binary files /dev/null and b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.vi.png differ diff --git a/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.id.png b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.id.png new file mode 100644 index 00000000..ed18e7b0 Binary files /dev/null and b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.id.png differ diff --git a/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.ms.png b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.ms.png new file mode 100644 index 00000000..ed18e7b0 Binary files /dev/null and b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.ms.png differ diff --git a/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.tl.png b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.tl.png new file mode 100644 index 00000000..ed18e7b0 Binary files /dev/null and b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.tl.png differ diff --git a/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.vi.png b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.vi.png new file mode 100644 index 00000000..ed18e7b0 Binary files /dev/null and b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.vi.png differ diff --git a/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.id.png b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.id.png new file mode 100644 index 00000000..9acb21a7 Binary files /dev/null and b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.id.png differ diff --git a/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.ms.png b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.ms.png new file mode 100644 index 00000000..9acb21a7 Binary files /dev/null and b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.ms.png differ diff --git a/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.tl.png b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.tl.png new file mode 100644 index 00000000..9acb21a7 Binary files /dev/null and b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.tl.png differ diff --git a/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.vi.png b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.vi.png new file mode 100644 index 00000000..9acb21a7 Binary files /dev/null and b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.vi.png differ diff --git a/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.id.png b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.id.png new file mode 100644 index 00000000..1ced5fc1 Binary files /dev/null and b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.id.png differ diff --git a/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.ms.png b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.ms.png new file mode 100644 index 00000000..1ced5fc1 Binary files /dev/null and b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.ms.png differ diff --git a/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.tl.png b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.tl.png new file mode 100644 index 00000000..1ced5fc1 Binary files /dev/null and b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.tl.png differ diff --git a/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.vi.png b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.vi.png new file mode 100644 index 00000000..1ced5fc1 Binary files /dev/null and b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.vi.png differ diff --git a/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.id.png b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.id.png new file mode 100644 index 00000000..7293ced1 Binary files /dev/null and b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.id.png differ diff --git a/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.ms.png b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.ms.png new file mode 100644 index 00000000..7293ced1 Binary files /dev/null and b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.ms.png differ diff --git a/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.tl.png b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.tl.png new file mode 100644 index 00000000..7293ced1 Binary files /dev/null and b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.tl.png differ diff --git a/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.vi.png b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.vi.png new file mode 100644 index 00000000..7293ced1 Binary files /dev/null and b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.vi.png differ diff --git a/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.id.png b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.id.png new file mode 100644 index 00000000..be837c63 Binary files /dev/null and b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.id.png differ diff --git a/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.ms.png b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.ms.png new file mode 100644 index 00000000..be837c63 Binary files /dev/null and b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.ms.png differ diff --git a/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.tl.png b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.tl.png new file mode 100644 index 00000000..be837c63 Binary files /dev/null and b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.tl.png differ diff --git a/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.vi.png b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.vi.png new file mode 100644 index 00000000..be837c63 Binary files /dev/null and b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.vi.png differ diff --git a/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.id.png b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.id.png new file mode 100644 index 00000000..73861107 Binary files /dev/null and b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.id.png differ diff --git a/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.ms.png b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.ms.png new file mode 100644 index 00000000..73861107 Binary files /dev/null and b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.ms.png differ diff --git a/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.tl.png b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.tl.png new file mode 100644 index 00000000..73861107 Binary files /dev/null and b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.tl.png differ diff --git a/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.vi.png b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.vi.png new file mode 100644 index 00000000..73861107 Binary files /dev/null and b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.vi.png differ diff --git a/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.id.png b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.id.png new file mode 100644 index 00000000..1b26d7ff Binary files /dev/null and b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.id.png differ diff --git a/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.ms.png b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.ms.png new file mode 100644 index 00000000..1b26d7ff Binary files /dev/null and b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.ms.png differ diff --git a/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.tl.png b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.tl.png new file mode 100644 index 00000000..1b26d7ff Binary files /dev/null and b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.tl.png differ diff --git a/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.vi.png b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.vi.png new file mode 100644 index 00000000..1b26d7ff Binary files /dev/null and b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.vi.png differ diff --git a/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.id.png b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.id.png new file mode 100644 index 00000000..f1905ecc Binary files /dev/null and b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.id.png differ diff --git a/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.ms.png b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.ms.png new file mode 100644 index 00000000..f1905ecc Binary files /dev/null and b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.ms.png differ diff --git a/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.tl.png b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.tl.png new file mode 100644 index 00000000..f1905ecc Binary files /dev/null and b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.tl.png differ diff --git a/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.vi.png b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.vi.png new file mode 100644 index 00000000..f1905ecc Binary files /dev/null and b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.vi.png differ diff --git a/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.id.png b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.id.png new file mode 100644 index 00000000..edc44fa9 Binary files /dev/null and b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.id.png differ diff --git a/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.ms.png b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.ms.png new file mode 100644 index 00000000..edc44fa9 Binary files /dev/null and b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.ms.png differ diff --git a/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.tl.png b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.tl.png new file mode 100644 index 00000000..edc44fa9 Binary files /dev/null and b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.tl.png differ diff --git a/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.vi.png b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.vi.png new file mode 100644 index 00000000..edc44fa9 Binary files /dev/null and b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.vi.png differ diff --git a/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.id.png b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.id.png new file mode 100644 index 00000000..87854d3a Binary files /dev/null and b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.id.png differ diff --git a/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.ms.png b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.ms.png new file mode 100644 index 00000000..87854d3a Binary files /dev/null and b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.ms.png differ diff --git a/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.tl.png b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.tl.png new file mode 100644 index 00000000..87854d3a Binary files /dev/null and b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.tl.png differ diff --git a/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.vi.png b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.vi.png new file mode 100644 index 00000000..87854d3a Binary files /dev/null and b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.vi.png differ diff --git a/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.id.png b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.id.png new file mode 100644 index 00000000..d1158e0d Binary files /dev/null and b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.id.png differ diff --git a/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.ms.png b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.ms.png new file mode 100644 index 00000000..d1158e0d Binary files /dev/null and b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.ms.png differ diff --git a/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.tl.png b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.tl.png new file mode 100644 index 00000000..d1158e0d Binary files /dev/null and b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.tl.png differ diff --git a/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.vi.png b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.vi.png new file mode 100644 index 00000000..d1158e0d Binary files /dev/null and b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.vi.png differ diff --git a/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.id.png b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.id.png new file mode 100644 index 00000000..122abea4 Binary files /dev/null and b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.id.png differ diff --git a/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.ms.png b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.ms.png new file mode 100644 index 00000000..122abea4 Binary files /dev/null and b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.ms.png differ diff --git a/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.tl.png b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.tl.png new file mode 100644 index 00000000..122abea4 Binary files /dev/null and b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.tl.png differ diff --git a/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.vi.png b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.vi.png new file mode 100644 index 00000000..122abea4 Binary files /dev/null and b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.vi.png differ diff --git a/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.id.png b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.id.png new file mode 100644 index 00000000..dc009aa5 Binary files /dev/null and b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.id.png differ diff --git a/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.ms.png b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.ms.png new file mode 100644 index 00000000..dc009aa5 Binary files /dev/null and b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.ms.png differ diff --git a/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.tl.png b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.tl.png new file mode 100644 index 00000000..dc009aa5 Binary files /dev/null and b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.tl.png differ diff --git a/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.vi.png b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.vi.png new file mode 100644 index 00000000..dc009aa5 Binary files /dev/null and b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.vi.png differ diff --git a/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.id.png b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.id.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.id.png differ diff --git a/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.ms.png b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.ms.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.ms.png differ diff --git a/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.tl.png b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.tl.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.tl.png differ diff --git a/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.vi.png b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.vi.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.vi.png differ diff --git a/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.id.png b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.id.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.id.png differ diff --git a/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.ms.png b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.ms.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.ms.png differ diff --git a/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.tl.png b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.tl.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.tl.png differ diff --git a/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.vi.png b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.vi.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.vi.png differ diff --git a/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.id.png b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.id.png new file mode 100644 index 00000000..12274b8b Binary files /dev/null and b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.id.png differ diff --git a/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.ms.png b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.ms.png new file mode 100644 index 00000000..12274b8b Binary files /dev/null and b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.ms.png differ diff --git a/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.tl.png b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.tl.png new file mode 100644 index 00000000..12274b8b Binary files /dev/null and b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.tl.png differ diff --git a/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.vi.png b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.vi.png new file mode 100644 index 00000000..12274b8b Binary files /dev/null and b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.vi.png differ diff --git a/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.id.png b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.id.png new file mode 100644 index 00000000..da226797 Binary files /dev/null and b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.id.png differ diff --git a/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.ms.png b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.ms.png new file mode 100644 index 00000000..da226797 Binary files /dev/null and b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.ms.png differ diff --git a/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.tl.png b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.tl.png new file mode 100644 index 00000000..da226797 Binary files /dev/null and b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.tl.png differ diff --git a/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.vi.png b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.vi.png new file mode 100644 index 00000000..da226797 Binary files /dev/null and b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.vi.png differ diff --git a/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.id.png b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.id.png new file mode 100644 index 00000000..67bd8a82 Binary files /dev/null and b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.id.png differ diff --git a/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.ms.png b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.ms.png new file mode 100644 index 00000000..67bd8a82 Binary files /dev/null and b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.ms.png differ diff --git a/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.tl.png b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.tl.png new file mode 100644 index 00000000..67bd8a82 Binary files /dev/null and b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.tl.png differ diff --git a/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.vi.png b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.vi.png new file mode 100644 index 00000000..67bd8a82 Binary files /dev/null and b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.vi.png differ diff --git a/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.id.png b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.id.png new file mode 100644 index 00000000..18938f59 Binary files /dev/null and b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.id.png differ diff --git a/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.ms.png b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.ms.png new file mode 100644 index 00000000..18938f59 Binary files /dev/null and b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.ms.png differ diff --git a/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.tl.png b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.tl.png new file mode 100644 index 00000000..18938f59 Binary files /dev/null and b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.tl.png differ diff --git a/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.vi.png b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.vi.png new file mode 100644 index 00000000..18938f59 Binary files /dev/null and b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.vi.png differ diff --git a/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.id.png b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.id.png new file mode 100644 index 00000000..db480604 Binary files /dev/null and b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.id.png differ diff --git a/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.ms.png b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.ms.png new file mode 100644 index 00000000..db480604 Binary files /dev/null and b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.ms.png differ diff --git a/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.tl.png b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.tl.png new file mode 100644 index 00000000..db480604 Binary files /dev/null and b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.tl.png differ diff --git a/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.vi.png b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.vi.png new file mode 100644 index 00000000..db480604 Binary files /dev/null and b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.vi.png differ diff --git a/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.id.png b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.id.png new file mode 100644 index 00000000..535e5798 Binary files /dev/null and b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.id.png differ diff --git a/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.ms.png b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.ms.png new file mode 100644 index 00000000..535e5798 Binary files /dev/null and b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.ms.png differ diff --git a/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.tl.png b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.tl.png new file mode 100644 index 00000000..535e5798 Binary files /dev/null and b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.tl.png differ diff --git a/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.vi.png b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.vi.png new file mode 100644 index 00000000..535e5798 Binary files /dev/null and b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.vi.png differ diff --git a/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.id.png b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.id.png new file mode 100644 index 00000000..b3d83ab7 Binary files /dev/null and b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.id.png differ diff --git a/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.ms.png b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.ms.png new file mode 100644 index 00000000..b3d83ab7 Binary files /dev/null and b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.ms.png differ diff --git a/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.tl.png b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.tl.png new file mode 100644 index 00000000..b3d83ab7 Binary files /dev/null and b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.tl.png differ diff --git a/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.vi.png b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.vi.png new file mode 100644 index 00000000..b3d83ab7 Binary files /dev/null and b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.vi.png differ diff --git a/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.id.png b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.id.png new file mode 100644 index 00000000..4bb97d60 Binary files /dev/null and b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.id.png differ diff --git a/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.ms.png b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.ms.png new file mode 100644 index 00000000..4bb97d60 Binary files /dev/null and b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.ms.png differ diff --git a/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.tl.png b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.tl.png new file mode 100644 index 00000000..4bb97d60 Binary files /dev/null and b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.tl.png differ diff --git a/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.vi.png b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.vi.png new file mode 100644 index 00000000..4bb97d60 Binary files /dev/null and b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.vi.png differ diff --git a/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.id.jpg b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.id.jpg new file mode 100644 index 00000000..4cf0d73d Binary files /dev/null and b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.id.jpg differ diff --git a/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.ms.jpg b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.ms.jpg new file mode 100644 index 00000000..4cf0d73d Binary files /dev/null and b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.ms.jpg differ diff --git a/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.tl.jpg b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.tl.jpg new file mode 100644 index 00000000..4cf0d73d Binary files /dev/null and b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.tl.jpg differ diff --git a/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.vi.jpg b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.vi.jpg new file mode 100644 index 00000000..4cf0d73d Binary files /dev/null and b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.vi.jpg differ diff --git a/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.id.png b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.id.png new file mode 100644 index 00000000..0aace880 Binary files /dev/null and b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.id.png differ diff --git a/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.ms.png b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.ms.png new file mode 100644 index 00000000..0aace880 Binary files /dev/null and b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.ms.png differ diff --git a/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.tl.png b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.tl.png new file mode 100644 index 00000000..0aace880 Binary files /dev/null and b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.tl.png differ diff --git a/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.vi.png b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.vi.png new file mode 100644 index 00000000..0aace880 Binary files /dev/null and b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.vi.png differ diff --git a/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.id.png b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.id.png new file mode 100644 index 00000000..b19b1f6b Binary files /dev/null and b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.id.png differ diff --git a/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.ms.png b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.ms.png new file mode 100644 index 00000000..b19b1f6b Binary files /dev/null and b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.ms.png differ diff --git a/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.tl.png b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.tl.png new file mode 100644 index 00000000..b19b1f6b Binary files /dev/null and b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.tl.png differ diff --git a/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.vi.png b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.vi.png new file mode 100644 index 00000000..b19b1f6b Binary files /dev/null and b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.vi.png differ diff --git a/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.id.jpg b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.id.jpg new file mode 100644 index 00000000..827670ed Binary files /dev/null and b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.id.jpg differ diff --git a/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.ms.jpg b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.ms.jpg new file mode 100644 index 00000000..827670ed Binary files /dev/null and b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.ms.jpg differ diff --git a/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.tl.jpg b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.tl.jpg new file mode 100644 index 00000000..827670ed Binary files /dev/null and b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.tl.jpg differ diff --git a/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.vi.jpg b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.vi.jpg new file mode 100644 index 00000000..827670ed Binary files /dev/null and b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.vi.jpg differ diff --git a/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.id.png b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.id.png new file mode 100644 index 00000000..435f901a Binary files /dev/null and b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.id.png differ diff --git a/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.ms.png b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.ms.png new file mode 100644 index 00000000..435f901a Binary files /dev/null and b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.ms.png differ diff --git a/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.tl.png b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.tl.png new file mode 100644 index 00000000..435f901a Binary files /dev/null and b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.tl.png differ diff --git a/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.vi.png b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.vi.png new file mode 100644 index 00000000..435f901a Binary files /dev/null and b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.vi.png differ diff --git a/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.id.png b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.id.png new file mode 100644 index 00000000..7308a1d1 Binary files /dev/null and b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.id.png differ diff --git a/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.ms.png b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.ms.png new file mode 100644 index 00000000..7308a1d1 Binary files /dev/null and b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.ms.png differ diff --git a/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.tl.png b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.tl.png new file mode 100644 index 00000000..7308a1d1 Binary files /dev/null and b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.tl.png differ diff --git a/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.vi.png b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.vi.png new file mode 100644 index 00000000..7308a1d1 Binary files /dev/null and b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.vi.png differ diff --git a/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.id.png b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.id.png new file mode 100644 index 00000000..8454c4d2 Binary files /dev/null and b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.id.png differ diff --git a/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.ms.png b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.ms.png new file mode 100644 index 00000000..8454c4d2 Binary files /dev/null and b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.ms.png differ diff --git a/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.tl.png b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.tl.png new file mode 100644 index 00000000..8454c4d2 Binary files /dev/null and b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.tl.png differ diff --git a/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.vi.png b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.vi.png new file mode 100644 index 00000000..8454c4d2 Binary files /dev/null and b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.vi.png differ diff --git a/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.id.png b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.id.png new file mode 100644 index 00000000..324b711d Binary files /dev/null and b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.id.png differ diff --git a/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.ms.png b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.ms.png new file mode 100644 index 00000000..324b711d Binary files /dev/null and b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.ms.png differ diff --git a/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.tl.png b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.tl.png new file mode 100644 index 00000000..324b711d Binary files /dev/null and b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.tl.png differ diff --git a/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.vi.png b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.vi.png new file mode 100644 index 00000000..324b711d Binary files /dev/null and b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.vi.png differ diff --git a/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.id.png b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.id.png new file mode 100644 index 00000000..ddfb42aa Binary files /dev/null and b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.id.png differ diff --git a/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.ms.png b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.ms.png new file mode 100644 index 00000000..ddfb42aa Binary files /dev/null and b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.ms.png differ diff --git a/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.tl.png b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.tl.png new file mode 100644 index 00000000..ddfb42aa Binary files /dev/null and b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.tl.png differ diff --git a/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.vi.png b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.vi.png new file mode 100644 index 00000000..ddfb42aa Binary files /dev/null and b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.vi.png differ diff --git a/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.id.png b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.id.png new file mode 100644 index 00000000..280f2fe0 Binary files /dev/null and b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.id.png differ diff --git a/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.ms.png b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.ms.png new file mode 100644 index 00000000..280f2fe0 Binary files /dev/null and b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.ms.png differ diff --git a/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.tl.png b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.tl.png new file mode 100644 index 00000000..280f2fe0 Binary files /dev/null and b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.tl.png differ diff --git a/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.vi.png b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.vi.png new file mode 100644 index 00000000..280f2fe0 Binary files /dev/null and b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.vi.png differ diff --git a/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.id.jpg b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.id.jpg new file mode 100644 index 00000000..89b581ef Binary files /dev/null and b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.id.jpg differ diff --git a/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.ms.jpg b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.ms.jpg new file mode 100644 index 00000000..89b581ef Binary files /dev/null and b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.ms.jpg differ diff --git a/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.tl.jpg b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.tl.jpg new file mode 100644 index 00000000..89b581ef Binary files /dev/null and b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.tl.jpg differ diff --git a/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.vi.jpg b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.vi.jpg new file mode 100644 index 00000000..89b581ef Binary files /dev/null and b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.vi.jpg differ diff --git a/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.id.jpg b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.id.jpg new file mode 100644 index 00000000..6efd2da1 Binary files /dev/null and b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.id.jpg differ diff --git a/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.ms.jpg b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.ms.jpg new file mode 100644 index 00000000..6efd2da1 Binary files /dev/null and b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.ms.jpg differ diff --git a/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.tl.jpg b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.tl.jpg new file mode 100644 index 00000000..6efd2da1 Binary files /dev/null and b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.tl.jpg differ diff --git a/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.vi.jpg b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.vi.jpg new file mode 100644 index 00000000..6efd2da1 Binary files /dev/null and b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.vi.jpg differ diff --git a/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.id.png b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.id.png new file mode 100644 index 00000000..348fe7a0 Binary files /dev/null and b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.id.png differ diff --git a/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.ms.png b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.ms.png new file mode 100644 index 00000000..348fe7a0 Binary files /dev/null and b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.ms.png differ diff --git a/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.tl.png b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.tl.png new file mode 100644 index 00000000..348fe7a0 Binary files /dev/null and b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.tl.png differ diff --git a/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.vi.png b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.vi.png new file mode 100644 index 00000000..348fe7a0 Binary files /dev/null and b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.vi.png differ diff --git a/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.id.png b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.id.png new file mode 100644 index 00000000..a69e73f4 Binary files /dev/null and b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.id.png differ diff --git a/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.ms.png b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.ms.png new file mode 100644 index 00000000..a69e73f4 Binary files /dev/null and b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.ms.png differ diff --git a/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.tl.png b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.tl.png new file mode 100644 index 00000000..a69e73f4 Binary files /dev/null and b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.tl.png differ diff --git a/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.vi.png b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.vi.png new file mode 100644 index 00000000..a69e73f4 Binary files /dev/null and b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.vi.png differ diff --git a/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.id.png b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.id.png new file mode 100644 index 00000000..49b0ca9b Binary files /dev/null and b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.id.png differ diff --git a/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.ms.png b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.ms.png new file mode 100644 index 00000000..49b0ca9b Binary files /dev/null and b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.ms.png differ diff --git a/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.tl.png b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.tl.png new file mode 100644 index 00000000..49b0ca9b Binary files /dev/null and b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.tl.png differ diff --git a/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.vi.png b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.vi.png new file mode 100644 index 00000000..49b0ca9b Binary files /dev/null and b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.vi.png differ diff --git a/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.id.png b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.id.png new file mode 100644 index 00000000..458a3c95 Binary files /dev/null and b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.id.png differ diff --git a/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.ms.png b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.ms.png new file mode 100644 index 00000000..458a3c95 Binary files /dev/null and b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.ms.png differ diff --git a/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.tl.png b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.tl.png new file mode 100644 index 00000000..458a3c95 Binary files /dev/null and b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.tl.png differ diff --git a/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.vi.png b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.vi.png new file mode 100644 index 00000000..458a3c95 Binary files /dev/null and b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.vi.png differ diff --git a/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.id.png b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.id.png new file mode 100644 index 00000000..90b687c2 Binary files /dev/null and b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.id.png differ diff --git a/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.ms.png b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.ms.png new file mode 100644 index 00000000..90b687c2 Binary files /dev/null and b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.ms.png differ diff --git a/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.tl.png b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.tl.png new file mode 100644 index 00000000..90b687c2 Binary files /dev/null and b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.tl.png differ diff --git a/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.vi.png b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.vi.png new file mode 100644 index 00000000..90b687c2 Binary files /dev/null and b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.vi.png differ diff --git a/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.id.png b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.id.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.id.png differ diff --git a/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.ms.png b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.ms.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.ms.png differ diff --git a/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.tl.png b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.tl.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.tl.png differ diff --git a/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.vi.png b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.vi.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.vi.png differ diff --git a/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.id.png b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.id.png new file mode 100644 index 00000000..e7ea8ab6 Binary files /dev/null and b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.id.png differ diff --git a/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.ms.png b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.ms.png new file mode 100644 index 00000000..e7ea8ab6 Binary files /dev/null and b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.ms.png differ diff --git a/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.tl.png b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.tl.png new file mode 100644 index 00000000..e7ea8ab6 Binary files /dev/null and b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.tl.png differ diff --git a/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.vi.png b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.vi.png new file mode 100644 index 00000000..e7ea8ab6 Binary files /dev/null and b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.vi.png differ diff --git a/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.id.png b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.id.png new file mode 100644 index 00000000..6f138cf9 Binary files /dev/null and b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.id.png differ diff --git a/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.ms.png b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.ms.png new file mode 100644 index 00000000..6f138cf9 Binary files /dev/null and b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.ms.png differ diff --git a/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.tl.png b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.tl.png new file mode 100644 index 00000000..6f138cf9 Binary files /dev/null and b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.tl.png differ diff --git a/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.vi.png b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.vi.png new file mode 100644 index 00000000..6f138cf9 Binary files /dev/null and b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.vi.png differ diff --git a/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.id.png b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.id.png new file mode 100644 index 00000000..2f5f2861 Binary files /dev/null and b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.id.png differ diff --git a/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.ms.png b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.ms.png new file mode 100644 index 00000000..2f5f2861 Binary files /dev/null and b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.ms.png differ diff --git a/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.tl.png b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.tl.png new file mode 100644 index 00000000..2f5f2861 Binary files /dev/null and b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.tl.png differ diff --git a/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.vi.png b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.vi.png new file mode 100644 index 00000000..2f5f2861 Binary files /dev/null and b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.vi.png differ diff --git a/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.id.png b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.id.png new file mode 100644 index 00000000..f2f1b63e Binary files /dev/null and b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.id.png differ diff --git a/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.ms.png b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.ms.png new file mode 100644 index 00000000..f2f1b63e Binary files /dev/null and b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.ms.png differ diff --git a/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.tl.png b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.tl.png new file mode 100644 index 00000000..f2f1b63e Binary files /dev/null and b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.tl.png differ diff --git a/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.vi.png b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.vi.png new file mode 100644 index 00000000..f2f1b63e Binary files /dev/null and b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.vi.png differ diff --git a/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.id.png b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.id.png new file mode 100644 index 00000000..5643c164 Binary files /dev/null and b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.id.png differ diff --git a/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.ms.png b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.ms.png new file mode 100644 index 00000000..5643c164 Binary files /dev/null and b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.ms.png differ diff --git a/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.tl.png b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.tl.png new file mode 100644 index 00000000..5643c164 Binary files /dev/null and b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.tl.png differ diff --git a/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.vi.png b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.vi.png new file mode 100644 index 00000000..5643c164 Binary files /dev/null and b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.vi.png differ diff --git a/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.id.png b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.id.png new file mode 100644 index 00000000..73fa30d1 Binary files /dev/null and b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.id.png differ diff --git a/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.ms.png b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.ms.png new file mode 100644 index 00000000..73fa30d1 Binary files /dev/null and b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.ms.png differ diff --git a/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.tl.png b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.tl.png new file mode 100644 index 00000000..73fa30d1 Binary files /dev/null and b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.tl.png differ diff --git a/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.vi.png b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.vi.png new file mode 100644 index 00000000..73fa30d1 Binary files /dev/null and b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.vi.png differ diff --git a/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.id.png b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.id.png new file mode 100644 index 00000000..eee39f7d Binary files /dev/null and b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.id.png differ diff --git a/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.ms.png b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.ms.png new file mode 100644 index 00000000..eee39f7d Binary files /dev/null and b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.ms.png differ diff --git a/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.tl.png b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.tl.png new file mode 100644 index 00000000..eee39f7d Binary files /dev/null and b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.tl.png differ diff --git a/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.vi.png b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.vi.png new file mode 100644 index 00000000..eee39f7d Binary files /dev/null and b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.vi.png differ diff --git a/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.id.png b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.id.png new file mode 100644 index 00000000..5a0fb117 Binary files /dev/null and b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.id.png differ diff --git a/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.ms.png b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.ms.png new file mode 100644 index 00000000..5a0fb117 Binary files /dev/null and b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.ms.png differ diff --git a/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.tl.png b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.tl.png new file mode 100644 index 00000000..5a0fb117 Binary files /dev/null and b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.tl.png differ diff --git a/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.vi.png b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.vi.png new file mode 100644 index 00000000..5a0fb117 Binary files /dev/null and b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.vi.png differ diff --git a/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.id.png b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.id.png new file mode 100644 index 00000000..27ddbfee Binary files /dev/null and b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.id.png differ diff --git a/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.ms.png b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.ms.png new file mode 100644 index 00000000..27ddbfee Binary files /dev/null and b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.ms.png differ diff --git a/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.tl.png b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.tl.png new file mode 100644 index 00000000..27ddbfee Binary files /dev/null and b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.tl.png differ diff --git a/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.vi.png b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.vi.png new file mode 100644 index 00000000..27ddbfee Binary files /dev/null and b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.vi.png differ diff --git a/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.id.png b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.id.png new file mode 100644 index 00000000..ee07bd10 Binary files /dev/null and b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.id.png differ diff --git a/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.ms.png b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.ms.png new file mode 100644 index 00000000..ee07bd10 Binary files /dev/null and b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.ms.png differ diff --git a/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.tl.png b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.tl.png new file mode 100644 index 00000000..ee07bd10 Binary files /dev/null and b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.tl.png differ diff --git a/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.vi.png b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.vi.png new file mode 100644 index 00000000..ee07bd10 Binary files /dev/null and b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.vi.png differ diff --git a/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.id.png b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.id.png new file mode 100644 index 00000000..37a2464a Binary files /dev/null and b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.id.png differ diff --git a/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.ms.png b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.ms.png new file mode 100644 index 00000000..37a2464a Binary files /dev/null and b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.ms.png differ diff --git a/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.tl.png b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.tl.png new file mode 100644 index 00000000..37a2464a Binary files /dev/null and b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.tl.png differ diff --git a/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.vi.png b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.vi.png new file mode 100644 index 00000000..37a2464a Binary files /dev/null and b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.vi.png differ diff --git a/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.id.png b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.id.png new file mode 100644 index 00000000..d852153c Binary files /dev/null and b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.id.png differ diff --git a/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.ms.png b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.ms.png new file mode 100644 index 00000000..d852153c Binary files /dev/null and b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.ms.png differ diff --git a/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.tl.png b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.tl.png new file mode 100644 index 00000000..d852153c Binary files /dev/null and b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.tl.png differ diff --git a/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.vi.png b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.vi.png new file mode 100644 index 00000000..d852153c Binary files /dev/null and b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.vi.png differ diff --git a/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.id.png b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.id.png new file mode 100644 index 00000000..a457ac8d Binary files /dev/null and b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.id.png differ diff --git a/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.ms.png b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.ms.png new file mode 100644 index 00000000..a457ac8d Binary files /dev/null and b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.ms.png differ diff --git a/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.tl.png b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.tl.png new file mode 100644 index 00000000..a457ac8d Binary files /dev/null and b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.tl.png differ diff --git a/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.vi.png b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.vi.png new file mode 100644 index 00000000..a457ac8d Binary files /dev/null and b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.vi.png differ diff --git a/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.id.png b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.id.png new file mode 100644 index 00000000..3eccd326 Binary files /dev/null and b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.id.png differ diff --git a/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.ms.png b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.ms.png new file mode 100644 index 00000000..3eccd326 Binary files /dev/null and b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.ms.png differ diff --git a/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.tl.png b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.tl.png new file mode 100644 index 00000000..3eccd326 Binary files /dev/null and b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.tl.png differ diff --git a/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.vi.png b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.vi.png new file mode 100644 index 00000000..3eccd326 Binary files /dev/null and b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.vi.png differ diff --git a/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.id.png b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.id.png new file mode 100644 index 00000000..49083372 Binary files /dev/null and b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.id.png differ diff --git a/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.ms.png b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.ms.png new file mode 100644 index 00000000..49083372 Binary files /dev/null and b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.ms.png differ diff --git a/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.tl.png b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.tl.png new file mode 100644 index 00000000..49083372 Binary files /dev/null and b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.tl.png differ diff --git a/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.vi.png b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.vi.png new file mode 100644 index 00000000..49083372 Binary files /dev/null and b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.vi.png differ diff --git a/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.id.png b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.id.png new file mode 100644 index 00000000..1b4a94e5 Binary files /dev/null and b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.id.png differ diff --git a/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.ms.png b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.ms.png new file mode 100644 index 00000000..1b4a94e5 Binary files /dev/null and b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.ms.png differ diff --git a/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.tl.png b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.tl.png new file mode 100644 index 00000000..1b4a94e5 Binary files /dev/null and b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.tl.png differ diff --git a/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.vi.png b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.vi.png new file mode 100644 index 00000000..1b4a94e5 Binary files /dev/null and b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.vi.png differ diff --git a/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.id.png b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.id.png new file mode 100644 index 00000000..8589e88f Binary files /dev/null and b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.id.png differ diff --git a/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.ms.png b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.ms.png new file mode 100644 index 00000000..8589e88f Binary files /dev/null and b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.ms.png differ diff --git a/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.tl.png b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.tl.png new file mode 100644 index 00000000..8589e88f Binary files /dev/null and b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.tl.png differ diff --git a/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.vi.png b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.vi.png new file mode 100644 index 00000000..8589e88f Binary files /dev/null and b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.vi.png differ diff --git a/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.id.png b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.id.png new file mode 100644 index 00000000..e1246f56 Binary files /dev/null and b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.id.png differ diff --git a/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.ms.png b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.ms.png new file mode 100644 index 00000000..e1246f56 Binary files /dev/null and b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.ms.png differ diff --git a/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.tl.png b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.tl.png new file mode 100644 index 00000000..e1246f56 Binary files /dev/null and b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.tl.png differ diff --git a/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.vi.png b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.vi.png new file mode 100644 index 00000000..e1246f56 Binary files /dev/null and b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.vi.png differ diff --git a/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.id.png b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.id.png new file mode 100644 index 00000000..db66a52b Binary files /dev/null and b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.id.png differ diff --git a/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.ms.png b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.ms.png new file mode 100644 index 00000000..db66a52b Binary files /dev/null and b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.ms.png differ diff --git a/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.tl.png b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.tl.png new file mode 100644 index 00000000..db66a52b Binary files /dev/null and b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.tl.png differ diff --git a/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.vi.png b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.vi.png new file mode 100644 index 00000000..db66a52b Binary files /dev/null and b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.vi.png differ diff --git a/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.id.png b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.id.png new file mode 100644 index 00000000..66c76c2f Binary files /dev/null and b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.id.png differ diff --git a/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.ms.png b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.ms.png new file mode 100644 index 00000000..66c76c2f Binary files /dev/null and b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.ms.png differ diff --git a/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.tl.png b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.tl.png new file mode 100644 index 00000000..66c76c2f Binary files /dev/null and b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.tl.png differ diff --git a/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.vi.png b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.vi.png new file mode 100644 index 00000000..66c76c2f Binary files /dev/null and b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.vi.png differ diff --git a/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.id.png b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.id.png new file mode 100644 index 00000000..450b824c Binary files /dev/null and b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.id.png differ diff --git a/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.ms.png b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.ms.png new file mode 100644 index 00000000..450b824c Binary files /dev/null and b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.ms.png differ diff --git a/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.tl.png b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.tl.png new file mode 100644 index 00000000..450b824c Binary files /dev/null and b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.tl.png differ diff --git a/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.vi.png b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.vi.png new file mode 100644 index 00000000..450b824c Binary files /dev/null and b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.vi.png differ diff --git a/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.id.png b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.id.png new file mode 100644 index 00000000..615bc7a9 Binary files /dev/null and b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.id.png differ diff --git a/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.ms.png b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.ms.png new file mode 100644 index 00000000..615bc7a9 Binary files /dev/null and b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.ms.png differ diff --git a/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.tl.png b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.tl.png new file mode 100644 index 00000000..615bc7a9 Binary files /dev/null and b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.tl.png differ diff --git a/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.vi.png b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.vi.png new file mode 100644 index 00000000..615bc7a9 Binary files /dev/null and b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.vi.png differ diff --git a/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.id.png b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.id.png new file mode 100644 index 00000000..3c9e2930 Binary files /dev/null and b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.id.png differ diff --git a/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.ms.png b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.ms.png new file mode 100644 index 00000000..3c9e2930 Binary files /dev/null and b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.ms.png differ diff --git a/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.tl.png b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.tl.png new file mode 100644 index 00000000..3c9e2930 Binary files /dev/null and b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.tl.png differ diff --git a/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.vi.png b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.vi.png new file mode 100644 index 00000000..3c9e2930 Binary files /dev/null and b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.vi.png differ diff --git a/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.id.png b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.id.png new file mode 100644 index 00000000..e4bb0186 Binary files /dev/null and b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.id.png differ diff --git a/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.ms.png b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.ms.png new file mode 100644 index 00000000..e4bb0186 Binary files /dev/null and b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.ms.png differ diff --git a/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.tl.png b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.tl.png new file mode 100644 index 00000000..e4bb0186 Binary files /dev/null and b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.tl.png differ diff --git a/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.vi.png b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.vi.png new file mode 100644 index 00000000..e4bb0186 Binary files /dev/null and b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.vi.png differ diff --git a/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.id.png b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.id.png new file mode 100644 index 00000000..91e4cba6 Binary files /dev/null and b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.id.png differ diff --git a/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.ms.png b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.ms.png new file mode 100644 index 00000000..91e4cba6 Binary files /dev/null and b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.ms.png differ diff --git a/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.tl.png b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.tl.png new file mode 100644 index 00000000..91e4cba6 Binary files /dev/null and b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.tl.png differ diff --git a/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.vi.png b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.vi.png new file mode 100644 index 00000000..91e4cba6 Binary files /dev/null and b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.vi.png differ diff --git a/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.id.png b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.id.png new file mode 100644 index 00000000..91230d0c Binary files /dev/null and b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.id.png differ diff --git a/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.ms.png b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.ms.png new file mode 100644 index 00000000..91230d0c Binary files /dev/null and b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.ms.png differ diff --git a/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.tl.png b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.tl.png new file mode 100644 index 00000000..91230d0c Binary files /dev/null and b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.tl.png differ diff --git a/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.vi.png b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.vi.png new file mode 100644 index 00000000..91230d0c Binary files /dev/null and b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.vi.png differ diff --git a/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.id.png b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.id.png new file mode 100644 index 00000000..128cd4a9 Binary files /dev/null and b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.id.png differ diff --git a/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.ms.png b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.ms.png new file mode 100644 index 00000000..128cd4a9 Binary files /dev/null and b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.ms.png differ diff --git a/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.tl.png b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.tl.png new file mode 100644 index 00000000..128cd4a9 Binary files /dev/null and b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.tl.png differ diff --git a/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.vi.png b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.vi.png new file mode 100644 index 00000000..128cd4a9 Binary files /dev/null and b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.vi.png differ diff --git a/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.id.png b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.id.png new file mode 100644 index 00000000..8d62d827 Binary files /dev/null and b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.id.png differ diff --git a/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.ms.png b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.ms.png new file mode 100644 index 00000000..8d62d827 Binary files /dev/null and b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.ms.png differ diff --git a/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.tl.png b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.tl.png new file mode 100644 index 00000000..8d62d827 Binary files /dev/null and b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.tl.png differ diff --git a/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.vi.png b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.vi.png new file mode 100644 index 00000000..8d62d827 Binary files /dev/null and b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.vi.png differ diff --git a/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.id.png b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.id.png new file mode 100644 index 00000000..a84ab661 Binary files /dev/null and b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.id.png differ diff --git a/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.ms.png b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.ms.png new file mode 100644 index 00000000..a84ab661 Binary files /dev/null and b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.ms.png differ diff --git a/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.tl.png b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.tl.png new file mode 100644 index 00000000..a84ab661 Binary files /dev/null and b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.tl.png differ diff --git a/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.vi.png b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.vi.png new file mode 100644 index 00000000..a84ab661 Binary files /dev/null and b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.vi.png differ diff --git a/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.id.png b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.id.png new file mode 100644 index 00000000..4c88d3d3 Binary files /dev/null and b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.id.png differ diff --git a/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.ms.png b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.ms.png new file mode 100644 index 00000000..4c88d3d3 Binary files /dev/null and b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.ms.png differ diff --git a/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.tl.png b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.tl.png new file mode 100644 index 00000000..4c88d3d3 Binary files /dev/null and b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.tl.png differ diff --git a/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.vi.png b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.vi.png new file mode 100644 index 00000000..4c88d3d3 Binary files /dev/null and b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.vi.png differ diff --git a/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.id.png b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.id.png new file mode 100644 index 00000000..bc1895b8 Binary files /dev/null and b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.id.png differ diff --git a/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.ms.png b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.ms.png new file mode 100644 index 00000000..bc1895b8 Binary files /dev/null and b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.ms.png differ diff --git a/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.tl.png b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.tl.png new file mode 100644 index 00000000..bc1895b8 Binary files /dev/null and b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.tl.png differ diff --git a/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.vi.png b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.vi.png new file mode 100644 index 00000000..bc1895b8 Binary files /dev/null and b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.vi.png differ diff --git a/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.id.png b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.id.png new file mode 100644 index 00000000..d8ff3180 Binary files /dev/null and b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.id.png differ diff --git a/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.ms.png b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.ms.png new file mode 100644 index 00000000..d8ff3180 Binary files /dev/null and b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.ms.png differ diff --git a/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.tl.png b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.tl.png new file mode 100644 index 00000000..d8ff3180 Binary files /dev/null and b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.tl.png differ diff --git a/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.vi.png b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.vi.png new file mode 100644 index 00000000..d8ff3180 Binary files /dev/null and b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.vi.png differ diff --git a/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.id.png b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.id.png new file mode 100644 index 00000000..06b86a65 Binary files /dev/null and b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.id.png differ diff --git a/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.ms.png b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.ms.png new file mode 100644 index 00000000..06b86a65 Binary files /dev/null and b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.ms.png differ diff --git a/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.tl.png b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.tl.png new file mode 100644 index 00000000..06b86a65 Binary files /dev/null and b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.tl.png differ diff --git a/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.vi.png b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.vi.png new file mode 100644 index 00000000..06b86a65 Binary files /dev/null and b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.vi.png differ diff --git a/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.id.png b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.id.png new file mode 100644 index 00000000..ac7aa47a Binary files /dev/null and b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.id.png differ diff --git a/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.ms.png b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.ms.png new file mode 100644 index 00000000..ac7aa47a Binary files /dev/null and b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.ms.png differ diff --git a/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.tl.png b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.tl.png new file mode 100644 index 00000000..ac7aa47a Binary files /dev/null and b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.tl.png differ diff --git a/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.vi.png b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.vi.png new file mode 100644 index 00000000..ac7aa47a Binary files /dev/null and b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.vi.png differ diff --git a/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.id.png b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.id.png new file mode 100644 index 00000000..20480a22 Binary files /dev/null and b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.id.png differ diff --git a/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.ms.png b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.ms.png new file mode 100644 index 00000000..20480a22 Binary files /dev/null and b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.ms.png differ diff --git a/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.tl.png b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.tl.png new file mode 100644 index 00000000..20480a22 Binary files /dev/null and b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.tl.png differ diff --git a/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.vi.png b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.vi.png new file mode 100644 index 00000000..20480a22 Binary files /dev/null and b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.vi.png differ diff --git a/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.id.png b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.id.png new file mode 100644 index 00000000..9d90f435 Binary files /dev/null and b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.id.png differ diff --git a/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.ms.png b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.ms.png new file mode 100644 index 00000000..9d90f435 Binary files /dev/null and b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.ms.png differ diff --git a/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.tl.png b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.tl.png new file mode 100644 index 00000000..9d90f435 Binary files /dev/null and b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.tl.png differ diff --git a/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.vi.png b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.vi.png new file mode 100644 index 00000000..9d90f435 Binary files /dev/null and b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.vi.png differ diff --git a/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.id.png b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.id.png new file mode 100644 index 00000000..27b0ea2c Binary files /dev/null and b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.id.png differ diff --git a/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.ms.png b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.ms.png new file mode 100644 index 00000000..27b0ea2c Binary files /dev/null and b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.ms.png differ diff --git a/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.tl.png b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.tl.png new file mode 100644 index 00000000..27b0ea2c Binary files /dev/null and b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.tl.png differ diff --git a/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.vi.png b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.vi.png new file mode 100644 index 00000000..27b0ea2c Binary files /dev/null and b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.vi.png differ diff --git a/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.id.png b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.id.png new file mode 100644 index 00000000..3526a6d0 Binary files /dev/null and b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.id.png differ diff --git a/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.ms.png b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.ms.png new file mode 100644 index 00000000..3526a6d0 Binary files /dev/null and b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.ms.png differ diff --git a/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.tl.png b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.tl.png new file mode 100644 index 00000000..3526a6d0 Binary files /dev/null and b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.tl.png differ diff --git a/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.vi.png b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.vi.png new file mode 100644 index 00000000..3526a6d0 Binary files /dev/null and b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.vi.png differ diff --git a/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.id.png b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.id.png new file mode 100644 index 00000000..855d442e Binary files /dev/null and b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.id.png differ diff --git a/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.ms.png b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.ms.png new file mode 100644 index 00000000..855d442e Binary files /dev/null and b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.ms.png differ diff --git a/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.tl.png b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.tl.png new file mode 100644 index 00000000..855d442e Binary files /dev/null and b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.tl.png differ diff --git a/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.vi.png b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.vi.png new file mode 100644 index 00000000..855d442e Binary files /dev/null and b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.vi.png differ diff --git a/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.id.png b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.id.png new file mode 100644 index 00000000..aed3d813 Binary files /dev/null and b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.id.png differ diff --git a/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.ms.png b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.ms.png new file mode 100644 index 00000000..aed3d813 Binary files /dev/null and b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.ms.png differ diff --git a/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.tl.png b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.tl.png new file mode 100644 index 00000000..aed3d813 Binary files /dev/null and b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.tl.png differ diff --git a/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.vi.png b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.vi.png new file mode 100644 index 00000000..aed3d813 Binary files /dev/null and b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.vi.png differ diff --git a/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.id.png b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.id.png new file mode 100644 index 00000000..9bfca6c2 Binary files /dev/null and b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.id.png differ diff --git a/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.ms.png b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.ms.png new file mode 100644 index 00000000..9bfca6c2 Binary files /dev/null and b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.ms.png differ diff --git a/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.tl.png b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.tl.png new file mode 100644 index 00000000..9bfca6c2 Binary files /dev/null and b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.tl.png differ diff --git a/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.vi.png b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.vi.png new file mode 100644 index 00000000..9bfca6c2 Binary files /dev/null and b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.vi.png differ diff --git a/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.id.png b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.id.png new file mode 100644 index 00000000..0490e302 Binary files /dev/null and b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.id.png differ diff --git a/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.ms.png b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.ms.png new file mode 100644 index 00000000..0490e302 Binary files /dev/null and b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.ms.png differ diff --git a/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.tl.png b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.tl.png new file mode 100644 index 00000000..0490e302 Binary files /dev/null and b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.tl.png differ diff --git a/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.vi.png b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.vi.png new file mode 100644 index 00000000..0490e302 Binary files /dev/null and b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.vi.png differ diff --git a/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.id.png b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.id.png new file mode 100644 index 00000000..676e2378 Binary files /dev/null and b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.id.png differ diff --git a/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.ms.png b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.ms.png new file mode 100644 index 00000000..676e2378 Binary files /dev/null and b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.ms.png differ diff --git a/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.tl.png b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.tl.png new file mode 100644 index 00000000..676e2378 Binary files /dev/null and b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.tl.png differ diff --git a/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.vi.png b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.vi.png new file mode 100644 index 00000000..676e2378 Binary files /dev/null and b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.vi.png differ diff --git a/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.id.png b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.id.png new file mode 100644 index 00000000..280e18c3 Binary files /dev/null and b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.id.png differ diff --git a/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.ms.png b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.ms.png new file mode 100644 index 00000000..280e18c3 Binary files /dev/null and b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.ms.png differ diff --git a/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.tl.png b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.tl.png new file mode 100644 index 00000000..280e18c3 Binary files /dev/null and b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.tl.png differ diff --git a/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.vi.png b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.vi.png new file mode 100644 index 00000000..280e18c3 Binary files /dev/null and b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.vi.png differ diff --git a/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.id.png b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.id.png new file mode 100644 index 00000000..bb70a905 Binary files /dev/null and b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.id.png differ diff --git a/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.ms.png b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.ms.png new file mode 100644 index 00000000..bb70a905 Binary files /dev/null and b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.ms.png differ diff --git a/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.tl.png b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.tl.png new file mode 100644 index 00000000..bb70a905 Binary files /dev/null and b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.tl.png differ diff --git a/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.vi.png b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.vi.png new file mode 100644 index 00000000..bb70a905 Binary files /dev/null and b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.vi.png differ diff --git a/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.id.png b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.id.png new file mode 100644 index 00000000..c0860d6e Binary files /dev/null and b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.id.png differ diff --git a/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.ms.png b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.ms.png new file mode 100644 index 00000000..c0860d6e Binary files /dev/null and b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.ms.png differ diff --git a/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.tl.png b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.tl.png new file mode 100644 index 00000000..c0860d6e Binary files /dev/null and b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.tl.png differ diff --git a/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.vi.png b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.vi.png new file mode 100644 index 00000000..c0860d6e Binary files /dev/null and b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.vi.png differ diff --git a/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.id.png b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.id.png new file mode 100644 index 00000000..9a34d708 Binary files /dev/null and b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.id.png differ diff --git a/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.ms.png b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.ms.png new file mode 100644 index 00000000..9a34d708 Binary files /dev/null and b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.ms.png differ diff --git a/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.tl.png b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.tl.png new file mode 100644 index 00000000..9a34d708 Binary files /dev/null and b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.tl.png differ diff --git a/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.vi.png b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.vi.png new file mode 100644 index 00000000..9a34d708 Binary files /dev/null and b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.vi.png differ diff --git a/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.id.png b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.id.png new file mode 100644 index 00000000..2c683d8b Binary files /dev/null and b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.id.png differ diff --git a/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.ms.png b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.ms.png new file mode 100644 index 00000000..2c683d8b Binary files /dev/null and b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.ms.png differ diff --git a/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.tl.png b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.tl.png new file mode 100644 index 00000000..2c683d8b Binary files /dev/null and b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.tl.png differ diff --git a/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.vi.png b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.vi.png new file mode 100644 index 00000000..2c683d8b Binary files /dev/null and b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.vi.png differ diff --git a/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.id.png b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.id.png new file mode 100644 index 00000000..1ba4c5b0 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.id.png differ diff --git a/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.ms.png b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.ms.png new file mode 100644 index 00000000..1ba4c5b0 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.ms.png differ diff --git a/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.tl.png b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.tl.png new file mode 100644 index 00000000..1ba4c5b0 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.tl.png differ diff --git a/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.vi.png b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.vi.png new file mode 100644 index 00000000..1ba4c5b0 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.vi.png differ diff --git a/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.id.png b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.id.png new file mode 100644 index 00000000..93aa3743 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.id.png differ diff --git a/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.ms.png b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.ms.png new file mode 100644 index 00000000..93aa3743 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.ms.png differ diff --git a/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.tl.png b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.tl.png new file mode 100644 index 00000000..93aa3743 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.tl.png differ diff --git a/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.vi.png b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.vi.png new file mode 100644 index 00000000..93aa3743 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.vi.png differ diff --git a/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.id.png b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.id.png new file mode 100644 index 00000000..3089e5e1 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.id.png differ diff --git a/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.ms.png b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.ms.png new file mode 100644 index 00000000..3089e5e1 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.ms.png differ diff --git a/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.tl.png b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.tl.png new file mode 100644 index 00000000..3089e5e1 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.tl.png differ diff --git a/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.vi.png b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.vi.png new file mode 100644 index 00000000..3089e5e1 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.vi.png differ diff --git a/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.id.png b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.id.png new file mode 100644 index 00000000..53468420 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.id.png differ diff --git a/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.ms.png b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.ms.png new file mode 100644 index 00000000..53468420 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.ms.png differ diff --git a/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.tl.png b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.tl.png new file mode 100644 index 00000000..53468420 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.tl.png differ diff --git a/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.vi.png b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.vi.png new file mode 100644 index 00000000..53468420 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.vi.png differ diff --git a/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.id.png b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.id.png new file mode 100644 index 00000000..003dc174 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.id.png differ diff --git a/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.ms.png b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.ms.png new file mode 100644 index 00000000..003dc174 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.ms.png differ diff --git a/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.tl.png b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.tl.png new file mode 100644 index 00000000..003dc174 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.tl.png differ diff --git a/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.vi.png b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.vi.png new file mode 100644 index 00000000..003dc174 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.vi.png differ diff --git a/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.id.png b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.id.png new file mode 100644 index 00000000..3c0d2f87 Binary files /dev/null and b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.id.png differ diff --git a/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.ms.png b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.ms.png new file mode 100644 index 00000000..3c0d2f87 Binary files /dev/null and b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.ms.png differ diff --git a/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.tl.png b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.tl.png new file mode 100644 index 00000000..3c0d2f87 Binary files /dev/null and b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.tl.png differ diff --git a/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.vi.png b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.vi.png new file mode 100644 index 00000000..3c0d2f87 Binary files /dev/null and b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.vi.png differ diff --git a/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.id.png b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.id.png new file mode 100644 index 00000000..56f285f2 Binary files /dev/null and b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.id.png differ diff --git a/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.ms.png b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.ms.png new file mode 100644 index 00000000..56f285f2 Binary files /dev/null and b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.ms.png differ diff --git a/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.tl.png b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.tl.png new file mode 100644 index 00000000..56f285f2 Binary files /dev/null and b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.tl.png differ diff --git a/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.vi.png b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.vi.png new file mode 100644 index 00000000..56f285f2 Binary files /dev/null and b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.vi.png differ diff --git a/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.id.png b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.id.png new file mode 100644 index 00000000..ec8bbe2f Binary files /dev/null and b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.id.png differ diff --git a/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.ms.png b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.ms.png new file mode 100644 index 00000000..ec8bbe2f Binary files /dev/null and b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.ms.png differ diff --git a/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.tl.png b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.tl.png new file mode 100644 index 00000000..ec8bbe2f Binary files /dev/null and b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.tl.png differ diff --git a/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.vi.png b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.vi.png new file mode 100644 index 00000000..ec8bbe2f Binary files /dev/null and b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.vi.png differ diff --git a/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.id.png b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.id.png new file mode 100644 index 00000000..bbaae894 Binary files /dev/null and b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.id.png differ diff --git a/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.ms.png b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.ms.png new file mode 100644 index 00000000..bbaae894 Binary files /dev/null and b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.ms.png differ diff --git a/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.tl.png b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.tl.png new file mode 100644 index 00000000..bbaae894 Binary files /dev/null and b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.tl.png differ diff --git a/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.vi.png b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.vi.png new file mode 100644 index 00000000..bbaae894 Binary files /dev/null and b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.vi.png differ diff --git a/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.id.png b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.id.png new file mode 100644 index 00000000..ef71f6da Binary files /dev/null and b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.id.png differ diff --git a/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.ms.png b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.ms.png new file mode 100644 index 00000000..ef71f6da Binary files /dev/null and b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.ms.png differ diff --git a/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.tl.png b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.tl.png new file mode 100644 index 00000000..ef71f6da Binary files /dev/null and b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.tl.png differ diff --git a/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.vi.png b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.vi.png new file mode 100644 index 00000000..ef71f6da Binary files /dev/null and b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.vi.png differ diff --git a/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.id.png b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.id.png new file mode 100644 index 00000000..4e9390eb Binary files /dev/null and b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.id.png differ diff --git a/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.ms.png b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.ms.png new file mode 100644 index 00000000..4e9390eb Binary files /dev/null and b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.ms.png differ diff --git a/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.tl.png b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.tl.png new file mode 100644 index 00000000..4e9390eb Binary files /dev/null and b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.tl.png differ diff --git a/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.vi.png b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.vi.png new file mode 100644 index 00000000..4e9390eb Binary files /dev/null and b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.vi.png differ diff --git a/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.id.png b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.id.png new file mode 100644 index 00000000..16d7af80 Binary files /dev/null and b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.id.png differ diff --git a/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.ms.png b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.ms.png new file mode 100644 index 00000000..16d7af80 Binary files /dev/null and b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.ms.png differ diff --git a/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.tl.png b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.tl.png new file mode 100644 index 00000000..16d7af80 Binary files /dev/null and b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.tl.png differ diff --git a/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.vi.png b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.vi.png new file mode 100644 index 00000000..16d7af80 Binary files /dev/null and b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.vi.png differ diff --git a/translations/id/1-getting-started/README.md b/translations/id/1-getting-started/README.md new file mode 100644 index 00000000..8bef3dcc --- /dev/null +++ b/translations/id/1-getting-started/README.md @@ -0,0 +1,30 @@ + +# Memulai dengan IoT + +Dalam bagian kurikulum ini, Anda akan diperkenalkan dengan Internet of Things, dan mempelajari konsep dasar termasuk membangun proyek IoT 'Hello World' pertama Anda yang terhubung ke cloud. Proyek ini adalah lampu malam yang menyala saat tingkat cahaya yang diukur oleh sensor menurun. + +![LED yang terhubung ke WIO menyala dan mati saat tingkat cahaya berubah](../../../images/wio-running-assignment-1-1.gif) + +## Topik + +1. [Pengenalan IoT](lessons/1-introduction-to-iot/README.md) +1. [Pendalaman tentang IoT](lessons/2-deeper-dive/README.md) +1. [Berinteraksi dengan dunia fisik menggunakan sensor dan aktuator](lessons/3-sensors-and-actuators/README.md) +1. [Menghubungkan perangkat Anda ke Internet](lessons/4-connect-internet/README.md) + +## Kredit + +Semua pelajaran ditulis dengan ♥️ oleh [Jim Bennett](https://GitHub.com/JimBobBennett) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/1-introduction-to-iot/README.md b/translations/id/1-getting-started/lessons/1-introduction-to-iot/README.md new file mode 100644 index 00000000..2eba0eee --- /dev/null +++ b/translations/id/1-getting-started/lessons/1-introduction-to-iot/README.md @@ -0,0 +1,242 @@ + +# Pengantar IoT + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +Pelajaran ini diajarkan sebagai bagian dari [seri Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) dari [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Pelajaran ini disampaikan dalam 2 video - pelajaran berdurasi 1 jam, dan sesi tanya jawab berdurasi 1 jam yang membahas lebih dalam bagian-bagian pelajaran serta menjawab pertanyaan. + +[![Pelajaran 1: Pengantar IoT](https://img.youtube.com/vi/bVFfcYh6UBw/0.jpg)](https://youtu.be/bVFfcYh6UBw) + +[![Pelajaran 1: Pengantar IoT - Sesi tanya jawab](https://img.youtube.com/vi/YI772q5v3yI/0.jpg)](https://youtu.be/YI772q5v3yI) + +> 🎥 Klik gambar di atas untuk menonton video + +## Kuis sebelum pelajaran + +[Kuis sebelum pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1) + +## Pengantar + +Pelajaran ini mencakup beberapa topik pengantar tentang Internet of Things, dan membantu Anda memulai dengan menyiapkan perangkat keras Anda. + +Dalam pelajaran ini kita akan membahas: + +* [Apa itu 'Internet of Things'?](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Perangkat IoT](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Menyiapkan perangkat Anda](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Aplikasi IoT](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Contoh perangkat IoT di sekitar Anda](../../../../../1-getting-started/lessons/1-introduction-to-iot) + +## Apa itu 'Internet of Things'? + +Istilah 'Internet of Things' pertama kali diperkenalkan oleh [Kevin Ashton](https://wikipedia.org/wiki/Kevin_Ashton) pada tahun 1999, untuk merujuk pada penghubungan Internet dengan dunia fisik melalui sensor. Sejak itu, istilah ini digunakan untuk menggambarkan perangkat apa pun yang berinteraksi dengan dunia fisik di sekitarnya, baik dengan mengumpulkan data dari sensor, atau memberikan interaksi dunia nyata melalui aktuator (perangkat yang melakukan sesuatu seperti menyalakan saklar atau menyalakan LED), yang biasanya terhubung ke perangkat lain atau Internet. + +> **Sensor** mengumpulkan informasi dari dunia, seperti mengukur kecepatan, suhu, atau lokasi. +> +> **Aktuator** mengubah sinyal listrik menjadi interaksi dunia nyata seperti memicu saklar, menyalakan lampu, menghasilkan suara, atau mengirim sinyal kontrol ke perangkat keras lain, misalnya untuk menyalakan soket listrik. + +IoT sebagai bidang teknologi lebih dari sekadar perangkat - ini mencakup layanan berbasis cloud yang dapat memproses data sensor, atau mengirim permintaan ke aktuator yang terhubung ke perangkat IoT. Ini juga mencakup perangkat yang tidak memiliki atau tidak memerlukan konektivitas Internet, yang sering disebut sebagai perangkat edge. Perangkat ini dapat memproses dan merespons data sensor sendiri, biasanya menggunakan model AI yang dilatih di cloud. + +IoT adalah bidang teknologi yang berkembang pesat. Diperkirakan pada akhir tahun 2020, ada 30 miliar perangkat IoT yang telah diterapkan dan terhubung ke Internet. Melihat ke masa depan, diperkirakan pada tahun 2025, perangkat IoT akan mengumpulkan hampir 80 zettabyte data atau 80 triliun gigabyte. Itu adalah jumlah data yang sangat besar! + +![Grafik yang menunjukkan perangkat IoT aktif dari waktu ke waktu, dengan tren meningkat dari kurang dari 5 miliar pada tahun 2015 menjadi lebih dari 30 miliar pada tahun 2025](../../../../../images/connected-iot-devices.svg) + +✅ Lakukan sedikit penelitian: Berapa banyak data yang dihasilkan oleh perangkat IoT yang benar-benar digunakan, dan berapa banyak yang terbuang? Mengapa begitu banyak data diabaikan? + +Data ini adalah kunci keberhasilan IoT. Untuk menjadi pengembang IoT yang sukses, Anda perlu memahami data yang perlu dikumpulkan, cara mengumpulkannya, cara membuat keputusan berdasarkan data tersebut, dan cara menggunakan keputusan tersebut untuk berinteraksi dengan dunia fisik jika diperlukan. + +## Perangkat IoT + +Huruf **T** dalam IoT adalah singkatan dari **Things** - perangkat yang berinteraksi dengan dunia fisik di sekitarnya baik dengan mengumpulkan data dari sensor atau memberikan interaksi dunia nyata melalui aktuator. + +Perangkat untuk produksi atau penggunaan komersial, seperti pelacak kebugaran konsumen, atau pengontrol mesin industri, biasanya dibuat khusus. Mereka menggunakan papan sirkuit khusus, bahkan mungkin prosesor khusus, yang dirancang untuk memenuhi kebutuhan tugas tertentu, apakah itu cukup kecil untuk dipasang di pergelangan tangan, atau cukup tangguh untuk bekerja di lingkungan pabrik dengan suhu tinggi, tekanan tinggi, atau getaran tinggi. + +Sebagai pengembang yang sedang belajar tentang IoT atau membuat prototipe perangkat, Anda perlu memulai dengan kit pengembang. Ini adalah perangkat IoT serbaguna yang dirancang untuk digunakan oleh pengembang, sering kali dengan fitur yang tidak akan ada pada perangkat produksi, seperti serangkaian pin eksternal untuk menghubungkan sensor atau aktuator, perangkat keras untuk mendukung debugging, atau sumber daya tambahan yang akan menambah biaya yang tidak perlu saat melakukan produksi massal. + +Kit pengembang ini biasanya terbagi dalam dua kategori - mikrokontroler dan komputer papan tunggal. Keduanya akan diperkenalkan di sini, dan kita akan membahasnya lebih detail di pelajaran berikutnya. + +> 💁 Ponsel Anda juga dapat dianggap sebagai perangkat IoT serbaguna, dengan sensor dan aktuator bawaan, dengan berbagai aplikasi yang menggunakan sensor dan aktuator tersebut dengan cara yang berbeda menggunakan layanan cloud yang berbeda. Anda bahkan dapat menemukan beberapa tutorial IoT yang menggunakan aplikasi ponsel sebagai perangkat IoT. + +### Mikrokontroler + +Mikrokontroler (juga disebut sebagai MCU, singkatan dari microcontroller unit) adalah komputer kecil yang terdiri dari: + +🧠 Satu atau lebih unit pemrosesan pusat (CPU) - 'otak' dari mikrokontroler yang menjalankan program Anda + +💾 Memori (RAM dan memori program) - tempat program, data, dan variabel Anda disimpan + +🔌 Koneksi input/output (I/O) yang dapat diprogram - untuk berkomunikasi dengan perangkat eksternal (perangkat yang terhubung) seperti sensor dan aktuator + +Mikrokontroler biasanya merupakan perangkat komputasi berbiaya rendah, dengan harga rata-rata untuk yang digunakan dalam perangkat keras khusus turun hingga sekitar US$0,50, dan beberapa perangkat semurah US$0,03. Kit pengembang dapat dimulai dari harga US$4, dengan biaya meningkat seiring penambahan fitur. [Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html), sebuah kit pengembang mikrokontroler dari [Seeed studios](https://www.seeedstudio.com) yang memiliki sensor, aktuator, WiFi, dan layar, harganya sekitar US$30. + +![Wio Terminal](../../../../../translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.id.png) + +> 💁 Saat mencari mikrokontroler di Internet, berhati-hatilah saat mencari istilah **MCU** karena ini akan menghasilkan banyak hasil tentang Marvel Cinematic Universe, bukan mikrokontroler. + +Mikrokontroler dirancang untuk diprogram untuk melakukan sejumlah tugas yang sangat spesifik, daripada menjadi komputer serbaguna seperti PC atau Mac. Kecuali untuk skenario yang sangat spesifik, Anda tidak dapat menghubungkan monitor, keyboard, dan mouse untuk menggunakannya untuk tugas-tugas umum. + +Kit pengembang mikrokontroler biasanya dilengkapi dengan sensor dan aktuator tambahan di papan. Sebagian besar papan akan memiliki satu atau lebih LED yang dapat Anda program, bersama dengan perangkat lain seperti colokan standar untuk menambahkan lebih banyak sensor atau aktuator menggunakan ekosistem berbagai produsen atau sensor bawaan (biasanya yang paling populer seperti sensor suhu). Beberapa mikrokontroler memiliki konektivitas nirkabel bawaan seperti Bluetooth atau WiFi atau memiliki mikrokontroler tambahan di papan untuk menambahkan konektivitas ini. + +> 💁 Mikrokontroler biasanya diprogram menggunakan C/C++. + +### Komputer papan tunggal + +Komputer papan tunggal adalah perangkat komputasi kecil yang memiliki semua elemen komputer lengkap yang terkandung dalam satu papan kecil. Perangkat ini memiliki spesifikasi yang mendekati PC atau Mac desktop atau laptop, menjalankan sistem operasi penuh, tetapi berukuran kecil, menggunakan daya lebih sedikit, dan jauh lebih murah. + +![Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.id.jpg) + +Raspberry Pi adalah salah satu komputer papan tunggal yang paling populer. + +Seperti mikrokontroler, komputer papan tunggal memiliki CPU, memori, dan pin input/output, tetapi mereka memiliki fitur tambahan seperti chip grafis untuk memungkinkan Anda menghubungkan monitor, output audio, dan port USB untuk menghubungkan keyboard, mouse, dan perangkat USB standar lainnya seperti webcam atau penyimpanan eksternal. Program disimpan di kartu SD atau hard drive bersama dengan sistem operasi, bukan chip memori yang terpasang di papan. + +> 🎓 Anda dapat menganggap komputer papan tunggal sebagai versi yang lebih kecil dan lebih murah dari PC atau Mac yang sedang Anda gunakan, dengan tambahan pin GPIO (general-purpose input/output) untuk berinteraksi dengan sensor dan aktuator. + +Komputer papan tunggal adalah komputer yang sepenuhnya berfitur lengkap, sehingga dapat diprogram dalam bahasa apa pun. Perangkat IoT biasanya diprogram menggunakan Python. + +### Pilihan perangkat keras untuk pelajaran berikutnya + +Semua pelajaran berikutnya mencakup tugas menggunakan perangkat IoT untuk berinteraksi dengan dunia fisik dan berkomunikasi dengan cloud. Setiap pelajaran mendukung 3 pilihan perangkat - Arduino (menggunakan Seeed Studios Wio Terminal), atau komputer papan tunggal, baik perangkat fisik (Raspberry Pi 4) atau komputer papan tunggal virtual yang berjalan di PC atau Mac Anda. + +Anda dapat membaca tentang perangkat keras yang diperlukan untuk menyelesaikan semua tugas di [panduan perangkat keras](../../../hardware.md). + +> 💁 Anda tidak perlu membeli perangkat keras IoT untuk menyelesaikan tugas, Anda dapat melakukan semuanya menggunakan komputer papan tunggal virtual. + +Pilihan perangkat keras yang Anda gunakan tergantung pada apa yang tersedia di rumah atau sekolah Anda, dan bahasa pemrograman yang Anda ketahui atau rencanakan untuk dipelajari. Kedua varian perangkat keras akan menggunakan ekosistem sensor yang sama, sehingga jika Anda memulai dengan satu jalur, Anda dapat beralih ke jalur lain tanpa harus mengganti sebagian besar kit. Komputer papan tunggal virtual akan setara dengan belajar menggunakan Raspberry Pi, dengan sebagian besar kode dapat ditransfer ke Pi jika Anda akhirnya mendapatkan perangkat dan sensor. + +### Kit pengembang Arduino + +Jika Anda tertarik untuk belajar pengembangan mikrokontroler, Anda dapat menyelesaikan tugas menggunakan perangkat Arduino. Anda akan membutuhkan pemahaman dasar tentang pemrograman C/C++, karena pelajaran hanya akan mengajarkan kode yang relevan dengan kerangka kerja Arduino, sensor dan aktuator yang digunakan, serta pustaka yang berinteraksi dengan cloud. + +Tugas akan menggunakan [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) dengan [ekstensi PlatformIO untuk pengembangan mikrokontroler](https://platformio.org). Anda juga dapat menggunakan Arduino IDE jika Anda sudah berpengalaman dengan alat ini, karena instruksi tidak akan disediakan. + +### Kit pengembang komputer papan tunggal + +Jika Anda tertarik untuk belajar pengembangan IoT menggunakan komputer papan tunggal, Anda dapat menyelesaikan tugas menggunakan Raspberry Pi, atau perangkat virtual yang berjalan di PC atau Mac Anda. + +Anda akan membutuhkan pemahaman dasar tentang pemrograman Python, karena pelajaran hanya akan mengajarkan kode yang relevan dengan sensor dan aktuator yang digunakan, serta pustaka yang berinteraksi dengan cloud. + +> 💁 Jika Anda ingin belajar pemrograman Python, lihat dua seri video berikut: +> +> * [Python untuk pemula](https://channel9.msdn.com/Series/Intro-to-Python-Development?WT.mc_id=academic-17441-jabenn) +> * [Lebih banyak Python untuk pemula](https://channel9.msdn.com/Series/More-Python-for-Beginners?WT.mc_id=academic-7372-jabenn) + +Tugas akan menggunakan [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn). + +Jika Anda menggunakan Raspberry Pi, Anda dapat menjalankan Pi Anda menggunakan versi desktop penuh dari Raspberry Pi OS, dan melakukan semua pengkodean langsung di Pi menggunakan [versi Raspberry Pi OS dari VS Code](https://code.visualstudio.com/docs/setup/raspberry-pi?WT.mc_id=academic-17441-jabenn), atau menjalankan Pi Anda sebagai perangkat tanpa kepala dan mengkode dari PC atau Mac Anda menggunakan VS Code dengan [ekstensi Remote SSH](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn) yang memungkinkan Anda terhubung ke Pi dan mengedit, debugging, serta menjalankan kode seolah-olah Anda sedang mengkode langsung di perangkat tersebut. + +Jika Anda menggunakan opsi perangkat virtual, Anda akan mengkode langsung di komputer Anda. Alih-alih mengakses sensor dan aktuator, Anda akan menggunakan alat untuk mensimulasikan perangkat keras ini dengan menyediakan nilai sensor yang dapat Anda tentukan, dan menampilkan hasil aktuator di layar. + +## Menyiapkan perangkat Anda + +Sebelum Anda dapat mulai memprogram perangkat IoT Anda, Anda perlu melakukan sedikit pengaturan. Ikuti instruksi yang relevan di bawah ini tergantung pada perangkat yang akan Anda gunakan. +💁 Jika Anda belum memiliki perangkat, lihat [panduan perangkat keras](../../../hardware.md) untuk membantu menentukan perangkat mana yang akan Anda gunakan, dan perangkat keras tambahan apa yang perlu Anda beli. Anda tidak perlu membeli perangkat keras, karena semua proyek dapat dijalankan pada perangkat keras virtual. +Instruksi ini mencakup tautan ke situs web pihak ketiga dari pembuat perangkat keras atau alat yang akan Anda gunakan. Tujuannya adalah untuk memastikan Anda selalu menggunakan instruksi terbaru untuk berbagai alat dan perangkat keras. + +Ikuti panduan yang relevan untuk mengatur perangkat Anda dan menyelesaikan proyek 'Hello World'. Ini akan menjadi langkah pertama dalam menciptakan lampu malam IoT selama 4 pelajaran dalam bagian pengenalan ini. + +* [Arduino - Wio Terminal](wio-terminal.md) +* [Single-board computer - Raspberry Pi](pi.md) +* [Single-board computer - Virtual device](virtual-device.md) + +✅ Anda akan menggunakan VS Code untuk Arduino dan komputer papan tunggal. Jika Anda belum pernah menggunakannya sebelumnya, baca lebih lanjut di [situs VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn). + +## Aplikasi IoT + +IoT mencakup berbagai macam kasus penggunaan, yang dapat dikelompokkan ke dalam beberapa kategori besar: + +* IoT Konsumen +* IoT Komersial +* IoT Industri +* IoT Infrastruktur + +✅ Lakukan sedikit riset: Untuk setiap area yang dijelaskan di bawah ini, temukan satu contoh konkret yang tidak disebutkan dalam teks. + +### IoT Konsumen + +IoT Konsumen mengacu pada perangkat IoT yang dibeli dan digunakan oleh konsumen di rumah. Beberapa perangkat ini sangat berguna, seperti speaker pintar, sistem pemanas pintar, dan penyedot debu robot. Namun, ada juga perangkat yang kegunaannya dipertanyakan, seperti keran yang dikontrol suara yang kemudian tidak bisa dimatikan karena kontrol suara tidak dapat mendengar Anda di tengah suara air yang mengalir. + +Perangkat IoT Konsumen memberdayakan orang untuk mencapai lebih banyak di lingkungan mereka, terutama 1 miliar orang yang memiliki disabilitas. Penyedot debu robot dapat memberikan lantai yang bersih bagi orang-orang dengan masalah mobilitas yang tidak dapat menyedot debu sendiri, oven yang dikontrol suara memungkinkan orang dengan keterbatasan penglihatan atau kontrol motorik untuk memanaskan oven mereka hanya dengan suara, monitor kesehatan memungkinkan pasien untuk memantau kondisi kronis mereka sendiri dengan pembaruan yang lebih teratur dan lebih rinci tentang kondisi mereka. Perangkat ini menjadi sangat umum sehingga bahkan anak-anak kecil menggunakannya sebagai bagian dari kehidupan sehari-hari mereka, misalnya, siswa yang melakukan sekolah virtual selama pandemi COVID menggunakan perangkat rumah pintar untuk mengatur timer untuk melacak pekerjaan sekolah mereka atau alarm untuk mengingatkan mereka tentang pertemuan kelas yang akan datang. + +✅ Perangkat IoT Konsumen apa yang Anda miliki di rumah atau yang Anda gunakan secara pribadi? + +### IoT Komersial + +IoT Komersial mencakup penggunaan IoT di tempat kerja. Di lingkungan kantor, mungkin ada sensor okupansi dan detektor gerakan untuk mengelola pencahayaan dan pemanas agar hanya menyala saat dibutuhkan, mengurangi biaya dan emisi karbon. Di pabrik, perangkat IoT dapat memantau bahaya keselamatan seperti pekerja yang tidak mengenakan helm atau kebisingan yang telah mencapai tingkat berbahaya. Di ritel, perangkat IoT dapat mengukur suhu penyimpanan dingin, memberi tahu pemilik toko jika lemari es atau freezer berada di luar rentang suhu yang diperlukan, atau mereka dapat memantau barang di rak untuk mengarahkan karyawan mengisi ulang produk yang telah terjual. Industri transportasi semakin mengandalkan IoT untuk memantau lokasi kendaraan, melacak jarak tempuh di jalan untuk pengenaan biaya pengguna jalan, melacak jam kerja pengemudi dan kepatuhan istirahat, atau memberi tahu staf saat kendaraan mendekati depot untuk persiapan pemuatan atau pembongkaran. + +✅ Perangkat IoT Komersial apa yang Anda miliki di sekolah atau tempat kerja Anda? + +### IoT Industri (IIoT) + +IoT Industri, atau IIoT, adalah penggunaan perangkat IoT untuk mengontrol dan mengelola mesin dalam skala besar. Ini mencakup berbagai macam kasus penggunaan, mulai dari pabrik hingga pertanian digital. + +Pabrik menggunakan perangkat IoT dalam berbagai cara. Mesin dapat dipantau dengan beberapa sensor untuk melacak hal-hal seperti suhu, getaran, dan kecepatan rotasi. Data ini kemudian dapat dipantau untuk memungkinkan mesin dihentikan jika berada di luar toleransi tertentu - misalnya, jika terlalu panas, mesin akan dimatikan. Data ini juga dapat dikumpulkan dan dianalisis dari waktu ke waktu untuk melakukan pemeliharaan prediktif, di mana model AI akan melihat data yang mengarah pada kegagalan, dan menggunakannya untuk memprediksi kegagalan lain sebelum terjadi. + +Pertanian digital sangat penting untuk memberi makan populasi yang terus bertambah, terutama bagi 2 miliar orang di 500 juta rumah tangga yang bergantung pada [pertanian subsisten](https://wikipedia.org/wiki/Subsistence_agriculture). Pertanian digital dapat berkisar dari sensor dengan harga beberapa dolar hingga pengaturan komersial besar. Seorang petani dapat memulai dengan memantau suhu dan menggunakan [hari derajat pertumbuhan](https://wikipedia.org/wiki/Growing_degree-day) untuk memprediksi kapan tanaman akan siap panen. Mereka dapat menghubungkan pemantauan kelembapan tanah ke sistem penyiraman otomatis untuk memberikan tanaman mereka air sebanyak yang dibutuhkan, tetapi tidak lebih untuk memastikan tanaman mereka tidak mengering tanpa membuang air. Petani bahkan melangkah lebih jauh dengan menggunakan drone, data satelit, dan AI untuk memantau pertumbuhan tanaman, penyakit, dan kualitas tanah di area pertanian yang luas. + +✅ Perangkat IoT apa lagi yang dapat membantu petani? + +### IoT Infrastruktur + +IoT Infrastruktur adalah pemantauan dan pengendalian infrastruktur lokal dan global yang digunakan orang setiap hari. + +[Kota Pintar](https://wikipedia.org/wiki/Smart_city) adalah area perkotaan yang menggunakan perangkat IoT untuk mengumpulkan data tentang kota dan menggunakannya untuk meningkatkan cara kota tersebut berjalan. Kota-kota ini biasanya dijalankan dengan kolaborasi antara pemerintah lokal, akademisi, dan bisnis lokal, melacak dan mengelola berbagai hal mulai dari transportasi hingga parkir dan polusi. Misalnya, di Kopenhagen, Denmark, polusi udara penting bagi penduduk setempat, sehingga diukur dan data tersebut digunakan untuk memberikan informasi tentang rute bersepeda dan jogging yang paling bersih. + +[Smart power grids](https://wikipedia.org/wiki/Smart_grid) memungkinkan analitik yang lebih baik tentang permintaan daya dengan mengumpulkan data penggunaan di tingkat rumah individu. Data ini dapat memandu keputusan di tingkat negara termasuk di mana membangun pembangkit listrik baru, dan di tingkat pribadi dengan memberikan pengguna wawasan tentang berapa banyak daya yang mereka gunakan, kapan mereka menggunakannya, dan bahkan saran tentang cara mengurangi biaya, seperti mengisi daya mobil listrik di malam hari. + +✅ Jika Anda dapat menambahkan perangkat IoT untuk mengukur sesuatu di tempat tinggal Anda, apa yang akan Anda ukur? + +## Contoh perangkat IoT yang mungkin ada di sekitar Anda + +Anda akan terkejut dengan berapa banyak perangkat IoT yang ada di sekitar Anda. Saya menulis ini dari rumah dan saya memiliki perangkat berikut yang terhubung ke Internet dengan fitur pintar seperti kontrol aplikasi, kontrol suara, atau kemampuan mengirim data kepada saya melalui ponsel: + +* Beberapa speaker pintar +* Kulkas, mesin pencuci piring, oven, dan microwave +* Monitor listrik untuk panel surya +* Colokan pintar +* Bel pintu video dan kamera keamanan +* Termostat pintar dengan beberapa sensor ruangan pintar +* Pembuka pintu garasi +* Sistem hiburan rumah dan TV yang dikontrol suara +* Lampu +* Pelacak kebugaran dan kesehatan + +Semua jenis perangkat ini memiliki sensor dan/atau aktuator dan berbicara ke Internet. Saya dapat mengetahui dari ponsel saya apakah pintu garasi saya terbuka, dan meminta speaker pintar saya untuk menutupnya. Saya bahkan dapat mengatur timer sehingga jika pintu masih terbuka di malam hari, pintu akan menutup secara otomatis. Ketika bel pintu saya berbunyi, saya dapat melihat dari ponsel saya siapa yang ada di sana di mana pun saya berada di dunia, dan berbicara dengan mereka melalui speaker dan mikrofon yang terpasang di bel pintu. Saya dapat memantau glukosa darah, detak jantung, dan pola tidur saya, mencari pola dalam data untuk meningkatkan kesehatan saya. Saya dapat mengontrol lampu saya melalui cloud, dan duduk dalam gelap ketika koneksi Internet saya terputus. + +--- + +## 🚀 Tantangan + +Daftar sebanyak mungkin perangkat IoT yang ada di rumah, sekolah, atau tempat kerja Anda - mungkin lebih banyak dari yang Anda pikirkan! + +## Kuis setelah pelajaran + +[Kuis setelah pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/2) + +## Tinjauan & Studi Mandiri + +Baca tentang manfaat dan kegagalan proyek IoT konsumen. Periksa situs berita untuk artikel tentang saat proyek tersebut gagal, seperti masalah privasi, masalah perangkat keras, atau masalah yang disebabkan oleh kurangnya konektivitas. + +Beberapa contoh: + +* Lihat akun Twitter **[Internet of Sh*t](https://twitter.com/internetofshit)** *(peringatan: bahasa kasar)* untuk beberapa contoh kegagalan proyek IoT konsumen. +* [c|net - Jam tangan Apple saya menyelamatkan hidup saya: 5 orang berbagi cerita mereka](https://www.cnet.com/news/apple-watch-lifesaving-health-features-read-5-peoples-stories/) +* [c|net - Teknisi ADT mengaku bersalah karena memata-matai umpan kamera pelanggan selama bertahun-tahun](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on-customer-camera-feeds-for-years/) *(peringatan: voyeurisme tanpa izin)* + +## Tugas + +[Investigasi proyek IoT](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/1-introduction-to-iot/assignment.md b/translations/id/1-getting-started/lessons/1-introduction-to-iot/assignment.md new file mode 100644 index 00000000..6bddd059 --- /dev/null +++ b/translations/id/1-getting-started/lessons/1-introduction-to-iot/assignment.md @@ -0,0 +1,27 @@ + +# Investigasi proyek IoT + +## Instruksi + +Ada banyak proyek IoT berskala besar dan kecil yang sedang diluncurkan secara global, mulai dari pertanian pintar hingga kota pintar, dalam pemantauan kesehatan, transportasi, dan penggunaan ruang publik. + +Cari informasi di internet tentang detail proyek yang menarik minat Anda, idealnya yang dekat dengan tempat tinggal Anda. Jelaskan keuntungan dan kerugian dari proyek tersebut, seperti manfaat yang diperoleh, masalah yang ditimbulkan, dan bagaimana privasi diperhatikan. + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Perbaikan | +| -------- | ------- | -------- | --------------- | +| Jelaskan keuntungan dan kerugian | Memberikan penjelasan yang jelas tentang keuntungan dan kerugian proyek | Memberikan penjelasan singkat tentang keuntungan dan kerugian | Tidak menjelaskan keuntungan atau kerugian | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/1-introduction-to-iot/pi.md b/translations/id/1-getting-started/lessons/1-introduction-to-iot/pi.md new file mode 100644 index 00000000..00b011a8 --- /dev/null +++ b/translations/id/1-getting-started/lessons/1-introduction-to-iot/pi.md @@ -0,0 +1,286 @@ + +# Raspberry Pi + +[Raspberry Pi](https://raspberrypi.org) adalah komputer papan tunggal. Anda dapat menambahkan sensor dan aktuator menggunakan berbagai perangkat dan ekosistem, dan untuk pelajaran ini, kita akan menggunakan ekosistem perangkat keras bernama [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html). Anda akan memprogram Pi Anda dan mengakses sensor Grove menggunakan Python. + +![Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.id.jpg) + +## Persiapan + +Jika Anda menggunakan Raspberry Pi sebagai perangkat keras IoT Anda, ada dua pilihan - Anda dapat menyelesaikan semua pelajaran ini dan memprogram langsung di Pi, atau Anda dapat menghubungkan secara jarak jauh ke Pi 'headless' dan memprogram dari komputer Anda. + +Sebelum memulai, Anda juga perlu menghubungkan Grove Base Hat ke Pi Anda. + +### Tugas - Persiapan + +Pasang Grove Base Hat pada Pi Anda dan konfigurasikan Pi. + +1. Hubungkan Grove Base Hat ke Pi Anda. Soket pada hat ini pas di atas semua pin GPIO pada Pi, meluncur ke bawah hingga duduk dengan kokoh di dasar. Hat ini menutupi Pi. + + ![Memasang Grove Hat](../../../../../images/pi-grove-hat-fitting.gif) + +1. Tentukan bagaimana Anda ingin memprogram Pi Anda, lalu buka bagian yang relevan di bawah ini: + + * [Bekerja langsung di Pi Anda](../../../../../1-getting-started/lessons/1-introduction-to-iot) + * [Akses jarak jauh untuk memprogram Pi](../../../../../1-getting-started/lessons/1-introduction-to-iot) + +### Bekerja langsung di Pi Anda + +Jika Anda ingin bekerja langsung di Pi Anda, Anda dapat menggunakan versi desktop Raspberry Pi OS dan menginstal semua alat yang diperlukan. + +#### Tugas - Bekerja langsung di Pi Anda + +Siapkan Pi Anda untuk pengembangan. + +1. Ikuti instruksi dalam [panduan pengaturan Raspberry Pi](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up) untuk menyiapkan Pi Anda, menghubungkannya ke keyboard/mouse/monitor, menghubungkannya ke jaringan WiFi atau ethernet Anda, dan memperbarui perangkat lunak. + +Untuk memprogram Pi menggunakan sensor dan aktuator Grove, Anda perlu menginstal editor untuk menulis kode perangkat, serta berbagai pustaka dan alat yang berinteraksi dengan perangkat keras Grove. + +1. Setelah Pi Anda reboot, buka Terminal dengan mengklik ikon **Terminal** di bilah menu atas, atau pilih *Menu -> Accessories -> Terminal*. + +1. Jalankan perintah berikut untuk memastikan OS dan perangkat lunak yang diinstal sudah diperbarui: + + ```sh + sudo apt update && sudo apt full-upgrade --yes + ``` + +1. Jalankan perintah berikut untuk menginstal semua pustaka yang diperlukan untuk perangkat keras 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 + ``` + + Ini dimulai dengan menginstal Git, bersama dengan Pip untuk menginstal paket Python. + + Salah satu fitur kuat Python adalah kemampuan untuk menginstal [paket Pip](https://pypi.org) - ini adalah paket kode yang ditulis oleh orang lain dan dipublikasikan di Internet. Anda dapat menginstal paket Pip ke komputer Anda dengan satu perintah, lalu menggunakan paket tersebut dalam kode Anda. + + Pustaka Python Seeed Grove perlu diinstal dari sumber. Perintah ini akan mengkloning repositori yang berisi kode sumber untuk paket ini, lalu menginstalnya secara lokal. + + > 💁 Secara default, ketika Anda menginstal paket, paket tersebut tersedia di seluruh komputer Anda, dan ini dapat menyebabkan masalah dengan versi paket - seperti satu aplikasi bergantung pada satu versi paket yang rusak ketika Anda menginstal versi baru untuk aplikasi lain. Untuk mengatasi masalah ini, Anda dapat menggunakan [lingkungan virtual Python](https://docs.python.org/3/library/venv.html), yang pada dasarnya adalah salinan Python di folder khusus, dan ketika Anda menginstal paket Pip, paket tersebut hanya diinstal di folder tersebut. Anda tidak akan menggunakan lingkungan virtual saat menggunakan Pi Anda. Skrip instalasi Grove menginstal pustaka Python Grove secara global, jadi untuk menggunakan lingkungan virtual, Anda perlu menyiapkan lingkungan virtual lalu menginstal ulang pustaka Grove secara manual di dalam lingkungan tersebut. Lebih mudah menggunakan paket global, terutama karena banyak pengembang Pi akan mem-flash ulang kartu SD bersih untuk setiap proyek. + + Akhirnya, ini mengaktifkan antarmuka I2C. + +1. Reboot Pi menggunakan menu atau jalankan perintah berikut di Terminal: + + ```sh + sudo reboot + ``` + +1. Setelah Pi reboot, buka kembali Terminal dan jalankan perintah berikut untuk menginstal [Visual Studio Code (VS Code)](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) - ini adalah editor yang akan Anda gunakan untuk menulis kode perangkat Anda dalam Python. + + ```sh + sudo apt install code + ``` + + Setelah diinstal, VS Code akan tersedia dari bilah menu atas. + + > 💁 Anda bebas menggunakan IDE atau editor Python apa pun untuk pelajaran ini jika Anda memiliki alat yang disukai, tetapi instruksi dalam pelajaran akan didasarkan pada penggunaan VS Code. + +1. Instal Pylance. Ini adalah ekstensi untuk VS Code yang menyediakan dukungan bahasa Python. Lihat [dokumentasi ekstensi Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) untuk instruksi tentang cara menginstal ekstensi ini di VS Code. + +### Akses jarak jauh untuk memprogram Pi + +Daripada memprogram langsung di Pi, Anda dapat menjalankannya dalam mode 'headless', yaitu tidak terhubung ke keyboard/mouse/monitor, dan mengonfigurasi serta memprogramnya dari komputer Anda menggunakan Visual Studio Code. + +#### Siapkan Pi OS + +Untuk memprogram secara jarak jauh, Pi OS perlu diinstal pada kartu SD. + +##### Tugas - Siapkan Pi OS + +Siapkan Pi OS dalam mode headless. + +1. Unduh **Raspberry Pi Imager** dari [halaman perangkat lunak Raspberry Pi OS](https://www.raspberrypi.org/software/) dan instal. + +1. Masukkan kartu SD ke komputer Anda, gunakan adaptor jika diperlukan. + +1. Jalankan Raspberry Pi Imager. + +1. Dari Raspberry Pi Imager, pilih tombol **CHOOSE OS**, lalu pilih *Raspberry Pi OS (Other)*, diikuti dengan *Raspberry Pi OS Lite (32-bit)*. + + ![Raspberry Pi Imager dengan Raspberry Pi OS Lite dipilih](../../../../../translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.id.png) + + > 💁 Raspberry Pi OS Lite adalah versi Raspberry Pi OS yang tidak memiliki antarmuka pengguna desktop atau alat berbasis UI. Ini tidak diperlukan untuk Pi headless dan membuat instalasi lebih kecil serta waktu boot lebih cepat. + +1. Pilih tombol **CHOOSE STORAGE**, lalu pilih kartu SD Anda. + +1. Buka **Advanced Options** dengan menekan `Ctrl+Shift+X`. Opsi ini memungkinkan beberapa konfigurasi awal Raspberry Pi OS sebelum diinstal ke kartu SD. + + 1. Centang kotak **Enable SSH**, dan atur kata sandi untuk pengguna `pi`. Ini adalah kata sandi yang akan Anda gunakan untuk masuk ke Pi nanti. + + 1. Jika Anda berencana untuk menghubungkan ke Pi melalui WiFi, centang kotak **Configure WiFi**, dan masukkan SSID dan kata sandi WiFi Anda, serta pilih negara WiFi Anda. Anda tidak perlu melakukan ini jika akan menggunakan kabel ethernet. Pastikan jaringan yang Anda hubungkan sama dengan jaringan komputer Anda. + + 1. Centang kotak **Set locale settings**, dan atur negara serta zona waktu Anda. + + 1. Pilih tombol **SAVE**. + +1. Pilih tombol **WRITE** untuk menulis OS ke kartu SD. Jika Anda menggunakan macOS, Anda akan diminta memasukkan kata sandi karena alat yang menulis gambar disk memerlukan akses istimewa. + +OS akan ditulis ke kartu SD, dan setelah selesai, kartu akan dikeluarkan oleh OS, dan Anda akan diberi tahu. Lepaskan kartu SD dari komputer Anda, masukkan ke Pi, nyalakan Pi, dan tunggu sekitar 2 menit agar boot dengan benar. + +#### Hubungkan ke Pi + +Langkah berikutnya adalah mengakses Pi secara jarak jauh. Anda dapat melakukannya menggunakan `ssh`, yang tersedia di macOS, Linux, dan versi terbaru Windows. + +##### Tugas - Hubungkan ke Pi + +Akses Pi secara jarak jauh. + +1. Buka Terminal atau Command Prompt, dan masukkan perintah berikut untuk terhubung ke Pi: + + ```sh + ssh pi@raspberrypi.local + ``` + + Jika Anda menggunakan Windows versi lama yang tidak memiliki `ssh` terinstal, Anda dapat menggunakan OpenSSH. Anda dapat menemukan instruksi instalasi di [dokumentasi instalasi OpenSSH](https://docs.microsoft.com//windows-server/administration/openssh/openssh_install_firstuse?WT.mc_id=academic-17441-jabenn). + +1. Ini akan menghubungkan Anda ke Pi dan meminta kata sandi. + + Kemampuan untuk menemukan komputer di jaringan Anda menggunakan `.local` adalah tambahan yang cukup baru untuk Linux dan Windows. Jika Anda menggunakan Linux atau Windows dan mendapatkan kesalahan tentang Hostname yang tidak ditemukan, Anda perlu menginstal perangkat lunak tambahan untuk mengaktifkan jaringan ZeroConf (juga disebut oleh Apple sebagai Bonjour): + + 1. Jika Anda menggunakan Linux, instal Avahi menggunakan perintah berikut: + + ```sh + sudo apt-get install avahi-daemon + ``` + + 1. Jika Anda menggunakan Windows, cara termudah untuk mengaktifkan ZeroConf adalah dengan menginstal [Bonjour Print Services for Windows](http://support.apple.com/kb/DL999). Anda juga dapat menginstal [iTunes for Windows](https://www.apple.com/itunes/download/) untuk mendapatkan versi utilitas yang lebih baru (yang tidak tersedia secara terpisah). + + > 💁 Jika Anda tidak dapat terhubung menggunakan `raspberrypi.local`, maka Anda dapat menggunakan alamat IP Pi Anda. Lihat [dokumentasi alamat IP Raspberry Pi](https://www.raspberrypi.org/documentation/remote-access/ip-address.md) untuk instruksi tentang beberapa cara mendapatkan alamat IP. + +1. Masukkan kata sandi yang Anda atur di Advanced Options Raspberry Pi Imager. + +#### Konfigurasikan perangkat lunak di Pi + +Setelah Anda terhubung ke Pi, Anda perlu memastikan OS sudah diperbarui, dan menginstal berbagai pustaka serta alat yang berinteraksi dengan perangkat keras Grove. + +##### Tugas - Konfigurasikan perangkat lunak di Pi + +Konfigurasikan perangkat lunak Pi yang diinstal dan instal pustaka Grove. + +1. Dari sesi `ssh` Anda, jalankan perintah berikut untuk memperbarui lalu reboot Pi: + + ```sh + sudo apt update && sudo apt full-upgrade --yes && sudo reboot + ``` + + Pi akan diperbarui dan reboot. Sesi `ssh` akan berakhir saat Pi reboot, jadi tunggu sekitar 30 detik lalu sambungkan kembali. + +1. Dari sesi `ssh` yang tersambung kembali, jalankan perintah berikut untuk menginstal semua pustaka yang diperlukan untuk perangkat keras 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 + ``` + + Ini dimulai dengan menginstal Git, bersama dengan Pip untuk menginstal paket Python. + + Salah satu fitur kuat Python adalah kemampuan untuk menginstal [paket Pip](https://pypi.org) - ini adalah paket kode yang ditulis oleh orang lain dan dipublikasikan di Internet. Anda dapat menginstal paket Pip ke komputer Anda dengan satu perintah, lalu menggunakan paket tersebut dalam kode Anda. + + Pustaka Python Seeed Grove perlu diinstal dari sumber. Perintah ini akan mengkloning repositori yang berisi kode sumber untuk paket ini, lalu menginstalnya secara lokal. + + > 💁 Secara default, ketika Anda menginstal paket, paket tersebut tersedia di seluruh komputer Anda, dan ini dapat menyebabkan masalah dengan versi paket - seperti satu aplikasi bergantung pada satu versi paket yang rusak ketika Anda menginstal versi baru untuk aplikasi lain. Untuk mengatasi masalah ini, Anda dapat menggunakan [lingkungan virtual Python](https://docs.python.org/3/library/venv.html), yang pada dasarnya adalah salinan Python di folder khusus, dan ketika Anda menginstal paket Pip, paket tersebut hanya diinstal di folder tersebut. Anda tidak akan menggunakan lingkungan virtual saat menggunakan Pi Anda. Skrip instalasi Grove menginstal pustaka Python Grove secara global, jadi untuk menggunakan lingkungan virtual, Anda perlu menyiapkan lingkungan virtual lalu menginstal ulang pustaka Grove secara manual di dalam lingkungan tersebut. Lebih mudah menggunakan paket global, terutama karena banyak pengembang Pi akan mem-flash ulang kartu SD bersih untuk setiap proyek. + + Akhirnya, ini mengaktifkan antarmuka I2C. + +1. Reboot Pi dengan menjalankan perintah berikut: + + ```sh + sudo reboot + ``` + + Sesi `ssh` akan berakhir saat Pi reboot. Tidak perlu menyambungkan kembali. + +#### Konfigurasikan VS Code untuk akses jarak jauh + +Setelah Pi dikonfigurasi, Anda dapat menghubungkannya menggunakan Visual Studio Code (VS Code) dari komputer Anda - ini adalah editor teks pengembang gratis yang akan Anda gunakan untuk menulis kode perangkat Anda dalam Python. + +##### Tugas - Konfigurasikan VS Code untuk akses jarak jauh + +Instal perangkat lunak yang diperlukan dan sambungkan secara jarak jauh ke Pi Anda. + +1. Instal VS Code di komputer Anda dengan mengikuti [dokumentasi VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn). + +1. Ikuti instruksi dalam [dokumentasi pengembangan jarak jauh VS Code menggunakan SSH](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn) untuk menginstal komponen yang diperlukan. + +1. Mengikuti instruksi yang sama, sambungkan VS Code ke Pi. + +1. Setelah tersambung, ikuti instruksi [mengelola ekstensi](https://code.visualstudio.com/docs/remote/ssh#_managing-extensions?WT.mc_id=academic-17441-jabenn) untuk menginstal [ekstensi Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) secara jarak jauh ke Pi. + +## Hello world +Adalah hal yang umum ketika memulai dengan bahasa pemrograman atau teknologi baru untuk membuat aplikasi 'Hello World' - sebuah aplikasi kecil yang menampilkan teks seperti `"Hello World"` untuk memastikan bahwa semua alat telah dikonfigurasi dengan benar. + +Aplikasi Hello World untuk Pi akan memastikan bahwa Python dan Visual Studio Code telah terinstal dengan benar. + +Aplikasi ini akan berada di dalam folder bernama `nightlight`, dan akan digunakan kembali dengan kode yang berbeda di bagian-bagian selanjutnya dari tugas ini untuk membangun aplikasi nightlight. + +### Tugas - hello world + +Buat aplikasi Hello World. + +1. Buka VS Code, baik langsung di Pi, atau di komputer Anda dan terhubung ke Pi menggunakan ekstensi Remote SSH. + +1. Buka Terminal VS Code dengan memilih *Terminal -> New Terminal*, atau menekan `` CTRL+` ``. Terminal akan terbuka di direktori home pengguna `pi`. + +1. Jalankan perintah berikut untuk membuat direktori untuk kode Anda, dan buat file Python bernama `app.py` di dalam direktori tersebut: + + ```sh + mkdir nightlight + cd nightlight + touch app.py + ``` + +1. Buka folder ini di VS Code dengan memilih *File -> Open...* dan memilih folder *nightlight*, lalu pilih **OK**. + + ![Dialog buka file di VS Code yang menunjukkan folder nightlight](../../../../../translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.id.png) + +1. Buka file `app.py` dari penjelajah VS Code dan tambahkan kode berikut: + + ```python + print('Hello World!') + ``` + + Fungsi `print` mencetak apa pun yang diberikan kepadanya ke konsol. + +1. Dari Terminal VS Code, jalankan perintah berikut untuk menjalankan aplikasi Python Anda: + + ```sh + python app.py + ``` + + > 💁 Anda mungkin perlu secara eksplisit memanggil `python3` untuk menjalankan kode ini jika Anda memiliki Python 2 yang terinstal selain Python 3 (versi terbaru). Jika Anda memiliki Python 2 yang terinstal, maka memanggil `python` akan menggunakan Python 2, bukan Python 3. Secara default, versi terbaru Raspberry Pi OS hanya memiliki Python 3 yang terinstal. + + Output berikut akan muncul di terminal: + + ```output + pi@raspberrypi:~/nightlight $ python3 app.py + Hello World! + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code/pi](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/pi). + +😀 Program 'Hello World' Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md b/translations/id/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md new file mode 100644 index 00000000..76b267f6 --- /dev/null +++ b/translations/id/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md @@ -0,0 +1,245 @@ + +# Komputer papan tunggal virtual + +Daripada membeli perangkat IoT beserta sensor dan aktuatornya, Anda dapat menggunakan komputer Anda untuk mensimulasikan perangkat keras IoT. Proyek [CounterFit](https://github.com/CounterFit-IoT/CounterFit) memungkinkan Anda menjalankan aplikasi secara lokal yang mensimulasikan perangkat keras IoT seperti sensor dan aktuator, serta mengakses sensor dan aktuator tersebut dari kode Python lokal yang ditulis dengan cara yang sama seperti kode yang akan Anda tulis di Raspberry Pi menggunakan perangkat keras fisik. + +## Persiapan + +Untuk menggunakan CounterFit, Anda perlu menginstal beberapa perangkat lunak gratis di komputer Anda. + +### Tugas + +Instal perangkat lunak yang diperlukan. + +1. Instal Python. Lihat [halaman unduhan Python](https://www.python.org/downloads/) untuk petunjuk menginstal versi terbaru Python. + +1. Instal Visual Studio Code (VS Code). Ini adalah editor yang akan Anda gunakan untuk menulis kode perangkat virtual Anda dalam Python. Lihat [dokumentasi VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) untuk petunjuk menginstal VS Code. + + > 💁 Anda bebas menggunakan IDE atau editor Python lain untuk pelajaran ini jika Anda memiliki alat yang disukai, tetapi instruksi dalam pelajaran akan didasarkan pada penggunaan VS Code. + +1. Instal ekstensi Pylance untuk VS Code. Ini adalah ekstensi untuk VS Code yang menyediakan dukungan bahasa Python. Lihat [dokumentasi ekstensi Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) untuk petunjuk menginstal ekstensi ini di VS Code. + +Petunjuk untuk menginstal dan mengonfigurasi aplikasi CounterFit akan diberikan pada waktu yang relevan dalam instruksi tugas karena aplikasi ini diinstal berdasarkan proyek. + +## Hello world + +Secara tradisional, saat memulai dengan bahasa pemrograman atau teknologi baru, Anda membuat aplikasi 'Hello World' - aplikasi kecil yang menampilkan teks seperti `"Hello World"` untuk menunjukkan bahwa semua alat telah dikonfigurasi dengan benar. + +Aplikasi Hello World untuk perangkat keras IoT virtual akan memastikan bahwa Python dan Visual Studio Code telah diinstal dengan benar. Aplikasi ini juga akan terhubung ke CounterFit untuk sensor dan aktuator IoT virtual. Aplikasi ini tidak akan menggunakan perangkat keras apa pun, hanya akan terhubung untuk membuktikan bahwa semuanya berfungsi. + +Aplikasi ini akan berada dalam folder bernama `nightlight`, dan akan digunakan kembali dengan kode yang berbeda di bagian selanjutnya dari tugas ini untuk membangun aplikasi nightlight. + +### Konfigurasi lingkungan virtual Python + +Salah satu fitur kuat Python adalah kemampuan untuk menginstal [paket Pip](https://pypi.org) - ini adalah paket kode yang ditulis oleh orang lain dan dipublikasikan di Internet. Anda dapat menginstal paket Pip di komputer Anda dengan satu perintah, lalu menggunakan paket tersebut dalam kode Anda. Anda akan menggunakan Pip untuk menginstal paket untuk berkomunikasi dengan CounterFit. + +Secara default, ketika Anda menginstal paket, paket tersebut tersedia di seluruh komputer Anda, dan ini dapat menyebabkan masalah dengan versi paket - seperti satu aplikasi yang bergantung pada satu versi paket yang rusak saat Anda menginstal versi baru untuk aplikasi lain. Untuk mengatasi masalah ini, Anda dapat menggunakan [lingkungan virtual Python](https://docs.python.org/3/library/venv.html), yang pada dasarnya adalah salinan Python dalam folder khusus, dan ketika Anda menginstal paket Pip, paket tersebut hanya diinstal di folder tersebut. + +> 💁 Jika Anda menggunakan Raspberry Pi, maka Anda tidak mengatur lingkungan virtual di perangkat tersebut untuk mengelola paket Pip, melainkan menggunakan paket global, karena paket Grove diinstal secara global oleh skrip penginstal. + +#### Tugas - konfigurasi lingkungan virtual Python + +Konfigurasikan lingkungan virtual Python dan instal paket Pip untuk CounterFit. + +1. Dari terminal atau command line Anda, jalankan perintah berikut di lokasi pilihan Anda untuk membuat dan menavigasi ke direktori baru: + + ```sh + mkdir nightlight + cd nightlight + ``` + +1. Sekarang jalankan perintah berikut untuk membuat lingkungan virtual di folder `.venv`: + + ```sh + python3 -m venv .venv + ``` + + > 💁 Anda perlu secara eksplisit memanggil `python3` untuk membuat lingkungan virtual jika Anda memiliki Python 2 yang diinstal selain Python 3 (versi terbaru). Jika Anda memiliki Python 2 yang diinstal, maka memanggil `python` akan menggunakan Python 2 alih-alih Python 3. + +1. Aktifkan lingkungan virtual: + + * Di Windows: + * Jika Anda menggunakan Command Prompt, atau Command Prompt melalui Windows Terminal, jalankan: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Jika Anda menggunakan PowerShell, jalankan: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + > Jika Anda mendapatkan kesalahan tentang skrip yang dinonaktifkan di sistem ini, Anda perlu mengaktifkan skrip dengan menetapkan kebijakan eksekusi yang sesuai. Anda dapat melakukannya dengan meluncurkan PowerShell sebagai administrator, lalu menjalankan perintah berikut: + + ```powershell + Set-ExecutionPolicy -ExecutionPolicy Unrestricted + ``` + + Masukkan `Y` saat diminta untuk mengonfirmasi. Kemudian luncurkan ulang PowerShell dan coba lagi. + + Anda dapat mengatur ulang kebijakan eksekusi ini di kemudian hari jika diperlukan. Anda dapat membaca lebih lanjut tentang ini di [halaman Kebijakan Eksekusi di Microsoft Docs](https://docs.microsoft.com/powershell/module/microsoft.powershell.core/about/about_execution_policies?WT.mc_id=academic-17441-jabenn). + + * Di macOS atau Linux, jalankan: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Perintah-perintah ini harus dijalankan dari lokasi yang sama dengan tempat Anda menjalankan perintah untuk membuat lingkungan virtual. Anda tidak perlu menavigasi ke dalam folder `.venv`, Anda harus selalu menjalankan perintah aktivasi dan perintah apa pun untuk menginstal paket atau menjalankan kode dari folder tempat Anda membuat lingkungan virtual. + +1. Setelah lingkungan virtual diaktifkan, perintah `python` default akan menjalankan versi Python yang digunakan untuk membuat lingkungan virtual. Jalankan perintah berikut untuk mendapatkan versinya: + + ```sh + python --version + ``` + + Outputnya harus berisi hal berikut: + + ```output + (.venv) ➜ nightlight python --version + Python 3.9.1 + ``` + + > 💁 Versi Python Anda mungkin berbeda - selama versinya 3.6 atau lebih tinggi, Anda sudah siap. Jika tidak, hapus folder ini, instal versi Python yang lebih baru, dan coba lagi. + +1. Jalankan perintah berikut untuk menginstal paket Pip untuk CounterFit. Paket-paket ini mencakup aplikasi utama CounterFit serta shims untuk perangkat keras Grove. Shims ini memungkinkan Anda menulis kode seolah-olah Anda sedang memprogram menggunakan sensor dan aktuator fisik dari ekosistem Grove tetapi terhubung ke perangkat IoT virtual. + + ```sh + pip install CounterFit + pip install counterfit-connection + pip install counterfit-shims-grove + ``` + + Paket-paket pip ini hanya akan diinstal di lingkungan virtual, dan tidak akan tersedia di luar lingkungan ini. + +### Menulis kode + +Setelah lingkungan virtual Python siap, Anda dapat menulis kode untuk aplikasi 'Hello World'. + +#### Tugas - menulis kode + +Buat aplikasi Python untuk mencetak `"Hello World"` ke konsol. + +1. Dari terminal atau command line Anda, jalankan perintah berikut di dalam lingkungan virtual untuk membuat file Python bernama `app.py`: + + * Dari Windows jalankan: + + ```cmd + type nul > app.py + ``` + + * Di macOS atau Linux, jalankan: + + ```cmd + touch app.py + ``` + +1. Buka folder saat ini di VS Code: + + ```sh + code . + ``` + + > 💁 Jika terminal Anda mengembalikan `command not found` di macOS, itu berarti VS Code belum ditambahkan ke PATH Anda. Anda dapat menambahkan VS Code ke PATH dengan mengikuti petunjuk di [bagian Meluncurkan dari command line di dokumentasi VS Code](https://code.visualstudio.com/docs/setup/mac?WT.mc_id=academic-17441-jabenn#_launching-from-the-command-line) dan menjalankan perintah setelahnya. VS Code secara default ditambahkan ke PATH di Windows dan Linux. + +1. Ketika VS Code diluncurkan, itu akan mengaktifkan lingkungan virtual Python. Lingkungan virtual yang dipilih akan muncul di bilah status bawah: + + ![VS Code menunjukkan lingkungan virtual yang dipilih](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.id.png) + +1. Jika Terminal VS Code sudah berjalan saat VS Code dimulai, lingkungan virtual tidak akan diaktifkan di dalamnya. Cara termudah untuk mengatasinya adalah dengan menutup terminal menggunakan tombol **Kill the active terminal instance**: + + ![Tombol VS Code Kill the active terminal instance](../../../../../translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.id.png) + + Anda dapat mengetahui apakah terminal memiliki lingkungan virtual yang diaktifkan karena nama lingkungan virtual akan menjadi awalan pada prompt terminal. Misalnya, mungkin: + + ```sh + (.venv) ➜ nightlight + ``` + + Jika Anda tidak memiliki `.venv` sebagai awalan pada prompt, lingkungan virtual tidak aktif di terminal. + +1. Luncurkan terminal VS Code baru dengan memilih *Terminal -> New Terminal*, atau menekan `` CTRL+` ``. Terminal baru akan memuat lingkungan virtual, dan panggilan untuk mengaktifkan ini akan muncul di terminal. Prompt juga akan memiliki nama lingkungan virtual (`.venv`): + + ```output + ➜ nightlight source .venv/bin/activate + (.venv) ➜ nightlight + ``` + +1. Buka file `app.py` dari penjelajah VS Code dan tambahkan kode berikut: + + ```python + print('Hello World!') + ``` + + Fungsi `print` mencetak apa pun yang diteruskan ke konsol. + +1. Dari terminal VS Code, jalankan perintah berikut untuk menjalankan aplikasi Python Anda: + + ```sh + python app.py + ``` + + Output berikut akan muncul: + + ```output + (.venv) ➜ nightlight python app.py + Hello World! + ``` + +😀 Program 'Hello World' Anda berhasil! + +### Menghubungkan 'perangkat keras' + +Sebagai langkah kedua 'Hello World', Anda akan menjalankan aplikasi CounterFit dan menghubungkan kode Anda ke sana. Ini adalah setara virtual dari mencolokkan perangkat keras IoT ke kit pengembangan. + +#### Tugas - menghubungkan 'perangkat keras' + +1. Dari terminal VS Code, luncurkan aplikasi CounterFit dengan perintah berikut: + + ```sh + counterfit + ``` + + Aplikasi akan mulai berjalan dan terbuka di browser web Anda: + + ![Aplikasi Counter Fit berjalan di browser](../../../../../translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.id.png) + + Aplikasi akan ditandai sebagai *Disconnected*, dengan LED di sudut kanan atas mati. + +1. Tambahkan kode berikut ke bagian atas `app.py`: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + + Kode ini mengimpor kelas `CounterFitConnection` dari modul `counterfit_connection`, yang berasal dari paket pip `counterfit-connection` yang Anda instal sebelumnya. Kemudian menginisialisasi koneksi ke aplikasi CounterFit yang berjalan di `127.0.0.1`, yang merupakan alamat IP yang selalu dapat Anda gunakan untuk mengakses komputer lokal Anda (sering disebut sebagai *localhost*), pada port 5000. + + > 💁 Jika Anda memiliki aplikasi lain yang berjalan di port 5000, Anda dapat mengubah ini dengan memperbarui port di kode, dan menjalankan CounterFit menggunakan `CounterFit --port `, mengganti `` dengan port yang ingin Anda gunakan. + +1. Anda perlu meluncurkan terminal VS Code baru dengan memilih tombol **Create a new integrated terminal**. Ini karena aplikasi CounterFit sedang berjalan di terminal saat ini. + + ![Tombol VS Code Create a new integrated terminal](../../../../../translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.id.png) + +1. Di terminal baru ini, jalankan file `app.py` seperti sebelumnya. Status CounterFit akan berubah menjadi **Connected** dan LED akan menyala. + + ![Counter Fit menunjukkan status terhubung](../../../../../translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.id.png) + +> 💁 Anda dapat menemukan kode ini di folder [code/virtual-device](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/virtual-device). + +😀 Koneksi Anda ke perangkat keras berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md b/translations/id/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md new file mode 100644 index 00000000..87e714c4 --- /dev/null +++ b/translations/id/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md @@ -0,0 +1,222 @@ + +# Wio Terminal + +[Wio Terminal dari Seeed Studios](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) adalah mikrokontroler yang kompatibel dengan Arduino, dilengkapi dengan WiFi serta beberapa sensor dan aktuator bawaan, serta port untuk menambahkan lebih banyak sensor dan aktuator menggunakan ekosistem perangkat keras yang disebut [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html). + +![Wio Terminal dari Seeed Studios](../../../../../translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.id.png) + +## Persiapan + +Untuk menggunakan Wio Terminal Anda, Anda perlu menginstal beberapa perangkat lunak gratis di komputer Anda. Anda juga perlu memperbarui firmware Wio Terminal sebelum dapat menghubungkannya ke WiFi. + +### Tugas - Persiapan + +Instal perangkat lunak yang diperlukan dan perbarui firmware. + +1. Instal Visual Studio Code (VS Code). Ini adalah editor yang akan Anda gunakan untuk menulis kode perangkat Anda dalam C/C++. Lihat [dokumentasi VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) untuk petunjuk tentang cara menginstal VS Code. + + > 💁 IDE populer lainnya untuk pengembangan Arduino adalah [Arduino IDE](https://www.arduino.cc/en/software). Jika Anda sudah terbiasa dengan alat ini, Anda dapat menggunakannya sebagai pengganti VS Code dan PlatformIO, tetapi pelajaran ini akan memberikan instruksi berdasarkan penggunaan VS Code. + +1. Instal ekstensi PlatformIO untuk VS Code. Ini adalah ekstensi untuk VS Code yang mendukung pemrograman mikrokontroler dalam C/C++. Lihat [dokumentasi ekstensi PlatformIO](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=platformio.platformio-ide) untuk petunjuk tentang cara menginstal ekstensi ini di VS Code. Ekstensi ini bergantung pada ekstensi Microsoft C/C++ untuk bekerja dengan kode C dan C++, dan ekstensi C/C++ akan diinstal secara otomatis saat Anda menginstal PlatformIO. + +1. Hubungkan Wio Terminal Anda ke komputer. Wio Terminal memiliki port USB-C di bagian bawah, yang perlu dihubungkan ke port USB di komputer Anda. Wio Terminal dilengkapi dengan kabel USB-C ke USB-A, tetapi jika komputer Anda hanya memiliki port USB-C, Anda akan memerlukan kabel USB-C atau adaptor USB-A ke USB-C. + +1. Ikuti petunjuk di [dokumentasi Wio Terminal Wiki WiFi Overview](https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/) untuk menyiapkan Wio Terminal Anda dan memperbarui firmware. + +## Hello World + +Tradisi saat memulai dengan bahasa pemrograman atau teknologi baru adalah membuat aplikasi 'Hello World' - aplikasi kecil yang menampilkan teks seperti `"Hello World"` untuk memastikan semua alat telah dikonfigurasi dengan benar. + +Aplikasi Hello World untuk Wio Terminal akan memastikan bahwa Anda telah menginstal Visual Studio Code dengan benar bersama PlatformIO dan siap untuk pengembangan mikrokontroler. + +### Membuat Proyek PlatformIO + +Langkah pertama adalah membuat proyek baru menggunakan PlatformIO yang dikonfigurasi untuk Wio Terminal. + +#### Tugas - Membuat Proyek PlatformIO + +Buat proyek PlatformIO. + +1. Hubungkan Wio Terminal ke komputer Anda. + +1. Buka VS Code. + +1. Ikon PlatformIO akan muncul di bilah menu samping: + + ![Opsi menu Platform IO](../../../../../translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.id.png) + + Pilih item menu ini, lalu pilih *PIO Home -> Open*. + + ![Opsi buka Platform IO](../../../../../translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.id.png) + +1. Dari layar selamat datang, pilih tombol **+ New Project**. + + ![Tombol proyek baru](../../../../../translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.id.png) + +1. Konfigurasikan proyek di *Project Wizard*: + + 1. Beri nama proyek Anda `nightlight`. + + 1. Dari dropdown *Board*, ketik `WIO` untuk memfilter papan, lalu pilih *Seeeduino Wio Terminal*. + + 1. Biarkan *Framework* sebagai *Arduino*. + + 1. Biarkan kotak centang *Use default location* tetap dicentang, atau hapus centang dan pilih lokasi untuk proyek Anda. + + 1. Pilih tombol **Finish**. + + ![Wizard proyek yang telah selesai](../../../../../translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.id.png) + + PlatformIO akan mengunduh komponen yang dibutuhkan untuk mengompilasi kode untuk Wio Terminal dan membuat proyek Anda. Proses ini mungkin memakan waktu beberapa menit. + +### Menyelidiki Proyek PlatformIO + +Penjelajah VS Code akan menampilkan sejumlah file dan folder yang dibuat oleh wizard PlatformIO. + +#### Folder + +* `.pio` - folder ini berisi data sementara yang dibutuhkan oleh PlatformIO seperti pustaka atau kode yang telah dikompilasi. Folder ini akan dibuat ulang secara otomatis jika dihapus, dan Anda tidak perlu menambahkannya ke kontrol kode sumber jika Anda membagikan proyek Anda di situs seperti GitHub. +* `.vscode` - folder ini berisi konfigurasi yang digunakan oleh PlatformIO dan VS Code. Folder ini akan dibuat ulang secara otomatis jika dihapus, dan Anda tidak perlu menambahkannya ke kontrol kode sumber jika Anda membagikan proyek Anda di situs seperti GitHub. +* `include` - folder ini untuk file header eksternal yang dibutuhkan saat menambahkan pustaka tambahan ke kode Anda. Anda tidak akan menggunakan folder ini dalam pelajaran ini. +* `lib` - folder ini untuk pustaka eksternal yang ingin Anda panggil dari kode Anda. Anda tidak akan menggunakan folder ini dalam pelajaran ini. +* `src` - folder ini berisi kode sumber utama untuk aplikasi Anda. Awalnya, folder ini hanya akan berisi satu file - `main.cpp`. +* `test` - folder ini adalah tempat Anda akan meletakkan pengujian unit untuk kode Anda. + +#### File + +* `main.cpp` - file ini berada di folder `src` dan berisi titik masuk untuk aplikasi Anda. Buka file ini, dan akan berisi kode berikut: + + ```cpp + #include + + void setup() { + // put your setup code here, to run once: + } + + void loop() { + // put your main code here, to run repeatedly: + } + ``` + + Ketika perangkat dinyalakan, kerangka kerja Arduino akan menjalankan fungsi `setup` sekali, lalu menjalankan fungsi `loop` berulang kali hingga perangkat dimatikan. + +* `.gitignore` - file ini mencantumkan file dan direktori yang diabaikan saat menambahkan kode Anda ke kontrol sumber git, seperti mengunggah ke repositori di GitHub. + +* `platformio.ini` - file ini berisi konfigurasi untuk perangkat dan aplikasi Anda. Buka file ini, dan akan berisi kode berikut: + + ```ini + [env:seeed_wio_terminal] + platform = atmelsam + board = seeed_wio_terminal + framework = arduino + ``` + + Bagian `[env:seeed_wio_terminal]` memiliki konfigurasi untuk Wio Terminal. Anda dapat memiliki beberapa bagian `env` sehingga kode Anda dapat dikompilasi untuk beberapa papan. + + Nilai lainnya sesuai dengan konfigurasi dari wizard proyek: + + * `platform = atmelsam` mendefinisikan perangkat keras yang digunakan oleh Wio Terminal (mikrokontroler berbasis ATSAMD51). + * `board = seeed_wio_terminal` mendefinisikan jenis papan mikrokontroler (Wio Terminal). + * `framework = arduino` mendefinisikan bahwa proyek ini menggunakan kerangka kerja Arduino. + +### Menulis Aplikasi Hello World + +Sekarang Anda siap untuk menulis aplikasi Hello World. + +#### Tugas - Menulis Aplikasi Hello World + +Tulis aplikasi Hello World. + +1. Buka file `main.cpp` di VS Code. + +1. Ubah kode agar sesuai dengan berikut ini: + + ```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); + } + ``` + + Fungsi `setup` menginisialisasi koneksi ke port serial - dalam hal ini, port USB yang digunakan untuk menghubungkan Wio Terminal ke komputer Anda. Parameter `9600` adalah [baud rate](https://wikipedia.org/wiki/Symbol_rate) (juga dikenal sebagai Symbol rate), atau kecepatan data yang akan dikirim melalui port serial dalam bit per detik. Pengaturan ini berarti 9.600 bit (0 dan 1) data dikirim setiap detik. Kemudian menunggu port serial siap. + + Fungsi `loop` mengirimkan baris `Hello World!` ke port serial, sehingga karakter `Hello World!` bersama dengan karakter baris baru. Kemudian tidur selama 5.000 milidetik atau 5 detik. Setelah `loop` selesai, fungsi ini dijalankan lagi, dan lagi, dan seterusnya selama mikrokontroler menyala. + +1. Masukkan Wio Terminal Anda ke mode upload. Anda perlu melakukan ini setiap kali mengunggah kode baru ke perangkat: + + 1. Tarik ke bawah dua kali dengan cepat pada sakelar daya - sakelar akan kembali ke posisi on setiap kali. + + 1. Periksa LED status biru di sisi kanan port USB. LED harus berkedip perlahan. + + [![Video cara memasukkan Wio Terminal ke mode upload](https://img.youtube.com/vi/LeKU_7zLRrQ/0.jpg)](https://youtu.be/LeKU_7zLRrQ) + + Klik gambar di atas untuk melihat video cara melakukannya. + +1. Bangun dan unggah kode ke Wio Terminal. + + 1. Buka palet perintah VS Code. + + 1. Ketik `PlatformIO Upload` untuk mencari opsi upload, lalu pilih *PlatformIO: Upload*. + + ![Opsi upload PlatformIO di palet perintah](../../../../../translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.id.png) + + PlatformIO akan secara otomatis membangun kode jika diperlukan sebelum mengunggah. + + 1. Kode akan dikompilasi dan diunggah ke Wio Terminal. + + > 💁 Jika Anda menggunakan macOS, notifikasi tentang *DISK NOT EJECTED PROPERLY* akan muncul. Ini terjadi karena Wio Terminal dipasang sebagai drive selama proses flashing, dan terputus saat kode yang dikompilasi ditulis ke perangkat. Anda dapat mengabaikan notifikasi ini. + + ⚠️ Jika Anda mendapatkan kesalahan tentang port upload yang tidak tersedia, pertama pastikan Wio Terminal Anda terhubung ke komputer, dinyalakan menggunakan sakelar di sisi kiri layar, dan diatur ke mode upload. Lampu hijau di bagian bawah harus menyala, dan lampu biru harus berkedip perlahan. Jika Anda masih mendapatkan kesalahan, tarik sakelar on/off ke bawah dua kali dengan cepat lagi untuk memaksa Wio Terminal ke mode upload dan coba unggah lagi. + +PlatformIO memiliki Serial Monitor yang dapat memantau data yang dikirim melalui kabel USB dari Wio Terminal. Ini memungkinkan Anda memantau data yang dikirim oleh perintah `Serial.println("Hello World");`. + +1. Buka palet perintah VS Code. + +1. Ketik `PlatformIO Serial` untuk mencari opsi Serial Monitor, lalu pilih *PlatformIO: Serial Monitor*. + + ![Opsi Serial Monitor PlatformIO di palet perintah](../../../../../translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.id.png) + + Terminal baru akan terbuka, dan data yang dikirim melalui port serial akan ditampilkan di terminal ini: + + ```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` akan dicetak ke serial monitor setiap 5 detik. + +> 💁 Anda dapat menemukan kode ini di folder [code/wio-terminal](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/wio-terminal). + +😀 Program 'Hello World' Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/2-deeper-dive/README.md b/translations/id/1-getting-started/lessons/2-deeper-dive/README.md new file mode 100644 index 00000000..77cc082d --- /dev/null +++ b/translations/id/1-getting-started/lessons/2-deeper-dive/README.md @@ -0,0 +1,277 @@ + +# Penjelajahan Lebih Dalam ke IoT + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +Pelajaran ini diajarkan sebagai bagian dari seri [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) dari [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Pelajaran ini disampaikan dalam 2 video - satu pelajaran berdurasi 1 jam, dan satu sesi tanya jawab berdurasi 1 jam yang membahas lebih dalam bagian-bagian dari pelajaran serta menjawab pertanyaan. + +[![Pelajaran 2: Penjelajahan Lebih Dalam ke IoT](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M) + +[![Pelajaran 2: Penjelajahan Lebih Dalam ke IoT - Sesi Tanya Jawab](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E) + +> 🎥 Klik gambar di atas untuk menonton video + +## Kuis Sebelum Pelajaran + +[Kuis Sebelum Pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3) + +## Pendahuluan + +Pelajaran ini membahas lebih dalam beberapa konsep yang telah dibahas pada pelajaran sebelumnya. + +Dalam pelajaran ini, kita akan membahas: + +* [Komponen dari aplikasi IoT](../../../../../1-getting-started/lessons/2-deeper-dive) +* [Penjelajahan lebih dalam tentang mikrokontroler](../../../../../1-getting-started/lessons/2-deeper-dive) +* [Penjelajahan lebih dalam tentang komputer papan tunggal](../../../../../1-getting-started/lessons/2-deeper-dive) + +## Komponen dari Aplikasi IoT + +Dua komponen utama dari aplikasi IoT adalah *Internet* dan *perangkat*. Mari kita lihat kedua komponen ini lebih detail. + +### Perangkat + +![Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.id.jpg) + +Bagian **Perangkat** dari IoT mengacu pada perangkat yang dapat berinteraksi dengan dunia fisik. Perangkat ini biasanya berupa komputer kecil dengan harga terjangkau, berjalan pada kecepatan rendah, dan menggunakan daya yang rendah - misalnya, mikrokontroler sederhana dengan RAM dalam ukuran kilobyte (berbeda dengan gigabyte pada PC) yang berjalan hanya pada beberapa ratus megahertz (berbeda dengan gigahertz pada PC), tetapi mengonsumsi daya yang sangat kecil sehingga dapat berjalan selama berminggu-minggu, berbulan-bulan, atau bahkan bertahun-tahun dengan baterai. + +Perangkat ini berinteraksi dengan dunia fisik, baik dengan menggunakan sensor untuk mengumpulkan data dari lingkungan sekitar atau dengan mengontrol keluaran atau aktuator untuk membuat perubahan fisik. Contoh khasnya adalah termostat pintar - perangkat yang memiliki sensor suhu, alat untuk mengatur suhu yang diinginkan seperti dial atau layar sentuh, dan koneksi ke sistem pemanas atau pendingin yang dapat dihidupkan ketika suhu yang terdeteksi berada di luar rentang yang diinginkan. Sensor suhu mendeteksi bahwa ruangan terlalu dingin, dan aktuator menghidupkan pemanas. + +![Diagram yang menunjukkan suhu dan dial sebagai input ke perangkat IoT, dan kontrol pemanas sebagai output](../../../../../translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.id.png) + +Ada berbagai macam perangkat yang dapat bertindak sebagai perangkat IoT, mulai dari perangkat keras khusus yang mendeteksi satu hal, hingga perangkat serbaguna, bahkan ponsel pintar Anda! Ponsel pintar dapat menggunakan sensor untuk mendeteksi dunia di sekitarnya, dan aktuator untuk berinteraksi dengan dunia - misalnya menggunakan sensor GPS untuk mendeteksi lokasi Anda dan speaker untuk memberikan instruksi navigasi ke tujuan. + +✅ Pikirkan sistem lain di sekitar Anda yang membaca data dari sensor dan menggunakannya untuk membuat keputusan. Salah satu contohnya adalah termostat pada oven. Bisakah Anda menemukan lebih banyak contoh? + +### Internet + +Sisi **Internet** dari aplikasi IoT terdiri dari aplikasi yang dapat dihubungkan oleh perangkat IoT untuk mengirim dan menerima data, serta aplikasi lain yang dapat memproses data dari perangkat IoT dan membantu membuat keputusan tentang permintaan apa yang akan dikirim ke aktuator perangkat IoT. + +Salah satu pengaturan yang umum adalah memiliki semacam layanan cloud yang dihubungkan oleh perangkat IoT, dan layanan cloud ini menangani hal-hal seperti keamanan, menerima pesan dari perangkat IoT, dan mengirim pesan kembali ke perangkat. Layanan cloud ini kemudian terhubung ke aplikasi lain yang dapat memproses atau menyimpan data sensor, atau menggunakan data sensor bersama data dari sistem lain untuk membuat keputusan. + +Perangkat juga tidak selalu terhubung langsung ke Internet melalui WiFi atau koneksi kabel. Beberapa perangkat menggunakan jaringan mesh untuk saling berkomunikasi melalui teknologi seperti Bluetooth, yang terhubung melalui perangkat hub yang memiliki koneksi Internet. + +Dalam contoh termostat pintar, termostat akan terhubung menggunakan WiFi rumah ke layanan cloud yang berjalan di cloud. Termostat akan mengirim data suhu ke layanan cloud ini, dan dari sana data akan ditulis ke semacam basis data yang memungkinkan pemilik rumah untuk memeriksa suhu saat ini dan suhu sebelumnya menggunakan aplikasi ponsel. Layanan lain di cloud akan mengetahui suhu yang diinginkan oleh pemilik rumah, dan mengirim pesan kembali ke perangkat IoT melalui layanan cloud untuk memberi tahu sistem pemanas untuk menyala atau mati. + +![Diagram yang menunjukkan suhu dan dial sebagai input ke perangkat IoT, perangkat IoT dengan komunikasi dua arah ke cloud, yang pada gilirannya memiliki komunikasi dua arah ke ponsel, dan kontrol pemanas sebagai output dari perangkat IoT](../../../../../translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.id.png) + +Versi yang lebih pintar bahkan dapat menggunakan AI di cloud dengan data dari sensor lain yang terhubung ke perangkat IoT lain seperti sensor keberadaan yang mendeteksi ruangan mana yang digunakan, serta data seperti cuaca dan bahkan kalender Anda, untuk membuat keputusan tentang bagaimana mengatur suhu secara cerdas. Misalnya, AI dapat mematikan pemanas jika membaca dari kalender Anda bahwa Anda sedang berlibur, atau mematikan pemanas berdasarkan ruangan demi ruangan tergantung pada ruangan mana yang Anda gunakan, belajar dari data untuk menjadi semakin akurat seiring waktu. + +![Diagram yang menunjukkan beberapa sensor suhu dan dial sebagai input ke perangkat IoT, perangkat IoT dengan komunikasi dua arah ke cloud, yang pada gilirannya memiliki komunikasi dua arah ke ponsel, kalender, dan layanan cuaca, serta kontrol pemanas sebagai output dari perangkat IoT](../../../../../translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.id.png) + +✅ Data apa lagi yang dapat membantu membuat termostat yang terhubung ke Internet menjadi lebih pintar? + +### IoT di Edge + +Meskipun huruf I dalam IoT berarti Internet, perangkat ini tidak harus terhubung ke Internet. Dalam beberapa kasus, perangkat dapat terhubung ke perangkat 'edge' - perangkat gateway yang berjalan di jaringan lokal Anda sehingga Anda dapat memproses data tanpa harus mengirimkannya melalui Internet. Ini bisa lebih cepat jika Anda memiliki banyak data atau koneksi Internet yang lambat, memungkinkan Anda untuk bekerja secara offline di tempat di mana konektivitas Internet tidak memungkinkan seperti di kapal atau di area bencana saat merespons krisis kemanusiaan, dan memungkinkan Anda menjaga data tetap pribadi. Beberapa perangkat akan menjalankan kode pemrosesan yang dibuat menggunakan alat cloud dan menjalankannya secara lokal untuk mengumpulkan dan merespons data tanpa menggunakan koneksi Internet untuk membuat keputusan. + +Salah satu contohnya adalah perangkat rumah pintar seperti Apple HomePod, Amazon Alexa, atau Google Home, yang akan mendengarkan suara Anda menggunakan model AI yang dilatih di cloud, tetapi berjalan secara lokal di perangkat. Perangkat ini akan 'bangun' ketika kata atau frasa tertentu diucapkan, dan hanya kemudian mengirimkan ucapan Anda melalui Internet untuk diproses. Perangkat akan berhenti mengirimkan ucapan pada titik yang sesuai seperti ketika mendeteksi jeda dalam ucapan Anda. Semua yang Anda katakan sebelum membangunkan perangkat dengan kata bangun, dan semua yang Anda katakan setelah perangkat berhenti mendengarkan tidak akan dikirim melalui Internet ke penyedia perangkat, dan oleh karena itu akan tetap bersifat pribadi. + +✅ Pikirkan skenario lain di mana privasi penting sehingga pemrosesan data lebih baik dilakukan di edge daripada di cloud. Sebagai petunjuk - pikirkan perangkat IoT dengan kamera atau perangkat pencitraan lainnya. + +### Keamanan IoT + +Dengan setiap koneksi Internet, keamanan adalah pertimbangan penting. Ada lelucon lama yang mengatakan 'huruf S dalam IoT berarti Security' - tidak ada huruf 'S' dalam IoT, yang menyiratkan bahwa IoT tidak aman. + +Perangkat IoT terhubung ke layanan cloud, dan oleh karena itu hanya seaman layanan cloud tersebut - jika layanan cloud Anda memungkinkan perangkat apa pun untuk terhubung, maka data berbahaya dapat dikirim, atau serangan virus dapat terjadi. Ini dapat memiliki konsekuensi dunia nyata yang sangat nyata karena perangkat IoT berinteraksi dan mengontrol perangkat lain. Misalnya, [worm Stuxnet](https://wikipedia.org/wiki/Stuxnet) memanipulasi katup dalam sentrifugal untuk merusaknya. Peretas juga telah memanfaatkan [keamanan yang buruk untuk mengakses monitor bayi](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) dan perangkat pengawasan rumah lainnya. + +> 💁 Kadang-kadang perangkat IoT dan perangkat edge berjalan di jaringan yang sepenuhnya terisolasi dari Internet untuk menjaga data tetap pribadi dan aman. Ini dikenal sebagai [air-gapping](https://wikipedia.org/wiki/Air_gap_(networking)). + +## Penjelajahan Lebih Dalam tentang Mikrokontroler + +Pada pelajaran sebelumnya, kita telah memperkenalkan mikrokontroler. Sekarang mari kita lihat lebih dalam. + +### CPU + +CPU adalah 'otak' dari mikrokontroler. Ini adalah prosesor yang menjalankan kode Anda dan dapat mengirim data ke dan menerima data dari perangkat yang terhubung. CPU dapat memiliki satu atau lebih inti - pada dasarnya satu atau lebih CPU yang dapat bekerja bersama untuk menjalankan kode Anda. + +CPU bergantung pada clock yang berdetak jutaan atau miliaran kali per detik. Setiap detak, atau siklus, menyinkronkan tindakan yang dapat dilakukan oleh CPU. Dengan setiap detak, CPU dapat menjalankan instruksi dari program, seperti mengambil data dari perangkat eksternal atau melakukan perhitungan matematis. Siklus reguler ini memungkinkan semua tindakan diselesaikan sebelum instruksi berikutnya diproses. + +Semakin cepat siklus clock, semakin banyak instruksi yang dapat diproses setiap detik, dan oleh karena itu semakin cepat CPU. Kecepatan CPU diukur dalam [Hertz (Hz)](https://wikipedia.org/wiki/Hertz), satuan standar di mana 1 Hz berarti satu siklus atau detak clock per detik. + +> 🎓 Kecepatan CPU sering diberikan dalam MHz atau GHz. 1MHz adalah 1 juta Hz, 1GHz adalah 1 miliar Hz. + +> 💁 CPU menjalankan program menggunakan [siklus fetch-decode-execute](https://wikipedia.org/wiki/Instruction_cycle). Untuk setiap detak clock, CPU akan mengambil instruksi berikutnya dari memori, mendekodenya, lalu menjalankannya seperti menggunakan unit logika aritmatika (ALU) untuk menambahkan 2 angka. Beberapa eksekusi akan memakan waktu beberapa detak untuk dijalankan, sehingga siklus berikutnya akan berjalan pada detak berikutnya setelah instruksi selesai. + +![Siklus fetch-decode-execute yang menunjukkan fetch mengambil instruksi dari program yang disimpan di RAM, lalu mendekode dan mengeksekusinya di CPU](../../../../../translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.id.png) + +Mikrokontroler memiliki kecepatan clock yang jauh lebih rendah dibandingkan komputer desktop atau laptop, atau bahkan sebagian besar ponsel pintar. Misalnya, Wio Terminal memiliki CPU yang berjalan pada 120MHz atau 120.000.000 siklus per detik. + +✅ Komputer PC atau Mac rata-rata memiliki CPU dengan beberapa inti yang berjalan pada beberapa GigaHertz, yang berarti clock berdetak miliaran kali per detik. Cari tahu kecepatan clock komputer Anda dan bandingkan seberapa banyak lebih cepat dibandingkan Wio Terminal. + +Setiap siklus clock menarik daya dan menghasilkan panas. Semakin cepat detaknya, semakin banyak daya yang dikonsumsi dan semakin banyak panas yang dihasilkan. PC memiliki heat sink dan kipas untuk menghilangkan panas, tanpa itu mereka akan terlalu panas dan mati dalam hitungan detik. Mikrokontroler sering kali tidak memiliki keduanya karena mereka berjalan jauh lebih dingin dan oleh karena itu jauh lebih lambat. PC berjalan dengan daya listrik atau baterai besar selama beberapa jam, sedangkan mikrokontroler dapat berjalan selama berhari-hari, berbulan-bulan, atau bahkan bertahun-tahun dengan baterai kecil. Mikrokontroler juga dapat memiliki inti yang berjalan pada kecepatan berbeda, beralih ke inti yang lebih lambat dan hemat daya ketika permintaan pada CPU rendah untuk mengurangi konsumsi daya. + +> 💁 Beberapa PC dan Mac mengadopsi campuran inti daya tinggi yang cepat dan inti daya rendah yang lebih lambat, beralih untuk menghemat baterai. Misalnya, chip M1 di laptop Apple terbaru dapat beralih antara 4 inti kinerja dan 4 inti efisiensi untuk mengoptimalkan masa pakai baterai atau kecepatan tergantung pada tugas yang dijalankan. + +✅ Lakukan sedikit penelitian: Baca tentang CPU di [artikel Wikipedia tentang CPU](https://wikipedia.org/wiki/Central_processing_unit) + +#### Tugas + +Selidiki Wio Terminal. + +Jika Anda menggunakan Wio Terminal untuk pelajaran ini, coba temukan CPU-nya. Temukan bagian *Hardware Overview* di [halaman produk Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) untuk melihat gambar bagian dalamnya, dan coba temukan CPU melalui jendela plastik transparan di bagian belakang. + +### Memori + +Mikrokontroler biasanya memiliki dua jenis memori - memori program dan memori akses acak (RAM). + +Memori program bersifat non-volatile, yang berarti apa pun yang ditulis ke dalamnya akan tetap ada meskipun perangkat tidak memiliki daya. Memori ini menyimpan kode program Anda. + +RAM adalah memori yang digunakan oleh program untuk berjalan, berisi variabel yang dialokasikan oleh program Anda dan data yang dikumpulkan dari perangkat periferal. RAM bersifat volatile, sehingga ketika daya mati, isinya akan hilang, yang secara efektif mereset program Anda. +🎓 Memori program menyimpan kode Anda dan tetap ada meskipun tidak ada daya. +> 🎓 RAM digunakan untuk menjalankan program Anda dan akan direset ketika tidak ada daya + +Seperti halnya CPU, memori pada mikrokontroler jauh lebih kecil dibandingkan dengan PC atau Mac. Sebuah PC biasa mungkin memiliki 8 Gigabyte (GB) RAM, atau 8.000.000.000 byte, di mana setiap byte cukup untuk menyimpan satu huruf atau angka dari 0-255. Sebuah mikrokontroler biasanya hanya memiliki Kilobyte (KB) RAM, dengan satu kilobyte setara dengan 1.000 byte. Wio Terminal yang disebutkan di atas memiliki 192KB RAM, atau 192.000 byte - lebih dari 40.000 kali lebih kecil dibandingkan PC rata-rata! + +Diagram di bawah ini menunjukkan perbedaan ukuran relatif antara 192KB dan 8GB - titik kecil di tengah mewakili 192KB. + +![Perbandingan antara 192KB dan 8GB - lebih dari 40.000 kali lebih besar](../../../../../translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.id.png) + +Penyimpanan program juga lebih kecil dibandingkan PC. Sebuah PC biasa mungkin memiliki hard drive 500GB untuk penyimpanan program, sedangkan mikrokontroler mungkin hanya memiliki kilobyte atau beberapa megabyte (MB) penyimpanan (1MB adalah 1.000KB, atau 1.000.000 byte). Wio Terminal memiliki 4MB penyimpanan program. + +✅ Lakukan sedikit riset: Berapa banyak RAM dan penyimpanan yang dimiliki komputer yang Anda gunakan untuk membaca ini? Bagaimana perbandingannya dengan mikrokontroler? + +### Input/Output + +Mikrokontroler membutuhkan koneksi input dan output (I/O) untuk membaca data dari sensor dan mengirim sinyal kontrol ke aktuator. Biasanya, mikrokontroler memiliki sejumlah pin input/output serbaguna (GPIO). Pin ini dapat dikonfigurasi melalui perangkat lunak sebagai input (menerima sinyal) atau output (mengirim sinyal). + +🧠⬅️ Pin input digunakan untuk membaca nilai dari sensor + +🧠➡️ Pin output mengirim instruksi ke aktuator + +✅ Anda akan mempelajari lebih lanjut tentang ini di pelajaran berikutnya. + +#### Tugas + +Teliti Wio Terminal. + +Jika Anda menggunakan Wio Terminal untuk pelajaran ini, temukan pin GPIO. Cari bagian *Pinout diagram* di [halaman produk Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) untuk mengetahui pin mana yang mana. Wio Terminal dilengkapi dengan stiker yang dapat Anda pasang di bagian belakang dengan nomor pin, jadi pasang sekarang jika belum. + +### Ukuran fisik + +Mikrokontroler biasanya berukuran kecil, dengan yang terkecil, [Freescale Kinetis KL03 MCU cukup kecil untuk muat di lekukan bola golf](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/). Hanya CPU di PC saja bisa berukuran 40mm x 40mm, dan itu belum termasuk heat sink dan kipas yang diperlukan agar CPU dapat berjalan lebih dari beberapa detik tanpa kepanasan, yang jauh lebih besar dibandingkan mikrokontroler lengkap. Kit pengembang Wio Terminal dengan mikrokontroler, casing, layar, dan berbagai koneksi serta komponen tidak jauh lebih besar dari CPU Intel i9 tanpa heat sink dan kipas! + +| Perangkat | Ukuran | +| ------------------------------- | --------------------- | +| Freescale Kinetis KL03 | 1.6mm x 2mm x 1mm | +| Wio Terminal | 72mm x 57mm x 12mm | +| Intel i9 CPU, Heat sink dan kipas | 136mm x 145mm x 103mm | + +### Framework dan sistem operasi + +Karena kecepatan dan ukuran memori yang rendah, mikrokontroler tidak menjalankan sistem operasi (OS) dalam pengertian desktop. Sistem operasi yang membuat komputer Anda berjalan (Windows, Linux, atau macOS) membutuhkan banyak memori dan daya pemrosesan untuk menjalankan tugas-tugas yang sama sekali tidak diperlukan oleh mikrokontroler. Ingat bahwa mikrokontroler biasanya diprogram untuk melakukan satu atau lebih tugas yang sangat spesifik, berbeda dengan komputer umum seperti PC atau Mac yang perlu mendukung antarmuka pengguna, memutar musik atau film, menyediakan alat untuk menulis dokumen atau kode, bermain game, atau menjelajahi Internet. + +Untuk memprogram mikrokontroler tanpa OS, Anda memerlukan beberapa alat untuk membangun kode Anda agar dapat dijalankan oleh mikrokontroler, menggunakan API yang dapat berkomunikasi dengan periferal. Setiap mikrokontroler berbeda, jadi produsen biasanya mendukung framework standar yang memungkinkan Anda mengikuti 'resep' standar untuk membangun kode Anda dan menjalankannya di mikrokontroler mana pun yang mendukung framework tersebut. + +Anda juga dapat memprogram mikrokontroler menggunakan OS - sering disebut sebagai sistem operasi waktu nyata (RTOS), karena dirancang untuk menangani pengiriman data ke dan dari periferal secara waktu nyata. Sistem operasi ini sangat ringan dan menyediakan fitur seperti: + +* Multi-threading, memungkinkan kode Anda menjalankan lebih dari satu blok kode secara bersamaan, baik pada beberapa inti atau secara bergantian pada satu inti +* Jaringan untuk memungkinkan komunikasi melalui Internet secara aman +* Komponen antarmuka pengguna grafis (GUI) untuk membangun antarmuka pengguna (UI) pada perangkat yang memiliki layar. + +✅ Baca lebih lanjut tentang beberapa RTOS yang berbeda: [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [Zephyr](https://www.zephyrproject.org) + +#### Arduino + +![Logo Arduino](../../../../../images/arduino-logo.svg) + +[Arduino](https://www.arduino.cc) mungkin adalah framework mikrokontroler yang paling populer, terutama di kalangan pelajar, hobiis, dan pembuat. Arduino adalah platform elektronik open source yang menggabungkan perangkat lunak dan perangkat keras. Anda dapat membeli papan kompatibel Arduino dari Arduino sendiri atau dari produsen lain, lalu memprogramnya menggunakan framework Arduino. + +Papan Arduino diprogram dalam C atau C++. Menggunakan C/C++ memungkinkan kode Anda dikompilasi menjadi sangat kecil dan berjalan cepat, sesuatu yang diperlukan pada perangkat terbatas seperti mikrokontroler. Inti dari aplikasi Arduino disebut sebagai sketch dan merupakan kode C/C++ dengan 2 fungsi - `setup` dan `loop`. Ketika papan dinyalakan, kode framework Arduino akan menjalankan fungsi `setup` sekali, lalu menjalankan fungsi `loop` berulang kali, terus-menerus hingga daya dimatikan. + +Anda akan menulis kode setup Anda di fungsi `setup`, seperti menghubungkan ke WiFi dan layanan cloud atau menginisialisasi pin untuk input dan output. Kode loop Anda kemudian akan berisi kode pemrosesan, seperti membaca dari sensor dan mengirimkan nilainya ke cloud. Biasanya Anda akan menyertakan penundaan di setiap loop, misalnya, jika Anda hanya ingin data sensor dikirim setiap 10 detik, Anda akan menambahkan penundaan 10 detik di akhir loop sehingga mikrokontroler dapat tidur, menghemat daya, lalu menjalankan loop lagi saat diperlukan 10 detik kemudian. + +![Sebuah sketch Arduino menjalankan setup terlebih dahulu, lalu menjalankan loop berulang kali](../../../../../translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.id.png) + +✅ Arsitektur program ini dikenal sebagai *event loop* atau *message loop*. Banyak aplikasi menggunakan ini di balik layar dan ini adalah standar untuk sebagian besar aplikasi desktop yang berjalan di OS seperti Windows, macOS, atau Linux. Fungsi `loop` mendengarkan pesan dari komponen antarmuka pengguna seperti tombol, atau perangkat seperti keyboard, dan meresponsnya. Anda dapat membaca lebih lanjut di [artikel tentang event loop](https://wikipedia.org/wiki/Event_loop). + +Arduino menyediakan pustaka standar untuk berinteraksi dengan mikrokontroler dan pin I/O, dengan implementasi berbeda di balik layar untuk dijalankan pada mikrokontroler yang berbeda. Misalnya, fungsi [`delay`](https://www.arduino.cc/reference/en/language/functions/time/delay/) akan menghentikan program untuk jangka waktu tertentu, fungsi [`digitalRead`](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/) akan membaca nilai `HIGH` atau `LOW` dari pin tertentu, terlepas dari papan mana kode tersebut dijalankan. Pustaka standar ini berarti bahwa kode Arduino yang ditulis untuk satu papan dapat dikompilasi ulang untuk papan Arduino lainnya dan akan berjalan, asalkan pin sama dan papan mendukung fitur yang sama. + +Ada ekosistem besar pustaka Arduino pihak ketiga yang memungkinkan Anda menambahkan fitur tambahan ke proyek Arduino Anda, seperti menggunakan sensor dan aktuator atau menghubungkan ke layanan IoT cloud. + +##### Tugas + +Teliti Wio Terminal. + +Jika Anda menggunakan Wio Terminal untuk pelajaran ini, baca ulang kode yang Anda tulis di pelajaran sebelumnya. Temukan fungsi `setup` dan `loop`. Pantau output serial untuk melihat fungsi loop dipanggil berulang kali. Cobalah menambahkan kode ke fungsi `setup` untuk menulis ke port serial dan amati bahwa kode ini hanya dipanggil sekali setiap kali Anda me-reboot. Cobalah me-reboot perangkat Anda dengan sakelar daya di samping untuk menunjukkan bahwa ini dipanggil setiap kali perangkat di-reboot. + +## Penjelajahan lebih dalam tentang komputer papan tunggal + +Pada pelajaran sebelumnya, kita telah memperkenalkan komputer papan tunggal. Sekarang mari kita lihat lebih dalam. + +### Raspberry Pi + +![Logo Raspberry Pi](../../../../../translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.id.png) + +[Raspberry Pi Foundation](https://www.raspberrypi.org) adalah sebuah badan amal dari Inggris yang didirikan pada tahun 2009 untuk mempromosikan studi ilmu komputer, terutama di tingkat sekolah. Sebagai bagian dari misi ini, mereka mengembangkan komputer papan tunggal yang disebut Raspberry Pi. Raspberry Pi saat ini tersedia dalam 3 varian - versi ukuran penuh, Pi Zero yang lebih kecil, dan modul komputasi yang dapat dibangun ke dalam perangkat IoT akhir Anda. + +![Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.id.jpg) + +Iterasi terbaru dari Raspberry Pi ukuran penuh adalah Raspberry Pi 4B. Ini memiliki CPU quad-core (4 inti) yang berjalan pada 1,5GHz, RAM 2, 4, atau 8GB, ethernet gigabit, WiFi, 2 port HDMI yang mendukung layar 4k, port output audio dan video komposit, port USB (2 USB 2.0, 2 USB 3.0), 40 pin GPIO, konektor kamera untuk modul kamera Raspberry Pi, dan slot kartu SD. Semua ini ada pada papan berukuran 88mm x 58mm x 19,5mm dan ditenagai oleh catu daya USB-C 3A. Harganya mulai dari US$35, jauh lebih murah dibandingkan PC atau Mac. + +> 💁 Ada juga Pi400, komputer all-in-one dengan Pi4 yang terintegrasi ke dalam keyboard. + +![Raspberry Pi Zero](../../../../../translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.id.jpg) + +Pi Zero jauh lebih kecil, dengan daya yang lebih rendah. Ini memiliki CPU single-core 1GHz, RAM 512MB, WiFi (pada model Zero W), satu port HDMI, satu port micro-USB, 40 pin GPIO, konektor kamera untuk modul kamera Raspberry Pi, dan slot kartu SD. Ukurannya 65mm x 30mm x 5mm, dan menggunakan daya yang sangat kecil. Pi Zero dihargai US$5, dengan versi W yang memiliki WiFi dihargai US$10. + +> 🎓 CPU di kedua perangkat ini adalah prosesor ARM, berbeda dengan prosesor Intel/AMD x86 atau x64 yang Anda temukan di sebagian besar PC dan Mac. Prosesor ini mirip dengan yang ditemukan di beberapa mikrokontroler, serta hampir semua ponsel, Microsoft Surface X, dan Apple Mac berbasis Apple Silicon yang baru. + +Semua varian Raspberry Pi menjalankan versi Debian Linux yang disebut Raspberry Pi OS. Ini tersedia dalam versi lite tanpa desktop, yang sempurna untuk proyek 'headless' di mana Anda tidak memerlukan layar, atau versi penuh dengan lingkungan desktop lengkap, termasuk browser web, aplikasi perkantoran, alat pemrograman, dan game. Karena OS ini adalah versi Debian Linux, Anda dapat menginstal aplikasi atau alat apa pun yang berjalan di Debian dan dibangun untuk prosesor ARM di dalam Pi. + +#### Tugas + +Teliti Raspberry Pi. + +Jika Anda menggunakan Raspberry Pi untuk pelajaran ini, baca tentang berbagai komponen perangkat keras di papan. + +* Anda dapat menemukan detail tentang prosesor yang digunakan di [halaman dokumentasi perangkat keras Raspberry Pi](https://www.raspberrypi.org/documentation/hardware/raspberrypi/). Baca tentang prosesor yang digunakan di Pi Anda. +* Temukan pin GPIO. Baca lebih lanjut tentang pin ini di [dokumentasi GPIO Raspberry Pi](https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md). Gunakan [Panduan Penggunaan Pin GPIO](https://www.raspberrypi.org/documentation/usage/gpio/README.md) untuk mengidentifikasi pin yang berbeda pada Pi Anda. + +### Pemrograman komputer papan tunggal + +Komputer papan tunggal adalah komputer lengkap yang menjalankan OS penuh. Ini berarti ada berbagai bahasa pemrograman, framework, dan alat yang dapat Anda gunakan untuk memprogramnya, berbeda dengan mikrokontroler yang bergantung pada dukungan framework seperti Arduino. Sebagian besar bahasa pemrograman memiliki pustaka yang dapat mengakses pin GPIO untuk mengirim dan menerima data dari sensor dan aktuator. + +✅ Bahasa pemrograman apa yang Anda kuasai? Apakah bahasa tersebut didukung di Linux? + +Bahasa pemrograman yang paling umum digunakan untuk membangun aplikasi IoT di Raspberry Pi adalah Python. Ada ekosistem besar perangkat keras yang dirancang untuk Pi, dan hampir semuanya menyertakan kode yang relevan untuk digunakan sebagai pustaka Python. Beberapa ekosistem ini berbasis 'hats' - disebut demikian karena mereka dipasang di atas Pi seperti topi dan terhubung dengan soket besar ke 40 pin GPIO. Hats ini menyediakan kemampuan tambahan, seperti layar, sensor, mobil remote control, atau adaptor untuk memungkinkan Anda menyambungkan sensor dengan kabel standar. +### Penggunaan komputer papan tunggal dalam penerapan IoT profesional + +Komputer papan tunggal digunakan dalam penerapan IoT profesional, bukan hanya sebagai kit pengembang. Perangkat ini dapat menjadi cara yang kuat untuk mengontrol perangkat keras dan menjalankan tugas-tugas kompleks seperti menjalankan model pembelajaran mesin. Sebagai contoh, terdapat [modul komputasi Raspberry Pi 4](https://www.raspberrypi.org/blog/raspberry-pi-compute-module-4/) yang menyediakan semua kemampuan Raspberry Pi 4 tetapi dalam bentuk yang lebih ringkas dan lebih murah tanpa sebagian besar port, dirancang untuk dipasang ke dalam perangkat keras khusus. + +--- + +## 🚀 Tantangan + +Tantangan pada pelajaran terakhir adalah mencatat sebanyak mungkin perangkat IoT yang ada di rumah, sekolah, atau tempat kerja Anda. Untuk setiap perangkat dalam daftar ini, menurut Anda apakah perangkat tersebut dibangun menggunakan mikrokontroler, komputer papan tunggal, atau bahkan campuran keduanya? + +## Kuis setelah kuliah + +[Kuis setelah kuliah](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4) + +## Tinjauan & Studi Mandiri + +* Baca [panduan memulai Arduino](https://www.arduino.cc/en/Guide/Introduction) untuk memahami lebih lanjut tentang platform Arduino. +* Baca [pengantar Raspberry Pi 4](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) untuk mempelajari lebih lanjut tentang Raspberry Pi. +* Pelajari lebih lanjut beberapa konsep dan akronim dalam artikel [Apa itu CPU, MPU, MCU, dan GPU di Electrical Engineering Journal](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/). + +✅ Gunakan panduan-panduan ini, bersama dengan informasi biaya yang ditunjukkan melalui tautan di [panduan perangkat keras](../../../hardware.md) untuk memutuskan platform perangkat keras apa yang ingin Anda gunakan, atau apakah Anda lebih memilih menggunakan perangkat virtual. + +## Tugas + +[Bandingkan dan bedakan mikrokontroler dan komputer papan tunggal](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/2-deeper-dive/assignment.md b/translations/id/1-getting-started/lessons/2-deeper-dive/assignment.md new file mode 100644 index 00000000..edee3aac --- /dev/null +++ b/translations/id/1-getting-started/lessons/2-deeper-dive/assignment.md @@ -0,0 +1,26 @@ + +# Membandingkan dan Membedakan Mikrokontroler dan Komputer Papan Tunggal + +## Instruksi + +Pelajaran ini membahas mikrokontroler dan komputer papan tunggal. Buatlah tabel yang membandingkan dan membedakan keduanya, serta catat setidaknya 2 alasan mengapa Anda akan menggunakan mikrokontroler daripada komputer papan tunggal, dan setidaknya 2 alasan mengapa Anda akan menggunakan komputer papan tunggal daripada mikrokontroler. + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Peningkatan | +| -------- | ------- | -------- | ----------------- | +| Membuat tabel yang membandingkan mikrokontroler dengan komputer papan tunggal | Membuat daftar dengan beberapa poin yang secara tepat membandingkan dan membedakan | Membuat daftar dengan hanya beberapa poin | Hanya mampu membuat satu poin, atau tidak ada poin untuk dibandingkan dan dibedakan | +| Alasan menggunakan satu dibandingkan yang lain | Mampu memberikan 2 atau lebih alasan untuk mikrokontroler, dan 2 atau lebih untuk komputer papan tunggal | Hanya mampu memberikan 1-2 alasan untuk mikrokontroler, dan 1-2 alasan untuk komputer papan tunggal | Tidak mampu memberikan 1 atau lebih alasan untuk mikrokontroler atau komputer papan tunggal | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau interpretasi yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/3-sensors-and-actuators/README.md b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/README.md new file mode 100644 index 00000000..32b3d9c6 --- /dev/null +++ b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/README.md @@ -0,0 +1,230 @@ + +# Berinteraksi dengan Dunia Fisik Menggunakan Sensor dan Aktuator + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +Pelajaran ini diajarkan sebagai bagian dari seri [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) dari [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Materi ini disampaikan dalam 2 video - satu sesi pelajaran selama 1 jam, dan satu sesi tanya jawab selama 1 jam yang membahas lebih dalam bagian-bagian dari pelajaran serta menjawab pertanyaan. + +[![Pelajaran 3: Berinteraksi dengan Dunia Fisik Menggunakan Sensor dan Aktuator](https://img.youtube.com/vi/Lqalu1v6aF4/0.jpg)](https://youtu.be/Lqalu1v6aF4) + +[![Pelajaran 3: Berinteraksi dengan Dunia Fisik Menggunakan Sensor dan Aktuator - Sesi Tanya Jawab](https://img.youtube.com/vi/qR3ekcMlLWA/0.jpg)](https://youtu.be/qR3ekcMlLWA) + +> 🎥 Klik gambar di atas untuk menonton video + +## Kuis Sebelum Pelajaran + +[Kuis Sebelum Pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5) + +## Pendahuluan + +Pelajaran ini memperkenalkan dua konsep penting untuk perangkat IoT Anda - sensor dan aktuator. Anda juga akan langsung mempraktikkannya, menambahkan sensor cahaya ke proyek IoT Anda, lalu menambahkan LED yang dikendalikan oleh tingkat cahaya, sehingga secara efektif membangun lampu malam. + +Dalam pelajaran ini kita akan membahas: + +* [Apa itu sensor?](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Menggunakan sensor](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Jenis-jenis sensor](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Apa itu aktuator?](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Menggunakan aktuator](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Jenis-jenis aktuator](../../../../../1-getting-started/lessons/3-sensors-and-actuators) + +## Apa itu sensor? + +Sensor adalah perangkat keras yang mendeteksi dunia fisik - yaitu, mereka mengukur satu atau lebih properti di sekitarnya dan mengirimkan informasi tersebut ke perangkat IoT. Sensor mencakup berbagai perangkat karena ada begitu banyak hal yang dapat diukur, mulai dari sifat alami seperti suhu udara hingga interaksi fisik seperti gerakan. + +Beberapa sensor umum meliputi: + +* Sensor suhu - mendeteksi suhu udara atau suhu benda yang disentuhnya. Untuk hobi dan pengembang, sensor ini sering digabungkan dengan sensor tekanan udara dan kelembapan dalam satu perangkat. +* Tombol - mendeteksi saat tombol ditekan. +* Sensor cahaya - mendeteksi tingkat cahaya dan dapat mendeteksi warna tertentu, cahaya UV, cahaya IR, atau cahaya tampak umum. +* Kamera - mendeteksi representasi visual dunia dengan mengambil foto atau streaming video. +* Akselerometer - mendeteksi gerakan dalam berbagai arah. +* Mikrofon - mendeteksi suara, baik tingkat suara umum maupun suara terarah. + +✅ Lakukan penelitian. Sensor apa saja yang dimiliki ponsel Anda? + +Semua sensor memiliki satu kesamaan - mereka mengubah apa yang mereka deteksi menjadi sinyal listrik yang dapat diinterpretasikan oleh perangkat IoT. Cara sinyal listrik ini diinterpretasikan tergantung pada sensor, serta protokol komunikasi yang digunakan untuk berkomunikasi dengan perangkat IoT. + +## Menggunakan sensor + +Ikuti panduan yang relevan di bawah ini untuk menambahkan sensor ke perangkat IoT Anda: + +* [Arduino - Wio Terminal](wio-terminal-sensor.md) +* [Komputer papan tunggal - Raspberry Pi](pi-sensor.md) +* [Komputer papan tunggal - Perangkat virtual](virtual-device-sensor.md) + +## Jenis-jenis sensor + +Sensor dapat berupa analog atau digital. + +### Sensor analog + +Beberapa sensor paling dasar adalah sensor analog. Sensor ini menerima tegangan dari perangkat IoT, komponen sensor menyesuaikan tegangan ini, dan tegangan yang dikembalikan dari sensor diukur untuk memberikan nilai sensor. + +> 🎓 Tegangan adalah ukuran seberapa besar dorongan untuk memindahkan listrik dari satu tempat ke tempat lain, seperti dari terminal positif baterai ke terminal negatif. Misalnya, baterai AA standar adalah 1,5V (V adalah simbol untuk volt) dan dapat mendorong listrik dengan kekuatan 1,5V dari terminal positifnya ke terminal negatifnya. Perangkat keras listrik yang berbeda membutuhkan tegangan yang berbeda untuk bekerja, misalnya, LED dapat menyala dengan tegangan antara 2-3V, tetapi bola lampu filamen 100W membutuhkan 240V. Anda dapat membaca lebih lanjut tentang tegangan di [halaman Tegangan di Wikipedia](https://wikipedia.org/wiki/Voltage). + +Salah satu contohnya adalah potensiometer. Ini adalah kenop yang dapat Anda putar di antara dua posisi, dan sensor mengukur rotasi tersebut. + +![Potensiometer diatur ke titik tengah, menerima 5 volt, dan mengembalikan 3,8 volt](../../../../../translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.id.png) + +Perangkat IoT akan mengirimkan sinyal listrik ke potensiometer pada tegangan tertentu, misalnya 5 volt (5V). Saat potensiometer disesuaikan, tegangan yang keluar dari sisi lain akan berubah. Bayangkan Anda memiliki potensiometer yang diberi label sebagai kenop yang berkisar dari 0 hingga [11](https://wikipedia.org/wiki/Up_to_eleven), seperti kenop volume pada amplifier. Ketika potensiometer berada di posisi mati penuh (0), maka 0V (0 volt) akan keluar. Ketika berada di posisi nyala penuh (11), 5V (5 volt) akan keluar. + +> 🎓 Ini adalah penyederhanaan, dan Anda dapat membaca lebih lanjut tentang potensiometer dan resistor variabel di [halaman Wikipedia potensiometer](https://wikipedia.org/wiki/Potentiometer). + +Tegangan yang keluar dari sensor kemudian dibaca oleh perangkat IoT, dan perangkat dapat meresponsnya. Bergantung pada sensor, tegangan ini bisa berupa nilai sembarang atau dapat dipetakan ke satuan standar. Misalnya, sensor suhu analog berbasis [termistor](https://wikipedia.org/wiki/Thermistor) mengubah resistansinya tergantung pada suhu. Tegangan keluaran kemudian dapat dikonversi menjadi suhu dalam Kelvin, dan selanjutnya ke °C atau °F, melalui perhitungan dalam kode. + +✅ Menurut Anda, apa yang terjadi jika sensor mengembalikan tegangan yang lebih tinggi daripada yang dikirimkan (misalnya berasal dari sumber daya eksternal)? ⛔️ JANGAN coba ini. + +#### Konversi analog ke digital + +Perangkat IoT bersifat digital - mereka tidak dapat bekerja dengan nilai analog, hanya dengan 0 dan 1. Ini berarti bahwa nilai sensor analog perlu dikonversi menjadi sinyal digital sebelum dapat diproses. Banyak perangkat IoT memiliki konverter analog-ke-digital (ADC) untuk mengubah input analog menjadi representasi digital dari nilainya. Sensor juga dapat bekerja dengan ADC melalui papan konektor. Misalnya, dalam ekosistem Seeed Grove dengan Raspberry Pi, sensor analog terhubung ke port tertentu pada 'hat' yang dipasang di Pi yang terhubung ke pin GPIO Pi, dan hat ini memiliki ADC untuk mengonversi tegangan menjadi sinyal digital yang dapat dikirim dari pin GPIO Pi. + +Bayangkan Anda memiliki sensor cahaya analog yang terhubung ke perangkat IoT yang menggunakan 3,3V dan mengembalikan nilai 1V. Tegangan 1V ini tidak berarti apa-apa di dunia digital, jadi perlu dikonversi. Tegangan akan dikonversi menjadi nilai analog menggunakan skala tergantung pada perangkat dan sensor. Salah satu contohnya adalah sensor cahaya Seeed Grove yang menghasilkan nilai dari 0 hingga 1.023. Untuk sensor ini yang berjalan pada 3,3V, keluaran 1V akan menjadi nilai 300. Perangkat IoT tidak dapat menangani 300 sebagai nilai analog, jadi nilai tersebut akan dikonversi menjadi `0000000100101100`, representasi biner dari 300 oleh Grove hat. Nilai ini kemudian akan diproses oleh perangkat IoT. + +✅ Jika Anda tidak tahu tentang biner, lakukan sedikit penelitian untuk mempelajari bagaimana angka direpresentasikan oleh 0 dan 1. [Pelajaran pengantar biner dari BBC Bitesize](https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1) adalah tempat yang bagus untuk memulai. + +Dari perspektif pemrograman, semua ini biasanya ditangani oleh pustaka yang disertakan dengan sensor, jadi Anda tidak perlu khawatir tentang konversi ini sendiri. Untuk sensor cahaya Grove, Anda akan menggunakan pustaka Python dan memanggil properti `light`, atau menggunakan pustaka Arduino dan memanggil `analogRead` untuk mendapatkan nilai 300. + +### Sensor digital + +Sensor digital, seperti sensor analog, mendeteksi dunia di sekitar mereka menggunakan perubahan tegangan listrik. Perbedaannya adalah mereka menghasilkan sinyal digital, baik dengan hanya mengukur dua keadaan atau dengan menggunakan ADC bawaan. Sensor digital semakin umum untuk menghindari kebutuhan menggunakan ADC baik di papan konektor atau di perangkat IoT itu sendiri. + +Sensor digital paling sederhana adalah tombol atau saklar. Ini adalah sensor dengan dua keadaan, hidup atau mati. + +![Tombol menerima 5 volt. Saat tidak ditekan, mengembalikan 0 volt; saat ditekan, mengembalikan 5 volt](../../../../../translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.id.png) + +Pin pada perangkat IoT seperti pin GPIO dapat mengukur sinyal ini secara langsung sebagai 0 atau 1. Jika tegangan yang dikirim sama dengan tegangan yang dikembalikan, nilai yang dibaca adalah 1, jika tidak nilai yang dibaca adalah 0. Tidak perlu mengonversi sinyal, sinyal hanya bisa berupa 1 atau 0. + +> 💁 Tegangan tidak pernah benar-benar tepat terutama karena komponen dalam sensor memiliki resistansi tertentu, jadi biasanya ada toleransi. Misalnya, pin GPIO pada Raspberry Pi bekerja pada 3,3V, dan membaca sinyal balik di atas 1,8V sebagai 1, di bawah 1,8V sebagai 0. + +* 3,3V masuk ke tombol. Tombol mati sehingga 0V keluar, memberikan nilai 0 +* 3,3V masuk ke tombol. Tombol menyala sehingga 3,3V keluar, memberikan nilai 1 + +Sensor digital yang lebih canggih membaca nilai analog, lalu mengonversinya menggunakan ADC bawaan menjadi sinyal digital. Misalnya, sensor suhu digital masih menggunakan termokopel dengan cara yang sama seperti sensor analog, dan masih mengukur perubahan tegangan yang disebabkan oleh resistansi termokopel pada suhu saat ini. Alih-alih mengembalikan nilai analog dan mengandalkan perangkat atau papan konektor untuk mengonversi menjadi sinyal digital, ADC yang dibangun ke dalam sensor akan mengonversi nilai tersebut dan mengirimkannya sebagai serangkaian 0 dan 1 ke perangkat IoT. 0 dan 1 ini dikirim dengan cara yang sama seperti sinyal digital untuk tombol dengan 1 sebagai tegangan penuh dan 0 sebagai 0V. + +![Sensor suhu digital mengonversi pembacaan analog menjadi data biner dengan 0 sebagai 0 volt dan 1 sebagai 5 volt sebelum mengirimkannya ke perangkat IoT](../../../../../translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.id.png) + +Mengirim data digital memungkinkan sensor menjadi lebih kompleks dan mengirimkan data yang lebih rinci, bahkan data terenkripsi untuk sensor yang aman. Salah satu contohnya adalah kamera. Ini adalah sensor yang menangkap gambar dan mengirimkannya sebagai data digital yang berisi gambar tersebut, biasanya dalam format terkompresi seperti JPEG, untuk dibaca oleh perangkat IoT. Kamera bahkan dapat melakukan streaming video dengan menangkap gambar dan mengirimkan gambar lengkap frame demi frame atau aliran video terkompresi. + +## Apa itu aktuator? + +Aktuator adalah kebalikan dari sensor - mereka mengubah sinyal listrik dari perangkat IoT Anda menjadi interaksi dengan dunia fisik seperti memancarkan cahaya atau suara, atau menggerakkan motor. + +Beberapa aktuator umum meliputi: + +* LED - memancarkan cahaya saat dinyalakan +* Speaker - memancarkan suara berdasarkan sinyal yang dikirimkan, mulai dari buzzer sederhana hingga speaker audio yang dapat memutar musik +* Motor stepper - mengubah sinyal menjadi jumlah rotasi tertentu, seperti memutar kenop 90° +* Relay - saklar yang dapat dinyalakan atau dimatikan oleh sinyal listrik. Relay memungkinkan tegangan kecil dari perangkat IoT untuk menyalakan tegangan yang lebih besar. +* Layar - aktuator yang lebih kompleks yang menampilkan informasi pada tampilan multi-segmen. Layar bervariasi dari tampilan LED sederhana hingga monitor video resolusi tinggi. + +✅ Lakukan penelitian. Aktuator apa saja yang dimiliki ponsel Anda? + +## Menggunakan aktuator + +Ikuti panduan yang relevan di bawah ini untuk menambahkan aktuator ke perangkat IoT Anda, yang dikendalikan oleh sensor, untuk membangun lampu malam IoT. Lampu ini akan mengumpulkan tingkat cahaya dari sensor cahaya, dan menggunakan aktuator berupa LED untuk memancarkan cahaya saat tingkat cahaya yang terdeteksi terlalu rendah. + +![Diagram alur tugas menunjukkan tingkat cahaya yang dibaca dan diperiksa, serta LED yang dikendalikan](../../../../../translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.id.png) + +* [Arduino - Wio Terminal](wio-terminal-actuator.md) +* [Komputer papan tunggal - Raspberry Pi](pi-actuator.md) +* [Komputer papan tunggal - Perangkat virtual](virtual-device-actuator.md) + +## Jenis-jenis aktuator + +Seperti sensor, aktuator dapat berupa analog atau digital. + +### Aktuator analog + +Aktuator analog menerima sinyal analog dan mengubahnya menjadi semacam interaksi, di mana interaksi tersebut berubah berdasarkan tegangan yang diberikan. + +Salah satu contohnya adalah lampu yang dapat diredupkan, seperti yang mungkin Anda miliki di rumah Anda. Jumlah tegangan yang diberikan ke lampu menentukan seberapa terang lampu tersebut. +![Cahaya redup pada tegangan rendah dan lebih terang pada tegangan tinggi](../../../../../translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.id.png) + +Seperti halnya sensor, perangkat IoT sebenarnya bekerja dengan sinyal digital, bukan analog. Ini berarti untuk mengirimkan sinyal analog, perangkat IoT memerlukan konverter digital ke analog (DAC), baik langsung pada perangkat IoT atau pada papan konektor. Konverter ini akan mengubah 0 dan 1 dari perangkat IoT menjadi tegangan analog yang dapat digunakan oleh aktuator. + +✅ Apa yang menurutmu akan terjadi jika perangkat IoT mengirimkan tegangan lebih tinggi daripada yang dapat ditangani oleh aktuator? +⛔️ JANGAN coba-coba melakukan ini. + +#### Modulasi Lebar Pulsa + +Pilihan lain untuk mengubah sinyal digital dari perangkat IoT menjadi sinyal analog adalah modulasi lebar pulsa (PWM). Ini melibatkan pengiriman banyak pulsa digital pendek yang bertindak seolah-olah itu adalah sinyal analog. + +Sebagai contoh, kamu dapat menggunakan PWM untuk mengontrol kecepatan motor. + +Bayangkan kamu mengontrol motor dengan suplai 5V. Kamu mengirimkan pulsa pendek ke motor, mengubah tegangan menjadi tinggi (5V) selama dua per seratus detik (0,02s). Dalam waktu tersebut, motor dapat berputar sepersepuluh putaran, atau 36°. Sinyal kemudian berhenti selama dua per seratus detik (0,02s), mengirimkan sinyal rendah (0V). Setiap siklus nyala lalu mati berlangsung selama 0,04s. Siklus ini kemudian berulang. + +![Rotasi motor dengan modulasi lebar pulsa pada 150 RPM](../../../../../translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.id.png) + +Ini berarti dalam satu detik kamu memiliki 25 pulsa 5V selama 0,02s yang memutar motor, masing-masing diikuti oleh jeda 0,02s dengan 0V yang tidak memutar motor. Setiap pulsa memutar motor sepersepuluh putaran, yang berarti motor menyelesaikan 2,5 putaran per detik. Kamu telah menggunakan sinyal digital untuk memutar motor pada 2,5 putaran per detik, atau 150 [putaran per menit](https://wikipedia.org/wiki/Revolutions_per_minute) (ukuran kecepatan rotasi yang tidak standar). + +```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 +``` + +> 🎓 Ketika sinyal PWM menyala selama setengah waktu, dan mati selama setengah waktu, ini disebut sebagai [siklus tugas 50%](https://wikipedia.org/wiki/Duty_cycle). Siklus tugas diukur sebagai persentase waktu sinyal berada dalam keadaan nyala dibandingkan dengan keadaan mati. + +![Rotasi motor dengan modulasi lebar pulsa pada 75 RPM](../../../../../translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.id.png) + +Kamu dapat mengubah kecepatan motor dengan mengubah ukuran pulsa. Sebagai contoh, dengan motor yang sama kamu dapat mempertahankan waktu siklus yang sama yaitu 0,04s, dengan pulsa nyala dipotong setengah menjadi 0,01s, dan pulsa mati meningkat menjadi 0,03s. Kamu memiliki jumlah pulsa per detik yang sama (25), tetapi setiap pulsa nyala hanya setengah panjangnya. Pulsa setengah panjang hanya memutar motor seperdua puluh putaran, dan pada 25 pulsa per detik akan menyelesaikan 1,25 putaran per detik atau 75rpm. Dengan mengubah kecepatan pulsa sinyal digital, kamu telah mengurangi kecepatan motor analog menjadi setengahnya. + +```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 +``` + +✅ Bagaimana kamu akan menjaga rotasi motor tetap halus, terutama pada kecepatan rendah? Apakah kamu akan menggunakan sejumlah kecil pulsa panjang dengan jeda panjang atau banyak pulsa sangat pendek dengan jeda sangat pendek? + +> 💁 Beberapa sensor juga menggunakan PWM untuk mengubah sinyal analog menjadi sinyal digital. + +> 🎓 Kamu dapat membaca lebih lanjut tentang modulasi lebar pulsa di [halaman modulasi lebar pulsa di Wikipedia](https://wikipedia.org/wiki/Pulse-width_modulation). + +### Aktuator Digital + +Aktuator digital, seperti sensor digital, memiliki dua keadaan yang dikontrol oleh tegangan tinggi atau rendah atau memiliki DAC bawaan sehingga dapat mengubah sinyal digital menjadi sinyal analog. + +Salah satu aktuator digital sederhana adalah LED. Ketika perangkat mengirimkan sinyal digital 1, tegangan tinggi dikirimkan yang menyalakan LED. Ketika sinyal digital 0 dikirimkan, tegangan turun menjadi 0V dan LED mati. + +![LED mati pada 0 volt dan menyala pada 5V](../../../../../translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.id.png) + +✅ Aktuator 2-keadaan sederhana apa lagi yang bisa kamu pikirkan? Salah satu contohnya adalah solenoid, yang merupakan elektromagnet yang dapat diaktifkan untuk melakukan hal-hal seperti menggerakkan baut pintu untuk mengunci/membuka kunci pintu. + +Aktuator digital yang lebih canggih, seperti layar, memerlukan data digital untuk dikirimkan dalam format tertentu. Mereka biasanya dilengkapi dengan pustaka yang mempermudah pengiriman data yang benar untuk mengontrolnya. + +--- + +## 🚀 Tantangan + +Tantangan dalam dua pelajaran terakhir adalah untuk mencantumkan sebanyak mungkin perangkat IoT yang ada di rumah, sekolah, atau tempat kerja kamu dan menentukan apakah perangkat tersebut dibangun di sekitar mikrokontroler atau komputer papan tunggal, atau bahkan campuran keduanya. + +Untuk setiap perangkat yang kamu cantumkan, sensor dan aktuator apa yang terhubung dengannya? Apa tujuan dari setiap sensor dan aktuator yang terhubung ke perangkat tersebut? + +## Kuis Pasca-Pelajaran + +[Kuis Pasca-Pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6) + +## Tinjauan & Studi Mandiri + +* Bacalah tentang listrik dan sirkuit di [ThingLearn](http://thinglearn.jenlooper.com/curriculum/). +* Bacalah tentang berbagai jenis sensor suhu di [Panduan Sensor Suhu Seeed Studios](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/) +* Bacalah tentang LED di [halaman LED Wikipedia](https://wikipedia.org/wiki/Light-emitting_diode) + +## Tugas + +[Penelitian sensor dan aktuator](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/3-sensors-and-actuators/assignment.md b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/assignment.md new file mode 100644 index 00000000..3bbe8bd4 --- /dev/null +++ b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/assignment.md @@ -0,0 +1,31 @@ + +# Penelitian sensor dan aktuator + +## Instruksi + +Pelajaran ini membahas sensor dan aktuator. Lakukan penelitian dan jelaskan satu sensor dan satu aktuator yang dapat digunakan dengan kit pengembangan IoT, termasuk: + +* Apa fungsinya +* Elektronik/perangkat keras yang digunakan di dalamnya +* Apakah analog atau digital +* Apa satuan dan rentang input atau pengukurannya + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Peningkatan | +| -------- | ------- | -------- | ----------------- | +| Jelaskan sensor | Menjelaskan sensor dengan detail untuk semua 4 bagian yang tercantum di atas. | Menjelaskan sensor, tetapi hanya mampu memberikan 2-3 bagian dari yang tercantum di atas. | Menjelaskan sensor, tetapi hanya mampu memberikan 1 bagian dari yang tercantum di atas. | +| Jelaskan aktuator | Menjelaskan aktuator dengan detail untuk semua 4 bagian yang tercantum di atas. | Menjelaskan aktuator, tetapi hanya mampu memberikan 2-3 bagian dari yang tercantum di atas. | Menjelaskan aktuator, tetapi hanya mampu memberikan 1 bagian dari yang tercantum di atas. | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md new file mode 100644 index 00000000..b836b53a --- /dev/null +++ b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md @@ -0,0 +1,130 @@ + +# Membuat Lampu Malam - Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan menambahkan LED ke Raspberry Pi Anda dan menggunakannya untuk membuat lampu malam. + +## Perangkat Keras + +Lampu malam sekarang membutuhkan aktuator. + +Aktuatornya adalah **LED**, sebuah [dioda pemancar cahaya](https://wikipedia.org/wiki/Light-emitting_diode) yang memancarkan cahaya ketika arus mengalir melaluinya. Ini adalah aktuator digital yang memiliki 2 keadaan, menyala dan mati. Mengirimkan nilai 1 akan menyalakan LED, dan nilai 0 akan mematikannya. LED adalah aktuator eksternal Grove dan perlu dihubungkan ke Grove Base hat pada Raspberry Pi. + +Logika lampu malam dalam pseudo-code adalah: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Hubungkan LED + +Grove LED hadir sebagai modul dengan beberapa pilihan LED, memungkinkan Anda memilih warna. + +#### Tugas - hubungkan LED + +Hubungkan LED. + +![Sebuah Grove LED](../../../../../translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.id.png) + +1. Pilih LED favorit Anda dan masukkan kaki-kakinya ke dalam dua lubang pada modul LED. + + LED adalah dioda pemancar cahaya, dan dioda adalah perangkat elektronik yang hanya dapat menghantarkan arus satu arah. Ini berarti LED harus dihubungkan dengan arah yang benar, jika tidak, LED tidak akan berfungsi. + + Salah satu kaki LED adalah pin positif, dan yang lainnya adalah pin negatif. LED tidak sepenuhnya bulat dan sedikit lebih datar di satu sisi. Sisi yang sedikit lebih datar adalah pin negatif. Saat Anda menghubungkan LED ke modul, pastikan pin di sisi yang bulat terhubung ke soket yang ditandai **+** di bagian luar modul, dan sisi yang lebih datar terhubung ke soket yang lebih dekat ke tengah modul. + +1. Modul LED memiliki tombol putar yang memungkinkan Anda mengontrol kecerahan. Putar tombol ini sepenuhnya ke atas terlebih dahulu dengan memutarnya berlawanan arah jarum jam sejauh mungkin menggunakan obeng kepala Phillips kecil. + +1. Masukkan salah satu ujung kabel Grove ke soket pada modul LED. Kabel ini hanya dapat masuk dengan satu arah. + +1. Dengan Raspberry Pi dalam keadaan mati, hubungkan ujung lain kabel Grove ke soket digital yang ditandai **D5** pada Grove Base hat yang terpasang pada Pi. Soket ini adalah soket kedua dari kiri, pada baris soket di sebelah pin GPIO. + +![Grove LED terhubung ke soket D5](../../../../../translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.id.png) + +## Program Lampu Malam + +Lampu malam sekarang dapat diprogram menggunakan sensor cahaya Grove dan LED Grove. + +### Tugas - program lampu malam + +Program lampu malam. + +1. Nyalakan Pi dan tunggu hingga selesai booting. + +1. Buka proyek lampu malam di VS Code yang telah Anda buat pada bagian sebelumnya dari tugas ini, baik yang dijalankan langsung di Pi atau yang terhubung menggunakan ekstensi Remote SSH. + +1. Tambahkan kode berikut ke file `app.py` untuk mengimpor pustaka yang diperlukan. Kode ini harus ditambahkan di bagian atas, di bawah baris `import` lainnya. + + ```python + from grove.grove_led import GroveLed + ``` + + Pernyataan `from grove.grove_led import GroveLed` mengimpor `GroveLed` dari pustaka Python Grove. Pustaka ini memiliki kode untuk berinteraksi dengan Grove LED. + +1. Tambahkan kode berikut setelah deklarasi `light_sensor` untuk membuat instance dari kelas yang mengelola LED: + + ```python + led = GroveLed(5) + ``` + + Baris `led = GroveLed(5)` membuat instance dari kelas `GroveLed` yang terhubung ke pin **D5** - pin digital Grove tempat LED terhubung. + + > 💁 Semua soket memiliki nomor pin unik. Pin 0, 2, 4, dan 6 adalah pin analog, sedangkan pin 5, 16, 18, 22, 24, dan 26 adalah pin digital. + +1. Tambahkan pemeriksaan di dalam `while` loop, dan sebelum `time.sleep` untuk memeriksa tingkat cahaya dan menyalakan atau mematikan LED: + + ```python + if light < 300: + led.on() + else: + led.off() + ``` + + Kode ini memeriksa nilai `light`. Jika nilainya kurang dari 300, kode akan memanggil metode `on` dari kelas `GroveLed` yang mengirimkan nilai digital 1 ke LED, menyalakannya. Jika nilai cahaya lebih besar atau sama dengan 300, kode akan memanggil metode `off`, mengirimkan nilai digital 0 ke LED, mematikannya. + + > 💁 Kode ini harus diberi indentasi pada tingkat yang sama dengan baris `print('Light level:', light)` agar berada di dalam while loop! + + > 💁 Saat mengirimkan nilai digital ke aktuator, nilai 0 adalah 0V, dan nilai 1 adalah tegangan maksimum untuk perangkat. Untuk Raspberry Pi dengan sensor dan aktuator Grove, tegangan 1 adalah 3.3V. + +1. Dari Terminal VS Code, jalankan perintah berikut untuk menjalankan aplikasi Python Anda: + + ```sh + python3 app.py + ``` + + Nilai cahaya akan ditampilkan di konsol. + + ```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. Tutup dan buka sensor cahaya. Perhatikan bagaimana LED akan menyala jika tingkat cahaya 300 atau kurang, dan mati ketika tingkat cahaya lebih besar dari 300. + + > 💁 Jika LED tidak menyala, pastikan LED terhubung dengan arah yang benar, dan tombol putar diatur ke posisi penuh menyala. + +![LED yang terhubung ke Pi menyala dan mati sesuai perubahan tingkat cahaya](../../../../../images/pi-running-assignment-1-1.gif) + +> 💁 Anda dapat menemukan kode ini di folder [code-actuator/pi](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/pi). + +😀 Program lampu malam Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md new file mode 100644 index 00000000..fa036c1f --- /dev/null +++ b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md @@ -0,0 +1,110 @@ + +# Membuat Lampu Malam - Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor cahaya ke Raspberry Pi Anda. + +## Perangkat Keras + +Sensor untuk pelajaran ini adalah **sensor cahaya** yang menggunakan [fotodioda](https://wikipedia.org/wiki/Photodiode) untuk mengubah cahaya menjadi sinyal listrik. Ini adalah sensor analog yang mengirimkan nilai integer dari 0 hingga 1.000 yang menunjukkan jumlah relatif cahaya, tetapi tidak sesuai dengan satuan pengukuran standar seperti [lux](https://wikipedia.org/wiki/Lux). + +Sensor cahaya ini adalah sensor Grove eksternal dan perlu dihubungkan ke Grove Base hat pada Raspberry Pi. + +### Hubungkan Sensor Cahaya + +Sensor cahaya Grove yang digunakan untuk mendeteksi tingkat cahaya perlu dihubungkan ke Raspberry Pi. + +#### Tugas - Hubungkan Sensor Cahaya + +Hubungkan sensor cahaya. + +![Sensor cahaya Grove](../../../../../translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.id.png) + +1. Masukkan salah satu ujung kabel Grove ke soket pada modul sensor cahaya. Kabel hanya dapat masuk dengan satu arah. + +1. Dengan Raspberry Pi dalam keadaan mati, hubungkan ujung lain kabel Grove ke soket analog yang diberi tanda **A0** pada Grove Base hat yang terpasang pada Pi. Soket ini adalah soket kedua dari kanan, pada baris soket di sebelah pin GPIO. + +![Sensor cahaya Grove terhubung ke soket A0](../../../../../translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.id.png) + +## Program Sensor Cahaya + +Perangkat sekarang dapat diprogram menggunakan sensor cahaya Grove. + +### Tugas - Program Sensor Cahaya + +Program perangkat. + +1. Nyalakan Pi dan tunggu hingga selesai booting. + +1. Buka proyek lampu malam di VS Code yang telah Anda buat pada bagian sebelumnya dari tugas ini, baik langsung di Pi atau terhubung menggunakan ekstensi Remote SSH. + +1. Buka file `app.py` dan hapus semua kode di dalamnya. + +1. Tambahkan kode berikut ke file `app.py` untuk mengimpor beberapa pustaka yang diperlukan: + + ```python + import time + from grove.grove_light_sensor_v1_2 import GroveLightSensor + ``` + + Pernyataan `import time` mengimpor modul `time` yang akan digunakan nanti dalam tugas ini. + + Pernyataan `from grove.grove_light_sensor_v1_2 import GroveLightSensor` mengimpor `GroveLightSensor` dari pustaka Python Grove. Pustaka ini memiliki kode untuk berinteraksi dengan sensor cahaya Grove, dan telah diinstal secara global selama pengaturan Pi. + +1. Tambahkan kode berikut setelah kode di atas untuk membuat instance dari kelas yang mengelola sensor cahaya: + + ```python + light_sensor = GroveLightSensor(0) + ``` + + Baris `light_sensor = GroveLightSensor(0)` membuat instance dari kelas `GroveLightSensor` yang terhubung ke pin **A0** - pin analog Grove tempat sensor cahaya terhubung. + +1. Tambahkan loop tak terbatas setelah kode di atas untuk membaca nilai sensor cahaya dan mencetaknya ke konsol: + + ```python + while True: + light = light_sensor.light + print('Light level:', light) + ``` + + Ini akan membaca tingkat cahaya saat ini dalam skala 0-1.023 menggunakan properti `light` dari kelas `GroveLightSensor`. Properti ini membaca nilai analog dari pin. Nilai ini kemudian dicetak ke konsol. + +1. Tambahkan jeda kecil selama satu detik di akhir `loop` karena tingkat cahaya tidak perlu diperiksa secara terus-menerus. Jeda ini mengurangi konsumsi daya perangkat. + + ```python + time.sleep(1) + ``` + +1. Dari Terminal VS Code, jalankan perintah berikut untuk menjalankan aplikasi Python Anda: + + ```sh + python3 app.py + ``` + + Nilai cahaya akan ditampilkan di konsol. Tutup dan buka sensor cahaya, dan nilai akan berubah: + + ```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 + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-sensor/pi](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/pi). + +😀 Menambahkan sensor ke program lampu malam Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md new file mode 100644 index 00000000..4539a1ae --- /dev/null +++ b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md @@ -0,0 +1,124 @@ + +# Membangun Lampu Malam - Perangkat IoT Virtual + +Dalam bagian pelajaran ini, Anda akan menambahkan LED ke perangkat IoT virtual Anda dan menggunakannya untuk membuat lampu malam. + +## Perangkat Keras Virtual + +Lampu malam membutuhkan satu aktuator, yang dibuat di aplikasi CounterFit. + +Aktuator tersebut adalah **LED**. Pada perangkat IoT fisik, ini akan menjadi [dioda pancaran cahaya](https://wikipedia.org/wiki/Light-emitting_diode) yang memancarkan cahaya ketika arus mengalir melaluinya. Ini adalah aktuator digital yang memiliki 2 keadaan, menyala dan mati. Mengirimkan nilai 1 akan menyalakan LED, dan nilai 0 akan mematikannya. + +Logika lampu malam dalam pseudo-code adalah: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Menambahkan aktuator ke CounterFit + +Untuk menggunakan LED virtual, Anda perlu menambahkannya ke aplikasi CounterFit. + +#### Tugas - menambahkan aktuator ke CounterFit + +Tambahkan LED ke aplikasi CounterFit. + +1. Pastikan aplikasi web CounterFit berjalan dari bagian sebelumnya dalam tugas ini. Jika tidak, jalankan kembali dan tambahkan sensor cahaya. + +1. Buat sebuah LED: + + 1. Di kotak *Create actuator* pada panel *Actuator*, buka menu drop-down *Actuator type* dan pilih *LED*. + + 1. Atur *Pin* ke *5*. + + 1. Pilih tombol **Add** untuk membuat LED pada Pin 5. + + ![Pengaturan LED](../../../../../translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.id.png) + + LED akan dibuat dan muncul di daftar aktuator. + + ![LED yang telah dibuat](../../../../../translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.id.png) + + Setelah LED dibuat, Anda dapat mengubah warnanya menggunakan pemilih *Color*. Pilih tombol **Set** untuk mengubah warna setelah Anda memilihnya. + +### Memprogram lampu malam + +Lampu malam sekarang dapat diprogram menggunakan sensor cahaya dan LED di CounterFit. + +#### Tugas - memprogram lampu malam + +Program lampu malam. + +1. Buka proyek lampu malam di VS Code yang Anda buat pada bagian sebelumnya dari tugas ini. Matikan dan buat ulang terminal untuk memastikan terminal berjalan menggunakan lingkungan virtual jika diperlukan. + +1. Buka file `app.py`. + +1. Tambahkan kode berikut ke file `app.py` untuk mengimpor pustaka yang diperlukan. Kode ini harus ditambahkan di bagian atas, di bawah baris `import` lainnya. + + ```python + from counterfit_shims_grove.grove_led import GroveLed + ``` + + Pernyataan `from counterfit_shims_grove.grove_led import GroveLed` mengimpor `GroveLed` dari pustaka Python CounterFit Grove shim. Pustaka ini memiliki kode untuk berinteraksi dengan LED yang dibuat di aplikasi CounterFit. + +1. Tambahkan kode berikut setelah deklarasi `light_sensor` untuk membuat instance dari kelas yang mengelola LED: + + ```python + led = GroveLed(5) + ``` + + Baris `led = GroveLed(5)` membuat instance dari kelas `GroveLed` yang terhubung ke pin **5** - pin CounterFit Grove tempat LED terhubung. + +1. Tambahkan pemeriksaan di dalam `while` loop, dan sebelum `time.sleep` untuk memeriksa tingkat cahaya dan menyalakan atau mematikan LED: + + ```python + if light < 300: + led.on() + else: + led.off() + ``` + + Kode ini memeriksa nilai `light`. Jika nilainya kurang dari 300, kode akan memanggil metode `on` dari kelas `GroveLed` yang mengirimkan nilai digital 1 ke LED, menyalakannya. Jika nilai cahaya lebih besar atau sama dengan 300, kode akan memanggil metode `off`, mengirimkan nilai digital 0 ke LED, mematikannya. + + > 💁 Kode ini harus diberi indentasi pada level yang sama dengan baris `print('Light level:', light)` agar berada di dalam loop while! + +1. Dari Terminal VS Code, jalankan perintah berikut untuk menjalankan aplikasi Python Anda: + + ```sh + python3 app.py + ``` + + Nilai cahaya akan ditampilkan di konsol. + + ```output + (.venv) ➜ GroveTest python3 app.py + Light level: 143 + Light level: 244 + Light level: 246 + Light level: 253 + ``` + +1. Ubah pengaturan *Value* atau *Random* untuk memvariasikan tingkat cahaya di atas dan di bawah 300. LED akan menyala dan mati. + +![LED di aplikasi CounterFit menyala dan mati saat tingkat cahaya berubah](../../../../../images/virtual-device-running-assignment-1-1.gif) + +> 💁 Anda dapat menemukan kode ini di folder [code-actuator/virtual-device](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/virtual-device). + +😀 Program lampu malam Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md new file mode 100644 index 00000000..ce31c8eb --- /dev/null +++ b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md @@ -0,0 +1,124 @@ + +# Membangun Lampu Malam - Perangkat IoT Virtual + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor cahaya ke perangkat IoT virtual Anda. + +## Perangkat Keras Virtual + +Lampu malam membutuhkan satu sensor, yang dibuat di aplikasi CounterFit. + +Sensor tersebut adalah **sensor cahaya**. Pada perangkat IoT fisik, sensor ini akan berupa [fotodioda](https://wikipedia.org/wiki/Photodiode) yang mengubah cahaya menjadi sinyal listrik. Sensor cahaya adalah sensor analog yang mengirimkan nilai integer yang menunjukkan jumlah relatif cahaya, yang tidak sesuai dengan satuan pengukuran standar seperti [lux](https://wikipedia.org/wiki/Lux). + +### Menambahkan Sensor ke CounterFit + +Untuk menggunakan sensor cahaya virtual, Anda perlu menambahkannya ke aplikasi CounterFit. + +#### Tugas - Menambahkan Sensor ke CounterFit + +Tambahkan sensor cahaya ke aplikasi CounterFit. + +1. Pastikan aplikasi web CounterFit berjalan dari bagian sebelumnya dalam tugas ini. Jika tidak, jalankan kembali. + +1. Buat sensor cahaya: + + 1. Di kotak *Create sensor* pada panel *Sensors*, buka menu dropdown *Sensor type* dan pilih *Light*. + + 1. Biarkan *Units* tetap diatur ke *NoUnits*. + + 1. Pastikan *Pin* diatur ke *0*. + + 1. Pilih tombol **Add** untuk membuat sensor cahaya pada Pin 0. + + ![Pengaturan sensor cahaya](../../../../../translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.id.png) + + Sensor cahaya akan dibuat dan muncul di daftar sensor. + + ![Sensor cahaya dibuat](../../../../../translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.id.png) + +## Memprogram Sensor Cahaya + +Perangkat sekarang dapat diprogram untuk menggunakan sensor cahaya bawaan. + +### Tugas - Memprogram Sensor Cahaya + +Program perangkat Anda. + +1. Buka proyek lampu malam di VS Code yang Anda buat pada bagian sebelumnya dalam tugas ini. Matikan dan buat ulang terminal untuk memastikan terminal berjalan menggunakan lingkungan virtual jika diperlukan. + +1. Buka file `app.py`. + +1. Tambahkan kode berikut ke bagian atas file `app.py` bersama dengan pernyataan `import` lainnya untuk mengimpor beberapa pustaka yang diperlukan: + + ```python + import time + from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor + ``` + + Pernyataan `import time` mengimpor modul Python `time` yang akan digunakan nanti dalam tugas ini. + + Pernyataan `from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor` mengimpor `GroveLightSensor` dari pustaka Python CounterFit Grove shim. Pustaka ini memiliki kode untuk berinteraksi dengan sensor cahaya yang dibuat di aplikasi CounterFit. + +1. Tambahkan kode berikut ke bagian bawah file untuk membuat instance dari kelas yang mengelola sensor cahaya: + + ```python + light_sensor = GroveLightSensor(0) + ``` + + Baris `light_sensor = GroveLightSensor(0)` membuat instance dari kelas `GroveLightSensor` yang terhubung ke pin **0** - pin CounterFit Grove tempat sensor cahaya terhubung. + +1. Tambahkan loop tak terbatas setelah kode di atas untuk membaca nilai sensor cahaya dan mencetaknya ke konsol: + + ```python + while True: + light = light_sensor.light + print('Light level:', light) + ``` + + Ini akan membaca tingkat cahaya saat ini menggunakan properti `light` dari kelas `GroveLightSensor`. Properti ini membaca nilai analog dari pin. Nilai ini kemudian dicetak ke konsol. + +1. Tambahkan jeda kecil selama satu detik di akhir `while` loop karena tingkat cahaya tidak perlu diperiksa secara terus-menerus. Jeda ini mengurangi konsumsi daya perangkat. + + ```python + time.sleep(1) + ``` + +1. Dari Terminal VS Code, jalankan perintah berikut untuk menjalankan aplikasi Python Anda: + + ```sh + python3 app.py + ``` + + Nilai cahaya akan ditampilkan di konsol. Awalnya, nilai ini akan menjadi 0. + +1. Dari aplikasi CounterFit, ubah nilai sensor cahaya yang akan dibaca oleh aplikasi. Anda dapat melakukannya dengan dua cara: + + * Masukkan angka di kotak *Value* untuk sensor cahaya, lalu pilih tombol **Set**. Angka yang Anda masukkan akan menjadi nilai yang dikembalikan oleh sensor. + + * Centang kotak *Random*, dan masukkan nilai *Min* dan *Max*, lalu pilih tombol **Set**. Setiap kali sensor membaca nilai, sensor akan membaca angka acak antara *Min* dan *Max*. + + Nilai yang Anda atur akan ditampilkan di konsol. Ubah *Value* atau pengaturan *Random* untuk membuat nilai berubah. + + ```output + (.venv) ➜ GroveTest python3 app.py + Light level: 143 + Light level: 244 + Light level: 246 + Light level: 253 + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-sensor/virtual-device](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/virtual-device). + +😀 Program lampu malam Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md new file mode 100644 index 00000000..97e1298c --- /dev/null +++ b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md @@ -0,0 +1,124 @@ + +# Membuat Lampu Malam - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan menambahkan LED ke Wio Terminal Anda dan menggunakannya untuk membuat lampu malam. + +## Perangkat Keras + +Lampu malam sekarang membutuhkan aktuator. + +Aktuatornya adalah **LED**, sebuah [dioda pemancar cahaya](https://wikipedia.org/wiki/Light-emitting_diode) yang memancarkan cahaya ketika arus mengalir melaluinya. Ini adalah aktuator digital yang memiliki 2 keadaan, menyala dan mati. Mengirimkan nilai 1 akan menyalakan LED, dan nilai 0 akan mematikannya. Ini adalah aktuator Grove eksternal yang perlu dihubungkan ke Wio Terminal. + +Logika lampu malam dalam pseudo-code adalah: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Hubungkan LED + +Grove LED hadir sebagai modul dengan beberapa pilihan LED, memungkinkan Anda memilih warna. + +#### Tugas - hubungkan LED + +Hubungkan LED. + +![Sebuah Grove LED](../../../../../translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.id.png) + +1. Pilih LED favorit Anda dan masukkan kaki-kakinya ke dalam dua lubang pada modul LED. + + LED adalah dioda pemancar cahaya, dan dioda adalah perangkat elektronik yang hanya dapat menghantarkan arus dalam satu arah. Ini berarti LED harus dihubungkan dengan arah yang benar, jika tidak, LED tidak akan berfungsi. + + Salah satu kaki LED adalah pin positif, dan yang lainnya adalah pin negatif. LED tidak sepenuhnya bulat, dan sedikit lebih datar di satu sisi. Sisi yang sedikit lebih datar adalah pin negatif. Saat Anda menghubungkan LED ke modul, pastikan pin di sisi yang lebih bulat terhubung ke soket yang ditandai **+** di bagian luar modul, dan sisi yang lebih datar terhubung ke soket yang lebih dekat ke tengah modul. + +1. Modul LED memiliki tombol putar yang memungkinkan Anda mengontrol kecerahan. Putar tombol ini sepenuhnya ke atas dengan memutarnya berlawanan arah jarum jam sejauh mungkin menggunakan obeng kepala Phillips kecil. + +1. Masukkan salah satu ujung kabel Grove ke soket pada modul LED. Kabel ini hanya dapat dimasukkan dengan satu arah. + +1. Dengan Wio Terminal terputus dari komputer atau sumber daya lainnya, hubungkan ujung lain kabel Grove ke soket Grove di sisi kanan Wio Terminal saat Anda melihat layar. Ini adalah soket yang paling jauh dari tombol daya. + + > 💁 Soket Grove di sisi kanan dapat digunakan dengan sensor dan aktuator analog atau digital. Soket di sisi kiri hanya untuk sensor dan aktuator digital. C akan dibahas dalam pelajaran berikutnya. + +![Grove LED terhubung ke soket kanan](../../../../../translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.id.png) + +## Memprogram Lampu Malam + +Lampu malam sekarang dapat diprogram menggunakan sensor cahaya bawaan dan Grove LED. + +### Tugas - memprogram lampu malam + +Program lampu malam. + +1. Buka proyek lampu malam di VS Code yang telah Anda buat pada bagian sebelumnya dari tugas ini. + +1. Tambahkan baris berikut ke bagian bawah fungsi `setup`: + + ```cpp + pinMode(D0, OUTPUT); + ``` + + Baris ini mengonfigurasi pin yang digunakan untuk berkomunikasi dengan LED melalui port Grove. + + Pin `D0` adalah pin digital untuk soket Grove di sisi kanan. Pin ini diatur ke `OUTPUT`, yang berarti pin ini terhubung ke aktuator dan data akan ditulis ke pin tersebut. + +1. Tambahkan kode berikut segera sebelum `delay` di fungsi loop: + + ```cpp + if (light < 300) + { + digitalWrite(D0, HIGH); + } + else + { + digitalWrite(D0, LOW); + } + ``` + + Kode ini memeriksa nilai `light`. Jika nilainya kurang dari 300, kode ini mengirimkan nilai `HIGH` ke pin digital `D0`. Nilai `HIGH` adalah nilai 1, yang menyalakan LED. Jika nilai cahaya lebih besar atau sama dengan 300, nilai `LOW` sebesar 0 dikirimkan ke pin, yang mematikan LED. + + > 💁 Saat mengirimkan nilai digital ke aktuator, nilai LOW adalah 0v, dan nilai HIGH adalah tegangan maksimum untuk perangkat. Untuk Wio Terminal, tegangan HIGH adalah 3.3V. + +1. Sambungkan kembali Wio Terminal ke komputer Anda, dan unggah kode baru seperti yang telah Anda lakukan sebelumnya. + +1. Sambungkan Serial Monitor. Nilai cahaya akan ditampilkan di 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 + ``` + +1. Tutup dan buka sensor cahaya. Perhatikan bagaimana LED akan menyala jika tingkat cahaya 300 atau kurang, dan mati ketika tingkat cahaya lebih besar dari 300. + +![LED yang terhubung ke WIO menyala dan mati saat tingkat cahaya berubah](../../../../../images/wio-running-assignment-1-1.gif) + +> 💁 Anda dapat menemukan kode ini di folder [code-actuator/wio-terminal](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/wio-terminal). + +😀 Program lampu malam Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md new file mode 100644 index 00000000..3a80cdaa --- /dev/null +++ b/translations/id/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md @@ -0,0 +1,87 @@ + +# Menambahkan Sensor - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan menggunakan sensor cahaya pada Wio Terminal Anda. + +## Perangkat Keras + +Sensor untuk pelajaran ini adalah **sensor cahaya** yang menggunakan [fotodioda](https://wikipedia.org/wiki/Photodiode) untuk mengubah cahaya menjadi sinyal listrik. Ini adalah sensor analog yang mengirimkan nilai integer dari 0 hingga 1.023, yang menunjukkan jumlah relatif cahaya tanpa mengacu pada satuan pengukuran standar seperti [lux](https://wikipedia.org/wiki/Lux). + +Sensor cahaya ini sudah terpasang di Wio Terminal dan terlihat melalui jendela plastik transparan di bagian belakang. + +![Sensor cahaya di bagian belakang Wio Terminal](../../../../../translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.id.png) + +## Memprogram Sensor Cahaya + +Sekarang perangkat dapat diprogram untuk menggunakan sensor cahaya bawaan. + +### Tugas + +Program perangkat. + +1. Buka proyek nightlight di VS Code yang telah Anda buat pada bagian sebelumnya dari tugas ini. + +1. Tambahkan baris berikut ke bagian bawah fungsi `setup`: + + ```cpp + pinMode(WIO_LIGHT, INPUT); + ``` + + Baris ini mengonfigurasi pin yang digunakan untuk berkomunikasi dengan perangkat keras sensor. + + Pin `WIO_LIGHT` adalah nomor pin GPIO yang terhubung ke sensor cahaya bawaan. Pin ini diatur ke `INPUT`, yang berarti pin ini terhubung ke sensor dan data akan dibaca dari pin tersebut. + +1. Hapus isi dari fungsi `loop`. + +1. Tambahkan kode berikut ke fungsi `loop` yang sekarang kosong. + + ```cpp + int light = analogRead(WIO_LIGHT); + Serial.print("Light value: "); + Serial.println(light); + ``` + + Kode ini membaca nilai analog dari pin `WIO_LIGHT`. Nilai ini berkisar dari 0-1.023 yang berasal dari sensor cahaya bawaan. Nilai ini kemudian dikirim ke port serial sehingga Anda dapat membacanya di Serial Monitor saat kode ini berjalan. `Serial.print` menulis teks tanpa baris baru di akhir, sehingga setiap baris akan dimulai dengan `Light value:` dan diakhiri dengan nilai cahaya sebenarnya. + +1. Tambahkan jeda kecil selama satu detik (1.000ms) di akhir `loop`, karena tingkat cahaya tidak perlu diperiksa secara terus-menerus. Jeda ini mengurangi konsumsi daya perangkat. + + ```cpp + delay(1000); + ``` + +1. Sambungkan kembali Wio Terminal ke komputer Anda, dan unggah kode baru seperti yang Anda lakukan sebelumnya. + +1. Hubungkan Serial Monitor. Nilai cahaya akan ditampilkan di terminal. Tutup dan buka sensor cahaya di bagian belakang Wio Terminal, dan nilai-nilai tersebut akan berubah. + + ```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 + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-sensor/wio-terminal](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/wio-terminal). + +😀 Menambahkan sensor ke program nightlight Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/4-connect-internet/README.md b/translations/id/1-getting-started/lessons/4-connect-internet/README.md new file mode 100644 index 00000000..bbd678aa --- /dev/null +++ b/translations/id/1-getting-started/lessons/4-connect-internet/README.md @@ -0,0 +1,466 @@ + +# Hubungkan perangkat Anda ke Internet + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +Pelajaran ini diajarkan sebagai bagian dari [seri Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) dari [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Pelajaran ini disampaikan dalam 2 video - satu pelajaran berdurasi 1 jam, dan satu sesi tanya jawab berdurasi 1 jam yang membahas lebih dalam bagian-bagian pelajaran dan menjawab pertanyaan. + +[![Pelajaran 4: Hubungkan Perangkat Anda ke Internet](https://img.youtube.com/vi/O4dd172mZhs/0.jpg)](https://youtu.be/O4dd172mZhs) + +[![Pelajaran 4: Hubungkan Perangkat Anda ke Internet - Sesi Tanya Jawab](https://img.youtube.com/vi/j-cVCzRDE2Q/0.jpg)](https://youtu.be/j-cVCzRDE2Q) + +> 🎥 Klik gambar di atas untuk menonton video + +## Kuis sebelum pelajaran + +[Kuis sebelum pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/7) + +## Pendahuluan + +Huruf **I** dalam IoT adalah singkatan dari **Internet** - konektivitas cloud dan layanan yang memungkinkan banyak fitur perangkat IoT, mulai dari mengumpulkan pengukuran dari sensor yang terhubung ke perangkat, hingga mengirim pesan untuk mengontrol aktuator. Perangkat IoT biasanya terhubung ke satu layanan cloud IoT menggunakan protokol komunikasi standar, dan layanan tersebut terhubung ke seluruh aplikasi IoT Anda, mulai dari layanan AI untuk membuat keputusan cerdas berdasarkan data Anda, hingga aplikasi web untuk kontrol atau pelaporan. + +> 🎓 Data yang dikumpulkan dari sensor dan dikirim ke cloud disebut telemetri. + +Perangkat IoT dapat menerima pesan dari cloud. Seringkali pesan ini berisi perintah - yaitu instruksi untuk melakukan suatu tindakan baik secara internal (seperti reboot atau memperbarui firmware), atau menggunakan aktuator (seperti menyalakan lampu). + +Pelajaran ini memperkenalkan beberapa protokol komunikasi yang dapat digunakan perangkat IoT untuk terhubung ke cloud, dan jenis data yang mungkin mereka kirim atau terima. Anda juga akan mempraktikkannya, menambahkan kontrol internet ke lampu malam Anda, memindahkan logika kontrol LED ke kode 'server' yang berjalan secara lokal. + +Dalam pelajaran ini kita akan membahas: + +* [Protokol komunikasi](../../../../../1-getting-started/lessons/4-connect-internet) +* [Message Queueing Telemetry Transport (MQTT)](../../../../../1-getting-started/lessons/4-connect-internet) +* [Telemetri](../../../../../1-getting-started/lessons/4-connect-internet) +* [Perintah](../../../../../1-getting-started/lessons/4-connect-internet) + +## Protokol komunikasi + +Ada sejumlah protokol komunikasi populer yang digunakan oleh perangkat IoT untuk berkomunikasi dengan Internet. Yang paling populer berbasis pada pesan publish/subscribe melalui semacam broker. Perangkat IoT terhubung ke broker dan mempublikasikan telemetri serta berlangganan perintah. Layanan cloud juga terhubung ke broker dan berlangganan semua pesan telemetri serta mempublikasikan perintah baik ke perangkat tertentu, atau ke grup perangkat. + +![Perangkat IoT terhubung ke broker dan mempublikasikan telemetri serta berlangganan perintah. Layanan cloud terhubung ke broker dan berlangganan semua telemetri serta mengirim perintah ke perangkat tertentu.](../../../../../translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.id.png) + +MQTT adalah protokol komunikasi paling populer untuk perangkat IoT dan akan dibahas dalam pelajaran ini. Protokol lainnya termasuk AMQP dan HTTP/HTTPS. + +## Message Queueing Telemetry Transport (MQTT) + +[MQTT](http://mqtt.org) adalah protokol pesan standar terbuka yang ringan yang dapat mengirim pesan antar perangkat. Protokol ini dirancang pada tahun 1999 untuk memantau pipa minyak, sebelum dirilis sebagai standar terbuka 15 tahun kemudian oleh IBM. + +MQTT memiliki satu broker dan beberapa klien. Semua klien terhubung ke broker, dan broker merutekan pesan ke klien yang relevan. Pesan dirutekan menggunakan topik bernama, bukan dikirim langsung ke klien individu. Klien dapat mempublikasikan ke topik, dan klien mana pun yang berlangganan topik tersebut akan menerima pesan. + +![Perangkat IoT mempublikasikan telemetri pada topik /telemetry, dan layanan cloud berlangganan topik tersebut](../../../../../translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.id.png) + +✅ Lakukan riset. Jika Anda memiliki banyak perangkat IoT, bagaimana Anda dapat memastikan broker MQTT Anda dapat menangani semua pesan? + +### Hubungkan perangkat IoT Anda ke MQTT + +Bagian pertama dari menambahkan kontrol Internet ke lampu malam Anda adalah menghubungkannya ke broker MQTT. + +#### Tugas + +Hubungkan perangkat Anda ke broker MQTT. + +Dalam bagian pelajaran ini, Anda akan menghubungkan lampu malam IoT Anda ke internet untuk memungkinkan kontrol jarak jauh. Nanti dalam pelajaran ini, perangkat IoT Anda akan mengirim pesan telemetri melalui MQTT ke broker MQTT publik dengan tingkat cahaya, di mana pesan tersebut akan diambil oleh beberapa kode server yang akan Anda tulis. Kode ini akan memeriksa tingkat cahaya dan mengirim pesan perintah kembali ke perangkat yang memberitahunya untuk menyalakan atau mematikan LED. + +Kasus penggunaan dunia nyata untuk pengaturan semacam ini bisa berupa mengumpulkan data dari beberapa sensor cahaya sebelum memutuskan untuk menyalakan lampu, di lokasi yang memiliki banyak lampu, seperti stadion. Ini dapat mencegah lampu menyala jika hanya satu sensor yang tertutup awan atau burung, tetapi sensor lainnya mendeteksi cukup cahaya. + +✅ Situasi lain apa yang memerlukan data dari beberapa sensor untuk dievaluasi sebelum mengirim perintah? + +Daripada menangani kompleksitas pengaturan broker MQTT sebagai bagian dari tugas ini, Anda dapat menggunakan server uji publik yang menjalankan [Eclipse Mosquitto](https://www.mosquitto.org), broker MQTT sumber terbuka. Broker uji ini tersedia secara publik di [test.mosquitto.org](https://test.mosquitto.org), dan tidak memerlukan akun untuk disiapkan, menjadikannya alat yang hebat untuk menguji klien dan server MQTT. + +> 💁 Broker uji ini bersifat publik dan tidak aman. Siapa pun dapat mendengarkan apa yang Anda publikasikan, jadi tidak boleh digunakan dengan data apa pun yang perlu dirahasiakan. + +![Diagram alur tugas menunjukkan tingkat cahaya yang dibaca dan diperiksa, serta LED yang dikontrol](../../../../../translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.id.png) + +Ikuti langkah yang relevan di bawah ini untuk menghubungkan perangkat Anda ke broker MQTT: + +* [Arduino - Wio Terminal](wio-terminal-mqtt.md) +* [Komputer papan tunggal - Raspberry Pi/Perangkat IoT Virtual](single-board-computer-mqtt.md) + +### Penjelasan lebih dalam tentang MQTT + +Topik dapat memiliki hierarki, dan klien dapat berlangganan berbagai level hierarki menggunakan wildcard. Sebagai contoh, Anda dapat mengirim pesan telemetri suhu ke topik `/telemetry/temperature` dan pesan kelembapan ke topik `/telemetry/humidity`, lalu dalam aplikasi cloud Anda berlangganan ke topik `/telemetry/*` untuk menerima pesan telemetri suhu dan kelembapan. + +Pesan dapat dikirim dengan kualitas layanan (QoS), yang menentukan jaminan pesan diterima. + +* Paling banyak sekali - pesan dikirim hanya sekali dan klien serta broker tidak mengambil langkah tambahan untuk mengakui pengiriman (fire and forget). +* Setidaknya sekali - pesan dikirim ulang oleh pengirim beberapa kali hingga pengakuan diterima (acknowledged delivery). +* Tepat sekali - pengirim dan penerima melakukan jabat tangan dua tingkat untuk memastikan hanya satu salinan pesan yang diterima (assured delivery). + +✅ Situasi apa yang mungkin memerlukan pesan dengan pengiriman terjamin dibandingkan pesan fire and forget? + +Meskipun namanya adalah Message Queueing (inisial dalam MQTT), sebenarnya protokol ini tidak mendukung antrian pesan. Ini berarti jika klien terputus, lalu terhubung kembali, klien tidak akan menerima pesan yang dikirim selama pemutusan, kecuali untuk pesan yang sudah mulai diproses menggunakan proses QoS. Pesan dapat memiliki flag yang disimpan. Jika flag ini diatur, broker MQTT akan menyimpan pesan terakhir yang dikirim pada topik dengan flag ini, dan mengirimkannya ke klien mana pun yang kemudian berlangganan topik tersebut. Dengan cara ini, klien akan selalu mendapatkan pesan terbaru. + +MQTT juga mendukung fungsi keep alive yang memeriksa apakah koneksi masih aktif selama jeda panjang antara pesan. + +> 🦟 [Mosquitto dari Eclipse Foundation](https://mosquitto.org) memiliki broker MQTT gratis yang dapat Anda jalankan sendiri untuk bereksperimen dengan MQTT, serta broker MQTT publik yang dapat Anda gunakan untuk menguji kode Anda, yang dihosting di [test.mosquitto.org](https://test.mosquitto.org). + +Koneksi MQTT dapat bersifat publik dan terbuka, atau dienkripsi dan diamankan menggunakan nama pengguna dan kata sandi, atau sertifikat. + +> 💁 MQTT berkomunikasi melalui TCP/IP, protokol jaringan dasar yang sama seperti HTTP, tetapi pada port yang berbeda. Anda juga dapat menggunakan MQTT melalui websockets untuk berkomunikasi dengan aplikasi web yang berjalan di browser, atau dalam situasi di mana firewall atau aturan jaringan lainnya memblokir koneksi MQTT standar. + +## Telemetri + +Kata telemetri berasal dari akar kata Yunani yang berarti mengukur dari jarak jauh. Telemetri adalah tindakan mengumpulkan data dari sensor dan mengirimkannya ke cloud. + +> 💁 Salah satu perangkat telemetri paling awal ditemukan di Prancis pada tahun 1874 dan mengirimkan data cuaca dan kedalaman salju secara real-time dari Mont Blanc ke Paris. Perangkat ini menggunakan kabel fisik karena teknologi nirkabel belum tersedia pada saat itu. + +Mari kita lihat kembali contoh termostat pintar dari Pelajaran 1. + +![Termostat yang terhubung ke Internet menggunakan beberapa sensor ruangan](../../../../../translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.id.png) + +Termostat memiliki sensor suhu untuk mengumpulkan telemetri. Kemungkinan besar, termostat memiliki satu sensor suhu bawaan, dan mungkin terhubung ke beberapa sensor suhu eksternal melalui protokol nirkabel seperti [Bluetooth Low Energy](https://wikipedia.org/wiki/Bluetooth_Low_Energy) (BLE). + +Contoh data telemetri yang akan dikirimkan adalah: + +| Nama | Nilai | Deskripsi | +| ---- | ----- | --------- | +| `thermostat_temperature` | 18°C | Suhu yang diukur oleh sensor suhu bawaan termostat | +| `livingroom_temperature` | 19°C | Suhu yang diukur oleh sensor suhu jarak jauh yang diberi nama `livingroom` untuk mengidentifikasi ruangan tempat sensor berada | +| `bedroom_temperature` | 21°C | Suhu yang diukur oleh sensor suhu jarak jauh yang diberi nama `bedroom` untuk mengidentifikasi ruangan tempat sensor berada | + +Layanan cloud kemudian dapat menggunakan data telemetri ini untuk membuat keputusan tentang perintah apa yang akan dikirim untuk mengontrol pemanas. + +### Kirim telemetri dari perangkat IoT Anda + +Bagian selanjutnya dalam menambahkan kontrol Internet ke lampu malam Anda adalah mengirimkan telemetri tingkat cahaya ke broker MQTT pada topik telemetri. + +#### Tugas - kirim telemetri dari perangkat IoT Anda + +Kirim telemetri tingkat cahaya ke broker MQTT. + +Data dikirimkan dalam format JSON - singkatan dari JavaScript Object Notation, standar untuk mengkodekan data dalam teks menggunakan pasangan kunci/nilai. + +✅ Jika Anda belum pernah mendengar tentang JSON sebelumnya, Anda dapat mempelajarinya lebih lanjut di [dokumentasi JSON.org](https://www.json.org/). + +Ikuti langkah yang relevan di bawah ini untuk mengirim telemetri dari perangkat Anda ke broker MQTT: + +* [Arduino - Wio Terminal](wio-terminal-telemetry.md) +* [Komputer papan tunggal - Raspberry Pi/Perangkat IoT Virtual](single-board-computer-telemetry.md) + +### Terima telemetri dari broker MQTT + +Tidak ada gunanya mengirim telemetri jika tidak ada yang mendengarkannya. Telemetri tingkat cahaya memerlukan sesuatu yang mendengarkannya untuk memproses data. Kode 'server' ini adalah jenis kode yang akan Anda terapkan ke layanan cloud sebagai bagian dari aplikasi IoT yang lebih besar, tetapi di sini Anda akan menjalankan kode ini secara lokal di komputer Anda (atau di Pi Anda jika Anda langsung mengkode di sana). Kode server terdiri dari aplikasi Python yang mendengarkan pesan telemetri melalui MQTT dengan tingkat cahaya. Nanti dalam pelajaran ini Anda akan membuatnya membalas dengan pesan perintah dengan instruksi untuk menyalakan atau mematikan LED. + +✅ Lakukan riset: Apa yang terjadi pada pesan MQTT jika tidak ada pendengar? + +#### Instal Python dan VS Code + +Jika Anda belum menginstal Python dan VS Code secara lokal, Anda perlu menginstalnya untuk menulis kode server. Jika Anda menggunakan perangkat IoT virtual, atau bekerja di Raspberry Pi Anda, Anda dapat melewati langkah ini karena seharusnya sudah diinstal dan dikonfigurasi. + +##### Tugas - instal Python dan VS Code + +Instal Python dan VS Code. + +1. Instal Python. Lihat [halaman unduhan Python](https://www.python.org/downloads/) untuk instruksi menginstal versi terbaru Python. + +1. Instal Visual Studio Code (VS Code). Ini adalah editor yang akan Anda gunakan untuk menulis kode perangkat virtual Anda dalam Python. Lihat [dokumentasi VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) untuk instruksi menginstal VS Code. +💁 Anda bebas menggunakan IDE atau editor Python apa pun untuk pelajaran ini jika Anda memiliki alat yang disukai, tetapi pelajaran akan memberikan instruksi berdasarkan penggunaan VS Code. +1. Pasang ekstensi Pylance di VS Code. Ini adalah ekstensi untuk VS Code yang menyediakan dukungan bahasa Python. Lihat [dokumentasi ekstensi Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) untuk petunjuk pemasangan ekstensi ini di VS Code. + +#### Konfigurasi Lingkungan Virtual Python + +Salah satu fitur kuat Python adalah kemampuan untuk menginstal [paket pip](https://pypi.org) - ini adalah paket kode yang ditulis oleh orang lain dan dipublikasikan di Internet. Anda dapat menginstal paket pip ke komputer Anda dengan satu perintah, lalu menggunakan paket tersebut dalam kode Anda. Anda akan menggunakan pip untuk menginstal paket untuk berkomunikasi melalui MQTT. + +Secara default, ketika Anda menginstal sebuah paket, paket tersebut tersedia di seluruh komputer Anda, dan ini dapat menyebabkan masalah dengan versi paket - seperti satu aplikasi yang bergantung pada satu versi paket yang rusak ketika Anda menginstal versi baru untuk aplikasi lain. Untuk mengatasi masalah ini, Anda dapat menggunakan [lingkungan virtual Python](https://docs.python.org/3/library/venv.html), yang pada dasarnya adalah salinan Python dalam folder khusus, dan ketika Anda menginstal paket pip, paket tersebut hanya diinstal di folder tersebut. + +##### Tugas - Konfigurasi Lingkungan Virtual Python + +Konfigurasikan lingkungan virtual Python dan instal paket pip MQTT. + +1. Dari terminal atau command line Anda, jalankan perintah berikut di lokasi pilihan Anda untuk membuat dan masuk ke direktori baru: + + ```sh + mkdir nightlight-server + cd nightlight-server + ``` + +1. Sekarang jalankan perintah berikut untuk membuat lingkungan virtual di folder `.venv`: + + ```sh + python3 -m venv .venv + ``` + + > 💁 Anda perlu secara eksplisit memanggil `python3` untuk membuat lingkungan virtual, terutama jika Anda memiliki Python 2 yang terinstal selain Python 3 (versi terbaru). Jika Anda memiliki Python 2 yang terinstal, maka memanggil `python` akan menggunakan Python 2, bukan Python 3. + +1. Aktifkan lingkungan virtual: + + * Di Windows: + * Jika Anda menggunakan Command Prompt, atau Command Prompt melalui Windows Terminal, jalankan: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Jika Anda menggunakan PowerShell, jalankan: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + * Di macOS atau Linux, jalankan: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Perintah ini harus dijalankan dari lokasi yang sama dengan tempat Anda menjalankan perintah untuk membuat lingkungan virtual. Anda tidak perlu masuk ke folder `.venv`, Anda hanya perlu menjalankan perintah aktivasi dan perintah apa pun untuk menginstal paket atau menjalankan kode dari folder tempat Anda membuat lingkungan virtual. + +1. Setelah lingkungan virtual diaktifkan, perintah `python` default akan menjalankan versi Python yang digunakan untuk membuat lingkungan virtual. Jalankan perintah berikut untuk mendapatkan versinya: + + ```sh + python --version + ``` + + Outputnya akan mirip dengan berikut ini: + + ```output + (.venv) ➜ nightlight-server python --version + Python 3.9.1 + ``` + + > 💁 Versi Python Anda mungkin berbeda - selama versinya 3.6 atau lebih tinggi, itu sudah cukup. Jika tidak, hapus folder ini, instal versi Python yang lebih baru, dan coba lagi. + +1. Jalankan perintah berikut untuk menginstal paket pip untuk [Paho-MQTT](https://pypi.org/project/paho-mqtt/), sebuah pustaka MQTT yang populer. + + ```sh + pip install paho-mqtt + ``` + + Paket pip ini hanya akan diinstal di lingkungan virtual, dan tidak akan tersedia di luar lingkungan ini. + +#### Menulis Kode Server + +Kode server sekarang dapat ditulis dalam Python. + +##### Tugas - Menulis Kode Server + +Tulis kode server. + +1. Dari terminal atau command line Anda, jalankan perintah berikut di dalam lingkungan virtual untuk membuat file Python bernama `app.py`: + + * Di Windows, jalankan: + + ```cmd + type nul > app.py + ``` + + * Di macOS atau Linux, jalankan: + + ```cmd + touch app.py + ``` + +1. Buka folder saat ini di VS Code: + + ```sh + code . + ``` + +1. Ketika VS Code diluncurkan, itu akan mengaktifkan lingkungan virtual Python. Ini akan dilaporkan di bilah status bawah: + + ![VS Code menunjukkan lingkungan virtual yang dipilih](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.id.png) + +1. Jika Terminal VS Code sudah berjalan saat VS Code dimulai, lingkungan virtual tidak akan diaktifkan di dalamnya. Cara termudah adalah dengan menutup terminal menggunakan tombol **Kill the active terminal instance**: + + ![Tombol Kill the active terminal instance di VS Code](../../../../../translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.id.png) + +1. Luncurkan Terminal VS Code baru dengan memilih *Terminal -> New Terminal*, atau menekan `` CTRL+` ``. Terminal baru akan memuat lingkungan virtual, dengan panggilan untuk mengaktifkannya muncul di terminal. Nama lingkungan virtual (`.venv`) juga akan ada di prompt: + + ```output + ➜ nightlight-server source .venv/bin/activate + (.venv) ➜ nightlight + ``` + +1. Buka file `app.py` dari penjelajah VS Code dan tambahkan kode berikut: + + ```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) + ``` + + Ganti `` pada baris 6 dengan ID unik yang Anda gunakan saat membuat kode perangkat Anda. + + ⚠️ Ini **harus** menjadi ID yang sama yang Anda gunakan pada perangkat Anda, atau kode server tidak akan berlangganan atau mempublikasikan ke topik yang benar. + + Kode ini membuat klien MQTT dengan nama unik, dan terhubung ke broker *test.mosquitto.org*. Kemudian memulai loop pemrosesan yang berjalan di thread latar belakang untuk mendengarkan pesan pada topik yang dilanggani. + + Klien kemudian berlangganan pesan pada topik telemetri, dan mendefinisikan fungsi yang dipanggil ketika pesan diterima. Ketika pesan telemetri diterima, fungsi `handle_telemetry` dipanggil, mencetak pesan yang diterima ke konsol. + + Akhirnya, loop tak terbatas menjaga aplikasi tetap berjalan. Klien MQTT mendengarkan pesan di thread latar belakang dan berjalan selama aplikasi utama berjalan. + +1. Dari terminal VS Code, jalankan perintah berikut untuk menjalankan aplikasi Python Anda: + + ```sh + python app.py + ``` + + Aplikasi akan mulai mendengarkan pesan dari perangkat IoT. + +1. Pastikan perangkat Anda berjalan dan mengirim pesan telemetri. Sesuaikan tingkat cahaya yang terdeteksi oleh perangkat fisik atau virtual Anda. Pesan yang diterima akan dicetak ke terminal. + + ```output + (.venv) ➜ nightlight-server python app.py + Message received: {'light': 0} + Message received: {'light': 400} + ``` + + File app.py di lingkungan virtual nightlight harus berjalan agar file app.py di lingkungan virtual nightlight-server dapat menerima pesan yang dikirim. + +> 💁 Anda dapat menemukan kode ini di folder [code-server/server](../../../../../1-getting-started/lessons/4-connect-internet/code-server/server). + +### Seberapa Sering Telemetri Harus Dikirim? + +Salah satu pertimbangan penting dengan telemetri adalah seberapa sering data harus diukur dan dikirim? Jawabannya - tergantung. Jika Anda mengukur sering, Anda dapat merespons lebih cepat terhadap perubahan pengukuran, tetapi Anda menggunakan lebih banyak daya, lebih banyak bandwidth, menghasilkan lebih banyak data, dan membutuhkan lebih banyak sumber daya cloud untuk memprosesnya. Anda perlu mengukur cukup sering, tetapi tidak terlalu sering. + +Untuk termostat, mengukur setiap beberapa menit mungkin sudah lebih dari cukup karena suhu tidak berubah terlalu sering. Jika Anda hanya mengukur sekali sehari, Anda bisa saja memanaskan rumah Anda untuk suhu malam di tengah hari yang cerah, sedangkan jika Anda mengukur setiap detik, Anda akan memiliki ribuan pengukuran suhu yang tidak perlu yang akan menghabiskan kecepatan dan bandwidth Internet pengguna (masalah bagi orang dengan paket bandwidth terbatas), menggunakan lebih banyak daya yang bisa menjadi masalah untuk perangkat bertenaga baterai seperti sensor jarak jauh, dan meningkatkan biaya sumber daya komputasi cloud penyedia untuk memproses dan menyimpannya. + +Jika Anda memantau data di sekitar mesin di pabrik yang jika gagal dapat menyebabkan kerusakan besar dan kerugian jutaan dolar, maka mengukur beberapa kali per detik mungkin diperlukan. Lebih baik membuang bandwidth daripada kehilangan telemetri yang menunjukkan bahwa mesin perlu dihentikan dan diperbaiki sebelum rusak. + +> 💁 Dalam situasi ini, Anda mungkin mempertimbangkan memiliki perangkat edge untuk memproses telemetri terlebih dahulu untuk mengurangi ketergantungan pada Internet. + +### Kehilangan Konektivitas + +Koneksi Internet bisa tidak stabil, dengan gangguan yang umum terjadi. Apa yang harus dilakukan perangkat IoT dalam keadaan ini - apakah harus kehilangan data, atau menyimpannya sampai konektivitas pulih? Sekali lagi, jawabannya tergantung. + +Untuk termostat, data mungkin bisa hilang begitu pengukuran suhu baru telah diambil. Sistem pemanas tidak peduli bahwa 20 menit yang lalu suhunya 20,5°C jika suhu sekarang adalah 19°C, suhu saat ini yang menentukan apakah pemanas harus menyala atau mati. + +Untuk mesin, Anda mungkin ingin menyimpan data, terutama jika data tersebut digunakan untuk mencari tren. Ada model pembelajaran mesin yang dapat mendeteksi anomali dalam aliran data dengan melihat data dari periode waktu tertentu (seperti satu jam terakhir) dan menemukan data yang anomali. Ini sering digunakan untuk pemeliharaan prediktif, mencari indikasi bahwa sesuatu mungkin akan rusak sehingga Anda dapat memperbaiki atau menggantinya sebelum itu terjadi. Anda mungkin ingin setiap bit telemetri untuk mesin dikirim sehingga dapat diproses untuk deteksi anomali, jadi begitu perangkat IoT dapat terhubung kembali, perangkat tersebut akan mengirim semua telemetri yang dihasilkan selama gangguan Internet. + +Desainer perangkat IoT juga harus mempertimbangkan apakah perangkat IoT dapat digunakan selama gangguan Internet atau kehilangan sinyal yang disebabkan oleh lokasi. Sebuah termostat pintar harus dapat membuat beberapa keputusan terbatas untuk mengontrol pemanasan jika tidak dapat mengirim telemetri ke cloud karena gangguan. + +[![Ferrari ini rusak karena seseorang mencoba memperbaruinya di bawah tanah di mana tidak ada sinyal seluler](../../../../../translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.id.png)](https://twitter.com/internetofshit/status/1315736960082808832) + +Untuk MQTT menangani kehilangan konektivitas, kode perangkat dan server harus bertanggung jawab untuk memastikan pengiriman pesan jika diperlukan, misalnya dengan mewajibkan semua pesan yang dikirim dijawab oleh pesan tambahan pada topik balasan, dan jika tidak, pesan tersebut diantrekan secara manual untuk diputar ulang nanti. + +## Perintah + +Perintah adalah pesan yang dikirim oleh cloud ke perangkat, menginstruksikannya untuk melakukan sesuatu. Sebagian besar waktu ini melibatkan memberikan beberapa jenis output melalui aktuator, tetapi bisa juga berupa instruksi untuk perangkat itu sendiri, seperti untuk reboot, atau mengumpulkan telemetri tambahan dan mengembalikannya sebagai respons terhadap perintah. + +![Termostat yang terhubung ke Internet menerima perintah untuk menyalakan pemanas](../../../../../translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.id.png) + +Sebuah termostat dapat menerima perintah dari cloud untuk menyalakan pemanas. Berdasarkan data telemetri dari semua sensor, jika layanan cloud memutuskan bahwa pemanas harus menyala, maka ia mengirimkan perintah yang relevan. + +### Mengirim Perintah ke Broker MQTT + +Langkah berikutnya untuk lampu malam yang dikontrol Internet adalah agar kode server mengirim perintah kembali ke perangkat IoT untuk mengontrol lampu berdasarkan tingkat cahaya yang terdeteksi. + +1. Buka kode server di VS Code. + +1. Tambahkan baris berikut setelah deklarasi `client_telemetry_topic` untuk menentukan topik mana yang akan digunakan untuk mengirim perintah: + + ```python + server_command_topic = id + '/commands' + ``` + +1. Tambahkan kode berikut ke akhir fungsi `handle_telemetry`: + + ```python + command = { 'led_on' : payload['light'] < 300 } + print("Sending message:", command) + + client.publish(server_command_topic, json.dumps(command)) + ``` + + Ini mengirimkan pesan JSON ke topik perintah dengan nilai `led_on` diatur ke true atau false tergantung pada apakah cahaya kurang dari 300 atau tidak. Jika cahaya kurang dari 300, true dikirim untuk menginstruksikan perangkat untuk menyalakan LED. + +1. Jalankan kode seperti sebelumnya. + +1. Sesuaikan tingkat cahaya yang terdeteksi oleh perangkat fisik atau virtual Anda. Pesan yang diterima dan perintah yang dikirim akan ditulis ke terminal: + + ```output + (.venv) ➜ nightlight-server python app.py + Message received: {'light': 0} + Sending message: {'led_on': True} + Message received: {'light': 400} + Sending message: {'led_on': False} + ``` + +> 💁 Telemetri dan perintah dikirim pada satu topik masing-masing. Ini berarti telemetri dari beberapa perangkat akan muncul pada topik telemetri yang sama, dan perintah ke beberapa perangkat akan muncul pada topik perintah yang sama. Jika Anda ingin mengirim perintah ke perangkat tertentu, Anda dapat menggunakan beberapa topik, yang dinamai dengan ID perangkat unik, seperti `/commands/device1`, `/commands/device2`. Dengan cara ini, perangkat dapat mendengarkan pesan yang hanya ditujukan untuk perangkat tersebut. + +> 💁 Anda dapat menemukan kode ini di folder [code-commands/server](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/server). + +### Menangani Perintah pada Perangkat IoT + +Sekarang perintah dikirim dari server, Anda dapat menambahkan kode ke perangkat IoT untuk menangani perintah tersebut dan mengontrol LED. + +Ikuti langkah yang relevan di bawah ini untuk mendengarkan perintah dari broker MQTT: + +* [Arduino - Wio Terminal](wio-terminal-commands.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-commands.md) + +Setelah kode ini ditulis dan dijalankan, coba ubah tingkat cahaya. Perhatikan output dari server dan perangkat, serta perhatikan LED saat Anda mengubah tingkat cahaya. + +### Kehilangan Konektivitas + +Apa yang harus dilakukan layanan cloud jika perlu mengirim perintah ke perangkat IoT yang sedang offline? Sekali lagi, jawabannya tergantung. + +Jika perintah terbaru menggantikan perintah sebelumnya, maka perintah sebelumnya mungkin bisa diabaikan. Jika layanan cloud mengirim perintah untuk menyalakan pemanas, lalu mengirim perintah untuk mematikannya, maka perintah nyala dapat diabaikan dan tidak dikirim ulang. + +Jika perintah perlu diproses secara berurutan, seperti menggerakkan lengan robot ke atas, lalu menutup penjepit, maka perintah tersebut perlu dikirim dalam urutan setelah konektivitas dipulihkan. + +✅ Bagaimana perangkat atau kode server dapat memastikan perintah selalu dikirim dan ditangani dalam urutan yang benar melalui MQTT jika diperlukan? + +--- + +## 🚀 Tantangan + +Tantangan dalam tiga pelajaran terakhir adalah untuk membuat daftar sebanyak mungkin perangkat IoT yang ada di rumah, sekolah, atau tempat kerja Anda dan menentukan apakah perangkat tersebut dibangun menggunakan mikrokontroler atau komputer papan tunggal, atau bahkan campuran keduanya, serta pikirkan tentang sensor dan aktuator apa yang mereka gunakan. +Untuk perangkat ini, pikirkan tentang pesan apa yang mungkin mereka kirim atau terima. Telemetri apa yang mereka kirim? Pesan atau perintah apa yang mungkin mereka terima? Apakah menurut Anda mereka aman? + +## Kuis setelah kuliah + +[Kuis setelah kuliah](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8) + +## Tinjauan & Studi Mandiri + +Baca lebih lanjut tentang MQTT di [halaman Wikipedia MQTT](https://wikipedia.org/wiki/MQTT). + +Cobalah menjalankan broker MQTT sendiri menggunakan [Mosquitto](https://www.mosquitto.org) dan hubungkan ke perangkat IoT Anda serta kode server. + +> 💁 Tip - secara default Mosquitto tidak mengizinkan koneksi anonim (yaitu koneksi tanpa nama pengguna dan kata sandi), dan tidak mengizinkan koneksi dari luar komputer tempat ia berjalan. +> Anda dapat memperbaikinya dengan file konfigurasi [`mosquitto.conf`](https://www.mosquitto.org/man/mosquitto-conf-5.html) dengan berikut ini: +> +> ```sh +> listener 1883 0.0.0.0 +> allow_anonymous true +> ``` + +## Tugas + +[Bandingkan dan kontraskan MQTT dengan protokol komunikasi lainnya](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/4-connect-internet/assignment.md b/translations/id/1-getting-started/lessons/4-connect-internet/assignment.md new file mode 100644 index 00000000..37d953f4 --- /dev/null +++ b/translations/id/1-getting-started/lessons/4-connect-internet/assignment.md @@ -0,0 +1,28 @@ + +# Bandingkan dan bedakan MQTT dengan protokol komunikasi lainnya + +## Instruksi + +Pelajaran ini membahas MQTT sebagai protokol komunikasi. Ada protokol lainnya, termasuk AMQP dan HTTP/HTTPS. + +Lakukan penelitian tentang keduanya dan bandingkan dengan MQTT. Pertimbangkan penggunaan daya, keamanan, dan ketahanan pesan jika koneksi terputus. + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Peningkatan | +| -------- | ------- | -------- | ----------------- | +| Bandingkan AMQP dengan MQTT | Mampu membandingkan dan membedakan AMQP dengan MQTT serta mencakup penggunaan daya, keamanan, dan ketahanan pesan. | Sebagian mampu membandingkan dan membedakan AMQP dengan MQTT serta mencakup dua dari penggunaan daya, keamanan, dan ketahanan pesan. | Sebagian mampu membandingkan dan membedakan AMQP dengan MQTT serta mencakup satu dari penggunaan daya, keamanan, dan ketahanan pesan. | +| Bandingkan HTTP/HTTPS dengan MQTT | Mampu membandingkan dan membedakan HTTP/HTTPS dengan MQTT serta mencakup penggunaan daya, keamanan, dan ketahanan pesan. | Sebagian mampu membandingkan dan membedakan HTTP/HTTPS dengan MQTT serta mencakup dua dari penggunaan daya, keamanan, dan ketahanan pesan. | Sebagian mampu membandingkan dan membedakan HTTP/HTTPS dengan MQTT serta mencakup satu dari penggunaan daya, keamanan, dan ketahanan pesan. | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md b/translations/id/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md new file mode 100644 index 00000000..2973f290 --- /dev/null +++ b/translations/id/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md @@ -0,0 +1,67 @@ + +# Kendalikan lampu malam Anda melalui Internet - Perangkat IoT Virtual dan Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan berlangganan perintah yang dikirim dari broker MQTT ke Raspberry Pi atau perangkat IoT virtual Anda. + +## Berlangganan perintah + +Langkah berikutnya adalah berlangganan perintah yang dikirim dari broker MQTT dan meresponsnya. + +### Tugas + +Berlangganan perintah. + +1. Buka proyek lampu malam di VS Code. + +1. Jika Anda menggunakan perangkat IoT virtual, pastikan terminal menjalankan lingkungan virtual. Jika Anda menggunakan Raspberry Pi, Anda tidak akan menggunakan lingkungan virtual. + +1. Tambahkan kode berikut setelah definisi `client_telemetry_topic`: + + ```python + server_command_topic = id + '/commands' + ``` + + `server_command_topic` adalah topik MQTT yang akan dilanggan oleh perangkat untuk menerima perintah LED. + +1. Tambahkan kode berikut tepat di atas loop utama, setelah baris `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 + ``` + + Kode ini mendefinisikan fungsi, `handle_command`, yang membaca pesan sebagai dokumen JSON dan mencari nilai properti `led_on`. Jika nilainya diatur ke `True`, LED akan dinyalakan, jika tidak maka akan dimatikan. + + Klien MQTT berlangganan topik tempat server akan mengirim pesan dan menetapkan fungsi `handle_command` untuk dipanggil saat pesan diterima. + + > 💁 Handler `on_message` dipanggil untuk semua topik yang dilanggan. Jika Anda nanti menulis kode yang mendengarkan beberapa topik, Anda dapat mendapatkan topik tempat pesan dikirim dari objek `message` yang diteruskan ke fungsi handler. + +1. Jalankan kode dengan cara yang sama seperti Anda menjalankan kode dari bagian tugas sebelumnya. Jika Anda menggunakan perangkat IoT virtual, pastikan aplikasi CounterFit berjalan dan sensor cahaya serta LED telah dibuat pada pin yang benar. + +1. Sesuaikan tingkat cahaya yang terdeteksi oleh perangkat fisik atau virtual Anda. Pesan yang diterima dan perintah yang dikirim akan ditulis ke terminal. LED juga akan dinyalakan dan dimatikan tergantung pada tingkat cahaya. + +> 💁 Anda dapat menemukan kode ini di folder [code-commands/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/virtual-device) atau folder [code-commands/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/pi). + +😀 Anda telah berhasil membuat perangkat Anda merespons perintah dari broker MQTT. + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md b/translations/id/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md new file mode 100644 index 00000000..ba0454ff --- /dev/null +++ b/translations/id/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md @@ -0,0 +1,93 @@ + +# Kendalikan Lampu Malam Anda melalui Internet - Perangkat IoT Virtual dan Raspberry Pi + +Perangkat IoT perlu diprogram untuk berkomunikasi dengan *test.mosquitto.org* menggunakan MQTT agar dapat mengirimkan nilai telemetri dari pembacaan sensor cahaya, serta menerima perintah untuk mengontrol LED. + +Dalam bagian pelajaran ini, Anda akan menghubungkan Raspberry Pi atau perangkat IoT virtual Anda ke broker MQTT. + +## Instal Paket Klien MQTT + +Untuk berkomunikasi dengan broker MQTT, Anda perlu menginstal pustaka MQTT melalui paket pip, baik di Raspberry Pi Anda atau di lingkungan virtual jika Anda menggunakan perangkat virtual. + +### Tugas + +Instal paket pip + +1. Buka proyek lampu malam di VS Code. + +1. Jika Anda menggunakan perangkat IoT virtual, pastikan terminal menjalankan lingkungan virtual. Jika Anda menggunakan Raspberry Pi, Anda tidak perlu menggunakan lingkungan virtual. + +1. Jalankan perintah berikut untuk menginstal paket pip MQTT: + + ```sh + pip3 install paho-mqtt + ``` + +## Program Perangkat + +Perangkat siap untuk diprogram. + +### Tugas + +Tulis kode perangkat. + +1. Tambahkan impor berikut di bagian atas file `app.py`: + + ```python + import paho.mqtt.client as mqtt + ``` + + Pustaka `paho.mqtt.client` memungkinkan aplikasi Anda berkomunikasi melalui MQTT. + +1. Tambahkan kode berikut setelah definisi sensor cahaya dan LED: + + ```python + id = '' + + client_name = id + 'nightlight_client' + ``` + + Ganti `` dengan ID unik yang akan digunakan sebagai nama klien perangkat ini, dan nantinya untuk topik yang diterbitkan dan dilanggani oleh perangkat ini. Broker *test.mosquitto.org* bersifat publik dan digunakan oleh banyak orang, termasuk siswa lain yang mengerjakan tugas ini. Memiliki nama klien MQTT dan nama topik yang unik memastikan kode Anda tidak berbenturan dengan kode orang lain. Anda juga akan memerlukan ID ini saat membuat kode server nanti dalam tugas ini. + + > 💁 Anda dapat menggunakan situs web seperti [GUIDGen](https://www.guidgen.com) untuk menghasilkan ID unik. + + `client_name` adalah nama unik untuk klien MQTT ini di broker. + +1. Tambahkan kode berikut di bawah kode baru ini untuk membuat objek klien MQTT dan menghubungkannya ke broker MQTT: + + ```python + mqtt_client = mqtt.Client(client_name) + mqtt_client.connect('test.mosquitto.org') + + mqtt_client.loop_start() + + print("MQTT connected!") + ``` + + Kode ini membuat objek klien, menghubungkan ke broker MQTT publik, dan memulai loop pemrosesan yang berjalan di thread latar belakang untuk mendengarkan pesan pada topik yang dilanggani. + +1. Jalankan kode dengan cara yang sama seperti Anda menjalankan kode dari bagian tugas sebelumnya. Jika Anda menggunakan perangkat IoT virtual, pastikan aplikasi CounterFit berjalan dan sensor cahaya serta LED telah dibuat pada pin yang benar. + + ```output + (.venv) ➜ nightlight python app.py + MQTT connected! + Light level: 0 + Light level: 0 + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-mqtt/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/virtual-device) atau folder [code-mqtt/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/pi). + +😀 Anda telah berhasil menghubungkan perangkat Anda ke broker MQTT. + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md b/translations/id/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md new file mode 100644 index 00000000..0fbbd8a2 --- /dev/null +++ b/translations/id/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md @@ -0,0 +1,74 @@ + +# Kendalikan lampu malam Anda melalui Internet - Perangkat IoT Virtual dan Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan mengirimkan telemetri dengan tingkat cahaya dari Raspberry Pi atau perangkat IoT virtual Anda ke broker MQTT. + +## Mengirimkan telemetri + +Langkah berikutnya adalah membuat dokumen JSON dengan telemetri dan mengirimkannya ke broker MQTT. + +### Tugas + +Kirimkan telemetri ke broker MQTT. + +1. Buka proyek lampu malam di VS Code. + +1. Jika Anda menggunakan perangkat IoT virtual, pastikan terminal menjalankan lingkungan virtual. Jika Anda menggunakan Raspberry Pi, Anda tidak akan menggunakan lingkungan virtual. + +1. Tambahkan impor berikut di bagian atas file `app.py`: + + ```python + import json + ``` + + Library `json` digunakan untuk mengkodekan telemetri sebagai dokumen JSON. + +1. Tambahkan berikut ini setelah deklarasi `client_name`: + + ```python + client_telemetry_topic = id + '/telemetry' + ``` + + `client_telemetry_topic` adalah topik MQTT tempat perangkat akan mengirimkan tingkat cahaya. + +1. Ganti isi dari loop `while True:` di akhir file dengan yang berikut ini: + + ```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) + ``` + + Kode ini mengemas tingkat cahaya ke dalam dokumen JSON dan mengirimkannya ke broker MQTT. Kemudian, kode ini akan berhenti sejenak untuk mengurangi frekuensi pengiriman pesan. + +1. Jalankan kode dengan cara yang sama seperti Anda menjalankan kode dari bagian tugas sebelumnya. Jika Anda menggunakan perangkat IoT virtual, pastikan aplikasi CounterFit sedang berjalan dan sensor cahaya serta LED telah dibuat pada pin yang benar. + + ```output + (.venv) ➜ nightlight python app.py + MQTT connected! + Sending telemetry {"light": 0} + Sending telemetry {"light": 0} + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-telemetry/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/virtual-device) atau folder [code-telemetry/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/pi). + +😀 Anda telah berhasil mengirimkan telemetri dari perangkat Anda. + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md b/translations/id/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md new file mode 100644 index 00000000..cf7783a5 --- /dev/null +++ b/translations/id/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md @@ -0,0 +1,93 @@ + +# Kendalikan lampu malam Anda melalui Internet - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan berlangganan perintah yang dikirim dari broker MQTT ke Wio Terminal Anda. + +## Berlangganan perintah + +Langkah berikutnya adalah berlangganan perintah yang dikirim dari broker MQTT, dan meresponsnya. + +### Tugas + +Berlangganan perintah. + +1. Buka proyek lampu malam di VS Code. + +1. Tambahkan kode berikut ke bagian bawah file `config.h` untuk mendefinisikan nama topik untuk perintah: + + ```cpp + const string SERVER_COMMAND_TOPIC = ID + "/commands"; + ``` + + `SERVER_COMMAND_TOPIC` adalah topik yang akan dilanggan oleh perangkat untuk menerima perintah LED. + +1. Tambahkan baris berikut ke akhir fungsi `reconnectMQTTClient` untuk berlangganan topik perintah saat klien MQTT tersambung kembali: + + ```cpp + client.subscribe(SERVER_COMMAND_TOPIC.c_str()); + ``` + +1. Tambahkan kode berikut di bawah fungsi `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); + } + ``` + + Fungsi ini akan menjadi callback yang dipanggil oleh klien MQTT saat menerima pesan dari server. + + Pesan diterima sebagai array bilangan bulat 8-bit tak bertanda, sehingga perlu dikonversi menjadi array karakter agar dapat diperlakukan sebagai teks. + + Pesan berisi dokumen JSON, dan didekode menggunakan pustaka ArduinoJson. Properti `led_on` dari dokumen JSON dibaca, dan tergantung pada nilainya, LED akan dinyalakan atau dimatikan. + +1. Tambahkan kode berikut ke fungsi `createMQTTClient`: + + ```cpp + client.setCallback(clientCallback); + ``` + + Kode ini menetapkan `clientCallback` sebagai callback yang akan dipanggil saat pesan diterima dari broker MQTT. + + > 💁 Handler `clientCallback` dipanggil untuk semua topik yang dilanggan. Jika Anda nantinya menulis kode yang mendengarkan beberapa topik, Anda dapat mendapatkan topik tempat pesan dikirim dari parameter `topic` yang diteruskan ke fungsi callback. + +1. Unggah kode ke Wio Terminal Anda, dan gunakan Serial Monitor untuk melihat tingkat cahaya yang dikirim ke broker MQTT. + +1. Sesuaikan tingkat cahaya yang terdeteksi oleh perangkat fisik atau virtual Anda. Anda akan melihat pesan diterima dan perintah dikirim di terminal. Anda juga akan melihat LED dinyalakan dan dimatikan tergantung pada tingkat cahaya. + +> 💁 Anda dapat menemukan kode ini di folder [code-commands/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal). + +😀 Anda telah berhasil memprogram perangkat Anda untuk merespons perintah dari broker MQTT. + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md b/translations/id/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md new file mode 100644 index 00000000..b1edfc19 --- /dev/null +++ b/translations/id/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md @@ -0,0 +1,251 @@ + +# Kendalikan lampu malam Anda melalui Internet - Wio Terminal + +Perangkat IoT perlu diprogram untuk berkomunikasi dengan *test.mosquitto.org* menggunakan MQTT agar dapat mengirim nilai telemetri dengan pembacaan sensor cahaya, serta menerima perintah untuk mengontrol LED. + +Dalam bagian pelajaran ini, Anda akan menghubungkan Wio Terminal Anda ke broker MQTT. + +## Instal pustaka WiFi dan MQTT Arduino + +Untuk berkomunikasi dengan broker MQTT, Anda perlu menginstal beberapa pustaka Arduino agar dapat menggunakan chip WiFi di Wio Terminal dan berkomunikasi dengan MQTT. Saat mengembangkan perangkat Arduino, Anda dapat menggunakan berbagai pustaka yang berisi kode sumber terbuka dan mengimplementasikan beragam kemampuan. Seeed menerbitkan pustaka untuk Wio Terminal yang memungkinkan perangkat ini berkomunikasi melalui WiFi. Pengembang lain telah menerbitkan pustaka untuk berkomunikasi dengan broker MQTT, dan Anda akan menggunakan pustaka ini dengan perangkat Anda. + +Pustaka-pustaka ini disediakan sebagai kode sumber yang dapat diimpor secara otomatis ke PlatformIO dan dikompilasi untuk perangkat Anda. Dengan cara ini, pustaka Arduino akan berfungsi pada perangkat apa pun yang mendukung kerangka kerja Arduino, dengan asumsi perangkat tersebut memiliki perangkat keras spesifik yang diperlukan oleh pustaka tersebut. Beberapa pustaka, seperti pustaka WiFi dari Seeed, hanya berlaku untuk perangkat keras tertentu. + +Pustaka dapat diinstal secara global dan dikompilasi jika diperlukan, atau ke dalam proyek tertentu. Untuk tugas ini, pustaka akan diinstal ke dalam proyek. + +✅ Anda dapat mempelajari lebih lanjut tentang manajemen pustaka dan cara menemukan serta menginstal pustaka di [dokumentasi pustaka PlatformIO](https://docs.platformio.org/en/latest/librarymanager/index.html). + +### Tugas - instal pustaka WiFi dan MQTT Arduino + +Instal pustaka Arduino. + +1. Buka proyek lampu malam di VS Code. + +1. Tambahkan hal berikut ke akhir file `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 + ``` + + Ini mengimpor pustaka WiFi dari Seeed. Sintaks `@ ` merujuk pada nomor versi spesifik dari pustaka tersebut. + + > 💁 Anda dapat menghapus `@ ` untuk selalu menggunakan versi terbaru dari pustaka, tetapi tidak ada jaminan bahwa versi terbaru akan berfungsi dengan kode di bawah ini. Kode di sini telah diuji dengan versi pustaka ini. + + Ini adalah semua yang perlu Anda lakukan untuk menambahkan pustaka. Saat PlatformIO membangun proyek berikutnya, ia akan mengunduh kode sumber untuk pustaka ini dan mengompilasinya ke dalam proyek Anda. + +1. Tambahkan hal berikut ke `lib_deps`: + + ```ini + knolleary/PubSubClient @ 2.8 + ``` + + Ini mengimpor [PubSubClient](https://github.com/knolleary/pubsubclient), sebuah klien MQTT Arduino. + +## Hubungkan ke WiFi + +Wio Terminal sekarang dapat dihubungkan ke WiFi. + +### Tugas - hubungkan ke WiFi + +Hubungkan Wio Terminal ke WiFi. + +1. Buat file baru di folder `src` bernama `config.h`. Anda dapat melakukannya dengan memilih folder `src`, atau file `main.cpp` di dalamnya, lalu memilih tombol **New file** dari explorer. Tombol ini hanya muncul saat kursor Anda berada di atas explorer. + + ![Tombol file baru](../../../../../translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.id.png) + +1. Tambahkan kode berikut ke file ini untuk mendefinisikan konstanta untuk kredensial WiFi Anda: + + ```cpp + #pragma once + + #include + + using namespace std; + + // WiFi credentials + const char *SSID = ""; + const char *PASSWORD = ""; + ``` + + Ganti `` dengan SSID WiFi Anda. Ganti `` dengan kata sandi WiFi Anda. + +1. Buka file `main.cpp`. + +1. Tambahkan direktif `#include` berikut ke bagian atas file: + + ```cpp + #include + #include + #include + + #include "config.h" + ``` + + Ini menyertakan file header untuk pustaka yang Anda tambahkan sebelumnya, serta file header konfigurasi. File header ini diperlukan untuk memberi tahu PlatformIO agar membawa kode dari pustaka. Tanpa secara eksplisit menyertakan file header ini, beberapa kode tidak akan dikompilasi dan Anda akan mendapatkan kesalahan kompilasi. + +1. Tambahkan kode berikut di atas fungsi `setup`: + + ```cpp + void connectWiFi() + { + while (WiFi.status() != WL_CONNECTED) + { + Serial.println("Connecting to WiFi.."); + WiFi.begin(SSID, PASSWORD); + delay(500); + } + + Serial.println("Connected!"); + } + ``` + + Kode ini melakukan loop saat perangkat tidak terhubung ke WiFi, dan mencoba menghubungkan menggunakan SSID dan kata sandi dari file header konfigurasi. + +1. Tambahkan pemanggilan fungsi ini di bagian bawah fungsi `setup`, setelah pin dikonfigurasi. + + ```cpp + connectWiFi(); + ``` + +1. Unggah kode ini ke perangkat Anda untuk memeriksa apakah koneksi WiFi berfungsi. Anda seharusnya melihat ini di monitor serial. + + ```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! + ``` + +## Hubungkan ke MQTT + +Setelah Wio Terminal terhubung ke WiFi, perangkat ini dapat terhubung ke broker MQTT. + +### Tugas - hubungkan ke MQTT + +Hubungkan ke broker MQTT. + +1. Tambahkan kode berikut ke bagian bawah file `config.h` untuk mendefinisikan detail koneksi ke broker MQTT: + + ```cpp + // MQTT settings + const string ID = ""; + + const string BROKER = "test.mosquitto.org"; + const string CLIENT_NAME = ID + "nightlight_client"; + ``` + + Ganti `` dengan ID unik yang akan digunakan sebagai nama klien perangkat ini, dan nanti untuk topik yang dipublikasikan dan disubscribe oleh perangkat ini. Broker *test.mosquitto.org* bersifat publik dan digunakan oleh banyak orang, termasuk siswa lain yang sedang mengerjakan tugas ini. Memiliki nama klien MQTT dan nama topik yang unik memastikan kode Anda tidak akan berbenturan dengan kode orang lain. Anda juga akan membutuhkan ID ini saat membuat kode server nanti dalam tugas ini. + + > 💁 Anda dapat menggunakan situs web seperti [GUIDGen](https://www.guidgen.com) untuk menghasilkan ID unik. + + `BROKER` adalah URL broker MQTT. + + `CLIENT_NAME` adalah nama unik untuk klien MQTT ini di broker. + +1. Buka file `main.cpp`, dan tambahkan kode berikut di bawah fungsi `connectWiFi` dan di atas fungsi `setup`: + + ```cpp + WiFiClient wioClient; + PubSubClient client(wioClient); + ``` + + Kode ini membuat klien WiFi menggunakan pustaka WiFi Wio Terminal dan menggunakannya untuk membuat klien MQTT. + +1. Di bawah kode ini, tambahkan hal berikut: + + ```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); + } + } + } + ``` + + Fungsi ini menguji koneksi ke broker MQTT dan menyambungkan kembali jika tidak terhubung. Fungsi ini melakukan loop sepanjang waktu saat tidak terhubung dan mencoba menyambungkan menggunakan nama klien unik yang didefinisikan dalam file header konfigurasi. + + Jika koneksi gagal, fungsi ini mencoba lagi setelah 5 detik. + +1. Tambahkan kode berikut di bawah fungsi `reconnectMQTTClient`: + + ```cpp + void createMQTTClient() + { + client.setServer(BROKER.c_str(), 1883); + reconnectMQTTClient(); + } + ``` + + Kode ini menetapkan broker MQTT untuk klien, serta menetapkan callback saat pesan diterima. Kemudian mencoba menyambungkan ke broker. + +1. Panggil fungsi `createMQTTClient` dalam fungsi `setup` setelah WiFi terhubung. + +1. Ganti seluruh fungsi `loop` dengan hal berikut: + + ```cpp + void loop() + { + reconnectMQTTClient(); + client.loop(); + + delay(2000); + } + ``` + + Kode ini dimulai dengan menyambungkan kembali ke broker MQTT. Koneksi ini dapat dengan mudah terputus, jadi ada baiknya untuk secara rutin memeriksa dan menyambungkan kembali jika diperlukan. Kemudian memanggil metode `loop` pada klien MQTT untuk memproses pesan apa pun yang masuk pada topik yang disubscribe. Aplikasi ini bersifat single-threaded, sehingga pesan tidak dapat diterima pada thread latar belakang, oleh karena itu waktu pada thread utama perlu dialokasikan untuk memproses pesan apa pun yang menunggu pada koneksi jaringan. + + Akhirnya, penundaan selama 2 detik memastikan tingkat cahaya tidak dikirim terlalu sering dan mengurangi konsumsi daya perangkat. + +1. Unggah kode ke Wio Terminal Anda, dan gunakan Serial Monitor untuk melihat perangkat terhubung ke WiFi dan 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 + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-mqtt/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal). + +😀 Anda telah berhasil menghubungkan perangkat Anda ke broker MQTT. + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md b/translations/id/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md new file mode 100644 index 00000000..97654c85 --- /dev/null +++ b/translations/id/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md @@ -0,0 +1,93 @@ + +# Kendalikan lampu malam Anda melalui Internet - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan mengirimkan telemetri dengan tingkat cahaya dari Wio Terminal Anda ke broker MQTT. + +## Instal pustaka JSON Arduino + +Cara populer untuk mengirim pesan melalui MQTT adalah menggunakan JSON. Ada pustaka Arduino untuk JSON yang mempermudah membaca dan menulis dokumen JSON. + +### Tugas + +Instal pustaka Arduino JSON. + +1. Buka proyek lampu malam di VS Code. + +1. Tambahkan baris berikut sebagai baris tambahan ke daftar `lib_deps` dalam file `platformio.ini`: + + ```ini + bblanchon/ArduinoJson @ 6.17.3 + ``` + + Ini mengimpor [ArduinoJson](https://arduinojson.org), pustaka JSON untuk Arduino. + +## Publikasikan telemetri + +Langkah berikutnya adalah membuat dokumen JSON dengan telemetri dan mengirimkannya ke broker MQTT. + +### Tugas - publikasikan telemetri + +Publikasikan telemetri ke broker MQTT. + +1. Tambahkan kode berikut ke bagian bawah file `config.h` untuk mendefinisikan nama topik telemetri untuk broker MQTT: + + ```cpp + const string CLIENT_TELEMETRY_TOPIC = ID + "/telemetry"; + ``` + + `CLIENT_TELEMETRY_TOPIC` adalah topik tempat perangkat akan mempublikasikan tingkat cahaya. + +1. Buka file `main.cpp` + +1. Tambahkan direktif `#include` berikut ke bagian atas file: + + ```cpp + #include + ``` + +1. Tambahkan kode berikut di dalam fungsi `loop`, tepat sebelum `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()); + ``` + + Kode ini membaca tingkat cahaya, dan membuat dokumen JSON menggunakan ArduinoJson yang berisi tingkat tersebut. Dokumen ini kemudian diserialisasi menjadi string dan dipublikasikan pada topik telemetri MQTT oleh klien MQTT. + +1. Unggah kode ke Wio Terminal Anda, dan gunakan Serial Monitor untuk melihat tingkat cahaya yang dikirim ke broker MQTT. + + ```output + Connecting to WiFi.. + Connected! + Attempting MQTT connection...connected + Sending telemetry {"light":652} + Sending telemetry {"light":612} + Sending telemetry {"light":583} + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-telemetry/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal). + +😀 Anda telah berhasil mengirim telemetri dari perangkat Anda. + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/README.md b/translations/id/2-farm/README.md new file mode 100644 index 00000000..f9d4c2dd --- /dev/null +++ b/translations/id/2-farm/README.md @@ -0,0 +1,34 @@ + +# Bertani dengan IoT + +Seiring dengan bertambahnya populasi, permintaan terhadap sektor pertanian juga meningkat. Jumlah lahan yang tersedia tidak berubah, tetapi iklim terus berubah - memberikan tantangan tambahan bagi para petani, terutama 2 miliar [petani subsisten](https://wikipedia.org/wiki/Subsistence_agriculture) yang bergantung pada hasil panen mereka untuk makan dan memberi makan keluarga mereka. IoT dapat membantu petani membuat keputusan yang lebih cerdas tentang apa yang harus ditanam dan kapan harus panen, meningkatkan hasil panen, mengurangi jumlah tenaga kerja manual, serta mendeteksi dan mengatasi hama. + +Dalam 6 pelajaran ini, Anda akan belajar bagaimana menerapkan Internet of Things untuk meningkatkan dan mengotomatisasi pertanian. + +> 💁 Pelajaran ini akan menggunakan beberapa sumber daya cloud. Jika Anda tidak menyelesaikan semua pelajaran dalam proyek ini, pastikan Anda [Membersihkan proyek Anda](../clean-up.md). + +## Topik + +1. [Prediksi pertumbuhan tanaman dengan IoT](lessons/1-predict-plant-growth/README.md) +1. [Deteksi kelembapan tanah](lessons/2-detect-soil-moisture/README.md) +1. [Penyiraman tanaman otomatis](lessons/3-automated-plant-watering/README.md) +1. [Migrasikan tanaman Anda ke cloud](lessons/4-migrate-your-plant-to-the-cloud/README.md) +1. [Migrasikan logika aplikasi Anda ke cloud](lessons/5-migrate-application-to-the-cloud/README.md) +1. [Jaga keamanan tanaman Anda](lessons/6-keep-your-plant-secure/README.md) + +## Kredit + +Semua pelajaran ditulis dengan ♥️ oleh [Jim Bennett](https://GitHub.com/JimBobBennett) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/1-predict-plant-growth/README.md b/translations/id/2-farm/lessons/1-predict-plant-growth/README.md new file mode 100644 index 00000000..82e0e2de --- /dev/null +++ b/translations/id/2-farm/lessons/1-predict-plant-growth/README.md @@ -0,0 +1,284 @@ + +# Prediksi Pertumbuhan Tanaman dengan IoT + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +## Kuis Pra-Pelajaran + +[Kuis Pra-Pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/9) + +## Pendahuluan + +Tanaman membutuhkan beberapa hal untuk tumbuh - air, karbon dioksida, nutrisi, cahaya, dan panas. Dalam pelajaran ini, Anda akan belajar cara menghitung tingkat pertumbuhan dan kematangan tanaman dengan mengukur suhu udara. + +Dalam pelajaran ini kita akan membahas: + +* [Pertanian digital](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Mengapa suhu penting dalam pertanian?](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Mengukur suhu sekitar](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Hari derajat pertumbuhan (GDD)](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Menghitung GDD menggunakan data sensor suhu](../../../../../2-farm/lessons/1-predict-plant-growth) + +## Pertanian Digital + +Pertanian Digital mengubah cara kita bertani, dengan menggunakan alat untuk mengumpulkan, menyimpan, dan menganalisis data dari kegiatan pertanian. Saat ini kita berada dalam periode yang disebut sebagai 'Revolusi Industri Keempat' oleh Forum Ekonomi Dunia, dan munculnya pertanian digital disebut sebagai 'Revolusi Pertanian Keempat', atau 'Pertanian 4.0'. + +> 🎓 Istilah Pertanian Digital juga mencakup seluruh 'rantai nilai pertanian', yaitu seluruh perjalanan dari ladang ke meja makan. Ini termasuk pelacakan kualitas hasil panen saat makanan dikirim dan diproses, sistem gudang dan e-commerce, bahkan aplikasi penyewaan traktor! + +Perubahan ini memungkinkan petani untuk meningkatkan hasil panen, menggunakan lebih sedikit pupuk dan pestisida, serta menghemat air. Meskipun sebagian besar digunakan di negara-negara kaya, sensor dan perangkat lainnya perlahan-lahan menjadi lebih murah, sehingga lebih terjangkau di negara-negara berkembang. + +Beberapa teknik yang dimungkinkan oleh pertanian digital adalah: + +* Pengukuran suhu - mengukur suhu memungkinkan petani memprediksi pertumbuhan dan kematangan tanaman. +* Penyiraman otomatis - mengukur kelembaban tanah dan menyalakan sistem irigasi saat tanah terlalu kering, daripada penyiraman berdasarkan waktu. Penyiraman berdasarkan waktu dapat menyebabkan tanaman kekurangan air selama musim panas yang kering, atau kelebihan air saat hujan. Dengan menyiram hanya saat tanah membutuhkannya, petani dapat mengoptimalkan penggunaan air mereka. +* Pengendalian hama - petani dapat menggunakan kamera pada robot otomatis atau drone untuk memeriksa hama, lalu menerapkan pestisida hanya di tempat yang diperlukan, mengurangi jumlah pestisida yang digunakan dan mengurangi limpasan pestisida ke pasokan air lokal. + +✅ Lakukan penelitian. Teknik lain apa yang digunakan untuk meningkatkan hasil pertanian? + +> 🎓 Istilah 'Pertanian Presisi' digunakan untuk mendefinisikan pengamatan, pengukuran, dan respons terhadap tanaman berdasarkan per ladang, atau bahkan pada bagian tertentu dari ladang. Ini termasuk mengukur tingkat air, nutrisi, dan hama serta merespons secara akurat, seperti menyiram hanya sebagian kecil dari ladang. + +## Mengapa Suhu Penting dalam Pertanian? + +Saat belajar tentang tanaman, kebanyakan siswa diajarkan tentang pentingnya air, cahaya, karbon dioksida, dan nutrisi. Tanaman juga membutuhkan kehangatan untuk tumbuh - inilah mengapa tanaman berbunga di musim semi saat suhu meningkat, mengapa bunga salju atau daffodil dapat tumbuh lebih awal karena periode hangat yang singkat, dan mengapa rumah kaca sangat baik untuk menumbuhkan tanaman. + +> 🎓 Rumah kaca dan rumah panas memiliki fungsi serupa, tetapi dengan perbedaan penting. Rumah panas dipanaskan secara buatan dan memungkinkan petani mengontrol suhu dengan lebih akurat, sedangkan rumah kaca mengandalkan matahari untuk kehangatan dan biasanya hanya memiliki kontrol berupa jendela atau bukaan lain untuk mengeluarkan panas. + +Tanaman memiliki suhu dasar atau minimum, suhu optimal, dan suhu maksimum, semuanya berdasarkan suhu rata-rata harian. + +* Suhu dasar - ini adalah suhu rata-rata harian minimum yang dibutuhkan tanaman untuk tumbuh. +* Suhu optimal - ini adalah suhu rata-rata harian terbaik untuk mendapatkan pertumbuhan maksimal. +* Suhu maksimum - ini adalah suhu maksimum yang dapat ditoleransi tanaman. Di atas suhu ini, tanaman akan menghentikan pertumbuhannya untuk menghemat air dan bertahan hidup. + +> 💁 Ini adalah suhu rata-rata, dihitung dari suhu siang dan malam. Tanaman juga membutuhkan suhu yang berbeda antara siang dan malam untuk membantu mereka berfotosintesis lebih efisien dan menghemat energi di malam hari. + +Setiap spesies tanaman memiliki nilai yang berbeda untuk suhu dasar, optimal, dan maksimum. Inilah mengapa beberapa tanaman tumbuh subur di negara panas, dan lainnya di negara dingin. + +✅ Lakukan penelitian. Untuk tanaman apa pun yang Anda miliki di taman, sekolah, atau taman lokal, coba cari tahu suhu dasarnya. + +![Grafik yang menunjukkan tingkat pertumbuhan meningkat seiring suhu meningkat, lalu menurun saat suhu terlalu tinggi](../../../../../translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.id.png) + +Grafik di atas menunjukkan contoh grafik tingkat pertumbuhan terhadap suhu. Hingga suhu dasar, tidak ada pertumbuhan. Tingkat pertumbuhan meningkat hingga suhu optimal, lalu menurun setelah mencapai puncaknya. Pada suhu maksimum, pertumbuhan berhenti. + +Bentuk grafik ini bervariasi dari satu spesies tanaman ke spesies lainnya. Beberapa memiliki penurunan tajam di atas suhu optimal, beberapa memiliki peningkatan yang lebih lambat dari suhu dasar ke suhu optimal. + +> 💁 Agar petani mendapatkan pertumbuhan terbaik, mereka perlu mengetahui tiga nilai suhu ini dan memahami bentuk grafik untuk tanaman yang mereka tanam. + +Jika seorang petani dapat mengontrol suhu, misalnya di rumah panas komersial, maka mereka dapat mengoptimalkan untuk tanaman mereka. Sebuah rumah panas komersial yang menanam tomat, misalnya, akan mengatur suhu sekitar 25°C di siang hari dan 20°C di malam hari untuk mendapatkan pertumbuhan tercepat. + +> 🍅 Dengan menggabungkan suhu ini dengan lampu buatan, pupuk, dan kontrol tingkat CO2, petani komersial dapat menanam dan memanen sepanjang tahun. + +## Mengukur Suhu Sekitar + +Sensor suhu dapat digunakan dengan perangkat IoT untuk mengukur suhu sekitar. + +### Tugas - mengukur suhu + +Ikuti panduan yang relevan untuk memantau suhu menggunakan perangkat IoT Anda: + +* [Arduino - Wio Terminal](wio-terminal-temp.md) +* [Komputer papan tunggal - Raspberry Pi](pi-temp.md) +* [Komputer papan tunggal - Perangkat virtual](virtual-device-temp.md) + +## Hari Derajat Pertumbuhan + +Hari derajat pertumbuhan (juga dikenal sebagai unit derajat pertumbuhan) adalah cara untuk mengukur pertumbuhan tanaman berdasarkan suhu. Dengan asumsi tanaman memiliki cukup air, nutrisi, dan CO2, suhu menentukan tingkat pertumbuhan. + +Hari derajat pertumbuhan, atau GDD dihitung per hari sebagai suhu rata-rata dalam Celsius untuk satu hari di atas suhu dasar tanaman. Setiap tanaman membutuhkan sejumlah GDD tertentu untuk tumbuh, berbunga, atau menghasilkan dan mematangkan hasil panen. Semakin banyak GDD setiap hari, semakin cepat tanaman akan tumbuh. + +> 🇺🇸 Untuk orang Amerika, hari derajat pertumbuhan juga dapat dihitung menggunakan Fahrenheit. 5 GDD (dalam Celsius) setara dengan 9 GDD (dalam Fahrenheit). + +Rumus lengkap untuk GDD sedikit rumit, tetapi ada persamaan yang disederhanakan yang sering digunakan sebagai pendekatan yang baik: + +![GDD = T max + T min dibagi 2, semua dikurangi T base](../../../../../translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.id.png) + +* **GDD** - ini adalah jumlah hari derajat pertumbuhan +* **T max** - ini adalah suhu maksimum harian dalam derajat Celsius +* **T min** - ini adalah suhu minimum harian dalam derajat Celsius +* **T base** - ini adalah suhu dasar tanaman dalam derajat Celsius + +> 💁 Ada variasi yang menangani T max di atas 30°C atau T min di bawah T base, tetapi kita akan mengabaikannya untuk saat ini. + +### Contoh - Jagung 🌽 + +Tergantung pada varietasnya, jagung membutuhkan antara 800 dan 2.700 GDD untuk matang, dengan suhu dasar 10°C. + +Pada hari pertama di atas suhu dasar, suhu berikut diukur: + +| Pengukuran | Suhu °C | +| :--------- | :-----: | +| Maksimum | 16 | +| Minimum | 12 | + +Memasukkan angka-angka ini ke dalam perhitungan kita: + +* T max = 16 +* T min = 12 +* T base = 10 + +Ini memberikan perhitungan: + +![GDD = 16 + 12 dibagi 2, semua dikurangi 10, memberikan jawaban 4](../../../../../translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.id.png) + +Jagung menerima 4 GDD pada hari itu. Dengan asumsi varietas jagung yang membutuhkan 800 GDD untuk matang, ia akan membutuhkan 796 GDD lagi untuk mencapai kematangan. + +✅ Lakukan penelitian. Untuk tanaman apa pun yang Anda miliki di taman, sekolah, atau taman lokal, coba cari tahu jumlah GDD yang diperlukan untuk mencapai kematangan atau menghasilkan hasil panen. + +## Menghitung GDD Menggunakan Data Sensor Suhu + +Tanaman tidak tumbuh pada tanggal tetap - misalnya, Anda tidak bisa menanam benih dan tahu bahwa tanaman akan berbuah tepat 100 hari kemudian. Sebaliknya, sebagai petani, Anda dapat memiliki perkiraan kasar berapa lama tanaman membutuhkan waktu untuk tumbuh, lalu Anda akan memeriksa setiap hari untuk melihat kapan hasil panen siap. + +Hal ini memiliki dampak besar pada tenaga kerja di ladang besar, dan berisiko petani melewatkan hasil panen yang siap lebih awal dari yang diharapkan. Dengan mengukur suhu, petani dapat menghitung GDD yang diterima tanaman, memungkinkan mereka hanya memeriksa saat mendekati kematangan yang diharapkan. + +Dengan mengumpulkan data suhu menggunakan perangkat IoT, seorang petani dapat diberi tahu secara otomatis ketika tanaman mendekati kematangan. Arsitektur tipikal untuk ini adalah perangkat IoT mengukur suhu, lalu mengirimkan data telemetri ini melalui Internet menggunakan sesuatu seperti MQTT. Kode server kemudian mendengarkan data ini dan menyimpannya di suatu tempat, seperti ke dalam database. Ini berarti data dapat dianalisis nanti, seperti pekerjaan malam untuk menghitung GDD untuk hari itu, menjumlahkan GDD untuk setiap tanaman sejauh ini, dan memberi peringatan jika tanaman mendekati kematangan. + +![Data telemetri dikirim ke server dan kemudian disimpan ke database](../../../../../translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.id.png) + +Kode server juga dapat menambahkan informasi tambahan ke data. Misalnya, perangkat IoT dapat mengirimkan pengenal untuk menunjukkan perangkat mana yang digunakan, dan kode server dapat menggunakan ini untuk mencari lokasi perangkat, serta tanaman apa yang sedang dipantau. Kode server juga dapat menambahkan data dasar seperti waktu saat ini karena beberapa perangkat IoT tidak memiliki perangkat keras yang diperlukan untuk melacak waktu yang akurat, atau memerlukan kode tambahan untuk membaca waktu saat ini melalui Internet. + +✅ Mengapa menurut Anda ladang yang berbeda mungkin memiliki suhu yang berbeda? + +### Tugas - mengirimkan informasi suhu + +Ikuti panduan yang relevan untuk mengirimkan data suhu melalui MQTT menggunakan perangkat IoT Anda sehingga dapat dianalisis nanti: + +* [Arduino - Wio Terminal](wio-terminal-temp-publish.md) +* [Komputer papan tunggal - Raspberry Pi/Perangkat IoT virtual](single-board-computer-temp-publish.md) + +### Tugas - menangkap dan menyimpan informasi suhu + +Setelah perangkat IoT mengirimkan telemetri, kode server dapat ditulis untuk berlangganan data ini dan menyimpannya. Alih-alih menyimpannya ke database, kode server akan menyimpannya ke file Comma Separated Values (CSV). File CSV menyimpan data sebagai baris nilai dalam bentuk teks, dengan setiap nilai dipisahkan oleh koma, dan setiap catatan pada baris baru. Ini adalah cara yang nyaman, dapat dibaca manusia, dan didukung dengan baik untuk menyimpan data sebagai file. + +File CSV akan memiliki dua kolom - *tanggal* dan *suhu*. Kolom *tanggal* diatur sebagai tanggal dan waktu saat pesan diterima oleh server, sedangkan *suhu* berasal dari pesan telemetri. + +1. Ulangi langkah-langkah dalam pelajaran 4 untuk membuat kode server yang berlangganan telemetri. Anda tidak perlu menambahkan kode untuk mengirimkan perintah. + + Langkah-langkah untuk ini adalah: + + * Konfigurasikan dan aktifkan Lingkungan Virtual Python + + * Instal paket pip paho-mqtt + + * Tulis kode untuk mendengarkan pesan MQTT yang diterbitkan pada topik telemetri + + > ⚠️ Anda dapat merujuk ke [instruksi dalam pelajaran 4 untuk membuat aplikasi Python untuk menerima telemetri jika diperlukan](../../../1-getting-started/lessons/4-connect-internet/README.md#receive-telemetry-from-the-mqtt-broker). + + Beri nama folder untuk proyek ini `temperature-sensor-server`. + +1. Pastikan `client_name` mencerminkan proyek ini: + + ```cpp + client_name = id + 'temperature_sensor_server' + ``` + +1. Tambahkan impor berikut di bagian atas file, di bawah impor yang sudah ada: + + ```python + from os import path + import csv + from datetime import datetime + ``` + + Ini mengimpor pustaka untuk membaca file, pustaka untuk berinteraksi dengan file CSV, dan pustaka untuk membantu dengan tanggal dan waktu. + +1. Tambahkan kode berikut sebelum fungsi `handle_telemetry`: + + ```python + temperature_file_name = 'temperature.csv' + fieldnames = ['date', 'temperature'] + + if not path.exists(temperature_file_name): + with open(temperature_file_name, mode='w') as csv_file: + writer = csv.DictWriter(csv_file, fieldnames=fieldnames) + writer.writeheader() + ``` + + Kode ini mendeklarasikan beberapa konstanta untuk nama file yang akan ditulis, dan nama header kolom untuk file CSV. Baris pertama file CSV secara tradisional berisi header kolom yang dipisahkan oleh koma. + + Kode kemudian memeriksa apakah file CSV sudah ada. Jika tidak ada, file tersebut dibuat dengan header kolom pada baris pertama. + +1. Tambahkan kode berikut ke akhir fungsi `handle_telemetry`: + + ```python + with open(temperature_file_name, mode='a') as temperature_file: + temperature_writer = csv.DictWriter(temperature_file, fieldnames=fieldnames) + temperature_writer.writerow({'date' : datetime.now().astimezone().replace(microsecond=0).isoformat(), 'temperature' : payload['temperature']}) + ``` +Kode ini membuka file CSV, lalu menambahkan baris baru di akhir. Baris tersebut berisi data dan waktu saat ini yang diformat dalam format yang mudah dibaca manusia, diikuti oleh suhu yang diterima dari perangkat IoT. Data disimpan dalam [format ISO 8601](https://wikipedia.org/wiki/ISO_8601) dengan zona waktu, tetapi tanpa mikrodetik. + +1. Jalankan kode ini seperti sebelumnya, pastikan perangkat IoT Anda mengirimkan data. File CSV bernama `temperature.csv` akan dibuat di folder yang sama. Jika Anda melihatnya, Anda akan melihat tanggal/waktu dan pengukuran suhu: + + ```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. Jalankan kode ini untuk beberapa waktu untuk menangkap data. Idealnya, Anda harus menjalankannya selama satu hari penuh untuk mengumpulkan cukup data untuk perhitungan GDD. + + +> 💁 Jika Anda menggunakan Perangkat IoT Virtual, pilih kotak centang acak dan tetapkan rentang untuk menghindari mendapatkan suhu yang sama setiap kali nilai suhu dikembalikan. + ![Pilih kotak centang acak dan tetapkan rentang](../../../../../translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.id.png) + + > 💁 Jika Anda ingin menjalankan ini selama satu hari penuh, maka Anda perlu memastikan komputer tempat kode server Anda berjalan tidak akan tidur, baik dengan mengubah pengaturan daya Anda, atau menjalankan sesuatu seperti [skrip Python untuk menjaga sistem tetap aktif](https://github.com/jaqsparow/keep-system-active). + +> 💁 Anda dapat menemukan kode ini di folder [code-server/temperature-sensor-server](../../../../../2-farm/lessons/1-predict-plant-growth/code-server/temperature-sensor-server). + +### Tugas - menghitung GDD menggunakan data yang disimpan + +Setelah server menangkap data suhu, GDD untuk tanaman dapat dihitung. + +Langkah-langkah untuk melakukannya secara manual adalah: + +1. Temukan suhu dasar untuk tanaman. Misalnya, untuk stroberi suhu dasarnya adalah 10°C. + +1. Dari `temperature.csv`, temukan suhu tertinggi dan terendah untuk hari itu. + +1. Gunakan perhitungan GDD yang diberikan sebelumnya untuk menghitung GDD. + +Sebagai contoh, jika suhu tertinggi untuk hari itu adalah 25°C, dan terendah adalah 12°C: + +![GDD = 25 + 12 dibagi 2, lalu kurangi 10 dari hasilnya sehingga menghasilkan 8.5](../../../../../translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.id.png) + +* 25 + 12 = 37 +* 37 / 2 = 18.5 +* 18.5 - 10 = 8.5 + +Oleh karena itu, stroberi telah menerima **8.5** GDD. Stroberi membutuhkan sekitar 250 GDD untuk berbuah, jadi masih perlu waktu. + +--- + +## 🚀 Tantangan + +Tanaman membutuhkan lebih dari sekadar panas untuk tumbuh. Apa hal lain yang dibutuhkan? + +Untuk hal-hal ini, cari tahu apakah ada sensor yang dapat mengukurnya. Bagaimana dengan aktuator untuk mengontrol tingkat tersebut? Bagaimana Anda akan merancang satu atau lebih perangkat IoT untuk mengoptimalkan pertumbuhan tanaman? + +## Kuis Pasca-Pelajaran + +[Kuis Pasca-Pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/10) + +## Tinjauan & Studi Mandiri + +* Baca lebih lanjut tentang pertanian digital di [halaman Wikipedia Pertanian Digital](https://wikipedia.org/wiki/Digital_agriculture). Juga baca lebih lanjut tentang pertanian presisi di [halaman Wikipedia Pertanian Presisi](https://wikipedia.org/wiki/Precision_agriculture). +* Perhitungan hari derajat tumbuh (Growing Degree Days) yang lengkap lebih rumit daripada yang disederhanakan di sini. Baca lebih lanjut tentang persamaan yang lebih rumit dan cara menangani suhu di bawah baseline di [halaman Wikipedia Growing Degree Day](https://wikipedia.org/wiki/Growing_degree-day). +* Makanan mungkin langka di masa depan jika kita masih menggunakan metode yang sama untuk bertani. Pelajari lebih lanjut tentang teknik bertani berteknologi tinggi dalam [video Hi-Tech Farms of Future di YouTube](https://www.youtube.com/watch?v=KIEOuKD9KX8). + +## Tugas + +[Visualisasikan data GDD menggunakan Jupyter Notebook](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau interpretasi yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/1-predict-plant-growth/assignment.md b/translations/id/2-farm/lessons/1-predict-plant-growth/assignment.md new file mode 100644 index 00000000..4a89624e --- /dev/null +++ b/translations/id/2-farm/lessons/1-predict-plant-growth/assignment.md @@ -0,0 +1,57 @@ + +# Visualisasikan Data GDD Menggunakan Jupyter Notebook + +## Instruksi + +Dalam pelajaran ini, Anda telah mengumpulkan data GDD menggunakan sensor IoT. Untuk mendapatkan data GDD yang baik, Anda perlu mengumpulkan data selama beberapa hari. Untuk membantu memvisualisasikan data suhu dan menghitung GDD, Anda dapat menggunakan alat seperti [Jupyter Notebooks](https://jupyter.org) untuk menganalisis data tersebut. + +Mulailah dengan mengumpulkan data selama beberapa hari. Anda perlu memastikan kode server Anda berjalan sepanjang waktu perangkat IoT Anda aktif, baik dengan menyesuaikan pengaturan manajemen daya Anda atau menjalankan sesuatu seperti [skrip Python untuk menjaga sistem tetap aktif ini](https://github.com/jaqsparow/keep-system-active). + +Setelah Anda memiliki data suhu, Anda dapat menggunakan Jupyter Notebook dalam repositori ini untuk memvisualisasikannya dan menghitung GDD. Jupyter Notebook menggabungkan kode dan instruksi dalam blok yang disebut *cell*, sering kali menggunakan kode Python. Anda dapat membaca instruksi, lalu menjalankan setiap blok kode satu per satu. Anda juga dapat mengedit kode tersebut. Dalam notebook ini, misalnya, Anda dapat mengedit suhu dasar yang digunakan untuk menghitung GDD untuk tanaman Anda. + +1. Buat folder bernama `gdd-calculation` + +1. Unduh file [gdd.ipynb](./code-notebook/gdd.ipynb) dan salin ke dalam folder `gdd-calculation`. + +1. Salin file `temperature.csv` yang dibuat oleh server MQTT + +1. Buat lingkungan virtual Python baru di folder `gdd-calculation`. + +1. Instal beberapa paket pip untuk Jupyter Notebook, bersama dengan pustaka yang diperlukan untuk mengelola dan memplot data: + + ```sh + pip install --upgrade pip + pip install pandas + pip install matplotlib + pip install jupyter + ``` + +1. Jalankan notebook di Jupyter: + + ```sh + jupyter notebook gdd.ipynb + ``` + + Jupyter akan mulai dan membuka notebook di browser Anda. Ikuti instruksi dalam notebook untuk memvisualisasikan suhu yang diukur, dan menghitung growing degree days. + + ![The jupyter notebook](../../../../../translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.id.png) + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Peningkatan | +| -------- | ------- | -------- | ----------------- | +| Mengumpulkan data | Mengumpulkan data lengkap setidaknya selama 2 hari | Mengumpulkan data lengkap setidaknya selama 1 hari | Mengumpulkan sebagian data | +| Menghitung GDD | Berhasil menjalankan notebook dan menghitung GDD | Berhasil menjalankan notebook | Tidak dapat menjalankan notebook | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb b/translations/id/2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb new file mode 100644 index 00000000..a4799098 --- /dev/null +++ b/translations/id/2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb @@ -0,0 +1,167 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hari Derajat Pertumbuhan\n", + "\n", + "Notebook ini memuat data suhu yang disimpan dalam file CSV, dan menganalisisnya. Notebook ini membuat grafik suhu, menunjukkan nilai tertinggi dan terendah untuk setiap hari, serta menghitung GDD.\n", + "\n", + "Untuk menggunakan notebook ini:\n", + "\n", + "* Salin file `temperature.csv` ke dalam folder yang sama dengan notebook ini\n", + "* Jalankan semua sel menggunakan tombol **▶︎ Run** di atas. Tombol ini akan menjalankan sel yang dipilih, lalu melanjutkan ke sel berikutnya.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Di sel di bawah, atur `base_temperature` ke suhu dasar tanaman.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "base_temperature = 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "File CSV sekarang perlu dimuat, menggunakan 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": [ + "Setelah data dibaca, data dapat dikelompokkan berdasarkan kolom `date`, dan suhu minimum serta maksimum diekstraksi untuk setiap tanggal.\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 dapat dihitung menggunakan persamaan GDD standar\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**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.\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-27T23:59:42+00:00", + "source_file": "2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb", + "language_code": "id" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/translations/id/2-farm/lessons/1-predict-plant-growth/pi-temp.md b/translations/id/2-farm/lessons/1-predict-plant-growth/pi-temp.md new file mode 100644 index 00000000..a1e4723f --- /dev/null +++ b/translations/id/2-farm/lessons/1-predict-plant-growth/pi-temp.md @@ -0,0 +1,125 @@ + +# Mengukur Suhu - Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor suhu ke Raspberry Pi Anda. + +## Perangkat Keras + +Sensor yang akan Anda gunakan adalah [sensor kelembapan dan suhu DHT11](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html), yang menggabungkan 2 sensor dalam satu paket. Sensor ini cukup populer, dengan banyak sensor yang tersedia secara komersial yang menggabungkan suhu, kelembapan, dan kadang-kadang tekanan atmosfer. Komponen sensor suhu adalah termistor koefisien suhu negatif (NTC), yaitu termistor di mana resistansi berkurang saat suhu meningkat. + +Ini adalah sensor digital, sehingga memiliki ADC onboard untuk membuat sinyal digital yang berisi data suhu dan kelembapan yang dapat dibaca oleh mikrokontroler. + +### Menghubungkan Sensor Suhu + +Sensor suhu Grove dapat dihubungkan ke Raspberry Pi. + +#### Tugas + +Hubungkan sensor suhu + +![Sensor suhu Grove](../../../../../translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.id.png) + +1. Masukkan salah satu ujung kabel Grove ke soket pada sensor kelembapan dan suhu. Kabel hanya dapat masuk dengan satu arah. + +1. Dengan Raspberry Pi dalam keadaan mati, hubungkan ujung lain kabel Grove ke soket digital yang diberi tanda **D5** pada Grove Base hat yang terpasang pada Pi. Soket ini adalah soket kedua dari kiri, pada baris soket di sebelah pin GPIO. + +![Sensor suhu Grove terhubung ke soket A0](../../../../../translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.id.png) + +## Memprogram Sensor Suhu + +Perangkat sekarang dapat diprogram untuk menggunakan sensor suhu yang terpasang. + +### Tugas + +Program perangkat. + +1. Nyalakan Pi dan tunggu hingga selesai booting. + +1. Luncurkan VS Code, baik langsung di Pi, atau sambungkan melalui ekstensi Remote SSH. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk mengatur dan meluncurkan VS Code di pelajaran 1 jika diperlukan](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. Dari terminal, buat folder baru di direktori home pengguna `pi` bernama `temperature-sensor`. Buat file di folder ini bernama `app.py`: + + ```sh + mkdir temperature-sensor + cd temperature-sensor + touch app.py + ``` + +1. Buka folder ini di VS Code. + +1. Untuk menggunakan sensor suhu dan kelembapan, paket Pip tambahan perlu diinstal. Dari Terminal di VS Code, jalankan perintah berikut untuk menginstal paket Pip ini di Pi: + + ```sh + pip3 install seeed-python-dht + ``` + +1. Tambahkan kode berikut ke file `app.py` untuk mengimpor pustaka yang diperlukan: + + ```python + import time + from seeed_dht import DHT + ``` + + Pernyataan `from seeed_dht import DHT` mengimpor kelas `DHT` untuk berinteraksi dengan sensor suhu Grove dari modul `seeed_dht`. + +1. Tambahkan kode berikut setelah kode di atas untuk membuat instance dari kelas yang mengelola sensor suhu: + + ```python + sensor = DHT("11", 5) + ``` + + Ini mendeklarasikan instance dari kelas `DHT` yang mengelola sensor **D**igital **H**umidity dan **T**emperature. Parameter pertama memberi tahu kode bahwa sensor yang digunakan adalah sensor *DHT11* - pustaka yang Anda gunakan mendukung varian lain dari sensor ini. Parameter kedua memberi tahu kode bahwa sensor terhubung ke port digital `D5` pada Grove base hat. + + > ✅ Ingat, semua soket memiliki nomor pin unik. Pin 0, 2, 4, dan 6 adalah pin analog, pin 5, 16, 18, 22, 24, dan 26 adalah pin digital. + +1. Tambahkan loop tak terbatas setelah kode di atas untuk mengambil nilai sensor suhu dan mencetaknya ke konsol: + + ```python + while True: + _, temp = sensor.read() + print(f'Temperature {temp}°C') + ``` + + Panggilan ke `sensor.read()` mengembalikan tuple kelembapan dan suhu. Anda hanya membutuhkan nilai suhu, sehingga kelembapan diabaikan. Nilai suhu kemudian dicetak ke konsol. + +1. Tambahkan jeda kecil selama sepuluh detik di akhir `loop` karena tingkat suhu tidak perlu diperiksa secara terus-menerus. Jeda mengurangi konsumsi daya perangkat. + + ```python + time.sleep(10) + ``` + +1. Dari Terminal VS Code, jalankan perintah berikut untuk menjalankan aplikasi Python Anda: + + ```sh + python3 app.py + ``` + + Anda seharusnya melihat nilai suhu yang ditampilkan di konsol. Gunakan sesuatu untuk menghangatkan sensor, seperti menekan ibu jari Anda pada sensor, atau menggunakan kipas untuk melihat nilai berubah: + + ```output + pi@raspberrypi:~/temperature-sensor $ python3 app.py + Temperature 26°C + Temperature 26°C + Temperature 28°C + Temperature 30°C + Temperature 32°C + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-temperature/pi](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/pi). + +😀 Program sensor suhu Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md b/translations/id/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md new file mode 100644 index 00000000..342c2370 --- /dev/null +++ b/translations/id/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md @@ -0,0 +1,71 @@ + +# Publikasikan Suhu - Perangkat IoT Virtual dan Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan mempublikasikan nilai suhu yang terdeteksi oleh Raspberry Pi atau Perangkat IoT Virtual melalui MQTT sehingga dapat digunakan nanti untuk menghitung GDD. + +## Publikasikan Suhu + +Setelah suhu dibaca, data tersebut dapat dipublikasikan melalui MQTT ke beberapa kode 'server' yang akan membaca nilai tersebut dan menyimpannya untuk digunakan dalam perhitungan GDD. + +### Tugas - Publikasikan Suhu + +Program perangkat untuk mempublikasikan data suhu. + +1. Buka proyek aplikasi `temperature-sensor` jika belum terbuka. + +1. Ulangi langkah-langkah yang Anda lakukan di pelajaran 4 untuk terhubung ke MQTT dan mengirim telemetri. Anda akan menggunakan broker Mosquitto publik yang sama. + + Langkah-langkahnya adalah: + + - Tambahkan paket pip MQTT + - Tambahkan kode untuk terhubung ke broker MQTT + - Tambahkan kode untuk mempublikasikan telemetri + + > ⚠️ Lihat [instruksi untuk terhubung ke MQTT](../../../1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md) dan [instruksi untuk mengirim telemetri](../../../1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md) dari pelajaran 4 jika diperlukan. + +1. Pastikan `client_name` mencerminkan nama proyek ini: + + ```python + client_name = id + 'temperature_sensor_client' + ``` + +1. Untuk telemetri, alih-alih mengirim nilai cahaya, kirim nilai suhu yang dibaca dari sensor DHT dalam properti pada dokumen JSON yang disebut `temperature`: + + ```python + _, temp = sensor.read() + telemetry = json.dumps({'temperature' : temp}) + ``` + +1. Nilai suhu tidak perlu dibaca terlalu sering - suhu tidak akan banyak berubah dalam waktu singkat, jadi atur `time.sleep` menjadi 10 menit: + + ```cpp + time.sleep(10 * 60); + ``` + + > 💁 Fungsi `sleep` menerima waktu dalam detik, sehingga untuk mempermudah pembacaan, nilai tersebut diberikan sebagai hasil dari perhitungan. 60 detik dalam satu menit, jadi 10 x (60 detik dalam satu menit) memberikan jeda 10 menit. + +1. Jalankan kode dengan cara yang sama seperti Anda menjalankan kode dari bagian tugas sebelumnya. Jika Anda menggunakan perangkat IoT virtual, pastikan aplikasi CounterFit berjalan dan sensor kelembapan serta suhu telah dibuat pada pin yang benar. + + ```output + pi@raspberrypi:~/temperature-sensor $ python3 app.py + MQTT connected! + Sending telemetry {"temperature": 25} + Sending telemetry {"temperature": 25} + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-publish-temperature/virtual-device](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/virtual-device) atau folder [code-publish-temperature/pi](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/pi). + +😀 Anda telah berhasil mempublikasikan suhu sebagai telemetri dari perangkat Anda. + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md b/translations/id/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md new file mode 100644 index 00000000..5a228296 --- /dev/null +++ b/translations/id/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md @@ -0,0 +1,154 @@ + +# Mengukur Suhu - Perangkat IoT Virtual + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor suhu ke perangkat IoT virtual Anda. + +## Perangkat Virtual + +Perangkat IoT virtual akan menggunakan sensor simulasi Grove Digital Humidity and Temperature. Ini membuat lab ini tetap sama seperti menggunakan Raspberry Pi dengan sensor fisik Grove DHT11. + +Sensor ini menggabungkan **sensor suhu** dengan **sensor kelembapan**, tetapi dalam lab ini Anda hanya akan fokus pada komponen sensor suhu. Pada perangkat IoT fisik, sensor suhu biasanya berupa [termistor](https://wikipedia.org/wiki/Thermistor) yang mengukur suhu dengan mendeteksi perubahan resistansi seiring perubahan suhu. Sensor suhu biasanya merupakan sensor digital yang secara internal mengonversi resistansi yang terukur menjadi suhu dalam derajat Celsius (atau Kelvin, atau Fahrenheit). + +### Menambahkan Sensor ke CounterFit + +Untuk menggunakan sensor kelembapan dan suhu virtual, Anda perlu menambahkan kedua sensor tersebut ke aplikasi CounterFit. + +#### Tugas - Menambahkan Sensor ke CounterFit + +Tambahkan sensor kelembapan dan suhu ke aplikasi CounterFit. + +1. Buat aplikasi Python baru di komputer Anda dalam folder bernama `temperature-sensor` dengan satu file bernama `app.py` dan lingkungan virtual Python, lalu tambahkan paket pip CounterFit. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk membuat dan mengatur proyek Python CounterFit di pelajaran 1 jika diperlukan](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Instal paket Pip tambahan untuk menginstal shim CounterFit untuk sensor DHT11. Pastikan Anda menginstalnya dari terminal dengan lingkungan virtual yang diaktifkan. + + ```sh + pip install counterfit-shims-seeed-python-dht + ``` + +1. Pastikan aplikasi web CounterFit sedang berjalan. + +1. Buat sensor kelembapan: + + 1. Di kotak *Create sensor* pada panel *Sensors*, buka menu dropdown *Sensor type* dan pilih *Humidity*. + + 1. Biarkan *Units* tetap diatur ke *Percentage*. + + 1. Pastikan *Pin* diatur ke *5*. + + 1. Pilih tombol **Add** untuk membuat sensor kelembapan pada Pin 5. + + ![Pengaturan sensor kelembapan](../../../../../translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.id.png) + + Sensor kelembapan akan dibuat dan muncul di daftar sensor. + + ![Sensor kelembapan dibuat](../../../../../translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.id.png) + +1. Buat sensor suhu: + + 1. Di kotak *Create sensor* pada panel *Sensors*, buka menu dropdown *Sensor type* dan pilih *Temperature*. + + 1. Biarkan *Units* tetap diatur ke *Celsius*. + + 1. Pastikan *Pin* diatur ke *6*. + + 1. Pilih tombol **Add** untuk membuat sensor suhu pada Pin 6. + + ![Pengaturan sensor suhu](../../../../../translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.id.png) + + Sensor suhu akan dibuat dan muncul di daftar sensor. + + ![Sensor suhu dibuat](../../../../../translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.id.png) + +## Memprogram Aplikasi Sensor Suhu + +Aplikasi sensor suhu sekarang dapat diprogram menggunakan sensor CounterFit. + +### Tugas - Memprogram Aplikasi Sensor Suhu + +Program aplikasi sensor suhu. + +1. Pastikan aplikasi `temperature-sensor` terbuka di VS Code. + +1. Buka file `app.py`. + +1. Tambahkan kode berikut ke bagian atas `app.py` untuk menghubungkan aplikasi ke CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Tambahkan kode berikut ke file `app.py` untuk mengimpor pustaka yang diperlukan: + + ```python + import time + from counterfit_shims_seeed_python_dht import DHT + ``` + + Pernyataan `from seeed_dht import DHT` mengimpor kelas `DHT` untuk berinteraksi dengan sensor suhu Grove virtual menggunakan shim dari modul `counterfit_shims_seeed_python_dht`. + +1. Tambahkan kode berikut setelah kode di atas untuk membuat instance kelas yang mengelola sensor kelembapan dan suhu virtual: + + ```python + sensor = DHT("11", 5) + ``` + + Ini mendeklarasikan instance dari kelas `DHT` yang mengelola sensor **D**igital **H**umidity dan **T**emperature virtual. Parameter pertama memberi tahu kode bahwa sensor yang digunakan adalah sensor virtual *DHT11*. Parameter kedua memberi tahu kode bahwa sensor terhubung ke port `5`. + + > 💁 CounterFit mensimulasikan sensor kelembapan dan suhu gabungan ini dengan menghubungkan ke 2 sensor, sensor kelembapan pada pin yang diberikan saat kelas `DHT` dibuat, dan sensor suhu yang berjalan pada pin berikutnya. Jika sensor kelembapan ada di pin 5, shim mengharapkan sensor suhu berada di pin 6. + +1. Tambahkan loop tak terbatas setelah kode di atas untuk membaca nilai sensor suhu dan mencetaknya ke konsol: + + ```python + while True: + _, temp = sensor.read() + print(f'Temperature {temp}°C') + ``` + + Panggilan ke `sensor.read()` mengembalikan tuple kelembapan dan suhu. Anda hanya memerlukan nilai suhu, jadi nilai kelembapan diabaikan. Nilai suhu kemudian dicetak ke konsol. + +1. Tambahkan jeda kecil selama sepuluh detik di akhir `loop` karena tingkat suhu tidak perlu diperiksa secara terus-menerus. Jeda ini mengurangi konsumsi daya perangkat. + + ```python + time.sleep(10) + ``` + +1. Dari Terminal VS Code dengan lingkungan virtual yang diaktifkan, jalankan perintah berikut untuk menjalankan aplikasi Python Anda: + + ```sh + python app.py + ``` + +1. Dari aplikasi CounterFit, ubah nilai sensor suhu yang akan dibaca oleh aplikasi. Anda dapat melakukannya dengan dua cara: + + * Masukkan angka di kotak *Value* untuk sensor suhu, lalu pilih tombol **Set**. Angka yang Anda masukkan akan menjadi nilai yang dikembalikan oleh sensor. + + * Centang kotak *Random*, lalu masukkan nilai *Min* dan *Max*, kemudian pilih tombol **Set**. Setiap kali sensor membaca nilai, sensor akan membaca angka acak antara *Min* dan *Max*. + + Anda seharusnya melihat nilai yang Anda atur muncul di konsol. Ubah pengaturan *Value* atau *Random* untuk melihat nilai berubah. + + ```output + (.venv) ➜ temperature-sensor python app.py + Temperature 28.25°C + Temperature 30.71°C + Temperature 25.17°C + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-temperature/virtual-device](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/virtual-device). + +😀 Program sensor suhu Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md b/translations/id/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md new file mode 100644 index 00000000..595db74d --- /dev/null +++ b/translations/id/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md @@ -0,0 +1,82 @@ + +# Publikasikan Suhu - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan mempublikasikan nilai suhu yang terdeteksi oleh Wio Terminal melalui MQTT sehingga dapat digunakan nanti untuk menghitung GDD. + +## Publikasikan Suhu + +Setelah suhu dibaca, data tersebut dapat dipublikasikan melalui MQTT ke beberapa kode 'server' yang akan membaca nilai tersebut dan menyimpannya untuk digunakan dalam perhitungan GDD. Mikrokontroler tidak secara otomatis membaca waktu dari Internet atau melacak waktu dengan real-time clock, perangkat perlu diprogram untuk melakukannya, dengan asumsi perangkat memiliki perangkat keras yang diperlukan. + +Untuk menyederhanakan pelajaran ini, waktu tidak akan dikirim bersama data sensor, melainkan dapat ditambahkan oleh kode server nanti saat menerima pesan. + +### Tugas + +Program perangkat untuk mempublikasikan data suhu. + +1. Buka proyek `temperature-sensor` Wio Terminal + +1. Ulangi langkah-langkah yang Anda lakukan di pelajaran 4 untuk terhubung ke MQTT dan mengirim telemetri. Anda akan menggunakan broker Mosquitto publik yang sama. + + Langkah-langkahnya adalah: + + - Tambahkan pustaka Seeed WiFi dan MQTT ke file `.ini` + - Tambahkan file konfigurasi dan kode untuk terhubung ke WiFi + - Tambahkan kode untuk terhubung ke broker MQTT + - Tambahkan kode untuk mempublikasikan telemetri + + > ⚠️ Lihat [instruksi untuk terhubung ke MQTT](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md) dan [instruksi untuk mengirim telemetri](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md) dari pelajaran 4 jika diperlukan. + +1. Pastikan `CLIENT_NAME` di file header `config.h` mencerminkan proyek ini: + + ```cpp + const string CLIENT_NAME = ID + "temperature_sensor_client"; + ``` + +1. Untuk telemetri, alih-alih mengirim nilai cahaya, kirim nilai suhu yang dibaca dari sensor DHT dalam properti pada dokumen JSON yang disebut `temperature` dengan mengubah fungsi `loop` di `main.cpp`: + + ```cpp + float temp_hum_val[2] = {0}; + dht.readTempAndHumidity(temp_hum_val); + + DynamicJsonDocument doc(1024); + doc["temperature"] = temp_hum_val[1]; + ``` + +1. Nilai suhu tidak perlu dibaca terlalu sering - suhu tidak akan banyak berubah dalam waktu singkat, jadi atur `delay` dalam fungsi `loop` menjadi 10 menit: + + ```cpp + delay(10 * 60 * 1000); + ``` + + > 💁 Fungsi `delay` menerima waktu dalam milidetik, sehingga untuk mempermudah pembacaan, nilai tersebut diberikan sebagai hasil dari perhitungan. 1.000ms dalam satu detik, 60 detik dalam satu menit, jadi 10 x (60 detik dalam satu menit) x (1.000ms dalam satu detik) menghasilkan penundaan 10 menit. + +1. Unggah ini ke Wio Terminal Anda, dan gunakan serial monitor untuk melihat suhu yang dikirim ke 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} + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-publish-temperature/wio-terminal](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal). + +😀 Anda telah berhasil mempublikasikan suhu sebagai telemetri dari perangkat Anda. + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md b/translations/id/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md new file mode 100644 index 00000000..2e93e2d9 --- /dev/null +++ b/translations/id/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md @@ -0,0 +1,143 @@ + +# Mengukur Suhu - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor suhu ke Wio Terminal Anda, dan membaca nilai suhu darinya. + +## Perangkat Keras + +Wio Terminal membutuhkan sensor suhu. + +Sensor yang akan Anda gunakan adalah [sensor kelembapan dan suhu DHT11](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html), yang menggabungkan 2 sensor dalam satu paket. Sensor ini cukup populer, dengan banyak sensor yang tersedia secara komersial yang menggabungkan suhu, kelembapan, dan kadang-kadang tekanan atmosfer. Komponen sensor suhu adalah termistor koefisien suhu negatif (NTC), yaitu termistor di mana resistansi berkurang saat suhu meningkat. + +Ini adalah sensor digital, sehingga memiliki ADC bawaan untuk membuat sinyal digital yang berisi data suhu dan kelembapan yang dapat dibaca oleh mikrokontroler. + +### Menghubungkan Sensor Suhu + +Sensor suhu Grove dapat dihubungkan ke port digital Wio Terminal. + +#### Tugas - Menghubungkan Sensor Suhu + +Hubungkan sensor suhu. + +![Sensor suhu Grove](../../../../../translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.id.png) + +1. Masukkan salah satu ujung kabel Grove ke soket pada sensor kelembapan dan suhu. Kabel hanya dapat masuk dengan satu arah. + +1. Dengan Wio Terminal terputus dari komputer atau sumber daya lainnya, hubungkan ujung lain kabel Grove ke soket Grove di sisi kanan Wio Terminal saat Anda melihat layar. Ini adalah soket yang paling jauh dari tombol daya. + +![Sensor suhu Grove terhubung ke soket sisi kanan](../../../../../translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.id.png) + +## Memprogram Sensor Suhu + +Wio Terminal sekarang dapat diprogram untuk menggunakan sensor suhu yang terpasang. + +### Tugas - Memprogram Sensor Suhu + +Program perangkat. + +1. Buat proyek Wio Terminal baru menggunakan PlatformIO. Beri nama proyek ini `temperature-sensor`. Tambahkan kode dalam fungsi `setup` untuk mengonfigurasi port serial. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk membuat proyek PlatformIO di proyek 1, pelajaran 1 jika diperlukan](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#create-a-platformio-project). + +1. Tambahkan dependensi pustaka untuk pustaka Seeed Grove Humidity and Temperature sensor ke file `platformio.ini` proyek: + + ```ini + lib_deps = + seeed-studio/Grove Temperature And Humidity Sensor @ 1.0.1 + ``` + + > ⚠️ Anda dapat merujuk ke [instruksi untuk menambahkan pustaka ke proyek PlatformIO di proyek 1, pelajaran 4 jika diperlukan](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md#install-the-wifi-and-mqtt-arduino-libraries). + +1. Tambahkan direktif `#include` berikut ke bagian atas file, di bawah `#include ` yang sudah ada: + + ```cpp + #include + #include + ``` + + Ini mengimpor file yang diperlukan untuk berinteraksi dengan sensor. File header `DHT.h` berisi kode untuk sensor itu sendiri, dan menambahkan header `SPI.h` memastikan kode yang diperlukan untuk berkomunikasi dengan sensor terhubung saat aplikasi dikompilasi. + +1. Sebelum fungsi `setup`, deklarasikan sensor DHT: + + ```cpp + DHT dht(D0, DHT11); + ``` + + Ini mendeklarasikan instance dari kelas `DHT` yang mengelola sensor **D**igital **H**umidity dan **T**emperature. Sensor ini terhubung ke port `D0`, soket Grove di sisi kanan Wio Terminal. Parameter kedua memberi tahu kode bahwa sensor yang digunakan adalah sensor *DHT11* - pustaka yang Anda gunakan mendukung varian lain dari sensor ini. + +1. Dalam fungsi `setup`, tambahkan kode untuk mengatur koneksi serial: + + ```cpp + void setup() + { + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + } + ``` + +1. Di akhir fungsi `setup`, setelah `delay` terakhir, tambahkan panggilan untuk memulai sensor DHT: + + ```cpp + dht.begin(); + ``` + +1. Dalam fungsi `loop`, tambahkan kode untuk memanggil sensor dan mencetak suhu ke port serial: + + ```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); + } + ``` + + Kode ini mendeklarasikan array kosong berisi 2 float, dan meneruskannya ke panggilan `readTempAndHumidity` pada instance `DHT`. Panggilan ini mengisi array dengan 2 nilai - kelembapan masuk ke item ke-0 dalam array (ingat dalam C++ array berbasis 0, jadi item ke-0 adalah 'item pertama' dalam array), dan suhu masuk ke item ke-1. + + Suhu dibaca dari item ke-1 dalam array, dan dicetak ke port serial. + + > 🇺🇸 Suhu dibaca dalam Celsius. Untuk orang Amerika, untuk mengonversi ini ke Fahrenheit, bagi nilai Celsius yang dibaca dengan 5, lalu kalikan dengan 9, lalu tambahkan 32. Sebagai contoh, pembacaan suhu 20°C menjadi ((20/5)*9) + 32 = 68°F. + +1. Bangun dan unggah kode ke Wio Terminal. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk membuat proyek PlatformIO di proyek 1, pelajaran 1 jika diperlukan](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#write-the-hello-world-app). + +1. Setelah diunggah, Anda dapat memantau suhu menggunakan 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.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 + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-temperature/wio-terminal](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/wio-terminal). + +😀 Program sensor suhu Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/2-detect-soil-moisture/README.md b/translations/id/2-farm/lessons/2-detect-soil-moisture/README.md new file mode 100644 index 00000000..897dc0f5 --- /dev/null +++ b/translations/id/2-farm/lessons/2-detect-soil-moisture/README.md @@ -0,0 +1,169 @@ + +C, diucapkan *I-squared-C*, adalah protokol multi-kontroler dan multi-periferal, di mana setiap perangkat yang terhubung dapat bertindak sebagai kontroler atau periferal yang berkomunikasi melalui bus I²C (nama untuk sistem komunikasi yang mentransfer data). Data dikirim dalam bentuk paket yang ditujukan untuk alamat perangkat tertentu yang terhubung. + +> 💁 Model ini sebelumnya disebut master/slave, tetapi istilah ini mulai ditinggalkan karena asosiasinya dengan perbudakan. [Open Source Hardware Association telah mengadopsi istilah kontroler/periferal](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/), meskipun Anda mungkin masih menemukan referensi ke istilah lama. + +Perangkat memiliki alamat yang digunakan saat mereka terhubung ke bus I²C, dan biasanya alamat ini sudah ditentukan di perangkat. Misalnya, setiap jenis sensor Grove dari Seeed memiliki alamat yang sama, jadi semua sensor cahaya memiliki alamat yang sama, semua tombol memiliki alamat yang sama tetapi berbeda dari alamat sensor cahaya. Beberapa perangkat memiliki cara untuk mengubah alamat, seperti dengan mengubah pengaturan jumper atau menyolder pin bersama. + +I²C memiliki bus yang terdiri dari 2 kabel utama, bersama dengan 2 kabel daya: + +| Kabel | Nama | Deskripsi | +| ---- | --------- | ----------- | +| SDA | Serial Data | Kabel ini digunakan untuk mengirim data antar perangkat. | +| SCL | Serial Clock | Kabel ini mengirimkan sinyal jam pada kecepatan yang ditentukan oleh kontroler. | +| VCC | Voltage common collector | Sumber daya untuk perangkat. Kabel ini terhubung ke kabel SDA dan SCL untuk menyediakan daya mereka melalui resistor pull-up yang mematikan sinyal saat tidak ada perangkat yang menjadi kontroler. | +| GND | Ground | Memberikan ground umum untuk rangkaian listrik. | + +![Bus I2C dengan 3 perangkat yang terhubung ke kabel SDA dan SCL, berbagi kabel ground yang sama](../../../../../translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.id.png) + +Untuk mengirim data, satu perangkat akan mengeluarkan kondisi mulai (start condition) untuk menunjukkan bahwa ia siap mengirim data. Perangkat tersebut kemudian menjadi kontroler. Kontroler kemudian mengirimkan alamat perangkat yang ingin dikomunikasikan, bersama dengan informasi apakah ia ingin membaca atau menulis data. Setelah data ditransmisikan, kontroler mengirimkan kondisi berhenti (stop condition) untuk menunjukkan bahwa ia telah selesai. Setelah itu, perangkat lain dapat menjadi kontroler dan mengirim atau menerima data. + +2C memiliki batas kecepatan, dengan 3 mode berbeda yang berjalan pada kecepatan tetap. Mode tercepat adalah High Speed dengan kecepatan maksimum 3,4Mbps (megabit per detik), meskipun sangat sedikit perangkat yang mendukung kecepatan tersebut. Contohnya, Raspberry Pi terbatas pada mode cepat dengan kecepatan 400Kbps (kilobit per detik). Mode standar berjalan pada 100Kbps. + +> 💁 Jika Anda menggunakan Raspberry Pi dengan Grove Base hat sebagai perangkat IoT Anda, Anda akan melihat sejumlah soket I2C pada papan yang dapat digunakan untuk berkomunikasi dengan sensor I2C. Sensor Grove analog juga menggunakan I2C dengan ADC untuk mengirimkan nilai analog sebagai data digital, sehingga sensor cahaya yang Anda gunakan mensimulasikan pin analog, dengan nilai yang dikirim melalui I2C karena Raspberry Pi hanya mendukung pin digital. + +### Universal asynchronous receiver-transmitter (UART) + +UART melibatkan sirkuit fisik yang memungkinkan dua perangkat untuk berkomunikasi. Setiap perangkat memiliki 2 pin komunikasi - transmit (Tx) dan receive (Rx), dengan pin Tx perangkat pertama terhubung ke pin Rx perangkat kedua, dan pin Tx perangkat kedua terhubung ke pin Rx perangkat pertama. Ini memungkinkan data dikirimkan dalam kedua arah. + +* Perangkat 1 mengirimkan data dari pin Tx-nya, yang diterima oleh perangkat 2 di pin Rx-nya +* Perangkat 1 menerima data di pin Rx-nya yang dikirimkan oleh perangkat 2 dari pin Tx-nya + +![UART dengan pin Tx pada satu chip terhubung ke pin Rx pada chip lain, dan sebaliknya](../../../../../translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.id.png) + +> 🎓 Data dikirimkan satu bit pada satu waktu, dan ini dikenal sebagai komunikasi *serial*. Sebagian besar sistem operasi dan mikrokontroler memiliki *serial ports*, yaitu koneksi yang dapat mengirim dan menerima data serial yang tersedia untuk kode Anda. + +Perangkat UART memiliki [baud rate](https://wikipedia.org/wiki/Symbol_rate) (juga dikenal sebagai Symbol rate), yaitu kecepatan data akan dikirim dan diterima dalam bit per detik. Baud rate yang umum adalah 9.600, yang berarti 9.600 bit (0 dan 1) data dikirim setiap detik. + +UART menggunakan bit awal dan bit akhir - yaitu mengirimkan bit awal untuk menunjukkan bahwa ia akan mengirimkan satu byte (8 bit) data, lalu bit akhir setelah mengirimkan 8 bit tersebut. + +Kecepatan UART bergantung pada perangkat keras, tetapi bahkan implementasi tercepat tidak melebihi 6,5 Mbps (megabit per detik, atau jutaan bit, 0 atau 1, yang dikirim per detik). + +Anda dapat menggunakan UART melalui pin GPIO - Anda dapat mengatur satu pin sebagai Tx dan pin lainnya sebagai Rx, lalu menghubungkannya ke perangkat lain. + +> 💁 Jika Anda menggunakan Raspberry Pi dengan Grove Base hat sebagai perangkat IoT Anda, Anda akan melihat soket UART pada papan yang dapat digunakan untuk berkomunikasi dengan sensor yang menggunakan protokol UART. + +### Serial Peripheral Interface (SPI) + +SPI dirancang untuk komunikasi jarak pendek, seperti pada mikrokontroler untuk berbicara dengan perangkat penyimpanan seperti memori flash. SPI didasarkan pada model pengontrol/periferal dengan satu pengontrol (biasanya prosesor perangkat IoT) yang berinteraksi dengan beberapa periferal. Pengontrol mengendalikan semuanya dengan memilih periferal dan mengirim atau meminta data. + +> 💁 Seperti I2C, istilah pengontrol dan periferal adalah perubahan terbaru, jadi Anda mungkin masih melihat istilah lama digunakan. + +Pengontrol SPI menggunakan 3 kabel, bersama dengan 1 kabel tambahan per periferal. Periferal menggunakan 4 kabel. Kabel-kabel ini adalah: + +| Kabel | Nama | Deskripsi | +| ---- | --------- | ----------- | +| COPI | Controller Output, Peripheral Input | Kabel ini untuk mengirim data dari pengontrol ke periferal. | +| CIPO | Controller Input, Peripheral Output | Kabel ini untuk mengirim data dari periferal ke pengontrol. | +| SCLK | Serial Clock | Kabel ini mengirimkan sinyal jam pada kecepatan yang diatur oleh pengontrol. | +| CS | Chip Select | Pengontrol memiliki beberapa kabel, satu per periferal, dan setiap kabel terhubung ke kabel CS pada periferal yang sesuai. | + +![SPI dengan satu pengontrol dan dua periferal](../../../../../translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.id.png) + +Kabel CS digunakan untuk mengaktifkan satu periferal pada satu waktu, berkomunikasi melalui kabel COPI dan CIPO. Ketika pengontrol perlu mengganti periferal, ia menonaktifkan kabel CS yang terhubung ke periferal yang sedang aktif, lalu mengaktifkan kabel yang terhubung ke periferal berikutnya yang ingin diajak berkomunikasi. + +SPI adalah *full-duplex*, yang berarti pengontrol dapat mengirim dan menerima data secara bersamaan dari periferal yang sama menggunakan kabel COPI dan CIPO. SPI menggunakan sinyal jam pada kabel SCLK untuk menjaga perangkat tetap sinkron, sehingga tidak memerlukan bit awal dan akhir seperti pengiriman langsung melalui UART. + +Tidak ada batas kecepatan yang ditentukan untuk SPI, dengan implementasi sering kali mampu mentransmisikan beberapa megabyte data per detik. + +Kit pengembang IoT sering kali mendukung SPI melalui beberapa pin GPIO. Misalnya, pada Raspberry Pi Anda dapat menggunakan pin GPIO 19, 21, 23, 24, dan 26 untuk SPI. + +### Nirkabel + +Beberapa sensor dapat berkomunikasi melalui protokol nirkabel standar, seperti Bluetooth (terutama Bluetooth Low Energy, atau BLE), LoRaWAN (protokol jaringan daya rendah jarak jauh), atau WiFi. Ini memungkinkan sensor jarak jauh yang tidak terhubung secara fisik ke perangkat IoT. + +Salah satu contohnya adalah sensor kelembapan tanah komersial. Sensor ini akan mengukur kelembapan tanah di ladang, lalu mengirimkan data melalui LoRaWAN ke perangkat hub, yang akan memproses data atau mengirimkannya melalui Internet. Ini memungkinkan sensor berada jauh dari perangkat IoT yang mengelola data, mengurangi konsumsi daya dan kebutuhan jaringan WiFi besar atau kabel panjang. + +BLE populer untuk sensor canggih seperti pelacak kebugaran yang digunakan di pergelangan tangan. Sensor ini menggabungkan beberapa sensor dan mengirimkan data sensor ke perangkat IoT dalam bentuk ponsel Anda melalui BLE. + +✅ Apakah Anda memiliki sensor Bluetooth di tubuh Anda, di rumah Anda, atau di sekolah Anda? Ini mungkin termasuk sensor suhu, sensor keberadaan, pelacak perangkat, dan perangkat kebugaran. + +Salah satu cara populer bagi perangkat komersial untuk terhubung adalah Zigbee. Zigbee menggunakan WiFi untuk membentuk jaringan mesh antara perangkat, di mana setiap perangkat terhubung ke sebanyak mungkin perangkat di sekitarnya, membentuk sejumlah besar koneksi seperti jaring laba-laba. Ketika satu perangkat ingin mengirim pesan ke Internet, ia dapat mengirimkannya ke perangkat terdekat, yang kemudian meneruskannya ke perangkat lain di sekitarnya, dan seterusnya, hingga mencapai koordinator dan dapat dikirim ke Internet. + +> 🐝 Nama Zigbee mengacu pada tarian waggle lebah madu setelah mereka kembali ke sarang. + +## Mengukur tingkat kelembapan tanah + +Anda dapat mengukur tingkat kelembapan tanah menggunakan sensor kelembapan tanah, perangkat IoT, dan tanaman hias atau sebidang tanah di dekat Anda. + +### Tugas - mengukur kelembapan tanah + +Ikuti panduan yang relevan untuk mengukur kelembapan tanah menggunakan perangkat IoT Anda: + +* [Arduino - Wio Terminal](wio-terminal-soil-moisture.md) +* [Komputer papan tunggal - Raspberry Pi](pi-soil-moisture.md) +* [Komputer papan tunggal - Perangkat virtual](virtual-device-soil-moisture.md) + +## Kalibrasi sensor + +Sensor bergantung pada pengukuran sifat listrik seperti resistansi atau kapasitansi. + +> 🎓 Resistansi, diukur dalam ohm (Ω), adalah seberapa besar hambatan terhadap arus listrik yang mengalir melalui sesuatu. Ketika tegangan diterapkan pada suatu bahan, jumlah arus yang melewatinya bergantung pada resistansi bahan tersebut. Anda dapat membaca lebih lanjut di [halaman resistansi listrik di Wikipedia](https://wikipedia.org/wiki/Electrical_resistance_and_conductance). + +> 🎓 Kapasitansi, diukur dalam farad (F), adalah kemampuan suatu komponen atau rangkaian untuk mengumpulkan dan menyimpan energi listrik. Anda dapat membaca lebih lanjut tentang kapasitansi di [halaman kapasitansi di Wikipedia](https://wikipedia.org/wiki/Capacitance). + +Pengukuran ini tidak selalu berguna - bayangkan sensor suhu yang memberikan pengukuran 22,5KΩ! Sebaliknya, nilai yang diukur perlu dikonversi ke satuan yang berguna dengan dikalibrasi - yaitu mencocokkan nilai yang diukur dengan kuantitas yang diukur untuk memungkinkan pengukuran baru dikonversi ke satuan yang benar. + +Beberapa sensor sudah dikalibrasi sebelumnya. Misalnya, sensor suhu yang Anda gunakan dalam pelajaran sebelumnya sudah dikalibrasi sehingga dapat mengembalikan pengukuran suhu dalam °C. Di pabrik, sensor pertama yang dibuat akan diekspos ke berbagai suhu yang diketahui dan resistansi diukur. Ini kemudian digunakan untuk membangun perhitungan yang dapat mengonversi dari nilai yang diukur dalam Ω (satuan resistansi) ke °C. + +> 💁 Rumus untuk menghitung resistansi dari suhu disebut [persamaan Steinhart–Hart](https://wikipedia.org/wiki/Steinhart–Hart_equation). + +### Kalibrasi sensor kelembapan tanah + +Kelembapan tanah diukur menggunakan kandungan air gravimetrik atau volumetrik. + +* Gravimetrik adalah berat air dalam satuan berat tanah yang diukur, sebagai jumlah kilogram air per kilogram tanah kering +* Volumetrik adalah volume air dalam satuan volume tanah yang diukur, sebagai jumlah meter kubik air per meter kubik tanah kering + +> 🇺🇸 Untuk orang Amerika, karena konsistensi satuan, ini dapat diukur dalam pound alih-alih kilogram atau kaki kubik alih-alih meter kubik. + +Sensor kelembapan tanah mengukur resistansi atau kapasitansi listrik - ini tidak hanya bervariasi berdasarkan kelembapan tanah, tetapi juga jenis tanah karena komponen dalam tanah dapat mengubah karakteristik listriknya. Idealnya, sensor harus dikalibrasi - yaitu mengambil pembacaan dari sensor dan membandingkannya dengan pengukuran yang ditemukan menggunakan pendekatan yang lebih ilmiah. Misalnya, sebuah laboratorium dapat menghitung kelembapan tanah gravimetrik menggunakan sampel dari ladang tertentu yang diambil beberapa kali dalam setahun, dan angka-angka ini digunakan untuk mengkalibrasi sensor, mencocokkan pembacaan sensor dengan kelembapan tanah gravimetrik. + +![Grafik tegangan vs kandungan kelembapan tanah](../../../../../translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.id.png) + +Grafik di atas menunjukkan cara mengkalibrasi sensor. Tegangan diambil untuk sampel tanah yang kemudian diukur di laboratorium dengan membandingkan berat basah dengan berat kering (dengan mengukur berat basah, lalu mengeringkannya di oven dan mengukur berat kering). Setelah beberapa pembacaan diambil, ini dapat diplot pada grafik dan garis dipasang pada titik-titik tersebut. Garis ini kemudian dapat digunakan untuk mengonversi pembacaan sensor kelembapan tanah yang diambil oleh perangkat IoT menjadi pengukuran kelembapan tanah yang sebenarnya. + +💁 Untuk sensor kelembapan tanah resistif, tegangan meningkat seiring dengan meningkatnya kelembapan tanah. Untuk sensor kelembapan tanah kapasitif, tegangan menurun seiring dengan meningkatnya kelembapan tanah, sehingga grafik untuk sensor ini akan miring ke bawah, bukan ke atas. + +![Nilai kelembapan tanah diinterpolasi dari grafik](../../../../../translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.id.png) + +Grafik di atas menunjukkan pembacaan tegangan dari sensor kelembapan tanah, dan dengan mengikuti garis pada grafik, kelembapan tanah yang sebenarnya dapat dihitung. + +Pendekatan ini berarti petani hanya perlu mendapatkan beberapa pengukuran laboratorium untuk sebuah ladang, lalu mereka dapat menggunakan perangkat IoT untuk mengukur kelembapan tanah - secara drastis mempercepat waktu untuk mengambil pengukuran. + +--- + +## 🚀 Tantangan + +Sensor kelembapan tanah resistif dan kapasitif memiliki sejumlah perbedaan. Apa perbedaan tersebut, dan jenis mana (jika ada) yang terbaik untuk digunakan oleh petani? Apakah jawaban ini berubah antara negara berkembang dan negara maju? + +## Kuis setelah kuliah + +[Kuis setelah kuliah](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/12) + +## Tinjauan & Studi Mandiri + +Baca lebih lanjut tentang perangkat keras dan protokol yang digunakan oleh sensor dan aktuator: + +* [Halaman Wikipedia GPIO](https://wikipedia.org/wiki/General-purpose_input/output) +* [Halaman Wikipedia UART](https://wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter) +* [Halaman Wikipedia SPI](https://wikipedia.org/wiki/Serial_Peripheral_Interface) +* [Halaman Wikipedia I2C](https://wikipedia.org/wiki/I²C) +* [Halaman Wikipedia Zigbee](https://wikipedia.org/wiki/Zigbee) + +## Tugas + +[Kalibrasi sensor Anda](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/2-detect-soil-moisture/assignment.md b/translations/id/2-farm/lessons/2-detect-soil-moisture/assignment.md new file mode 100644 index 00000000..4f3c98ff --- /dev/null +++ b/translations/id/2-farm/lessons/2-detect-soil-moisture/assignment.md @@ -0,0 +1,63 @@ + +# Kalibrasi Sensor Anda + +## Instruksi + +Dalam pelajaran ini, Anda telah mengumpulkan pembacaan sensor kelembapan tanah, diukur dengan nilai dari 0-1023. Untuk mengonversi nilai-nilai ini menjadi pembacaan kelembapan tanah yang sebenarnya, Anda perlu mengkalibrasi sensor Anda. Anda dapat melakukannya dengan mengambil pembacaan dari sampel tanah, lalu menghitung kadar kelembapan tanah gravimetrik dari sampel tersebut. + +Anda perlu mengulangi langkah-langkah ini beberapa kali untuk mendapatkan pembacaan yang diperlukan, dengan tingkat kelembapan tanah yang berbeda setiap kali. + +1. Ambil pembacaan kelembapan tanah menggunakan sensor kelembapan tanah. Catat pembacaan ini. + +1. Ambil sampel tanah, dan timbang. Catat beratnya. + +1. Keringkan tanah - oven hangat pada suhu 110°C (230°F) selama beberapa jam adalah cara terbaik, Anda juga bisa melakukannya di bawah sinar matahari, atau meletakkannya di tempat yang hangat dan kering hingga tanah benar-benar kering. Tanah harus menjadi bubuk dan lepas. + + > 💁 Di laboratorium, untuk hasil yang paling akurat, Anda akan mengeringkan tanah di oven selama 48-72 jam. Jika sekolah Anda memiliki oven pengering, lihat apakah Anda bisa menggunakannya untuk mengeringkan lebih lama. Semakin lama, semakin kering sampel dan semakin akurat hasilnya. + +1. Timbang tanah lagi. + + > 🔥 Jika Anda mengeringkannya di oven, pastikan tanah sudah dingin terlebih dahulu! + +Kelembapan tanah gravimetrik dihitung sebagai: + +![kelembapan tanah % adalah berat basah dikurangi berat kering, dibagi berat kering, dikalikan 100](../../../../../translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.id.png) + +* W +- berat tanah basah +* W +- berat tanah kering + +Sebagai contoh, katakanlah Anda memiliki sampel tanah yang beratnya 212g basah, dan 197g kering. + +![Perhitungan yang sudah diisi](../../../../../translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.id.png) + +* W = 212g +* W = 197g +* 212 - 197 = 15 +* 15 / 197 = 0.076 +* 0.076 * 100 = 7.6% + +Dalam contoh ini, tanah memiliki kelembapan tanah gravimetrik sebesar 7.6%. + +Setelah Anda memiliki pembacaan untuk setidaknya 3 sampel, buat grafik persentase kelembapan tanah terhadap pembacaan sensor kelembapan tanah dan tambahkan garis yang paling sesuai dengan titik-titik tersebut. Anda kemudian dapat menggunakan ini untuk menghitung kadar kelembapan tanah gravimetrik untuk pembacaan sensor tertentu dengan membaca nilai dari garis tersebut. + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Perbaikan | +| -------- | ------- | -------- | ---------------- | +| Mengumpulkan data kalibrasi | Mengambil setidaknya 3 sampel kalibrasi | Mengambil setidaknya 2 sampel kalibrasi | Mengambil setidaknya 1 sampel kalibrasi | +| Membuat pembacaan yang terkalibrasi | Berhasil membuat grafik kalibrasi dan membuat pembacaan dari sensor, serta mengonversinya ke kadar kelembapan tanah gravimetrik | Berhasil membuat grafik kalibrasi | Tidak mampu membuat grafik | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md b/translations/id/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md new file mode 100644 index 00000000..6cc3bb5e --- /dev/null +++ b/translations/id/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md @@ -0,0 +1,108 @@ + +# Mengukur Kelembapan Tanah - Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor kelembapan tanah kapasitif ke Raspberry Pi, dan membaca nilai dari sensor tersebut. + +## Perangkat Keras + +Raspberry Pi membutuhkan sensor kelembapan tanah kapasitif. + +Sensor yang akan Anda gunakan adalah [Capacitive Soil Moisture Sensor](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), yang mengukur kelembapan tanah dengan mendeteksi kapasitansi tanah, sebuah sifat yang berubah seiring perubahan kelembapan tanah. Ketika kelembapan tanah meningkat, tegangan akan menurun. + +Sensor ini adalah sensor analog, sehingga menggunakan pin analog, dan ADC 10-bit di Grove Base Hat pada Pi untuk mengonversi tegangan menjadi sinyal digital dari 1-1.023. Sinyal ini kemudian dikirim melalui I²C menggunakan pin GPIO pada Pi. + +### Hubungkan Sensor Kelembapan Tanah + +Sensor kelembapan tanah Grove dapat dihubungkan ke Raspberry Pi. + +#### Tugas - Hubungkan Sensor Kelembapan Tanah + +Hubungkan sensor kelembapan tanah. + +![Sensor kelembapan tanah Grove](../../../../../translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.id.png) + +1. Masukkan salah satu ujung kabel Grove ke soket pada sensor kelembapan tanah. Kabel hanya dapat masuk dengan satu arah. + +1. Dengan Raspberry Pi dalam keadaan mati, hubungkan ujung kabel Grove lainnya ke soket analog yang ditandai **A0** pada Grove Base Hat yang terpasang di Pi. Soket ini adalah soket kedua dari kanan, pada baris soket di sebelah pin GPIO. + +![Sensor kelembapan tanah Grove terhubung ke soket A0](../../../../../translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.id.png) + +1. Masukkan sensor kelembapan tanah ke dalam tanah. Sensor memiliki 'garis posisi tertinggi' - garis putih melintang pada sensor. Masukkan sensor hingga garis ini, tetapi jangan melebihi garis tersebut. + +![Sensor kelembapan tanah Grove di dalam tanah](../../../../../translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.id.png) + +## Program Sensor Kelembapan Tanah + +Raspberry Pi sekarang dapat diprogram untuk menggunakan sensor kelembapan tanah yang terpasang. + +### Tugas - Program Sensor Kelembapan Tanah + +Program perangkat. + +1. Nyalakan Pi dan tunggu hingga selesai booting. + +1. Luncurkan VS Code, baik langsung di Pi, atau sambungkan melalui ekstensi Remote SSH. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk menyiapkan dan meluncurkan VS Code di nightlight - pelajaran 1 jika diperlukan](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. Dari terminal, buat folder baru di direktori home pengguna `pi` bernama `soil-moisture-sensor`. Buat file di folder ini bernama `app.py`. + +1. Buka folder ini di VS Code. + +1. Tambahkan kode berikut ke file `app.py` untuk mengimpor beberapa pustaka yang diperlukan: + + ```python + import time + from grove.adc import ADC + ``` + + Pernyataan `import time` mengimpor modul `time` yang akan digunakan nanti dalam tugas ini. + + Pernyataan `from grove.adc import ADC` mengimpor `ADC` dari pustaka Python Grove. Pustaka ini memiliki kode untuk berinteraksi dengan konverter analog ke digital pada Pi Base Hat dan membaca tegangan dari sensor analog. + +1. Tambahkan kode berikut di bawah ini untuk membuat instance dari kelas `ADC`: + + ```python + adc = ADC() + ``` + +1. Tambahkan loop tak terbatas yang membaca dari ADC ini pada pin A0, dan menulis hasilnya ke konsol. Loop ini kemudian dapat tidur selama 10 detik di antara pembacaan. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. Jalankan aplikasi Python. Anda akan melihat pengukuran kelembapan tanah ditulis ke konsol. Tambahkan air ke tanah, atau keluarkan sensor dari tanah, dan lihat nilai berubah. + + ```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 + ``` + + Dalam contoh output di atas, Anda dapat melihat tegangan turun saat air ditambahkan. + +> 💁 Anda dapat menemukan kode ini di folder [code/pi](../../../../../2-farm/lessons/2-detect-soil-moisture/code/pi). + +😀 Program sensor kelembapan tanah Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md b/translations/id/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md new file mode 100644 index 00000000..8bf1ff83 --- /dev/null +++ b/translations/id/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md @@ -0,0 +1,123 @@ + +# Mengukur Kelembapan Tanah - Perangkat Keras IoT Virtual + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor kelembapan tanah kapasitif ke perangkat IoT virtual Anda, dan membaca nilai dari sensor tersebut. + +## Perangkat Keras Virtual + +Perangkat IoT virtual akan menggunakan simulasi sensor kelembapan tanah kapasitif Grove. Ini membuat lab ini tetap sama seperti menggunakan Raspberry Pi dengan sensor kelembapan tanah kapasitif Grove fisik. + +Pada perangkat IoT fisik, sensor kelembapan tanah adalah sensor kapasitif yang mengukur kelembapan tanah dengan mendeteksi kapasitansi tanah, sebuah sifat yang berubah seiring dengan perubahan kelembapan tanah. Ketika kelembapan tanah meningkat, tegangan akan menurun. + +Ini adalah sensor analog, sehingga menggunakan ADC 10-bit yang disimulasikan untuk melaporkan nilai dari 1-1.023. + +### Menambahkan Sensor Kelembapan Tanah ke CounterFit + +Untuk menggunakan sensor kelembapan tanah virtual, Anda perlu menambahkannya ke aplikasi CounterFit. + +#### Tugas - Menambahkan Sensor Kelembapan Tanah ke CounterFit + +Tambahkan sensor kelembapan tanah ke aplikasi CounterFit. + +1. Buat aplikasi Python baru di komputer Anda dalam folder bernama `soil-moisture-sensor` dengan satu file bernama `app.py` dan lingkungan virtual Python, lalu tambahkan paket pip CounterFit. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk membuat dan mengatur proyek Python CounterFit di pelajaran 1 jika diperlukan](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Pastikan aplikasi web CounterFit sedang berjalan. + +1. Buat sensor kelembapan tanah: + + 1. Di kotak *Create sensor* pada panel *Sensors*, buka menu dropdown *Sensor type* dan pilih *Soil Moisture*. + + 1. Biarkan *Units* tetap diatur ke *NoUnits*. + + 1. Pastikan *Pin* diatur ke *0*. + + 1. Pilih tombol **Add** untuk membuat sensor *Soil Moisture* pada Pin 0. + + ![Pengaturan sensor kelembapan tanah](../../../../../translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.id.png) + + Sensor kelembapan tanah akan dibuat dan muncul di daftar sensor. + + ![Sensor kelembapan tanah telah dibuat](../../../../../translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.id.png) + +## Memprogram Aplikasi Sensor Kelembapan Tanah + +Aplikasi sensor kelembapan tanah sekarang dapat diprogram menggunakan sensor CounterFit. + +### Tugas - Memprogram Aplikasi Sensor Kelembapan Tanah + +Program aplikasi sensor kelembapan tanah. + +1. Pastikan aplikasi `soil-moisture-sensor` terbuka di VS Code. + +1. Buka file `app.py`. + +1. Tambahkan kode berikut di bagian atas `app.py` untuk menghubungkan aplikasi ke CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Tambahkan kode berikut ke file `app.py` untuk mengimpor beberapa pustaka yang diperlukan: + + ```python + import time + from counterfit_shims_grove.adc import ADC + ``` + + Pernyataan `import time` mengimpor modul `time` yang akan digunakan nanti dalam tugas ini. + + Pernyataan `from counterfit_shims_grove.adc import ADC` mengimpor kelas `ADC` untuk berinteraksi dengan konverter analog ke digital virtual yang dapat terhubung ke sensor CounterFit. + +1. Tambahkan kode berikut di bawah ini untuk membuat instance dari kelas `ADC`: + + ```python + adc = ADC() + ``` + +1. Tambahkan loop tak terbatas yang membaca dari ADC ini pada pin 0 dan menuliskan hasilnya ke konsol. Loop ini kemudian dapat berhenti selama 10 detik di antara pembacaan. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. Dari aplikasi CounterFit, ubah nilai sensor kelembapan tanah yang akan dibaca oleh aplikasi. Anda dapat melakukannya dengan dua cara: + + * Masukkan angka di kotak *Value* untuk sensor kelembapan tanah, lalu pilih tombol **Set**. Angka yang Anda masukkan akan menjadi nilai yang dikembalikan oleh sensor. + + * Centang kotak *Random*, dan masukkan nilai *Min* dan *Max*, lalu pilih tombol **Set**. Setiap kali sensor membaca nilai, sensor akan membaca angka acak antara *Min* dan *Max*. + +1. Jalankan aplikasi Python. Anda akan melihat pengukuran kelembapan tanah ditulis ke konsol. Ubah pengaturan *Value* atau *Random* untuk melihat perubahan nilai. + + ```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 + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code/virtual-device](../../../../../2-farm/lessons/2-detect-soil-moisture/code/virtual-device). + +😀 Program sensor kelembapan tanah Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md b/translations/id/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md new file mode 100644 index 00000000..f9df8130 --- /dev/null +++ b/translations/id/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md @@ -0,0 +1,117 @@ + +# Mengukur Kelembapan Tanah - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor kelembapan tanah kapasitif ke Wio Terminal, dan membaca nilai darinya. + +## Perangkat Keras + +Wio Terminal membutuhkan sensor kelembapan tanah kapasitif. + +Sensor yang akan Anda gunakan adalah [Capacitive Soil Moisture Sensor](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), yang mengukur kelembapan tanah dengan mendeteksi kapasitansi tanah, sebuah sifat yang berubah seiring perubahan kelembapan tanah. Ketika kelembapan tanah meningkat, tegangan akan menurun. + +Ini adalah sensor analog, sehingga terhubung ke pin analog pada Wio Terminal, menggunakan ADC bawaan untuk menghasilkan nilai dari 0-1.023. + +### Hubungkan sensor kelembapan tanah + +Sensor kelembapan tanah Grove dapat dihubungkan ke port analog/digital yang dapat dikonfigurasi pada Wio Terminal. + +#### Tugas - hubungkan sensor kelembapan tanah + +Hubungkan sensor kelembapan tanah. + +![Sensor kelembapan tanah Grove](../../../../../translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.id.png) + +1. Masukkan salah satu ujung kabel Grove ke soket pada sensor kelembapan tanah. Kabel hanya dapat masuk dengan satu arah. + +1. Dengan Wio Terminal tidak terhubung ke komputer atau sumber daya lainnya, hubungkan ujung lain kabel Grove ke soket Grove di sisi kanan Wio Terminal saat Anda melihat layar. Ini adalah soket yang paling jauh dari tombol daya. + +![Sensor kelembapan tanah Grove terhubung ke soket kanan](../../../../../translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.id.png) + +1. Masukkan sensor kelembapan tanah ke dalam tanah. Sensor memiliki 'garis posisi tertinggi' - garis putih melintang pada sensor. Masukkan sensor hingga garis ini, tetapi jangan melewati garis tersebut. + +![Sensor kelembapan tanah Grove di dalam tanah](../../../../../translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.id.png) + +1. Sekarang Anda dapat menghubungkan Wio Terminal ke komputer Anda. + +## Memprogram sensor kelembapan tanah + +Wio Terminal sekarang dapat diprogram untuk menggunakan sensor kelembapan tanah yang terpasang. + +### Tugas - memprogram sensor kelembapan tanah + +Program perangkat. + +1. Buat proyek Wio Terminal baru menggunakan PlatformIO. Beri nama proyek ini `soil-moisture-sensor`. Tambahkan kode dalam fungsi `setup` untuk mengonfigurasi port serial. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk membuat proyek PlatformIO di proyek 1, pelajaran 1 jika diperlukan](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#create-a-platformio-project). + +1. Tidak ada pustaka untuk sensor ini, tetapi Anda dapat membaca dari pin analog menggunakan fungsi bawaan Arduino [`analogRead`](https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/). Mulailah dengan mengonfigurasi pin analog untuk input sehingga nilai dapat dibaca darinya dengan menambahkan kode berikut ke fungsi `setup`. + + ```cpp + pinMode(A0, INPUT); + ``` + + Ini mengatur pin `A0`, pin analog/digital gabungan, sebagai pin input yang dapat membaca tegangan. + +1. Tambahkan kode berikut ke fungsi `loop` untuk membaca tegangan dari pin ini: + + ```cpp + int soil_moisture = analogRead(A0); + ``` + +1. Di bawah kode ini, tambahkan kode berikut untuk mencetak nilai ke port serial: + + ```cpp + Serial.print("Soil Moisture: "); + Serial.println(soil_moisture); + ``` + +1. Akhirnya tambahkan jeda selama 10 detik di akhir: + + ```cpp + delay(10000); + ``` + +1. Bangun dan unggah kode ke Wio Terminal. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk membuat proyek PlatformIO di proyek 1, pelajaran 1 jika diperlukan](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#write-the-hello-world-app). + +1. Setelah diunggah, Anda dapat memantau kelembapan tanah menggunakan serial monitor. Tambahkan air ke tanah, atau keluarkan sensor dari tanah, dan lihat nilai berubah. + + ```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 + ``` + + Dalam contoh output di atas, Anda dapat melihat tegangan turun saat air ditambahkan. + +> 💁 Anda dapat menemukan kode ini di folder [code/wio-terminal](../../../../../2-farm/lessons/2-detect-soil-moisture/code/wio-terminal). + +😀 Program sensor kelembapan tanah Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/3-automated-plant-watering/README.md b/translations/id/2-farm/lessons/3-automated-plant-watering/README.md new file mode 100644 index 00000000..b6e1f967 --- /dev/null +++ b/translations/id/2-farm/lessons/3-automated-plant-watering/README.md @@ -0,0 +1,314 @@ + +# Penyiraman tanaman otomatis + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +Pelajaran ini diajarkan sebagai bagian dari [IoT untuk Pemula Proyek 2 - Seri Pertanian Digital](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) dari [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Penyiraman tanaman otomatis berbasis IoT](https://img.youtube.com/vi/g9FfZwv9R58/0.jpg)](https://youtu.be/g9FfZwv9R58) + +## Kuis sebelum pelajaran + +[Kuis sebelum pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/13) + +## Pendahuluan + +Pada pelajaran sebelumnya, Anda telah belajar cara memantau kelembapan tanah. Dalam pelajaran ini, Anda akan belajar cara membangun komponen inti dari sistem penyiraman otomatis yang merespons kelembapan tanah. Anda juga akan mempelajari tentang waktu - bagaimana sensor membutuhkan waktu untuk merespons perubahan, dan bagaimana aktuator membutuhkan waktu untuk mengubah properti yang diukur oleh sensor. + +Dalam pelajaran ini kita akan membahas: + +* [Mengontrol perangkat berdaya tinggi dari perangkat IoT berdaya rendah](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Mengontrol relay](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Mengontrol tanaman Anda melalui MQTT](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Waktu sensor dan aktuator](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Menambahkan waktu ke server kontrol tanaman Anda](../../../../../2-farm/lessons/3-automated-plant-watering) + +## Mengontrol perangkat berdaya tinggi dari perangkat IoT berdaya rendah + +Perangkat IoT menggunakan tegangan rendah. Meskipun ini cukup untuk sensor dan aktuator berdaya rendah seperti LED, tegangan ini terlalu rendah untuk mengontrol perangkat keras yang lebih besar, seperti pompa air yang digunakan untuk irigasi. Bahkan pompa kecil yang dapat digunakan untuk tanaman rumah membutuhkan arus terlalu besar untuk kit pengembangan IoT dan dapat merusak papan. + +> 🎓 Arus, diukur dalam Ampere (A), adalah jumlah listrik yang bergerak melalui sirkuit. Tegangan memberikan dorongan, arus adalah seberapa banyak yang didorong. Anda dapat membaca lebih lanjut tentang arus di [halaman arus listrik di Wikipedia](https://wikipedia.org/wiki/Electric_current). + +Solusinya adalah menghubungkan pompa ke sumber daya eksternal, dan menggunakan aktuator untuk menyalakan pompa, mirip dengan cara Anda menyalakan lampu. Dibutuhkan sedikit daya (dalam bentuk energi dari tubuh Anda) untuk jari Anda membalikkan saklar, dan ini menghubungkan lampu ke listrik utama yang berjalan pada 110v/240v. + +![Saklar lampu menyalakan daya ke lampu](../../../../../translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.id.png) + +> 🎓 [Listrik utama](https://wikipedia.org/wiki/Mains_electricity) mengacu pada listrik yang disalurkan ke rumah dan bisnis melalui infrastruktur nasional di banyak bagian dunia. + +✅ Perangkat IoT biasanya dapat menyediakan 3.3V atau 5V, dengan arus kurang dari 1 amp (1A). Bandingkan ini dengan listrik utama yang paling sering berada pada 230V (120V di Amerika Utara dan 100V di Jepang), dan dapat menyediakan daya untuk perangkat yang membutuhkan 30A. + +Ada sejumlah aktuator yang dapat melakukan ini, termasuk perangkat mekanis yang dapat Anda pasang ke saklar yang ada untuk meniru jari yang menyalakannya. Yang paling populer adalah relay. + +### Relay + +Relay adalah saklar elektromekanis yang mengubah sinyal listrik menjadi gerakan mekanis yang menyalakan saklar. Inti dari relay adalah elektromagnet. + +> 🎓 [Elektromagnet](https://wikipedia.org/wiki/Electromagnet) adalah magnet yang dibuat dengan mengalirkan listrik melalui kumparan kawat. Ketika listrik dinyalakan, kumparan menjadi magnet. Ketika listrik dimatikan, kumparan kehilangan sifat magnetnya. + +![Ketika menyala, elektromagnet menciptakan medan magnet, menyalakan saklar untuk sirkuit keluaran](../../../../../translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.id.png) + +Dalam relay, sirkuit kontrol memberi daya pada elektromagnet. Ketika elektromagnet menyala, ia menarik tuas yang menggerakkan saklar, menutup sepasang kontak dan menyelesaikan sirkuit keluaran. + +![Ketika mati, elektromagnet tidak menciptakan medan magnet, mematikan saklar untuk sirkuit keluaran](../../../../../translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.id.png) + +Ketika sirkuit kontrol mati, elektromagnet mati, melepaskan tuas dan membuka kontak, mematikan sirkuit keluaran. Relay adalah aktuator digital - sinyal tinggi ke relay menyalakannya, sinyal rendah mematikannya. + +Sirkuit keluaran dapat digunakan untuk memberi daya pada perangkat keras tambahan, seperti sistem irigasi. Perangkat IoT dapat menyalakan relay, menyelesaikan sirkuit keluaran yang memberi daya pada sistem irigasi, dan tanaman mendapatkan air. Perangkat IoT kemudian dapat mematikan relay, memutus daya ke sistem irigasi, mematikan air. + +![Relay menyala, menyalakan pompa yang mengirimkan air ke tanaman](../../../../../images/strawberry-pump.gif) + +Dalam video di atas, relay dinyalakan. LED pada relay menyala untuk menunjukkan bahwa relay menyala (beberapa papan relay memiliki LED untuk menunjukkan apakah relay menyala atau mati), dan daya dikirim ke pompa, menyalakannya dan memompa air ke tanaman. + +> 💁 Relay juga dapat digunakan untuk beralih antara dua sirkuit keluaran daripada menyalakan dan mematikan satu. Saat tuas bergerak, ia memindahkan saklar dari menyelesaikan satu sirkuit keluaran ke menyelesaikan sirkuit keluaran yang berbeda, biasanya berbagi koneksi daya umum, atau koneksi ground umum. + +✅ Lakukan penelitian: Ada beberapa jenis relay, dengan perbedaan seperti apakah sirkuit kontrol menyalakan atau mematikan relay saat daya diterapkan, atau beberapa sirkuit keluaran. Cari tahu tentang jenis-jenis ini. + +Saat tuas bergerak, Anda biasanya dapat mendengar suara klik yang jelas saat tuas membuat kontak dengan elektromagnet. + +> 💁 Relay dapat dihubungkan sehingga membuat koneksi sebenarnya memutus daya ke relay, mematikan relay, yang kemudian mengirimkan daya ke relay menyalakannya kembali, dan seterusnya. Ini berarti relay akan berbunyi klik sangat cepat membuat suara berdengung. Ini adalah cara beberapa bel pintu listrik pertama bekerja. + +### Daya relay + +Elektromagnet tidak membutuhkan banyak daya untuk mengaktifkan dan menarik tuas, ia dapat dikontrol menggunakan keluaran 3.3V atau 5V dari kit pengembangan IoT. Sirkuit keluaran dapat membawa daya yang jauh lebih besar, tergantung pada relay, termasuk tegangan utama atau bahkan tingkat daya yang lebih tinggi untuk penggunaan industri. Dengan cara ini, kit pengembangan IoT dapat mengontrol sistem irigasi, dari pompa kecil untuk satu tanaman, hingga sistem industri besar untuk seluruh pertanian komersial. + +![Relay Grove dengan sirkuit kontrol, sirkuit keluaran, dan relay diberi label](../../../../../translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.id.png) + +Gambar di atas menunjukkan relay Grove. Sirkuit kontrol terhubung ke perangkat IoT dan menyalakan atau mematikan relay menggunakan 3.3V atau 5V. Sirkuit keluaran memiliki dua terminal, salah satunya dapat menjadi daya atau ground. Sirkuit keluaran dapat menangani hingga 250V pada 10A, cukup untuk berbagai perangkat yang menggunakan daya utama. Anda dapat menemukan relay yang dapat menangani tingkat daya yang lebih tinggi. + +![Pompa yang dihubungkan melalui relay](../../../../../translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.id.png) + +Dalam gambar di atas, daya disuplai ke pompa melalui relay. Ada kabel merah yang menghubungkan terminal +5V dari catu daya USB ke salah satu terminal sirkuit keluaran relay, dan kabel merah lainnya menghubungkan terminal lain dari sirkuit keluaran ke pompa. Kabel hitam menghubungkan pompa ke ground pada catu daya USB. Ketika relay menyala, ia menyelesaikan sirkuit, mengirimkan 5V ke pompa, menyalakan pompa. + +## Mengontrol relay + +Anda dapat mengontrol relay dari kit pengembangan IoT Anda. + +### Tugas - mengontrol relay + +Ikuti panduan yang relevan untuk mengontrol relay menggunakan perangkat IoT Anda: + +* [Arduino - Wio Terminal](wio-terminal-relay.md) +* [Komputer papan tunggal - Raspberry Pi](pi-relay.md) +* [Komputer papan tunggal - Perangkat virtual](virtual-device-relay.md) + +## Mengontrol tanaman Anda melalui MQTT + +Sejauh ini relay Anda dikontrol langsung oleh perangkat IoT berdasarkan satu pembacaan kelembapan tanah. Dalam sistem irigasi komersial, logika kontrol akan terpusat, memungkinkan pengambilan keputusan penyiraman menggunakan data dari beberapa sensor, dan memungkinkan konfigurasi apa pun diubah di satu tempat. Untuk mensimulasikan ini, Anda dapat mengontrol relay melalui MQTT. + +### Tugas - mengontrol relay melalui MQTT + +1. Tambahkan pustaka/paket pip MQTT yang relevan dan kode ke proyek `soil-moisture-sensor` Anda untuk terhubung ke MQTT. Beri nama ID klien sebagai `soilmoisturesensor_client` dengan awalan ID Anda. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk terhubung ke MQTT di proyek 1, pelajaran 4 jika diperlukan](../../../1-getting-started/lessons/4-connect-internet/README.md#connect-your-iot-device-to-mqtt). + +1. Tambahkan kode perangkat yang relevan untuk mengirim telemetri dengan pengaturan kelembapan tanah. Untuk pesan telemetri, beri nama properti `soil_moisture`. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk mengirim telemetri ke MQTT di proyek 1, pelajaran 4 jika diperlukan](../../../1-getting-started/lessons/4-connect-internet/README.md#send-telemetry-from-your-iot-device). + +1. Buat beberapa kode server lokal untuk berlangganan telemetri dan mengirim perintah untuk mengontrol relay dalam folder bernama `soil-moisture-sensor-server`. Beri nama properti dalam pesan perintah sebagai `relay_on`, dan tetapkan ID klien sebagai `soilmoisturesensor_server` dengan awalan ID Anda. Pertahankan struktur yang sama seperti kode server yang Anda tulis untuk proyek 1, pelajaran 4 karena Anda akan menambahkan kode ini nanti dalam pelajaran ini. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk mengirim telemetri ke MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#write-the-server-code) dan [mengirim perintah melalui MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#send-commands-to-the-mqtt-broker) di proyek 1, pelajaran 4 jika diperlukan. + +1. Tambahkan kode perangkat yang relevan untuk mengontrol relay dari perintah yang diterima, menggunakan properti `relay_on` dari pesan. Kirim true untuk `relay_on` jika `soil_moisture` lebih besar dari 450, jika tidak kirim false, sama seperti logika yang Anda tambahkan untuk perangkat IoT sebelumnya. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk merespons perintah dari MQTT di proyek 1, pelajaran 4 jika diperlukan](../../../1-getting-started/lessons/4-connect-internet/README.md#handle-commands-on-the-iot-device). + +> 💁 Anda dapat menemukan kode ini di folder [code-mqtt](../../../../../2-farm/lessons/3-automated-plant-watering/code-mqtt). + +Pastikan kode berjalan di perangkat dan server lokal Anda, dan uji dengan mengubah tingkat kelembapan tanah, baik dengan mengubah nilai yang dikirim oleh sensor virtual, atau dengan mengubah tingkat kelembapan tanah dengan menambahkan air atau mengeluarkan sensor dari tanah. + +## Waktu sensor dan aktuator + +Pada pelajaran 3, Anda membuat lampu malam - LED yang menyala segera setelah tingkat cahaya rendah terdeteksi oleh sensor cahaya. Sensor cahaya mendeteksi perubahan tingkat cahaya secara instan, dan perangkat dapat merespons dengan cepat, hanya dibatasi oleh panjang penundaan dalam fungsi `loop` atau `while True:`. Sebagai pengembang IoT, Anda tidak selalu dapat mengandalkan umpan balik yang begitu cepat. + +### Waktu untuk kelembapan tanah + +Jika Anda melakukan pelajaran terakhir tentang kelembapan tanah menggunakan sensor fisik, Anda mungkin memperhatikan bahwa diperlukan beberapa detik untuk pembacaan kelembapan tanah turun setelah Anda menyiram tanaman Anda. Ini bukan karena sensor lambat, tetapi karena air membutuhkan waktu untuk meresap ke dalam tanah. +💁 Jika Anda menyiram terlalu dekat dengan sensor, Anda mungkin melihat pembacaan turun dengan cepat, lalu naik kembali - ini disebabkan oleh air di dekat sensor yang menyebar ke seluruh tanah lainnya, sehingga mengurangi kelembapan tanah di sekitar sensor. +![Pengukuran kelembapan tanah sebesar 658 tidak berubah selama penyiraman, hanya turun menjadi 320 setelah penyiraman ketika air telah meresap ke dalam tanah](../../../../../translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.id.png) + +Pada diagram di atas, pembacaan kelembapan tanah menunjukkan angka 658. Tanaman disiram, tetapi pembacaan ini tidak langsung berubah karena air belum mencapai sensor. Penyiraman bahkan bisa selesai sebelum air mencapai sensor dan nilai turun untuk mencerminkan tingkat kelembapan baru. + +Jika Anda menulis kode untuk mengontrol sistem irigasi melalui relay berdasarkan tingkat kelembapan tanah, Anda perlu mempertimbangkan penundaan ini dan membangun pengaturan waktu yang lebih cerdas ke dalam perangkat IoT Anda. + +✅ Luangkan waktu sejenak untuk memikirkan bagaimana Anda bisa melakukannya. + +### Mengontrol waktu sensor dan aktuator + +Bayangkan Anda ditugaskan untuk membangun sistem irigasi untuk sebuah lahan pertanian. Berdasarkan jenis tanah, tingkat kelembapan tanah yang ideal untuk tanaman yang ditanam telah ditemukan sesuai dengan pembacaan tegangan analog sebesar 400-450. + +Anda bisa memprogram perangkat dengan cara yang sama seperti lampu malam - selama sensor membaca di atas 450, nyalakan relay untuk menyalakan pompa. Masalahnya adalah air membutuhkan waktu untuk mengalir dari pompa, melalui tanah, hingga mencapai sensor. Sensor akan menghentikan air ketika mendeteksi tingkat 450, tetapi tingkat air akan terus turun karena air yang dipompa terus meresap ke dalam tanah. Hasil akhirnya adalah pemborosan air dan risiko kerusakan akar. + +✅ Ingat - terlalu banyak air bisa sama buruknya bagi tanaman seperti terlalu sedikit, dan membuang sumber daya yang berharga. + +Solusi yang lebih baik adalah memahami bahwa ada penundaan antara aktuator yang menyala dan perubahan properti yang dibaca oleh sensor. Ini berarti tidak hanya sensor harus menunggu beberapa saat sebelum mengukur nilai lagi, tetapi aktuator juga perlu dimatikan untuk sementara waktu sebelum pengukuran sensor berikutnya dilakukan. + +Berapa lama relay harus menyala setiap kali? Lebih baik berhati-hati dan hanya menyalakan relay untuk waktu yang singkat, lalu menunggu air meresap, kemudian memeriksa kembali tingkat kelembapan. Bagaimanapun, Anda selalu bisa menyalakan pompa lagi untuk menambahkan lebih banyak air, tetapi Anda tidak bisa mengeluarkan air dari tanah. + +> 💁 Pengaturan waktu seperti ini sangat spesifik untuk perangkat IoT yang Anda bangun, properti yang Anda ukur, serta sensor dan aktuator yang digunakan. + +![Tanaman stroberi terhubung ke air melalui pompa, dengan pompa terhubung ke relay. Relay dan sensor kelembapan tanah pada tanaman keduanya terhubung ke Raspberry Pi](../../../../../translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.id.png) + +Sebagai contoh, saya memiliki tanaman stroberi dengan sensor kelembapan tanah dan pompa yang dikontrol oleh relay. Saya telah mengamati bahwa ketika saya menambahkan air, dibutuhkan sekitar 20 detik agar pembacaan kelembapan tanah stabil. Ini berarti saya perlu mematikan relay dan menunggu 20 detik sebelum memeriksa tingkat kelembapan. Saya lebih memilih terlalu sedikit air daripada terlalu banyak - saya selalu bisa menyalakan pompa lagi, tetapi saya tidak bisa mengeluarkan air dari tanaman. + +![Langkah 1, ambil pengukuran. Langkah 2, tambahkan air. Langkah 3, tunggu air meresap ke dalam tanah. Langkah 4, ambil pengukuran ulang](../../../../../translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.id.png) + +Ini berarti proses terbaik adalah siklus penyiraman yang seperti ini: + +* Nyalakan pompa selama 5 detik +* Tunggu 20 detik +* Periksa kelembapan tanah +* Jika tingkatnya masih di atas yang dibutuhkan, ulangi langkah-langkah di atas + +5 detik mungkin terlalu lama untuk pompa, terutama jika tingkat kelembapan hanya sedikit di atas tingkat yang diperlukan. Cara terbaik untuk mengetahui pengaturan waktu yang tepat adalah mencobanya, lalu menyesuaikan berdasarkan data sensor, dengan umpan balik yang terus-menerus. Ini bahkan bisa mengarah pada pengaturan waktu yang lebih rinci, seperti menyalakan pompa selama 1 detik untuk setiap 100 di atas tingkat kelembapan tanah yang diperlukan, daripada waktu tetap 5 detik. + +✅ Lakukan penelitian: Apakah ada pertimbangan waktu lainnya? Apakah tanaman bisa disiram kapan saja saat kelembapan tanah terlalu rendah, atau ada waktu tertentu dalam sehari yang baik dan buruk untuk menyiram tanaman? + +> 💁 Prediksi cuaca juga bisa dipertimbangkan saat mengontrol sistem penyiraman otomatis untuk tanaman di luar ruangan. Jika hujan diperkirakan akan turun, maka penyiraman bisa ditunda hingga hujan selesai. Pada saat itu, tanah mungkin sudah cukup lembap sehingga tidak perlu disiram, jauh lebih efisien daripada membuang air dengan menyiram tepat sebelum hujan. + +## Tambahkan pengaturan waktu ke server kontrol tanaman Anda + +Kode server dapat dimodifikasi untuk menambahkan kontrol seputar pengaturan waktu siklus penyiraman, dan menunggu tingkat kelembapan tanah berubah. Logika server untuk mengontrol pengaturan waktu relay adalah: + +1. Pesan telemetri diterima +1. Periksa tingkat kelembapan tanah +1. Jika sudah cukup, tidak perlu melakukan apa-apa. Jika pembacaan terlalu tinggi (berarti kelembapan tanah terlalu rendah), maka: + 1. Kirim perintah untuk menyalakan relay + 1. Tunggu selama 5 detik + 1. Kirim perintah untuk mematikan relay + 1. Tunggu selama 20 detik agar tingkat kelembapan tanah stabil + +Siklus penyiraman, proses dari menerima pesan telemetri hingga siap memproses tingkat kelembapan tanah lagi, memakan waktu sekitar 25 detik. Kami mengirimkan tingkat kelembapan tanah setiap 10 detik, sehingga ada tumpang tindih di mana pesan diterima saat server sedang menunggu tingkat kelembapan tanah stabil, yang bisa memulai siklus penyiraman lainnya. + +Ada dua opsi untuk mengatasi ini: + +* Ubah kode perangkat IoT untuk hanya mengirim telemetri setiap menit, dengan cara ini siklus penyiraman akan selesai sebelum pesan berikutnya dikirim +* Berhenti berlangganan telemetri selama siklus penyiraman + +Opsi pertama tidak selalu menjadi solusi yang baik untuk lahan pertanian besar. Petani mungkin ingin menangkap tingkat kelembapan tanah saat tanah sedang disiram untuk analisis di kemudian hari, misalnya untuk mengetahui aliran air di berbagai area di lahan pertanian guna memandu penyiraman yang lebih terarah. Opsi kedua lebih baik - kode hanya mengabaikan telemetri saat tidak bisa menggunakannya, tetapi telemetri tetap ada untuk layanan lain yang mungkin berlangganan. + +> 💁 Data IoT tidak dikirim dari hanya satu perangkat ke hanya satu layanan, melainkan banyak perangkat dapat mengirim data ke broker, dan banyak layanan dapat mendengarkan data dari broker. Misalnya, satu layanan dapat mendengarkan data kelembapan tanah dan menyimpannya dalam database untuk analisis di kemudian hari. Layanan lain juga dapat mendengarkan telemetri yang sama untuk mengontrol sistem irigasi. + +### Tugas - tambahkan pengaturan waktu ke server kontrol tanaman Anda + +Perbarui kode server Anda untuk menjalankan relay selama 5 detik, lalu tunggu 20 detik. + +1. Buka folder `soil-moisture-sensor-server` di VS Code jika belum terbuka. Pastikan lingkungan virtual diaktifkan. + +1. Buka file `app.py` + +1. Tambahkan kode berikut ke file `app.py` di bawah impor yang sudah ada: + + ```python + import threading + ``` + + Pernyataan ini mengimpor `threading` dari pustaka Python, threading memungkinkan Python menjalankan kode lain saat sedang menunggu. + +1. Tambahkan kode berikut sebelum fungsi `handle_telemetry` yang menangani pesan telemetri yang diterima oleh kode server: + + ```python + water_time = 5 + wait_time = 20 + ``` + + Ini mendefinisikan berapa lama relay harus berjalan (`water_time`), dan berapa lama harus menunggu setelahnya untuk memeriksa kelembapan tanah (`wait_time`). + +1. Di bawah kode ini, tambahkan yang berikut: + + ```python + def send_relay_command(client, state): + command = { 'relay_on' : state } + print("Sending message:", command) + client.publish(server_command_topic, json.dumps(command)) + ``` + + Kode ini mendefinisikan fungsi bernama `send_relay_command` yang mengirimkan perintah melalui MQTT untuk mengontrol relay. Telemetri dibuat sebagai dictionary, lalu dikonversi menjadi string JSON. Nilai yang diteruskan ke `state` menentukan apakah relay harus menyala atau mati. + +1. Setelah fungsi `send_relay_code`, tambahkan kode berikut: + + ```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) + ``` + + Ini mendefinisikan fungsi untuk mengontrol relay berdasarkan pengaturan waktu yang diperlukan. Dimulai dengan berhenti berlangganan telemetri sehingga pesan kelembapan tanah tidak diproses saat penyiraman sedang berlangsung. Selanjutnya, mengirimkan perintah untuk menyalakan relay. Kemudian menunggu selama `water_time` sebelum mengirimkan perintah untuk mematikan relay. Akhirnya, menunggu tingkat kelembapan tanah stabil selama `wait_time` detik. Kemudian berlangganan kembali ke telemetri. + +1. Ubah fungsi `handle_telemetry` menjadi berikut: + + ```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() + ``` + + Kode ini memeriksa tingkat kelembapan tanah. Jika lebih besar dari 450, tanah membutuhkan penyiraman, sehingga memanggil fungsi `control_relay`. Fungsi ini dijalankan pada thread terpisah, berjalan di latar belakang. + +1. Pastikan perangkat IoT Anda berjalan, lalu jalankan kode ini. Ubah tingkat kelembapan tanah dan amati apa yang terjadi pada relay - relay harus menyala selama 5 detik lalu tetap mati setidaknya selama 20 detik, hanya menyala jika tingkat kelembapan tanah tidak mencukupi. + + ```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} + ``` + + Cara yang baik untuk menguji ini dalam sistem irigasi simulasi adalah menggunakan tanah kering, lalu tuangkan air secara manual saat relay menyala, berhenti menuangkan saat relay mati. + +> 💁 Anda dapat menemukan kode ini di folder [code-timing](../../../../../2-farm/lessons/3-automated-plant-watering/code-timing). + +> 💁 Jika Anda ingin menggunakan pompa untuk membangun sistem irigasi nyata, maka Anda dapat menggunakan [pompa air 6V](https://www.seeedstudio.com/6V-Mini-Water-Pump-p-1945.html) dengan [catu daya terminal USB](https://www.adafruit.com/product/3628). Pastikan daya ke atau dari pompa terhubung melalui relay. + +--- + +## 🚀 Tantangan + +Bisakah Anda memikirkan perangkat IoT atau perangkat listrik lainnya yang memiliki masalah serupa di mana dibutuhkan waktu agar hasil dari aktuator mencapai sensor? Anda mungkin memiliki beberapa di rumah atau sekolah Anda. + +* Properti apa yang mereka ukur? +* Berapa lama waktu yang dibutuhkan agar properti berubah setelah aktuator digunakan? +* Apakah tidak apa-apa jika properti berubah melewati nilai yang diperlukan? +* Bagaimana cara mengembalikannya ke nilai yang diperlukan jika diperlukan? + +## Kuis setelah kuliah + +[Kuis setelah kuliah](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/14) + +## Tinjauan & Studi Mandiri + +* Baca lebih lanjut tentang relay termasuk penggunaannya secara historis dalam pertukaran telepon di [halaman Wikipedia relay](https://wikipedia.org/wiki/Relay). + +## Tugas + +[Bangun siklus penyiraman yang lebih efisien](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/3-automated-plant-watering/assignment.md b/translations/id/2-farm/lessons/3-automated-plant-watering/assignment.md new file mode 100644 index 00000000..45bca285 --- /dev/null +++ b/translations/id/2-farm/lessons/3-automated-plant-watering/assignment.md @@ -0,0 +1,54 @@ + +# Membangun Siklus Penyiraman yang Lebih Efisien + +## Instruksi + +Pelajaran ini membahas cara mengontrol relay menggunakan data sensor, di mana relay tersebut dapat mengontrol pompa untuk sistem irigasi. Untuk sebidang tanah tertentu, menjalankan pompa selama waktu tertentu seharusnya selalu memiliki dampak yang sama pada kelembapan tanah. Ini berarti Anda dapat memperkirakan berapa detik irigasi yang diperlukan untuk menghasilkan penurunan tertentu pada pembacaan kelembapan tanah. Dengan data ini, Anda dapat membangun sistem irigasi yang lebih terkontrol. + +Untuk tugas ini, Anda akan menghitung berapa lama pompa harus berjalan untuk menghasilkan peningkatan tertentu pada kelembapan tanah. + +> ⚠️ Jika Anda menggunakan perangkat IoT virtual, Anda dapat mengikuti proses ini, tetapi hasilnya disimulasikan dengan meningkatkan pembacaan kelembapan tanah secara manual dengan jumlah tetap per detik saat relay menyala. + +1. Mulailah dengan tanah yang kering. Ukur kelembapan tanah. + +1. Tambahkan sejumlah air tetap, baik dengan menjalankan pompa selama 1 detik atau dengan menuangkan jumlah tetap. + + > Pompa harus selalu berjalan pada kecepatan konstan, sehingga setiap detik pompa berjalan, ia harus menyuplai jumlah air yang sama. + +1. Tunggu hingga tingkat kelembapan tanah stabil dan ambil pembacaan. + +1. Ulangi langkah ini beberapa kali dan buat tabel hasilnya. Contoh tabel diberikan di bawah ini. + + | Total Waktu Pompa | Kelembapan Tanah | Penurunan | + | --- | --: | -: | + | Kering | 643 | 0 | + | 1s | 621 | 22 | + | 2s | 601 | 20 | + | 3s | 579 | 22 | + | 4s | 560 | 19 | + | 5s | 539 | 21 | + | 6s | 521 | 18 | + +1. Hitung rata-rata peningkatan kelembapan tanah per detik air. Dalam contoh di atas, setiap detik air menurunkan pembacaan rata-rata sebesar 20,3. + +1. Gunakan data ini untuk meningkatkan efisiensi kode server Anda, dengan menjalankan pompa selama waktu yang diperlukan untuk mencapai tingkat kelembapan tanah yang diinginkan. + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Peningkatan | +| -------- | ------- | -------- | ----------------- | +| Menangkap data kelembapan tanah | Mampu menangkap beberapa pembacaan setelah menambahkan jumlah air tetap | Mampu menangkap beberapa pembacaan dengan jumlah air tetap | Hanya mampu menangkap satu atau dua pembacaan, atau tidak dapat menggunakan jumlah air tetap | +| Kalibrasi kode server | Mampu menghitung rata-rata penurunan pembacaan kelembapan tanah dan memperbarui kode server untuk menggunakannya | Mampu menghitung rata-rata penurunan, tetapi tidak dapat memperbarui kode server, atau tidak dapat menghitung rata-rata dengan benar, tetapi menggunakan nilai ini untuk memperbarui kode server dengan benar | Tidak mampu menghitung rata-rata, atau memperbarui kode server | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/3-automated-plant-watering/pi-relay.md b/translations/id/2-farm/lessons/3-automated-plant-watering/pi-relay.md new file mode 100644 index 00000000..692d2eae --- /dev/null +++ b/translations/id/2-farm/lessons/3-automated-plant-watering/pi-relay.md @@ -0,0 +1,123 @@ + +# Mengontrol relay - Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan menambahkan relay ke Raspberry Pi Anda selain sensor kelembapan tanah, dan mengontrolnya berdasarkan tingkat kelembapan tanah. + +## Perangkat Keras + +Raspberry Pi membutuhkan relay. + +Relay yang akan Anda gunakan adalah [Grove relay](https://www.seeedstudio.com/Grove-Relay.html), sebuah relay yang biasanya terbuka (artinya sirkuit output terbuka, atau terputus ketika tidak ada sinyal yang dikirim ke relay) yang dapat menangani sirkuit output hingga 250V dan 10A. + +Ini adalah aktuator digital, jadi terhubung ke pin digital pada Grove Base Hat. + +### Hubungkan relay + +Relay Grove dapat dihubungkan ke Raspberry Pi. + +#### Tugas + +Hubungkan relay. + +![Sebuah Grove relay](../../../../../translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.id.png) + +1. Masukkan salah satu ujung kabel Grove ke soket pada relay. Kabel ini hanya dapat masuk dengan satu arah. + +1. Dengan Raspberry Pi dalam keadaan mati, hubungkan ujung lain kabel Grove ke soket digital yang ditandai **D5** pada Grove Base Hat yang terpasang pada Pi. Soket ini adalah soket kedua dari kiri, pada baris soket di sebelah pin GPIO. Biarkan sensor kelembapan tanah tetap terhubung ke soket **A0**. + +![Relay Grove terhubung ke soket D5, dan sensor kelembapan tanah terhubung ke soket A0](../../../../../translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.id.png) + +1. Masukkan sensor kelembapan tanah ke dalam tanah, jika belum dilakukan dari pelajaran sebelumnya. + +## Program relay + +Raspberry Pi sekarang dapat diprogram untuk menggunakan relay yang terpasang. + +### Tugas + +Program perangkat. + +1. Nyalakan Pi dan tunggu hingga selesai booting. + +1. Buka proyek `soil-moisture-sensor` dari pelajaran sebelumnya di VS Code jika belum terbuka. Anda akan menambahkan kode ke proyek ini. + +1. Tambahkan kode berikut ke file `app.py` di bawah bagian impor yang sudah ada: + + ```python + from grove.grove_relay import GroveRelay + ``` + + Pernyataan ini mengimpor `GroveRelay` dari pustaka Python Grove untuk berinteraksi dengan relay Grove. + +1. Tambahkan kode berikut di bawah deklarasi kelas `ADC` untuk membuat instance `GroveRelay`: + + ```python + relay = GroveRelay(5) + ``` + + Ini membuat relay menggunakan pin **D5**, pin digital tempat Anda menghubungkan relay. + +1. Untuk menguji apakah relay berfungsi, tambahkan kode berikut ke dalam loop `while True:`: + + ```python + relay.on() + time.sleep(.5) + relay.off() + ``` + + Kode ini menyalakan relay, menunggu 0,5 detik, lalu mematikan relay. + +1. Jalankan aplikasi Python. Relay akan menyala dan mati setiap 10 detik, dengan jeda setengah detik antara menyala dan mati. Anda akan mendengar relay mengklik saat menyala lalu mengklik lagi saat mati. LED pada papan Grove akan menyala saat relay menyala, lalu mati saat relay mati. + + ![Relay menyala dan mati](../../../../../images/relay-turn-on-off.gif) + +## Mengontrol relay berdasarkan kelembapan tanah + +Sekarang relay berfungsi, relay dapat dikontrol sebagai respons terhadap pembacaan kelembapan tanah. + +### Tugas + +Kontrol relay. + +1. Hapus 3 baris kode yang Anda tambahkan untuk menguji relay. Gantikan dengan kode berikut: + + ```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() + ``` + + Kode ini memeriksa tingkat kelembapan tanah dari sensor kelembapan tanah. Jika nilainya di atas 450, relay akan menyala, dan akan mati jika nilainya di bawah 450. + + > 💁 Ingat bahwa sensor kelembapan tanah kapasitif membaca semakin rendah tingkat kelembapan tanah, semakin banyak kelembapan yang ada di tanah, dan sebaliknya. + +1. Jalankan aplikasi Python. Anda akan melihat relay menyala atau mati tergantung pada tingkat kelembapan tanah. Cobalah pada tanah kering, lalu tambahkan air. + + ```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. + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-relay/pi](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/pi). + +😀 Program sensor kelembapan tanah yang mengontrol relay Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md b/translations/id/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md new file mode 100644 index 00000000..a644f64e --- /dev/null +++ b/translations/id/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md @@ -0,0 +1,127 @@ + +# Mengontrol Relay - Perangkat Keras IoT Virtual + +Dalam bagian pelajaran ini, Anda akan menambahkan relay ke perangkat IoT virtual Anda selain sensor kelembapan tanah, dan mengendalikannya berdasarkan tingkat kelembapan tanah. + +## Perangkat Keras Virtual + +Perangkat IoT virtual akan menggunakan simulasi relay Grove. Ini membuat lab ini tetap sama seperti menggunakan Raspberry Pi dengan relay Grove fisik. + +Pada perangkat IoT fisik, relay biasanya adalah relay normally-open (artinya sirkuit output terbuka, atau terputus ketika tidak ada sinyal yang dikirim ke relay). Relay seperti ini dapat menangani sirkuit output hingga 250V dan 10A. + +### Menambahkan Relay ke CounterFit + +Untuk menggunakan relay virtual, Anda perlu menambahkannya ke aplikasi CounterFit. + +#### Tugas + +Tambahkan relay ke aplikasi CounterFit. + +1. Buka proyek `soil-moisture-sensor` dari pelajaran sebelumnya di VS Code jika belum terbuka. Anda akan menambahkan ke proyek ini. + +1. Pastikan aplikasi web CounterFit sedang berjalan. + +1. Buat relay: + + 1. Di kotak *Create actuator* pada panel *Actuators*, buka menu dropdown *Actuator type* dan pilih *Relay*. + + 1. Atur *Pin* ke *5*. + + 1. Pilih tombol **Add** untuk membuat relay pada Pin 5. + + ![Pengaturan relay](../../../../../translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.id.png) + + Relay akan dibuat dan muncul di daftar aktuator. + + ![Relay yang dibuat](../../../../../translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.id.png) + +## Memprogram Relay + +Aplikasi sensor kelembapan tanah sekarang dapat diprogram untuk menggunakan relay virtual. + +### Tugas + +Program perangkat virtual. + +1. Buka proyek `soil-moisture-sensor` dari pelajaran sebelumnya di VS Code jika belum terbuka. Anda akan menambahkan ke proyek ini. + +1. Tambahkan kode berikut ke file `app.py` di bawah impor yang sudah ada: + + ```python + from counterfit_shims_grove.grove_relay import GroveRelay + ``` + + Pernyataan ini mengimpor `GroveRelay` dari pustaka Grove Python shim untuk berinteraksi dengan relay Grove virtual. + +1. Tambahkan kode berikut di bawah deklarasi kelas `ADC` untuk membuat instance `GroveRelay`: + + ```python + relay = GroveRelay(5) + ``` + + Ini membuat relay menggunakan pin **5**, pin tempat Anda menghubungkan relay. + +1. Untuk menguji apakah relay berfungsi, tambahkan kode berikut ke dalam loop `while True:`: + + ```python + relay.on() + time.sleep(.5) + relay.off() + ``` + + Kode ini menyalakan relay, menunggu 0,5 detik, lalu mematikan relay. + +1. Jalankan aplikasi Python. Relay akan menyala dan mati setiap 10 detik, dengan jeda setengah detik antara menyala dan mati. Anda akan melihat relay virtual di aplikasi CounterFit menutup dan membuka saat relay menyala dan mati. + + ![Relay virtual menyala dan mati](../../../../../images/virtual-relay-turn-on-off.gif) + +## Mengontrol Relay Berdasarkan Kelembapan Tanah + +Sekarang relay sudah berfungsi, relay dapat dikontrol berdasarkan pembacaan kelembapan tanah. + +### Tugas + +Kontrol relay. + +1. Hapus 3 baris kode yang Anda tambahkan untuk menguji relay. Ganti dengan kode berikut di tempatnya: + + ```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() + ``` + + Kode ini memeriksa tingkat kelembapan tanah dari sensor kelembapan tanah. Jika nilainya di atas 450, relay akan menyala, dan akan mati jika nilainya di bawah 450. + + > 💁 Ingat bahwa sensor kelembapan tanah kapasitif membaca: semakin rendah tingkat kelembapan tanah, semakin banyak kelembapan yang ada di tanah, dan sebaliknya. + +1. Jalankan aplikasi Python. Anda akan melihat relay menyala atau mati tergantung pada tingkat kelembapan tanah. Ubah *Value* atau pengaturan *Random* untuk sensor kelembapan tanah untuk melihat perubahan nilai. + + ```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. + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-relay/virtual-device](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/virtual-device). + +😀 Program sensor kelembapan tanah virtual Anda yang mengontrol relay berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md b/translations/id/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md new file mode 100644 index 00000000..078c3f96 --- /dev/null +++ b/translations/id/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md @@ -0,0 +1,25 @@ + +# Mengontrol Relay - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan menambahkan relay ke Wio Terminal Anda selain sensor kelembapan tanah, dan mengontrolnya berdasarkan tingkat kelembapan tanah. + +## Perangkat Keras + +Wio Terminal membutuhkan relay. + +Relay yang akan Anda gunakan adalah [Grove relay](https://www.seeedstudio.com/Grove-Relay.html), sebuah relay yang biasanya terbuka (artinya sirkuit output terbuka atau terputus ketika tidak ada sinyal yang dikirim ke relay) yang dapat menangani sirkuit output hingga 250V dan 10A. + +Ini adalah aktuator digital, sehingga terhubung ke pin digital pada Wio Terminal. Port gabungan analog/digital sudah digunakan dengan sensor kelembapan tanah, jadi relay ini akan terhubung ke port lainnya, yaitu port gabungan I + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md b/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md new file mode 100644 index 00000000..9d859325 --- /dev/null +++ b/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md @@ -0,0 +1,442 @@ + +# Migrasikan tanaman Anda ke cloud + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +Pelajaran ini diajarkan sebagai bagian dari [Proyek IoT untuk Pemula - Seri Pertanian Digital](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) dari [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Hubungkan perangkat Anda ke cloud dengan Azure IoT Hub](https://img.youtube.com/vi/bNxjopXkhvk/0.jpg)](https://youtu.be/bNxjopXkhvk) + +## Kuis sebelum pelajaran + +[Kuis sebelum pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/15) + +## Pengantar + +Pada pelajaran sebelumnya, Anda telah belajar cara menghubungkan tanaman Anda ke broker MQTT dan mengontrol relay dari kode server yang berjalan secara lokal. Ini adalah inti dari sistem penyiraman otomatis yang terhubung ke internet, yang digunakan mulai dari tanaman individu di rumah hingga pertanian komersial. + +Perangkat IoT berkomunikasi dengan broker MQTT publik sebagai cara untuk mendemonstrasikan prinsip-prinsipnya, tetapi ini bukan cara yang paling andal atau aman. Dalam pelajaran ini, Anda akan belajar tentang cloud dan kemampuan IoT yang disediakan oleh layanan cloud publik. Anda juga akan belajar cara memigrasikan tanaman Anda ke salah satu layanan cloud ini dari broker MQTT publik. + +Dalam pelajaran ini kita akan membahas: + +* [Apa itu cloud?](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Buat langganan cloud](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Layanan IoT di cloud](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Buat layanan IoT di cloud](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Berkomunikasi dengan IoT Hub](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Hubungkan perangkat Anda ke layanan IoT](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) + +## Apa itu cloud? + +Sebelum adanya cloud, ketika sebuah perusahaan ingin menyediakan layanan untuk karyawan mereka (seperti database atau penyimpanan file), atau untuk publik (seperti situs web), mereka akan membangun dan menjalankan pusat data. Ini bisa berupa ruangan dengan sejumlah kecil komputer, hingga gedung dengan banyak komputer. Perusahaan akan mengelola semuanya, termasuk: + +* Membeli komputer +* Pemeliharaan perangkat keras +* Daya dan pendinginan +* Jaringan +* Keamanan, termasuk keamanan gedung dan perangkat lunak di komputer +* Instalasi dan pembaruan perangkat lunak + +Hal ini bisa sangat mahal, membutuhkan berbagai macam karyawan yang terampil, dan sangat lambat untuk berubah ketika diperlukan. Misalnya, jika sebuah toko online perlu merencanakan musim liburan yang sibuk, mereka harus merencanakan berbulan-bulan sebelumnya untuk membeli lebih banyak perangkat keras, mengonfigurasinya, menginstalnya, dan menginstal perangkat lunak untuk menjalankan proses penjualan mereka. Setelah musim liburan selesai dan penjualan kembali turun, mereka akan memiliki komputer yang telah mereka bayar tetapi tidak digunakan hingga musim sibuk berikutnya. + +✅ Apakah menurut Anda ini memungkinkan perusahaan untuk bergerak cepat? Jika sebuah toko pakaian online tiba-tiba menjadi populer karena seorang selebriti terlihat mengenakan pakaian mereka, apakah mereka dapat meningkatkan daya komputasi mereka dengan cepat untuk mendukung lonjakan pesanan yang tiba-tiba? + +### Komputer milik orang lain + +Cloud sering kali disebut secara bercanda sebagai 'komputer milik orang lain'. Ide awalnya sederhana - alih-alih membeli komputer, Anda menyewa komputer milik orang lain. Orang lain, penyedia komputasi cloud, akan mengelola pusat data besar. Mereka akan bertanggung jawab untuk membeli dan menginstal perangkat keras, mengelola daya dan pendinginan, jaringan, keamanan gedung, pembaruan perangkat keras dan perangkat lunak, semuanya. Sebagai pelanggan, Anda akan menyewa komputer yang Anda butuhkan, menyewa lebih banyak saat permintaan meningkat, lalu mengurangi jumlah yang Anda sewa jika permintaan menurun. Pusat data cloud ini ada di seluruh dunia. + +![Pusat data cloud Microsoft](../../../../../translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.id.png) +![Ekspansi yang direncanakan untuk pusat data cloud Microsoft](../../../../../translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.id.png) + +Pusat data ini bisa memiliki ukuran beberapa kilometer persegi. Gambar di atas diambil beberapa tahun yang lalu di pusat data cloud Microsoft, dan menunjukkan ukuran awal, bersama dengan ekspansi yang direncanakan. Area yang dibersihkan untuk ekspansi lebih dari 5 kilometer persegi. + +> 💁 Pusat data ini membutuhkan jumlah daya yang sangat besar sehingga beberapa memiliki pembangkit listrik sendiri. Karena ukurannya dan tingkat investasi dari penyedia cloud, mereka biasanya sangat ramah lingkungan. Mereka lebih efisien daripada sejumlah besar pusat data kecil, sebagian besar menggunakan energi terbarukan, dan penyedia cloud bekerja keras untuk mengurangi limbah, mengurangi penggunaan air, dan menanam kembali hutan untuk menggantikan yang ditebang untuk menyediakan ruang membangun pusat data. Anda dapat membaca lebih lanjut tentang bagaimana salah satu penyedia cloud bekerja pada keberlanjutan di [situs keberlanjutan Azure](https://azure.microsoft.com/global-infrastructure/sustainability/?WT.mc_id=academic-17441-jabenn). + +✅ Lakukan penelitian: Bacalah tentang cloud utama seperti [Azure dari Microsoft](https://azure.microsoft.com/?WT.mc_id=academic-17441-jabenn) atau [GCP dari Google](https://cloud.google.com). Berapa banyak pusat data yang mereka miliki, dan di mana lokasi mereka di dunia? + +Menggunakan cloud menjaga biaya tetap rendah untuk perusahaan, dan memungkinkan mereka untuk fokus pada apa yang mereka lakukan terbaik, meninggalkan keahlian komputasi cloud di tangan penyedia. Perusahaan tidak lagi perlu menyewa atau membeli ruang pusat data, membayar penyedia yang berbeda untuk konektivitas dan daya, atau mempekerjakan ahli. Sebaliknya, mereka dapat membayar satu tagihan bulanan kepada penyedia cloud untuk mengurus semuanya. + +Penyedia cloud kemudian dapat menggunakan skala ekonomi untuk menekan biaya, membeli komputer dalam jumlah besar dengan biaya lebih rendah, berinvestasi dalam alat untuk mengurangi beban kerja mereka untuk pemeliharaan, bahkan merancang dan membangun perangkat keras mereka sendiri untuk meningkatkan penawaran cloud mereka. + +### Microsoft Azure + +Azure adalah cloud untuk pengembang dari Microsoft, dan ini adalah cloud yang akan Anda gunakan untuk pelajaran ini. Video di bawah memberikan gambaran singkat tentang Azure: + +[![Video gambaran Azure](../../../../../translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.id.png)](https://www.microsoft.com/videoplayer/embed/RE4Ibng?WT.mc_id=academic-17441-jabenn) + +## Buat langganan cloud + +Untuk menggunakan layanan di cloud, Anda perlu mendaftar untuk langganan dengan penyedia cloud. Untuk pelajaran ini, Anda akan mendaftar untuk langganan Microsoft Azure. Jika Anda sudah memiliki langganan Azure, Anda dapat melewati tugas ini. Detail langganan yang dijelaskan di sini benar pada saat penulisan, tetapi dapat berubah. + +> 💁 Jika Anda mengakses pelajaran ini melalui sekolah Anda, Anda mungkin sudah memiliki langganan Azure yang tersedia untuk Anda. Periksa dengan guru Anda. + +Ada dua jenis langganan Azure gratis yang dapat Anda daftarkan: + +* **Azure untuk Pelajar** - Ini adalah langganan yang dirancang untuk pelajar berusia 18+. Anda tidak memerlukan kartu kredit untuk mendaftar, dan Anda menggunakan alamat email sekolah Anda untuk memvalidasi bahwa Anda adalah pelajar. Saat Anda mendaftar, Anda mendapatkan US$100 untuk digunakan pada sumber daya cloud, bersama dengan layanan gratis termasuk versi gratis dari layanan IoT. Ini berlaku selama 12 bulan, dan Anda dapat memperbarui setiap tahun selama Anda tetap menjadi pelajar. + +* **Langganan Azure gratis** - Ini adalah langganan untuk siapa saja yang bukan pelajar. Anda akan memerlukan kartu kredit untuk mendaftar langganan ini, tetapi kartu Anda tidak akan dikenakan biaya, ini hanya digunakan untuk memverifikasi bahwa Anda adalah manusia nyata, bukan bot. Anda mendapatkan $200 kredit untuk digunakan dalam 30 hari pertama pada layanan apa pun, bersama dengan tingkat gratis dari layanan Azure. Setelah kredit Anda habis, kartu Anda tidak akan dikenakan biaya kecuali Anda mengonversi ke langganan bayar sesuai penggunaan. + +> 💁 Microsoft memang menawarkan langganan Azure untuk Pelajar Starter untuk pelajar di bawah 18 tahun, tetapi pada saat penulisan ini tidak mendukung layanan IoT apa pun. + +### Tugas - daftar untuk langganan cloud gratis + +Jika Anda adalah pelajar berusia 18+, maka Anda dapat mendaftar untuk langganan Azure untuk Pelajar. Anda perlu memvalidasi dengan alamat email sekolah. Anda dapat melakukannya dengan dua cara: + +* Daftar untuk paket pengembang pelajar GitHub di [education.github.com/pack](https://education.github.com/pack). Ini memberi Anda akses ke berbagai alat dan penawaran, termasuk GitHub dan Microsoft Azure. Setelah Anda mendaftar untuk paket pengembang, Anda kemudian dapat mengaktifkan penawaran Azure untuk Pelajar. + +* Daftar langsung untuk akun Azure untuk Pelajar di [azure.microsoft.com/free/students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-17441-jabenn). + +> ⚠️ Jika alamat email sekolah Anda tidak dikenali, buat [isu di repo ini](https://github.com/Microsoft/IoT-For-Beginners/issues) dan kami akan melihat apakah itu dapat ditambahkan ke daftar yang diizinkan Azure untuk Pelajar. + +Jika Anda bukan pelajar, atau Anda tidak memiliki alamat email sekolah yang valid, maka Anda dapat mendaftar untuk langganan Azure Gratis. + +* Daftar untuk Langganan Azure Gratis di [azure.microsoft.com/free](https://azure.microsoft.com/free/?WT.mc_id=academic-17441-jabenn) + +## Layanan IoT di cloud + +Broker MQTT publik yang telah Anda gunakan adalah alat yang hebat saat belajar, tetapi memiliki sejumlah kekurangan sebagai alat untuk digunakan dalam pengaturan komersial: + +* Keandalan - ini adalah layanan gratis tanpa jaminan, dan dapat dimatikan kapan saja +* Keamanan - ini bersifat publik, sehingga siapa pun dapat mendengarkan telemetri Anda atau mengirim perintah untuk mengontrol perangkat keras Anda +* Performa - ini dirancang hanya untuk beberapa pesan uji, sehingga tidak akan mampu menangani sejumlah besar pesan yang dikirim +* Penemuan - tidak ada cara untuk mengetahui perangkat apa yang terhubung + +Layanan IoT di cloud menyelesaikan masalah ini. Mereka dikelola oleh penyedia cloud besar yang berinvestasi besar-besaran dalam keandalan dan siap untuk memperbaiki masalah apa pun yang mungkin muncul. Mereka memiliki keamanan yang terintegrasi untuk menghentikan peretas membaca data Anda atau mengirim perintah palsu. Mereka juga memiliki performa tinggi, mampu menangani jutaan pesan setiap hari, memanfaatkan cloud untuk meningkatkan skala sesuai kebutuhan. + +> 💁 Meskipun Anda membayar untuk keuntungan ini dengan biaya bulanan, sebagian besar penyedia cloud menawarkan versi gratis dari layanan IoT mereka dengan jumlah pesan per hari atau perangkat yang dapat terhubung yang terbatas. Versi gratis ini biasanya lebih dari cukup bagi pengembang untuk mempelajari tentang layanan tersebut. Dalam pelajaran ini Anda akan menggunakan versi gratis. + +Perangkat IoT terhubung ke layanan cloud baik menggunakan SDK perangkat (perpustakaan yang menyediakan kode untuk bekerja dengan fitur layanan), atau langsung melalui protokol komunikasi seperti MQTT atau HTTP. SDK perangkat biasanya merupakan rute termudah karena menangani semuanya untuk Anda, seperti mengetahui topik apa yang harus dipublikasikan atau berlangganan, dan cara menangani keamanan. + +![Perangkat terhubung ke layanan menggunakan SDK perangkat. Kode server juga terhubung ke layanan melalui SDK](../../../../../translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.id.png) + +Perangkat Anda kemudian berkomunikasi dengan bagian lain dari aplikasi Anda melalui layanan ini - mirip dengan cara Anda mengirim telemetri dan menerima perintah melalui MQTT. Ini biasanya menggunakan SDK layanan atau perpustakaan serupa. Pesan datang dari perangkat Anda ke layanan di mana komponen lain dari aplikasi Anda kemudian dapat membacanya, dan pesan kemudian dapat dikirim kembali ke perangkat Anda. + +![Perangkat tanpa kunci rahasia yang valid tidak dapat terhubung ke layanan IoT](../../../../../translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.id.png) + +Layanan ini menerapkan keamanan dengan mengetahui semua perangkat yang dapat terhubung dan mengirim data, baik dengan memiliki perangkat yang telah terdaftar sebelumnya dengan layanan, atau dengan memberikan perangkat kunci rahasia atau sertifikat yang dapat mereka gunakan untuk mendaftarkan diri mereka dengan layanan saat pertama kali terhubung. Perangkat yang tidak dikenal tidak dapat terhubung, jika mereka mencoba layanan akan menolak koneksi dan mengabaikan pesan yang dikirim oleh mereka. + +✅ Lakukan penelitian: Apa kelemahan dari memiliki layanan IoT terbuka di mana perangkat atau kode apa pun dapat terhubung? Bisakah Anda menemukan contoh spesifik peretas yang memanfaatkan hal ini? + +Komponen lain dari aplikasi Anda dapat terhubung ke layanan IoT dan mempelajari semua perangkat yang terhubung atau terdaftar, serta berkomunikasi dengan mereka secara langsung baik secara massal maupun individu. +💁 Layanan IoT juga menerapkan kemampuan tambahan, dan penyedia cloud memiliki layanan serta aplikasi tambahan yang dapat dihubungkan ke layanan tersebut. Sebagai contoh, jika Anda ingin menyimpan semua pesan telemetri yang dikirim oleh semua perangkat ke dalam sebuah database, biasanya hanya membutuhkan beberapa klik pada alat konfigurasi penyedia cloud untuk menghubungkan layanan ke database dan mengalirkan data ke dalamnya. +## Membuat layanan IoT di cloud + +Sekarang Anda memiliki langganan Azure, Anda dapat mendaftar untuk layanan IoT. Layanan IoT dari Microsoft disebut Azure IoT Hub. + +![Logo Azure IoT Hub](../../../../../translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.id.png) + +Video di bawah ini memberikan gambaran singkat tentang Azure IoT Hub: + +[![Video gambaran Azure IoT Hub](https://img.youtube.com/vi/smuZaZZXKsU/0.jpg)](https://www.youtube.com/watch?v=smuZaZZXKsU) + +> 🎥 Klik gambar di atas untuk menonton video + +✅ Luangkan waktu untuk melakukan penelitian dan baca gambaran umum IoT Hub di [dokumentasi Microsoft IoT Hub](https://docs.microsoft.com/azure/iot-hub/about-iot-hub?WT.mc_id=academic-17441-jabenn). + +Layanan cloud yang tersedia di Azure dapat dikonfigurasi melalui portal berbasis web, atau melalui antarmuka baris perintah (CLI). Untuk tugas ini, Anda akan menggunakan CLI. + +### Tugas - instal Azure CLI + +Untuk menggunakan Azure CLI, pertama-tama harus diinstal di PC atau Mac Anda. + +1. Ikuti petunjuk di [dokumentasi Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli?WT.mc_id=academic-17441-jabenn) untuk menginstal CLI. + +1. Azure CLI mendukung sejumlah ekstensi yang menambahkan kemampuan untuk mengelola berbagai layanan Azure. Instal ekstensi IoT dengan menjalankan perintah berikut dari baris perintah atau terminal Anda: + + ```sh + az extension add --name azure-iot + ``` + +1. Dari baris perintah atau terminal Anda, jalankan perintah berikut untuk masuk ke langganan Azure Anda dari Azure CLI. + + ```sh + az login + ``` + + Sebuah halaman web akan diluncurkan di browser default Anda. Masuk menggunakan akun yang Anda gunakan untuk mendaftar langganan Azure Anda. Setelah Anda masuk, Anda dapat menutup tab browser. + +1. Jika Anda memiliki beberapa langganan Azure, seperti langganan yang disediakan oleh sekolah, dan langganan Azure untuk Pelajar Anda sendiri, Anda perlu memilih yang ingin Anda gunakan. Jalankan perintah berikut untuk melihat semua langganan yang Anda miliki aksesnya: + + ```sh + az account list --output table + ``` + + Dalam output, Anda akan melihat nama setiap langganan bersama dengan `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 + ``` + + Untuk memilih langganan yang ingin Anda gunakan, gunakan perintah berikut: + + ```sh + az account set --subscription + ``` + + Ganti `` dengan Id dari langganan yang ingin Anda gunakan. Setelah menjalankan perintah ini, jalankan kembali perintah untuk melihat akun Anda. Anda akan melihat kolom `IsDefault` akan ditandai sebagai `True` untuk langganan yang baru saja Anda tetapkan. + +### Tugas - membuat grup sumber daya + +Layanan Azure, seperti instance IoT Hub, mesin virtual, basis data, atau layanan AI, disebut sebagai **sumber daya**. Setiap sumber daya harus berada di dalam **Grup Sumber Daya**, yaitu pengelompokan logis dari satu atau lebih sumber daya. + +> 💁 Dengan menggunakan grup sumber daya, Anda dapat mengelola beberapa layanan sekaligus. Misalnya, setelah Anda menyelesaikan semua pelajaran untuk proyek ini, Anda dapat menghapus grup sumber daya, dan semua sumber daya di dalamnya akan dihapus secara otomatis. + +1. Ada beberapa pusat data Azure di seluruh dunia, yang dibagi menjadi wilayah. Saat Anda membuat sumber daya atau grup sumber daya Azure, Anda harus menentukan di mana Anda ingin membuatnya. Jalankan perintah berikut untuk mendapatkan daftar lokasi: + + ```sh + az account list-locations --output table + ``` + + Anda akan melihat daftar lokasi. Daftar ini akan panjang. + + > 💁 Pada saat penulisan, ada 65 lokasi yang dapat Anda gunakan untuk penyebaran. + + ```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 + ... + ``` + + Catat nilai dari kolom `Name` dari wilayah yang paling dekat dengan Anda. Anda dapat menemukan wilayah tersebut di peta pada [halaman geografi Azure](https://azure.microsoft.com/global-infrastructure/geographies/?WT.mc_id=academic-17441-jabenn). + +1. Jalankan perintah berikut untuk membuat grup sumber daya bernama `soil-moisture-sensor`. Nama grup sumber daya harus unik dalam langganan Anda. + + ```sh + az group create --name soil-moisture-sensor \ + --location + ``` + + Ganti `` dengan lokasi yang Anda pilih pada langkah sebelumnya. + +### Tugas - membuat IoT Hub + +Sekarang Anda dapat membuat sumber daya IoT Hub di grup sumber daya Anda. + +1. Gunakan perintah berikut untuk membuat sumber daya IoT Hub Anda: + + ```sh + az iot hub create --resource-group soil-moisture-sensor \ + --sku F1 \ + --partition-count 2 \ + --name + ``` + + Ganti `` dengan nama untuk hub Anda. Nama ini harus unik secara global - artinya tidak ada IoT Hub lain yang dibuat oleh siapa pun yang dapat memiliki nama yang sama. Nama ini digunakan dalam URL yang menunjuk ke hub, sehingga harus unik. Gunakan sesuatu seperti `soil-moisture-sensor-` dan tambahkan pengidentifikasi unik di akhir, seperti beberapa kata acak atau nama Anda. + + Opsi `--sku F1` memberi tahu untuk menggunakan tingkat gratis. Tingkat gratis mendukung 8.000 pesan sehari bersama dengan sebagian besar fitur dari tingkat berbayar penuh. + + > 🎓 Tingkat harga yang berbeda dari layanan Azure disebut sebagai tingkat. Setiap tingkat memiliki biaya yang berbeda dan menyediakan fitur atau volume data yang berbeda. + + > 💁 Jika Anda ingin mempelajari lebih lanjut tentang harga, Anda dapat melihat [panduan harga Azure IoT Hub](https://azure.microsoft.com/pricing/details/iot-hub/?WT.mc_id=academic-17441-jabenn). + + Opsi `--partition-count 2` mendefinisikan berapa banyak aliran data yang didukung oleh IoT Hub, lebih banyak partisi mengurangi pemblokiran data saat beberapa hal membaca dan menulis dari IoT Hub. Partisi berada di luar cakupan pelajaran ini, tetapi nilai ini perlu diatur untuk membuat IoT Hub tingkat gratis. + + > 💁 Anda hanya dapat memiliki satu IoT Hub tingkat gratis per langganan. + +IoT Hub akan dibuat. Proses ini mungkin memakan waktu satu menit atau lebih untuk selesai. + +## Berkomunikasi dengan IoT Hub + +Dalam pelajaran sebelumnya, Anda menggunakan MQTT dan mengirim pesan bolak-balik pada topik yang berbeda, dengan topik yang berbeda memiliki tujuan yang berbeda. Alih-alih mengirim pesan melalui topik yang berbeda, IoT Hub memiliki sejumlah cara yang ditentukan untuk perangkat berkomunikasi dengan Hub, atau Hub berkomunikasi dengan perangkat. + +> 💁 Di balik layar, komunikasi antara IoT Hub dan perangkat Anda dapat menggunakan MQTT, HTTPS, atau AMQP. + +* Pesan dari perangkat ke cloud (D2C) - ini adalah pesan yang dikirim dari perangkat ke IoT Hub, seperti telemetri. Pesan ini kemudian dapat dibaca dari IoT Hub oleh kode aplikasi Anda. + + > 🎓 Di balik layar, IoT Hub menggunakan layanan Azure yang disebut [Event Hubs](https://docs.microsoft.com/azure/event-hubs/?WT.mc_id=academic-17441-jabenn). Saat Anda menulis kode untuk membaca pesan yang dikirim ke hub, pesan ini sering disebut sebagai peristiwa. + +* Pesan dari cloud ke perangkat (C2D) - ini adalah pesan yang dikirim dari kode aplikasi, melalui IoT Hub ke perangkat IoT. + +* Permintaan metode langsung - ini adalah pesan yang dikirim dari kode aplikasi melalui IoT Hub ke perangkat IoT untuk meminta perangkat melakukan sesuatu, seperti mengontrol aktuator. Pesan ini memerlukan respons sehingga kode aplikasi Anda dapat mengetahui apakah pesan tersebut berhasil diproses. + +* Device twins - ini adalah dokumen JSON yang disinkronkan antara perangkat dan IoT Hub, dan digunakan untuk menyimpan pengaturan atau properti lain yang dilaporkan oleh perangkat, atau yang harus diatur pada perangkat (disebut sebagai desired) oleh IoT Hub. + +IoT Hub dapat menyimpan pesan dan permintaan metode langsung untuk periode waktu yang dapat dikonfigurasi (defaultnya satu hari), sehingga jika perangkat atau kode aplikasi kehilangan koneksi, perangkat masih dapat mengambil pesan yang dikirim saat offline setelah terhubung kembali. Device twins disimpan secara permanen di IoT Hub, sehingga kapan saja perangkat dapat terhubung kembali dan mendapatkan device twin terbaru. + +✅ Lakukan penelitian: Baca lebih lanjut tentang jenis pesan ini di [panduan komunikasi perangkat-ke-cloud](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-d2c-guidance?WT.mc_id=academic-17441-jabenn), dan [panduan komunikasi cloud-ke-perangkat](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-c2d-guidance?WT.mc_id=academic-17441-jabenn) dalam dokumentasi IoT Hub. + +## Hubungkan perangkat Anda ke layanan IoT + +Setelah hub dibuat, perangkat IoT Anda dapat terhubung ke hub tersebut. Hanya perangkat yang terdaftar yang dapat terhubung ke layanan, jadi Anda perlu mendaftarkan perangkat Anda terlebih dahulu. Saat Anda mendaftar, Anda akan mendapatkan string koneksi yang dapat digunakan perangkat untuk terhubung. String koneksi ini spesifik untuk perangkat, dan berisi informasi tentang IoT Hub, perangkat, dan kunci rahasia yang memungkinkan perangkat ini terhubung. + +> 🎓 String koneksi adalah istilah umum untuk teks yang berisi detail koneksi. String ini digunakan saat terhubung ke IoT Hub, basis data, dan banyak layanan lainnya. Biasanya terdiri dari pengidentifikasi untuk layanan, seperti URL, dan informasi keamanan seperti kunci rahasia. String ini diteruskan ke SDK untuk terhubung ke layanan. + +> ⚠️ String koneksi harus dijaga keamanannya! Keamanan akan dibahas lebih rinci dalam pelajaran mendatang. + +### Tugas - mendaftarkan perangkat IoT Anda + +Perangkat IoT dapat didaftarkan ke IoT Hub Anda menggunakan Azure CLI. + +1. Jalankan perintah berikut untuk mendaftarkan perangkat: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor \ + --hub-name + ``` + + Ganti `` dengan nama yang Anda gunakan untuk IoT Hub Anda. + + Ini akan membuat perangkat dengan ID `soil-moisture-sensor`. + +1. Saat perangkat IoT Anda terhubung ke IoT Hub Anda menggunakan SDK, perangkat tersebut perlu menggunakan string koneksi yang memberikan URL hub, bersama dengan kunci rahasia. Jalankan perintah berikut untuk mendapatkan string koneksi: + + ```sh + az iot hub device-identity connection-string show --device-id soil-moisture-sensor \ + --output table \ + --hub-name + ``` + + Ganti `` dengan nama yang Anda gunakan untuk IoT Hub Anda. + +1. Simpan string koneksi yang ditampilkan dalam output karena Anda akan membutuhkannya nanti. + +### Tugas - hubungkan perangkat IoT Anda ke cloud + +Ikuti panduan yang relevan untuk menghubungkan perangkat IoT Anda ke cloud: + +* [Arduino - Wio Terminal](wio-terminal-connect-hub.md) +* [Komputer papan tunggal - Raspberry Pi/Perangkat IoT virtual](single-board-computer-connect-hub.md) + +### Tugas - memantau peristiwa + +Untuk saat ini, Anda tidak akan memperbarui kode server Anda. Sebagai gantinya, Anda dapat menggunakan Azure CLI untuk memantau peristiwa dari perangkat IoT Anda. + +1. Pastikan perangkat IoT Anda berjalan dan mengirimkan nilai telemetri kelembapan tanah. + +1. Jalankan perintah berikut di command prompt atau terminal Anda untuk memantau pesan yang dikirim ke IoT Hub Anda: + + ```sh + az iot hub monitor-events --hub-name + ``` + + Ganti `` dengan nama yang Anda gunakan untuk IoT Hub Anda. + + Anda akan melihat pesan muncul di output konsol saat dikirim oleh perangkat IoT Anda. + + ```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}" + } + } + ``` + + Isi `payload` akan sesuai dengan pesan yang dikirim oleh perangkat IoT Anda. + + > Pada saat penulisan, ekstensi `az iot` belum sepenuhnya berfungsi di Apple Silicon. Jika Anda menggunakan perangkat Apple Silicon, Anda perlu memantau pesan dengan cara yang berbeda, seperti menggunakan [Azure IoT Tools untuk Visual Studio Code](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-vscode-iot-toolkit-cloud-device-messaging). + +1. Pesan-pesan ini memiliki sejumlah properti yang secara otomatis dilampirkan, seperti stempel waktu saat pesan dikirim. Properti ini dikenal sebagai *annotations*. Untuk melihat semua anotasi pesan, gunakan perintah berikut: + + ```sh + az iot hub monitor-events --properties anno --hub-name + ``` + + Ganti `` dengan nama yang Anda gunakan untuk IoT Hub Anda. + + Anda akan melihat pesan muncul di output konsol saat dikirim oleh perangkat IoT Anda. + + ```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}" + } + } + ``` + + Nilai waktu dalam anotasi berada dalam [waktu UNIX](https://wikipedia.org/wiki/Unix_time), yang mewakili jumlah detik sejak tengah malam pada 1 Januari 1970. + + Keluar dari monitor peristiwa saat Anda selesai. + +### Tugas - mengontrol perangkat IoT Anda + +Anda juga dapat menggunakan Azure CLI untuk memanggil metode langsung pada perangkat IoT Anda. + +1. Jalankan perintah berikut di command prompt atau terminal Anda untuk memanggil metode `relay_on` pada perangkat IoT: + +` dengan nama yang Anda gunakan untuk IoT Hub Anda. + +Ini mengirimkan permintaan metode langsung untuk metode yang ditentukan oleh `method-name`. Metode langsung dapat menerima payload yang berisi data untuk metode tersebut, dan ini dapat ditentukan dalam parameter `method-payload` sebagai JSON. + +Anda akan melihat relay menyala, dan output yang sesuai dari perangkat IoT Anda: + +```output + Direct method received - relay_on + ``` + +1. Ulangi langkah di atas, tetapi atur `--method-name` ke `relay_off`. Anda akan melihat relay mati dan output yang sesuai dari perangkat IoT. + +--- + +## 🚀 Tantangan + +Tier gratis IoT Hub memungkinkan 8.000 pesan per hari. Kode yang Anda tulis mengirimkan pesan telemetri setiap 10 detik. Berapa banyak pesan per hari jika satu pesan dikirim setiap 10 detik? + +Pikirkan tentang seberapa sering pengukuran kelembapan tanah harus dikirim? Bagaimana Anda dapat mengubah kode Anda agar tetap dalam tier gratis dan memeriksa sesering yang diperlukan tetapi tidak terlalu sering? Bagaimana jika Anda ingin menambahkan perangkat kedua? + +## Kuis setelah kuliah + +[Kuis setelah kuliah](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/16) + +## Tinjauan & Studi Mandiri + +SDK IoT Hub bersifat open source untuk Arduino dan Python. Di repositori kode di GitHub terdapat sejumlah contoh yang menunjukkan cara bekerja dengan berbagai fitur IoT Hub. + +* Jika Anda menggunakan Wio Terminal, lihat [contoh Arduino di GitHub](https://github.com/Azure/azure-iot-pal-arduino/tree/master/pal/samples) +* Jika Anda menggunakan Raspberry Pi atau perangkat virtual, lihat [contoh Python di GitHub](https://github.com/Azure/azure-iot-sdk-python/tree/master/azure-iot-hub/samples) + +## Tugas + +[Pelajari tentang layanan cloud](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md b/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md new file mode 100644 index 00000000..b9e4ed10 --- /dev/null +++ b/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md @@ -0,0 +1,33 @@ + +# Pelajari tentang layanan cloud + +## Instruksi + +Cloud, seperti Azure dari Microsoft, menawarkan lebih dari sekadar komputasi untuk disewa. Jenis utama penawaran cloud meliputi: + +* Infrastruktur sebagai layanan (IaaS) +* Platform sebagai layanan (PaaS) +* Serverless +* Perangkat lunak sebagai layanan (SaaS) + +Pelajari tentang berbagai jenis penawaran ini, dan jelaskan apa itu serta bagaimana mereka berbeda. Jelaskan penawaran mana yang relevan untuk pengembang IoT. + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Peningkatan | +| -------- | ------- | -------- | ----------------- | +| Jelaskan berbagai penawaran cloud | Memberikan penjelasan yang jelas tentang keempat jenis penawaran | Mampu menjelaskan 3 jenis penawaran | Hanya mampu menjelaskan 1 atau 2 jenis penawaran | +| Jelaskan penawaran mana yang relevan untuk IoT | Memberikan penjelasan tentang penawaran mana yang relevan untuk pengembang IoT dan alasannya | Memberikan penjelasan tentang penawaran mana yang relevan untuk pengembang IoT tetapi tidak menjelaskan alasannya | Tidak mampu menjelaskan penawaran mana yang relevan untuk pengembang IoT | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md b/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md new file mode 100644 index 00000000..bea4a058 --- /dev/null +++ b/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md @@ -0,0 +1,130 @@ + +# Hubungkan perangkat IoT Anda ke cloud - Perangkat IoT Virtual dan Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan menghubungkan perangkat IoT virtual atau Raspberry Pi Anda ke IoT Hub, untuk mengirim telemetri dan menerima perintah. + +## Hubungkan perangkat Anda ke IoT Hub + +Langkah berikutnya adalah menghubungkan perangkat Anda ke IoT Hub. + +### Tugas - hubungkan ke IoT Hub + +1. Buka folder `soil-moisture-sensor` di VS Code. Pastikan lingkungan virtual berjalan di terminal jika Anda menggunakan perangkat IoT virtual. + +1. Instal beberapa paket Pip tambahan: + + ```sh + pip3 install azure-iot-device + ``` + + `azure-iot-device` adalah pustaka untuk berkomunikasi dengan IoT Hub Anda. + +1. Tambahkan impor berikut ke bagian atas file `app.py`, di bawah impor yang sudah ada: + + ```python + from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse + ``` + + Kode ini mengimpor SDK untuk berkomunikasi dengan IoT Hub Anda. + +1. Hapus baris `import paho.mqtt.client as mqtt` karena pustaka ini tidak lagi diperlukan. Hapus semua kode MQTT termasuk nama topik, semua kode yang menggunakan `mqtt_client` dan `handle_command`. Pertahankan loop `while True:`, cukup hapus baris `mqtt_client.publish` dari loop ini. + +1. Tambahkan kode berikut di bawah pernyataan impor: + + ```python + connection_string = "" + ``` + + Ganti `` dengan string koneksi yang Anda ambil untuk perangkat sebelumnya dalam pelajaran ini. + + > 💁 Ini bukan praktik terbaik. String koneksi seharusnya tidak pernah disimpan dalam kode sumber, karena ini dapat diperiksa ke dalam kontrol kode sumber dan ditemukan oleh siapa saja. Kami melakukan ini di sini demi kesederhanaan. Idealnya, Anda harus menggunakan sesuatu seperti variabel lingkungan dan alat seperti [`python-dotenv`](https://pypi.org/project/python-dotenv/). Anda akan mempelajari lebih lanjut tentang ini dalam pelajaran mendatang. + +1. Di bawah kode ini, tambahkan yang berikut untuk membuat objek klien perangkat yang dapat berkomunikasi dengan IoT Hub, dan menghubungkannya: + + ```python + device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) + + print('Connecting') + device_client.connect() + print('Connected') + ``` + +1. Jalankan kode ini. Anda akan melihat perangkat Anda terhubung. + + ```output + pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py + Connecting + Connected + Soil moisture: 379 + ``` + +## Kirim telemetri + +Sekarang perangkat Anda sudah terhubung, Anda dapat mengirim telemetri ke IoT Hub alih-alih broker MQTT. + +### Tugas - kirim telemetri + +1. Tambahkan kode berikut di dalam loop `while True`, tepat sebelum perintah sleep: + + ```python + message = Message(json.dumps({ 'soil_moisture': soil_moisture })) + device_client.send_message(message) + ``` + + Kode ini membuat `Message` IoT Hub yang berisi pembacaan kelembapan tanah sebagai string JSON, lalu mengirimkannya ke IoT Hub sebagai pesan dari perangkat ke cloud. + +## Tangani perintah + +Perangkat Anda perlu menangani perintah dari kode server untuk mengontrol relay. Perintah ini dikirim sebagai permintaan metode langsung. + +## Tugas - tangani permintaan metode langsung + +1. Tambahkan kode berikut sebelum loop `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() + ``` + + Ini mendefinisikan metode, `handle_method_request`, yang akan dipanggil ketika metode langsung dipanggil oleh IoT Hub. Setiap metode langsung memiliki nama, dan kode ini mengharapkan metode bernama `relay_on` untuk menyalakan relay, dan `relay_off` untuk mematikan relay. + + > 💁 Ini juga dapat diimplementasikan dalam satu permintaan metode langsung, dengan meneruskan status yang diinginkan dari relay dalam payload yang dapat diteruskan dengan permintaan metode dan tersedia dari objek `request`. + +1. Metode langsung memerlukan respons untuk memberi tahu kode pemanggil bahwa mereka telah ditangani. Tambahkan kode berikut di akhir fungsi `handle_method_request` untuk membuat respons terhadap permintaan: + + ```python + method_response = MethodResponse.create_from_method_request(request, 200) + device_client.send_method_response(method_response) + ``` + + Kode ini mengirimkan respons terhadap permintaan metode langsung dengan kode status HTTP 200, dan mengirimkannya kembali ke IoT Hub. + +1. Tambahkan kode berikut di bawah definisi fungsi ini: + + ```python + device_client.on_method_request_received = handle_method_request + ``` + + Kode ini memberi tahu klien IoT Hub untuk memanggil fungsi `handle_method_request` ketika metode langsung dipanggil. + +> 💁 Anda dapat menemukan kode ini di folder [code/pi](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/pi) atau [code/virtual-device](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/virtual-device). + +😀 Program sensor kelembapan tanah Anda telah terhubung ke IoT Hub Anda! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md b/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md new file mode 100644 index 00000000..ccd7dd74 --- /dev/null +++ b/translations/id/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md @@ -0,0 +1,306 @@ + +# Hubungkan perangkat IoT Anda ke cloud - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan menghubungkan Wio Terminal Anda ke IoT Hub untuk mengirim telemetri dan menerima perintah. + +## Hubungkan perangkat Anda ke IoT Hub + +Langkah berikutnya adalah menghubungkan perangkat Anda ke IoT Hub. + +### Tugas - hubungkan ke IoT Hub + +1. Buka proyek `soil-moisture-sensor` di VS Code. + +1. Buka file `platformio.ini`. Hapus dependensi pustaka `knolleary/PubSubClient`. Pustaka ini digunakan untuk terhubung ke broker MQTT publik, dan tidak diperlukan untuk terhubung ke IoT Hub. + +1. Tambahkan dependensi pustaka berikut: + + ```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 + ``` + + Pustaka `Seeed Arduino RTC` menyediakan kode untuk berinteraksi dengan jam waktu nyata di Wio Terminal, yang digunakan untuk melacak waktu. Pustaka lainnya memungkinkan perangkat IoT Anda terhubung ke IoT Hub. + +1. Tambahkan yang berikut ini ke bagian bawah file `platformio.ini`: + + ```ini + build_flags = + -DDONT_USE_UPLOADTOBLOB + ``` + + Ini menetapkan flag compiler yang diperlukan saat mengompilasi kode Arduino IoT Hub. + +1. Buka file header `config.h`. Hapus semua pengaturan MQTT dan tambahkan konstanta berikut untuk string koneksi perangkat: + + ```cpp + // IoT Hub settings + const char *CONNECTION_STRING = ""; + ``` + + Ganti `` dengan string koneksi untuk perangkat Anda yang telah Anda salin sebelumnya. + +1. Koneksi ke IoT Hub menggunakan token berbasis waktu. Ini berarti perangkat IoT perlu mengetahui waktu saat ini. Tidak seperti sistem operasi seperti Windows, macOS, atau Linux, mikrokontroler tidak secara otomatis menyinkronkan waktu saat ini melalui Internet. Ini berarti Anda perlu menambahkan kode untuk mendapatkan waktu saat ini dari server [NTP](https://wikipedia.org/wiki/Network_Time_Protocol). Setelah waktu diperoleh, waktu tersebut dapat disimpan di jam waktu nyata di Wio Terminal, memungkinkan waktu yang benar diminta di kemudian hari, dengan asumsi perangkat tidak kehilangan daya. Tambahkan file baru bernama `ntp.h` dengan kode berikut: + + ```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); + } + ``` + + Detail kode ini berada di luar cakupan pelajaran ini. Kode ini mendefinisikan fungsi bernama `initTime` yang mendapatkan waktu saat ini dari server NTP dan menggunakannya untuk mengatur jam di Wio Terminal. + +1. Buka file `main.cpp` dan hapus semua kode MQTT, termasuk file header `PubSubClient.h`, deklarasi variabel `PubSubClient`, metode `reconnectMQTTClient` dan `createMQTTClient`, serta semua pemanggilan ke variabel dan metode ini. File ini hanya boleh berisi kode untuk terhubung ke WiFi, mendapatkan kelembapan tanah, dan membuat dokumen JSON darinya. + +1. Tambahkan direktif `#include` berikut ke bagian atas file `main.cpp` untuk menyertakan file header untuk pustaka IoT Hub, dan untuk mengatur waktu: + + ```cpp + #include + #include + #include + #include "ntp.h" + ``` + +1. Tambahkan pemanggilan berikut ke akhir fungsi `setup` untuk mengatur waktu saat ini: + + ```cpp + initTime(); + ``` + +1. Tambahkan deklarasi variabel berikut ke bagian atas file, tepat di bawah direktif include: + + ```cpp + IOTHUB_DEVICE_CLIENT_LL_HANDLE _device_ll_handle; + ``` + + Ini mendeklarasikan `IOTHUB_DEVICE_CLIENT_LL_HANDLE`, sebuah handle untuk koneksi ke IoT Hub. + +1. Di bawah ini, tambahkan kode berikut: + + ```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"); + } + } + ``` + + Ini mendeklarasikan fungsi callback yang akan dipanggil saat koneksi ke IoT Hub mengubah status, seperti terhubung atau terputus. Status ini dikirim ke port serial. + +1. Di bawah ini, tambahkan fungsi untuk terhubung ke 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); + } + ``` + + Kode ini menginisialisasi kode pustaka IoT Hub, lalu membuat koneksi menggunakan string koneksi di file header `config.h`. Koneksi ini berbasis MQTT. Jika koneksi gagal, ini akan dikirim ke port serial - jika Anda melihat ini di output, periksa string koneksi. Akhirnya, callback status koneksi diatur. + +1. Panggil fungsi ini di fungsi `setup` di bawah pemanggilan ke `initTime`: + + ```cpp + connectIoTHub(); + ``` + +1. Sama seperti dengan klien MQTT, kode ini berjalan pada satu thread sehingga membutuhkan waktu untuk memproses pesan yang dikirim oleh hub, dan dikirim ke hub. Tambahkan yang berikut ini ke bagian atas fungsi `loop` untuk melakukan ini: + + ```cpp + IoTHubDeviceClient_LL_DoWork(_device_ll_handle); + ``` + +1. Bangun dan unggah kode ini. Anda akan melihat koneksi di monitor serial: + + ```output + Connecting to WiFi.. + Connected! + Fetched NTP epoch time is: 1619983687 + Sending telemetry {"soil_moisture":391} + The device client is connected to iothub + ``` + + Dalam output, Anda dapat melihat waktu NTP diambil, diikuti oleh klien perangkat yang terhubung. Mungkin membutuhkan beberapa detik untuk terhubung, sehingga Anda mungkin melihat kelembapan tanah di output sementara perangkat sedang terhubung. + + > 💁 Anda dapat mengonversi waktu UNIX untuk NTP ke versi yang lebih mudah dibaca menggunakan situs web seperti [unixtimestamp.com](https://www.unixtimestamp.com) + +## Kirim telemetri + +Sekarang perangkat Anda sudah terhubung, Anda dapat mengirim telemetri ke IoT Hub alih-alih ke broker MQTT. + +### Tugas - kirim telemetri + +1. Tambahkan fungsi berikut di atas fungsi `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); + } + ``` + + Kode ini membuat pesan IoT Hub dari string yang diteruskan sebagai parameter, mengirimkannya ke hub, lalu membersihkan objek pesan. + +1. Panggil kode ini di fungsi `loop`, tepat setelah baris di mana telemetri dikirim ke port serial: + + ```cpp + sendTelemetry(telemetry.c_str()); + ``` + +## Tangani perintah + +Perangkat Anda perlu menangani perintah dari kode server untuk mengontrol relay. Perintah ini dikirim sebagai permintaan metode langsung. + +## Tugas - tangani permintaan metode langsung + +1. Tambahkan kode berikut sebelum fungsi `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); + } + } + ``` + + Kode ini mendefinisikan metode callback yang dapat dipanggil oleh pustaka IoT Hub saat menerima permintaan metode langsung. Metode yang diminta dikirim dalam parameter `method_name`. Fungsi ini mencetak metode yang dipanggil ke port serial, lalu menyalakan atau mematikan relay tergantung pada nama metode. + + > 💁 Ini juga dapat diimplementasikan dalam satu permintaan metode langsung, dengan meneruskan status yang diinginkan dari relay dalam payload yang dapat diteruskan dengan permintaan metode dan tersedia dari parameter `payload`. + +1. Tambahkan kode berikut ke akhir fungsi `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; + ``` + + Permintaan metode langsung membutuhkan respons, dan respons ini terdiri dari dua bagian - respons sebagai teks, dan kode pengembalian. Kode ini akan membuat hasil sebagai dokumen JSON berikut: + + ```JSON + { + "Result": "" + } + ``` + + Ini kemudian disalin ke parameter `response`, dan ukuran respons ini diatur dalam parameter `response_size`. Kode ini kemudian mengembalikan `IOTHUB_CLIENT_OK` untuk menunjukkan bahwa metode telah ditangani dengan benar. + +1. Sambungkan callback dengan menambahkan yang berikut ini ke akhir fungsi `connectIoTHub`: + + ```cpp + IoTHubClient_LL_SetDeviceMethodCallback(_device_ll_handle, directMethodCallback, NULL); + ``` + +1. Fungsi `loop` akan memanggil fungsi `IoTHubDeviceClient_LL_DoWork` untuk memproses peristiwa yang dikirim oleh IoT Hub. Ini hanya dipanggil setiap 10 detik karena `delay`, yang berarti metode langsung hanya diproses setiap 10 detik. Untuk membuat ini lebih efisien, penundaan 10 detik dapat diimplementasikan sebagai banyak penundaan yang lebih pendek, memanggil `IoTHubDeviceClient_LL_DoWork` setiap kali. Untuk melakukan ini, tambahkan kode berikut di atas fungsi `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); + } + ``` + + Kode ini akan mengulang berulang kali, memanggil `IoTHubDeviceClient_LL_DoWork` dan menunda selama 100ms setiap kali. Kode ini akan melakukan ini sebanyak yang diperlukan untuk menunda selama waktu yang diberikan dalam parameter `delay_time`. Ini berarti perangkat menunggu paling lama 100ms untuk memproses permintaan metode langsung. + +1. Dalam fungsi `loop`, hapus pemanggilan ke `IoTHubDeviceClient_LL_DoWork`, dan ganti pemanggilan `delay(10000)` dengan yang berikut ini untuk memanggil fungsi baru ini: + + ```cpp + work_delay(10000); + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code/wio-terminal](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal). + +😀 Program sensor kelembapan tanah Anda telah terhubung ke IoT Hub! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/5-migrate-application-to-the-cloud/README.md b/translations/id/2-farm/lessons/5-migrate-application-to-the-cloud/README.md new file mode 100644 index 00000000..018f9fc4 --- /dev/null +++ b/translations/id/2-farm/lessons/5-migrate-application-to-the-cloud/README.md @@ -0,0 +1,656 @@ + +# Migrasikan Logika Aplikasi Anda ke Cloud + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +Pelajaran ini diajarkan sebagai bagian dari [Proyek IoT untuk Pemula - Seri Pertanian Digital](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) dari [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Kontrol perangkat IoT Anda dengan kode tanpa server](https://img.youtube.com/vi/VVZDcs5u1_I/0.jpg)](https://youtu.be/VVZDcs5u1_I) + +## Kuis Pra-Pelajaran + +[Kuis Pra-Pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/17) + +## Pendahuluan + +Pada pelajaran sebelumnya, Anda telah belajar cara menghubungkan pemantauan kelembapan tanah tanaman dan kontrol relay ke layanan IoT berbasis cloud. Langkah berikutnya adalah memindahkan kode server yang mengontrol waktu relay ke cloud. Dalam pelajaran ini, Anda akan belajar cara melakukannya menggunakan fungsi tanpa server. + +Dalam pelajaran ini kita akan membahas: + +* [Apa itu tanpa server?](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Membuat aplikasi tanpa server](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Membuat pemicu acara IoT Hub](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Mengirim permintaan metode langsung dari kode tanpa server](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Menyebarkan kode tanpa server Anda ke cloud](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) + +## Apa itu tanpa server? + +Tanpa server, atau komputasi tanpa server, melibatkan pembuatan blok kode kecil yang dijalankan di cloud sebagai respons terhadap berbagai jenis acara. Ketika acara terjadi, kode Anda dijalankan dan diberikan data tentang acara tersebut. Acara ini dapat berasal dari berbagai hal, termasuk permintaan web, pesan yang dimasukkan ke dalam antrean, perubahan data dalam database, atau pesan yang dikirim ke layanan IoT oleh perangkat IoT. + +![Acara yang dikirim dari layanan IoT ke layanan tanpa server, semuanya diproses secara bersamaan oleh beberapa fungsi yang dijalankan](../../../../../translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.id.png) + +> 💁 Jika Anda pernah menggunakan pemicu database sebelumnya, Anda dapat menganggap ini sebagai hal yang sama, yaitu kode yang dipicu oleh acara seperti memasukkan baris. + +![Ketika banyak acara dikirim secara bersamaan, layanan tanpa server meningkat untuk menjalankan semuanya secara bersamaan](../../../../../translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.id.png) + +Kode Anda hanya dijalankan ketika acara terjadi, tidak ada yang menjaga kode Anda tetap aktif di waktu lain. Acara terjadi, kode Anda dimuat dan dijalankan. Ini membuat tanpa server sangat skalabel - jika banyak acara terjadi secara bersamaan, penyedia cloud dapat menjalankan fungsi Anda sebanyak yang Anda butuhkan secara bersamaan di berbagai server yang tersedia. Kekurangannya adalah jika Anda perlu berbagi informasi antar acara, Anda harus menyimpannya di tempat lain seperti database daripada menyimpannya di memori. + +Kode Anda ditulis sebagai fungsi yang mengambil detail tentang acara sebagai parameter. Anda dapat menggunakan berbagai bahasa pemrograman untuk menulis fungsi tanpa server ini. + +> 🎓 Tanpa server juga disebut sebagai Functions as a Service (FaaS) karena setiap pemicu acara diimplementasikan sebagai fungsi dalam kode. + +Meskipun namanya tanpa server, sebenarnya menggunakan server. Penamaan ini karena Anda sebagai pengembang tidak perlu peduli tentang server yang diperlukan untuk menjalankan kode Anda, yang Anda pedulikan hanyalah bahwa kode Anda dijalankan sebagai respons terhadap acara. Penyedia cloud memiliki *runtime* tanpa server yang mengelola alokasi server, jaringan, penyimpanan, CPU, memori, dan semua hal lain yang diperlukan untuk menjalankan kode Anda. Model ini berarti Anda tidak dapat membayar per server untuk layanan tersebut, karena tidak ada server. Sebaliknya, Anda membayar untuk waktu kode Anda berjalan dan jumlah memori yang digunakan. + +> 💰 Tanpa server adalah salah satu cara termurah untuk menjalankan kode di cloud. Misalnya, pada saat penulisan, satu penyedia cloud memungkinkan semua fungsi tanpa server Anda dijalankan sebanyak 1.000.000 kali per bulan sebelum mereka mulai mengenakan biaya, dan setelah itu mereka mengenakan biaya US$0,20 untuk setiap 1.000.000 eksekusi. Ketika kode Anda tidak berjalan, Anda tidak membayar. + +Sebagai pengembang IoT, model tanpa server sangat ideal. Anda dapat menulis fungsi yang dipanggil sebagai respons terhadap pesan yang dikirim dari perangkat IoT mana pun yang terhubung ke layanan IoT yang dihosting di cloud. Kode Anda akan menangani semua pesan yang dikirim, tetapi hanya berjalan saat diperlukan. + +✅ Lihat kembali kode yang Anda tulis sebagai kode server yang mendengarkan pesan melalui MQTT. Bagaimana ini dapat berjalan di cloud menggunakan tanpa server? Bagaimana menurut Anda kode tersebut mungkin perlu diubah untuk mendukung komputasi tanpa server? + +> 💁 Model tanpa server sedang bergerak ke layanan cloud lainnya selain menjalankan kode. Misalnya, database tanpa server tersedia di cloud menggunakan model harga tanpa server di mana Anda membayar per permintaan yang dilakukan terhadap database, seperti kueri atau penyisipan, biasanya menggunakan harga berdasarkan seberapa banyak pekerjaan yang dilakukan untuk melayani permintaan tersebut. Misalnya, satu perintah select untuk satu baris terhadap kunci utama akan lebih murah daripada operasi yang rumit yang menggabungkan banyak tabel dan mengembalikan ribuan baris. + +## Membuat aplikasi tanpa server + +Layanan komputasi tanpa server dari Microsoft disebut Azure Functions. + +![Logo Azure Functions](../../../../../translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.id.png) + +Video pendek di bawah ini memberikan gambaran tentang Azure Functions. + +[![Video gambaran Azure Functions](https://img.youtube.com/vi/8-jz5f_JyEQ/0.jpg)](https://www.youtube.com/watch?v=8-jz5f_JyEQ) + +> 🎥 Klik gambar di atas untuk menonton video + +✅ Luangkan waktu untuk melakukan penelitian dan baca gambaran umum Azure Functions di [dokumentasi Microsoft Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-overview?WT.mc_id=academic-17441-jabenn). + +Untuk menulis Azure Functions, Anda memulai dengan aplikasi Azure Functions dalam bahasa pilihan Anda. Secara default, Azure Functions mendukung Python, JavaScript, TypeScript, C#, F#, Java, dan Powershell. Dalam pelajaran ini, Anda akan belajar cara menulis aplikasi Azure Functions dalam Python. + +> 💁 Azure Functions juga mendukung custom handlers sehingga Anda dapat menulis fungsi Anda dalam bahasa apa pun yang mendukung permintaan HTTP, termasuk bahasa lama seperti COBOL. + +Aplikasi fungsi terdiri dari satu atau lebih *pemicu* - fungsi yang merespons acara. Anda dapat memiliki beberapa pemicu dalam satu aplikasi fungsi, semuanya berbagi konfigurasi umum. Misalnya, dalam file konfigurasi untuk aplikasi Functions Anda, Anda dapat memiliki detail koneksi IoT Hub Anda, dan semua fungsi dalam aplikasi dapat menggunakan ini untuk terhubung dan mendengarkan acara. + +### Tugas - instal alat Azure Functions + +> Pada saat penulisan, alat kode Azure Functions belum sepenuhnya berfungsi pada Apple Silicon dengan proyek Python. Anda perlu menggunakan Mac berbasis Intel, PC Windows, atau PC Linux sebagai gantinya. + +Salah satu fitur hebat dari Azure Functions adalah Anda dapat menjalankannya secara lokal. Runtime yang sama yang digunakan di cloud dapat dijalankan di komputer Anda, memungkinkan Anda menulis kode yang merespons pesan IoT dan menjalankannya secara lokal. Anda bahkan dapat melakukan debug kode Anda saat acara ditangani. Setelah Anda puas dengan kode Anda, kode tersebut dapat disebarkan ke cloud. + +Alat Azure Functions tersedia sebagai CLI, yang dikenal sebagai Azure Functions Core Tools. + +1. Instal alat inti Azure Functions dengan mengikuti petunjuk di [dokumentasi Azure Functions Core Tools](https://docs.microsoft.com/azure/azure-functions/functions-run-local?WT.mc_id=academic-17441-jabenn). + +1. Instal ekstensi Azure Functions untuk VS Code. Ekstensi ini menyediakan dukungan untuk membuat, melakukan debug, dan menyebarkan fungsi Azure. Lihat [dokumentasi ekstensi Azure Functions](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-azuretools.vscode-azurefunctions) untuk petunjuk tentang cara menginstal ekstensi ini di VS Code. + +Ketika Anda menyebarkan aplikasi Azure Functions Anda ke cloud, aplikasi tersebut perlu menggunakan sedikit penyimpanan cloud untuk menyimpan hal-hal seperti file aplikasi dan file log. Ketika Anda menjalankan aplikasi Functions Anda secara lokal, Anda tetap perlu terhubung ke penyimpanan cloud, tetapi alih-alih menggunakan penyimpanan cloud yang sebenarnya, Anda dapat menggunakan emulator penyimpanan yang disebut [Azurite](https://github.com/Azure/Azurite). Emulator ini berjalan secara lokal tetapi bertindak seperti penyimpanan cloud. + +> 🎓 Di Azure, penyimpanan yang digunakan Azure Functions adalah Azure Storage Account. Akun ini dapat menyimpan file, blob, data dalam tabel, atau data dalam antrean. Anda dapat berbagi satu akun penyimpanan antara banyak aplikasi, seperti aplikasi Functions dan aplikasi web. + +1. Azurite adalah aplikasi Node.js, jadi Anda perlu menginstal Node.js. Anda dapat menemukan unduhan dan petunjuk instalasi di [situs web Node.js](https://nodejs.org/). Jika Anda menggunakan Mac, Anda juga dapat menginstalnya dari [Homebrew](https://formulae.brew.sh/formula/node). + +1. Instal Azurite menggunakan perintah berikut (`npm` adalah alat yang diinstal saat Anda menginstal Node.js): + + ```sh + npm install -g azurite + ``` + +1. Buat folder bernama `azurite` untuk digunakan Azurite menyimpan data: + + ```sh + mkdir azurite + ``` + +1. Jalankan Azurite, dengan memberikan folder baru ini: + + ```sh + azurite --location azurite + ``` + + Emulator penyimpanan Azurite akan diluncurkan dan siap untuk runtime Functions lokal untuk terhubung. + + ```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 + ``` + +### Tugas - buat proyek Azure Functions + +CLI Azure Functions dapat digunakan untuk membuat aplikasi Functions baru. + +1. Buat folder untuk aplikasi Functions Anda dan navigasikan ke dalamnya. Beri nama `soil-moisture-trigger`. + + ```sh + mkdir soil-moisture-trigger + cd soil-moisture-trigger + ``` + +1. Buat lingkungan virtual Python di dalam folder ini: + + ```sh + python3 -m venv .venv + ``` + +1. Aktifkan lingkungan virtual: + + * Di Windows: + * Jika Anda menggunakan Command Prompt, atau Command Prompt melalui Windows Terminal, jalankan: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Jika Anda menggunakan PowerShell, jalankan: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + * Di macOS atau Linux, jalankan: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Perintah ini harus dijalankan dari lokasi yang sama di mana Anda menjalankan perintah untuk membuat lingkungan virtual. Anda tidak perlu pernah menavigasi ke dalam folder `.venv`, Anda harus selalu menjalankan perintah aktivasi dan perintah apa pun untuk menginstal paket atau menjalankan kode dari folder tempat Anda berada saat membuat lingkungan virtual. + +1. Jalankan perintah berikut untuk membuat aplikasi Functions di dalam folder ini: + + ```sh + func init --worker-runtime python soil-moisture-trigger + ``` + + Ini akan membuat tiga file di dalam folder saat ini: + + * `host.json` - dokumen JSON ini berisi pengaturan untuk aplikasi Functions Anda. Anda tidak perlu memodifikasi pengaturan ini. + * `local.settings.json` - dokumen JSON ini berisi pengaturan yang akan digunakan aplikasi Anda saat berjalan secara lokal, seperti string koneksi untuk IoT Hub Anda. Pengaturan ini hanya lokal, dan tidak boleh ditambahkan ke kontrol kode sumber. Ketika Anda menyebarkan aplikasi ke cloud, pengaturan ini tidak disebarkan, melainkan pengaturan Anda dimuat dari pengaturan aplikasi. Ini akan dibahas lebih lanjut dalam pelajaran ini. + * `requirements.txt` - ini adalah [file persyaratan Pip](https://pip.pypa.io/en/stable/user_guide/#requirements-files) yang berisi paket Pip yang diperlukan untuk menjalankan aplikasi Functions Anda. + +1. File `local.settings.json` memiliki pengaturan untuk akun penyimpanan yang akan digunakan aplikasi Functions. Ini default ke pengaturan kosong, jadi perlu diatur. Untuk terhubung ke emulator penyimpanan lokal Azurite, atur nilai ini ke: + + ```json + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + ``` + +1. Instal paket Pip yang diperlukan menggunakan file persyaratan: + + ```sh + pip install -r requirements.txt + ``` + + > 💁 Paket Pip yang diperlukan harus ada di file ini, sehingga ketika aplikasi Functions disebarkan ke cloud, runtime dapat memastikan bahwa ia menginstal paket yang benar. + +1. Untuk menguji apakah semuanya berfungsi dengan benar, Anda dapat memulai runtime Functions. Jalankan perintah berikut untuk melakukannya: + + ```sh + func start + ``` + + Anda akan melihat runtime mulai dan melaporkan bahwa ia tidak menemukan fungsi pekerjaan apa pun (pemicu). + + ```output + (.venv) ➜ soil-moisture-trigger func start + Found Python version 3.9.1 (python3). + + Azure Functions Core Tools + Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit) + Function Runtime Version: 3.0.15417.0 + + [2021-05-05T01:24:46.795Z] No job functions found. + ``` +> ⚠️ Jika Anda menerima pemberitahuan firewall, berikan akses karena aplikasi `func` perlu dapat membaca dan menulis ke jaringan Anda. +> ⚠️ Jika Anda menggunakan macOS, mungkin ada peringatan dalam output: +> +> ```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. + > ``` +> +> Anda dapat mengabaikannya selama aplikasi Functions berjalan dengan benar dan menampilkan fungsi yang sedang berjalan. Seperti yang disebutkan dalam [pertanyaan ini di 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), peringatan ini dapat diabaikan. + +1. Hentikan aplikasi Functions dengan menekan `ctrl+c`. + +1. Buka folder saat ini di VS Code, baik dengan membuka VS Code lalu membuka folder ini, atau dengan menjalankan perintah berikut: + + ```sh + code . + ``` + + VS Code akan mendeteksi proyek Functions Anda dan menampilkan notifikasi yang mengatakan: + + ```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? + ``` + + ![Notifikasi](../../../../../translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.id.png) + + Pilih **Yes** dari notifikasi ini. + +1. Pastikan lingkungan virtual Python berjalan di terminal VS Code. Hentikan dan mulai ulang jika diperlukan. + +## Membuat Trigger Event IoT Hub + +Aplikasi Functions adalah kerangka kerja untuk kode serverless Anda. Untuk merespons event IoT Hub, Anda dapat menambahkan trigger IoT Hub ke aplikasi ini. Trigger ini perlu terhubung ke aliran pesan yang dikirim ke IoT Hub dan meresponsnya. Untuk mendapatkan aliran pesan ini, trigger Anda perlu terhubung ke *event hub compatible endpoint* dari IoT Hub. + +IoT Hub didasarkan pada layanan Azure lain yang disebut Azure Event Hubs. Event Hubs adalah layanan yang memungkinkan Anda mengirim dan menerima pesan, sementara IoT Hub memperluasnya dengan menambahkan fitur untuk perangkat IoT. Cara Anda terhubung untuk membaca pesan dari IoT Hub sama seperti jika Anda menggunakan Event Hubs. + +✅ Lakukan penelitian: Baca ikhtisar Event Hubs di [dokumentasi Azure Event Hubs](https://docs.microsoft.com/azure/event-hubs/event-hubs-about?WT.mc_id=academic-17441-jabenn). Bagaimana fitur dasarnya dibandingkan dengan IoT Hub? + +Agar perangkat IoT dapat terhubung ke IoT Hub, perangkat tersebut harus menggunakan kunci rahasia yang memastikan hanya perangkat yang diizinkan yang dapat terhubung. Hal yang sama berlaku saat terhubung untuk membaca pesan; kode Anda memerlukan string koneksi yang berisi kunci rahasia, bersama dengan detail IoT Hub. + +> 💁 String koneksi default yang Anda dapatkan memiliki izin **iothubowner**, yang memberikan kode apa pun yang menggunakannya izin penuh pada IoT Hub. Idealnya, Anda harus terhubung dengan tingkat izin terendah yang diperlukan. Ini akan dibahas dalam pelajaran berikutnya. + +Setelah trigger Anda terhubung, kode di dalam fungsi akan dipanggil untuk setiap pesan yang dikirim ke IoT Hub, terlepas dari perangkat mana yang mengirimnya. Trigger akan menerima pesan sebagai parameter. + +### Tugas - mendapatkan string koneksi endpoint Event Hub compatible + +1. Dari terminal VS Code, jalankan perintah berikut untuk mendapatkan string koneksi untuk endpoint Event Hub compatible dari IoT Hub: + + ```sh + az iot hub connection-string show --default-eventhub \ + --output table \ + --hub-name + ``` + + Ganti `` dengan nama yang Anda gunakan untuk IoT Hub Anda. + +1. Di VS Code, buka file `local.settings.json`. Tambahkan nilai tambahan berikut di dalam bagian `Values`: + + ```json + "IOT_HUB_CONNECTION_STRING": "" + ``` + + Ganti `` dengan nilai dari langkah sebelumnya. Anda perlu menambahkan koma setelah baris di atas agar ini menjadi JSON yang valid. + +### Tugas - membuat trigger event + +Sekarang Anda siap untuk membuat trigger event. + +1. Dari terminal VS Code, jalankan perintah berikut dari dalam folder `soil-moisture-trigger`: + + ```sh + func new --name iot-hub-trigger --template "Azure Event Hub trigger" + ``` + + Ini akan membuat Fungsi baru bernama `iot-hub-trigger`. Trigger ini akan terhubung ke endpoint Event Hub compatible di IoT Hub, sehingga Anda dapat menggunakan trigger event hub. Tidak ada trigger khusus untuk IoT Hub. + +Ini akan membuat folder di dalam folder `soil-moisture-trigger` bernama `iot-hub-trigger` yang berisi fungsi ini. Folder ini akan memiliki file berikut di dalamnya: + +* `__init__.py` - ini adalah file kode Python yang berisi trigger, menggunakan konvensi penamaan file Python standar untuk mengubah folder ini menjadi modul Python. + + File ini akan berisi kode berikut: + + ```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')) + ``` + + Inti dari trigger adalah fungsi `main`. Fungsi inilah yang dipanggil dengan event dari IoT Hub. Fungsi ini memiliki parameter bernama `event` yang berisi `EventHubEvent`. Setiap kali pesan dikirim ke IoT Hub, fungsi ini dipanggil dengan pesan tersebut sebagai `event`, bersama dengan properti yang sama seperti anotasi yang Anda lihat di pelajaran sebelumnya. + + Inti dari fungsi ini adalah mencatat event. + +* `function.json` - ini berisi konfigurasi untuk trigger. Konfigurasi utama ada di bagian bernama `bindings`. Binding adalah istilah untuk koneksi antara Azure Functions dan layanan Azure lainnya. Fungsi ini memiliki input binding ke event hub - ia terhubung ke event hub dan menerima data. + + > 💁 Anda juga dapat memiliki output binding sehingga output dari fungsi dikirim ke layanan lain. Misalnya, Anda dapat menambahkan output binding ke database dan mengembalikan event IoT Hub dari fungsi, dan itu akan secara otomatis dimasukkan ke dalam database. + + ✅ Lakukan penelitian: Baca tentang binding di [dokumentasi konsep triggers dan bindings Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings?WT.mc_id=academic-17441-jabenn&tabs=python). + + Bagian `bindings` mencakup konfigurasi untuk binding. Nilai-nilai yang menarik adalah: + + * `"type": "eventHubTrigger"` - ini memberi tahu fungsi bahwa ia perlu mendengarkan event dari Event Hub + * `"name": "events"` - ini adalah nama parameter untuk event Event Hub. Ini sesuai dengan nama parameter dalam fungsi `main` di kode Python. + * `"direction": "in"` - ini adalah input binding, data dari event hub masuk ke fungsi + * `"connection": ""` - ini mendefinisikan nama pengaturan untuk membaca string koneksi. Saat berjalan secara lokal, ini akan membaca pengaturan ini dari file `local.settings.json`. + + > 💁 String koneksi tidak dapat disimpan di file `function.json`, harus dibaca dari pengaturan. Ini untuk mencegah Anda secara tidak sengaja mengekspos string koneksi Anda. + +1. Karena [bug dalam template Azure Functions](https://github.com/Azure/azure-functions-templates/issues/1250), file `function.json` memiliki nilai yang salah untuk field `cardinality`. Perbarui field ini dari `many` menjadi `one`: + + ```json + "cardinality": "one", + ``` + +1. Perbarui nilai `"connection"` di file `function.json` untuk menunjuk ke nilai baru yang Anda tambahkan ke file `local.settings.json`: + + ```json + "connection": "IOT_HUB_CONNECTION_STRING", + ``` + + > 💁 Ingat - ini harus menunjuk ke pengaturan, bukan berisi string koneksi sebenarnya. + +1. String koneksi berisi nilai `eventHubName`, jadi nilai ini di file `function.json` perlu dikosongkan. Perbarui nilai ini menjadi string kosong: + + ```json + "eventHubName": "", + ``` + +### Tugas - menjalankan trigger event + +1. Pastikan Anda tidak menjalankan monitor event IoT Hub. Jika ini berjalan bersamaan dengan aplikasi Functions, aplikasi Functions tidak akan dapat terhubung dan mengonsumsi event. + + > 💁 Beberapa aplikasi dapat terhubung ke endpoint IoT Hub menggunakan *consumer groups* yang berbeda. Ini akan dibahas dalam pelajaran berikutnya. + +1. Untuk menjalankan aplikasi Functions, jalankan perintah berikut dari terminal VS Code: + + ```sh + func start + ``` + + Aplikasi Functions akan mulai, dan akan mendeteksi fungsi `iot-hub-trigger`. Aplikasi ini kemudian akan memproses event apa pun yang telah dikirim ke IoT Hub dalam satu hari terakhir. + + ```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) + ``` + + Setiap panggilan ke fungsi akan dikelilingi oleh blok `Executing 'Functions.iot-hub-trigger'`/`Executed 'Functions.iot-hub-trigger'` di output, sehingga Anda dapat melihat berapa banyak pesan yang diproses dalam setiap panggilan fungsi. + +1. Pastikan perangkat IoT Anda berjalan. Anda akan melihat pesan kelembapan tanah baru muncul di aplikasi Functions. + +1. Hentikan dan mulai ulang aplikasi Functions. Anda akan melihat bahwa aplikasi ini tidak akan memproses pesan sebelumnya lagi, hanya pesan baru yang akan diproses. + +> 💁 VS Code juga mendukung debugging untuk Functions Anda. Anda dapat menetapkan breakpoint dengan mengklik pada tepi di awal setiap baris kode, atau meletakkan kursor pada baris kode dan memilih *Run -> Toggle breakpoint*, atau menekan `F9`. Anda dapat meluncurkan debugger dengan memilih *Run -> Start debugging*, menekan `F5`, atau memilih panel *Run and debug* dan memilih tombol **Start debugging**. Dengan melakukan ini, Anda dapat melihat detail dari event yang sedang diproses. + +#### Pemecahan Masalah + +* Jika Anda mendapatkan error berikut: + + ```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. + ``` + + Periksa apakah Azurite berjalan dan Anda telah menetapkan `AzureWebJobsStorage` di file `local.settings.json` ke `UseDevelopmentStorage=true`. + +* Jika Anda mendapatkan error berikut: + + ```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' + ``` + + Periksa apakah Anda telah menetapkan `cardinality` di file `function.json` ke `one`. + +* Jika Anda mendapatkan error berikut: + + ```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'). + ``` + + Periksa apakah Anda telah menetapkan `eventHubName` di file `function.json` ke string kosong. + +## Mengirim Permintaan Metode Langsung dari Kode Serverless + +Sejauh ini, aplikasi Functions Anda mendengarkan pesan dari IoT Hub menggunakan endpoint Event Hub compatible. Sekarang Anda perlu mengirim perintah ke perangkat IoT. Ini dilakukan dengan menggunakan koneksi berbeda ke IoT Hub melalui *Registry Manager*. Registry Manager adalah alat yang memungkinkan Anda melihat perangkat apa saja yang terdaftar di IoT Hub, dan berkomunikasi dengan perangkat-perangkat tersebut dengan mengirim pesan cloud-to-device, permintaan metode langsung, atau memperbarui device twin. Anda juga dapat menggunakannya untuk mendaftarkan, memperbarui, atau menghapus perangkat IoT dari IoT Hub. + +Untuk terhubung ke Registry Manager, Anda memerlukan string koneksi. + +### Tugas - mendapatkan string koneksi Registry Manager + +1. Untuk mendapatkan string koneksi, jalankan perintah berikut: + + ```sh + az iot hub connection-string show --policy-name service \ + --output table \ + --hub-name + ``` + + Ganti `` dengan nama yang Anda gunakan untuk IoT Hub Anda. + + String koneksi diminta untuk kebijakan *ServiceConnect* menggunakan parameter `--policy-name service`. Saat Anda meminta string koneksi, Anda dapat menentukan izin apa yang akan diizinkan oleh string koneksi tersebut. Kebijakan ServiceConnect memungkinkan kode Anda terhubung dan mengirim pesan ke perangkat IoT. + + ✅ Lakukan penelitian: Baca tentang kebijakan yang berbeda di [dokumentasi izin IoT Hub](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-security#iot-hub-permissions?WT.mc_id=academic-17441-jabenn) + +1. Di VS Code, buka file `local.settings.json`. Tambahkan nilai tambahan berikut di dalam bagian `Values`: + + ```json + "REGISTRY_MANAGER_CONNECTION_STRING": "" + ``` + + Ganti `` dengan nilai dari langkah sebelumnya. Anda perlu menambahkan koma setelah baris di atas agar ini menjadi JSON yang valid. + +### Tugas - mengirim permintaan metode langsung ke perangkat + +1. SDK untuk Registry Manager tersedia melalui paket Pip. Tambahkan baris berikut ke file `requirements.txt` untuk menambahkan dependensi pada paket ini: + + ```sh + azure-iot-hub + ``` + +1. Pastikan terminal VS Code memiliki lingkungan virtual yang diaktifkan, dan jalankan perintah berikut untuk menginstal paket Pip: + + ```sh + pip install -r requirements.txt + ``` + +1. Tambahkan impor berikut ke file `__init__.py`: + + ```python + import json + import os + from azure.iot.hub import IoTHubRegistryManager + from azure.iot.hub.models import CloudToDeviceMethod + ``` + + Ini mengimpor beberapa pustaka sistem, serta pustaka untuk berinteraksi dengan Registry Manager dan mengirim permintaan metode langsung. + +1. Hapus kode dari dalam metode `main`, tetapi pertahankan metode itu sendiri. + +1. Dalam metode `main`, tambahkan kode berikut: + + ```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}') + ``` + + Kode ini mengekstrak isi dari event yang berisi pesan JSON yang dikirim oleh perangkat IoT. + + Kemudian mendapatkan ID perangkat dari anotasi yang diteruskan bersama pesan. Isi dari event berisi pesan yang dikirim sebagai telemetri, sedangkan kamus `iothub_metadata` berisi properti yang diatur oleh IoT Hub seperti ID perangkat pengirim dan waktu pengiriman pesan. + + Informasi ini kemudian dicatat. Anda akan melihat pencatatan ini di terminal saat Anda menjalankan aplikasi Function secara lokal. + +1. Di bawah ini, tambahkan kode berikut: + + ```python + soil_moisture = body['soil_moisture'] + + if soil_moisture > 450: + direct_method = CloudToDeviceMethod(method_name='relay_on', payload='{}') + else: + direct_method = CloudToDeviceMethod(method_name='relay_off', payload='{}') + ``` + + Kode ini mendapatkan kelembapan tanah dari pesan. Kemudian memeriksa kelembapan tanah, dan tergantung pada nilainya, membuat kelas pembantu untuk permintaan metode langsung untuk metode `relay_on` atau `relay_off`. Permintaan metode tidak memerlukan payload, jadi dokumen JSON kosong dikirim. + +1. Di bawah ini tambahkan kode berikut: + + ```python + logging.info(f'Sending direct method request for {direct_method.method_name} for device {device_id}') + + registry_manager_connection_string = os.environ['REGISTRY_MANAGER_CONNECTION_STRING'] + registry_manager = IoTHubRegistryManager(registry_manager_connection_string) + ``` +Kode ini memuat `REGISTRY_MANAGER_CONNECTION_STRING` dari file `local.settings.json`. Nilai-nilai dalam file ini tersedia sebagai variabel lingkungan, dan dapat dibaca menggunakan fungsi `os.environ`, sebuah fungsi yang mengembalikan dictionary dari semua variabel lingkungan. + +> 💁 Ketika kode ini diterapkan ke cloud, nilai-nilai dalam file `local.settings.json` akan diatur sebagai *Application Settings*, dan dapat dibaca dari variabel lingkungan. + +Kode kemudian membuat instance dari kelas pembantu Registry Manager menggunakan connection string. + +1. Tambahkan kode berikut di bawah ini: + + ```python + registry_manager.invoke_device_method(device_id, direct_method) + + logging.info('Direct method request sent!') + ``` + + Kode ini memberi tahu registry manager untuk mengirim permintaan metode langsung ke perangkat yang mengirimkan telemetry. + + > 💁 Pada versi aplikasi yang Anda buat di pelajaran sebelumnya menggunakan MQTT, perintah kontrol relay dikirim ke semua perangkat. Kode tersebut mengasumsikan Anda hanya memiliki satu perangkat. Versi kode ini mengirimkan permintaan metode ke satu perangkat, sehingga akan berfungsi jika Anda memiliki beberapa pengaturan sensor kelembaban tanah dan relay, mengirimkan permintaan metode langsung yang tepat ke perangkat yang tepat. + +1. Jalankan aplikasi Functions, dan pastikan perangkat IoT Anda mengirimkan data. Anda akan melihat pesan diproses dan permintaan metode langsung dikirim. Pindahkan sensor kelembaban tanah masuk dan keluar dari tanah untuk melihat nilai berubah dan relay menyala dan mati. + +> 💁 Anda dapat menemukan kode ini di folder [code/functions](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud/code/functions). + +## Terapkan kode serverless Anda ke cloud + +Kode Anda sekarang berfungsi secara lokal, jadi langkah berikutnya adalah menerapkan aplikasi Functions ke cloud. + +### Tugas - buat sumber daya cloud + +Aplikasi Functions Anda perlu diterapkan ke sumber daya Functions App di Azure, yang berada di dalam Resource Group yang Anda buat untuk IoT Hub Anda. Anda juga perlu membuat Storage Account di Azure untuk menggantikan emulator yang Anda jalankan secara lokal. + +1. Jalankan perintah berikut untuk membuat storage account: + + ```sh + az storage account create --resource-group soil-moisture-sensor \ + --sku Standard_LRS \ + --name + ``` + + Ganti `` dengan nama untuk storage account Anda. Nama ini harus unik secara global karena menjadi bagian dari URL yang digunakan untuk mengakses storage account. Anda hanya dapat menggunakan huruf kecil dan angka untuk nama ini, tanpa karakter lain, dan dibatasi hingga 24 karakter. Gunakan sesuatu seperti `sms` dan tambahkan pengidentifikasi unik di akhir, seperti beberapa kata acak atau nama Anda. + + Opsi `--sku Standard_LRS` memilih tingkat harga, memilih akun tujuan umum dengan biaya terendah. Tidak ada tingkat gratis untuk penyimpanan, dan Anda membayar sesuai penggunaan. Biaya relatif rendah, dengan penyimpanan paling mahal kurang dari US$0.05 per bulan per gigabyte yang disimpan. + + ✅ Baca lebih lanjut tentang harga di [halaman harga Azure Storage Account](https://azure.microsoft.com/pricing/details/storage/?WT.mc_id=academic-17441-jabenn) + +1. Jalankan perintah berikut untuk membuat 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 + ``` + + Ganti `` dengan lokasi yang Anda gunakan saat membuat Resource Group di pelajaran sebelumnya. + + Ganti `` dengan nama storage account yang Anda buat di langkah sebelumnya. + + Ganti `` dengan nama unik untuk Functions App Anda. Nama ini harus unik secara global karena menjadi bagian dari URL yang dapat digunakan untuk mengakses Functions App. Gunakan sesuatu seperti `soil-moisture-sensor-` dan tambahkan pengidentifikasi unik di akhir, seperti beberapa kata acak atau nama Anda. + + Opsi `--functions-version 3` mengatur versi Azure Functions yang akan digunakan. Versi 3 adalah versi terbaru. + + Opsi `--os-type Linux` memberi tahu runtime Functions untuk menggunakan Linux sebagai OS untuk menjalankan fungsi-fungsi ini. Functions dapat dijalankan di Linux atau Windows, tergantung pada bahasa pemrograman yang digunakan. Aplikasi Python hanya didukung di Linux. + +### Tugas - unggah pengaturan aplikasi Anda + +Saat Anda mengembangkan Functions App Anda, Anda menyimpan beberapa pengaturan di file `local.settings.json` untuk connection string ke IoT Hub Anda. Pengaturan ini perlu ditulis ke Application Settings di Functions App Anda di Azure agar dapat digunakan oleh kode Anda. + +> 🎓 File `local.settings.json` hanya untuk pengaturan pengembangan lokal, dan tidak boleh dimasukkan ke dalam kontrol kode sumber, seperti GitHub. Ketika diterapkan ke cloud, Application Settings digunakan. Application Settings adalah pasangan key/value yang di-host di cloud dan dibaca dari variabel lingkungan baik di dalam kode Anda atau oleh runtime saat menghubungkan kode Anda ke IoT Hub. + +1. Jalankan perintah berikut untuk mengatur pengaturan `IOT_HUB_CONNECTION_STRING` di Application Settings Functions App: + + ```sh + az functionapp config appsettings set --resource-group soil-moisture-sensor \ + --name \ + --settings "IOT_HUB_CONNECTION_STRING=" + ``` + + Ganti `` dengan nama yang Anda gunakan untuk Functions App Anda. + + Ganti `` dengan nilai `IOT_HUB_CONNECTION_STRING` dari file `local.settings.json` Anda. + +1. Ulangi langkah di atas, tetapi atur nilai `REGISTRY_MANAGER_CONNECTION_STRING` ke nilai yang sesuai dari file `local.settings.json` Anda. + +Ketika Anda menjalankan perintah ini, mereka juga akan menghasilkan daftar semua Application Settings untuk Functions App. Anda dapat menggunakan ini untuk memeriksa apakah nilai-nilai Anda diatur dengan benar. + +> 💁 Anda akan melihat nilai yang sudah diatur untuk `AzureWebJobsStorage`. Di file `local.settings.json` Anda, ini diatur ke nilai untuk menggunakan emulator penyimpanan lokal. Ketika Anda membuat Functions App, Anda memberikan storage account sebagai parameter, dan ini diatur secara otomatis dalam pengaturan ini. + +### Tugas - terapkan Functions App Anda ke cloud + +Sekarang Functions App sudah siap, kode Anda dapat diterapkan. + +1. Jalankan perintah berikut dari terminal VS Code untuk mempublikasikan Functions App Anda: + + ```sh + func azure functionapp publish + ``` + + Ganti `` dengan nama yang Anda gunakan untuk Functions App Anda. + +Kode akan dikemas dan dikirim ke Functions App, di mana kode tersebut akan diterapkan dan dijalankan. Akan ada banyak output konsol, diakhiri dengan konfirmasi penerapan dan daftar fungsi yang diterapkan. Dalam kasus ini, daftar hanya akan berisi trigger. + +```output +Deployment successful. +Remote build succeeded! +Syncing triggers... +Functions in soil-moisture-sensor: + iot-hub-trigger - [eventHubTrigger] +``` + +Pastikan perangkat IoT Anda berjalan. Ubah tingkat kelembaban dengan menyesuaikan kelembaban tanah, atau memindahkan sensor masuk dan keluar dari tanah. Anda akan melihat relay menyala dan mati saat kelembaban tanah berubah. + +--- + +## 🚀 Tantangan + +Pada pelajaran sebelumnya, Anda mengelola waktu untuk relay dengan berhenti berlangganan dari pesan MQTT saat relay menyala, dan untuk beberapa saat setelah relay dimatikan. Anda tidak dapat menggunakan metode ini di sini - Anda tidak dapat berhenti berlangganan dari trigger IoT Hub Anda. + +Pikirkan cara berbeda yang dapat Anda gunakan untuk menangani ini di Functions App Anda. + +## Kuis setelah pelajaran + +[Kuis setelah pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/18) + +## Tinjauan & Studi Mandiri + +* Baca tentang komputasi serverless di [halaman Serverless Computing di Wikipedia](https://wikipedia.org/wiki/Serverless_computing) +* Baca tentang penggunaan serverless di Azure termasuk beberapa contoh lainnya di [posting blog Azure Go serverless for your IoT needs](https://azure.microsoft.com/blog/go-serverless-for-your-iot-needs/?WT.mc_id=academic-17441-jabenn) +* Pelajari lebih lanjut tentang Azure Functions di [saluran YouTube Azure Functions](https://www.youtube.com/c/AzureFunctions) + +## Tugas + +[Tambahkan kontrol relay manual](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md b/translations/id/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md new file mode 100644 index 00000000..6b9ace1c --- /dev/null +++ b/translations/id/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md @@ -0,0 +1,70 @@ + +# Tambahkan Kontrol Manual untuk Relay + +## Instruksi + +Kode serverless dapat dipicu oleh berbagai hal, termasuk permintaan HTTP. Anda dapat menggunakan pemicu HTTP untuk menambahkan pengendalian manual pada relay Anda, memungkinkan seseorang untuk menyalakan atau mematikan relay melalui permintaan web. + +Untuk tugas ini, Anda perlu menambahkan dua pemicu HTTP ke Functions App Anda untuk menyalakan dan mematikan relay, dengan memanfaatkan apa yang telah Anda pelajari dari pelajaran ini untuk mengirim perintah ke perangkat. + +Beberapa petunjuk: + +* Anda dapat menambahkan pemicu HTTP ke Functions App yang sudah ada dengan perintah berikut: + + ```sh + func new --name --template "HTTP trigger" + ``` + + Ganti `` dengan nama untuk pemicu HTTP Anda. Gunakan sesuatu seperti `relay_on` dan `relay_off`. + +* Pemicu HTTP dapat memiliki kontrol akses. Secara default, mereka memerlukan kunci API khusus fungsi yang harus disertakan dengan URL untuk dijalankan. Untuk tugas ini, Anda dapat menghapus pembatasan ini sehingga siapa pun dapat menjalankan fungsi tersebut. Untuk melakukannya, perbarui pengaturan `authLevel` di file `function.json` untuk pemicu HTTP menjadi: + + ```json + "authLevel": "anonymous" + ``` + + > 💁 Anda dapat membaca lebih lanjut tentang kontrol akses ini di [dokumentasi kunci akses Function](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?WT.mc_id=academic-17441-jabenn#authorization-keys). + +* Pemicu HTTP secara default mendukung permintaan GET dan POST. Ini berarti Anda dapat memanggilnya menggunakan browser web - browser web membuat permintaan GET. + + Ketika Anda menjalankan Functions App secara lokal, Anda akan melihat URL dari pemicu: + + ```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 + ``` + + Tempelkan URL tersebut ke browser Anda dan tekan `return`, atau `Ctrl+klik` (`Cmd+klik` pada macOS) tautan di jendela terminal di VS Code untuk membukanya di browser default Anda. Ini akan menjalankan pemicu tersebut. + + > 💁 Perhatikan bahwa URL memiliki `/api` di dalamnya - pemicu HTTP secara default berada di subdomain `api`. + +* Ketika Anda menerapkan Functions App, URL pemicu HTTP akan menjadi: + + `https://.azurewebsites.net/api/` + + Di mana `` adalah nama Functions App Anda, dan `` adalah nama pemicu Anda. + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Peningkatan | +| -------- | ------- | -------- | ----------------- | +| Membuat pemicu HTTP | Membuat 2 pemicu untuk menyalakan dan mematikan relay, dengan nama yang sesuai | Membuat satu pemicu dengan nama yang sesuai | Tidak dapat membuat pemicu apa pun | +| Mengontrol relay dari pemicu HTTP | Berhasil menghubungkan kedua pemicu ke IoT Hub dan mengontrol relay dengan benar | Berhasil menghubungkan satu pemicu ke IoT Hub dan mengontrol relay dengan benar | Tidak dapat menghubungkan pemicu ke IoT Hub | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/6-keep-your-plant-secure/README.md b/translations/id/2-farm/lessons/6-keep-your-plant-secure/README.md new file mode 100644 index 00000000..0bf96bef --- /dev/null +++ b/translations/id/2-farm/lessons/6-keep-your-plant-secure/README.md @@ -0,0 +1,245 @@ + +# Jaga Keamanan Tanaman Anda + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +## Kuis Sebelum Pelajaran + +[Kuis Sebelum Pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/19) + +## Pendahuluan + +Dalam beberapa pelajaran terakhir, Anda telah membuat perangkat IoT untuk memantau kelembapan tanah dan menghubungkannya ke cloud. Namun, bagaimana jika peretas yang bekerja untuk petani pesaing berhasil mengambil alih perangkat IoT Anda? Bagaimana jika mereka mengirimkan pembacaan kelembapan tanah yang tinggi sehingga tanaman Anda tidak pernah disiram, atau menghidupkan sistem penyiraman Anda terus-menerus sehingga tanaman Anda mati karena terlalu banyak air dan Anda harus mengeluarkan biaya besar untuk air? + +Dalam pelajaran ini, Anda akan belajar tentang cara mengamankan perangkat IoT. Karena ini adalah pelajaran terakhir untuk proyek ini, Anda juga akan belajar cara membersihkan sumber daya cloud Anda, sehingga mengurangi potensi biaya. + +Dalam pelajaran ini, kita akan membahas: + +* [Mengapa Anda perlu mengamankan perangkat IoT?](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Kriptografi](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Amankan perangkat IoT Anda](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Membuat dan menggunakan sertifikat X.509](../../../../../2-farm/lessons/6-keep-your-plant-secure) + +> 🗑 Ini adalah pelajaran terakhir dalam proyek ini, jadi setelah menyelesaikan pelajaran dan tugas ini, jangan lupa untuk membersihkan layanan cloud Anda. Anda akan membutuhkan layanan tersebut untuk menyelesaikan tugas, jadi pastikan untuk menyelesaikannya terlebih dahulu. +> +> Lihat [panduan membersihkan proyek Anda](../../../clean-up.md) jika diperlukan untuk instruksi tentang cara melakukannya. + +## Mengapa Anda perlu mengamankan perangkat IoT? + +Keamanan IoT melibatkan memastikan bahwa hanya perangkat yang diharapkan yang dapat terhubung ke layanan IoT cloud Anda dan mengirimkan telemetri, serta hanya layanan cloud Anda yang dapat mengirimkan perintah ke perangkat Anda. Data IoT juga bisa bersifat pribadi, termasuk data medis atau data sensitif lainnya, sehingga seluruh aplikasi Anda perlu mempertimbangkan keamanan untuk mencegah kebocoran data ini. + +Jika aplikasi IoT Anda tidak aman, ada sejumlah risiko: + +* Perangkat palsu dapat mengirimkan data yang salah, menyebabkan aplikasi Anda merespons secara tidak benar. Misalnya, mereka dapat mengirimkan pembacaan kelembapan tanah yang tinggi secara terus-menerus, sehingga sistem irigasi Anda tidak pernah menyala dan tanaman Anda mati karena kekurangan air. +* Pengguna yang tidak berwenang dapat membaca data dari perangkat IoT, termasuk data pribadi atau data penting bisnis. +* Peretas dapat mengirimkan perintah untuk mengontrol perangkat dengan cara yang dapat merusak perangkat atau perangkat keras yang terhubung. +* Dengan terhubung ke perangkat IoT, peretas dapat menggunakan ini untuk mengakses jaringan tambahan dan mendapatkan akses ke sistem pribadi. +* Pengguna jahat dapat mengakses data pribadi dan menggunakannya untuk pemerasan. + +Ini adalah skenario dunia nyata yang sering terjadi. Beberapa contoh telah diberikan dalam pelajaran sebelumnya, tetapi berikut adalah beberapa lagi: + +* Pada tahun 2018, peretas menggunakan titik akses WiFi terbuka pada termostat akuarium untuk mendapatkan akses ke jaringan kasino dan mencuri data. [The Hacker News - Casino Gets Hacked Through Its Internet-Connected Fish Tank Thermometer](https://thehackernews.com/2018/04/iot-hacking-thermometer.html) +* Pada tahun 2016, Mirai Botnet meluncurkan serangan denial of service terhadap Dyn, penyedia layanan Internet, yang menyebabkan sebagian besar Internet terganggu. Botnet ini menggunakan malware untuk terhubung ke perangkat IoT seperti DVR dan kamera yang menggunakan nama pengguna dan kata sandi default, dan dari sana meluncurkan serangan. [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 memiliki database pengguna mainan CloudPets mereka yang terhubung, yang tersedia secara publik di 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 menandai pelari yang Anda lewati dan menunjukkan rute mereka, memungkinkan orang asing untuk melihat di mana Anda tinggal. [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/). + +✅ Lakukan penelitian: Cari lebih banyak contoh peretasan IoT dan pelanggaran data IoT, terutama dengan barang-barang pribadi seperti sikat gigi atau timbangan yang terhubung ke Internet. Pikirkan tentang dampak peretasan ini terhadap korban atau pelanggan. + +> 💁 Keamanan adalah topik yang sangat luas, dan pelajaran ini hanya akan membahas beberapa dasar-dasar tentang menghubungkan perangkat Anda ke cloud. Topik lain yang tidak akan dibahas termasuk memantau perubahan data selama transit, meretas perangkat secara langsung, atau perubahan pada konfigurasi perangkat. Peretasan IoT adalah ancaman yang begitu besar sehingga alat seperti [Azure Defender for IoT](https://azure.microsoft.com/services/azure-defender-for-iot/?WT.mc_id=academic-17441-jabenn) telah dikembangkan. Alat ini mirip dengan alat antivirus dan keamanan yang mungkin Anda miliki di komputer Anda, tetapi dirancang untuk perangkat IoT kecil dengan daya rendah. + +## Kriptografi + +Ketika sebuah perangkat terhubung ke layanan IoT, ia menggunakan ID untuk mengidentifikasi dirinya. Masalahnya adalah ID ini dapat disalin - seorang peretas dapat mengatur perangkat jahat yang menggunakan ID yang sama dengan perangkat asli tetapi mengirimkan data palsu. + +![Baik perangkat valid maupun perangkat jahat dapat menggunakan ID yang sama untuk mengirim telemetri](../../../../../translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.id.png) + +Cara untuk mengatasi ini adalah dengan mengubah data yang dikirim menjadi format yang diacak, menggunakan nilai tertentu yang hanya diketahui oleh perangkat dan cloud. Proses ini disebut *enkripsi*, dan nilai yang digunakan untuk mengenkripsi data disebut *kunci enkripsi*. + +![Jika enkripsi digunakan, maka hanya pesan terenkripsi yang akan diterima, lainnya akan ditolak](../../../../../translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.id.png) + +Layanan cloud kemudian dapat mengubah data kembali ke format yang dapat dibaca, menggunakan proses yang disebut *dekripsi*, dengan menggunakan kunci enkripsi yang sama, atau *kunci dekripsi*. Jika pesan terenkripsi tidak dapat didekripsi oleh kunci tersebut, perangkat telah diretas dan pesan ditolak. + +Teknik untuk melakukan enkripsi dan dekripsi disebut *kriptografi*. + +### Kriptografi Awal + +Jenis kriptografi paling awal adalah substitusi sandi, yang sudah ada sejak 3.500 tahun yang lalu. Substitusi sandi melibatkan penggantian satu huruf dengan huruf lain. Misalnya, [Caesar cipher](https://wikipedia.org/wiki/Caesar_cipher) melibatkan pergeseran alfabet dengan jumlah tertentu, di mana hanya pengirim pesan terenkripsi dan penerima yang dimaksud yang mengetahui berapa banyak huruf yang harus digeser. + +[Vigenère cipher](https://wikipedia.org/wiki/Vigenère_cipher) membawa ini lebih jauh dengan menggunakan kata-kata untuk mengenkripsi teks, sehingga setiap huruf dalam teks asli digeser dengan jumlah yang berbeda, bukan selalu digeser dengan jumlah huruf yang sama. + +Kriptografi digunakan untuk berbagai tujuan, seperti melindungi resep glasir tembikar di Mesopotamia kuno, menulis catatan cinta rahasia di India, atau menjaga mantra magis Mesir kuno tetap rahasia. + +### Kriptografi Modern + +Kriptografi modern jauh lebih canggih, membuatnya lebih sulit untuk dipecahkan dibandingkan metode awal. Kriptografi modern menggunakan matematika yang rumit untuk mengenkripsi data dengan jumlah kemungkinan kunci yang terlalu banyak untuk memungkinkan serangan brute force. + +Kriptografi digunakan dalam banyak cara untuk komunikasi yang aman. Jika Anda membaca halaman ini di GitHub, Anda mungkin memperhatikan alamat situs web dimulai dengan *HTTPS*, yang berarti komunikasi antara browser Anda dan server web GitHub dienkripsi. Jika seseorang dapat membaca lalu lintas internet yang mengalir antara browser Anda dan GitHub, mereka tidak akan dapat membaca data karena data tersebut dienkripsi. Komputer Anda bahkan mungkin mengenkripsi semua data di hard drive Anda sehingga jika seseorang mencurinya, mereka tidak akan dapat membaca data Anda tanpa kata sandi Anda. + +> 🎓 HTTPS adalah singkatan dari HyperText Transfer Protocol **Secure** + +Sayangnya, tidak semua hal aman. Beberapa perangkat tidak memiliki keamanan, yang lain diamankan menggunakan kunci yang mudah dipecahkan, atau bahkan semua perangkat dari jenis yang sama menggunakan kunci yang sama. Ada laporan tentang perangkat IoT yang sangat pribadi yang semuanya memiliki kata sandi yang sama untuk terhubung melalui WiFi atau Bluetooth. Jika Anda dapat terhubung ke perangkat Anda sendiri, Anda dapat terhubung ke perangkat orang lain. Setelah terhubung, Anda dapat mengakses data yang sangat pribadi, atau memiliki kendali atas perangkat mereka. + +> 💁 Meskipun kompleksitas kriptografi modern dan klaim bahwa memecahkan enkripsi dapat memakan waktu miliaran tahun, munculnya komputasi kuantum telah membuka kemungkinan untuk memecahkan semua enkripsi yang diketahui dalam waktu yang sangat singkat! + +### Kunci Simetris dan Asimetris + +Enkripsi terdiri dari dua jenis - simetris dan asimetris. + +**Enkripsi simetris** menggunakan kunci yang sama untuk mengenkripsi dan mendekripsi data. Baik pengirim maupun penerima perlu mengetahui kunci yang sama. Ini adalah jenis yang paling tidak aman, karena kunci harus dibagikan dengan cara tertentu. Agar pengirim dapat mengirim pesan terenkripsi ke penerima, pengirim mungkin harus terlebih dahulu mengirimkan kunci kepada penerima. + +![Enkripsi kunci simetris menggunakan kunci yang sama untuk mengenkripsi dan mendekripsi pesan](../../../../../translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.id.png) + +Jika kunci dicuri selama transit, atau pengirim atau penerima diretas dan kunci ditemukan, enkripsi dapat dipecahkan. + +![Enkripsi kunci simetris hanya aman jika peretas tidak mendapatkan kunci - jika ya, mereka dapat mencegat dan mendekripsi pesan](../../../../../translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.id.png) + +**Enkripsi asimetris** menggunakan 2 kunci - kunci enkripsi dan kunci dekripsi, yang disebut sebagai pasangan kunci publik/pribadi. Kunci publik digunakan untuk mengenkripsi pesan, tetapi tidak dapat digunakan untuk mendekripsinya, sedangkan kunci pribadi digunakan untuk mendekripsi pesan tetapi tidak dapat digunakan untuk mengenkripsinya. + +![Enkripsi asimetris menggunakan kunci yang berbeda untuk mengenkripsi dan mendekripsi. Kunci enkripsi dikirim ke pengirim pesan sehingga mereka dapat mengenkripsi pesan sebelum mengirimkannya ke penerima yang memiliki kunci](../../../../../translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.id.png) + +Penerima membagikan kunci publik mereka, dan pengirim menggunakan ini untuk mengenkripsi pesan. Setelah pesan dikirim, penerima mendekripsinya dengan kunci pribadi mereka. Enkripsi asimetris lebih aman karena kunci pribadi disimpan secara pribadi oleh penerima dan tidak pernah dibagikan. Siapa pun dapat memiliki kunci publik karena hanya dapat digunakan untuk mengenkripsi pesan. + +Enkripsi simetris lebih cepat daripada enkripsi asimetris, tetapi enkripsi asimetris lebih aman. Beberapa sistem akan menggunakan keduanya - menggunakan enkripsi asimetris untuk mengenkripsi dan membagikan kunci simetris, lalu menggunakan kunci simetris untuk mengenkripsi semua data. Ini membuat berbagi kunci simetris antara pengirim dan penerima lebih aman, dan lebih cepat saat mengenkripsi dan mendekripsi data. + +## Amankan Perangkat IoT Anda + +Perangkat IoT dapat diamankan menggunakan enkripsi simetris atau asimetris. Enkripsi simetris lebih mudah, tetapi kurang aman. + +### Kunci Simetris + +Ketika Anda mengatur perangkat IoT Anda untuk berinteraksi dengan IoT Hub, Anda menggunakan string koneksi. Contoh string koneksi adalah: + +```output +HostName=soil-moisture-sensor.azure-devices.net;DeviceId=soil-moisture-sensor;SharedAccessKey=Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0= +``` + +String koneksi ini terdiri dari tiga bagian yang dipisahkan oleh titik koma, dengan setiap bagian berupa kunci dan nilai: + +| Kunci | Nilai | Deskripsi | +| --- | ----- | ----------- | +| HostName | `soil-moisture-sensor.azure-devices.net` | URL dari IoT Hub | +| DeviceId | `soil-moisture-sensor` | ID unik perangkat | +| SharedAccessKey | `Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0=` | Kunci simetris yang diketahui oleh perangkat dan IoT Hub | + +Bagian terakhir dari string koneksi ini, `SharedAccessKey`, adalah kunci simetris yang diketahui oleh perangkat dan IoT Hub. Kunci ini tidak pernah dikirim dari perangkat ke cloud, atau dari cloud ke perangkat. Sebaliknya, kunci ini digunakan untuk mengenkripsi data yang dikirim atau diterima. + +✅ Lakukan eksperimen. Apa yang Anda pikirkan akan terjadi jika Anda mengubah bagian `SharedAccessKey` dari string koneksi saat menghubungkan perangkat IoT Anda? Cobalah. + +Ketika perangkat pertama kali mencoba terhubung, ia mengirimkan token tanda tangan akses bersama (SAS) yang terdiri dari URL IoT Hub, stempel waktu kapan tanda tangan akses akan kedaluwarsa (biasanya 1 hari dari waktu saat ini), dan tanda tangan. Tanda tangan ini terdiri dari URL dan waktu kedaluwarsa yang dienkripsi dengan kunci akses bersama dari string koneksi. + +IoT Hub mendekripsi tanda tangan ini dengan kunci akses bersama, dan jika nilai yang didekripsi cocok dengan URL dan waktu kedaluwarsa, perangkat diizinkan untuk terhubung. IoT Hub juga memverifikasi bahwa waktu saat ini sebelum waktu kedaluwarsa, untuk mencegah perangkat jahat menangkap token SAS dari perangkat asli dan menggunakannya. + +Ini adalah cara elegan untuk memverifikasi bahwa pengirim adalah perangkat yang benar. Dengan mengirimkan beberapa data yang diketahui dalam bentuk yang tidak terenkripsi dan terenkripsi, server dapat memverifikasi perangkat dengan memastikan bahwa ketika ia mendekripsi data terenkripsi, hasilnya cocok dengan versi yang tidak terenkripsi yang dikirim. Jika cocok, maka pengirim dan penerima memiliki kunci enkripsi simetris yang sama. +💁 Karena waktu kedaluwarsa, perangkat IoT Anda perlu mengetahui waktu yang akurat, biasanya diperoleh dari server [NTP](https://wikipedia.org/wiki/Network_Time_Protocol). Jika waktu tidak akurat, koneksi akan gagal. +Setelah koneksi terjalin, semua data yang dikirim ke IoT Hub dari perangkat, atau ke perangkat dari IoT Hub akan dienkripsi menggunakan shared access key. + +✅ Apa yang menurutmu akan terjadi jika beberapa perangkat menggunakan connection string yang sama? + +> 💁 Merupakan praktik keamanan yang buruk untuk menyimpan kunci ini di dalam kode. Jika seorang peretas mendapatkan kode sumbermu, mereka dapat mengambil kunci tersebut. Selain itu, akan lebih sulit saat merilis kode karena kamu harus melakukan kompilasi ulang dengan kunci yang diperbarui untuk setiap perangkat. Lebih baik memuat kunci ini dari modul keamanan perangkat keras - sebuah chip pada perangkat IoT yang menyimpan nilai yang dienkripsi dan dapat dibaca oleh kode kamu. +> +> Saat mempelajari IoT, sering kali lebih mudah untuk meletakkan kunci di dalam kode, seperti yang kamu lakukan di pelajaran sebelumnya, tetapi kamu harus memastikan kunci ini tidak dimasukkan ke dalam kontrol kode sumber publik. + +Perangkat memiliki 2 kunci, dan 2 connection string yang sesuai. Hal ini memungkinkan kamu untuk mengganti kunci - yaitu beralih dari satu kunci ke kunci lainnya jika kunci pertama terkompromi, dan menghasilkan ulang kunci pertama. + +### Sertifikat X.509 + +Saat menggunakan enkripsi asimetris dengan pasangan kunci publik/pribadi, kamu perlu memberikan kunci publikmu kepada siapa pun yang ingin mengirimkan data kepadamu. Masalahnya adalah, bagaimana penerima kunci tersebut dapat yakin bahwa itu benar-benar kunci publikmu, bukan seseorang yang berpura-pura menjadi dirimu? Alih-alih memberikan kunci, kamu dapat memberikan kunci publikmu di dalam sertifikat yang telah diverifikasi oleh pihak ketiga yang terpercaya, yang disebut sertifikat X.509. + +Sertifikat X.509 adalah dokumen digital yang berisi bagian kunci publik dari pasangan kunci publik/pribadi. Sertifikat ini biasanya diterbitkan oleh sejumlah organisasi terpercaya yang disebut [Certification authorities](https://wikipedia.org/wiki/Certificate_authority) (CA), dan ditandatangani secara digital oleh CA untuk menunjukkan bahwa kunci tersebut valid dan berasal darimu. Kamu mempercayai sertifikat tersebut dan bahwa kunci publik berasal dari siapa yang disebutkan dalam sertifikat, karena kamu mempercayai CA, mirip dengan bagaimana kamu mempercayai paspor atau SIM karena kamu mempercayai negara yang menerbitkannya. Sertifikat ini memerlukan biaya, tetapi kamu juga dapat 'menandatangani sendiri', yaitu membuat sertifikat sendiri yang ditandatangani olehmu, untuk tujuan pengujian. + +> 💁 Kamu tidak boleh menggunakan sertifikat yang ditandatangani sendiri untuk rilis produksi. + +Sertifikat ini memiliki sejumlah bidang di dalamnya, termasuk siapa pemilik kunci publik, detail CA yang menerbitkannya, berapa lama sertifikat tersebut berlaku, dan kunci publik itu sendiri. Sebelum menggunakan sertifikat, merupakan praktik yang baik untuk memverifikasinya dengan memeriksa apakah sertifikat tersebut ditandatangani oleh CA asli. + +✅ Kamu dapat membaca daftar lengkap bidang dalam sertifikat di [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) + +Saat menggunakan sertifikat X.509, baik pengirim maupun penerima akan memiliki kunci publik dan kunci pribadi mereka sendiri, serta sertifikat X.509 yang berisi kunci publik. Mereka kemudian saling bertukar sertifikat X.509, menggunakan kunci publik masing-masing untuk mengenkripsi data yang mereka kirim, dan kunci pribadi mereka sendiri untuk mendekripsi data yang mereka terima. + +![Alih-alih berbagi kunci publik, kamu dapat berbagi sertifikat. Pengguna sertifikat dapat memverifikasi bahwa sertifikat tersebut berasal darimu dengan memeriksa otoritas sertifikat yang menandatanganinya.](../../../../../translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.id.png) + +Salah satu keuntungan besar menggunakan sertifikat X.509 adalah sertifikat ini dapat dibagikan antar perangkat. Kamu dapat membuat satu sertifikat, mengunggahnya ke IoT Hub, dan menggunakannya untuk semua perangkatmu. Setiap perangkat hanya perlu mengetahui kunci pribadi untuk mendekripsi pesan yang diterima dari IoT Hub. + +Sertifikat yang digunakan oleh perangkatmu untuk mengenkripsi pesan yang dikirim ke IoT Hub diterbitkan oleh Microsoft. Sertifikat ini adalah sertifikat yang sama yang digunakan oleh banyak layanan Azure, dan terkadang sudah terintegrasi dalam SDK. + +> 💁 Ingat, kunci publik adalah sesuatu yang bersifat publik. Kunci publik Azure hanya dapat digunakan untuk mengenkripsi data yang dikirim ke Azure, bukan untuk mendekripsinya, sehingga dapat dibagikan di mana saja, termasuk dalam kode sumber. Sebagai contoh, kamu dapat melihatnya di [Azure IoT C SDK source code](https://github.com/Azure/azure-iot-sdk-c/blob/master/certs/certs.c). + +✅ Ada banyak istilah teknis terkait sertifikat X.509. Kamu dapat membaca definisi beberapa istilah yang mungkin kamu temui di [The layman’s guide to X.509 certificate jargon](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) + +## Membuat dan menggunakan sertifikat X.509 + +Langkah-langkah untuk membuat sertifikat X.509 adalah: + +1. Membuat pasangan kunci publik/pribadi. Salah satu algoritma yang paling banyak digunakan untuk membuat pasangan kunci publik/pribadi disebut [Rivest–Shamir–Adleman](https://wikipedia.org/wiki/RSA_(cryptosystem))(RSA). + +1. Mengirimkan kunci publik beserta data terkait untuk ditandatangani, baik oleh CA, atau dengan menandatangani sendiri. + +Azure CLI memiliki perintah untuk membuat identitas perangkat baru di IoT Hub, dan secara otomatis membuat pasangan kunci publik/pribadi serta sertifikat yang ditandatangani sendiri. + +> 💁 Jika kamu ingin melihat langkah-langkahnya secara detail, daripada menggunakan Azure CLI, kamu dapat menemukannya di [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) + +### Tugas - membuat identitas perangkat menggunakan sertifikat X.509 + +1. Jalankan perintah berikut untuk mendaftarkan identitas perangkat baru, secara otomatis membuat kunci dan sertifikat: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor-x509 \ + --am x509_thumbprint \ + --output-dir . \ + --hub-name + ``` + + Ganti `` dengan nama yang kamu gunakan untuk IoT Hub-mu. + + Perintah ini akan membuat perangkat dengan ID `soil-moisture-sensor-x509` untuk membedakan dari identitas perangkat yang kamu buat di pelajaran sebelumnya. Perintah ini juga akan membuat 2 file di direktori saat ini: + + * `soil-moisture-sensor-x509-key.pem` - file ini berisi kunci pribadi untuk perangkat. + * `soil-moisture-sensor-x509-cert.pem` - ini adalah file sertifikat X.509 untuk perangkat. + + Simpan file-file ini dengan aman! File kunci pribadi tidak boleh dimasukkan ke dalam kontrol kode sumber publik. + +### Tugas - menggunakan sertifikat X.509 dalam kode perangkatmu + +Ikuti panduan yang relevan untuk menghubungkan perangkat IoT-mu ke cloud menggunakan sertifikat X.509: + +* [Arduino - Wio Terminal](wio-terminal-x509.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-x509.md) + +--- + +## 🚀 Tantangan + +Ada beberapa cara untuk membuat, mengelola, dan menghapus layanan Azure seperti Resource Groups dan IoT Hubs. Salah satu caranya adalah melalui [Azure Portal](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) - antarmuka berbasis web yang memberikan GUI untuk mengelola layanan Azure-mu. + +Kunjungi [portal.azure.com](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) dan jelajahi portal tersebut. Coba buat IoT Hub menggunakan portal, lalu hapus IoT Hub tersebut. + +**Petunjuk** - saat membuat layanan melalui portal, kamu tidak perlu membuat Resource Group terlebih dahulu, Resource Group dapat dibuat saat kamu membuat layanan. Pastikan kamu menghapusnya setelah selesai! + +Kamu dapat menemukan banyak dokumentasi, tutorial, dan panduan tentang Azure Portal di [Azure portal documentation](https://docs.microsoft.com/azure/azure-portal/?WT.mc_id=academic-17441-jabenn). + +## Kuis setelah pelajaran + +[Kuis setelah pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/20) + +## Tinjauan & Studi Mandiri + +* Pelajari sejarah kriptografi di [History of cryptography page on Wikipedia](https://wikipedia.org/wiki/History_of_cryptography). +* Pelajari lebih lanjut tentang sertifikat X.509 di [X.509 page on Wikipedia](https://wikipedia.org/wiki/X.509). + +## Tugas + +[Bangun perangkat IoT baru](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/6-keep-your-plant-secure/assignment.md b/translations/id/2-farm/lessons/6-keep-your-plant-secure/assignment.md new file mode 100644 index 00000000..cd69b2c2 --- /dev/null +++ b/translations/id/2-farm/lessons/6-keep-your-plant-secure/assignment.md @@ -0,0 +1,29 @@ + +# Membangun Perangkat IoT Baru + +## Instruksi + +Selama 6 pelajaran terakhir, Anda telah mempelajari tentang pertanian digital dan cara menggunakan perangkat IoT untuk mengumpulkan data guna memprediksi pertumbuhan tanaman, serta mengotomatisasi penyiraman berdasarkan pembacaan kelembapan tanah. + +Gunakan apa yang telah Anda pelajari untuk membangun perangkat IoT baru menggunakan sensor dan aktuator pilihan Anda. Kirim telemetri ke IoT Hub, dan gunakan itu untuk mengontrol aktuator melalui kode tanpa server. Anda dapat menggunakan sensor dan aktuator yang sudah Anda gunakan dalam proyek ini atau proyek sebelumnya, atau jika Anda memiliki perangkat keras lain, cobalah sesuatu yang baru. + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Perbaikan | +| -------- | ------- | -------- | --------------- | +| Membuat kode perangkat IoT untuk menggunakan sensor dan aktuator | Membuat kode perangkat IoT yang berfungsi dengan sensor dan aktuator | Membuat kode perangkat IoT yang berfungsi dengan sensor atau aktuator | Tidak dapat membuat kode perangkat IoT untuk menggunakan sensor atau aktuator | +| Menghubungkan perangkat IoT ke IoT Hub | Berhasil menerapkan IoT Hub dan mengirim telemetri ke sana, serta menerima perintah darinya | Berhasil menerapkan IoT Hub dan mengirim telemetri atau menerima perintah | Tidak dapat menerapkan IoT Hub dan berkomunikasi dengannya dari perangkat IoT | +| Mengontrol aktuator menggunakan kode tanpa server | Berhasil menerapkan Azure Function untuk mengontrol perangkat yang dipicu oleh peristiwa telemetri | Berhasil menerapkan Azure Function yang dipicu oleh peristiwa telemetri tetapi tidak dapat mengontrol aktuator | Tidak dapat menerapkan Azure Function | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md b/translations/id/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md new file mode 100644 index 00000000..2f5ebafa --- /dev/null +++ b/translations/id/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md @@ -0,0 +1,71 @@ + +# Gunakan sertifikat X.509 dalam kode perangkat Anda - Perangkat IoT Virtual dan Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan menghubungkan perangkat IoT virtual atau Raspberry Pi Anda ke IoT Hub menggunakan sertifikat X.509. + +## Hubungkan perangkat Anda ke IoT Hub + +Langkah berikutnya adalah menghubungkan perangkat Anda ke IoT Hub menggunakan sertifikat X.509. + +### Tugas - hubungkan ke IoT Hub + +1. Salin file kunci dan sertifikat ke folder yang berisi kode perangkat IoT Anda. Jika Anda menggunakan Raspberry Pi melalui VS Code Remote SSH dan membuat kunci di PC atau Mac Anda, Anda dapat menyeret dan melepaskan file ke explorer di VS Code untuk menyalinnya. + +1. Buka file `app.py` + +1. Untuk terhubung menggunakan sertifikat X.509, Anda akan memerlukan nama host dari IoT Hub, dan sertifikat X.509. Mulailah dengan membuat variabel yang berisi nama host dengan menambahkan kode berikut sebelum klien perangkat dibuat: + + ```python + host_name = "" + ``` + + Ganti `` dengan nama host IoT Hub Anda. Anda dapat menemukannya di bagian `HostName` dalam `connection_string`. Ini akan menjadi nama IoT Hub Anda, diakhiri dengan `.azure-devices.net` + +1. Di bawah ini, deklarasikan variabel dengan ID perangkat: + + ```python + device_id = "soil-moisture-sensor-x509" + ``` + +1. Anda akan memerlukan instance dari kelas `X509` yang berisi file sertifikat X.509. Tambahkan `X509` ke daftar kelas yang diimpor dari modul `azure.iot.device`: + + ```python + from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse, X509 + ``` + +1. Buat instance kelas `X509` menggunakan file sertifikat dan kunci Anda dengan menambahkan kode ini di bawah deklarasi `host_name`: + + ```python + x509 = X509("./soil-moisture-sensor-x509-cert.pem", "./soil-moisture-sensor-x509-key.pem") + ``` + + Ini akan membuat kelas `X509` menggunakan file `soil-moisture-sensor-x509-cert.pem` dan `soil-moisture-sensor-x509-key.pem` yang dibuat sebelumnya. + +1. Ganti baris kode yang membuat `device_client` dari string koneksi, dengan yang berikut: + + ```python + device_client = IoTHubDeviceClient.create_from_x509_certificate(x509, host_name, device_id) + ``` + + Ini akan terhubung menggunakan sertifikat X.509, bukan string koneksi. + +1. Hapus baris dengan variabel `connection_string`. + +1. Jalankan kode Anda. Pantau pesan yang dikirim ke IoT Hub, dan kirim permintaan metode langsung seperti sebelumnya. Anda akan melihat perangkat terhubung dan mengirimkan pembacaan kelembapan tanah, serta menerima permintaan metode langsung. + +> 💁 Anda dapat menemukan kode ini di folder [code/pi](../../../../../2-farm/lessons/6-keep-your-plant-secure/code/pi) atau [code/virtual-device](../../../../../2-farm/lessons/6-keep-your-plant-secure/code/virtual-device). + +😀 Program sensor kelembapan tanah Anda telah terhubung ke IoT Hub menggunakan sertifikat X.509! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md b/translations/id/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md new file mode 100644 index 00000000..f99ecff4 --- /dev/null +++ b/translations/id/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md @@ -0,0 +1,17 @@ + +# Gunakan sertifikat X.509 dalam kode perangkat Anda - Wio Terminal + +Pada saat penulisan, Azure Arduino SDK belum mendukung sertifikat X.509. Jika Anda ingin bereksperimen dengan sertifikat X.509, Anda dapat merujuk ke [Instruksi perangkat IoT virtual menggunakan Python SDK](single-board-computer-x509.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/3-transport/README.md b/translations/id/3-transport/README.md new file mode 100644 index 00000000..68ec65eb --- /dev/null +++ b/translations/id/3-transport/README.md @@ -0,0 +1,38 @@ + +# Transportasi dari pertanian ke pabrik - menggunakan IoT untuk melacak pengiriman makanan + +Banyak petani menanam makanan untuk dijual - baik mereka adalah petani komersial yang menjual semua hasil panennya, atau petani subsisten yang menjual kelebihan hasil panen mereka untuk membeli kebutuhan. Bagaimanapun, makanan harus sampai dari pertanian ke konsumen, dan ini biasanya mengandalkan transportasi massal dari pertanian, ke pusat atau pabrik pengolahan, lalu ke toko-toko. Sebagai contoh, seorang petani tomat akan memanen tomat, mengemasnya ke dalam kotak, memuat kotak-kotak tersebut ke dalam truk, lalu mengantarkannya ke pabrik pengolahan. Tomat-tomat tersebut kemudian akan disortir, dan dari sana dikirimkan kepada konsumen dalam bentuk makanan olahan, penjualan ritel, atau dikonsumsi di restoran. + +IoT dapat membantu rantai pasokan ini dengan melacak makanan selama dalam perjalanan - memastikan pengemudi berada di jalur yang seharusnya, memantau lokasi kendaraan, dan mendapatkan pemberitahuan saat kendaraan tiba sehingga makanan dapat segera dibongkar dan siap untuk diproses secepat mungkin. + +> 🎓 *Rantai pasokan* adalah rangkaian aktivitas untuk membuat dan mengirimkan sesuatu. Sebagai contoh, dalam pertanian tomat, rantai pasokan mencakup penyediaan benih, tanah, pupuk, dan air, menanam tomat, mengirimkan tomat ke pusat distribusi, mengangkutnya ke pusat distribusi lokal supermarket, mengirimkannya ke supermarket individu, menempatkannya di rak pajangan, lalu dijual kepada konsumen dan dibawa pulang untuk dimakan. Setiap langkah seperti mata rantai dalam sebuah rantai. + +> 🎓 Bagian transportasi dari rantai pasokan dikenal sebagai *logistik*. + +Dalam 4 pelajaran ini, Anda akan belajar bagaimana menerapkan Internet of Things untuk meningkatkan rantai pasokan dengan memantau makanan saat dimuat ke dalam truk (virtual), yang dilacak saat bergerak menuju tujuannya. Anda akan mempelajari tentang pelacakan GPS, cara menyimpan dan memvisualisasikan data GPS, serta cara mendapatkan pemberitahuan saat truk tiba di tujuannya. + +> 💁 Pelajaran ini akan menggunakan beberapa sumber daya cloud. Jika Anda tidak menyelesaikan semua pelajaran dalam proyek ini, pastikan Anda [Membersihkan proyek Anda](../clean-up.md). + +## Topik + +1. [Pelacakan lokasi](lessons/1-location-tracking/README.md) +1. [Menyimpan data lokasi](lessons/2-store-location-data/README.md) +1. [Memvisualisasikan data lokasi](lessons/3-visualize-location-data/README.md) +1. [Geofences](lessons/4-geofences/README.md) + +## Kredit + +Semua pelajaran ditulis dengan ♥️ oleh [Jen Looper](https://github.com/jlooper) dan [Jim Bennett](https://GitHub.com/JimBobBennett) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/3-transport/lessons/1-location-tracking/README.md b/translations/id/3-transport/lessons/1-location-tracking/README.md new file mode 100644 index 00000000..8e11ffbc --- /dev/null +++ b/translations/id/3-transport/lessons/1-location-tracking/README.md @@ -0,0 +1,216 @@ + +# Pelacakan Lokasi + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +## Kuis Pra-Kuliah + +[Kuis Pra-Kuliah](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/21) + +## Pendahuluan + +Proses utama untuk mengirimkan makanan dari petani ke konsumen melibatkan pemuatan kotak hasil panen ke truk, kapal, pesawat, atau kendaraan transportasi komersial lainnya, dan mengantarkan makanan tersebut ke suatu tempat - baik langsung ke pelanggan, atau ke pusat distribusi atau gudang untuk diproses. Seluruh proses dari awal hingga akhir, dari petani ke konsumen, adalah bagian dari proses yang disebut *rantai pasokan*. Video di bawah ini dari W. P. Carey School of Business di Arizona State University menjelaskan lebih lanjut tentang konsep rantai pasokan dan bagaimana pengelolaannya. + +[![Apa itu Manajemen Rantai Pasokan? Video dari W. P. Carey School of Business di Arizona State University](https://img.youtube.com/vi/Mi1QBxVjZAw/0.jpg)](https://www.youtube.com/watch?v=Mi1QBxVjZAw) + +> 🎥 Klik gambar di atas untuk menonton video + +Menambahkan perangkat IoT dapat secara drastis meningkatkan rantai pasokan Anda, memungkinkan Anda mengelola lokasi barang, merencanakan transportasi dan penanganan barang dengan lebih baik, serta merespons masalah dengan lebih cepat. + +Ketika mengelola armada kendaraan seperti truk, sangat membantu untuk mengetahui di mana setiap kendaraan berada pada waktu tertentu. Kendaraan dapat dilengkapi dengan sensor GPS yang mengirimkan lokasinya ke sistem IoT, memungkinkan pemilik untuk mengetahui lokasi kendaraan, melihat rute yang telah dilalui, dan mengetahui kapan kendaraan akan tiba di tujuan. Sebagian besar kendaraan beroperasi di luar jangkauan WiFi, sehingga mereka menggunakan jaringan seluler untuk mengirimkan data semacam ini. Kadang-kadang sensor GPS terintegrasi dalam perangkat IoT yang lebih kompleks seperti buku catatan elektronik. Perangkat ini melacak berapa lama truk telah dalam perjalanan untuk memastikan pengemudi mematuhi peraturan lokal tentang jam kerja. + +Dalam pelajaran ini, Anda akan belajar cara melacak lokasi kendaraan menggunakan sensor Sistem Pemosisian Global (GPS). + +Dalam pelajaran ini, kita akan membahas: + +* [Kendaraan yang terhubung](../../../../../3-transport/lessons/1-location-tracking) +* [Koordinat geospasial](../../../../../3-transport/lessons/1-location-tracking) +* [Sistem Pemosisian Global (GPS)](../../../../../3-transport/lessons/1-location-tracking) +* [Membaca data sensor GPS](../../../../../3-transport/lessons/1-location-tracking) +* [Data GPS NMEA](../../../../../3-transport/lessons/1-location-tracking) +* [Mendekode data sensor GPS](../../../../../3-transport/lessons/1-location-tracking) + +## Kendaraan yang Terhubung + +IoT mengubah cara barang diangkut dengan menciptakan armada *kendaraan yang terhubung*. Kendaraan ini terhubung ke sistem TI pusat yang melaporkan informasi tentang lokasi mereka, serta data sensor lainnya. Memiliki armada kendaraan yang terhubung memberikan berbagai manfaat: + +* Pelacakan lokasi - Anda dapat mengetahui lokasi kendaraan kapan saja, memungkinkan Anda untuk: + + * Mendapatkan pemberitahuan ketika kendaraan hampir tiba di tujuan untuk mempersiapkan kru pembongkaran + * Menemukan kendaraan yang dicuri + * Menggabungkan data lokasi dan rute dengan masalah lalu lintas untuk memungkinkan Anda mengalihkan rute kendaraan di tengah perjalanan + * Mematuhi pajak. Beberapa negara mengenakan biaya pada kendaraan berdasarkan jarak tempuh di jalan umum (seperti [RUC Selandia Baru](https://www.nzta.govt.nz/vehicles/licensing-rego/road-user-charges/)), sehingga mengetahui kapan kendaraan berada di jalan umum vs jalan pribadi memudahkan perhitungan pajak yang harus dibayar. + * Mengetahui di mana harus mengirim kru perbaikan jika terjadi kerusakan + +* Telemetri pengemudi - Memastikan pengemudi mematuhi batas kecepatan, menikung dengan kecepatan yang sesuai, mengerem lebih awal dan efisien, serta mengemudi dengan aman. Kendaraan yang terhubung juga dapat dilengkapi kamera untuk merekam insiden. Ini dapat dikaitkan dengan asuransi, memberikan tarif yang lebih rendah untuk pengemudi yang baik. + +* Kepatuhan jam kerja pengemudi - Memastikan pengemudi hanya mengemudi selama jam kerja yang diizinkan secara hukum berdasarkan waktu mesin dinyalakan dan dimatikan. + +Manfaat ini dapat digabungkan - misalnya, menggabungkan kepatuhan jam kerja pengemudi dengan pelacakan lokasi untuk mengalihkan rute pengemudi jika mereka tidak dapat mencapai tujuan dalam jam kerja yang diizinkan. Ini juga dapat digabungkan dengan telemetri kendaraan lainnya, seperti data suhu dari truk berpendingin, memungkinkan kendaraan untuk dialihkan jika rute saat ini akan menyebabkan barang tidak dapat disimpan pada suhu yang sesuai. + +> 🎓 Logistik adalah proses mengangkut barang dari satu tempat ke tempat lain, seperti dari petani ke supermarket melalui satu atau lebih gudang. Seorang petani mengemas kotak tomat yang dimuat ke truk, dikirim ke gudang pusat, dan dimuat ke truk kedua yang mungkin berisi campuran berbagai jenis hasil panen yang kemudian dikirim ke supermarket. + +Komponen inti dari pelacakan kendaraan adalah GPS - sensor yang dapat menentukan lokasi mereka di mana saja di Bumi. Dalam pelajaran ini, Anda akan belajar cara menggunakan sensor GPS, dimulai dengan mempelajari cara mendefinisikan lokasi di Bumi. + +## Koordinat Geospasial + +Koordinat geospasial digunakan untuk menentukan titik-titik di permukaan Bumi, mirip dengan bagaimana koordinat dapat digunakan untuk menggambar piksel di layar komputer atau memposisikan jahitan dalam bordir silang. Untuk satu titik, Anda memiliki sepasang koordinat. Sebagai contoh, Kampus Microsoft di Redmond, Washington, AS terletak di 47.6423109, -122.1390293. + +### Lintang dan Bujur + +Bumi adalah sebuah bola - lingkaran tiga dimensi. Karena itu, titik-titik didefinisikan dengan membaginya menjadi 360 derajat, sama seperti geometri lingkaran. Lintang mengukur jumlah derajat dari utara ke selatan, bujur mengukur jumlah derajat dari timur ke barat. + +> 💁 Tidak ada yang benar-benar tahu alasan asli mengapa lingkaran dibagi menjadi 360 derajat. Halaman [derajat (sudut) di Wikipedia](https://wikipedia.org/wiki/Degree_(angle)) mencakup beberapa kemungkinan alasannya. + +![Garis lintang dari 90° di Kutub Utara, 45° di tengah antara Kutub Utara dan ekuator, 0° di ekuator, -45° di tengah antara ekuator dan Kutub Selatan, dan -90° di Kutub Selatan](../../../../../translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.id.png) + +Lintang diukur menggunakan garis-garis yang melingkari Bumi dan sejajar dengan ekuator, membagi Belahan Bumi Utara dan Selatan menjadi masing-masing 90°. Ekuator berada di 0°, Kutub Utara di 90°, juga dikenal sebagai 90° Utara, dan Kutub Selatan di -90°, atau 90° Selatan. + +Bujur diukur sebagai jumlah derajat yang diukur ke timur dan barat. Titik asal 0° bujur disebut *Meridian Utama*, dan didefinisikan pada tahun 1884 sebagai garis dari Kutub Utara ke Kutub Selatan yang melewati [Observatorium Kerajaan Inggris di Greenwich, Inggris](https://wikipedia.org/wiki/Royal_Observatory,_Greenwich). + +![Garis bujur yang membentang dari -180° di barat Meridian Utama, ke 0° di Meridian Utama, hingga 180° di timur Meridian Utama](../../../../../translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.id.png) + +> 🎓 Sebuah meridian adalah garis lurus imajiner yang membentang dari Kutub Utara ke Kutub Selatan, membentuk setengah lingkaran. + +Untuk mengukur bujur suatu titik, Anda mengukur jumlah derajat di sekitar ekuator dari Meridian Utama ke meridian yang melewati titik tersebut. Bujur berkisar dari -180°, atau 180° Barat, melalui 0° di Meridian Utama, hingga 180°, atau 180° Timur. 180° dan -180° merujuk pada titik yang sama, yaitu antimeridian atau meridian ke-180. Ini adalah meridian di sisi Bumi yang berlawanan dengan Meridian Utama. + +> 💁 Antimeridian tidak sama dengan Garis Tanggal Internasional, yang berada di posisi yang hampir sama, tetapi tidak berupa garis lurus dan bervariasi untuk menyesuaikan dengan batas-batas geopolitik. + +✅ Lakukan penelitian: Coba temukan lintang dan bujur lokasi Anda saat ini. + +### Derajat, Menit, dan Detik vs Derajat Desimal + +Secara tradisional, pengukuran derajat lintang dan bujur dilakukan menggunakan sistem penomoran seksagesimal, atau basis-60, sistem penomoran yang digunakan oleh Bangsa Babilonia Kuno yang pertama kali melakukan pengukuran dan pencatatan waktu serta jarak. Anda mungkin menggunakan sistem seksagesimal setiap hari tanpa menyadarinya - membagi jam menjadi 60 menit dan menit menjadi 60 detik. + +Bujur dan lintang diukur dalam derajat, menit, dan detik, dengan satu menit setara dengan 1/60 derajat, dan 1 detik setara dengan 1/60 menit. + +Sebagai contoh, di ekuator: + +* 1° lintang adalah **111,3 kilometer** +* 1 menit lintang adalah 111,3/60 = **1,855 kilometer** +* 1 detik lintang adalah 1,855/60 = **0,031 kilometer** + +Simbol untuk menit adalah tanda kutip tunggal, untuk detik adalah tanda kutip ganda. Sebagai contoh, 2 derajat, 17 menit, dan 43 detik akan ditulis sebagai 2°17'43". Bagian dari detik diberikan sebagai desimal, misalnya setengah detik adalah 0°0'0.5". + +Komputer tidak bekerja dalam basis-60, sehingga koordinat ini diberikan sebagai derajat desimal saat menggunakan data GPS di sebagian besar sistem komputer. Sebagai contoh, 2°17'43" adalah 2.295277. Simbol derajat biasanya dihilangkan. + +Koordinat untuk suatu titik selalu diberikan sebagai `lintang, bujur`, sehingga contoh sebelumnya dari Kampus Microsoft di 47.6423109,-122.117198 memiliki: + +* Lintang 47.6423109 (47.6423109 derajat di utara ekuator) +* Bujur -122.1390293 (122.1390293 derajat di barat Meridian Utama). + +![Kampus Microsoft di 47.6423109,-122.117198](../../../../../translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.id.png) + +## Sistem Pemosisian Global (GPS) + +Sistem GPS menggunakan beberapa satelit yang mengorbit Bumi untuk menentukan posisi Anda. Anda mungkin pernah menggunakan sistem GPS tanpa menyadarinya - untuk menemukan lokasi Anda di aplikasi peta di ponsel seperti Apple Maps atau Google Maps, atau untuk melihat di mana kendaraan Anda berada di aplikasi pemesanan kendaraan seperti Uber atau Lyft, atau saat menggunakan navigasi satelit (sat-nav) di mobil Anda. + +> 🎓 Satelit dalam 'navigasi satelit' adalah satelit GPS! + +Sistem GPS bekerja dengan memiliki sejumlah satelit yang mengirimkan sinyal dengan posisi masing-masing satelit saat ini, dan stempel waktu yang akurat. Sinyal ini dikirim melalui gelombang radio dan dideteksi oleh antena di sensor GPS. Sensor GPS akan mendeteksi sinyal ini, dan menggunakan waktu saat ini untuk mengukur berapa lama waktu yang dibutuhkan sinyal untuk mencapai sensor dari satelit. Karena kecepatan gelombang radio konstan, sensor GPS dapat menggunakan stempel waktu yang dikirim untuk menghitung seberapa jauh sensor dari satelit. Dengan menggabungkan data dari setidaknya 3 satelit dengan posisi yang dikirimkan, sensor GPS dapat menentukan lokasinya di Bumi. + +> 💁 Sensor GPS memerlukan antena untuk mendeteksi gelombang radio. Antena yang terpasang di truk dan mobil dengan GPS bawaan diposisikan untuk mendapatkan sinyal yang baik, biasanya di kaca depan atau atap. Jika Anda menggunakan sistem GPS terpisah, seperti ponsel pintar atau perangkat IoT, maka Anda perlu memastikan bahwa antena yang terpasang di sistem GPS atau ponsel memiliki pandangan yang jelas ke langit, seperti dipasang di kaca depan. + +![Dengan mengetahui jarak dari sensor ke beberapa satelit, lokasi dapat dihitung](../../../../../translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.id.png) + +Satelit GPS mengelilingi Bumi, tidak berada di titik tetap di atas sensor, sehingga data lokasi mencakup ketinggian di atas permukaan laut serta lintang dan bujur. + +GPS dulunya memiliki keterbatasan akurasi yang diberlakukan oleh militer AS, membatasi akurasi hingga sekitar 5 meter. Keterbatasan ini dihapus pada tahun 2000, memungkinkan akurasi hingga 30 sentimeter. Mendapatkan akurasi ini tidak selalu memungkinkan karena gangguan pada sinyal. + +✅ Jika Anda memiliki ponsel pintar, buka aplikasi peta dan lihat seberapa akurat lokasi Anda. Mungkin perlu beberapa saat bagi ponsel Anda untuk mendeteksi beberapa satelit untuk mendapatkan lokasi yang lebih akurat. +💁 Satelit-satelit tersebut memiliki jam atom yang sangat akurat, tetapi mereka melenceng sebesar 38 mikrodetik (0,0000038 detik) per hari dibandingkan dengan jam atom di Bumi, karena waktu melambat seiring dengan meningkatnya kecepatan seperti yang diprediksi oleh teori relativitas khusus dan umum Einstein - satelit-satelit tersebut bergerak lebih cepat daripada rotasi Bumi. Penyimpangan ini telah digunakan untuk membuktikan prediksi relativitas khusus dan umum, dan harus disesuaikan dalam desain sistem GPS. Secara harfiah, waktu berjalan lebih lambat di satelit GPS. +Sistem GPS telah dikembangkan dan digunakan oleh sejumlah negara dan serikat politik termasuk AS, Rusia, Jepang, India, Uni Eropa, dan China. Sensor GPS modern dapat terhubung ke sebagian besar sistem ini untuk mendapatkan lokasi yang lebih cepat dan akurat. + +> 🎓 Kelompok satelit dalam setiap sistem disebut sebagai konstelasi. + +## Membaca data sensor GPS + +Sebagian besar sensor GPS mengirimkan data GPS melalui UART. + +> ⚠️ UART telah dibahas di [proyek 2, pelajaran 2](../../../2-farm/lessons/2-detect-soil-moisture/README.md#universal-asynchronous-receiver-transmitter-uart). Kembali ke pelajaran tersebut jika diperlukan. + +Anda dapat menggunakan sensor GPS pada perangkat IoT Anda untuk mendapatkan data GPS. + +### Tugas - menghubungkan sensor GPS dan membaca data GPS + +Ikuti panduan yang relevan untuk membaca data GPS menggunakan perangkat IoT Anda: + +* [Arduino - Wio Terminal](wio-terminal-gps-sensor.md) +* [Komputer papan tunggal - Raspberry Pi](pi-gps-sensor.md) +* [Komputer papan tunggal - Perangkat virtual](virtual-device-gps-sensor.md) + +## Data GPS NMEA + +Saat Anda menjalankan kode Anda, Anda mungkin melihat sesuatu yang tampak seperti kode acak di output. Ini sebenarnya adalah data GPS standar, dan semuanya memiliki arti. + +Sensor GPS mengeluarkan data menggunakan pesan NMEA, sesuai dengan standar NMEA 0183. NMEA adalah singkatan dari [National Marine Electronics Association](https://www.nmea.org), sebuah organisasi perdagangan berbasis di AS yang menetapkan standar komunikasi antar perangkat elektronik kelautan. + +> 💁 Standar ini bersifat proprietary dan dijual dengan harga setidaknya US$2,000, tetapi cukup banyak informasi tentangnya yang tersedia di domain publik sehingga sebagian besar standar telah direkayasa balik dan dapat digunakan dalam kode sumber terbuka dan non-komersial lainnya. + +Pesan-pesan ini berbasis teks. Setiap pesan terdiri dari *kalimat* yang dimulai dengan karakter `$`, diikuti oleh 2 karakter untuk menunjukkan sumber pesan (misalnya GP untuk sistem GPS AS, GN untuk GLONASS, sistem GPS Rusia), dan 3 karakter untuk menunjukkan jenis pesan. Sisa pesan adalah bidang-bidang yang dipisahkan oleh koma, diakhiri dengan karakter baris baru. + +Beberapa jenis pesan yang dapat diterima adalah: + +| Jenis | Deskripsi | +| ---- | ----------- | +| GGA | Data Fix GPS, termasuk lintang, bujur, dan ketinggian sensor GPS, bersama dengan jumlah satelit yang terlihat untuk menghitung lokasi ini. | +| ZDA | Tanggal dan waktu saat ini, termasuk zona waktu lokal | +| GSV | Detail satelit yang terlihat - didefinisikan sebagai satelit yang dapat dideteksi sinyalnya oleh sensor GPS | + +> 💁 Data GPS mencakup cap waktu, sehingga perangkat IoT Anda dapat mendapatkan waktu jika diperlukan dari sensor GPS, daripada mengandalkan server NTP atau jam waktu nyata internal. + +Pesan GGA mencakup lokasi saat ini menggunakan format `(dd)dmm.mmmm`, bersama dengan satu karakter untuk menunjukkan arah. `d` dalam format adalah derajat, `m` adalah menit, dengan detik sebagai desimal dari menit. Misalnya, 2°17'43" akan menjadi 217.716666667 - 2 derajat, 17.716666667 menit. + +Karakter arah dapat berupa `N` atau `S` untuk lintang untuk menunjukkan utara atau selatan, dan `E` atau `W` untuk bujur untuk menunjukkan timur atau barat. Misalnya, lintang 2°17'43" akan memiliki karakter arah `N`, -2°17'43" akan memiliki karakter arah `S`. + +Sebagai contoh - kalimat NMEA `$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67` + +* Bagian lintang adalah `4738.538654,N`, yang dikonversi menjadi 47.6423109 dalam derajat desimal. `4738.538654` adalah 47.6423109, dan arah adalah `N` (utara), sehingga lintang positif. + +* Bagian bujur adalah `12208.341758,W`, yang dikonversi menjadi -122.1390293 dalam derajat desimal. `12208.341758` adalah 122.1390293°, dan arah adalah `W` (barat), sehingga bujur negatif. + +## Mendekode data sensor GPS + +Daripada menggunakan data NMEA mentah, lebih baik mendekodenya ke format yang lebih berguna. Ada banyak pustaka sumber terbuka yang dapat Anda gunakan untuk membantu mengekstrak data berguna dari pesan NMEA mentah. + +### Tugas - mendekode data sensor GPS + +Ikuti panduan yang relevan untuk mendekode data sensor GPS menggunakan perangkat IoT Anda: + +* [Arduino - Wio Terminal](wio-terminal-gps-decode.md) +* [Komputer papan tunggal - Raspberry Pi/Perangkat IoT virtual](single-board-computer-gps-decode.md) + +--- + +## 🚀 Tantangan + +Tulis decoder NMEA Anda sendiri! Daripada mengandalkan pustaka pihak ketiga untuk mendekode kalimat NMEA, bisakah Anda menulis decoder Anda sendiri untuk mengekstrak lintang dan bujur dari kalimat NMEA? + +## Kuis setelah pelajaran + +[Kuis setelah pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/22) + +## Tinjauan & Studi Mandiri + +* Baca lebih lanjut tentang Koordinat Geospasial di [halaman sistem koordinat geografis di Wikipedia](https://wikipedia.org/wiki/Geographic_coordinate_system). +* Pelajari tentang Meridian Utama pada benda langit selain Bumi di [halaman Meridian Utama di Wikipedia](https://wikipedia.org/wiki/Prime_meridian#Prime_meridian_on_other_planetary_bodies) +* Teliti berbagai sistem GPS dari berbagai pemerintah dunia dan serikat politik seperti Uni Eropa, Jepang, Rusia, India, dan AS. + +## Tugas + +[Selidiki data GPS lainnya](assignment.md) + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/3-transport/lessons/1-location-tracking/assignment.md b/translations/id/3-transport/lessons/1-location-tracking/assignment.md new file mode 100644 index 00000000..e8c9db15 --- /dev/null +++ b/translations/id/3-transport/lessons/1-location-tracking/assignment.md @@ -0,0 +1,29 @@ + +# Selidiki data GPS lainnya + +## Instruksi + +Kalimat NMEA yang berasal dari sensor GPS Anda memiliki data lain selain lokasi. Selidiki data tambahan tersebut, dan gunakan dalam perangkat IoT Anda. + +Sebagai contoh - bisakah Anda mendapatkan tanggal dan waktu saat ini? Jika Anda menggunakan mikrokontroler, bisakah Anda mengatur jam menggunakan data GPS dengan cara yang sama seperti Anda mengaturnya menggunakan sinyal NTP di proyek sebelumnya? Bisakah Anda mendapatkan ketinggian (tinggi Anda di atas permukaan laut), atau kecepatan Anda saat ini? + +Jika Anda menggunakan perangkat IoT virtual, maka Anda dapat memperoleh beberapa data ini dengan mengirimkan kalimat NMEA yang dihasilkan menggunakan alat [nmeagen.org](https://www.nmeagen.org). + +## Rubrik + +| Kriteria | Unggul | Memadai | Perlu Peningkatan | +| -------- | ------- | -------- | ----------------- | +| Mendapatkan lebih banyak data GPS | Mampu mendapatkan dan menggunakan lebih banyak data GPS, baik sebagai telemetri atau untuk mengatur perangkat IoT | Mampu mendapatkan lebih banyak data GPS, tetapi tidak dapat menggunakannya | Tidak mampu mendapatkan lebih banyak data GPS | + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/3-transport/lessons/1-location-tracking/pi-gps-sensor.md b/translations/id/3-transport/lessons/1-location-tracking/pi-gps-sensor.md new file mode 100644 index 00000000..20b59c3a --- /dev/null +++ b/translations/id/3-transport/lessons/1-location-tracking/pi-gps-sensor.md @@ -0,0 +1,193 @@ + +# Membaca Data GPS - Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor GPS ke Raspberry Pi dan membaca nilai-nilai darinya. + +## Perangkat Keras + +Raspberry Pi membutuhkan sensor GPS. + +Sensor yang akan Anda gunakan adalah [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Sensor ini dapat terhubung ke beberapa sistem GPS untuk mendapatkan posisi yang cepat dan akurat. Sensor ini terdiri dari 2 bagian - komponen inti elektronik sensor, dan antena eksternal yang terhubung dengan kabel tipis untuk menangkap gelombang radio dari satelit. + +Ini adalah sensor UART, sehingga mengirimkan data GPS melalui UART. + +## Menghubungkan Sensor GPS + +Sensor GPS Grove dapat dihubungkan ke Raspberry Pi. + +### Tugas - Menghubungkan Sensor GPS + +Hubungkan sensor GPS. + +![Sensor GPS Grove](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.id.png) + +1. Masukkan salah satu ujung kabel Grove ke soket pada sensor GPS. Kabel ini hanya dapat masuk dengan satu arah. + +1. Dengan Raspberry Pi dalam keadaan mati, hubungkan ujung lain kabel Grove ke soket UART yang ditandai **UART** pada Grove Base hat yang terpasang di Pi. Soket ini berada di baris tengah, di sisi yang paling dekat dengan slot kartu SD, ujung yang berlawanan dari port USB dan soket ethernet. + + ![Sensor GPS Grove terhubung ke soket UART](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.id.png) + +1. Posisikan sensor GPS sehingga antena yang terpasang memiliki visibilitas ke langit - idealnya di dekat jendela yang terbuka atau di luar ruangan. Sinyal akan lebih jelas jika tidak ada penghalang di sekitar antena. + +## Memprogram Sensor GPS + +Raspberry Pi sekarang dapat diprogram untuk menggunakan sensor GPS yang terpasang. + +### Tugas - Memprogram Sensor GPS + +Program perangkat. + +1. Nyalakan Pi dan tunggu hingga selesai booting. + +1. Sensor GPS memiliki 2 LED - LED biru yang berkedip saat data dikirimkan, dan LED hijau yang berkedip setiap detik saat menerima data dari satelit. Pastikan LED biru berkedip saat Anda menyalakan Pi. Setelah beberapa menit, LED hijau akan mulai berkedip - jika tidak, Anda mungkin perlu memposisikan ulang antena. + +1. Luncurkan VS Code, baik langsung di Pi, atau sambungkan melalui ekstensi Remote SSH. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk mengatur dan meluncurkan VS Code di pelajaran 1 jika diperlukan](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. Dengan versi Raspberry Pi yang lebih baru yang mendukung Bluetooth, terdapat konflik antara port serial yang digunakan untuk Bluetooth dan yang digunakan oleh port Grove UART. Untuk mengatasi ini, lakukan langkah-langkah berikut: + + 1. Dari terminal VS Code, edit file `/boot/config.txt` menggunakan `nano`, editor teks bawaan terminal, dengan perintah berikut: + + ```sh + sudo nano /boot/config.txt + ``` + + > File ini tidak dapat diedit oleh VS Code karena Anda perlu mengeditnya dengan izin `sudo`, yaitu izin yang lebih tinggi. VS Code tidak berjalan dengan izin ini. + + 1. Gunakan tombol panah untuk menavigasi ke akhir file, lalu salin kode di bawah ini dan tempelkan di akhir file: + + ```ini + dtoverlay=pi3-miniuart-bt + dtoverlay=pi3-disable-bt + enable_uart=1 + ``` + + Anda dapat menempelkan menggunakan pintasan keyboard normal untuk perangkat Anda (`Ctrl+v` di Windows, Linux, atau Raspberry Pi OS, `Cmd+v` di macOS). + + 1. Simpan file ini dan keluar dari nano dengan menekan `Ctrl+x`. Tekan `y` saat ditanya apakah Anda ingin menyimpan buffer yang telah dimodifikasi, lalu tekan `enter` untuk mengonfirmasi bahwa Anda ingin menimpa `/boot/config.txt`. + + > Jika Anda membuat kesalahan, Anda dapat keluar tanpa menyimpan, lalu ulangi langkah-langkah ini. + + 1. Edit file `/boot/cmdline.txt` di nano dengan perintah berikut: + + ```sh + sudo nano /boot/cmdline.txt + ``` + + 1. File ini memiliki sejumlah pasangan kunci/nilai yang dipisahkan oleh spasi. Hapus pasangan kunci/nilai untuk kunci `console`. Mereka mungkin terlihat seperti ini: + + ```output + console=serial0,115200 console=tty1 + ``` + + Anda dapat menavigasi ke entri ini menggunakan tombol panah, lalu menghapusnya menggunakan tombol `del` atau `backspace`. + + Sebagai contoh, jika file asli Anda terlihat seperti ini: + + ```output + console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait + ``` + + Versi baru akan menjadi: + + ```output + root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait + ``` + + 1. Ikuti langkah-langkah di atas untuk menyimpan file ini dan keluar dari nano. + + 1. Restart Pi Anda, lalu sambungkan kembali di VS Code setelah Pi selesai reboot. + +1. Dari terminal, buat folder baru di direktori home pengguna `pi` bernama `gps-sensor`. Buat file di folder ini bernama `app.py`. + +1. Buka folder ini di VS Code. + +1. Modul GPS mengirimkan data UART melalui port serial. Instal paket Pip `pyserial` untuk berkomunikasi dengan port serial dari kode Python Anda: + + ```sh + pip3 install pyserial + ``` + +1. Tambahkan kode berikut ke file `app.py` Anda: + + ```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) + ``` + + Kode ini mengimpor modul `serial` dari paket Pip `pyserial`. Kemudian terhubung ke port serial `/dev/ttyAMA0` - ini adalah alamat port serial yang digunakan oleh Grove Pi Base Hat untuk port UART-nya. Kode ini kemudian membersihkan data yang ada dari koneksi serial ini. + + Selanjutnya, sebuah fungsi bernama `print_gps_data` didefinisikan yang mencetak baris yang diteruskan kepadanya ke konsol. + + Kemudian kode ini melakukan loop selamanya, membaca sebanyak mungkin baris teks dari port serial dalam setiap loop. Kode ini memanggil fungsi `print_gps_data` untuk setiap baris. + + Setelah semua data dibaca, loop akan tidur selama 1 detik, lalu mencoba lagi. + +1. Jalankan kode ini. Anda akan melihat output mentah dari sensor GPS, sesuatu seperti berikut: + + ```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 + ``` + + > Jika Anda mendapatkan salah satu dari kesalahan berikut saat menghentikan dan memulai ulang kode Anda, tambahkan blok `try - except` ke dalam loop `while` Anda. + + ```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) + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-gps/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps/pi). + +😀 Program sensor GPS Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md b/translations/id/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md new file mode 100644 index 00000000..fb1147e4 --- /dev/null +++ b/translations/id/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md @@ -0,0 +1,75 @@ + +# Memecahkan Data GPS - Perangkat Keras IoT Virtual dan Raspberry Pi + +Dalam bagian pelajaran ini, Anda akan memecahkan pesan NMEA yang dibaca dari sensor GPS oleh Raspberry Pi atau Perangkat IoT Virtual, dan mengekstrak nilai lintang dan bujur. + +## Memecahkan Data GPS + +Setelah data mentah NMEA dibaca dari port serial, data tersebut dapat dipecahkan menggunakan pustaka NMEA sumber terbuka. + +### Tugas - Memecahkan Data GPS + +Program perangkat untuk memecahkan data GPS. + +1. Buka proyek aplikasi `gps-sensor` jika belum terbuka. + +1. Instal paket Pip `pynmea2`. Paket ini memiliki kode untuk memecahkan pesan NMEA. + + ```sh + pip3 install pynmea2 + ``` + +1. Tambahkan kode berikut ke bagian impor di file `app.py` untuk mengimpor modul `pynmea2`: + + ```python + import pynmea2 + ``` + +1. Ganti isi fungsi `print_gps_data` dengan yang berikut: + + ```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') + ``` + + Kode ini akan menggunakan pustaka `pynmea2` untuk mem-parsing baris yang dibaca dari port serial UART. + + Jika tipe kalimat dari pesan adalah `GGA`, maka ini adalah pesan posisi tetap, dan akan diproses. Nilai lintang dan bujur dibaca dari pesan dan dikonversi ke derajat desimal dari format NMEA `(d)ddmm.mmmm`. Fungsi `dm_to_sd` melakukan konversi ini. + + Arah lintang kemudian diperiksa, dan jika lintang berada di selatan, maka nilainya diubah menjadi angka negatif. Hal yang sama berlaku untuk bujur, jika berada di barat maka diubah menjadi angka negatif. + + Akhirnya, koordinat dicetak ke konsol, bersama dengan jumlah satelit yang digunakan untuk mendapatkan lokasi. + +1. Jalankan kode. Jika Anda menggunakan perangkat IoT virtual, pastikan aplikasi CounterFit sedang berjalan dan data GPS sedang dikirim. + + ```output + pi@raspberrypi:~/gps-sensor $ python3 app.py + 47.6423109,-122.1390293 - from 3 satellites + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-gps-decode/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/virtual-device), atau di folder [code-gps-decode/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/pi). + +😀 Program sensor GPS Anda dengan pemecahan data berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md b/translations/id/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md new file mode 100644 index 00000000..46e76959 --- /dev/null +++ b/translations/id/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md @@ -0,0 +1,144 @@ + +# Membaca Data GPS - Perangkat IoT Virtual + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor GPS ke perangkat IoT virtual Anda, dan membaca nilai-nilainya. + +## Perangkat Virtual + +Perangkat IoT virtual akan menggunakan sensor GPS yang disimulasikan, yang dapat diakses melalui UART melalui port serial. + +Sensor GPS fisik memiliki antena untuk menangkap gelombang radio dari satelit GPS, dan mengubah sinyal GPS menjadi data GPS. Versi virtual mensimulasikan ini dengan memungkinkan Anda untuk mengatur lintang dan bujur, mengirim kalimat NMEA mentah, atau mengunggah file GPX dengan beberapa lokasi yang dapat dikembalikan secara berurutan. + +> 🎓 Kalimat NMEA akan dibahas lebih lanjut dalam pelajaran ini + +### Menambahkan Sensor ke CounterFit + +Untuk menggunakan sensor GPS virtual, Anda perlu menambahkannya ke aplikasi CounterFit. + +#### Tugas - Menambahkan Sensor ke CounterFit + +Tambahkan sensor GPS ke aplikasi CounterFit. + +1. Buat aplikasi Python baru di komputer Anda dalam folder bernama `gps-sensor` dengan satu file bernama `app.py` dan lingkungan virtual Python, lalu tambahkan paket pip CounterFit. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk membuat dan mengatur proyek Python CounterFit di pelajaran 1 jika diperlukan](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Instal paket Pip tambahan untuk menginstal shim CounterFit yang dapat berkomunikasi dengan sensor berbasis UART melalui koneksi serial. Pastikan Anda menginstalnya dari terminal dengan lingkungan virtual yang diaktifkan. + + ```sh + pip install counterfit-shims-serial + ``` + +1. Pastikan aplikasi web CounterFit sedang berjalan. + +1. Buat sensor GPS: + + 1. Di kotak *Create sensor* pada panel *Sensors*, klik dropdown pada kotak *Sensor type* dan pilih *UART GPS*. + + 1. Biarkan *Port* tetap diatur ke */dev/ttyAMA0* + + 1. Pilih tombol **Add** untuk membuat sensor GPS pada port `/dev/ttyAMA0`. + + ![Pengaturan sensor GPS](../../../../../translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.id.png) + + Sensor GPS akan dibuat dan muncul dalam daftar sensor. + + ![Sensor GPS telah dibuat](../../../../../translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.id.png) + +## Memprogram Sensor GPS + +Perangkat IoT virtual sekarang dapat diprogram untuk menggunakan sensor GPS virtual. + +### Tugas - Memprogram Sensor GPS + +Program aplikasi sensor GPS. + +1. Pastikan aplikasi `gps-sensor` terbuka di VS Code. + +1. Buka file `app.py`. + +1. Tambahkan kode berikut di bagian atas `app.py` untuk menghubungkan aplikasi ke CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Tambahkan kode berikut di bawahnya untuk mengimpor beberapa pustaka yang diperlukan, termasuk pustaka untuk port serial CounterFit: + + ```python + import time + import counterfit_shims_serial + + serial = counterfit_shims_serial.Serial('/dev/ttyAMA0') + ``` + + Kode ini mengimpor modul `serial` dari paket Pip `counterfit_shims_serial`. Kemudian menghubungkan ke port serial `/dev/ttyAMA0` - ini adalah alamat port serial yang digunakan sensor GPS virtual untuk port UART-nya. + +1. Tambahkan kode berikut di bawahnya untuk membaca dari port serial dan mencetak nilai ke konsol: + + ```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) + ``` + + Fungsi bernama `print_gps_data` didefinisikan untuk mencetak baris yang diteruskan kepadanya ke konsol. + + Selanjutnya, kode melakukan loop tanpa henti, membaca sebanyak mungkin baris teks dari port serial dalam setiap loop. Fungsi `print_gps_data` dipanggil untuk setiap baris. + + Setelah semua data dibaca, loop akan tidur selama 1 detik, lalu mencoba lagi. + +1. Jalankan kode ini, pastikan Anda menggunakan terminal yang berbeda dari yang digunakan aplikasi CounterFit agar aplikasi CounterFit tetap berjalan. + +1. Dari aplikasi CounterFit, ubah nilai sensor GPS. Anda dapat melakukannya dengan salah satu cara berikut: + + * Atur **Source** ke `Lat/Lon`, dan tetapkan lintang, bujur, dan jumlah satelit yang digunakan untuk mendapatkan posisi GPS. Nilai ini hanya akan dikirim sekali, jadi centang kotak **Repeat** agar data dikirim ulang setiap detik. + + ![Sensor GPS dengan lat lon dipilih](../../../../../translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.id.png) + + * Atur **Source** ke `NMEA` dan tambahkan beberapa kalimat NMEA ke kotak teks. Semua nilai ini akan dikirim, dengan jeda 1 detik sebelum setiap kalimat GGA (posisi) baru dapat dibaca. + + ![Sensor GPS dengan kalimat NMEA diatur](../../../../../translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.id.png) + + Anda dapat menggunakan alat seperti [nmeagen.org](https://www.nmeagen.org) untuk menghasilkan kalimat ini dengan menggambar di peta. Nilai-nilai ini hanya akan dikirim sekali, jadi centang kotak **Repeat** agar data dikirim ulang satu detik setelah semuanya dikirim. + + * Atur **Source** ke file GPX, dan unggah file GPX dengan lokasi lintasan. Anda dapat mengunduh file GPX dari sejumlah situs pemetaan dan hiking populer, seperti [AllTrails](https://www.alltrails.com/). File ini berisi beberapa lokasi GPS sebagai jalur, dan sensor GPS akan mengembalikan setiap lokasi baru dalam interval 1 detik. + + ![Sensor GPS dengan file GPX diatur](../../../../../translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.id.png) + + Nilai-nilai ini hanya akan dikirim sekali, jadi centang kotak **Repeat** agar data dikirim ulang satu detik setelah semuanya dikirim. + + Setelah Anda mengatur pengaturan GPS, pilih tombol **Set** untuk menyimpan nilai-nilai ini ke sensor. + +1. Anda akan melihat output mentah dari sensor GPS, seperti berikut: + + ```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 + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-gps/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps/virtual-device). + +😀 Program sensor GPS Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md b/translations/id/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md new file mode 100644 index 00000000..569580f3 --- /dev/null +++ b/translations/id/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md @@ -0,0 +1,83 @@ + +# Decode GPS data - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan mendekode pesan NMEA yang dibaca dari sensor GPS oleh Wio Terminal, dan mengekstrak lintang dan bujur. + +## Decode GPS data + +Setelah data mentah NMEA dibaca dari port serial, data tersebut dapat didekode menggunakan pustaka NMEA sumber terbuka. + +### Tugas - mendekode data GPS + +Programkan perangkat untuk mendekode data GPS. + +1. Buka proyek aplikasi `gps-sensor` jika belum dibuka. + +1. Tambahkan dependensi pustaka untuk pustaka [TinyGPSPlus](https://github.com/mikalhart/TinyGPSPlus) ke file `platformio.ini` proyek. Pustaka ini memiliki kode untuk mendekode data NMEA. + + ```ini + lib_deps = + mikalhart/TinyGPSPlus @ 1.0.2 + ``` + +1. Di `main.cpp`, tambahkan directive include untuk pustaka TinyGPSPlus: + + ```cpp + #include + ``` + +1. Di bawah deklarasi `Serial3`, deklarasikan objek TinyGPSPlus untuk memproses kalimat NMEA: + + ```cpp + TinyGPSPlus gps; + ``` + +1. Ubah isi fungsi `printGPSData` menjadi seperti berikut: + + ```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"); + } + } + ``` + + Kode ini membaca karakter berikutnya dari port serial UART ke dalam decoder NMEA `gps`. Setelah setiap karakter, kode akan memeriksa apakah decoder telah membaca kalimat yang valid, lalu memeriksa apakah lokasi yang valid telah dibaca. Jika lokasi valid, data tersebut akan dikirim ke monitor serial, bersama dengan jumlah satelit yang berkontribusi pada perbaikan ini. + +1. Bangun dan unggah kode ke Wio Terminal. + +1. Setelah diunggah, Anda dapat memantau data lokasi GPS menggunakan monitor serial. + + ```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 + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-gps-decode/wio-terminal](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/wio-terminal). + +😀 Program sensor GPS Anda dengan decoding data berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md b/translations/id/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md new file mode 100644 index 00000000..5b3815cc --- /dev/null +++ b/translations/id/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md @@ -0,0 +1,154 @@ + +# Membaca Data GPS - Wio Terminal + +Dalam bagian pelajaran ini, Anda akan menambahkan sensor GPS ke Wio Terminal Anda, dan membaca nilai-nilainya. + +## Perangkat Keras + +Wio Terminal membutuhkan sensor GPS. + +Sensor yang akan Anda gunakan adalah [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Sensor ini dapat terhubung ke beberapa sistem GPS untuk mendapatkan posisi yang cepat dan akurat. Sensor ini terdiri dari 2 bagian - komponen inti elektronik sensor, dan antena eksternal yang terhubung dengan kabel tipis untuk menangkap gelombang radio dari satelit. + +Ini adalah sensor UART, sehingga mengirimkan data GPS melalui UART. + +### Hubungkan Sensor GPS + +Sensor GPS Grove dapat dihubungkan ke Wio Terminal. + +#### Tugas - hubungkan sensor GPS + +Hubungkan sensor GPS. + +![Sensor GPS Grove](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.id.png) + +1. Masukkan salah satu ujung kabel Grove ke soket pada sensor GPS. Kabel ini hanya dapat dimasukkan dengan satu arah. + +1. Dengan Wio Terminal tidak terhubung ke komputer atau sumber daya lainnya, hubungkan ujung lain kabel Grove ke soket Grove di sisi kiri Wio Terminal saat Anda melihat layar. Soket ini adalah yang paling dekat dengan tombol daya. + + ![Sensor GPS Grove terhubung ke soket kiri](../../../../../translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.id.png) + +1. Posisikan sensor GPS sehingga antena yang terpasang memiliki visibilitas ke langit - idealnya di dekat jendela yang terbuka atau di luar ruangan. Sinyal akan lebih jelas jika tidak ada penghalang di sekitar antena. + +1. Sekarang Anda dapat menghubungkan Wio Terminal ke komputer Anda. + +1. Sensor GPS memiliki 2 LED - LED biru yang berkedip saat data dikirimkan, dan LED hijau yang berkedip setiap detik saat menerima data dari satelit. Pastikan LED biru berkedip saat Anda menyalakan Wio Terminal. Setelah beberapa menit, LED hijau akan berkedip - jika tidak, Anda mungkin perlu memposisikan ulang antena. + +## Program Sensor GPS + +Wio Terminal sekarang dapat diprogram untuk menggunakan sensor GPS yang terhubung. + +### Tugas - program sensor GPS + +Program perangkat. + +1. Buat proyek baru untuk Wio Terminal menggunakan PlatformIO. Beri nama proyek ini `gps-sensor`. Tambahkan kode dalam fungsi `setup` untuk mengonfigurasi port serial. + +1. Tambahkan directive include berikut di bagian atas file `main.cpp`. Directive ini menyertakan file header dengan fungsi untuk mengonfigurasi port Grove di sisi kiri untuk UART. + + ```cpp + #include + ``` + +1. Di bawah ini, tambahkan baris kode berikut untuk mendeklarasikan koneksi port serial ke port UART: + + ```cpp + static Uart Serial3(&sercom3, PIN_WIRE_SCL, PIN_WIRE_SDA, SERCOM_RX_PAD_1, UART_TX_PAD_0); + ``` + +1. Anda perlu menambahkan beberapa kode untuk mengarahkan beberapa pengendali sinyal internal ke port serial ini. Tambahkan kode berikut di bawah deklarasi `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. Dalam fungsi `setup` di bawah tempat port `Serial` dikonfigurasi, konfigurasikan port serial UART dengan kode berikut: + + ```cpp + Serial3.begin(9600); + + while (!Serial3) + ; // Wait for Serial3 to be ready + + delay(1000); + ``` + +1. Di bawah kode ini dalam fungsi `setup`, tambahkan kode berikut untuk menghubungkan pin Grove ke port serial: + + ```cpp + pinPeripheral(PIN_WIRE_SCL, PIO_SERCOM_ALT); + ``` + +1. Tambahkan fungsi berikut sebelum fungsi `loop` untuk mengirim data GPS ke monitor serial: + + ```cpp + void printGPSData() + { + Serial.println(Serial3.readStringUntil('\n')); + } + ``` + +1. Dalam fungsi `loop`, tambahkan kode berikut untuk membaca dari port serial UART dan mencetak output ke monitor serial: + + ```cpp + while (Serial3.available() > 0) + { + printGPSData(); + } + + delay(1000); + ``` + + Kode ini membaca dari port serial UART. Fungsi `readStringUntil` membaca hingga karakter terminator, dalam hal ini karakter baris baru. Ini akan membaca seluruh kalimat NMEA (kalimat NMEA diakhiri dengan karakter baris baru). Selama data dapat dibaca dari port serial UART, data tersebut akan dibaca dan dikirim ke monitor serial melalui fungsi `printGPSData`. Setelah tidak ada lagi data yang dapat dibaca, fungsi `loop` akan menunda selama 1 detik (1.000ms). + +1. Bangun dan unggah kode ke Wio Terminal. + +1. Setelah diunggah, Anda dapat memantau data GPS menggunakan monitor serial. + + ```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 + ``` + +> 💁 Anda dapat menemukan kode ini di folder [code-gps/wio-terminal](../../../../../3-transport/lessons/1-location-tracking/code-gps/wio-terminal). + +😀 Program sensor GPS Anda berhasil! + +--- + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/id/3-transport/lessons/2-store-location-data/README.md b/translations/id/3-transport/lessons/2-store-location-data/README.md new file mode 100644 index 00000000..d550791c --- /dev/null +++ b/translations/id/3-transport/lessons/2-store-location-data/README.md @@ -0,0 +1,479 @@ + +# Data Lokasi Toko + +![Gambaran sketchnote dari pelajaran ini](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.id.jpg) + +> Sketchnote oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. + +## Kuis Pra-Pelajaran + +[Kuis Pra-Pelajaran](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) + +## Pendahuluan + +Pada pelajaran sebelumnya, Anda telah mempelajari cara menggunakan sensor GPS untuk menangkap data lokasi. Untuk menggunakan data ini dalam memvisualisasikan lokasi truk yang membawa makanan dan perjalanannya, data tersebut perlu dikirim ke layanan IoT di cloud, lalu disimpan di suatu tempat. + +Dalam pelajaran ini, Anda akan mempelajari berbagai cara untuk menyimpan data IoT, serta cara menyimpan data dari layanan IoT Anda menggunakan kode tanpa server. + +Dalam pelajaran ini, kita akan membahas: + +* [Data terstruktur dan tidak terstruktur](../../../../../3-transport/lessons/2-store-location-data) +* [Mengirim data GPS ke IoT Hub](../../../../../3-transport/lessons/2-store-location-data) +* [Jalur panas, hangat, dan dingin](../../../../../3-transport/lessons/2-store-location-data) +* [Menangani peristiwa GPS menggunakan kode tanpa server](../../../../../3-transport/lessons/2-store-location-data) +* [Akun Penyimpanan Azure](../../../../../3-transport/lessons/2-store-location-data) +* [Menghubungkan kode tanpa server ke penyimpanan](../../../../../3-transport/lessons/2-store-location-data) + +## Data Terstruktur dan Tidak Terstruktur + +Sistem komputer menangani data, dan data ini hadir dalam berbagai bentuk dan ukuran. Data dapat berupa angka tunggal, teks dalam jumlah besar, video dan gambar, hingga data IoT. Data biasanya dapat dibagi menjadi dua kategori - *data terstruktur* dan *data tidak terstruktur*. + +* **Data terstruktur** adalah data dengan struktur yang jelas dan kaku yang tidak berubah, biasanya berupa tabel data dengan hubungan tertentu. Contohnya adalah detail seseorang seperti nama, tanggal lahir, dan alamat. + +* **Data tidak terstruktur** adalah data tanpa struktur yang jelas dan kaku, termasuk data yang sering berubah strukturnya. Contohnya adalah dokumen seperti dokumen tertulis atau spreadsheet. + +✅ Lakukan penelitian: Bisakah Anda memikirkan contoh lain dari data terstruktur dan tidak terstruktur? + +> 💁 Ada juga data semi-terstruktur yang memiliki struktur tetapi tidak sesuai dengan tabel data yang tetap. + +Data IoT biasanya dianggap sebagai data tidak terstruktur. + +Bayangkan Anda menambahkan perangkat IoT ke armada kendaraan untuk sebuah pertanian komersial besar. Anda mungkin ingin menggunakan perangkat yang berbeda untuk jenis kendaraan yang berbeda. Misalnya: + +* Untuk kendaraan pertanian seperti traktor, Anda ingin data GPS untuk memastikan mereka bekerja di ladang yang benar. +* Untuk truk pengiriman yang mengangkut makanan ke gudang, Anda ingin data GPS serta data kecepatan dan percepatan untuk memastikan pengemudi mengemudi dengan aman, serta data identitas pengemudi dan waktu mulai/berhenti untuk memastikan kepatuhan terhadap undang-undang kerja setempat. +* Untuk truk berpendingin, Anda juga ingin data suhu untuk memastikan makanan tidak terlalu panas atau dingin sehingga rusak selama perjalanan. + +Data ini dapat berubah secara konstan. Misalnya, jika perangkat IoT berada di kabin truk, maka data yang dikirimkan dapat berubah saat trailer berubah, misalnya hanya mengirimkan data suhu saat trailer berpendingin digunakan. + +✅ Data IoT apa lagi yang mungkin dapat ditangkap? Pikirkan tentang jenis muatan yang dapat dibawa oleh truk, serta data perawatan. + +Data ini bervariasi dari kendaraan ke kendaraan, tetapi semuanya dikirim ke layanan IoT yang sama untuk diproses. Layanan IoT perlu dapat memproses data tidak terstruktur ini, menyimpannya dengan cara yang memungkinkan pencarian atau analisis, tetapi tetap dapat bekerja dengan struktur data yang berbeda. + +### Penyimpanan SQL vs NoSQL + +Database adalah layanan yang memungkinkan Anda menyimpan dan melakukan kueri data. Database terbagi menjadi dua jenis - SQL dan NoSQL. + +#### Database SQL + +Database pertama adalah Sistem Manajemen Database Relasional (RDBMS), atau database relasional. Database ini juga dikenal sebagai database SQL karena menggunakan Structured Query Language (SQL) untuk menambahkan, menghapus, memperbarui, atau melakukan kueri data. Database ini terdiri dari skema - serangkaian tabel data yang terdefinisi dengan baik, mirip dengan spreadsheet. Setiap tabel memiliki beberapa kolom bernama. Ketika Anda memasukkan data, Anda menambahkan baris ke tabel, menempatkan nilai ke dalam setiap kolom. Ini menjaga data dalam struktur yang sangat kaku - meskipun Anda dapat membiarkan kolom kosong, jika Anda ingin menambahkan kolom baru, Anda harus melakukannya di database, mengisi nilai untuk baris yang sudah ada. Database ini bersifat relasional - di mana satu tabel dapat memiliki hubungan dengan tabel lain. + +![Database relasional dengan ID tabel Pengguna yang berhubungan dengan kolom ID pengguna di tabel pembelian, dan ID tabel produk yang berhubungan dengan ID produk di tabel pembelian](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.id.png) + +Sebagai contoh, jika Anda menyimpan detail pribadi pengguna dalam tabel, Anda akan memiliki semacam ID unik internal per pengguna yang digunakan dalam baris di tabel yang berisi nama dan alamat pengguna. Jika Anda kemudian ingin menyimpan detail lain tentang pengguna tersebut, seperti pembelian mereka, dalam tabel lain, Anda akan memiliki satu kolom di tabel baru untuk ID pengguna tersebut. Ketika Anda mencari pengguna, Anda dapat menggunakan ID mereka untuk mendapatkan detail pribadi dari satu tabel, dan pembelian mereka dari tabel lain. + +Database SQL sangat ideal untuk menyimpan data terstruktur, dan untuk memastikan data sesuai dengan skema Anda. + +✅ Jika Anda belum pernah menggunakan SQL sebelumnya, luangkan waktu untuk membaca tentangnya di [halaman SQL di Wikipedia](https://wikipedia.org/wiki/SQL). + +Beberapa database SQL yang terkenal adalah Microsoft SQL Server, MySQL, dan PostgreSQL. + +✅ Lakukan penelitian: Bacalah tentang beberapa database SQL ini dan kemampuannya. + +#### Database NoSQL + +Database NoSQL disebut NoSQL karena tidak memiliki struktur kaku seperti database SQL. Database ini juga dikenal sebagai database dokumen karena dapat menyimpan data tidak terstruktur seperti dokumen. + +> 💁 Meskipun namanya NoSQL, beberapa database NoSQL memungkinkan Anda menggunakan SQL untuk melakukan kueri data. + +![Dokumen dalam folder di database NoSQL](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.id.png) + +Database NoSQL tidak memiliki skema yang telah ditentukan sebelumnya yang membatasi cara data disimpan, melainkan Anda dapat memasukkan data tidak terstruktur apa pun, biasanya menggunakan dokumen JSON. Dokumen-dokumen ini dapat diatur ke dalam folder, mirip dengan file di komputer Anda. Setiap dokumen dapat memiliki bidang yang berbeda dari dokumen lainnya - misalnya jika Anda menyimpan data IoT dari kendaraan pertanian Anda, beberapa mungkin memiliki bidang untuk data akselerometer dan kecepatan, sementara yang lain mungkin memiliki bidang untuk suhu di trailer. Jika Anda menambahkan jenis truk baru, seperti yang memiliki timbangan bawaan untuk melacak berat hasil panen yang dibawa, maka perangkat IoT Anda dapat menambahkan bidang baru ini dan dapat disimpan tanpa perubahan pada database. + +Beberapa database NoSQL yang terkenal termasuk Azure CosmosDB, MongoDB, dan CouchDB. + +✅ Lakukan penelitian: Bacalah tentang beberapa database NoSQL ini dan kemampuannya. + +Dalam pelajaran ini, Anda akan menggunakan penyimpanan NoSQL untuk menyimpan data IoT. + +## Mengirim Data GPS ke IoT Hub + +Pada pelajaran sebelumnya, Anda telah menangkap data GPS dari sensor GPS yang terhubung ke perangkat IoT Anda. Untuk menyimpan data IoT ini di cloud, Anda perlu mengirimkannya ke layanan IoT. Sekali lagi, Anda akan menggunakan Azure IoT Hub, layanan IoT cloud yang sama yang Anda gunakan dalam proyek sebelumnya. + +![Mengirim telemetri GPS dari perangkat IoT ke IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.id.png) + +### Tugas - Mengirim Data GPS ke IoT Hub + +1. Buat IoT Hub baru menggunakan tier gratis. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk membuat IoT Hub dari proyek 2, pelajaran 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) jika diperlukan. + + Ingatlah untuk membuat Resource Group baru. Beri nama Resource Group baru `gps-sensor`, dan IoT Hub baru dengan nama unik berdasarkan `gps-sensor`, seperti `gps-sensor-`. + + > 💁 Jika Anda masih memiliki IoT Hub dari proyek sebelumnya, Anda dapat menggunakannya kembali. Ingatlah untuk menggunakan nama IoT Hub ini dan Resource Group tempat ia berada saat membuat layanan lain. + +1. Tambahkan perangkat baru ke IoT Hub. Beri nama perangkat ini `gps-sensor`. Ambil string koneksi untuk perangkat tersebut. + +1. Perbarui kode perangkat Anda untuk mengirim data GPS ke IoT Hub baru menggunakan string koneksi perangkat dari langkah sebelumnya. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk menghubungkan perangkat Anda ke IoT dari proyek 2, pelajaran 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service) jika diperlukan. + +1. Saat Anda mengirim data GPS, lakukan dalam format JSON berikut: + + ```json + { + "gps" : + { + "lat" : , + "lon" : + } + } + ``` + +1. Kirim data GPS setiap menit agar tidak melebihi alokasi pesan harian Anda. + +Jika Anda menggunakan Wio Terminal, ingatlah untuk menambahkan semua pustaka yang diperlukan, dan mengatur waktu menggunakan server NTP. Kode Anda juga perlu memastikan bahwa semua data telah dibaca dari port serial sebelum mengirim lokasi GPS, menggunakan kode yang ada dari pelajaran sebelumnya. Gunakan kode berikut untuk membuat dokumen JSON: + +```cpp +DynamicJsonDocument doc(1024); +doc["gps"]["lat"] = gps.location.lat(); +doc["gps"]["lon"] = gps.location.lng(); +``` + +Jika Anda menggunakan perangkat IoT Virtual, ingatlah untuk menginstal semua pustaka yang diperlukan menggunakan lingkungan virtual. + +Untuk Raspberry Pi dan perangkat IoT Virtual, gunakan kode yang ada dari pelajaran sebelumnya untuk mendapatkan nilai lintang dan bujur, lalu kirimkan dalam format JSON yang benar dengan kode berikut: + +```python +message_json = { "gps" : { "lat":lat, "lon":lon } } +print("Sending telemetry", message_json) +message = Message(json.dumps(message_json)) +``` + +> 💁 Anda dapat menemukan kode ini di folder [code/wio-terminal](../../../../../3-transport/lessons/2-store-location-data/code/wio-terminal), [code/pi](../../../../../3-transport/lessons/2-store-location-data/code/pi), atau [code/virtual-device](../../../../../3-transport/lessons/2-store-location-data/code/virtual-device). + +Jalankan kode perangkat Anda dan pastikan pesan mengalir ke IoT Hub menggunakan perintah CLI `az iot hub monitor-events`. + +## Jalur Panas, Hangat, dan Dingin + +Data yang mengalir dari perangkat IoT ke cloud tidak selalu diproses secara real-time. Beberapa data perlu diproses secara real-time, data lainnya dapat diproses beberapa saat kemudian, dan data lainnya dapat diproses jauh lebih lama kemudian. Aliran data ke berbagai layanan yang memproses data pada waktu yang berbeda ini disebut jalur panas, hangat, dan dingin. + +### Jalur Panas + +Jalur panas mengacu pada data yang perlu diproses secara real-time atau hampir real-time. Anda akan menggunakan data jalur panas untuk peringatan, seperti mendapatkan peringatan bahwa kendaraan mendekati depot, atau bahwa suhu di truk berpendingin terlalu tinggi. + +Untuk menggunakan data jalur panas, kode Anda akan merespons peristiwa segera setelah diterima oleh layanan cloud Anda. + +### Jalur Hangat + +Jalur hangat mengacu pada data yang dapat diproses beberapa saat setelah diterima, misalnya untuk pelaporan atau analitik jangka pendek. Anda akan menggunakan data jalur hangat untuk laporan harian tentang jarak tempuh kendaraan, menggunakan data yang dikumpulkan pada hari sebelumnya. + +Data jalur hangat disimpan setelah diterima oleh layanan cloud di dalam beberapa jenis penyimpanan yang dapat diakses dengan cepat. + +### Jalur Dingin + +Jalur dingin mengacu pada data historis, menyimpan data untuk jangka panjang agar dapat diproses kapan pun diperlukan. Misalnya, Anda dapat menggunakan jalur dingin untuk mendapatkan laporan jarak tempuh tahunan kendaraan, atau menjalankan analitik pada rute untuk menemukan rute yang paling optimal untuk mengurangi biaya bahan bakar. + +Data jalur dingin disimpan di gudang data - database yang dirancang untuk menyimpan sejumlah besar data yang tidak akan pernah berubah dan dapat dikueri dengan cepat dan mudah. Biasanya, Anda akan memiliki pekerjaan reguler dalam aplikasi cloud Anda yang akan berjalan pada waktu tertentu setiap hari, minggu, atau bulan untuk memindahkan data dari penyimpanan jalur hangat ke gudang data. + +✅ Pikirkan tentang data yang telah Anda tangkap sejauh ini dalam pelajaran ini. Apakah itu data jalur panas, hangat, atau dingin? + +## Menangani Peristiwa GPS Menggunakan Kode Tanpa Server + +Setelah data mengalir ke IoT Hub Anda, Anda dapat menulis beberapa kode tanpa server untuk mendengarkan peristiwa yang diterbitkan ke endpoint yang kompatibel dengan Event Hub. Ini adalah jalur hangat - data ini akan disimpan dan digunakan dalam pelajaran berikutnya untuk pelaporan perjalanan. + +![Mengirim telemetri GPS dari perangkat IoT ke IoT Hub, lalu ke Azure Functions melalui pemicu event hub](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.id.png) + +### Tugas - Menangani Peristiwa GPS Menggunakan Kode Tanpa Server + +1. Buat aplikasi Azure Functions menggunakan Azure Functions CLI. Gunakan runtime Python, dan buat di folder bernama `gps-trigger`, serta gunakan nama yang sama untuk nama proyek Functions App. Pastikan Anda membuat lingkungan virtual untuk ini. +> ⚠️ Anda dapat merujuk ke [instruksi untuk membuat Proyek Azure Functions dari proyek 2, pelajaran 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application) jika diperlukan. +1. Tambahkan pemicu acara IoT Hub yang menggunakan endpoint kompatibel Event Hub dari IoT Hub. + + > ⚠️ Anda dapat merujuk ke [instruksi untuk membuat pemicu acara IoT Hub dari proyek 2, pelajaran 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) jika diperlukan. + +1. Atur string koneksi endpoint kompatibel Event Hub di file `local.settings.json`, dan gunakan kunci untuk entri tersebut di file `function.json`. + +1. Gunakan aplikasi Azurite sebagai emulator penyimpanan lokal. + +1. Jalankan aplikasi fungsi Anda untuk memastikan bahwa aplikasi tersebut menerima acara dari perangkat GPS Anda. Pastikan perangkat IoT Anda juga berjalan dan mengirimkan data GPS. + + ```output + Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} + ``` + +## Akun Penyimpanan Azure + +![Logo Azure Storage](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.id.png) + +Akun Penyimpanan Azure adalah layanan penyimpanan serbaguna yang dapat menyimpan data dalam berbagai cara. Anda dapat menyimpan data sebagai blob, dalam antrean, dalam tabel, atau sebagai file, dan semuanya dapat dilakukan secara bersamaan. + +### Penyimpanan Blob + +Kata *Blob* berarti objek biner besar, tetapi telah menjadi istilah untuk data tidak terstruktur. Anda dapat menyimpan data apa pun di penyimpanan blob, mulai dari dokumen JSON yang berisi data IoT, hingga file gambar dan film. Penyimpanan blob memiliki konsep *container*, yaitu wadah bernama tempat Anda dapat menyimpan data, mirip dengan tabel dalam basis data relasional. Container ini dapat memiliki satu atau lebih folder untuk menyimpan blob, dan setiap folder dapat berisi folder lain, mirip dengan cara file disimpan di hard disk komputer Anda. + +Anda akan menggunakan penyimpanan blob dalam pelajaran ini untuk menyimpan data IoT. + +✅ Lakukan penelitian: Baca tentang [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) + +### Penyimpanan Tabel + +Penyimpanan tabel memungkinkan Anda menyimpan data semi-terstruktur. Penyimpanan tabel sebenarnya adalah basis data NoSQL, sehingga tidak memerlukan set tabel yang telah ditentukan sebelumnya, tetapi dirancang untuk menyimpan data dalam satu atau lebih tabel, dengan kunci unik untuk mendefinisikan setiap baris. + +✅ Lakukan penelitian: Baca tentang [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) + +### Penyimpanan Antrean + +Penyimpanan antrean memungkinkan Anda menyimpan pesan hingga ukuran 64KB dalam antrean. Anda dapat menambahkan pesan ke bagian belakang antrean, dan membacanya dari bagian depan. Antrean menyimpan pesan tanpa batas waktu selama masih ada ruang penyimpanan, sehingga memungkinkan pesan disimpan dalam jangka panjang, lalu dibaca saat diperlukan. Misalnya, jika Anda ingin menjalankan pekerjaan bulanan untuk memproses data GPS, Anda dapat menambahkannya ke antrean setiap hari selama sebulan, lalu di akhir bulan memproses semua pesan dari antrean. + +✅ Lakukan penelitian: Baca tentang [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) + +### Penyimpanan File + +Penyimpanan file adalah penyimpanan file di cloud, dan aplikasi atau perangkat apa pun dapat terhubung menggunakan protokol standar industri. Anda dapat menulis file ke penyimpanan file, lalu memasangnya sebagai drive di PC atau Mac Anda. + +✅ Lakukan penelitian: Baca tentang [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) + +## Hubungkan kode serverless Anda ke penyimpanan + +Aplikasi fungsi Anda sekarang perlu terhubung ke penyimpanan blob untuk menyimpan pesan dari IoT Hub. Ada 2 cara untuk melakukannya: + +* Di dalam kode fungsi, terhubung ke penyimpanan blob menggunakan SDK Python penyimpanan blob dan tulis data sebagai blob. +* Gunakan pengikatan fungsi output untuk mengikat nilai pengembalian fungsi ke penyimpanan blob dan secara otomatis menyimpan blob. + +Dalam pelajaran ini, Anda akan menggunakan SDK Python untuk melihat cara berinteraksi dengan penyimpanan blob. + +![Mengirim telemetri GPS dari perangkat IoT ke IoT Hub, lalu ke Azure Functions melalui pemicu event hub, kemudian menyimpannya ke penyimpanan blob](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.id.png) + +Data akan disimpan sebagai blob JSON dengan format berikut: + +```json +{ + "device_id": , + "timestamp" : C ay may mga limitasyon sa bilis, na may 3 iba't ibang mode na tumatakbo sa mga nakatakdang bilis. Ang pinakamabilis ay ang High Speed mode na may maximum na bilis na 3.4Mbps (megabits per second), bagaman kakaunti lamang ang mga device na sumusuporta sa bilis na ito. Halimbawa, ang Raspberry Pi ay limitado sa fast mode na 400Kbps (kilobits per second). Ang Standard mode ay tumatakbo sa 100Kbps. + +> 💁 Kung gumagamit ka ng Raspberry Pi na may Grove Base hat bilang iyong IoT hardware, makikita mo ang ilang mga I2C socket sa board na maaari mong gamitin upang makipag-ugnayan sa mga I2C sensor. Ang mga analog Grove sensor ay gumagamit din ng I2C na may ADC upang magpadala ng analog na halaga bilang digital na data, kaya ang light sensor na ginamit mo ay nagsilbing analog pin, na ang halaga ay ipinadala sa I2C dahil ang Raspberry Pi ay sumusuporta lamang sa mga digital pin. + +### Universal asynchronous receiver-transmitter (UART) + +Ang UART ay gumagamit ng pisikal na circuitry na nagpapahintulot sa dalawang device na makipag-ugnayan. Ang bawat device ay may 2 communication pins - transmit (Tx) at receive (Rx), kung saan ang Tx pin ng unang device ay konektado sa Rx pin ng pangalawa, at ang Tx pin ng pangalawa ay konektado sa Rx pin ng una. Pinapayagan nito ang pagpapadala ng data sa parehong direksyon. + +* Ang Device 1 ay nagpapadala ng data mula sa kanyang Tx pin, na tinatanggap ng Device 2 sa kanyang Rx pin +* Ang Device 1 ay tumatanggap ng data sa kanyang Rx pin na ipinapadala ng Device 2 mula sa kanyang Tx pin + +![UART na may Tx pin sa isang chip na konektado sa Rx pin ng isa pa, at kabaliktaran](../../../../../translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.tl.png) + +> 🎓 Ang data ay ipinapadala nang paisa-isang bit, at ito ay kilala bilang *serial* na komunikasyon. Karamihan sa mga operating system at microcontroller ay may *serial ports*, na mga koneksyon na maaaring magpadala at tumanggap ng serial data na magagamit ng iyong code. + +Ang mga UART device ay may [baud rate](https://wikipedia.org/wiki/Symbol_rate) (kilala rin bilang Symbol rate), na siyang bilis ng pagpapadala at pagtanggap ng data sa bits per second. Ang karaniwang baud rate ay 9,600, na nangangahulugang 9,600 bits (0s at 1s) ng data ang ipinapadala bawat segundo. + +Ang UART ay gumagamit ng start at stop bits - nagpapadala ito ng start bit upang ipahiwatig na magsisimula na itong magpadala ng isang byte (8 bits) ng data, pagkatapos ay isang stop bit matapos maipadala ang 8 bits. + +Ang bilis ng UART ay nakadepende sa hardware, ngunit kahit na ang pinakamabilis na implementasyon ay hindi lalampas sa 6.5 Mbps (megabits per second, o milyon-milyong bits, 0 o 1, na ipinapadala bawat segundo). + +Maaari mong gamitin ang UART sa GPIO pins - maaari mong itakda ang isang pin bilang Tx at ang isa pa bilang Rx, pagkatapos ay ikonekta ang mga ito sa isa pang device. + +> 💁 Kung gumagamit ka ng Raspberry Pi na may Grove Base hat bilang iyong IoT hardware, makikita mo ang isang UART socket sa board na maaari mong gamitin upang makipag-ugnayan sa mga sensor na gumagamit ng UART protocol. + +### Serial Peripheral Interface (SPI) + +Ang SPI ay idinisenyo para sa komunikasyon sa maikling distansya, tulad ng sa isang microcontroller na nakikipag-usap sa isang storage device tulad ng flash memory. Ito ay batay sa isang controller/peripheral na modelo na may isang controller (karaniwang ang processor ng IoT device) na nakikipag-ugnayan sa maraming peripherals. Ang controller ang may kontrol sa lahat sa pamamagitan ng pagpili ng isang peripheral at pagpapadala o paghingi ng data. + +> 💁 Tulad ng I2C, ang mga terminong controller at peripheral ay mga kamakailang pagbabago, kaya maaari mo pa ring makita ang mga lumang termino na ginagamit. + +Ang mga SPI controller ay gumagamit ng 3 wires, kasama ang 1 dagdag na wire bawat peripheral. Ang mga peripheral ay gumagamit ng 4 wires. Ang mga wire na ito ay: + +| Wire | Pangalan | Paglalarawan | +| ---- | --------- | ----------- | +| COPI | Controller Output, Peripheral Input | Ang wire na ito ay para sa pagpapadala ng data mula sa controller papunta sa peripheral. | +| CIPO | Controller Input, Peripheral Output | Ang wire na ito ay para sa pagpapadala ng data mula sa peripheral papunta sa controller. | +| SCLK | Serial Clock | Ang wire na ito ay nagpapadala ng clock signal sa bilis na itinakda ng controller. | +| CS | Chip Select | Ang controller ay may maraming wires, isa bawat peripheral, at bawat wire ay konektado sa CS wire ng kaukulang peripheral. | + +![SPI na may isang controller at dalawang peripherals](../../../../../translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.tl.png) + +Ang CS wire ay ginagamit upang i-activate ang isang peripheral sa bawat pagkakataon, na nakikipag-ugnayan sa mga COPI at CIPO wires. Kapag kailangang baguhin ng controller ang peripheral, i-deactivate nito ang CS wire na konektado sa kasalukuyang aktibong peripheral, pagkatapos ay i-activate ang wire na konektado sa peripheral na nais nitong makipag-ugnayan. + +Ang SPI ay *full-duplex*, na nangangahulugang ang controller ay maaaring magpadala at tumanggap ng data nang sabay mula sa parehong peripheral gamit ang COPI at CIPO wires. Ang SPI ay gumagamit ng clock signal sa SCLK wire upang panatilihing naka-sync ang mga device, kaya hindi nito kailangan ng start at stop bits tulad ng sa UART. + +Walang itinakdang limitasyon sa bilis para sa SPI, na may mga implementasyon na madalas kayang magpadala ng maraming megabytes ng data bawat segundo. + +Ang mga IoT developer kit ay madalas na sumusuporta sa SPI sa ilan sa mga GPIO pins. Halimbawa, sa isang Raspberry Pi maaari mong gamitin ang GPIO pins 19, 21, 23, 24, at 26 para sa SPI. + +### Wireless + +Ang ilang mga sensor ay maaaring makipag-ugnayan gamit ang mga karaniwang wireless protocol, tulad ng Bluetooth (karaniwang Bluetooth Low Energy, o BLE), LoRaWAN (isang **Lo**ng **Ra**nge low power networking protocol), o WiFi. Pinapayagan nito ang mga remote sensor na hindi pisikal na konektado sa isang IoT device. + +Isa sa mga halimbawa nito ay ang mga commercial soil moisture sensor. Ang mga ito ay sumusukat ng moisture sa lupa sa isang field, pagkatapos ay ipinapadala ang data sa pamamagitan ng LoRaWAN sa isang hub device, na magpoproseso ng data o magpapadala nito sa Internet. Pinapayagan nito ang sensor na malayo sa IoT device na nagma-manage ng data, binabawasan ang konsumo ng kuryente at ang pangangailangan para sa malalaking WiFi network o mahabang kable. + +Ang BLE ay popular para sa mga advanced sensor tulad ng mga fitness tracker na ginagamit sa pulso. Ang mga ito ay pinagsasama ang maraming sensor at ipinapadala ang data ng sensor sa isang IoT device tulad ng iyong telepono sa pamamagitan ng BLE. + +✅ Mayroon ka bang anumang bluetooth sensor sa iyong sarili, sa iyong bahay, o sa iyong paaralan? Maaaring kabilang dito ang mga temperature sensor, occupancy sensor, device tracker, at fitness device. + +Ang isang popular na paraan para sa mga commercial device na kumonekta ay ang Zigbee. Ang Zigbee ay gumagamit ng WiFi upang bumuo ng mesh networks sa pagitan ng mga device, kung saan ang bawat device ay kumokonekta sa maraming kalapit na device hangga't maaari, na bumubuo ng maraming koneksyon tulad ng sapot ng gagamba. Kapag ang isang device ay nais magpadala ng mensahe sa Internet, maaari nitong ipadala ito sa pinakamalapit na mga device, na pagkatapos ay ipapasa ito sa iba pang kalapit na mga device at iba pa, hanggang sa maabot nito ang isang coordinator at maipadala sa Internet. + +> 🐝 Ang pangalan na Zigbee ay tumutukoy sa sayaw ng mga pukyutan pagkatapos nilang bumalik sa kanilang pugad. + +## Sukatin ang antas ng moisture sa lupa + +Maaari mong sukatin ang antas ng moisture sa lupa gamit ang isang soil moisture sensor, isang IoT device, at isang house plant o kalapit na bahagi ng lupa. + +### Gawain - sukatin ang soil moisture + +Sundin ang kaukulang gabay upang sukatin ang soil moisture gamit ang iyong IoT device: + +* [Arduino - Wio Terminal](wio-terminal-soil-moisture.md) +* [Single-board computer - Raspberry Pi](pi-soil-moisture.md) +* [Single-board computer - Virtual device](virtual-device-soil-moisture.md) + +## Kalibrasyon ng Sensor + +Ang mga sensor ay umaasa sa pagsukat ng mga electrical properties tulad ng resistance o capacitance. + +> 🎓 Ang Resistance, na sinusukat sa ohms (Ω), ay kung gaano kalaki ang pagtutol sa electric current na dumadaloy sa isang bagay. Kapag ang boltahe ay inilapat sa isang materyal, ang dami ng kuryenteng dumadaan dito ay nakadepende sa resistance ng materyal. Maaari kang magbasa pa sa [electrical resistance page sa Wikipedia](https://wikipedia.org/wiki/Electrical_resistance_and_conductance). + +> 🎓 Ang Capacitance, na sinusukat sa farads (F), ay ang kakayahan ng isang component o circuit na mangolekta at mag-imbak ng electrical energy. Maaari kang magbasa pa tungkol sa capacitance sa [capacitance page sa Wikipedia](https://wikipedia.org/wiki/Capacitance). + +Ang mga sukat na ito ay hindi palaging kapaki-pakinabang - isipin ang isang temperature sensor na nagbibigay sa iyo ng sukat na 22.5KΩ! Sa halip, ang halaga na sinusukat ay kailangang ma-convert sa isang kapaki-pakinabang na unit sa pamamagitan ng kalibrasyon - ibig sabihin, pagtutugma ng mga halagang sinusukat sa dami na sinusukat upang payagan ang mga bagong sukat na ma-convert sa tamang unit. + +Ang ilang mga sensor ay dumating na pre-calibrated. Halimbawa, ang temperature sensor na ginamit mo sa nakaraang aralin ay naka-calibrate na upang maibalik nito ang sukat ng temperatura sa °C. Sa pabrika, ang unang sensor na ginawa ay ilalantad sa hanay ng mga kilalang temperatura at ang resistance ay susukatin. Ito ay gagamitin upang bumuo ng isang kalkulasyon na maaaring mag-convert mula sa halagang sinusukat sa Ω (ang unit ng resistance) patungo sa °C. + +> 💁 Ang formula upang kalkulahin ang resistance mula sa temperatura ay tinatawag na [Steinhart–Hart equation](https://wikipedia.org/wiki/Steinhart–Hart_equation). + +### Kalibrasyon ng Soil Moisture Sensor + +Ang soil moisture ay sinusukat gamit ang gravimetric o volumetric water content. + +* Ang Gravimetric ay ang timbang ng tubig sa isang unit na timbang ng lupa na sinusukat, bilang bilang ng kilo ng tubig bawat kilo ng tuyong lupa +* Ang Volumetric ay ang dami ng tubig sa isang unit na dami ng lupa na sinusukat, bilang bilang ng metro kubiko ng tubig bawat metro kubiko ng tuyong lupa + +> 🇺🇸 Para sa mga Amerikano, dahil sa pagkakapareho ng mga unit, ang mga ito ay maaaring sukatin sa pounds sa halip na kilo o cubic feet sa halip na cubic meters. + +Ang mga soil moisture sensor ay sumusukat ng electrical resistance o capacitance - hindi lamang ito nagbabago ayon sa soil moisture, kundi pati na rin sa uri ng lupa dahil ang mga sangkap sa lupa ay maaaring magbago ng mga electrical characteristics nito. Sa ideal na sitwasyon, ang mga sensor ay dapat i-calibrate - ibig sabihin, kumuha ng mga sukat mula sa sensor at ihambing ang mga ito sa mga sukat na nakuha gamit ang mas siyentipikong pamamaraan. Halimbawa, ang isang laboratoryo ay maaaring kalkulahin ang gravimetric soil moisture gamit ang mga sample ng isang partikular na field na kinuha ng ilang beses sa isang taon, at ang mga numerong ito ay maaaring gamitin upang i-calibrate ang sensor, pagtutugma ng sensor reading sa gravimetric soil moisture. + +![Isang graph ng boltahe laban sa nilalaman ng soil moisture](../../../../../translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.tl.png) + +Ang graph sa itaas ay nagpapakita kung paano i-calibrate ang isang sensor. Ang boltahe ay kinukuha para sa isang soil sample na pagkatapos ay sinusukat sa isang laboratoryo sa pamamagitan ng paghahambing ng timbang na basa sa timbang na tuyo (sa pamamagitan ng pagsukat ng timbang na basa, pagkatapos ay pagpapatuyo sa oven at pagsukat ng tuyong timbang). Kapag ang ilang mga sukat ay nakuha, ito ay maaaring i-plot sa isang graph at isang linya ang maaaring itugma sa mga puntos. Ang linyang ito ay maaaring gamitin upang i-convert ang mga soil moisture sensor readings na kinuha ng isang IoT device sa aktwal na mga sukat ng soil moisture. + +💁 Para sa mga resistive soil moisture sensor, ang boltahe ay tumataas habang tumataas ang soil moisture. Para sa mga capacitive soil moisture sensor, ang boltahe ay bumababa habang tumataas ang soil moisture, kaya ang mga graph para dito ay magiging pababa, hindi pataas. + +![Isang soil moisture value na interpolated mula sa graph](../../../../../translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.tl.png) + +Ang graph sa itaas ay nagpapakita ng isang boltahe reading mula sa isang soil moisture sensor, at sa pamamagitan ng pagsunod nito sa linya sa graph, ang aktwal na soil moisture ay maaaring kalkulahin. + +Ang pamamaraang ito ay nangangahulugan na ang magsasaka ay kailangan lamang kumuha ng ilang laboratory measurements para sa isang field, pagkatapos ay maaari nilang gamitin ang mga IoT device upang sukatin ang soil moisture - lubos na pinapabilis ang oras ng pagkuha ng mga sukat. + +--- + +## 🚀 Hamon + +Ang mga resistive at capacitive soil moisture sensor ay may ilang pagkakaiba. Ano ang mga pagkakaibang ito, at alin sa mga ito (kung mayroon man) ang pinakamainam para sa isang magsasaka na gamitin? Nagbabago ba ang sagot na ito sa pagitan ng mga umuunlad at maunlad na bansa? + +## Post-lecture quiz + +[Post-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/12) + +## Review at Pag-aaral sa Sarili + +Magbasa tungkol sa hardware at mga protocol na ginagamit ng mga sensor at actuator: + +* [GPIO Wikipedia page](https://wikipedia.org/wiki/General-purpose_input/output) +* [UART Wikipedia page](https://wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter) +* [SPI Wikipedia page](https://wikipedia.org/wiki/Serial_Peripheral_Interface) +* [I2C Wikipedia page](https://wikipedia.org/wiki/I²C) +* [Zigbee Wikipedia page](https://wikipedia.org/wiki/Zigbee) + +## Takdang Aralin + +[Calibrate your sensor](assignment.md) + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang orihinal na wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/2-detect-soil-moisture/assignment.md b/translations/tl/2-farm/lessons/2-detect-soil-moisture/assignment.md new file mode 100644 index 00000000..99e05fe8 --- /dev/null +++ b/translations/tl/2-farm/lessons/2-detect-soil-moisture/assignment.md @@ -0,0 +1,61 @@ + +# I-calibrate ang iyong sensor + +## Mga Instruksyon + +Sa araling ito, nakakuha ka ng mga pagbasa mula sa soil moisture sensor, na sinusukat bilang mga halaga mula 0-1023. Upang ma-convert ang mga ito sa aktwal na mga pagbasa ng soil moisture, kailangan mong i-calibrate ang iyong sensor. Magagawa mo ito sa pamamagitan ng pagkuha ng mga pagbasa mula sa mga sample ng lupa, pagkatapos ay kalkulahin ang gravimetric soil moisture content mula sa mga sample na ito. + +Kailangan mong ulitin ang mga hakbang na ito nang maraming beses upang makuha ang mga kinakailangang pagbasa, gamit ang iba't ibang antas ng basa ng lupa sa bawat pagkakataon. + +1. Kumuha ng pagbasa ng soil moisture gamit ang soil moisture sensor. Isulat ang pagbasa na ito. + +1. Kumuha ng sample ng lupa, at timbangin ito. Isulat ang timbang na ito. + +1. Patuyuin ang lupa - ang mainit na oven sa 110°C (230°F) sa loob ng ilang oras ang pinakamainam na paraan, maaari mo itong gawin sa sikat ng araw, o ilagay ito sa isang mainit, tuyong lugar hanggang sa ang lupa ay ganap na matuyo. Dapat itong maging pulbos at maluwag. + + > 💁 Sa isang laboratoryo, para sa pinaka-eksaktong resulta, patuyuin ito sa oven sa loob ng 48-72 oras. Kung may drying ovens sa inyong paaralan, tingnan kung maaari mong gamitin ang mga ito para sa mas mahabang oras ng pagpapatuyo. Mas matagal, mas tuyo ang sample at mas eksakto ang resulta. + +1. Timbangin muli ang lupa. + + > 🔥 Kung pinatuyo mo ito sa oven, siguraduhing lumamig muna ito! + +Ang gravimetric soil moisture ay kinakalkula bilang: + +![soil moisture % ay timbang ng basa minus timbang ng tuyo, hinati sa timbang ng tuyo, times 100](../../../../../translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.tl.png) + +* W - ang timbang ng basang lupa +* W - ang timbang ng tuyong lupa + +Halimbawa, sabihin nating mayroon kang sample ng lupa na may timbang na 212g basa, at 197g tuyo. + +![Ang kalkulasyon na may sagot](../../../../../translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.tl.png) + +* W = 212g +* W = 197g +* 212 - 197 = 15 +* 15 / 197 = 0.076 +* 0.076 * 100 = 7.6% + +Sa halimbawang ito, ang lupa ay may gravimetric soil moisture na 7.6%. + +Kapag mayroon ka nang mga pagbasa para sa hindi bababa sa 3 sample, gumawa ng graph ng soil moisture % kumpara sa pagbasa ng soil moisture sensor at magdagdag ng linya na pinakamahusay na magkasya sa mga puntos. Magagamit mo ito upang kalkulahin ang gravimetric soil moisture content para sa isang partikular na pagbasa ng sensor sa pamamagitan ng pagkuha ng halaga mula sa linya. + +## Rubric + +| Pamantayan | Napakahusay | Katamtaman | Kailangan ng Pagpapabuti | +| -------- | --------- | -------- | ----------------- | +| Mangolekta ng calibration data | Nakakuha ng hindi bababa sa 3 calibration sample | Nakakuha ng hindi bababa sa 2 calibration sample | Nakakuha ng hindi bababa sa 1 calibration sample | +| Gumawa ng calibrated na pagbasa | Matagumpay na nakagawa ng calibration graph at nakakuha ng pagbasa mula sa sensor, at na-convert ito sa gravimetric soil moisture content | Matagumpay na nakagawa ng calibration graph | Hindi nakagawa ng graph | + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md b/translations/tl/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md new file mode 100644 index 00000000..4f26d46c --- /dev/null +++ b/translations/tl/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md @@ -0,0 +1,25 @@ + +# Sukatin ang Halumigmig ng Lupa - Raspberry Pi + +Sa bahaging ito ng aralin, magdadagdag ka ng capacitive soil moisture sensor sa iyong Raspberry Pi, at babasahin ang mga halaga mula rito. + +## Kagamitan + +Kailangan ng Raspberry Pi ng isang capacitive soil moisture sensor. + +Ang sensor na gagamitin mo ay isang [Capacitive Soil Moisture Sensor](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), na sumusukat sa halumigmig ng lupa sa pamamagitan ng pag-detect ng capacitance ng lupa, isang katangian na nagbabago habang nagbabago ang halumigmig ng lupa. Habang tumataas ang halumigmig ng lupa, bumababa ang boltahe. + +Ito ay isang analog sensor, kaya gumagamit ito ng analog pin, at ang 10-bit ADC sa Grove Base Hat sa Pi upang i-convert ang boltahe sa isang digital na signal mula 1-1,023. Ang signal na ito ay ipinapadala sa pamamagitan ng I + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md b/translations/tl/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md new file mode 100644 index 00000000..1fb5c456 --- /dev/null +++ b/translations/tl/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md @@ -0,0 +1,123 @@ + +# Sukatin ang Halumigmig ng Lupa - Virtual na IoT Hardware + +Sa bahaging ito ng aralin, magdadagdag ka ng capacitive soil moisture sensor sa iyong virtual na IoT device, at babasahin ang mga halaga mula rito. + +## Virtual na Hardware + +Ang virtual na IoT device ay gagamit ng simulated na Grove capacitive soil moisture sensor. Pinapanatili nitong pareho ang lab na ito sa paggamit ng Raspberry Pi na may pisikal na Grove capacitive soil moisture sensor. + +Sa isang pisikal na IoT device, ang soil moisture sensor ay isang capacitive sensor na sumusukat sa halumigmig ng lupa sa pamamagitan ng pag-detect ng capacitance ng lupa, isang katangian na nagbabago habang nagbabago ang halumigmig ng lupa. Habang tumataas ang halumigmig ng lupa, bumababa ang boltahe. + +Ito ay isang analog sensor, kaya gumagamit ito ng simulated na 10-bit ADC upang mag-ulat ng halaga mula 1-1,023. + +### Idagdag ang soil moisture sensor sa CounterFit + +Upang magamit ang isang virtual na soil moisture sensor, kailangan mo itong idagdag sa CounterFit app. + +#### Gawain - Idagdag ang soil moisture sensor sa CounterFit + +Idagdag ang soil moisture sensor sa CounterFit app. + +1. Gumawa ng bagong Python app sa iyong computer sa isang folder na tinatawag na `soil-moisture-sensor` na may isang file na tinatawag na `app.py` at isang Python virtual environment, at idagdag ang CounterFit pip packages. + + > ⚠️ Maaari kang sumangguni sa [mga tagubilin para sa paggawa at pag-set up ng CounterFit Python project sa lesson 1 kung kinakailangan](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Siguraduhing tumatakbo ang CounterFit web app. + +1. Gumawa ng soil moisture sensor: + + 1. Sa *Create sensor* na kahon sa *Sensors* pane, i-drop down ang *Sensor type* na kahon at piliin ang *Soil Moisture*. + + 1. Iwanang nakatakda ang *Units* sa *NoUnits*. + + 1. Siguraduhing nakatakda ang *Pin* sa *0*. + + 1. Piliin ang **Add** na button upang likhain ang *Soil Moisture* sensor sa Pin 0. + + ![Mga setting ng soil moisture sensor](../../../../../translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.tl.png) + + Ang soil moisture sensor ay malilikha at lilitaw sa listahan ng mga sensor. + + ![Nalikha ang soil moisture sensor](../../../../../translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.tl.png) + +## Iprograma ang soil moisture sensor app + +Ngayon ay maaari nang iprograma ang soil moisture sensor app gamit ang CounterFit sensors. + +### Gawain - Iprograma ang soil moisture sensor app + +Iprograma ang soil moisture sensor app. + +1. Siguraduhing bukas ang `soil-moisture-sensor` app sa VS Code. + +1. Buksan ang `app.py` file. + +1. Idagdag ang sumusunod na code sa itaas ng `app.py` upang ikonekta ang app sa CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Idagdag ang sumusunod na code sa `app.py` file upang mag-import ng ilang kinakailangang libraries: + + ```python + import time + from counterfit_shims_grove.adc import ADC + ``` + + Ang `import time` na pahayag ay nag-i-import ng `time` module na gagamitin sa susunod sa gawaing ito. + + Ang `from counterfit_shims_grove.adc import ADC` na pahayag ay nag-i-import ng `ADC` class upang makipag-ugnayan sa isang virtual analog to digital converter na maaaring kumonekta sa isang CounterFit sensor. + +1. Idagdag ang sumusunod na code sa ibaba nito upang lumikha ng isang instance ng `ADC` class: + + ```python + adc = ADC() + ``` + +1. Magdagdag ng isang infinite loop na nagbabasa mula sa ADC na ito sa pin 0 at isinusulat ang resulta sa console. Ang loop na ito ay maaaring mag-pause ng 10 segundo sa pagitan ng mga pagbasa. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. Mula sa CounterFit app, baguhin ang halaga ng soil moisture sensor na babasahin ng app. Maaari mo itong gawin sa dalawang paraan: + + * Maglagay ng numero sa *Value* na kahon para sa soil moisture sensor, pagkatapos ay piliin ang **Set** na button. Ang numerong inilagay mo ang magiging halagang ibabalik ng sensor. + + * Lagyan ng check ang *Random* checkbox, at maglagay ng *Min* at *Max* na halaga, pagkatapos ay piliin ang **Set** na button. Sa tuwing babasahin ng sensor ang isang halaga, magbabasa ito ng random na numero sa pagitan ng *Min* at *Max*. + +1. Patakbuhin ang Python app. Makikita mo ang mga sukat ng halumigmig ng lupa na nakasulat sa console. Baguhin ang *Value* o ang *Random* na mga setting upang makita ang pagbabago ng halaga. + + ```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 + ``` + +> 💁 Maaari mong makita ang code na ito sa [code/virtual-device](../../../../../2-farm/lessons/2-detect-soil-moisture/code/virtual-device) na folder. + +😀 Tagumpay ang iyong soil moisture sensor program! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md b/translations/tl/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md new file mode 100644 index 00000000..f23d852f --- /dev/null +++ b/translations/tl/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md @@ -0,0 +1,117 @@ + +# Sukatin ang Halumigmig ng Lupa - Wio Terminal + +Sa bahaging ito ng aralin, magdadagdag ka ng capacitive soil moisture sensor sa iyong Wio Terminal, at babasahin ang mga halaga mula dito. + +## Kagamitan + +Kailangan ng Wio Terminal ng capacitive soil moisture sensor. + +Ang sensor na gagamitin mo ay isang [Capacitive Soil Moisture Sensor](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), na sumusukat sa halumigmig ng lupa sa pamamagitan ng pag-detect ng capacitance ng lupa, isang katangian na nagbabago habang nagbabago ang halumigmig ng lupa. Kapag tumataas ang halumigmig ng lupa, bumababa ang boltahe. + +Ito ay isang analog sensor, kaya nakakonekta ito sa analog pins ng Wio Terminal, gamit ang onboard ADC upang lumikha ng halaga mula 0-1,023. + +### Ikonekta ang soil moisture sensor + +Ang Grove soil moisture sensor ay maaaring ikonekta sa configurable analog/digital port ng Wio Terminal. + +#### Gawain - ikonekta ang soil moisture sensor + +Ikonekta ang soil moisture sensor. + +![Isang Grove soil moisture sensor](../../../../../translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.tl.png) + +1. Ipasok ang isang dulo ng Grove cable sa socket ng soil moisture sensor. Isa lang ang tamang paraan ng pagpasok nito. + +1. Kapag ang Wio Terminal ay hindi nakakonekta sa iyong computer o ibang power supply, ikonekta ang kabilang dulo ng Grove cable sa Grove socket sa kanang bahagi ng Wio Terminal habang nakatingin ka sa screen. Ito ang socket na pinakamalayo sa power button. + +![Ang Grove soil moisture sensor na nakakonekta sa kanang socket](../../../../../translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.tl.png) + +1. Ipasok ang soil moisture sensor sa lupa. Mayroon itong 'highest position line' - isang puting linya sa sensor. Ipasok ang sensor hanggang sa linya ngunit huwag lalampas dito. + +![Ang Grove soil moisture sensor sa lupa](../../../../../translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.tl.png) + +1. Maaari mo nang ikonekta ang Wio Terminal sa iyong computer. + +## Iprograma ang soil moisture sensor + +Ang Wio Terminal ay maaari nang iprograma upang magamit ang nakakabit na soil moisture sensor. + +### Gawain - iprograma ang soil moisture sensor + +Iprograma ang device. + +1. Gumawa ng bagong Wio Terminal project gamit ang PlatformIO. Tawagin ang proyektong ito na `soil-moisture-sensor`. Magdagdag ng code sa `setup` function upang i-configure ang serial port. + + > ⚠️ Maaari kang sumangguni sa [mga tagubilin para sa paggawa ng PlatformIO project sa project 1, lesson 1 kung kinakailangan](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#create-a-platformio-project). + +1. Walang library para sa sensor na ito, sa halip maaari kang magbasa mula sa analog pin gamit ang built-in na Arduino [`analogRead`](https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/) function. Magsimula sa pag-configure ng analog pin para sa input upang mabasa ang mga halaga mula dito sa pamamagitan ng pagdaragdag ng sumusunod sa `setup` function. + + ```cpp + pinMode(A0, INPUT); + ``` + + Sinet nito ang `A0` pin, ang pinagsamang analog/digital pin, bilang input pin na maaaring basahin ang boltahe. + +1. Magdagdag ng sumusunod sa `loop` function upang basahin ang boltahe mula sa pin na ito: + + ```cpp + int soil_moisture = analogRead(A0); + ``` + +1. Sa ibaba ng code na ito, magdagdag ng sumusunod na code upang i-print ang halaga sa serial port: + + ```cpp + Serial.print("Soil Moisture: "); + Serial.println(soil_moisture); + ``` + +1. Sa wakas, magdagdag ng delay sa dulo ng 10 segundo: + + ```cpp + delay(10000); + ``` + +1. I-build at i-upload ang code sa Wio Terminal. + + > ⚠️ Maaari kang sumangguni sa [mga tagubilin para sa paggawa ng PlatformIO project sa project 1, lesson 1 kung kinakailangan](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#write-the-hello-world-app). + +1. Kapag na-upload na, maaari mong i-monitor ang halumigmig ng lupa gamit ang serial monitor. Magdagdag ng tubig sa lupa, o alisin ang sensor mula sa lupa, at tingnan ang pagbabago ng halaga. + + ```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 + ``` + + Sa halimbawa ng output sa itaas, makikita mo ang pagbaba ng boltahe habang dinadagdagan ang tubig. + +> 💁 Maaari mong makita ang code na ito sa [code/wio-terminal](../../../../../2-farm/lessons/2-detect-soil-moisture/code/wio-terminal) folder. + +😀 Tagumpay ang iyong programa para sa soil moisture sensor! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na pinagmulan. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/3-automated-plant-watering/README.md b/translations/tl/2-farm/lessons/3-automated-plant-watering/README.md new file mode 100644 index 00000000..f5d28e9c --- /dev/null +++ b/translations/tl/2-farm/lessons/3-automated-plant-watering/README.md @@ -0,0 +1,314 @@ + +# Awtomatikong Pagdidilig ng Halaman + +![Isang sketchnote overview ng aralin na ito](../../../../../translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.tl.jpg) + +> Sketchnote ni [Nitya Narasimhan](https://github.com/nitya). I-click ang imahe para sa mas malaking bersyon. + +Ang aralin na ito ay itinuro bilang bahagi ng [IoT for Beginners Project 2 - Digital Agriculture series](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) mula sa [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![IoT powered automated plant watering](https://img.youtube.com/vi/g9FfZwv9R58/0.jpg)](https://youtu.be/g9FfZwv9R58) + +## Pre-lecture quiz + +[Pre-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/13) + +## Panimula + +Sa nakaraang aralin, natutunan mo kung paano i-monitor ang moisture ng lupa. Sa aralin na ito, matututunan mo kung paano bumuo ng mga pangunahing bahagi ng isang awtomatikong sistema ng pagdidilig na tumutugon sa moisture ng lupa. Malalaman mo rin ang tungkol sa timing - kung paano ang mga sensor ay maaaring magtagal bago tumugon sa mga pagbabago, at kung paano ang mga actuator ay maaaring magtagal bago baguhin ang mga katangiang sinusukat ng mga sensor. + +Sa aralin na ito, tatalakayin natin: + +* [Kontrolin ang mga high power device mula sa isang low power IoT device](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Kontrolin ang isang relay](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Kontrolin ang iyong halaman gamit ang MQTT](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Timing ng sensor at actuator](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Magdagdag ng timing sa iyong plant control server](../../../../../2-farm/lessons/3-automated-plant-watering) + +## Kontrolin ang mga high power device mula sa isang low power IoT device + +Ang mga IoT device ay gumagamit ng mababang boltahe. Bagama't sapat ito para sa mga sensor at low-power actuator tulad ng LEDs, masyadong mababa ito para kontrolin ang mas malalaking hardware, tulad ng water pump na ginagamit para sa irigasyon. Kahit ang maliliit na pump na maaaring gamitin para sa mga houseplant ay kumukuha ng masyadong maraming kuryente para sa isang IoT dev kit at maaaring masira ang board. + +> 🎓 Ang kasalukuyang sinusukat sa Amps (A) ay ang dami ng kuryenteng dumadaloy sa isang circuit. Ang boltahe ang nagbibigay ng tulak, ang kasalukuyang ang dami ng itinutulak. Maaari kang magbasa pa tungkol sa kasalukuyang sa [electric current page sa Wikipedia](https://wikipedia.org/wiki/Electric_current). + +Ang solusyon dito ay ang pagkonekta ng pump sa isang panlabas na power supply, at paggamit ng actuator upang i-switch ang pump, katulad ng kung paano mo i-switch ang ilaw. Kailangan lamang ng kaunting kuryente (sa anyo ng enerhiya sa iyong katawan) para sa iyong daliri upang i-flip ang switch, at ito ay nagkokonekta sa ilaw sa mains electricity na tumatakbo sa 110v/240v. + +![Isang light switch na nagbubukas ng kuryente sa isang ilaw](../../../../../translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.tl.png) + +> 🎓 [Mains electricity](https://wikipedia.org/wiki/Mains_electricity) ay tumutukoy sa kuryenteng dinadala sa mga tahanan at negosyo sa pamamagitan ng pambansang imprastraktura sa maraming bahagi ng mundo. + +✅ Ang mga IoT device ay karaniwang nagbibigay ng 3.3V o 5V, na mas mababa sa 1 amp (1A) ng kasalukuyang. Ihambing ito sa mains electricity na kadalasang nasa 230V (120V sa North America at 100V sa Japan), at maaaring magbigay ng kuryente para sa mga device na kumukuha ng 30A. + +Mayroong ilang mga actuator na maaaring gawin ito, kabilang ang mga mekanikal na device na maaari mong ikabit sa mga umiiral na switch na ginagaya ang daliri na binubuksan ang mga ito. Ang pinakasikat ay ang relay. + +### Relays + +Ang relay ay isang electromechanical switch na nagko-convert ng electrical signal sa mekanikal na galaw na nagbubukas ng switch. Ang core ng relay ay isang electromagnet. + +> 🎓 [Electromagnets](https://wikipedia.org/wiki/Electromagnet) ay mga magnet na nilikha sa pamamagitan ng pagpapadaan ng kuryente sa isang coil ng wire. Kapag ang kuryente ay nakabukas, ang coil ay nagiging magnetized. Kapag ang kuryente ay naka-off, ang coil ay nawawala ang magnetismo nito. + +![Kapag naka-on, ang electromagnet ay lumilikha ng magnetic field, binubuksan ang switch para sa output circuit](../../../../../translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.tl.png) + +Sa isang relay, ang control circuit ay nagpapagana sa electromagnet. Kapag ang electromagnet ay naka-on, hinahatak nito ang isang lever na gumagalaw sa isang switch, isinasara ang isang pares ng mga contact at kinukumpleto ang output circuit. + +![Kapag naka-off, ang electromagnet ay hindi lumilikha ng magnetic field, binubuksan ang switch para sa output circuit](../../../../../translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.tl.png) + +Kapag ang control circuit ay naka-off, ang electromagnet ay naka-off, pinakakawalan ang lever at binubuksan ang mga contact, pinapatay ang output circuit. Ang mga relay ay digital actuators - ang mataas na signal sa relay ay binubuksan ito, ang mababang signal ay pinapatay ito. + +Ang output circuit ay maaaring gamitin upang magbigay ng kuryente sa karagdagang hardware, tulad ng isang sistema ng irigasyon. Ang IoT device ay maaaring i-on ang relay, kumpletuhin ang output circuit na nagbibigay ng kuryente sa sistema ng irigasyon, at nadidiligan ang mga halaman. Ang IoT device ay maaaring i-off ang relay, putulin ang kuryente sa sistema ng irigasyon, pinapatay ang tubig. + +![Isang relay na binubuksan, binubuksan ang pump na nagpapadala ng tubig sa halaman](../../../../../images/strawberry-pump.gif) + +Sa video sa itaas, ang relay ay binubuksan. Ang LED sa relay ay nag-iilaw upang ipakita na ito ay naka-on (ang ilang relay boards ay may LEDs upang ipakita kung ang relay ay naka-on o naka-off), at ang kuryente ay ipinapadala sa pump, binubuksan ito at nagbubomba ng tubig sa halaman. + +> 💁 Ang mga relay ay maaari ding gamitin upang lumipat sa pagitan ng dalawang output circuit sa halip na i-on at i-off ang isa. Habang gumagalaw ang lever, ito ay gumagalaw ng switch mula sa pagkumpleto ng isang output circuit patungo sa pagkumpleto ng ibang output circuit, kadalasang nagbabahagi ng karaniwang koneksyon sa kuryente, o karaniwang koneksyon sa ground. + +✅ Mag-research: Mayroong maraming uri ng relay, na may mga pagkakaiba tulad ng kung ang control circuit ay binubuksan o pinapatay ang relay kapag ang kuryente ay inilapat, o maraming output circuit. Alamin ang tungkol sa mga iba't ibang uri na ito. + +Kapag gumagalaw ang lever, kadalasan ay maririnig mo itong kumokonekta sa electromagnet na may malinaw na tunog ng pag-click. + +> 💁 Ang relay ay maaaring i-wire upang ang paggawa ng koneksyon ay talagang nagpuputol ng kuryente sa relay, pinapatay ang relay, na pagkatapos ay nagpapadala ng kuryente sa relay na binubuksan itong muli, at iba pa. Nangangahulugan ito na ang relay ay magki-click nang napakabilis na gumagawa ng tunog ng buzzing. Ganito gumagana ang ilan sa mga unang buzzers na ginamit sa mga electric doorbells. + +### Relay power + +Ang electromagnet ay hindi nangangailangan ng maraming kuryente upang ma-activate at mahila ang lever, maaari itong kontrolin gamit ang 3.3V o 5V output mula sa isang IoT dev kit. Ang output circuit ay maaaring magdala ng mas maraming kuryente, depende sa relay, kabilang ang mains voltage o kahit na mas mataas na antas ng kuryente para sa pang-industriya na paggamit. Sa ganitong paraan, ang isang IoT dev kit ay maaaring kontrolin ang isang sistema ng irigasyon, mula sa isang maliit na pump para sa isang halaman, hanggang sa isang malaking pang-industriya na sistema para sa isang buong komersyal na sakahan. + +![Isang grove relay na may control circuit, output circuit at relay na may label](../../../../../translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.tl.png) + +Ang imahe sa itaas ay nagpapakita ng isang Grove relay. Ang control circuit ay kumokonekta sa isang IoT device at binubuksan o pinapatay ang relay gamit ang 3.3V o 5V. Ang output circuit ay may dalawang terminal, alinman sa isa ay maaaring power o ground. Ang output circuit ay maaaring humawak ng hanggang 250V sa 10A, sapat para sa iba't ibang mains-powered na device. Maaari kang makakuha ng mga relay na maaaring humawak ng mas mataas pang antas ng kuryente. + +![Isang pump na naka-wire sa pamamagitan ng relay](../../../../../translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.tl.png) + +Sa imahe sa itaas, ang kuryente ay ibinibigay sa isang pump sa pamamagitan ng relay. Mayroong isang pulang wire na kumokonekta sa +5V terminal ng isang USB power supply sa isang terminal ng output circuit ng relay, at isa pang pulang wire na kumokonekta sa ibang terminal ng output circuit sa pump. Ang isang itim na wire ay kumokonekta sa pump sa ground sa USB power supply. Kapag ang relay ay binubuksan, ito ay kumukumpleto sa circuit, nagpapadala ng 5V sa pump, binubuksan ang pump. + +## Kontrolin ang isang relay + +Maaari mong kontrolin ang isang relay mula sa iyong IoT dev kit. + +### Gawain - kontrolin ang isang relay + +Sundin ang kaukulang gabay upang kontrolin ang isang relay gamit ang iyong IoT device: + +* [Arduino - Wio Terminal](wio-terminal-relay.md) +* [Single-board computer - Raspberry Pi](pi-relay.md) +* [Single-board computer - Virtual device](virtual-device-relay.md) + +## Kontrolin ang iyong halaman gamit ang MQTT + +Sa ngayon ang iyong relay ay direktang kinokontrol ng IoT device batay sa isang solong soil moisture reading. Sa isang komersyal na sistema ng irigasyon, ang control logic ay magiging sentralisado, na nagpapahintulot dito na gumawa ng mga desisyon sa pagdidilig gamit ang data mula sa maraming sensor, at nagpapahintulot sa anumang configuration na mabago sa isang lugar lamang. Upang gayahin ito, maaari mong kontrolin ang relay gamit ang MQTT. + +### Gawain - kontrolin ang relay gamit ang MQTT + +1. Idagdag ang kaukulang MQTT libraries/pip packages at code sa iyong `soil-moisture-sensor` project upang kumonekta sa MQTT. Pangalanan ang client ID bilang `soilmoisturesensor_client` na may prefix na iyong ID. + + > ⚠️ Maaari kang sumangguni sa [mga tagubilin para sa pagkonekta sa MQTT sa project 1, lesson 4 kung kinakailangan](../../../1-getting-started/lessons/4-connect-internet/README.md#connect-your-iot-device-to-mqtt). + +1. Idagdag ang kaukulang device code upang magpadala ng telemetry gamit ang soil moisture settings. Para sa telemetry message, pangalanan ang property na `soil_moisture`. + + > ⚠️ Maaari kang sumangguni sa [mga tagubilin para sa pagpapadala ng telemetry sa MQTT sa project 1, lesson 4 kung kinakailangan](../../../1-getting-started/lessons/4-connect-internet/README.md#send-telemetry-from-your-iot-device). + +1. Gumawa ng lokal na server code upang mag-subscribe sa telemetry at magpadala ng command upang kontrolin ang relay sa isang folder na tinatawag na `soil-moisture-sensor-server`. Pangalanan ang property sa command message na `relay_on`, at itakda ang client ID bilang `soilmoisturesensor_server` na may prefix na iyong ID. Panatilihin ang parehong istruktura tulad ng server code na isinulat mo para sa project 1, lesson 4 dahil idaragdag mo ang code na ito sa ibang bahagi ng aralin. + + > ⚠️ Maaari kang sumangguni sa [mga tagubilin para sa pagpapadala ng telemetry sa MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#write-the-server-code) at [pagpapadala ng mga command sa MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#send-commands-to-the-mqtt-broker) sa project 1, lesson 4 kung kinakailangan. + +1. Idagdag ang kaukulang device code upang kontrolin ang relay mula sa natanggap na mga command, gamit ang property na `relay_on` mula sa message. Magpadala ng true para sa `relay_on` kung ang `soil_moisture` ay mas mataas sa 450, kung hindi ay magpadala ng false, katulad ng logic na idinagdag mo para sa IoT device kanina. + + > ⚠️ Maaari kang sumangguni sa [mga tagubilin para sa pagtugon sa mga command mula sa MQTT sa project 1, lesson 4 kung kinakailangan](../../../1-getting-started/lessons/4-connect-internet/README.md#handle-commands-on-the-iot-device). + +> 💁 Maaari mong makita ang code na ito sa [code-mqtt](../../../../../2-farm/lessons/3-automated-plant-watering/code-mqtt) folder. + +Siguraduhing tumatakbo ang code sa iyong device at lokal na server, at subukan ito sa pamamagitan ng pagbabago ng mga antas ng soil moisture, alinman sa pamamagitan ng pagbabago ng mga value na ipinapadala ng virtual sensor, o sa pamamagitan ng pagbabago ng mga antas ng moisture ng lupa sa pamamagitan ng pagdaragdag ng tubig o pag-aalis ng sensor mula sa lupa. + +## Timing ng sensor at actuator + +Sa lesson 3, gumawa ka ng nightlight - isang LED na nagbubukas kapag mababang antas ng liwanag ang nakita ng light sensor. Ang light sensor ay agad na nakakita ng pagbabago sa antas ng liwanag, at ang device ay mabilis na tumugon, limitado lamang ng haba ng delay sa `loop` function o `while True:` loop. Bilang isang IoT developer, hindi mo palaging maaasahan ang ganitong kabilis na feedback loop. + +### Timing para sa soil moisture + +Kung ginawa mo ang nakaraang aralin sa soil moisture gamit ang isang physical sensor, mapapansin mo na tumagal ng ilang segundo bago bumaba ang soil moisture reading pagkatapos mong diligan ang iyong halaman. Hindi ito dahil mabagal ang sensor, kundi dahil tumatagal ang tubig upang sumipsip sa lupa. +💁 Kung nagdilig ka nang masyadong malapit sa sensor, maaaring napansin mong bumaba agad ang pagbabasa, tapos bumalik ulit - ito ay sanhi ng tubig na malapit sa sensor na kumakalat sa iba pang bahagi ng lupa, na nagbabawas ng kahalumigmigan ng lupa sa paligid ng sensor. +![Ang sukat ng soil moisture na 658 ay hindi nagbabago habang dinidiligan, bumababa lamang ito sa 320 pagkatapos ng pagdidilig kapag ang tubig ay sumuot na sa lupa](../../../../../translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.tl.png) + +Sa diagram sa itaas, ang sukat ng soil moisture ay nagpapakita ng 658. Diniligan ang halaman, ngunit hindi agad nagbabago ang sukat na ito dahil hindi pa naaabot ng tubig ang sensor. Maaaring matapos ang pagdidilig bago pa maabot ng tubig ang sensor, at saka pa lamang bababa ang halaga upang ipakita ang bagong antas ng moisture. + +Kung nagsusulat ka ng code para kontrolin ang isang irrigation system gamit ang relay batay sa antas ng soil moisture, kailangan mong isaalang-alang ang delay na ito at magdagdag ng mas matalinong timing sa iyong IoT device. + +✅ Maglaan ng oras upang pag-isipan kung paano mo ito magagawa. + +### Kontrolin ang timing ng sensor at actuator + +Isipin na ikaw ay inatasang bumuo ng isang irrigation system para sa isang sakahan. Batay sa uri ng lupa, natukoy na ang ideal na antas ng soil moisture para sa mga tanim ay tumutugma sa analog voltage reading na 400-450. + +Maaari mong i-program ang device sa parehong paraan tulad ng nightlight - sa tuwing ang sensor ay magbabasa ng higit sa 450, i-on ang relay upang i-on ang pump. Ang problema ay ang tubig ay nangangailangan ng oras upang makarating mula sa pump, sa lupa, hanggang sa sensor. Hihinto ang sensor sa pagdidilig kapag na-detect nito ang antas na 450, ngunit patuloy na bababa ang antas ng tubig habang ang tubig na pinumpa ay sumusuot sa lupa. Ang resulta ay nasayang na tubig at panganib ng pinsala sa ugat. + +✅ Tandaan - ang sobrang tubig ay maaaring kasing sama ng kulang na tubig para sa mga halaman, at nasasayang ang mahalagang yaman. + +Ang mas magandang solusyon ay ang pag-unawa na may delay sa pagitan ng pag-on ng actuator at pagbabago ng property na binabasa ng sensor. Nangangahulugan ito na hindi lamang dapat maghintay ang sensor bago muling sukatin ang halaga, ngunit ang actuator ay kailangang mag-off nang ilang sandali bago ang susunod na sukat ng sensor. + +Gaano katagal dapat naka-on ang relay sa bawat pagkakataon? Mas mabuting mag-ingat at i-on lamang ang relay nang maikling panahon, pagkatapos ay maghintay para sa tubig na sumuot, at saka muling sukatin ang antas ng moisture. Sa huli, maaari mong palaging i-on muli ang pump upang magdagdag ng tubig, ngunit hindi mo maaalis ang tubig mula sa lupa. + +> 💁 Ang ganitong uri ng kontrol sa timing ay napaka-espesipiko sa IoT device na iyong binubuo, sa property na iyong sinusukat, at sa mga sensor at actuator na ginagamit. + +![Isang tanim na strawberry na konektado sa tubig sa pamamagitan ng pump, na ang pump ay konektado sa relay. Ang relay at isang soil moisture sensor sa tanim ay parehong konektado sa Raspberry Pi](../../../../../translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.tl.png) + +Halimbawa, mayroon akong tanim na strawberry na may soil moisture sensor at pump na kontrolado ng relay. Napansin ko na kapag nagdagdag ako ng tubig, tumatagal ng humigit-kumulang 20 segundo bago maging stable ang sukat ng soil moisture. Nangangahulugan ito na kailangan kong i-off ang relay at maghintay ng 20 segundo bago sukatin ang antas ng moisture. Mas gugustuhin kong kulang ang tubig kaysa sobra - maaari kong palaging i-on muli ang pump, ngunit hindi ko maaalis ang tubig mula sa tanim. + +![Hakbang 1, kumuha ng sukat. Hakbang 2, magdagdag ng tubig. Hakbang 3, maghintay para sa tubig na sumuot sa lupa. Hakbang 4, muling kumuha ng sukat](../../../../../translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.tl.png) + +Nangangahulugan ito na ang pinakamahusay na proseso ay isang cycle ng pagdidilig na ganito: + +* I-on ang pump sa loob ng 5 segundo +* Maghintay ng 20 segundo +* Suriin ang soil moisture +* Kung ang antas ay mas mataas pa sa kinakailangan, ulitin ang mga hakbang sa itaas + +Ang 5 segundo ay maaaring masyadong mahaba para sa pump, lalo na kung ang antas ng moisture ay bahagyang mas mataas lamang sa kinakailangang antas. Ang pinakamahusay na paraan upang malaman kung anong timing ang gagamitin ay subukan ito, pagkatapos ay ayusin kapag mayroon ka nang data mula sa sensor, gamit ang tuloy-tuloy na feedback loop. Maaari pa itong humantong sa mas detalyadong timing, tulad ng pag-on ng pump sa loob ng 1 segundo para sa bawat 100 na higit sa kinakailangang soil moisture, sa halip na nakatakdang 5 segundo. + +✅ Mag-research: Mayroon bang iba pang mga konsiderasyon sa timing? Maaari bang diligan ang halaman anumang oras na mababa ang soil moisture, o may mga partikular na oras ng araw na mas maganda o masama para sa pagdidilig ng mga halaman? + +> 💁 Ang mga prediksyon ng panahon ay maaari ring isaalang-alang kapag kinokontrol ang mga automated watering system para sa mga pananim sa labas. Kung inaasahan ang ulan, maaaring ipagpaliban ang pagdidilig hanggang matapos ang ulan. Sa puntong iyon, maaaring sapat na ang moisture ng lupa na hindi na ito kailangang diligan, mas epektibo kaysa sa nasayang na tubig sa pagdidilig bago pa umulan. + +## Magdagdag ng timing sa iyong plant control server + +Ang server code ay maaaring baguhin upang magdagdag ng kontrol sa timing ng cycle ng pagdidilig, at maghintay para sa pagbabago ng antas ng soil moisture. Ang lohika ng server para sa pagkontrol sa timing ng relay ay: + +1. Natanggap ang telemetry message +1. Suriin ang antas ng soil moisture +1. Kung ok ito, walang gagawin. Kung masyadong mataas ang sukat (ibig sabihin mababa ang soil moisture), gawin ang sumusunod: + 1. Magpadala ng command upang i-on ang relay + 1. Maghintay ng 5 segundo + 1. Magpadala ng command upang i-off ang relay + 1. Maghintay ng 20 segundo para maging stable ang antas ng soil moisture + +Ang cycle ng pagdidilig, ang proseso mula sa pagtanggap ng telemetry message hanggang sa pagiging handa na muling suriin ang antas ng soil moisture, ay tumatagal ng humigit-kumulang 25 segundo. Nagpapadala tayo ng antas ng soil moisture tuwing 10 segundo, kaya may overlap kung saan natatanggap ang isang message habang naghihintay ang server para maging stable ang antas ng soil moisture, na maaaring magsimula ng isa pang cycle ng pagdidilig. + +May dalawang opsyon upang maiwasan ito: + +* Baguhin ang IoT device code upang magpadala lamang ng telemetry bawat minuto, sa ganitong paraan matatapos ang cycle ng pagdidilig bago magpadala ng susunod na message +* Mag-unsubscribe mula sa telemetry habang nasa cycle ng pagdidilig + +Ang unang opsyon ay hindi palaging magandang solusyon para sa malalaking sakahan. Maaaring gustuhin ng magsasaka na makuha ang antas ng soil moisture habang dinidiligan ang lupa para sa pagsusuri sa hinaharap, halimbawa upang malaman ang daloy ng tubig sa iba't ibang bahagi ng sakahan para sa mas target na pagdidilig. Ang pangalawang opsyon ay mas maganda - ang code ay hindi lamang pinapansin ang telemetry kapag hindi ito magagamit, ngunit ang telemetry ay naroon pa rin para sa ibang serbisyo na maaaring mag-subscribe dito. + +> 💁 Ang IoT data ay hindi ipinapadala mula sa isang device patungo sa isang serbisyo lamang, sa halip maraming device ang maaaring magpadala ng data sa isang broker, at maraming serbisyo ang maaaring makinig sa data mula sa broker. Halimbawa, isang serbisyo ang maaaring makinig sa soil moisture data at i-store ito sa isang database para sa pagsusuri sa hinaharap. Isa pang serbisyo ang maaaring makinig sa parehong telemetry upang kontrolin ang isang irrigation system. + +### Gawain - magdagdag ng timing sa iyong plant control server + +I-update ang iyong server code upang patakbuhin ang relay sa loob ng 5 segundo, pagkatapos ay maghintay ng 20 segundo. + +1. Buksan ang folder na `soil-moisture-sensor-server` sa VS Code kung hindi pa ito bukas. Siguraduhing naka-activate ang virtual environment. + +1. Buksan ang file na `app.py` + +1. Idagdag ang sumusunod na code sa file na `app.py` sa ibaba ng mga umiiral na imports: + + ```python + import threading + ``` + + Ang statement na ito ay nag-i-import ng `threading` mula sa mga Python libraries, ang threading ay nagpapahintulot sa Python na magpatupad ng ibang code habang naghihintay. + +1. Idagdag ang sumusunod na code bago ang function na `handle_telemetry` na humahawak sa mga telemetry message na natatanggap ng server code: + + ```python + water_time = 5 + wait_time = 20 + ``` + + Tinutukoy nito kung gaano katagal patatakbuhin ang relay (`water_time`), at kung gaano katagal maghihintay pagkatapos upang suriin ang soil moisture (`wait_time`). + +1. Sa ibaba ng code na ito, idagdag ang sumusunod: + + ```python + def send_relay_command(client, state): + command = { 'relay_on' : state } + print("Sending message:", command) + client.publish(server_command_topic, json.dumps(command)) + ``` + + Ang code na ito ay nagtatakda ng function na tinatawag na `send_relay_command` na nagpapadala ng command sa pamamagitan ng MQTT upang kontrolin ang relay. Ang telemetry ay nilikha bilang isang dictionary, pagkatapos ay na-convert sa JSON string. Ang value na ipinasa sa `state` ang nagtatakda kung ang relay ay dapat naka-on o naka-off. + +1. Pagkatapos ng function na `send_relay_code`, idagdag ang sumusunod na 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) + ``` + + Tinutukoy nito ang isang function upang kontrolin ang relay batay sa kinakailangang timing. Nagsisimula ito sa pag-unsubscribe mula sa telemetry upang hindi ma-proseso ang mga soil moisture message habang nangyayari ang pagdidilig. Susunod, nagpapadala ito ng command upang i-on ang relay. Pagkatapos ay maghihintay ito ng `water_time` bago magpadala ng command upang i-off ang relay. Sa huli, maghihintay ito para maging stable ang antas ng soil moisture sa loob ng `wait_time` na segundo. Pagkatapos ay muling mag-subscribe sa telemetry. + +1. Palitan ang function na `handle_telemetry` ng sumusunod: + + ```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() + ``` + + Ang code na ito ay sumusuri sa antas ng soil moisture. Kung ito ay higit sa 450, nangangailangan ng pagdidilig ang lupa, kaya tinatawag nito ang function na `control_relay`. Ang function na ito ay tumatakbo sa isang hiwalay na thread, na tumatakbo sa background. + +1. Siguraduhing tumatakbo ang iyong IoT device, pagkatapos ay patakbuhin ang code na ito. Baguhin ang antas ng soil moisture at obserbahan kung ano ang nangyayari sa relay - dapat itong mag-on sa loob ng 5 segundo pagkatapos ay manatiling naka-off nang hindi bababa sa 20 segundo, at mag-o-on lamang kung hindi sapat ang antas ng soil moisture. + + ```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} + ``` + + Isang magandang paraan upang subukan ito sa isang simulated irrigation system ay gumamit ng tuyong lupa, pagkatapos ay magbuhos ng tubig nang manu-mano habang naka-on ang relay, at itigil ang pagbuhos kapag naka-off ang relay. + +> 💁 Maaari mong makita ang code na ito sa folder na [code-timing](../../../../../2-farm/lessons/3-automated-plant-watering/code-timing). + +> 💁 Kung nais mong gumamit ng pump upang bumuo ng isang tunay na irrigation system, maaari kang gumamit ng [6V water pump](https://www.seeedstudio.com/6V-Mini-Water-Pump-p-1945.html) na may [USB terminal power supply](https://www.adafruit.com/product/3628). Siguraduhing ang power papunta o mula sa pump ay konektado sa pamamagitan ng relay. + +--- + +## 🚀 Hamon + +Makakaisip ka ba ng iba pang IoT o iba pang electrical devices na may katulad na problema kung saan tumatagal bago maabot ng resulta ng actuator ang sensor? Marahil mayroon kang ilan sa iyong bahay o paaralan. + +* Anong mga property ang sinusukat nila? +* Gaano katagal bago magbago ang property pagkatapos gamitin ang actuator? +* Ok lang ba na lumampas ang pagbabago ng property sa kinakailangang halaga? +* Paano ito maibabalik sa kinakailangang halaga kung kinakailangan? + +## Post-lecture quiz + +[Post-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/14) + +## Review & Self Study + +* Magbasa pa tungkol sa relays kabilang ang kanilang makasaysayang paggamit sa mga telephone exchanges sa [relay Wikipedia page](https://wikipedia.org/wiki/Relay). + +## Assignment + +[Magbuo ng mas epektibong cycle ng pagdidilig](assignment.md) + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/3-automated-plant-watering/assignment.md b/translations/tl/2-farm/lessons/3-automated-plant-watering/assignment.md new file mode 100644 index 00000000..b28f3a6c --- /dev/null +++ b/translations/tl/2-farm/lessons/3-automated-plant-watering/assignment.md @@ -0,0 +1,54 @@ + +# Gumawa ng Mas Mabisang Sistema ng Pagdidilig + +## Mga Instruksyon + +Tinalakay sa araling ito kung paano kontrolin ang isang relay gamit ang datos mula sa sensor, at ang relay na ito ay maaaring magkontrol ng bomba para sa isang sistema ng irigasyon. Para sa isang tiyak na dami ng lupa, ang pagpapatakbo ng bomba sa loob ng nakatakdang oras ay dapat palaging may parehong epekto sa antas ng kahalumigmigan ng lupa. Nangangahulugan ito na maaari mong matantya kung ilang segundo ng irigasyon ang tumutugma sa isang partikular na pagbaba sa pagbasa ng kahalumigmigan ng lupa. Gamit ang datos na ito, maaari kang bumuo ng mas kontroladong sistema ng irigasyon. + +Sa gawaing ito, kakalkulahin mo kung gaano katagal dapat tumakbo ang bomba para makamit ang nais na pagtaas sa kahalumigmigan ng lupa. + +> ⚠️ Kung gumagamit ka ng virtual na IoT hardware, maaari mong sundan ang prosesong ito, ngunit i-simulate ang mga resulta sa pamamagitan ng manu-manong pagtaas ng pagbasa ng kahalumigmigan ng lupa ng isang tiyak na halaga bawat segundo na naka-on ang relay. + +1. Magsimula sa tuyong lupa. Sukatin ang kahalumigmigan ng lupa. + +1. Magdagdag ng tiyak na dami ng tubig, alinman sa pamamagitan ng pagpapatakbo ng bomba sa loob ng 1 segundo o sa pamamagitan ng pagbuhos ng tiyak na dami ng tubig. + + > Ang bomba ay dapat palaging tumakbo sa pare-parehong bilis, kaya bawat segundo na tumatakbo ang bomba, dapat itong magbigay ng parehong dami ng tubig. + +1. Maghintay hanggang maging stable ang antas ng kahalumigmigan ng lupa at kumuha ng pagbasa. + +1. Ulitin ito nang maraming beses at gumawa ng talahanayan ng mga resulta. Ang halimbawa ng talahanayan ay nasa ibaba. + + | Kabuuang Oras ng Bomba | Kahalumigmigan ng Lupa | Pagbaba | + | --- | --: | -: | + | Tuyong Lupa | 643 | 0 | + | 1s | 621 | 22 | + | 2s | 601 | 20 | + | 3s | 579 | 22 | + | 4s | 560 | 19 | + | 5s | 539 | 21 | + | 6s | 521 | 18 | + +1. Kalkulahin ang karaniwang pagtaas sa kahalumigmigan ng lupa bawat segundo ng tubig. Sa halimbawa sa itaas, bawat segundo ng tubig ay nagdudulot ng pagbaba sa pagbasa ng average na 20.3. + +1. Gamitin ang datos na ito upang mapabuti ang kahusayan ng iyong server code, sa pamamagitan ng pagpapatakbo ng bomba sa kinakailangang oras upang maabot ang nais na antas ng kahalumigmigan ng lupa. + +## Rubric + +| Pamantayan | Napakahusay | Katanggap-tanggap | Kailangan ng Pagbuti | +| -------- | --------- | -------- | ----------------- | +| Pagkuha ng datos ng kahalumigmigan ng lupa | Kayang kumuha ng maraming pagbasa matapos magdagdag ng tiyak na dami ng tubig | Kayang kumuha ng ilang pagbasa gamit ang tiyak na dami ng tubig | Kayang kumuha lamang ng isa o dalawang pagbasa, o hindi kayang gumamit ng tiyak na dami ng tubig | +| Pag-calibrate ng server code | Kayang kalkulahin ang karaniwang pagbaba sa pagbasa ng kahalumigmigan at i-update ang server code gamit ito | Kayang kalkulahin ang karaniwang pagbaba, ngunit hindi ma-update ang server code, o hindi tamang makalkula ang average ngunit nagagamit ang halagang ito upang ma-update nang tama ang server code | Hindi kayang kalkulahin ang average, o ma-update ang server code | + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/3-automated-plant-watering/pi-relay.md b/translations/tl/2-farm/lessons/3-automated-plant-watering/pi-relay.md new file mode 100644 index 00000000..3137c38e --- /dev/null +++ b/translations/tl/2-farm/lessons/3-automated-plant-watering/pi-relay.md @@ -0,0 +1,123 @@ + +# Kontrolin ang isang relay - Raspberry Pi + +Sa bahaging ito ng aralin, magdadagdag ka ng relay sa iyong Raspberry Pi bukod sa soil moisture sensor, at kokontrolin ito batay sa antas ng soil moisture. + +## Kagamitan + +Kailangan ng Raspberry Pi ng relay. + +Ang relay na gagamitin mo ay isang [Grove relay](https://www.seeedstudio.com/Grove-Relay.html), isang normally-open relay (ibig sabihin, ang output circuit ay bukas o hindi konektado kapag walang signal na ipinapadala sa relay) na kayang mag-handle ng output circuits hanggang 250V at 10A. + +Ito ay isang digital actuator, kaya't ikokonekta ito sa isang digital pin sa Grove Base Hat. + +### Ikonekta ang relay + +Ang Grove relay ay maaaring ikonekta sa Raspberry Pi. + +#### Gawain + +Ikonekta ang relay. + +![Isang Grove relay](../../../../../translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.tl.png) + +1. Ipasok ang isang dulo ng Grove cable sa socket ng relay. Isang paraan lang ito maaaring ipasok. + +1. Kapag naka-off ang Raspberry Pi, ikonekta ang kabilang dulo ng Grove cable sa digital socket na may markang **D5** sa Grove Base Hat na nakakabit sa Pi. Ang socket na ito ay ang pangalawa mula sa kaliwa, sa hanay ng mga socket na malapit sa GPIO pins. Iwanang nakakonekta ang soil moisture sensor sa **A0** socket. + +![Ang Grove relay na nakakonekta sa D5 socket, at ang soil moisture sensor na nakakonekta sa A0 socket](../../../../../translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.tl.png) + +1. Ipasok ang soil moisture sensor sa lupa, kung hindi pa ito nakakabit mula sa nakaraang aralin. + +## Iprograma ang relay + +Ngayon ay maaaring i-program ang Raspberry Pi upang magamit ang nakakabit na relay. + +### Gawain + +Iprograma ang device. + +1. I-on ang Pi at hintaying mag-boot ito. + +1. Buksan ang proyekto na `soil-moisture-sensor` mula sa nakaraang aralin sa VS Code kung hindi pa ito nakabukas. Magdadagdag ka sa proyektong ito. + +1. Idagdag ang sumusunod na code sa file na `app.py` sa ibaba ng mga umiiral na imports: + + ```python + from grove.grove_relay import GroveRelay + ``` + + Ang statement na ito ay nag-i-import ng `GroveRelay` mula sa Grove Python libraries upang makipag-ugnayan sa Grove relay. + +1. Idagdag ang sumusunod na code sa ibaba ng deklarasyon ng klase na `ADC` upang lumikha ng isang `GroveRelay` instance: + + ```python + relay = GroveRelay(5) + ``` + + Ito ay lumilikha ng relay gamit ang pin **D5**, ang digital pin na kinonekta mo sa relay. + +1. Upang masubukan kung gumagana ang relay, idagdag ang sumusunod sa loob ng `while True:` loop: + + ```python + relay.on() + time.sleep(.5) + relay.off() + ``` + + Ang code na ito ay binubuksan ang relay, naghihintay ng 0.5 segundo, pagkatapos ay isinasara ang relay. + +1. Patakbuhin ang Python app. Ang relay ay mag-o-on at mag-o-off tuwing 10 segundo, na may kalahating segundong delay sa pagitan ng pag-on at pag-off. Maririnig mo ang relay na mag-click kapag nag-on at mag-click muli kapag nag-off. Ang LED sa Grove board ay iilaw kapag naka-on ang relay, at mamamatay kapag naka-off. + + ![Ang relay na nag-o-on at nag-o-off](../../../../../images/relay-turn-on-off.gif) + +## Kontrolin ang relay gamit ang soil moisture + +Ngayon na gumagana na ang relay, maaari na itong kontrolin batay sa mga pagbabasa ng soil moisture. + +### Gawain + +Kontrolin ang relay. + +1. Burahin ang 3 linya ng code na idinagdag mo upang subukan ang relay. Palitan ang mga ito ng sumusunod na code: + + ```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() + ``` + + Ang code na ito ay sinusuri ang antas ng soil moisture mula sa soil moisture sensor. Kapag ito ay higit sa 450, binubuksan nito ang relay, at isinasara ito kapag bumaba ito sa 450. + + > 💁 Tandaan na ang capacitive soil moisture sensor ay nagbabasa ng mas mababang antas ng soil moisture kapag mas maraming moisture ang nasa lupa, at kabaligtaran. + +1. Patakbuhin ang Python app. Makikita mo ang relay na mag-o-on o mag-o-off depende sa antas ng soil moisture. Subukan ito sa tuyong lupa, pagkatapos ay magdagdag ng tubig. + + ```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. + ``` + +> 💁 Makikita mo ang code na ito sa [code-relay/pi](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/pi) folder. + +😀 Tagumpay ang iyong programang nagkokontrol ng relay gamit ang soil moisture sensor! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md b/translations/tl/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md new file mode 100644 index 00000000..7241b875 --- /dev/null +++ b/translations/tl/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md @@ -0,0 +1,127 @@ + +# Kontrolin ang isang relay - Virtual na IoT Hardware + +Sa bahaging ito ng aralin, magdadagdag ka ng relay sa iyong virtual na IoT device bukod sa soil moisture sensor, at kokontrolin ito batay sa antas ng soil moisture. + +## Virtual na Hardware + +Ang virtual na IoT device ay gagamit ng simulated Grove relay. Pinapanatili nitong pareho ang lab na ito sa paggamit ng Raspberry Pi na may pisikal na Grove relay. + +Sa isang pisikal na IoT device, ang relay ay karaniwang-open relay (ibig sabihin, ang output circuit ay bukas o hindi konektado kapag walang signal na ipinadala sa relay). Ang ganitong relay ay maaaring mag-handle ng output circuits hanggang 250V at 10A. + +### Idagdag ang relay sa CounterFit + +Upang gumamit ng virtual na relay, kailangan mo itong idagdag sa CounterFit app. + +#### Gawain + +Idagdag ang relay sa CounterFit app. + +1. Buksan ang proyekto na `soil-moisture-sensor` mula sa nakaraang aralin sa VS Code kung hindi pa ito bukas. Magdadagdag ka sa proyektong ito. + +1. Siguraduhing tumatakbo ang CounterFit web app. + +1. Gumawa ng relay: + + 1. Sa *Create actuator* box sa *Actuators* pane, i-drop down ang *Actuator type* box at piliin ang *Relay*. + + 1. Itakda ang *Pin* sa *5*. + + 1. Piliin ang **Add** button upang gumawa ng relay sa Pin 5. + + ![Ang mga setting ng relay](../../../../../translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.tl.png) + + Ang relay ay malilikha at lilitaw sa listahan ng actuators. + + ![Ang relay na nalikha](../../../../../translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.tl.png) + +## I-program ang relay + +Ang soil moisture sensor app ay maaari nang i-program upang gamitin ang virtual na relay. + +### Gawain + +I-program ang virtual na device. + +1. Buksan ang proyekto na `soil-moisture-sensor` mula sa nakaraang aralin sa VS Code kung hindi pa ito bukas. Magdadagdag ka sa proyektong ito. + +1. Idagdag ang sumusunod na code sa file na `app.py` sa ibaba ng mga umiiral na imports: + + ```python + from counterfit_shims_grove.grove_relay import GroveRelay + ``` + + Ang pahayag na ito ay nag-i-import ng `GroveRelay` mula sa Grove Python shim libraries upang makipag-ugnayan sa virtual na Grove relay. + +1. Idagdag ang sumusunod na code sa ibaba ng deklarasyon ng klase na `ADC` upang gumawa ng instance ng `GroveRelay`: + + ```python + relay = GroveRelay(5) + ``` + + Gumagawa ito ng relay gamit ang pin **5**, ang pin na konektado mo sa relay. + +1. Upang subukan kung gumagana ang relay, idagdag ang sumusunod sa `while True:` loop: + + ```python + relay.on() + time.sleep(.5) + relay.off() + ``` + + Ang code ay i-o-on ang relay, maghihintay ng 0.5 segundo, pagkatapos ay i-o-off ang relay. + +1. Patakbuhin ang Python app. Ang relay ay mag-o-on at mag-o-off tuwing 10 segundo, na may kalahating segundo na delay sa pagitan ng pag-on at pag-off. Makikita mo ang virtual na relay sa CounterFit app na mag-close at mag-open habang ang relay ay nag-o-on at nag-o-off. + + ![Ang virtual na relay na nag-o-on at nag-o-off](../../../../../images/virtual-relay-turn-on-off.gif) + +## Kontrolin ang relay mula sa soil moisture + +Ngayon na gumagana ang relay, maaari na itong kontrolin batay sa mga readings ng soil moisture. + +### Gawain + +Kontrolin ang relay. + +1. Tanggalin ang 3 linya ng code na idinagdag mo upang subukan ang relay. Palitan ang mga ito ng sumusunod na code sa parehong lugar: + + ```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() + ``` + + Ang code na ito ay sinusuri ang antas ng soil moisture mula sa soil moisture sensor. Kapag ito ay higit sa 450, i-o-on nito ang relay, at i-o-off ito kapag bumaba sa 450. + + > 💁 Tandaan na ang capacitive soil moisture sensor ay nagbabasa ng mas mababang antas ng soil moisture kapag mas maraming moisture ang nasa lupa, at kabaliktaran. + +1. Patakbuhin ang Python app. Makikita mo ang relay na mag-o-on o mag-o-off depende sa antas ng soil moisture. Baguhin ang *Value* o ang *Random* settings para sa soil moisture sensor upang makita ang pagbabago ng halaga. + + ```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. + ``` + +> 💁 Makikita mo ang code na ito sa [code-relay/virtual-device](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/virtual-device) folder. + +😀 Tagumpay ang iyong virtual na soil moisture sensor na kumokontrol sa relay program! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md b/translations/tl/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md new file mode 100644 index 00000000..a5738cf5 --- /dev/null +++ b/translations/tl/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md @@ -0,0 +1,123 @@ + +# Kontrolin ang isang relay - Wio Terminal + +Sa bahaging ito ng aralin, magdadagdag ka ng relay sa iyong Wio Terminal bukod sa soil moisture sensor, at kokontrolin ito batay sa antas ng soil moisture. + +## Kagamitan + +Kailangan ng Wio Terminal ng isang relay. + +Ang relay na gagamitin mo ay isang [Grove relay](https://www.seeedstudio.com/Grove-Relay.html), isang normally-open relay (ibig sabihin, ang output circuit ay bukas o hindi konektado kapag walang signal na ipinapadala sa relay) na kayang mag-handle ng output circuits hanggang 250V at 10A. + +Isa itong digital actuator, kaya ikokonekta ito sa mga digital pins ng Wio Terminal. Ang pinagsamang analog/digital port ay ginagamit na ng soil moisture sensor, kaya ikokonekta ito sa isa pang port, na isang pinagsamang I + +### Ikonekta ang relay + +Ang Grove relay ay maaaring ikonekta sa digital port ng Wio Terminal. + +#### Gawain + +Ikonekta ang relay. + +![Isang Grove relay](../../../../../translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.tl.png) + +1. Ipasok ang isang dulo ng Grove cable sa socket ng relay. Isang paraan lang ito maaaring ipasok. + +1. Kapag ang Wio Terminal ay hindi nakakonekta sa iyong computer o ibang power supply, ikonekta ang kabilang dulo ng Grove cable sa kaliwang Grove socket ng Wio Terminal habang nakaharap ka sa screen. Iwanang nakakonekta ang soil moisture sensor sa kanang socket. + +![Ang Grove relay na nakakonekta sa kaliwang socket, at ang soil moisture sensor na nakakonekta sa kanang socket](../../../../../translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.tl.png) + +1. Ipasok ang soil moisture sensor sa lupa, kung hindi pa ito nakakabit mula sa nakaraang aralin. + +## I-program ang relay + +Ngayon ay maaaring i-program ang Wio Terminal upang magamit ang nakakabit na relay. + +### Gawain + +I-program ang device. + +1. Buksan ang proyekto na `soil-moisture-sensor` mula sa nakaraang aralin sa VS Code kung hindi pa ito nakabukas. Magdadagdag ka sa proyektong ito. + +2. Walang library para sa actuator na ito - isa itong digital actuator na kinokontrol gamit ang high o low signal. Upang i-on ito, magpapadala ka ng high signal sa pin (3.3V), at upang i-off ito, magpapadala ka ng low signal (0V). Magagawa ito gamit ang built-in na Arduino [`digitalWrite`](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/) function. Simulan sa pamamagitan ng pagdaragdag ng sumusunod sa ibaba ng `setup` function upang i-setup ang pinagsamang I + +C/digital port bilang isang output pin upang magpadala ng boltahe sa relay: + + ```cpp + pinMode(PIN_WIRE_SCL, OUTPUT); + ``` + + Ang `PIN_WIRE_SCL` ay ang port number para sa pinagsamang I + +1. Upang masubukan kung gumagana ang relay, idagdag ang sumusunod sa `loop` function, sa ibaba ng huling `delay`: + + ```cpp + digitalWrite(PIN_WIRE_SCL, HIGH); + delay(500); + digitalWrite(PIN_WIRE_SCL, LOW); + ``` + + Ang code ay nagsusulat ng high signal sa pin kung saan nakakonekta ang relay upang i-on ito, naghihintay ng 500ms (kalahating segundo), pagkatapos ay nagsusulat ng low signal upang i-off ang relay. + +1. I-build at i-upload ang code sa Wio Terminal. + +1. Kapag na-upload na, ang relay ay mag-o-on at mag-o-off bawat 10 segundo, na may kalahating segundong delay sa pagitan ng pag-on at pag-off. Maririnig mo ang relay na mag-click kapag nag-o-on at mag-click muli kapag nag-o-off. Ang isang LED sa Grove board ay iilaw kapag naka-on ang relay, at mamamatay kapag naka-off. + + ![Ang relay na nag-o-on at nag-o-off](../../../../../images/relay-turn-on-off.gif) + +## Kontrolin ang relay gamit ang soil moisture + +Ngayon na gumagana na ang relay, maaari na itong kontrolin batay sa mga pagbabasa ng soil moisture sensor. + +### Gawain + +Kontrolin ang relay. + +1. Burahin ang 3 linya ng code na idinagdag mo upang subukan ang relay. Palitan ang mga ito ng sumusunod na code: + + ```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); + } + ``` + + Ang code na ito ay sinusuri ang antas ng soil moisture mula sa soil moisture sensor. Kapag ito ay higit sa 450, ini-on nito ang relay, at ini-off ito kapag bumaba sa 450. + + > 💁 Tandaan na ang capacitive soil moisture sensor ay nagbabasa ng mas mababang antas ng soil moisture kapag mas maraming moisture ang nasa lupa, at kabaligtaran. + +1. I-build at i-upload ang code sa Wio Terminal. + +1. I-monitor ang device gamit ang serial monitor. Makikita mo ang relay na nag-o-on o nag-o-off depende sa antas ng soil moisture. Subukan ito sa tuyong lupa, pagkatapos ay magdagdag ng tubig. + + ```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. + ``` + +> 💁 Maaari mong mahanap ang code na ito sa [code-relay/wio-terminal](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/wio-terminal) folder. + +😀 Tagumpay ang iyong soil moisture sensor na kumokontrol sa relay program! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md b/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md new file mode 100644 index 00000000..2fd02bed --- /dev/null +++ b/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md @@ -0,0 +1,451 @@ + +# Ilipat ang iyong halaman sa cloud + +![Isang sketchnote na buod ng araling ito](../../../../../translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.tl.jpg) + +> Sketchnote ni [Nitya Narasimhan](https://github.com/nitya). I-click ang larawan para sa mas malaking bersyon. + +Ang araling ito ay itinuro bilang bahagi ng [IoT for Beginners Project 2 - Digital Agriculture series](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) mula sa [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Ikonekta ang iyong device sa cloud gamit ang Azure IoT Hub](https://img.youtube.com/vi/bNxjopXkhvk/0.jpg)](https://youtu.be/bNxjopXkhvk) + +## Pre-lecture quiz + +[Pre-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/15) + +## Panimula + +Sa nakaraang aralin, natutunan mo kung paano ikonekta ang iyong halaman sa isang MQTT broker at kontrolin ang isang relay mula sa server code na tumatakbo nang lokal. Ito ang pangunahing bahagi ng isang internet-connected automated watering system na ginagamit mula sa mga indibidwal na halaman sa bahay hanggang sa mga komersyal na sakahan. + +Ang IoT device ay nakipag-ugnayan sa isang pampublikong MQTT broker bilang paraan upang ipakita ang mga prinsipyo, ngunit hindi ito ang pinaka-maaasahan o ligtas na paraan. Sa araling ito, matututo ka tungkol sa cloud at ang mga kakayahan ng IoT na ibinibigay ng mga pampublikong cloud services. Matututo ka rin kung paano ilipat ang iyong halaman sa isa sa mga cloud services na ito mula sa pampublikong MQTT broker. + +Sa araling ito, tatalakayin natin ang: + +* [Ano ang cloud?](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Gumawa ng cloud subscription](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Mga serbisyo ng Cloud IoT](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Gumawa ng IoT service sa cloud](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Makipag-ugnayan sa IoT Hub](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Ikonekta ang iyong device sa IoT service](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) + +## Ano ang cloud? + +Bago ang cloud, kapag ang isang kumpanya ay gustong magbigay ng mga serbisyo sa kanilang mga empleyado (tulad ng mga database o file storage), o sa publiko (tulad ng mga website), sila ay magtatayo at magpapatakbo ng data center. Ito ay maaaring isang silid na may kaunting mga computer, o isang gusali na may maraming computer. Ang kumpanya ang nangangasiwa sa lahat, kabilang ang: + +* Pagbili ng mga computer +* Pagpapanatili ng hardware +* Kuryente at pagpapalamig +* Networking +* Seguridad, kabilang ang seguridad ng gusali at seguridad ng software sa mga computer +* Pag-install at pag-update ng software + +Napakamahal nito, nangangailangan ng malawak na hanay ng mga bihasang empleyado, at napakabagal baguhin kapag kinakailangan. Halimbawa, kung ang isang online store ay kailangang magplano para sa abalang holiday season, kailangan nilang magplano ng ilang buwan nang maaga upang bumili ng mas maraming hardware, i-configure ito, i-install ito, at i-install ang software upang patakbuhin ang kanilang proseso ng pagbebenta. Pagkatapos ng holiday season at bumaba ang mga benta, maiiwan silang may mga computer na binayaran nila ngunit hindi nagagamit hanggang sa susunod na abalang panahon. + +✅ Sa tingin mo ba ay magpapahintulot ito sa mga kumpanya na mabilis na makakilos? Kung ang isang online na tindahan ng damit ay biglang sumikat dahil sa isang sikat na tao na nakitang suot ang kanilang damit, magagawa ba nilang mabilis na dagdagan ang kanilang computing power upang suportahan ang biglaang pagdami ng mga order? + +### Computer ng iba + +Ang cloud ay madalas na tinutukoy nang pabiro bilang 'computer ng iba'. Ang pangunahing ideya ay simple - sa halip na bumili ng mga computer, magrenta ka ng computer ng iba. Ang ibang tao, isang cloud computing provider, ang magpapatakbo ng malalaking data center. Sila ang bahala sa pagbili at pag-install ng hardware, pamamahala ng kuryente at pagpapalamig, networking, seguridad ng gusali, mga update sa hardware at software, lahat. Bilang isang customer, magrerenta ka ng mga computer na kailangan mo, magrerenta ng mas marami kapag tumaas ang demand, at babawasan ang bilang na nirenta kapag bumaba ang demand. Ang mga cloud data center na ito ay matatagpuan sa buong mundo. + +![Isang Microsoft cloud data center](../../../../../translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.tl.png) +![Isang planong pagpapalawak ng Microsoft cloud data center](../../../../../translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.tl.png) + +Ang mga data center na ito ay maaaring umabot ng ilang kilometro kuwadrado ang laki. Ang mga larawan sa itaas ay kuha ilang taon na ang nakalipas sa isang Microsoft cloud data center, at ipinapakita ang orihinal na laki, kasama ang planong pagpapalawak. Ang lugar na nilinis para sa pagpapalawak ay higit sa 5 kilometro kuwadrado. + +> 💁 Ang mga data center na ito ay nangangailangan ng napakalaking dami ng kuryente kaya ang ilan ay may sariling mga power station. Dahil sa kanilang laki at antas ng pamumuhunan mula sa mga cloud provider, karaniwan silang napaka-environmentally friendly. Mas mahusay sila kaysa sa napakaraming maliliit na data center, tumatakbo sila karamihan sa renewable energy, at ang mga cloud provider ay nagsusumikap na bawasan ang basura, bawasan ang paggamit ng tubig, at magtanim muli ng mga kagubatan upang palitan ang mga pinutol para magbigay ng espasyo para sa pagtatayo ng data center. Maaari kang magbasa pa tungkol sa kung paano nagtatrabaho ang isang cloud provider sa sustainability sa [Azure sustainability site](https://azure.microsoft.com/global-infrastructure/sustainability/?WT.mc_id=academic-17441-jabenn). + +✅ Mag-research: Magbasa tungkol sa mga pangunahing cloud tulad ng [Azure mula sa Microsoft](https://azure.microsoft.com/?WT.mc_id=academic-17441-jabenn) o [GCP mula sa Google](https://cloud.google.com). Ilan ang kanilang mga data center, at saan matatagpuan ang mga ito sa mundo? + +Ang paggamit ng cloud ay nakakatipid ng gastos para sa mga kumpanya, at nagbibigay-daan sa kanila na mag-focus sa kanilang ginagawa nang pinakamahusay, iniiwan ang cloud computing expertise sa kamay ng provider. Hindi na kailangang magrenta o bumili ng espasyo sa data center, magbayad sa iba't ibang provider para sa koneksyon at kuryente, o mag-empleyo ng mga eksperto. Sa halip, maaari silang magbayad ng isang buwanang bayarin sa cloud provider upang maasikaso ang lahat. + +Ang cloud provider naman ay maaaring gumamit ng economies of scale upang mapababa ang mga gastos, bumili ng mga computer nang maramihan sa mas mababang presyo, mamuhunan sa mga tool upang mabawasan ang kanilang workload para sa maintenance, at kahit magdisenyo at magtayo ng sarili nilang hardware upang mapabuti ang kanilang cloud offering. + +### Microsoft Azure + +Ang Azure ay ang developer cloud mula sa Microsoft, at ito ang cloud na gagamitin mo para sa mga araling ito. Ang video sa ibaba ay nagbibigay ng maikling buod ng Azure: + +[![Buod ng Azure video](../../../../../translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.tl.png)](https://www.microsoft.com/videoplayer/embed/RE4Ibng?WT.mc_id=academic-17441-jabenn) + +## Gumawa ng cloud subscription + +Upang magamit ang mga serbisyo sa cloud, kailangan mong mag-sign up para sa isang subscription sa isang cloud provider. Para sa araling ito, mag-sign up ka para sa isang Microsoft Azure subscription. Kung mayroon ka nang Azure subscription, maaari mong laktawan ang gawaing ito. Ang mga detalye ng subscription na inilarawan dito ay tama sa oras ng pagsulat, ngunit maaaring magbago. + +> 💁 Kung ina-access mo ang mga araling ito sa pamamagitan ng iyong paaralan, maaaring mayroon ka nang Azure subscription na magagamit. Kumonsulta sa iyong guro. + +Mayroong dalawang uri ng libreng Azure subscription na maaari mong i-sign up: + +* **Azure for Students** - Isang subscription na idinisenyo para sa mga estudyanteng 18+. Hindi mo kailangan ng credit card upang mag-sign up, at gagamitin mo ang iyong school email address upang ma-validate na ikaw ay isang estudyante. Kapag nag-sign up ka, makakakuha ka ng US$100 na magagamit sa mga cloud resources, kasama ang mga libreng serbisyo kabilang ang isang libreng bersyon ng IoT service. Tumagal ito ng 12 buwan, at maaari mong i-renew bawat taon na ikaw ay nananatiling estudyante. + +* **Azure free subscription** - Isang subscription para sa sinumang hindi estudyante. Kakailanganin mo ng credit card upang mag-sign up para sa subscription, ngunit ang iyong card ay hindi sisingilin, ito ay ginagamit lamang upang i-verify na ikaw ay isang totoong tao, hindi isang bot. Makakakuha ka ng $200 na credit na magagamit sa unang 30 araw sa anumang serbisyo, kasama ang mga libreng tier ng Azure services. Kapag nagamit na ang iyong credit, ang iyong card ay hindi sisingilin maliban kung iko-convert mo ito sa isang pay-as-you-go subscription. + +> 💁 Nag-aalok ang Microsoft ng Azure for Students Starter subscription para sa mga estudyanteng wala pang 18, ngunit sa oras ng pagsulat, hindi nito sinusuportahan ang anumang IoT services. + +### Gawain - mag-sign up para sa isang libreng cloud subscription + +Kung ikaw ay isang estudyanteng 18+, maaari kang mag-sign up para sa isang Azure for Students subscription. Kakailanganin mong mag-validate gamit ang isang school email address. Maaari mo itong gawin sa dalawang paraan: + +* Mag-sign up para sa isang GitHub student developer pack sa [education.github.com/pack](https://education.github.com/pack). Bibigyan ka nito ng access sa iba't ibang mga tool at alok, kabilang ang GitHub at Microsoft Azure. Kapag nag-sign up ka para sa developer pack, maaari mong i-activate ang Azure for Students offer. + +* Mag-sign up nang direkta para sa isang Azure for Students account sa [azure.microsoft.com/free/students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-17441-jabenn). + +> ⚠️ Kung ang iyong school email address ay hindi kinikilala, mag-raise ng [issue sa repo na ito](https://github.com/Microsoft/IoT-For-Beginners/issues) at titingnan namin kung maaari itong maidagdag sa Azure for Students allow list. + +Kung hindi ka estudyante, o wala kang valid na school email address, maaari kang mag-sign up para sa isang Azure Free subscription. + +* Mag-sign up para sa isang Azure Free Subscription sa [azure.microsoft.com/free](https://azure.microsoft.com/free/?WT.mc_id=academic-17441-jabenn) + +## Mga serbisyo ng Cloud IoT + +Ang pampublikong test MQTT broker na ginagamit mo ay isang mahusay na tool kapag nag-aaral, ngunit may ilang mga kakulangan bilang isang tool na gagamitin sa isang komersyal na setting: + +* **Kahusayan** - ito ay isang libreng serbisyo na walang garantiya, at maaaring patayin anumang oras +* **Seguridad** - ito ay pampubliko, kaya maaaring makinig ang sinuman sa iyong telemetry o magpadala ng mga utos upang kontrolin ang iyong hardware +* **Pagganap** - ito ay idinisenyo para lamang sa ilang test messages, kaya hindi nito kayang suportahan ang malaking dami ng mga mensahe +* **Pagtuklas** - walang paraan upang malaman kung anong mga device ang nakakonekta + +Ang mga IoT services sa cloud ay nilulutas ang mga problemang ito. Pinapanatili ito ng malalaking cloud provider na malaki ang pamumuhunan sa kahusayan at handang ayusin ang anumang mga isyu na maaaring lumitaw. Mayroon silang built-in na seguridad upang pigilan ang mga hacker na basahin ang iyong data o magpadala ng mga maling utos. Mataas din ang kanilang pagganap, kayang hawakan ang maraming milyong mensahe araw-araw, gamit ang cloud upang mag-scale ayon sa pangangailangan. + +> 💁 Bagama't may bayad ang mga benepisyong ito sa isang buwanang bayarin, karamihan sa mga cloud provider ay nag-aalok ng libreng bersyon ng kanilang IoT service na may limitadong dami ng mga mensahe bawat araw o mga device na maaaring kumonekta. Ang libreng bersyon na ito ay karaniwang higit pa sa sapat para sa isang developer upang matutunan ang serbisyo. Sa araling ito, gagamit ka ng libreng bersyon. + +Ang mga IoT device ay kumokonekta sa isang cloud service alinman sa pamamagitan ng isang device SDK (isang library na nagbibigay ng code upang gumana sa mga tampok ng serbisyo), o direkta sa pamamagitan ng isang communication protocol tulad ng MQTT o HTTP. Ang device SDK ay karaniwang pinakamadaling ruta dahil ito ang bahala sa lahat, tulad ng pag-alam kung anong mga topic ang ipo-publish o susubaybayan, at kung paano hahawakan ang seguridad. + +![Ang mga device ay kumokonekta sa isang serbisyo gamit ang isang device SDK. Ang server code ay kumokonekta rin sa serbisyo sa pamamagitan ng isang SDK](../../../../../translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.tl.png) + +Ang iyong device ay nakikipag-ugnayan sa iba pang bahagi ng iyong application sa pamamagitan ng serbisyong ito - katulad ng kung paano ka nagpadala ng telemetry at tumanggap ng mga utos sa pamamagitan ng MQTT. Karaniwan itong ginagawa gamit ang isang service SDK o isang katulad na library. Ang mga mensahe ay nagmumula sa iyong device patungo sa serbisyo kung saan mababasa ito ng iba pang bahagi ng iyong application, at ang mga mensahe ay maaaring ipadala pabalik sa iyong device. + +![Ang mga device na walang wastong secret key ay hindi makakonekta sa IoT service](../../../../../translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.tl.png) + +Ang mga serbisyong ito ay nagpapatupad ng seguridad sa pamamagitan ng pag-alam sa lahat ng mga device na maaaring kumonekta at magpadala ng data, alinman sa pamamagitan ng pre-registration ng mga device sa serbisyo, o sa pamamagitan ng pagbibigay sa mga device ng mga secret key o certificate na maaari nilang gamitin upang irehistro ang kanilang sarili sa serbisyo sa unang pagkakataon na sila ay kumonekta. Ang mga hindi kilalang device ay hindi makakonekta; kung susubukan nila, tatanggihan ng serbisyo ang koneksyon at babalewalain ang mga mensaheng ipinadala nila. + +✅ Mag-research: Ano ang downside ng pagkakaroon ng isang open IoT service kung saan maaaring kumonekta ang anumang device o code? Makakahanap ka ba ng mga partikular na halimbawa ng mga hacker na sinasamantala ito? + +Ang iba pang bahagi ng iyong application ay maaaring kumonekta sa IoT service at malaman ang tungkol sa lahat ng mga device na nakakonekta o nakarehistro, at makipag-ugnayan sa kanila nang direkta, sa maramihan o paisa-isa. +💁 Ang mga serbisyo ng IoT ay nag-aalok din ng karagdagang kakayahan, at ang mga cloud provider ay may mga karagdagang serbisyo at aplikasyon na maaaring ikonekta sa serbisyo. Halimbawa, kung nais mong iimbak ang lahat ng telemetry na mensahe na ipinadala ng lahat ng mga device sa isang database, kadalasan ay ilang click lamang sa tool ng configuration ng cloud provider upang ikonekta ang serbisyo sa isang database at i-stream ang data papasok. +## Gumawa ng IoT service sa cloud + +Ngayon na mayroon ka nang Azure subscription, maaari kang mag-sign up para sa isang IoT service. Ang IoT service mula sa Microsoft ay tinatawag na Azure IoT Hub. + +![Ang logo ng Azure IoT Hub](../../../../../translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.tl.png) + +Ang video sa ibaba ay nagbibigay ng maikling overview ng Azure IoT Hub: + +[![Overview ng Azure IoT Hub video](https://img.youtube.com/vi/smuZaZZXKsU/0.jpg)](https://www.youtube.com/watch?v=smuZaZZXKsU) + +> 🎥 I-click ang imahe sa itaas para panoorin ang video + +✅ Maglaan ng oras para mag-research at basahin ang overview ng IoT Hub sa [Microsoft IoT Hub documentation](https://docs.microsoft.com/azure/iot-hub/about-iot-hub?WT.mc_id=academic-17441-jabenn). + +Ang mga cloud services na available sa Azure ay maaaring i-configure gamit ang web-based portal, o sa pamamagitan ng command-line interface (CLI). Para sa task na ito, gagamitin mo ang CLI. + +### Task - i-install ang Azure CLI + +Para magamit ang Azure CLI, kailangan muna itong i-install sa iyong PC o Mac. + +1. Sundin ang mga tagubilin sa [Azure CLI documentation](https://docs.microsoft.com/cli/azure/install-azure-cli?WT.mc_id=academic-17441-jabenn) para i-install ang CLI. + +1. Ang Azure CLI ay sumusuporta sa iba't ibang extensions na nagdadagdag ng kakayahan para pamahalaan ang malawak na hanay ng Azure services. I-install ang IoT extension sa pamamagitan ng pag-run ng sumusunod na command mula sa iyong command line o terminal: + + ```sh + az extension add --name azure-iot + ``` + +1. Mula sa iyong command line o terminal, i-run ang sumusunod na command para mag-log in sa iyong Azure subscription gamit ang Azure CLI. + + ```sh + az login + ``` + + Magbubukas ang isang web page sa iyong default browser. Mag-log in gamit ang account na ginamit mo para mag-sign up sa iyong Azure subscription. Kapag naka-log in ka na, maaari mong isara ang browser tab. + +1. Kung mayroon kang maraming Azure subscriptions, tulad ng isang school-provided subscription at ang iyong sariling Azure for Students subscription, kailangan mong piliin ang subscription na gusto mong gamitin. I-run ang sumusunod na command para makita ang lahat ng subscriptions na mayroon kang access: + + ```sh + az account list --output table + ``` + + Sa output, makikita mo ang pangalan ng bawat subscription kasama ang `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 + ``` + + Para piliin ang subscription na gusto mong gamitin, gamitin ang sumusunod na command: + + ```sh + az account set --subscription + ``` + + Palitan ang `` ng Id ng subscription na gusto mong gamitin. Pagkatapos i-run ang command na ito, i-run muli ang command para makita ang iyong mga accounts. Makikita mo na ang `IsDefault` column ay naka-mark bilang `True` para sa subscription na kakapili mo lang. + +### Task - gumawa ng resource group + +Ang mga Azure services, tulad ng IoT Hub instances, virtual machines, databases, o AI services, ay tinatawag na **resources**. Ang bawat resource ay kailangang nasa loob ng isang **Resource Group**, isang lohikal na grupo ng isa o higit pang resources. + +> 💁 Ang paggamit ng resource groups ay nangangahulugan na maaari mong pamahalaan ang maraming services nang sabay-sabay. Halimbawa, kapag natapos mo na ang lahat ng lessons para sa proyektong ito, maaari mong i-delete ang resource group, at lahat ng resources sa loob nito ay awtomatikong made-delete. + +1. Mayroong maraming Azure data centers sa buong mundo, na hinati sa mga rehiyon. Kapag gumagawa ka ng Azure resource o resource group, kailangan mong tukuyin kung saan mo ito gustong gawin. I-run ang sumusunod na command para makuha ang listahan ng mga lokasyon: + + ```sh + az account list-locations --output table + ``` + + Makikita mo ang listahan ng mga lokasyon. Mahaba ang listahan na ito. + + > 💁 Sa oras ng pagsulat, mayroong 65 lokasyon kung saan maaari kang mag-deploy. + + ```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 + ... + ``` + + Tandaan ang value mula sa `Name` column ng rehiyon na pinakamalapit sa iyo. Maaari mong makita ang mga rehiyon sa mapa sa [Azure geographies page](https://azure.microsoft.com/global-infrastructure/geographies/?WT.mc_id=academic-17441-jabenn). + +1. I-run ang sumusunod na command para gumawa ng resource group na tinatawag na `soil-moisture-sensor`. Ang mga pangalan ng resource group ay kailangang unique sa iyong subscription. + + ```sh + az group create --name soil-moisture-sensor \ + --location + ``` + + Palitan ang `` ng lokasyon na pinili mo sa nakaraang hakbang. + +### Task - gumawa ng IoT Hub + +Ngayon ay maaari ka nang gumawa ng IoT Hub resource sa iyong resource group. + +1. Gamitin ang sumusunod na command para gumawa ng IoT Hub resource: + + ```sh + az iot hub create --resource-group soil-moisture-sensor \ + --sku F1 \ + --partition-count 2 \ + --name + ``` + + Palitan ang `` ng pangalan para sa iyong hub. Ang pangalan na ito ay kailangang globally unique - ibig sabihin, walang ibang IoT Hub na ginawa ng kahit sino ang maaaring magkaroon ng parehong pangalan. Ang pangalan na ito ay ginagamit sa isang URL na tumutukoy sa hub, kaya kailangang unique. Gumamit ng isang bagay tulad ng `soil-moisture-sensor-` at magdagdag ng unique identifier sa dulo, tulad ng ilang random na salita o ang iyong pangalan. + + Ang `--sku F1` option ay nagsasabi na gamitin ang free tier. Ang free tier ay sumusuporta sa 8,000 messages kada araw kasama ang karamihan sa mga features ng full-price tiers. + + > 🎓 Ang iba't ibang pricing levels ng Azure services ay tinatawag na tiers. Ang bawat tier ay may iba't ibang halaga at nagbibigay ng iba't ibang features o data volumes. + + > 💁 Kung gusto mong matuto pa tungkol sa pricing, maaari mong tingnan ang [Azure IoT Hub pricing guide](https://azure.microsoft.com/pricing/details/iot-hub/?WT.mc_id=academic-17441-jabenn). + + Ang `--partition-count 2` option ay nagde-define kung ilang streams ng data ang sinusuportahan ng IoT Hub, mas maraming partitions ang nagbabawas ng data blocking kapag maraming bagay ang nagbabasa at nagsusulat mula sa IoT Hub. Ang partitions ay labas sa saklaw ng mga lessons na ito, ngunit ang value na ito ay kailangang i-set para makagawa ng free tier IoT Hub. + + > 💁 Maaari ka lamang magkaroon ng isang free tier IoT Hub kada subscription. + +Ang IoT Hub ay gagawin. Maaaring tumagal ng isang minuto o higit pa para makumpleto ito. + +## Makipag-ugnayan sa IoT Hub + +Sa nakaraang lesson, ginamit mo ang MQTT at nagpadala ng mga mensahe pabalik-balik sa iba't ibang topics, na may iba't ibang layunin ang bawat topic. Sa halip na magpadala ng mga mensahe sa iba't ibang topics, ang IoT Hub ay may ilang defined na paraan para makipag-ugnayan ang device sa Hub, o ang Hub sa device. + +> 💁 Sa ilalim ng hood, ang komunikasyon sa pagitan ng IoT Hub at ng iyong device ay maaaring gumamit ng MQTT, HTTPS, o AMQP. + +* Mga mensahe mula sa device papunta sa cloud (D2C) - ito ay mga mensahe na ipinapadala mula sa isang device papunta sa IoT Hub, tulad ng telemetry. Maaari itong basahin mula sa IoT Hub ng iyong application code. + + > 🎓 Sa ilalim ng hood, ang IoT Hub ay gumagamit ng Azure service na tinatawag na [Event Hubs](https://docs.microsoft.com/azure/event-hubs/?WT.mc_id=academic-17441-jabenn). Kapag nagsusulat ka ng code para basahin ang mga mensaheng ipinadala sa hub, madalas itong tinatawag na events. + +* Mga mensahe mula sa cloud papunta sa device (C2D) - ito ay mga mensahe na ipinapadala mula sa application code, sa pamamagitan ng IoT Hub papunta sa IoT device. + +* Mga direct method requests - ito ay mga mensahe na ipinapadala mula sa application code sa pamamagitan ng IoT Hub papunta sa IoT device para hilingin na gawin ng device ang isang bagay, tulad ng pag-control sa actuator. Ang mga mensaheng ito ay nangangailangan ng response para malaman ng iyong application code kung ito ay matagumpay na naiproseso. + +* Device twins - ito ay mga JSON documents na synchronized sa pagitan ng device at IoT Hub, at ginagamit para mag-store ng settings o iba pang properties na ini-report ng device, o dapat i-set sa device (tinatawag na desired) ng IoT Hub. + +Ang IoT Hub ay maaaring mag-store ng mga mensahe at direct method requests para sa isang configurable na panahon (default ay isang araw), kaya kung ang isang device o application code ay nawalan ng koneksyon, maaari pa rin nitong makuha ang mga mensaheng ipinadala habang offline ito kapag nag-reconnect. Ang device twins ay permanenteng naka-store sa IoT Hub, kaya anumang oras ay maaaring mag-reconnect ang device at makuha ang pinakabagong device twin. + +✅ Mag-research: Basahin ang higit pa tungkol sa mga uri ng mensahe sa [Device-to-cloud communications guidance](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-d2c-guidance?WT.mc_id=academic-17441-jabenn), at ang [Cloud-to-device communications guidance](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-c2d-guidance?WT.mc_id=academic-17441-jabenn) sa IoT Hub documentation. + +## Ikonekta ang iyong device sa IoT service + +Kapag nagawa na ang hub, maaari nang kumonekta ang iyong IoT device dito. Ang mga registered devices lamang ang maaaring kumonekta sa service, kaya kailangan mo munang i-register ang iyong device. Kapag nag-register ka, makakakuha ka ng connection string na magagamit ng device para kumonekta. Ang connection string na ito ay specific sa device, at naglalaman ng impormasyon tungkol sa IoT Hub, sa device, at isang secret key na magpapahintulot sa device na kumonekta. + +> 🎓 Ang connection string ay isang generic na term para sa isang piraso ng text na naglalaman ng connection details. Ginagamit ang mga ito kapag kumokonekta sa IoT Hubs, databases, at maraming iba pang services. Karaniwan itong binubuo ng identifier para sa service, tulad ng URL, at security information tulad ng secret key. Ang mga ito ay ipinapasa sa SDKs para kumonekta sa service. + +> ⚠️ Ang connection strings ay dapat panatilihing secure! Ang seguridad ay tatalakayin nang mas detalyado sa susunod na lesson. + +### Task - i-register ang iyong IoT device + +Ang IoT device ay maaaring i-register sa iyong IoT Hub gamit ang Azure CLI. + +1. I-run ang sumusunod na command para i-register ang isang device: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor \ + --hub-name + ``` + + Palitan ang `` ng pangalan na ginamit mo para sa iyong IoT Hub. + + Ito ay gagawa ng device na may ID na `soil-moisture-sensor`. + +1. Kapag kumonekta ang iyong IoT device sa iyong IoT Hub gamit ang SDK, kailangan nitong gumamit ng connection string na nagbibigay ng URL ng hub, kasama ang secret key. I-run ang sumusunod na command para makuha ang connection string: + + ```sh + az iot hub device-identity connection-string show --device-id soil-moisture-sensor \ + --output table \ + --hub-name + ``` + + Palitan ang `` ng pangalan na ginamit mo para sa iyong IoT Hub. + +1. I-store ang connection string na ipinakita sa output dahil kakailanganin mo ito mamaya. + +### Task - ikonekta ang iyong IoT device sa cloud + +Sundin ang kaukulang guide para ikonekta ang iyong IoT device sa cloud: + +* [Arduino - Wio Terminal](wio-terminal-connect-hub.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-connect-hub.md) + +### Task - i-monitor ang events + +Sa ngayon, hindi mo muna ia-update ang iyong server code. Sa halip, maaari mong gamitin ang Azure CLI para i-monitor ang events mula sa iyong IoT device. + +1. Siguraduhin na ang iyong IoT device ay tumatakbo at nagpapadala ng soil moisture telemetry values. + +1. I-run ang sumusunod na command sa iyong command prompt o terminal para i-monitor ang mga mensaheng ipinadala sa iyong IoT Hub: + + ```sh + az iot hub monitor-events --hub-name + ``` + + Palitan ang `` ng pangalan na ginamit mo para sa iyong IoT Hub. + + Makikita mo ang mga mensahe na lumalabas sa console output habang ipinapadala ito ng iyong IoT device. + + ```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}" + } + } + ``` + + Ang nilalaman ng `payload` ay magmamatch sa mensaheng ipinadala ng iyong IoT device. + + > Sa oras ng pagsulat, ang `az iot` extension ay hindi pa ganap na gumagana sa Apple Silicon. Kung gumagamit ka ng Apple Silicon device, kailangan mong i-monitor ang mga mensahe sa ibang paraan, tulad ng paggamit ng [Azure IoT Tools para sa Visual Studio Code](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-vscode-iot-toolkit-cloud-device-messaging). + +1. Ang mga mensaheng ito ay may ilang properties na awtomatikong naka-attach sa kanila, tulad ng timestamp kung kailan sila ipinadala. Ang mga ito ay tinatawag na *annotations*. Para makita ang lahat ng message annotations, gamitin ang sumusunod na command: + + ```sh + az iot hub monitor-events --properties anno --hub-name + ``` + + Palitan ang `` ng pangalan na ginamit mo para sa iyong IoT Hub. + + Makikita mo ang mga mensahe na lumalabas sa console output habang ipinapadala ito ng iyong IoT device. + + ```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}" + } + } + ``` + + Ang mga time values sa annotations ay nasa [UNIX time](https://wikipedia.org/wiki/Unix_time), na kumakatawan sa bilang ng mga segundo mula sa hatinggabi noong 1st Enero 1970. + + Lumabas sa event monitor kapag tapos ka na. + +### Task - kontrolin ang iyong IoT device + +Maaari mo ring gamitin ang Azure CLI para tawagin ang direct methods sa iyong IoT device. + +1. I-run ang sumusunod na command sa iyong command prompt o terminal para i-invoke ang `relay_on` method sa IoT device: + + ```sh + az iot hub invoke-device-method --device-id soil-moisture-sensor \ + --method-name relay_on \ + --method-payload '{}' \ + --hub-name + ``` + + Palitan ang ` + +` gamit ang pangalan na ginamit mo para sa iyong IoT Hub. + + Ito ay nagpapadala ng direktang kahilingan para sa method na tinukoy sa `method-name`. Ang mga direktang method ay maaaring magdala ng payload na naglalaman ng data para sa method, at ito ay maaaring tukuyin sa parameter na `method-payload` bilang JSON. + + Makikita mo ang relay na magbukas, at ang kaukulang output mula sa iyong IoT device: + + ```output + Direct method received - relay_on + ``` + +1. Ulitin ang hakbang sa itaas, ngunit itakda ang `--method-name` sa `relay_off`. Makikita mo ang relay na magsara at ang kaukulang output mula sa IoT device. + +--- + +## 🚀 Hamon + +Ang libreng tier ng IoT Hub ay nagpapahintulot ng 8,000 mensahe kada araw. Ang code na ginawa mo ay nagpapadala ng telemetry messages tuwing 10 segundo. Ilang mensahe ang maipapadala sa isang araw kung ang isang mensahe ay ipinapadala tuwing 10 segundo? + +Pag-isipan kung gaano kadalas dapat ipadala ang mga sukat ng soil moisture? Paano mo mababago ang iyong code upang manatili sa loob ng libreng tier at masuri nang madalas ngunit hindi sobra? Paano kung gusto mong magdagdag ng pangalawang device? + +## Quiz pagkatapos ng lektura + +[Quiz pagkatapos ng lektura](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/16) + +## Review at Pag-aaral sa Sarili + +Ang IoT Hub SDK ay open source para sa parehong Arduino at Python. Sa mga code repos sa GitHub, mayroong iba't ibang mga halimbawa na nagpapakita kung paano gamitin ang iba't ibang tampok ng IoT Hub. + +* Kung gumagamit ka ng Wio Terminal, tingnan ang [Arduino samples sa GitHub](https://github.com/Azure/azure-iot-pal-arduino/tree/master/pal/samples) +* Kung gumagamit ka ng Raspberry Pi o Virtual device, tingnan ang [Python samples sa GitHub](https://github.com/Azure/azure-iot-sdk-python/tree/master/azure-iot-hub/samples) + +## Takdang Aralin + +[Alamin ang tungkol sa cloud services](assignment.md) + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md b/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md new file mode 100644 index 00000000..429e119f --- /dev/null +++ b/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md @@ -0,0 +1,33 @@ + +# Alamin ang tungkol sa mga serbisyo ng cloud + +## Mga Instruksyon + +Ang mga cloud, tulad ng Azure mula sa Microsoft, ay nag-aalok ng higit pa sa simpleng pag-upa ng compute. Ang pangunahing uri ng mga alok sa cloud ay kinabibilangan ng: + +* Infrastructure as a service (IaaS) +* Platform as a service (PaaS) +* Serverless +* Software as a service (SaaS) + +Alamin ang tungkol sa iba't ibang uri ng mga alok na ito, at ipaliwanag kung ano ang mga ito at paano sila nagkakaiba. Ipaliwanag kung aling mga alok ang mahalaga para sa mga IoT developer. + +## Rubric + +| Pamantayan | Napakahusay | Katamtaman | Kailangan ng Pagpapabuti | +| ---------- | ----------- | ---------- | ------------------------ | +| Ipaliwanag ang iba't ibang alok sa cloud | Nagbigay ng malinaw na paliwanag sa lahat ng 4 na uri ng alok | Naipaliwanag ang 3 uri ng alok | Naipaliwanag lamang ang 1 o 2 uri ng alok | +| Ipaliwanag kung aling alok ang mahalaga para sa IoT | Nagbigay ng paliwanag kung aling mga alok ang mahalaga para sa mga IoT developer at kung bakit | Nagbigay ng paliwanag kung aling mga alok ang mahalaga para sa mga IoT developer ngunit hindi kung bakit | Hindi nagawang ipaliwanag kung aling mga alok ang mahalaga para sa mga IoT developer | + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na pinagmulan. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md b/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md new file mode 100644 index 00000000..dfabcc09 --- /dev/null +++ b/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md @@ -0,0 +1,130 @@ + +# Ikonekta ang iyong IoT device sa cloud - Virtual IoT Hardware at Raspberry Pi + +Sa bahaging ito ng aralin, ikokonekta mo ang iyong virtual IoT device o Raspberry Pi sa iyong IoT Hub upang magpadala ng telemetry at tumanggap ng mga utos. + +## Ikonekta ang iyong device sa IoT Hub + +Ang susunod na hakbang ay ikonekta ang iyong device sa IoT Hub. + +### Gawain - ikonekta sa IoT Hub + +1. Buksan ang folder na `soil-moisture-sensor` sa VS Code. Siguraduhing tumatakbo ang virtual environment sa terminal kung gumagamit ka ng virtual IoT device. + +1. Mag-install ng ilang karagdagang Pip packages: + + ```sh + pip3 install azure-iot-device + ``` + + Ang `azure-iot-device` ay isang library para makipag-ugnayan sa iyong IoT Hub. + +1. Idagdag ang sumusunod na imports sa itaas ng file na `app.py`, sa ibaba ng mga umiiral na imports: + + ```python + from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse + ``` + + Ang code na ito ay nag-i-import ng SDK para makipag-ugnayan sa iyong IoT Hub. + +1. Alisin ang linyang `import paho.mqtt.client as mqtt` dahil hindi na kailangan ang library na ito. Alisin ang lahat ng MQTT code kabilang ang mga pangalan ng topic, lahat ng code na gumagamit ng `mqtt_client` at ang `handle_command`. Panatilihin ang `while True:` loop, ngunit tanggalin ang linyang `mqtt_client.publish` mula sa loop na ito. + +1. Idagdag ang sumusunod na code sa ibaba ng mga import statements: + + ```python + connection_string = "" + ``` + + Palitan ang `` ng connection string na nakuha mo para sa device kanina sa araling ito. + + > 💁 Hindi ito ang pinakamahusay na kasanayan. Ang mga connection string ay hindi dapat itago sa source code, dahil maaaring ma-check in ito sa source code control at makita ng kahit sino. Ginagawa natin ito dito para sa layunin ng pagiging simple. Sa ideal na sitwasyon, dapat kang gumamit ng isang bagay tulad ng environment variable at isang tool tulad ng [`python-dotenv`](https://pypi.org/project/python-dotenv/). Matututuhan mo pa ito sa susunod na aralin. + +1. Sa ibaba ng code na ito, idagdag ang sumusunod upang lumikha ng isang device client object na maaaring makipag-ugnayan sa IoT Hub, at ikonekta ito: + + ```python + device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) + + print('Connecting') + device_client.connect() + print('Connected') + ``` + +1. Patakbuhin ang code na ito. Makikita mong nakakonekta ang iyong device. + + ```output + pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py + Connecting + Connected + Soil moisture: 379 + ``` + +## Magpadala ng telemetry + +Ngayon na nakakonekta na ang iyong device, maaari kang magpadala ng telemetry sa IoT Hub sa halip na sa MQTT broker. + +### Gawain - magpadala ng telemetry + +1. Idagdag ang sumusunod na code sa loob ng `while True` loop, bago ang sleep: + + ```python + message = Message(json.dumps({ 'soil_moisture': soil_moisture })) + device_client.send_message(message) + ``` + + Ang code na ito ay lumilikha ng isang IoT Hub `Message` na naglalaman ng soil moisture reading bilang isang JSON string, pagkatapos ay ipinapadala ito sa IoT Hub bilang isang device-to-cloud message. + +## Mag-handle ng mga utos + +Kailangang mag-handle ng iyong device ng isang utos mula sa server code upang kontrolin ang relay. Ang utos na ito ay ipinapadala bilang isang direct method request. + +## Gawain - mag-handle ng direct method request + +1. Idagdag ang sumusunod na code bago ang `while True` loop: + + ```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() + ``` + + Ang code na ito ay nagde-define ng isang method, `handle_method_request`, na tatawagin kapag may direct method na tinawag ng IoT Hub. Ang bawat direct method ay may pangalan, at inaasahan ng code na ito ang isang method na tinatawag na `relay_on` upang i-on ang relay, at `relay_off` upang i-off ito. + + > 💁 Maaari rin itong ipatupad sa isang solong direct method request, na ipinapasa ang nais na estado ng relay sa isang payload na maaaring ipasa kasama ng method request at makukuha mula sa `request` object. + +1. Ang mga direct method ay nangangailangan ng response upang ipaalam sa tumatawag na code na na-handle na ang mga ito. Idagdag ang sumusunod na code sa dulo ng function na `handle_method_request` upang lumikha ng response sa request: + + ```python + method_response = MethodResponse.create_from_method_request(request, 200) + device_client.send_method_response(method_response) + ``` + + Ang code na ito ay nagpapadala ng response sa direct method request na may HTTP status code na 200, at ipinapadala ito pabalik sa IoT Hub. + +1. Idagdag ang sumusunod na code sa ibaba ng definition ng function na ito: + + ```python + device_client.on_method_request_received = handle_method_request + ``` + + Ang code na ito ay nagsasabi sa IoT Hub client na tawagin ang function na `handle_method_request` kapag may direct method na tinawag. + +> 💁 Makikita mo ang code na ito sa [code/pi](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/pi) o [code/virtual-device](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/virtual-device) folder. + +😀 Ang iyong soil moisture sensor program ay nakakonekta na sa iyong IoT Hub! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md b/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md new file mode 100644 index 00000000..8006fecc --- /dev/null +++ b/translations/tl/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md @@ -0,0 +1,306 @@ + +# Ikonekta ang iyong IoT device sa cloud - Wio Terminal + +Sa bahaging ito ng aralin, ikokonekta mo ang iyong Wio Terminal sa iyong IoT Hub upang magpadala ng telemetry at tumanggap ng mga utos. + +## Ikonekta ang iyong device sa IoT Hub + +Ang susunod na hakbang ay ikonekta ang iyong device sa IoT Hub. + +### Gawain - ikonekta sa IoT Hub + +1. Buksan ang proyekto na `soil-moisture-sensor` sa VS Code. + +1. Buksan ang file na `platformio.ini`. Tanggalin ang dependency ng library na `knolleary/PubSubClient`. Ginamit ito upang kumonekta sa pampublikong MQTT broker, ngunit hindi na ito kailangan upang kumonekta sa IoT Hub. + +1. Idagdag ang mga sumusunod na dependency ng library: + + ```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 + ``` + + Ang library na `Seeed Arduino RTC` ay nagbibigay ng code upang makipag-ugnayan sa real-time clock sa Wio Terminal, na ginagamit upang subaybayan ang oras. Ang natitirang mga library ay nagpapahintulot sa iyong IoT device na kumonekta sa IoT Hub. + +1. Idagdag ang sumusunod sa ibaba ng file na `platformio.ini`: + + ```ini + build_flags = + -DDONT_USE_UPLOADTOBLOB + ``` + + Itinatakda nito ang isang compiler flag na kinakailangan kapag kino-compile ang Arduino IoT Hub code. + +1. Buksan ang header file na `config.h`. Tanggalin ang lahat ng mga setting ng MQTT at idagdag ang sumusunod na constant para sa device connection string: + + ```cpp + // IoT Hub settings + const char *CONNECTION_STRING = ""; + ``` + + Palitan ang `` ng connection string para sa iyong device na kinopya mo kanina. + +1. Ang koneksyon sa IoT Hub ay gumagamit ng time-based token. Nangangahulugan ito na ang IoT device ay kailangang malaman ang kasalukuyang oras. Hindi tulad ng mga operating system tulad ng Windows, macOS, o Linux, ang mga microcontroller ay hindi awtomatikong nagsi-synchronize ng kasalukuyang oras sa Internet. Nangangahulugan ito na kailangan mong magdagdag ng code upang makuha ang kasalukuyang oras mula sa isang [NTP](https://wikipedia.org/wiki/Network_Time_Protocol) server. Kapag nakuha na ang oras, maaari itong itago sa isang real-time clock sa Wio Terminal, na nagpapahintulot na hilingin ang tamang oras sa ibang pagkakataon, basta't hindi mawalan ng kuryente ang device. Magdagdag ng bagong file na tinatawag na `ntp.h` na may sumusunod na code: + + ```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); + } + ``` + + Ang mga detalye ng code na ito ay labas sa saklaw ng aralin. Nagde-define ito ng isang function na tinatawag na `initTime` na kumukuha ng kasalukuyang oras mula sa isang NTP server at ginagamit ito upang itakda ang orasan sa Wio Terminal. + +1. Buksan ang file na `main.cpp` at tanggalin ang lahat ng code ng MQTT, kabilang ang header file na `PubSubClient.h`, ang deklarasyon ng variable na `PubSubClient`, ang mga method na `reconnectMQTTClient` at `createMQTTClient`, at anumang tawag sa mga variable at method na ito. Ang file na ito ay dapat lamang maglaman ng code upang kumonekta sa WiFi, makuha ang soil moisture, at lumikha ng JSON document mula rito. + +1. Idagdag ang sumusunod na `#include` directives sa itaas ng file na `main.cpp` upang isama ang mga header file para sa IoT Hub libraries, at para sa pagtatakda ng oras: + + ```cpp + #include + #include + #include + #include "ntp.h" + ``` + +1. Idagdag ang sumusunod na tawag sa dulo ng function na `setup` upang itakda ang kasalukuyang oras: + + ```cpp + initTime(); + ``` + +1. Idagdag ang sumusunod na deklarasyon ng variable sa itaas ng file, sa ibaba lamang ng mga include directives: + + ```cpp + IOTHUB_DEVICE_CLIENT_LL_HANDLE _device_ll_handle; + ``` + + Nagde-declare ito ng `IOTHUB_DEVICE_CLIENT_LL_HANDLE`, isang handle sa koneksyon sa IoT Hub. + +1. Sa ibaba nito, idagdag ang sumusunod na code: + + ```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"); + } + } + ``` + + Nagde-declare ito ng callback function na tatawagin kapag nagbago ang status ng koneksyon sa IoT Hub, tulad ng pagkonekta o pagdiskonekta. Ang status ay ipinapadala sa serial port. + +1. Sa ibaba nito, magdagdag ng function upang kumonekta sa 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); + } + ``` + + Ang code na ito ay nag-i-initialize ng IoT Hub library code, pagkatapos ay lumilikha ng koneksyon gamit ang connection string sa header file na `config.h`. Ang koneksyon na ito ay batay sa MQTT. Kung nabigo ang koneksyon, ipinapadala ito sa serial port - kung makikita mo ito sa output, suriin ang connection string. Sa wakas, ang callback ng status ng koneksyon ay na-set up. + +1. Tawagin ang function na ito sa function na `setup` sa ibaba ng tawag sa `initTime`: + + ```cpp + connectIoTHub(); + ``` + +1. Tulad ng sa MQTT client, ang code na ito ay tumatakbo sa isang solong thread kaya nangangailangan ng oras upang iproseso ang mga mensaheng ipinadala ng hub, at ipinadala sa hub. Idagdag ang sumusunod sa itaas ng function na `loop` upang gawin ito: + + ```cpp + IoTHubDeviceClient_LL_DoWork(_device_ll_handle); + ``` + +1. I-build at i-upload ang code na ito. Makikita mo ang koneksyon sa serial monitor: + + ```output + Connecting to WiFi.. + Connected! + Fetched NTP epoch time is: 1619983687 + Sending telemetry {"soil_moisture":391} + The device client is connected to iothub + ``` + + Sa output, makikita mo ang NTP time na kinukuha, kasunod ng device client na kumokonekta. Maaaring tumagal ng ilang segundo upang kumonekta, kaya maaaring makita mo ang soil moisture sa output habang kumokonekta ang device. + + > 💁 Maaari mong i-convert ang UNIX time para sa NTP sa mas nababasang bersyon gamit ang isang website tulad ng [unixtimestamp.com](https://www.unixtimestamp.com) + +## Magpadala ng telemetry + +Ngayon na ang iyong device ay nakakonekta, maaari kang magpadala ng telemetry sa IoT Hub sa halip na sa MQTT broker. + +### Gawain - magpadala ng telemetry + +1. Idagdag ang sumusunod na function sa itaas ng function na `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); + } + ``` + + Ang code na ito ay lumilikha ng IoT Hub message mula sa isang string na ipinasa bilang parameter, ipinapadala ito sa hub, pagkatapos ay nililinis ang message object. + +1. Tawagin ang code na ito sa function na `loop`, pagkatapos lamang ng linya kung saan ipinapadala ang telemetry sa serial port: + + ```cpp + sendTelemetry(telemetry.c_str()); + ``` + +## Mag-handle ng mga utos + +Ang iyong device ay kailangang mag-handle ng utos mula sa server code upang kontrolin ang relay. Ito ay ipinapadala bilang isang direktang method request. + +## Gawain - mag-handle ng direktang method request + +1. Idagdag ang sumusunod na code bago ang function na `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); + } + } + ``` + + Ang code na ito ay nagde-define ng callback method na maaaring tawagin ng IoT Hub library kapag nakatanggap ito ng direktang method request. Ang method na hiniling ay ipinapadala sa parameter na `method_name`. Ang function na ito ay nagpi-print ng method na tinawag sa serial port, pagkatapos ay binubuksan o pinapatay ang relay depende sa pangalan ng method. + + > 💁 Maaari rin itong ipatupad sa isang solong direktang method request, na ipinapasa ang nais na estado ng relay sa isang payload na maaaring ipasa sa method request at magagamit mula sa parameter na `payload`. + +1. Idagdag ang sumusunod na code sa dulo ng function na `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; + ``` + + Ang direktang method requests ay nangangailangan ng response, at ang response ay nasa dalawang bahagi - isang response bilang text, at isang return code. Ang code na ito ay lilikha ng resulta bilang sumusunod na JSON document: + + ```JSON + { + "Result": "" + } + ``` + + Ito ay pagkatapos kinokopya sa parameter na `response`, at ang laki ng response na ito ay itinatakda sa parameter na `response_size`. Ang code na ito ay pagkatapos nagre-return ng `IOTHUB_CLIENT_OK` upang ipakita na ang method ay na-handle nang tama. + +1. I-wire up ang callback sa pamamagitan ng pagdaragdag ng sumusunod sa dulo ng function na `connectIoTHub`: + + ```cpp + IoTHubClient_LL_SetDeviceMethodCallback(_device_ll_handle, directMethodCallback, NULL); + ``` + +1. Ang function na `loop` ay tatawag sa function na `IoTHubDeviceClient_LL_DoWork` upang iproseso ang mga event na ipinadala ng IoT Hub. Ito ay tinatawag lamang tuwing 10 segundo dahil sa `delay`, nangangahulugan na ang direktang methods ay napoproseso lamang tuwing 10 segundo. Upang gawing mas epektibo ito, ang 10 segundong delay ay maaaring ipatupad bilang maraming mas maikling delay, na tinatawag ang `IoTHubDeviceClient_LL_DoWork` sa bawat pagkakataon. Upang gawin ito, idagdag ang sumusunod na code sa itaas ng function na `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); + } + ``` + + Ang code na ito ay mag-loop nang paulit-ulit, tinatawag ang `IoTHubDeviceClient_LL_DoWork` at nagde-delay ng 100ms sa bawat pagkakataon. Gagawin nito ito nang maraming beses hangga't kinakailangan upang mag-delay para sa dami ng oras na ibinigay sa parameter na `delay_time`. Nangangahulugan ito na ang device ay naghihintay ng pinakamataas na 100ms upang iproseso ang direktang method requests. + +1. Sa function na `loop`, tanggalin ang tawag sa `IoTHubDeviceClient_LL_DoWork`, at palitan ang tawag na `delay(10000)` ng sumusunod upang tawagin ang bagong function na ito: + + ```cpp + work_delay(10000); + ``` + +> 💁 Makikita mo ang code na ito sa [code/wio-terminal](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal) folder. + +😀 Ang iyong soil moisture sensor program ay nakakonekta na sa iyong IoT Hub! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/5-migrate-application-to-the-cloud/README.md b/translations/tl/2-farm/lessons/5-migrate-application-to-the-cloud/README.md new file mode 100644 index 00000000..d6f5ac86 --- /dev/null +++ b/translations/tl/2-farm/lessons/5-migrate-application-to-the-cloud/README.md @@ -0,0 +1,656 @@ + +# Ilipat ang iyong application logic sa cloud + +![Isang sketchnote na buod ng araling ito](../../../../../translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.tl.jpg) + +> Sketchnote ni [Nitya Narasimhan](https://github.com/nitya). I-click ang imahe para sa mas malaking bersyon. + +Ang araling ito ay itinuro bilang bahagi ng [IoT for Beginners Project 2 - Digital Agriculture series](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) mula sa [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Kontrolin ang iyong IoT device gamit ang serverless code](https://img.youtube.com/vi/VVZDcs5u1_I/0.jpg)](https://youtu.be/VVZDcs5u1_I) + +## Pre-lecture quiz + +[Pre-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/17) + +## Panimula + +Sa nakaraang aralin, natutunan mo kung paano ikonekta ang iyong plant soil moisture monitoring at relay control sa isang cloud-based na IoT service. Ang susunod na hakbang ay ilipat ang server code na kumokontrol sa timing ng relay sa cloud. Sa araling ito, matutunan mo kung paano ito gawin gamit ang serverless functions. + +Sa araling ito, tatalakayin natin ang: + +* [Ano ang serverless?](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Gumawa ng serverless application](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Gumawa ng IoT Hub event trigger](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Magpadala ng direct method requests mula sa serverless code](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [I-deploy ang iyong serverless code sa cloud](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) + +## Ano ang serverless? + +Ang serverless, o serverless computing, ay tumutukoy sa paggawa ng maliliit na piraso ng code na tumatakbo sa cloud bilang tugon sa iba't ibang uri ng mga event. Kapag nangyari ang event, tatakbo ang iyong code at bibigyan ito ng data tungkol sa event. Ang mga event na ito ay maaaring magmula sa iba't ibang bagay, kabilang ang web requests, mga mensahe sa queue, pagbabago sa data sa database, o mga mensaheng ipinadala sa isang IoT service ng mga IoT device. + +![Mga event na ipinapadala mula sa isang IoT service patungo sa isang serverless service, lahat ay pinoproseso nang sabay-sabay ng maraming function](../../../../../translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.tl.png) + +> 💁 Kung gumamit ka na ng database triggers dati, maaari mong isipin ito bilang katulad nito, kung saan ang code ay na-trigger ng isang event tulad ng pag-insert ng row. + +![Kapag maraming event ang ipinadala nang sabay-sabay, ang serverless service ay nag-e-scale up upang patakbuhin ang lahat ng ito nang sabay-sabay](../../../../../translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.tl.png) + +Ang iyong code ay tatakbo lamang kapag nangyari ang event, at hindi ito aktibo sa ibang oras. Kapag nangyari ang event, ang iyong code ay ilulunsad at tatakbo. Ginagawa nitong napaka-scalable ng serverless - kung maraming event ang nangyari nang sabay-sabay, maaaring patakbuhin ng cloud provider ang iyong function nang maraming beses nang sabay-sabay sa iba't ibang server na mayroon sila. Ang downside nito ay kung kailangan mong magbahagi ng impormasyon sa pagitan ng mga event, kailangan mong i-save ito sa isang lugar tulad ng database sa halip na i-store ito sa memory. + +Ang iyong code ay isinusulat bilang isang function na tumatanggap ng mga detalye tungkol sa event bilang parameter. Maaari kang gumamit ng iba't ibang programming languages upang isulat ang mga serverless function na ito. + +> 🎓 Ang serverless ay tinatawag ding Functions as a Service (FaaS) dahil ang bawat event trigger ay ipinatutupad bilang isang function sa code. + +Sa kabila ng pangalan, ang serverless ay gumagamit pa rin ng mga server. Ang pangalan ay dahil hindi mo kailangang alalahanin ang mga server na kailangan upang patakbuhin ang iyong code, ang mahalaga lamang sa iyo ay ang iyong code ay tumatakbo bilang tugon sa isang event. Ang cloud provider ay may serverless *runtime* na namamahala sa pag-aallocate ng mga server, networking, storage, CPU, memory, at iba pang kinakailangan upang patakbuhin ang iyong code. Sa modelong ito, hindi ka nagbabayad per server para sa serbisyo, dahil walang server na direktang ginagamit. Sa halip, nagbabayad ka para sa oras na tumatakbo ang iyong code, at sa dami ng memory na nagamit. + +> 💰 Ang serverless ay isa sa pinakamurang paraan upang patakbuhin ang code sa cloud. Halimbawa, sa kasalukuyang panahon ng pagsulat, ang isang cloud provider ay nagpapahintulot sa lahat ng iyong serverless functions na tumakbo nang pinagsama-sama ng 1,000,000 beses bawat buwan bago ka nila singilin, at pagkatapos nito ay sinisingil ka ng US$0.20 para sa bawat 1,000,000 executions. Kapag hindi tumatakbo ang iyong code, wala kang babayaran. + +Bilang isang IoT developer, ang serverless model ay perpekto. Maaari kang magsulat ng function na tinatawag bilang tugon sa mga mensaheng ipinadala mula sa anumang IoT device na nakakonekta sa iyong cloud-hosted IoT service. Ang iyong code ay hahawak sa lahat ng mensaheng ipinadala, ngunit tatakbo lamang kapag kinakailangan. + +✅ Balikan ang code na isinulat mo bilang server code na nakikinig sa mga mensahe gamit ang MQTT. Paano kaya ito tatakbo sa cloud gamit ang serverless? Sa tingin mo, paano maaaring baguhin ang code upang suportahan ang serverless computing? + +> 💁 Ang serverless model ay lumalawak na rin sa iba pang cloud services bukod sa pagpapatakbo ng code. Halimbawa, may mga serverless databases na available sa cloud gamit ang serverless pricing model kung saan nagbabayad ka per request na ginawa laban sa database, tulad ng query o insert, karaniwang batay sa dami ng trabaho na ginawa upang maibigay ang request. Halimbawa, ang isang simpleng select ng isang row gamit ang primary key ay mas mura kaysa sa isang komplikadong operasyon na nagjo-join ng maraming table at nagbabalik ng libu-libong row. + +## Gumawa ng serverless application + +Ang serverless computing service mula sa Microsoft ay tinatawag na Azure Functions. + +![Ang logo ng Azure Functions](../../../../../translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.tl.png) + +Ang maikling video sa ibaba ay nagbibigay ng overview ng Azure Functions: + +[![Azure Functions overview video](https://img.youtube.com/vi/8-jz5f_JyEQ/0.jpg)](https://www.youtube.com/watch?v=8-jz5f_JyEQ) + +> 🎥 I-click ang imahe sa itaas upang panoorin ang video + +✅ Maglaan ng oras upang magsaliksik at basahin ang overview ng Azure Functions sa [Microsoft Azure Functions documentation](https://docs.microsoft.com/azure/azure-functions/functions-overview?WT.mc_id=academic-17441-jabenn). + +Upang magsulat ng Azure Functions, magsisimula ka sa isang Azure Functions app gamit ang wika ng iyong pinili. Ang Azure Functions ay sumusuporta sa Python, JavaScript, TypeScript, C#, F#, Java, at Powershell. Sa araling ito, matututo kang magsulat ng Azure Functions app gamit ang Python. + +> 💁 Ang Azure Functions ay sumusuporta rin sa custom handlers kaya maaari kang magsulat ng iyong functions gamit ang anumang wika na sumusuporta sa HTTP requests, kabilang ang mga mas lumang wika tulad ng COBOL. + +Ang Functions apps ay binubuo ng isa o higit pang *triggers* - mga function na tumutugon sa mga event. Maaari kang magkaroon ng maraming triggers sa loob ng isang function app, lahat ay nagbabahagi ng karaniwang configuration. Halimbawa, sa configuration file ng iyong Functions app, maaari mong ilagay ang connection details ng iyong IoT Hub, at lahat ng function sa app ay maaaring gumamit nito upang kumonekta at makinig sa mga event. + +### Gawain - i-install ang Azure Functions tooling + +> Sa kasalukuyang panahon ng pagsulat, ang Azure Functions code tools ay hindi pa ganap na gumagana sa Apple Silicon para sa mga Python project. Kakailanganin mong gumamit ng Intel-based Mac, Windows PC, o Linux PC. + +Isa sa mga magagandang tampok ng Azure Functions ay maaari mo itong patakbuhin nang lokal. Ang parehong runtime na ginagamit sa cloud ay maaaring patakbuhin sa iyong computer, na nagpapahintulot sa iyong magsulat ng code na tumutugon sa mga IoT message at patakbuhin ito nang lokal. Maaari mo ring i-debug ang iyong code habang hinahawakan ang mga event. Kapag nasiyahan ka na sa iyong code, maaari mo itong i-deploy sa cloud. + +Ang Azure Functions tooling ay available bilang isang CLI, na kilala bilang Azure Functions Core Tools. + +1. I-install ang Azure Functions core tools sa pamamagitan ng pagsunod sa mga tagubilin sa [Azure Functions Core Tools documentation](https://docs.microsoft.com/azure/azure-functions/functions-run-local?WT.mc_id=academic-17441-jabenn). + +1. I-install ang Azure Functions extension para sa VS Code. Ang extension na ito ay nagbibigay ng suporta para sa paggawa, pag-debug, at pag-deploy ng Azure functions. Tingnan ang [Azure Functions extension documentation](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-azuretools.vscode-azurefunctions) para sa mga tagubilin sa pag-install ng extension na ito sa VS Code. + +Kapag dineploy mo ang iyong Azure Functions app sa cloud, kakailanganin nito ng kaunting cloud storage upang mag-imbak ng mga application file at log file. Kapag pinatakbo mo ang iyong Functions app nang lokal, kailangan mo pa ring kumonekta sa cloud storage, ngunit sa halip na gumamit ng aktwal na cloud storage, maaari kang gumamit ng storage emulator na tinatawag na [Azurite](https://github.com/Azure/Azurite). Ito ay tumatakbo nang lokal ngunit kumikilos tulad ng cloud storage. + +> 🎓 Sa Azure, ang storage na ginagamit ng Azure Functions ay isang Azure Storage Account. Ang mga account na ito ay maaaring mag-imbak ng mga file, blobs, data sa tables, o data sa queues. Maaari mong ibahagi ang isang storage account sa maraming apps, tulad ng isang Functions app at isang web app. + +1. Ang Azurite ay isang Node.js app, kaya kakailanganin mong i-install ang Node.js. Maaari mong makita ang download at installation instructions sa [Node.js website](https://nodejs.org/). Kung gumagamit ka ng Mac, maaari mo rin itong i-install mula sa [Homebrew](https://formulae.brew.sh/formula/node). + +1. I-install ang Azurite gamit ang sumusunod na command (`npm` ay isang tool na naka-install kapag in-install mo ang Node.js): + + ```sh + npm install -g azurite + ``` + +1. Gumawa ng folder na tinatawag na `azurite` para magamit ng Azurite sa pag-iimbak ng data: + + ```sh + mkdir azurite + ``` + +1. Patakbuhin ang Azurite, gamit ang bagong folder na ito: + + ```sh + azurite --location azurite + ``` + + Ang Azurite storage emulator ay maglulunsad at magiging handa para sa lokal na Functions runtime na kumonekta. + + ```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 + ``` + +### Gawain - gumawa ng Azure Functions project + +Ang Azure Functions CLI ay maaaring gamitin upang gumawa ng bagong Functions app. + +1. Gumawa ng folder para sa iyong Functions app at mag-navigate dito. Tawagin itong `soil-moisture-trigger`: + + ```sh + mkdir soil-moisture-trigger + cd soil-moisture-trigger + ``` + +1. Gumawa ng Python virtual environment sa loob ng folder na ito: + + ```sh + python3 -m venv .venv + ``` + +1. I-activate ang virtual environment: + + * Sa Windows: + * Kung gumagamit ka ng Command Prompt, o Command Prompt sa pamamagitan ng Windows Terminal, patakbuhin: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Kung gumagamit ka ng PowerShell, patakbuhin: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + * Sa macOS o Linux, patakbuhin: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Ang mga command na ito ay dapat patakbuhin mula sa parehong lokasyon kung saan mo pinatakbo ang command upang gumawa ng virtual environment. Hindi mo kailangang mag-navigate sa `.venv` folder, dapat mong palaging patakbuhin ang activate command at anumang command upang mag-install ng mga package o magpatakbo ng code mula sa folder kung saan mo ginawa ang virtual environment. + +1. Patakbuhin ang sumusunod na command upang gumawa ng Functions app sa folder na ito: + + ```sh + func init --worker-runtime python soil-moisture-trigger + ``` + + Ito ay lilikha ng tatlong file sa loob ng kasalukuyang folder: + + * `host.json` - ang JSON document na ito ay naglalaman ng mga setting para sa iyong Functions app. Hindi mo kailangang baguhin ang mga setting na ito. + * `local.settings.json` - ang JSON document na ito ay naglalaman ng mga setting na gagamitin ng iyong app kapag tumatakbo nang lokal, tulad ng connection strings para sa iyong IoT Hub. Ang mga setting na ito ay lokal lamang at hindi dapat idagdag sa source code control. Kapag dineploy ang app sa cloud, ang mga setting na ito ay hindi kasama, sa halip ang iyong mga setting ay ikakarga mula sa application settings. Tatalakayin ito mamaya sa araling ito. + * `requirements.txt` - ito ay isang [Pip requirements file](https://pip.pypa.io/en/stable/user_guide/#requirements-files) na naglalaman ng mga Pip package na kinakailangan upang patakbuhin ang iyong Functions app. + +1. Ang `local.settings.json` file ay may setting para sa storage account na gagamitin ng Functions app. Ang default nito ay walang laman, kaya kailangang itakda. Upang kumonekta sa Azurite local storage emulator, itakda ang value nito sa sumusunod: + + ```json + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + ``` + +1. I-install ang mga kinakailangang Pip package gamit ang requirements file: + + ```sh + pip install -r requirements.txt + ``` + + > 💁 Ang mga kinakailangang Pip package ay kailangang nasa file na ito, upang kapag dineploy ang Functions app sa cloud, masisiguro ng runtime na mai-install ang tamang mga package. + +1. Upang masigurado na gumagana nang tama ang lahat, maaari mong simulan ang Functions runtime. Patakbuhin ang sumusunod na command upang gawin ito: + + ```sh + func start + ``` + + Makikita mo ang runtime na nagsisimula at nag-uulat na wala itong nahanap na job functions (triggers). + + ```output + (.venv) ➜ soil-moisture-trigger func start + Found Python version 3.9.1 (python3). + + Azure Functions Core Tools + Core Tools Version: 3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0 (64-bit) + Function Runtime Version: 3.0.15417.0 + + [2021-05-05T01:24:46.795Z] No job functions found. + ``` +> ⚠️ Kung makakatanggap ka ng notification mula sa firewall, payagan ang access dahil kailangang magbasa at magsulat ng `func` application sa iyong network. +> ⚠️ Kung gumagamit ka ng macOS, maaaring may mga babala sa output: +> +> ```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. + > ``` +> +> Maaari mong balewalain ang mga ito basta't maayos na magsimula ang Functions app at maipakita ang mga tumatakbong function. Tulad ng nabanggit sa [tanong na ito sa 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), maaari itong balewalain. + +1. Itigil ang Functions app sa pamamagitan ng pagpindot sa `ctrl+c`. + +1. Buksan ang kasalukuyang folder sa VS Code, alinman sa pamamagitan ng pagbukas ng VS Code at pagbukas ng folder na ito, o sa pamamagitan ng pagtakbo ng sumusunod na command: + + ```sh + code . + ``` + + Awtomatikong madedetect ng VS Code ang iyong Functions project at magpapakita ng notification na nagsasabing: + + ```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? + ``` + + ![Ang notification](../../../../../translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.tl.png) + + Piliin ang **Yes** mula sa notification na ito. + +1. Siguraduhing tumatakbo ang Python virtual environment sa terminal ng VS Code. Itigil ito at i-restart kung kinakailangan. + +## Gumawa ng IoT Hub event trigger + +Ang Functions app ang shell ng iyong serverless code. Para tumugon sa mga event ng IoT Hub, maaari kang magdagdag ng IoT Hub trigger sa app na ito. Ang trigger na ito ay kailangang kumonekta sa stream ng mga mensahe na ipinapadala sa IoT Hub at tumugon sa mga ito. Para makuha ang stream ng mga mensahe, kailangang kumonekta ang iyong trigger sa *event hub compatible endpoint* ng IoT Hub. + +Ang IoT Hub ay nakabase sa isa pang Azure service na tinatawag na Azure Event Hubs. Ang Event Hubs ay isang serbisyo na nagbibigay-daan sa pagpapadala at pagtanggap ng mga mensahe, at ang IoT Hub ay nagdadagdag ng mga feature para sa mga IoT device. Ang paraan ng pagkonekta para basahin ang mga mensahe mula sa IoT Hub ay pareho sa kung paano mo ito gagawin gamit ang Event Hubs. + +✅ Mag-research: Basahin ang overview ng Event Hubs sa [Azure Event Hubs documentation](https://docs.microsoft.com/azure/event-hubs/event-hubs-about?WT.mc_id=academic-17441-jabenn). Paano ikinukumpara ang mga pangunahing feature nito sa IoT Hub? + +Para makakonekta ang isang IoT device sa IoT Hub, kailangan nitong gumamit ng secret key na nagsisiguro na ang mga pinapayagang device lamang ang makakakonekta. Ganito rin ang proseso kapag kumokonekta para basahin ang mga mensahe; ang iyong code ay mangangailangan ng connection string na naglalaman ng secret key, kasama ang mga detalye ng IoT Hub. + +> 💁 Ang default na connection string na makukuha mo ay may **iothubowner** permissions, na nagbibigay ng buong access sa IoT Hub sa anumang code na gumagamit nito. Mas mainam na kumonekta gamit ang pinakamababang antas ng permissions na kinakailangan. Ito ay tatalakayin sa susunod na leksyon. + +Kapag nakakonekta na ang iyong trigger, tatawagin ang code sa loob ng function para sa bawat mensahe na ipinadala sa IoT Hub, anuman ang device na nagpadala nito. Ang trigger ay ipapasa ang mensahe bilang parameter. + +### Gawain - kunin ang Event Hub compatible endpoint connection string + +1. Mula sa terminal ng VS Code, patakbuhin ang sumusunod na command para makuha ang connection string para sa Event Hub compatible endpoint ng IoT Hub: + + ```sh + az iot hub connection-string show --default-eventhub \ + --output table \ + --hub-name + ``` + + Palitan ang `` ng pangalan na ginamit mo para sa iyong IoT Hub. + +1. Sa VS Code, buksan ang file na `local.settings.json`. Magdagdag ng sumusunod na karagdagang halaga sa loob ng seksyong `Values`: + + ```json + "IOT_HUB_CONNECTION_STRING": "" + ``` + + Palitan ang `` ng halaga mula sa nakaraang hakbang. Kailangan mong magdagdag ng kuwit pagkatapos ng linya sa itaas para maging valid ang JSON. + +### Gawain - gumawa ng event trigger + +Handa ka nang gumawa ng event trigger. + +1. Mula sa terminal ng VS Code, patakbuhin ang sumusunod na command mula sa loob ng folder na `soil-moisture-trigger`: + + ```sh + func new --name iot-hub-trigger --template "Azure Event Hub trigger" + ``` + + Ito ay lilikha ng bagong Function na tinatawag na `iot-hub-trigger`. Ang trigger ay kokonekta sa Event Hub compatible endpoint sa IoT Hub, kaya maaari kang gumamit ng event hub trigger. Walang partikular na IoT Hub trigger. + +Ito ay lilikha ng folder sa loob ng `soil-moisture-trigger` na tinatawag na `iot-hub-trigger` na naglalaman ng function na ito. Ang folder na ito ay magkakaroon ng mga sumusunod na file sa loob nito: + +* `__init__.py` - ito ang Python code file na naglalaman ng trigger, gamit ang standard na Python file name convention para gawing Python module ang folder na ito. + + Ang file na ito ay maglalaman ng sumusunod na code: + + ```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')) + ``` + + Ang core ng trigger ay ang `main` function. Ang function na ito ang tatawagin gamit ang mga event mula sa IoT Hub. Ang function na ito ay may parameter na tinatawag na `event` na naglalaman ng `EventHubEvent`. Sa tuwing may mensahe na ipinadala sa IoT Hub, tatawagin ang function na ito at ipapasa ang mensahe bilang `event`, kasama ang mga properties na kapareho ng mga annotations na nakita mo sa nakaraang leksyon. + + Ang core ng function na ito ay naglo-log ng event. + +* `function.json` - naglalaman ito ng configuration para sa trigger. Ang pangunahing configuration ay nasa seksyong tinatawag na `bindings`. Ang binding ay ang tawag sa koneksyon sa pagitan ng Azure Functions at iba pang Azure services. Ang function na ito ay may input binding sa isang event hub - kumokonekta ito sa event hub at tumatanggap ng data. + + > 💁 Maaari ka ring magkaroon ng output bindings para ang output ng isang function ay maipadala sa ibang serbisyo. Halimbawa, maaari kang magdagdag ng output binding sa isang database at ibalik ang IoT Hub event mula sa function, at ito ay awtomatikong maipasok sa database. + + ✅ Mag-research: Basahin ang tungkol sa bindings sa [Azure Functions triggers and bindings concepts documentation](https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings?WT.mc_id=academic-17441-jabenn&tabs=python). + + Ang seksyong `bindings` ay naglalaman ng configuration para sa binding. Ang mga mahalagang halaga ay: + + * `"type": "eventHubTrigger"` - sinasabi nito sa function na kailangan nitong makinig sa mga event mula sa Event Hub + * `"name": "events"` - ito ang pangalan ng parameter na gagamitin para sa Event Hub events. Tumutugma ito sa pangalan ng parameter sa `main` function sa Python code. + * `"direction": "in"` - ito ay isang input binding, ang data mula sa event hub ay pumapasok sa function + * `"connection": ""` - tinutukoy nito ang pangalan ng setting para basahin ang connection string. Kapag tumatakbo nang lokal, babasahin nito ang setting mula sa `local.settings.json` file. + + > 💁 Ang connection string ay hindi maaaring itago sa `function.json` file, kailangan itong basahin mula sa settings. Ito ay para maiwasan ang aksidenteng paglalantad ng iyong connection string. + +1. Dahil sa [isang bug sa Azure Functions template](https://github.com/Azure/azure-functions-templates/issues/1250), ang `function.json` ay may maling halaga para sa field na `cardinality`. I-update ang field na ito mula `many` sa `one`: + + ```json + "cardinality": "one", + ``` + +1. I-update ang halaga ng `"connection"` sa `function.json` file para ituro sa bagong halaga na idinagdag mo sa `local.settings.json` file: + + ```json + "connection": "IOT_HUB_CONNECTION_STRING", + ``` + + > 💁 Tandaan - kailangan itong ituro sa setting, hindi dapat maglaman ng aktwal na connection string. + +1. Ang connection string ay naglalaman ng `eventHubName` value, kaya ang halaga para dito sa `function.json` file ay kailangang i-clear. I-update ang halaga nito sa isang empty string: + + ```json + "eventHubName": "", + ``` + +### Gawain - patakbuhin ang event trigger + +1. Siguraduhing hindi tumatakbo ang IoT Hub event monitor. Kapag tumatakbo ito kasabay ng functions app, hindi makakakonekta ang functions app at hindi makakakonsumo ng mga event. + + > 💁 Maraming apps ang maaaring kumonekta sa IoT Hub endpoints gamit ang iba't ibang *consumer groups*. Ito ay tatalakayin sa susunod na leksyon. + +1. Para patakbuhin ang Functions app, patakbuhin ang sumusunod na command mula sa terminal ng VS Code: + + ```sh + func start + ``` + + Magsisimula ang Functions app, at madidiskubre ang `iot-hub-trigger` function. Pagkatapos, ipoproseso nito ang anumang mga event na naipadala na sa IoT Hub sa nakaraang araw. + + ```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) + ``` + + Ang bawat tawag sa function ay napapalibutan ng `Executing 'Functions.iot-hub-trigger'`/`Executed 'Functions.iot-hub-trigger'` block sa output, kaya makikita mo kung ilang mensahe ang naproseso sa bawat tawag sa function. + +1. Siguraduhing tumatakbo ang iyong IoT device. Makikita mo ang mga bagong soil moisture messages na lumalabas sa Functions app. + +1. Itigil at i-restart ang Functions app. Makikita mo na hindi nito ipoproseso ang mga nakaraang mensahe muli, ipoproseso lamang nito ang mga bagong mensahe. + +> 💁 Sinusuportahan din ng VS Code ang pag-debug ng iyong Functions. Maaari kang mag-set ng break points sa pamamagitan ng pag-click sa border sa simula ng bawat linya ng code, o paglalagay ng cursor sa isang linya ng code at pagpili sa *Run -> Toggle breakpoint*, o pagpindot sa `F9`. Maaari mong ilunsad ang debugger sa pamamagitan ng pagpili sa *Run -> Start debugging*, pagpindot sa `F5`, o pagpili sa *Run and debug* pane at pagpili sa **Start debugging** button. Sa paggawa nito, makikita mo ang mga detalye ng mga event na napoproseso. + +#### Pag-troubleshoot + +* Kung makakakuha ka ng sumusunod na error: + + ```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. + ``` + + Siguraduhing tumatakbo ang Azurite at na-set mo ang `AzureWebJobsStorage` sa `local.settings.json` file sa `UseDevelopmentStorage=true`. + +* Kung makakakuha ka ng sumusunod na error: + + ```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' + ``` + + Siguraduhing na-set mo ang `cardinality` sa `function.json` file sa `one`. + +* Kung makakakuha ka ng sumusunod na error: + + ```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'). + ``` + + Siguraduhing na-set mo ang `eventHubName` sa `function.json` file sa isang empty string. + +## Magpadala ng direct method requests mula sa serverless code + +Sa ngayon, ang iyong Functions app ay nakikinig sa mga mensahe mula sa IoT Hub gamit ang Event Hub compatible endpoint. Ngayon, kailangan mong magpadala ng mga command sa IoT device. Ginagawa ito sa pamamagitan ng paggamit ng ibang koneksyon sa IoT Hub gamit ang *Registry Manager*. Ang Registry Manager ay isang tool na nagbibigay-daan sa iyo na makita kung aling mga device ang nakarehistro sa IoT Hub, at makipag-ugnayan sa mga device na iyon sa pamamagitan ng pagpapadala ng cloud-to-device messages, direct method requests, o pag-update ng device twin. Maaari mo rin itong gamitin para magrehistro, mag-update, o mag-delete ng mga IoT device mula sa IoT Hub. + +Para kumonekta sa Registry Manager, kailangan mo ng connection string. + +### Gawain - kunin ang Registry Manager connection string + +1. Para makuha ang connection string, patakbuhin ang sumusunod na command: + + ```sh + az iot hub connection-string show --policy-name service \ + --output table \ + --hub-name + ``` + + Palitan ang `` ng pangalan na ginamit mo para sa iyong IoT Hub. + + Ang connection string ay hiniling para sa *ServiceConnect* policy gamit ang `--policy-name service` parameter. Kapag humiling ka ng connection string, maaari mong tukuyin kung anong mga permissions ang papayagan ng connection string na iyon. Ang ServiceConnect policy ay nagbibigay-daan sa iyong code na kumonekta at magpadala ng mga mensahe sa IoT devices. + + ✅ Mag-research: Basahin ang tungkol sa iba't ibang policies sa [IoT Hub permissions documentation](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-security#iot-hub-permissions?WT.mc_id=academic-17441-jabenn) + +1. Sa VS Code, buksan ang file na `local.settings.json`. Magdagdag ng sumusunod na karagdagang halaga sa loob ng seksyong `Values`: + + ```json + "REGISTRY_MANAGER_CONNECTION_STRING": "" + ``` + + Palitan ang `` ng halaga mula sa nakaraang hakbang. Kailangan mong magdagdag ng kuwit pagkatapos ng linya sa itaas para maging valid ang JSON. + +### Gawain - magpadala ng direct method request sa isang device + +1. Ang SDK para sa Registry Manager ay available sa pamamagitan ng Pip package. Magdagdag ng sumusunod na linya sa `requirements.txt` file para idagdag ang dependency sa package na ito: + + ```sh + azure-iot-hub + ``` + +1. Siguraduhing naka-activate ang virtual environment sa terminal ng VS Code, at patakbuhin ang sumusunod na command para i-install ang Pip packages: + + ```sh + pip install -r requirements.txt + ``` + +1. Magdagdag ng sumusunod na imports sa `__init__.py` file: + + ```python + import json + import os + from azure.iot.hub import IoTHubRegistryManager + from azure.iot.hub.models import CloudToDeviceMethod + ``` + + Ini-import nito ang ilang system libraries, pati na rin ang mga libraries para makipag-ugnayan sa Registry Manager at magpadala ng direct method requests. + +1. Alisin ang code mula sa loob ng `main` method, ngunit panatilihin ang method mismo. + +1. Sa `main` method, magdagdag ng sumusunod na code: + + ```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}') + ``` + + Ang code na ito ay kumukuha ng body ng event na naglalaman ng JSON message na ipinadala ng IoT device. + + Pagkatapos, kinukuha nito ang device ID mula sa annotations na ipinasa kasama ng mensahe. Ang body ng event ay naglalaman ng mensahe na ipinadala bilang telemetry, ang `iothub_metadata` dictionary ay naglalaman ng mga properties na itinakda ng IoT Hub tulad ng device ID ng sender, at ang oras na ipinadala ang mensahe. + + Ang impormasyong ito ay pagkatapos ay nilo-log. Makikita mo ang logging na ito sa terminal kapag pinatakbo mo ang Function app nang lokal. + +1. Sa ibaba nito, magdagdag ng sumusunod na code: + + ```python + soil_moisture = body['soil_moisture'] + + if soil_moisture > 450: + direct_method = CloudToDeviceMethod(method_name='relay_on', payload='{}') + else: + direct_method = CloudToDeviceMethod(method_name='relay_off', payload='{}') + ``` + + Ang code na ito ay kumukuha ng soil moisture mula sa mensahe. Pagkatapos, sinusuri nito ang soil moisture, at depende sa halaga, gumagawa ng helper class para sa direct method request para sa `relay_on` o `relay_off` direct method. Ang method request ay hindi nangangailangan ng payload, kaya isang empty JSON document ang ipinapadala. + +1. Sa ibaba nito, magdagdag ng sumusunod na code: + + ```python + logging.info(f'Sending direct method request for {direct_method.method_name} for device {device_id}') + + registry_manager_connection_string = os.environ['REGISTRY_MANAGER_CONNECTION_STRING'] + registry_manager = IoTHubRegistryManager(registry_manager_connection_string) + ``` +Ang code na ito ay naglo-load ng `REGISTRY_MANAGER_CONNECTION_STRING` mula sa file na `local.settings.json`. Ang mga halaga sa file na ito ay ginagawang available bilang mga environment variable, at maaaring basahin gamit ang function na `os.environ`, isang function na nagbabalik ng dictionary ng lahat ng environment variables. + +> 💁 Kapag ang code na ito ay na-deploy sa cloud, ang mga halaga sa file na `local.settings.json` ay itatakda bilang *Application Settings*, at maaaring basahin mula sa environment variables. + +Pagkatapos, ang code ay lumilikha ng isang instance ng Registry Manager helper class gamit ang connection string. + +1. Idagdag ang sumusunod na code sa ibaba nito: + + ```python + registry_manager.invoke_device_method(device_id, direct_method) + + logging.info('Direct method request sent!') + ``` + + Ang code na ito ay nagsasabi sa registry manager na magpadala ng direct method request sa device na nagpadala ng telemetry. + + > 💁 Sa mga bersyon ng app na ginawa mo sa mga naunang aralin gamit ang MQTT, ang mga relay control command ay ipinapadala sa lahat ng devices. Ang code ay inaasahan na mayroon ka lamang isang device. Ang bersyon ng code na ito ay nagpapadala ng method request sa isang partikular na device, kaya't ito ay gagana kung mayroon kang maraming setup ng moisture sensors at relays, na nagpapadala ng tamang direct method request sa tamang device. + +1. Patakbuhin ang Functions app, at tiyaking ang iyong IoT device ay nagpapadala ng data. Makikita mo ang mga mensaheng pinoproseso at ang mga direct method request na ipinapadala. Ilipat ang soil moisture sensor sa loob at labas ng lupa upang makita ang pagbabago ng mga halaga at ang pag-on at pag-off ng relay. + +> 💁 Makikita mo ang code na ito sa [code/functions](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud/code/functions) folder. + +## I-deploy ang iyong serverless code sa cloud + +Ang iyong code ay gumagana na nang lokal, kaya ang susunod na hakbang ay i-deploy ang Functions App sa cloud. + +### Gawain - lumikha ng cloud resources + +Ang iyong Functions app ay kailangang i-deploy sa isang Functions App resource sa Azure, na nasa loob ng Resource Group na ginawa mo para sa iyong IoT Hub. Kakailanganin mo rin ng isang Storage Account na nilikha sa Azure upang palitan ang emulated na ginagamit mo nang lokal. + +1. Patakbuhin ang sumusunod na command upang lumikha ng storage account: + + ```sh + az storage account create --resource-group soil-moisture-sensor \ + --sku Standard_LRS \ + --name + ``` + + Palitan ang `` ng pangalan para sa iyong storage account. Kailangang ito ay globally unique dahil ito ay bahagi ng URL na ginagamit upang ma-access ang storage account. Maaari ka lamang gumamit ng maliliit na letra at numero para sa pangalang ito, walang ibang karakter, at limitado ito sa 24 na karakter. Gumamit ng tulad ng `sms` at magdagdag ng natatanging identifier sa dulo, tulad ng ilang random na salita o ang iyong pangalan. + + Ang `--sku Standard_LRS` ay pumipili ng pricing tier, na pinipili ang pinakamurang general-purpose account. Walang libreng tier ng storage, at magbabayad ka para sa iyong ginagamit. Ang mga gastos ay medyo mababa, na ang pinakamahal na storage ay mas mababa sa US$0.05 bawat buwan bawat gigabyte na nakaimbak. + + ✅ Basahin ang tungkol sa pagpepresyo sa [Azure Storage Account pricing page](https://azure.microsoft.com/pricing/details/storage/?WT.mc_id=academic-17441-jabenn) + +1. Patakbuhin ang sumusunod na command upang lumikha ng 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 + ``` + + Palitan ang `` ng lokasyon na ginamit mo noong nilikha ang Resource Group sa nakaraang aralin. + + Palitan ang `` ng pangalan ng storage account na nilikha mo sa nakaraang hakbang. + + Palitan ang `` ng natatanging pangalan para sa iyong Functions App. Kailangang ito ay globally unique dahil ito ay bahagi ng URL na maaaring gamitin upang ma-access ang Functions App. Gumamit ng tulad ng `soil-moisture-sensor-` at magdagdag ng natatanging identifier sa dulo, tulad ng ilang random na salita o ang iyong pangalan. + + Ang `--functions-version 3` na opsyon ay nagtatakda ng bersyon ng Azure Functions na gagamitin. Ang bersyon 3 ang pinakabagong bersyon. + + Ang `--os-type Linux` ay nagsasabi sa Functions runtime na gamitin ang Linux bilang OS upang i-host ang mga functions na ito. Ang mga functions ay maaaring i-host sa Linux o Windows, depende sa programming language na ginamit. Ang mga Python apps ay sinusuportahan lamang sa Linux. + +### Gawain - i-upload ang iyong application settings + +Kapag dinevelop mo ang iyong Functions App, nag-imbak ka ng ilang settings sa file na `local.settings.json` para sa connection strings ng iyong IoT Hub. Ang mga ito ay kailangang isulat sa Application Settings sa iyong Function App sa Azure upang magamit ng iyong code. + +> 🎓 Ang file na `local.settings.json` ay para lamang sa lokal na development settings, at hindi dapat i-check in sa source code control, tulad ng GitHub. Kapag na-deploy sa cloud, ang Application Settings ang ginagamit. Ang Application Settings ay key/value pairs na naka-host sa cloud at binabasa mula sa environment variables alinman sa iyong code o ng runtime kapag ikinokonekta ang iyong code sa IoT Hub. + +1. Patakbuhin ang sumusunod na command upang itakda ang `IOT_HUB_CONNECTION_STRING` setting sa Functions App Application Settings: + + ```sh + az functionapp config appsettings set --resource-group soil-moisture-sensor \ + --name \ + --settings "IOT_HUB_CONNECTION_STRING=" + ``` + + Palitan ang `` ng pangalan na ginamit mo para sa iyong Functions App. + + Palitan ang `` ng halaga ng `IOT_HUB_CONNECTION_STRING` mula sa iyong `local.settings.json` file. + +1. Ulitin ang hakbang sa itaas, ngunit itakda ang halaga ng `REGISTRY_MANAGER_CONNECTION_STRING` sa kaukulang halaga mula sa iyong `local.settings.json` file. + +Kapag pinatakbo mo ang mga command na ito, maglalabas din ito ng listahan ng lahat ng Application Settings para sa function app. Maaari mong gamitin ito upang suriin kung tama ang iyong mga halaga. + +> 💁 Makikita mo ang isang halaga na nakatakda na para sa `AzureWebJobsStorage`. Sa iyong `local.settings.json` file, ito ay nakatakda sa isang halaga upang gamitin ang lokal na storage emulator. Kapag nilikha mo ang Functions App, ipinapasa mo ang storage account bilang isang parameter, at ito ay awtomatikong itinatakda sa setting na ito. + +### Gawain - i-deploy ang iyong Functions App sa cloud + +Ngayon na ang Functions App ay handa na, ang iyong code ay maaaring i-deploy. + +1. Patakbuhin ang sumusunod na command mula sa VS Code terminal upang i-publish ang iyong Functions App: + + ```sh + func azure functionapp publish + ``` + + Palitan ang `` ng pangalan na ginamit mo para sa iyong Functions App. + +Ang code ay ipapakete at ipapadala sa Functions App, kung saan ito ay ide-deploy at sisimulan. Magkakaroon ng maraming console output, na magtatapos sa kumpirmasyon ng deployment at isang listahan ng mga na-deploy na functions. Sa kasong ito, ang listahan ay maglalaman lamang ng trigger. + +```output +Deployment successful. +Remote build succeeded! +Syncing triggers... +Functions in soil-moisture-sensor: + iot-hub-trigger - [eventHubTrigger] +``` + +Tiyaking tumatakbo ang iyong IoT device. Baguhin ang moisture levels sa pamamagitan ng pag-adjust sa soil moisture, o paglipat ng sensor sa loob at labas ng lupa. Makikita mo ang relay na nag-o-on at nag-o-off habang nagbabago ang soil moisture. + +--- + +## 🚀 Hamon + +Sa nakaraang aralin, pinamahalaan mo ang timing para sa relay sa pamamagitan ng pag-unsubscribe mula sa MQTT messages habang naka-on ang relay, at sa maikling panahon pagkatapos itong ma-off. Hindi mo magagamit ang pamamaraang ito dito - hindi mo maaaring i-unsubscribe ang iyong IoT Hub trigger. + +Mag-isip ng iba't ibang paraan kung paano mo ito mahahawakan sa iyong Functions App. + +## Post-lecture quiz + +[Post-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/18) + +## Review at Pag-aaral sa Sarili + +* Basahin ang tungkol sa serverless computing sa [Serverless Computing page sa Wikipedia](https://wikipedia.org/wiki/Serverless_computing) +* Basahin ang tungkol sa paggamit ng serverless sa Azure kabilang ang ilang higit pang mga halimbawa sa [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) +* Alamin ang higit pa tungkol sa Azure Functions sa [Azure Functions YouTube channel](https://www.youtube.com/c/AzureFunctions) + +## Takdang Aralin + +[Magdagdag ng manual relay control](assignment.md) + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na pinagmulan. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md b/translations/tl/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md new file mode 100644 index 00000000..02113344 --- /dev/null +++ b/translations/tl/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md @@ -0,0 +1,70 @@ + +# Magdagdag ng manual na kontrol sa relay + +## Mga Instruksyon + +Ang serverless na code ay maaaring ma-trigger ng iba't ibang bagay, kabilang ang mga HTTP request. Maaari kang gumamit ng HTTP triggers upang magdagdag ng manual na override sa iyong relay control, na nagbibigay-daan sa isang tao na i-on o i-off ang relay gamit ang web request. + +Para sa gawaing ito, kailangan mong magdagdag ng dalawang HTTP triggers sa iyong Functions App upang i-on at i-off ang relay, gamit ang natutunan mo mula sa araling ito upang magpadala ng mga command sa device. + +Ilang mga paalala: + +* Maaari kang magdagdag ng HTTP trigger sa iyong umiiral na Functions App gamit ang sumusunod na command: + + ```sh + func new --name --template "HTTP trigger" + ``` + + Palitan ang `` ng pangalan para sa iyong HTTP trigger. Gumamit ng mga pangalan tulad ng `relay_on` at `relay_off`. + +* Ang HTTP triggers ay maaaring magkaroon ng access control. Sa default na setting, kailangan ng function-specific API key na ipasa kasama ng URL upang ma-trigger ito. Para sa gawaing ito, maaari mong alisin ang limitasyong ito upang kahit sino ay maaaring magpatakbo ng function. Upang gawin ito, i-update ang `authLevel` setting sa `function.json` file para sa HTTP triggers sa sumusunod: + + ```json + "authLevel": "anonymous" + ``` + + > 💁 Maaari mong basahin ang higit pa tungkol sa access control sa [Function access keys documentation](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?WT.mc_id=academic-17441-jabenn#authorization-keys). + +* Ang HTTP triggers ay default na sumusuporta sa GET at POST requests. Nangangahulugan ito na maaari mo itong tawagin gamit ang iyong web browser - ang mga web browser ay gumagawa ng GET requests. + + Kapag pinatakbo mo ang iyong Functions App nang lokal, makikita mo ang URL ng trigger: + + ```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 + ``` + + I-paste ang URL sa iyong browser at pindutin ang `return`, o `Ctrl+click` (`Cmd+click` sa macOS) ang link sa terminal window sa VS Code upang buksan ito sa iyong default na browser. Ito ay magpapatakbo ng trigger. + + > 💁 Pansinin na ang URL ay may `/api` sa loob nito - ang HTTP triggers ay default na nasa `api` subdomain. + +* Kapag dineploy mo ang Functions App, ang HTTP trigger URL ay magiging: + + `https://.azurewebsites.net/api/` + + Kung saan ang `` ay ang pangalan ng iyong Functions App, at ang `` ay ang pangalan ng iyong trigger. + +## Rubric + +| Pamantayan | Napakahusay | Katamtaman | Kailangan ng Pagpapabuti | +| ---------- | ----------- | ---------- | ------------------------ | +| Gumawa ng HTTP triggers | Nilikha ang 2 triggers upang i-on at i-off ang relay, na may angkop na mga pangalan | Nilikha ang isang trigger na may angkop na pangalan | Hindi nagawang lumikha ng anumang trigger | +| Kontrolin ang relay mula sa HTTP triggers | Nagawang ikonekta ang parehong triggers sa IoT Hub at kontrolin ang relay nang maayos | Nagawang ikonekta ang isang trigger sa IoT Hub at kontrolin ang relay nang maayos | Hindi nagawang ikonekta ang mga triggers sa IoT Hub | + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/6-keep-your-plant-secure/README.md b/translations/tl/2-farm/lessons/6-keep-your-plant-secure/README.md new file mode 100644 index 00000000..acea6211 --- /dev/null +++ b/translations/tl/2-farm/lessons/6-keep-your-plant-secure/README.md @@ -0,0 +1,245 @@ + +# Panatilihing Ligtas ang Iyong Halaman + +![Isang sketchnote overview ng araling ito](../../../../../translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.tl.jpg) + +> Sketchnote ni [Nitya Narasimhan](https://github.com/nitya). I-click ang imahe para sa mas malaking bersyon. + +## Pre-lecture Quiz + +[Pre-lecture Quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/19) + +## Panimula + +Sa mga nakaraang aralin, nakagawa ka ng IoT device para sa pagsubaybay sa lupa at naikonekta ito sa cloud. Ngunit paano kung ang mga hacker na nagtatrabaho para sa isang karibal na magsasaka ay nakontrol ang iyong mga IoT device? Paano kung magpadala sila ng mataas na soil moisture readings upang hindi kailanman madiligan ang iyong mga halaman, o buksan ang iyong sistema ng patubig nang tuluy-tuloy, na magdudulot ng sobrang pagdidilig at magastos sa tubig? + +Sa araling ito, matututunan mo ang tungkol sa pag-secure ng mga IoT device. Dahil ito ang huling aralin para sa proyektong ito, matututunan mo rin kung paano linisin ang iyong mga cloud resources upang mabawasan ang mga posibleng gastos. + +Sa araling ito, tatalakayin natin: + +* [Bakit kailangan mong i-secure ang mga IoT device?](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Cryptography](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [I-secure ang iyong mga IoT device](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Gumawa at gumamit ng X.509 certificate](../../../../../2-farm/lessons/6-keep-your-plant-secure) + +> 🗑 Ito ang huling aralin sa proyektong ito, kaya pagkatapos makumpleto ang aralin at ang assignment, huwag kalimutang linisin ang iyong mga cloud services. Kakailanganin mo ang mga serbisyo upang makumpleto ang assignment, kaya tiyaking tapusin muna ito. +> +> Sumangguni sa [ang gabay sa paglilinis ng iyong proyekto](../../../clean-up.md) kung kinakailangan para sa mga tagubilin kung paano ito gawin. + +## Bakit kailangan mong i-secure ang mga IoT device? + +Ang seguridad ng IoT ay nangangahulugan ng pagtiyak na ang mga inaasahang device lamang ang maaaring kumonekta sa iyong cloud IoT service at magpadala ng telemetry, at ang iyong cloud service lamang ang maaaring magpadala ng mga utos sa iyong mga device. Ang data ng IoT ay maaari ring maging personal, kabilang ang medikal o sensitibong data, kaya ang buong aplikasyon mo ay kailangang isaalang-alang ang seguridad upang maiwasan ang pagtagas ng data na ito. + +Kung ang iyong IoT application ay hindi secure, may ilang mga panganib: + +* Ang isang pekeng device ay maaaring magpadala ng maling data, na magdudulot ng maling tugon ng iyong aplikasyon. Halimbawa, maaari silang magpadala ng patuloy na mataas na soil moisture readings, na nangangahulugang hindi kailanman magbubukas ang iyong sistema ng patubig at mamamatay ang iyong mga halaman dahil sa kakulangan ng tubig. +* Ang mga hindi awtorisadong user ay maaaring magbasa ng data mula sa mga IoT device, kabilang ang personal o kritikal na data ng negosyo. +* Ang mga hacker ay maaaring magpadala ng mga utos upang kontrolin ang isang device sa paraang maaaring makapinsala sa device o sa mga konektadong hardware. +* Sa pamamagitan ng pagkonekta sa isang IoT device, maaaring gamitin ito ng mga hacker upang ma-access ang karagdagang mga network at makakuha ng access sa mga pribadong sistema. +* Ang mga malisyosong user ay maaaring ma-access ang personal na data at gamitin ito para sa pananakot. + +Ito ay mga totoong sitwasyon at nangyayari sa lahat ng oras. Ang ilang mga halimbawa ay ibinigay sa mga naunang aralin, ngunit narito ang ilan pa: + +* Noong 2018, ginamit ng mga hacker ang isang open WiFi access point sa isang thermostat ng fish tank upang makakuha ng access sa network ng isang casino at magnakaw ng data. [The Hacker News - Casino Gets Hacked Through Its Internet-Connected Fish Tank Thermometer](https://thehackernews.com/2018/04/iot-hacking-thermometer.html) +* Noong 2016, inilunsad ng Mirai Botnet ang isang denial of service attack laban sa Dyn, isang Internet service provider, na nagdulot ng pagbagsak ng malaking bahagi ng Internet. Ginamit ng botnet na ito ang malware upang kumonekta sa mga IoT device tulad ng DVRs at mga camera na gumagamit ng default usernames at passwords, at mula doon inilunsad ang pag-atake. [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) +* Ang Spiral Toys ay may database ng mga user ng kanilang CloudPets connected toys na pampublikong available sa 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/). +* Ang Strava ay nag-tag ng mga runner na nadaanan mo at ipinakita ang kanilang mga ruta, na nagpapahintulot sa mga estranghero na makita kung saan ka nakatira. [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/). + +✅ Mag-research: Maghanap ng higit pang mga halimbawa ng IoT Hacks at paglabag sa data ng IoT, lalo na sa mga personal na item tulad ng Internet-connected toothbrushes o scales. Pag-isipan ang epekto ng mga hack na ito sa mga biktima o customer. + +> 💁 Ang seguridad ay isang napakalaking paksa, at ang araling ito ay tatalakayin lamang ang ilan sa mga pangunahing kaalaman sa pagkonekta ng iyong device sa cloud. Ang iba pang mga paksa na hindi saklaw ay kinabibilangan ng pagsubaybay sa mga pagbabago sa data habang nasa transit, pag-hack ng mga device nang direkta, o mga pagbabago sa mga configuration ng device. Ang IoT hacking ay isang malaking banta, kaya't ang mga tool tulad ng [Azure Defender for IoT](https://azure.microsoft.com/services/azure-defender-for-iot/?WT.mc_id=academic-17441-jabenn) ay binuo. Ang mga tool na ito ay katulad ng mga anti-virus at security tools na maaaring mayroon ka sa iyong computer, ngunit idinisenyo para sa maliliit, mababang power na IoT device. + +## Cryptography + +Kapag kumonekta ang isang device sa isang IoT service, gumagamit ito ng ID upang kilalanin ang sarili nito. Ang problema ay ang ID na ito ay maaaring kopyahin - maaaring mag-set up ang isang hacker ng malisyosong device na gumagamit ng parehong ID ng isang tunay na device ngunit nagpapadala ng maling data. + +![Parehong valid at malisyosong device ay maaaring gumamit ng parehong ID upang magpadala ng telemetry](../../../../../translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.tl.png) + +Ang solusyon dito ay ang pag-convert ng data na ipinapadala sa isang scrambled na format, gamit ang isang halaga na kilala lamang ng device at ng cloud. Ang prosesong ito ay tinatawag na *encryption*, at ang halaga na ginamit upang i-encrypt ang data ay tinatawag na *encryption key*. + +![Kung gagamit ng encryption, tanging mga encrypted na mensahe lamang ang tatanggapin, ang iba ay tatanggihan](../../../../../translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.tl.png) + +Ang cloud service ay maaaring i-convert ang data pabalik sa nababasang format, gamit ang isang proseso na tinatawag na *decryption*, gamit ang parehong encryption key, o isang *decryption key*. Kung ang encrypted na mensahe ay hindi ma-decrypt ng key, ang device ay na-hack at ang mensahe ay tatanggihan. + +Ang teknolohiya para sa paggawa ng encryption at decryption ay tinatawag na *cryptography*. + +### Maagang Cryptography + +Ang pinakaunang uri ng cryptography ay ang substitution ciphers, na nagsimula 3,500 taon na ang nakalipas. Ang substitution ciphers ay nagsasangkot ng pagpapalit ng isang letra sa iba. Halimbawa, ang [Caesar cipher](https://wikipedia.org/wiki/Caesar_cipher) ay nagsasangkot ng pag-shift ng alpabeto sa isang tinukoy na dami, kung saan ang nagpadala ng encrypted na mensahe at ang intended recipient lamang ang nakakaalam kung ilang letra ang i-shift. + +Ang [Vigenère cipher](https://wikipedia.org/wiki/Vigenère_cipher) ay nagpaunlad pa nito sa pamamagitan ng paggamit ng mga salita upang i-encrypt ang teksto, upang ang bawat letra sa orihinal na teksto ay ma-shift sa iba't ibang dami, sa halip na palaging i-shift sa parehong bilang ng mga letra. + +Ang cryptography ay ginamit para sa iba't ibang layunin, tulad ng pagprotekta sa recipe ng glaze ng palayok sa sinaunang Mesopotamia, pagsusulat ng mga lihim na love notes sa India, o pagpapanatili ng mga sinaunang Egyptian na mahika na lihim. + +### Modernong Cryptography + +Ang modernong cryptography ay mas advanced, na ginagawang mas mahirap i-crack kaysa sa mga maagang pamamaraan. Ang modernong cryptography ay gumagamit ng komplikadong matematika upang i-encrypt ang data na may napakaraming posibleng keys upang gawing imposible ang brute force attacks. + +Ang cryptography ay ginagamit sa maraming iba't ibang paraan para sa secure na komunikasyon. Kung binabasa mo ang pahinang ito sa GitHub, maaaring mapansin mo na ang web site address ay nagsisimula sa *HTTPS*, na nangangahulugang ang komunikasyon sa pagitan ng iyong browser at ng mga web server ng GitHub ay naka-encrypt. Kung may makakabasa ng internet traffic na dumadaloy sa pagitan ng iyong browser at GitHub, hindi nila mababasa ang data dahil ito ay naka-encrypt. Ang iyong computer ay maaaring i-encrypt pa ang lahat ng data sa iyong hard drive upang kung may magnakaw nito, hindi nila mababasa ang anumang data nang walang iyong password. + +> 🎓 Ang HTTPS ay nangangahulugang HyperText Transfer Protocol **Secure** + +Sa kasamaang palad, hindi lahat ay secure. Ang ilang mga device ay walang seguridad, ang iba ay secured gamit ang madaling i-crack na keys, o minsan kahit lahat ng device ng parehong uri ay gumagamit ng parehong key. May mga ulat ng napaka-personal na IoT device na lahat ay may parehong password upang kumonekta sa kanila sa WiFi o Bluetooth. Kung maaari kang kumonekta sa iyong sariling device, maaari kang kumonekta sa device ng iba. Kapag nakakonekta, maaari kang makakuha ng access sa napaka-pribadong data, o magkaroon ng kontrol sa kanilang device. + +> 💁 Sa kabila ng mga komplikasyon ng modernong cryptography at ang mga claim na ang pag-crack ng encryption ay maaaring tumagal ng bilyong taon, ang pag-usbong ng quantum computing ay nagdulot ng posibilidad na ma-crack ang lahat ng kilalang encryption sa napakaikling panahon! + +### Symmetric at Asymmetric Keys + +Ang encryption ay may dalawang uri - symmetric at asymmetric. + +**Symmetric** encryption ay gumagamit ng parehong key upang i-encrypt at i-decrypt ang data. Parehong kailangang malaman ng sender at receiver ang parehong key. Ito ang hindi gaanong secure na uri, dahil ang key ay kailangang maibahagi sa kung anumang paraan. Para sa sender na magpadala ng encrypted na mensahe sa recipient, maaaring kailangang ipadala muna ng sender ang key sa recipient. + +![Ang symmetric key encryption ay gumagamit ng parehong key upang i-encrypt at i-decrypt ang mensahe](../../../../../translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.tl.png) + +Kung ang key ay nanakaw habang nasa transit, o ang sender o recipient ay na-hack at nahanap ang key, maaaring ma-crack ang encryption. + +![Ang symmetric key encryption ay secure lamang kung hindi makuha ng hacker ang key - kung makuha nila, maaari nilang i-intercept at i-decrypt ang mensahe](../../../../../translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.tl.png) + +**Asymmetric** encryption ay gumagamit ng 2 keys - isang encryption key at isang decryption key, na tinutukoy bilang public/private key pair. Ang public key ay ginagamit upang i-encrypt ang mensahe, ngunit hindi maaaring gamitin upang i-decrypt ito, ang private key ay ginagamit upang i-decrypt ang mensahe ngunit hindi maaaring gamitin upang i-encrypt ito. + +![Ang asymmetric encryption ay gumagamit ng magkaibang key upang i-encrypt at i-decrypt. Ang encryption key ay ipinapadala sa mga sender ng mensahe upang ma-encrypt nila ang mensahe bago ito ipadala sa recipient na may-ari ng mga keys](../../../../../translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.tl.png) + +Ibinabahagi ng recipient ang kanilang public key, at ginagamit ito ng sender upang i-encrypt ang mensahe. Kapag naipadala na ang mensahe, i-decrypt ito ng recipient gamit ang kanilang private key. Ang asymmetric encryption ay mas secure dahil ang private key ay pinapanatiling pribado ng recipient at hindi kailanman ibinabahagi. Ang public key ay maaaring ibigay sa kahit sino dahil maaari lamang itong gamitin upang i-encrypt ang mga mensahe. + +Ang symmetric encryption ay mas mabilis kaysa sa asymmetric encryption, ngunit ang asymmetric ay mas secure. Ang ilang mga sistema ay gumagamit ng pareho - gumagamit ng asymmetric encryption upang i-encrypt at ibahagi ang symmetric key, pagkatapos ay gumagamit ng symmetric key upang i-encrypt ang lahat ng data. Ginagawa nitong mas secure ang pagbabahagi ng symmetric key sa pagitan ng sender at recipient, at mas mabilis kapag nag-e-encrypt at nag-de-decrypt ng data. + +## I-secure ang Iyong mga IoT Device + +Ang mga IoT device ay maaaring ma-secure gamit ang symmetric o asymmetric encryption. Ang symmetric ay mas madali, ngunit hindi gaanong secure. + +### Symmetric Keys + +Kapag na-set up mo ang iyong IoT device upang makipag-ugnayan sa IoT Hub, gumamit ka ng connection string. Isang halimbawa ng connection string ay: + +```output +HostName=soil-moisture-sensor.azure-devices.net;DeviceId=soil-moisture-sensor;SharedAccessKey=Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0= +``` + +Ang connection string na ito ay binubuo ng tatlong bahagi na pinaghihiwalay ng semi-colons, kung saan ang bawat bahagi ay isang key at isang value: + +| Key | Value | Deskripsyon | +| --- | ----- | ----------- | +| HostName | `soil-moisture-sensor.azure-devices.net` | Ang URL ng IoT Hub | +| DeviceId | `soil-moisture-sensor` | Ang natatanging ID ng device | +| SharedAccessKey | `Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0=` | Isang symmetric key na kilala ng device at ng IoT Hub | + +Ang huling bahagi ng connection string na ito, ang `SharedAccessKey`, ay ang symmetric key na kilala ng parehong device at ng IoT Hub. Ang key na ito ay hindi kailanman ipinapadala mula sa device papunta sa cloud, o mula sa cloud papunta sa device. Sa halip, ginagamit ito upang i-encrypt ang data na ipinapadala o natatanggap. + +✅ Gumawa ng eksperimento. Ano sa tingin mo ang mangyayari kung babaguhin mo ang bahagi ng `SharedAccessKey` ng connection string kapag kumokonekta ang iyong IoT device? Subukan ito. + +Kapag unang sinubukan ng device na kumonekta, nagpapadala ito ng shared access signature (SAS) token na binubuo ng URL ng IoT Hub, isang timestamp kung kailan mag-e-expire ang access signature (karaniwang 1 araw mula sa kasalukuyang oras), at isang signature. Ang signature na ito ay binubuo ng URL at ng expiry time na naka-encrypt gamit ang shared access key mula sa connection string. + +I-decrypt ng IoT Hub ang signature na ito gamit ang shared access key, at kung ang decrypted value ay tumutugma sa URL at expiry, papayagan ang device na kumonekta. Tinitiyak din nito na ang kasalukuyang oras ay bago ang expiry, upang maiwasan ang isang malisyosong device na makuha ang SAS token ng isang tunay na device at gamitin ito. + +Ito ay isang eleganteng paraan upang i-verify na ang sender ay ang tamang device. Sa pamamagitan ng pagpapadala ng ilang kilalang data sa parehong decrypted at encrypted na anyo, maaaring i-verify ng server ang device sa pamamagitan ng pagtiyak na kapag na-decrypt nito ang encrypted na data, ang resulta ay tumutugma sa decrypted na bersyon na ipinadala. Kung tumutugma, nangangahulugan ito na parehong may symmetric encryption key ang sender at recipient. +💁 Dahil sa oras ng pag-expire, kailangang malaman ng iyong IoT device ang tamang oras, na karaniwang kinukuha mula sa isang [NTP](https://wikipedia.org/wiki/Network_Time_Protocol) server. Kung hindi tama ang oras, mabibigo ang koneksyon. +Pagkatapos ng koneksyon, lahat ng datos na ipinadala sa IoT Hub mula sa device, o sa device mula sa IoT Hub ay mai-encrypt gamit ang shared access key. + +✅ Ano sa tingin mo ang mangyayari kung maraming device ang gumagamit ng parehong connection string? + +> 💁 Hindi magandang security practice ang pag-iimbak ng key na ito sa code. Kung makuha ng hacker ang iyong source code, makukuha rin nila ang iyong key. Mas mahirap din ito kapag nagre-release ng code dahil kailangan mong i-recompile gamit ang updated na key para sa bawat device. Mas mainam na i-load ang key na ito mula sa hardware security module - isang chip sa IoT device na nag-iimbak ng encrypted values na mababasa ng iyong code. +> +> Kapag nag-aaral ng IoT, mas madali kadalasan na ilagay ang key sa code, tulad ng ginawa mo sa naunang aralin, ngunit dapat mong tiyakin na ang key na ito ay hindi ma-check in sa public source code control. + +Ang mga device ay may 2 key, at 2 kaukulang connection string. Pinapayagan nito ang pag-rotate ng mga key - ibig sabihin, magpalit mula sa isang key patungo sa isa pa kung sakaling ma-kompromiso ang una, at muling i-generate ang unang key. + +### X.509 certificates + +Kapag gumagamit ka ng asymmetric encryption gamit ang public/private key pair, kailangan mong ibigay ang iyong public key sa sinumang nais magpadala sa iyo ng datos. Ang problema ay, paano masisiguro ng tatanggap ng iyong key na ito talaga ang iyong public key, at hindi ng ibang tao na nagpapanggap na ikaw? Sa halip na magbigay ng key, maaari kang magbigay ng iyong public key sa loob ng isang certificate na na-verify ng isang pinagkakatiwalaang third party, na tinatawag na X.509 certificate. + +Ang X.509 certificates ay mga digital na dokumento na naglalaman ng public key na bahagi ng public/private key pair. Karaniwang ini-issue ito ng isa sa maraming pinagkakatiwalaang organisasyon na tinatawag na [Certification authorities](https://wikipedia.org/wiki/Certificate_authority) (CAs), at digitally signed ng CA upang ipakita na ang key ay valid at galing sa iyo. Pinagkakatiwalaan mo ang certificate at ang public key na galing sa kung sino ang sinasabi ng certificate dahil pinagkakatiwalaan mo ang CA, katulad ng pagtitiwala mo sa passport o lisensya sa pagmamaneho dahil pinagkakatiwalaan mo ang bansang nag-issue nito. Ang mga certificate ay may bayad, kaya maaari ka ring 'self-sign', ibig sabihin gumawa ng certificate na ikaw mismo ang nag-sign, para sa testing purposes. + +> 💁 Huwag kailanman gumamit ng self-signed certificate para sa production release. + +Ang mga certificate na ito ay may iba't ibang fields, kabilang ang kung sino ang may-ari ng public key, ang detalye ng CA na nag-issue nito, kung gaano katagal ito valid, at ang public key mismo. Bago gamitin ang certificate, magandang practice na i-verify ito sa pamamagitan ng pag-check kung ito ay na-sign ng original CA. + +✅ Maaari mong basahin ang kumpletong listahan ng mga fields sa certificate sa [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) + +Kapag gumagamit ng X.509 certificates, parehong ang sender at ang recipient ay magkakaroon ng kanilang sariling public at private keys, pati na rin ang X.509 certificates na naglalaman ng public key. Magpapalitan sila ng X.509 certificates sa anumang paraan, gamit ang public key ng isa't isa upang i-encrypt ang datos na kanilang ipinapadala, at ang kanilang sariling private key upang i-decrypt ang datos na kanilang natatanggap. + +![Sa halip na magbahagi ng public key, maaari kang magbahagi ng certificate. Maaaring i-verify ng user ng certificate na ito ay galing sa iyo sa pamamagitan ng pag-check sa certificate authority na nag-sign nito.](../../../../../translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.tl.png) + +Isang malaking bentahe ng paggamit ng X.509 certificates ay maaari itong ibahagi sa pagitan ng mga device. Maaari kang gumawa ng isang certificate, i-upload ito sa IoT Hub, at gamitin ito para sa lahat ng iyong device. Ang bawat device ay kailangan lamang malaman ang private key upang i-decrypt ang mga mensaheng natatanggap nito mula sa IoT Hub. + +Ang certificate na ginagamit ng iyong device upang i-encrypt ang mga mensaheng ipinapadala nito sa IoT Hub ay inilathala ng Microsoft. Ito ang parehong certificate na ginagamit ng maraming Azure services, at minsan ay built-in sa mga SDKs. + +> 💁 Tandaan, ang public key ay pampubliko. Ang Azure public key ay maaari lamang gamitin upang i-encrypt ang datos na ipinapadala sa Azure, hindi upang i-decrypt ito, kaya maaari itong ibahagi kahit saan, kabilang sa source code. Halimbawa, makikita mo ito sa [Azure IoT C SDK source code](https://github.com/Azure/azure-iot-sdk-c/blob/master/certs/certs.c). + +✅ Maraming jargon sa X.509 certificates. Maaari mong basahin ang mga kahulugan ng ilang mga terminong maaaring makaharap mo sa [The layman’s guide to X.509 certificate jargon](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) + +## Gumawa at gumamit ng X.509 certificate + +Ang mga hakbang upang gumawa ng X.509 certificate ay: + +1. Gumawa ng public/private key pair. Isa sa mga pinakalaganap na algorithm upang gumawa ng public/private key pair ay tinatawag na [Rivest–Shamir–Adleman](https://wikipedia.org/wiki/RSA_(cryptosystem))(RSA). + +1. I-submit ang public key kasama ang kaukulang datos para sa signing, alinman sa pamamagitan ng CA, o sa pamamagitan ng self-signing. + +Ang Azure CLI ay may mga command upang gumawa ng bagong device identity sa IoT Hub, at awtomatikong gumawa ng public/private key pair at gumawa ng self-signed certificate. + +> 💁 Kung nais mong makita ang mga hakbang nang detalyado, sa halip na gamitin ang Azure CLI, maaari mo itong makita sa [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) + +### Gawain - gumawa ng device identity gamit ang X.509 certificate + +1. Patakbuhin ang sumusunod na command upang irehistro ang bagong device identity, awtomatikong gumagawa ng mga keys at certificates: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor-x509 \ + --am x509_thumbprint \ + --output-dir . \ + --hub-name + ``` + + Palitan ang `` ng pangalan na ginamit mo para sa iyong IoT Hub. + + Ito ay gagawa ng device na may ID na `soil-moisture-sensor-x509` upang maiba mula sa device identity na ginawa mo sa nakaraang aralin. Ang command na ito ay gagawa rin ng 2 files sa kasalukuyang directory: + + * `soil-moisture-sensor-x509-key.pem` - ang file na ito ay naglalaman ng private key para sa device. + * `soil-moisture-sensor-x509-cert.pem` - ito ang X.509 certificate file para sa device. + + Panatilihing ligtas ang mga file na ito! Ang private key file ay hindi dapat ma-check in sa public source code control. + +### Gawain - gamitin ang X.509 certificate sa iyong device code + +Sundan ang kaukulang gabay upang ikonekta ang iyong IoT device sa cloud gamit ang X.509 certificate: + +* [Arduino - Wio Terminal](wio-terminal-x509.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-x509.md) + +--- + +## 🚀 Hamon + +Mayroong iba't ibang paraan upang gumawa, mag-manage, at mag-delete ng Azure services tulad ng Resource Groups at IoT Hubs. Isa sa mga paraan ay ang [Azure Portal](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) - isang web-based interface na nagbibigay ng GUI upang mag-manage ng iyong Azure services. + +Pumunta sa [portal.azure.com](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) at suriin ang portal. Subukang gumawa ng IoT Hub gamit ang portal, pagkatapos ay i-delete ito. + +**Pahiwatig** - kapag gumagawa ng services sa pamamagitan ng portal, hindi mo kailangang gumawa ng Resource Group nang maaga, maaaring gumawa ng isa habang gumagawa ng service. Siguraduhing i-delete ito kapag tapos ka na! + +Makakahanap ka ng maraming dokumentasyon, tutorials, at gabay tungkol sa Azure Portal sa [Azure portal documentation](https://docs.microsoft.com/azure/azure-portal/?WT.mc_id=academic-17441-jabenn). + +## Post-lecture quiz + +[Post-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/20) + +## Review & Self Study + +* Basahin ang kasaysayan ng cryptography sa [History of cryptography page on Wikipedia](https://wikipedia.org/wiki/History_of_cryptography). +* Basahin ang tungkol sa X.509 certificates sa [X.509 page on Wikipedia](https://wikipedia.org/wiki/X.509). + +## Assignment + +[Gumawa ng bagong IoT device](assignment.md) + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/6-keep-your-plant-secure/assignment.md b/translations/tl/2-farm/lessons/6-keep-your-plant-secure/assignment.md new file mode 100644 index 00000000..4aa6930d --- /dev/null +++ b/translations/tl/2-farm/lessons/6-keep-your-plant-secure/assignment.md @@ -0,0 +1,29 @@ + +# Gumawa ng bagong IoT device + +## Mga Instruksyon + +Sa nakaraang 6 na aralin, natutunan mo ang tungkol sa digital na agrikultura at kung paano gamitin ang mga IoT device upang mangolekta ng datos para hulaan ang paglago ng halaman, at awtomatikong magdilig base sa mga pagbasa ng moisture sa lupa. + +Gamitin ang iyong mga natutunan upang gumawa ng bagong IoT device gamit ang isang sensor at actuator na iyong napili. Magpadala ng telemetry sa isang IoT Hub, at gamitin ito upang kontrolin ang isang actuator gamit ang serverless na code. Maaari mong gamitin ang sensor at actuator na ginamit mo na sa proyektong ito o sa nakaraang proyekto, o kung mayroon kang ibang hardware, subukan ang bago. + +## Rubric + +| Pamantayan | Napakahusay | Katanggap-tanggap | Kailangan ng Pagpapabuti | +| ---------- | ----------- | ----------------- | ------------------------ | +| Mag-code ng IoT device na gumagamit ng sensor at actuator | Nakapag-code ng IoT device na gumagana gamit ang sensor at actuator | Nakapag-code ng IoT device na gumagana gamit ang sensor o actuator | Hindi nakapag-code ng IoT device na gumagamit ng sensor o actuator | +| Ikonekta ang IoT device sa IoT Hub | Nakapag-deploy ng IoT Hub at nakapagpadala ng telemetry dito, at nakatanggap ng mga utos mula rito | Nakapag-deploy ng IoT Hub at nakapagpadala ng telemetry o nakatanggap ng mga utos | Hindi nakapag-deploy ng IoT Hub at nakipag-ugnayan dito mula sa isang IoT device | +| Kontrolin ang actuator gamit ang serverless na code | Nakapag-deploy ng Azure Function upang kontrolin ang device na na-trigger ng mga telemetry event | Nakapag-deploy ng Azure Function na na-trigger ng mga telemetry event ngunit hindi nakontrol ang actuator | Hindi nakapag-deploy ng Azure Function | + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md b/translations/tl/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md new file mode 100644 index 00000000..ea643324 --- /dev/null +++ b/translations/tl/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md @@ -0,0 +1,71 @@ + +# Gamitin ang X.509 certificate sa iyong device code - Virtual IoT Hardware at Raspberry Pi + +Sa bahaging ito ng aralin, ikokonekta mo ang iyong virtual IoT device o Raspberry Pi sa iyong IoT Hub gamit ang X.509 certificate. + +## Ikonekta ang iyong device sa IoT Hub + +Ang susunod na hakbang ay ikonekta ang iyong device sa IoT Hub gamit ang X.509 certificates. + +### Gawain - ikonekta sa IoT Hub + +1. Kopyahin ang key at certificate files sa folder na naglalaman ng iyong IoT device code. Kung gumagamit ka ng Raspberry Pi sa pamamagitan ng VS Code Remote SSH at ginawa ang mga keys sa iyong PC o Mac, maaari mong i-drag at i-drop ang mga files sa explorer sa VS Code upang makopya ang mga ito. + +1. Buksan ang `app.py` file. + +1. Upang kumonekta gamit ang X.509 certificate, kakailanganin mo ang host name ng IoT Hub, at ang X.509 certificate. Magsimula sa pamamagitan ng paglikha ng variable na naglalaman ng host name sa pamamagitan ng pagdaragdag ng sumusunod na code bago likhain ang device client: + + ```python + host_name = "" + ``` + + Palitan ang `` ng host name ng iyong IoT Hub. Makukuha mo ito mula sa seksyong `HostName` sa `connection_string`. Ito ang magiging pangalan ng iyong IoT Hub, na nagtatapos sa `.azure-devices.net`. + +1. Sa ibaba nito, magdeklara ng variable na may device ID: + + ```python + device_id = "soil-moisture-sensor-x509" + ``` + +1. Kakailanganin mo ng instance ng `X509` class na naglalaman ng X.509 files. Idagdag ang `X509` sa listahan ng mga klase na ini-import mula sa `azure.iot.device` module: + + ```python + from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse, X509 + ``` + +1. Gumawa ng `X509` class instance gamit ang iyong certificate at key files sa pamamagitan ng pagdaragdag ng code na ito sa ibaba ng deklarasyon ng `host_name`: + + ```python + x509 = X509("./soil-moisture-sensor-x509-cert.pem", "./soil-moisture-sensor-x509-key.pem") + ``` + + Ito ay lilikha ng `X509` class gamit ang `soil-moisture-sensor-x509-cert.pem` at `soil-moisture-sensor-x509-key.pem` files na ginawa kanina. + +1. Palitan ang linya ng code na lumilikha ng `device_client` mula sa connection string, gamit ang sumusunod: + + ```python + device_client = IoTHubDeviceClient.create_from_x509_certificate(x509, host_name, device_id) + ``` + + Ito ay magkokonekta gamit ang X.509 certificate sa halip na connection string. + +1. Tanggalin ang linya na may `connection_string` variable. + +1. Patakbuhin ang iyong code. Subaybayan ang mga mensaheng ipinapadala sa IoT Hub, at magpadala ng direct method requests tulad ng dati. Makikita mo ang device na kumokonekta at nagpapadala ng soil moisture readings, pati na rin ang pagtanggap ng direct method requests. + +> 💁 Makikita mo ang code na ito sa [code/pi](../../../../../2-farm/lessons/6-keep-your-plant-secure/code/pi) o [code/virtual-device](../../../../../2-farm/lessons/6-keep-your-plant-secure/code/virtual-device) folder. + +😀 Ang iyong soil moisture sensor program ay nakakonekta na sa iyong IoT Hub gamit ang X.509 certificate! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md b/translations/tl/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md new file mode 100644 index 00000000..fe50471c --- /dev/null +++ b/translations/tl/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md @@ -0,0 +1,17 @@ + +# Gamitin ang X.509 certificate sa iyong device code - Wio Terminal + +Sa kasalukuyan, hindi sinusuportahan ng Azure Arduino SDK ang X.509 certificates. Kung nais mong mag-eksperimento gamit ang X.509 certificates, maaari mong tingnan ang [Mga tagubilin para sa Virtual IoT device gamit ang Python SDK](single-board-computer-x509.md) + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/3-transport/README.md b/translations/tl/3-transport/README.md new file mode 100644 index 00000000..ef5ccf91 --- /dev/null +++ b/translations/tl/3-transport/README.md @@ -0,0 +1,38 @@ + +# Transportasyon mula sa bukid patungo sa pabrika - paggamit ng IoT para subaybayan ang paghahatid ng pagkain + +Maraming magsasaka ang nagtatanim ng pagkain para ibenta - maaaring sila ay mga komersyal na magsasaka na ibinebenta ang lahat ng kanilang ani, o mga magsasakang nagtatanim para sa sariling konsumo at ibinebenta ang sobrang ani upang makabili ng mga pangangailangan. Sa anumang paraan, kailangang makarating ang pagkain mula sa bukid patungo sa konsyumer, at karaniwang umaasa ito sa maramihang transportasyon mula sa mga bukid, patungo sa mga sentro o pagawaan, at pagkatapos ay sa mga tindahan. Halimbawa, ang isang magsasaka ng kamatis ay mag-aani ng mga kamatis, ilalagay ang mga ito sa mga kahon, ikakarga ang mga kahon sa trak, at ihahatid ito sa isang pagawaan. Ang mga kamatis ay aayusin, at mula roon ay ihahatid sa mga konsyumer bilang naprosesong pagkain, ibinebenta sa mga tindahan, o inihahain sa mga restawran. + +Makakatulong ang IoT sa supply chain na ito sa pamamagitan ng pagsubaybay sa pagkain habang nasa biyahe - tinitiyak na ang mga drayber ay nasa tamang ruta, sinusubaybayan ang lokasyon ng mga sasakyan, at nagbibigay ng alerto kapag dumating ang mga sasakyan upang maibaba ang pagkain at maihanda ito para sa pagproseso sa lalong madaling panahon. + +> 🎓 Ang *supply chain* ay ang sunod-sunod na mga aktibidad upang makagawa at maihatid ang isang bagay. Halimbawa, sa pagtatanim ng kamatis, saklaw nito ang binhi, lupa, pataba at suplay ng tubig, pagtatanim ng kamatis, paghahatid ng mga kamatis sa isang sentral na hub, pagdadala nito sa lokal na hub ng supermarket, pagdadala sa indibidwal na supermarket, paglalagay nito sa display, pagbebenta sa konsyumer, at pag-uwi upang kainin. Ang bawat hakbang ay parang mga kawing sa isang kadena. + +> 🎓 Ang bahagi ng transportasyon sa supply chain ay tinatawag na *logistics*. + +Sa 4 na araling ito, matututuhan mo kung paano gamitin ang Internet of Things upang mapabuti ang supply chain sa pamamagitan ng pagsubaybay sa pagkain habang ikinakarga ito sa isang (virtual) trak, na sinusubaybayan habang papunta sa destinasyon nito. Malalaman mo ang tungkol sa GPS tracking, kung paano mag-imbak at magpakita ng GPS data, at kung paano makatanggap ng alerto kapag dumating ang trak sa destinasyon nito. + +> 💁 Ang mga araling ito ay gagamit ng ilang cloud resources. Kung hindi mo matatapos ang lahat ng aralin sa proyektong ito, tiyaking [Linisin ang iyong proyekto](../clean-up.md). + +## Mga Paksa + +1. [Pagsubaybay sa lokasyon](lessons/1-location-tracking/README.md) +1. [Pag-iimbak ng data ng lokasyon](lessons/2-store-location-data/README.md) +1. [Pagpapakita ng data ng lokasyon](lessons/3-visualize-location-data/README.md) +1. [Geofences](lessons/4-geofences/README.md) + +## Mga Kredito + +Ang lahat ng aralin ay isinulat nang may ♥️ nina [Jen Looper](https://github.com/jlooper) at [Jim Bennett](https://GitHub.com/JimBobBennett) + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na pinagmulan. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/3-transport/lessons/1-location-tracking/README.md b/translations/tl/3-transport/lessons/1-location-tracking/README.md new file mode 100644 index 00000000..6ae27566 --- /dev/null +++ b/translations/tl/3-transport/lessons/1-location-tracking/README.md @@ -0,0 +1,216 @@ + +# Pagsubaybay sa Lokasyon + +![Isang sketchnote overview ng araling ito](../../../../../translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.tl.jpg) + +> Sketchnote ni [Nitya Narasimhan](https://github.com/nitya). I-click ang imahe para sa mas malaking bersyon. + +## Pre-lecture quiz + +[Pre-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/21) + +## Panimula + +Ang pangunahing proseso ng pagdadala ng pagkain mula sa magsasaka patungo sa konsumer ay kinabibilangan ng paglo-load ng mga kahon ng ani sa mga trak, barko, eroplano, o iba pang komersyal na sasakyang pang-transportasyon, at paghahatid ng pagkain sa isang lugar - maaaring direkta sa isang customer, o sa isang sentral na hub o bodega para sa pagproseso. Ang buong proseso mula sa sakahan hanggang sa konsumer ay bahagi ng tinatawag na *supply chain*. Ang video sa ibaba mula sa W. P. Carey School of Business ng Arizona State University ay nagpapaliwanag ng ideya ng supply chain at kung paano ito pinamamahalaan nang mas detalyado. + +[![Ano ang Supply Chain Management? Isang video mula sa W. P. Carey School of Business ng Arizona State University](https://img.youtube.com/vi/Mi1QBxVjZAw/0.jpg)](https://www.youtube.com/watch?v=Mi1QBxVjZAw) + +> 🎥 I-click ang imahe sa itaas upang panoorin ang video + +Ang pagdaragdag ng mga IoT device ay maaaring lubos na mapabuti ang iyong supply chain, na nagbibigay-daan sa iyo upang pamahalaan kung nasaan ang mga item, mas mahusay na magplano ng transportasyon at paghawak ng mga kalakal, at mas mabilis na tumugon sa mga problema. + +Kapag namamahala ng isang fleet ng mga sasakyan tulad ng mga trak, mahalagang malaman kung nasaan ang bawat sasakyan sa isang partikular na oras. Ang mga sasakyan ay maaaring lagyan ng GPS sensors na nagpapadala ng kanilang lokasyon sa mga IoT system, na nagbibigay-daan sa mga may-ari na matukoy ang kanilang lokasyon, makita ang ruta na kanilang tinahak, at malaman kung kailan sila darating sa kanilang destinasyon. Karamihan sa mga sasakyan ay gumagana sa labas ng saklaw ng WiFi, kaya gumagamit sila ng cellular networks upang magpadala ng ganitong uri ng data. Minsan ang GPS sensor ay naka-embed sa mas kumplikadong IoT device tulad ng mga electronic log books. Ang mga device na ito ay sumusubaybay kung gaano katagal ang isang trak sa biyahe upang matiyak na ang mga driver ay sumusunod sa mga lokal na batas sa oras ng trabaho. + +Sa araling ito, matututuhan mo kung paano subaybayan ang lokasyon ng mga sasakyan gamit ang Global Positioning System (GPS) sensor. + +Sa araling ito, tatalakayin natin: + +* [Mga konektadong sasakyan](../../../../../3-transport/lessons/1-location-tracking) +* [Geospatial coordinates](../../../../../3-transport/lessons/1-location-tracking) +* [Global Positioning Systems (GPS)](../../../../../3-transport/lessons/1-location-tracking) +* [Pagbasa ng GPS sensor data](../../../../../3-transport/lessons/1-location-tracking) +* [NMEA GPS data](../../../../../3-transport/lessons/1-location-tracking) +* [Pag-decode ng GPS sensor data](../../../../../3-transport/lessons/1-location-tracking) + +## Mga konektadong sasakyan + +Binabago ng IoT ang paraan ng pagdadala ng mga kalakal sa pamamagitan ng paglikha ng mga fleet ng *mga konektadong sasakyan*. Ang mga sasakyang ito ay konektado sa mga sentral na IT system na nag-uulat ng impormasyon tungkol sa kanilang lokasyon, at iba pang sensor data. Ang pagkakaroon ng fleet ng mga konektadong sasakyan ay may malawak na hanay ng benepisyo: + +* Pagsubaybay sa lokasyon - maaari mong matukoy kung nasaan ang isang sasakyan anumang oras, na nagbibigay-daan sa iyo upang: + + * Makakuha ng mga alerto kapag ang isang sasakyan ay malapit nang dumating sa destinasyon upang maghanda ng crew para sa pag-unload + * Hanapin ang mga ninakaw na sasakyan + * Pagsamahin ang data ng lokasyon at ruta sa mga problema sa trapiko upang payagan kang mag-redirect ng mga sasakyan sa gitna ng biyahe + * Sumunod sa buwis. Ang ilang mga bansa ay naniningil ng buwis sa mga sasakyan batay sa dami ng milyahe na tinahak sa mga pampublikong kalsada (tulad ng [New Zealand's RUC](https://www.nzta.govt.nz/vehicles/licensing-rego/road-user-charges/)), kaya ang pag-alam kung kailan ang isang sasakyan ay nasa pampublikong kalsada kumpara sa pribadong kalsada ay nagpapadali sa pagkalkula ng buwis na dapat bayaran. + * Malaman kung saan magpapadala ng mga maintenance crew sakaling magkaroon ng breakdown + +* Telemetry ng driver - matiyak na ang mga driver ay sumusunod sa mga limitasyon ng bilis, lumiliko sa naaangkop na bilis, maagang nagpreno nang mahusay, at nagmamaneho nang ligtas. Ang mga konektadong sasakyan ay maaari ring magkaroon ng mga camera upang i-record ang mga insidente. Maaari itong maiugnay sa insurance, na nagbibigay ng mas mababang rate para sa mga magagaling na driver. + +* Pagsunod sa oras ng driver - matiyak na ang mga driver ay nagmamaneho lamang sa kanilang legal na pinapayagang oras batay sa mga oras na binuksan at isinara ang makina. + +Ang mga benepisyong ito ay maaaring pagsamahin - halimbawa, pagsamahin ang pagsunod sa oras ng driver sa pagsubaybay sa lokasyon upang i-redirect ang mga driver kung hindi nila maabot ang kanilang destinasyon sa loob ng kanilang pinapayagang oras ng pagmamaneho. Ang mga ito ay maaari ding pagsamahin sa iba pang telemetry na partikular sa sasakyan, tulad ng data ng temperatura mula sa mga trak na may kontrol sa temperatura, na nagpapahintulot sa mga sasakyan na i-redirect kung ang kanilang kasalukuyang ruta ay nangangahulugan na ang mga kalakal ay hindi mapapanatili sa tamang temperatura. + +> 🎓 Ang logistics ay ang proseso ng pagdadala ng mga kalakal mula sa isang lugar patungo sa isa pa, tulad ng mula sa sakahan patungo sa supermarket sa pamamagitan ng isa o higit pang mga bodega. Ang isang magsasaka ay nag-iimpake ng mga kahon ng kamatis na ikinakarga sa isang trak, dinadala sa isang sentral na bodega, at inilalagay sa isang pangalawang trak na maaaring maglaman ng halo ng iba't ibang uri ng ani na pagkatapos ay ihahatid sa isang supermarket. + +Ang pangunahing bahagi ng pagsubaybay sa sasakyan ay ang GPS - mga sensor na maaaring matukoy ang kanilang lokasyon saanman sa mundo. Sa araling ito, matututuhan mo kung paano gumamit ng GPS sensor, simula sa pag-aaral kung paano tukuyin ang lokasyon sa mundo. + +## Geospatial coordinates + +Ang mga geospatial coordinates ay ginagamit upang tukuyin ang mga punto sa ibabaw ng mundo, katulad ng kung paano ginagamit ang mga coordinates upang gumuhit sa isang pixel sa screen ng computer o iposisyon ang mga tahi sa cross stitch. Para sa isang solong punto, mayroon kang pares ng mga coordinates. Halimbawa, ang Microsoft Campus sa Redmond, Washington, USA ay matatagpuan sa 47.6423109, -122.1390293. + +### Latitude at longitude + +Ang mundo ay isang globo - isang three-dimensional na bilog. Dahil dito, ang mga punto ay tinutukoy sa pamamagitan ng paghahati nito sa 360 degrees, katulad ng geometry ng mga bilog. Ang latitude ay sumusukat sa bilang ng mga degree mula hilaga hanggang timog, ang longitude ay sumusukat sa bilang ng mga degree mula silangan hanggang kanluran. + +> 💁 Walang tiyak na nakakaalam ng orihinal na dahilan kung bakit ang mga bilog ay hinati sa 360 degrees. Ang [degree (angle) page sa Wikipedia](https://wikipedia.org/wiki/Degree_(angle)) ay sumasaklaw sa ilan sa mga posibleng dahilan. + +![Mga linya ng latitude mula 90° sa North Pole, 45° sa pagitan ng North Pole at equator, 0° sa equator, -45° sa pagitan ng equator at South Pole, at -90° sa South Pole](../../../../../translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.tl.png) + +Ang latitude ay sinusukat gamit ang mga linya na umiikot sa mundo at tumatakbo nang parallel sa equator, na hinahati ang Northern at Southern Hemispheres sa 90° bawat isa. Ang equator ay nasa 0°, ang North Pole ay 90°, na kilala rin bilang 90° North, at ang South Pole ay nasa -90°, o 90° South. + +Ang longitude ay sinusukat bilang bilang ng mga degree na sinusukat silangan at kanluran. Ang 0° origin ng longitude ay tinatawag na *Prime Meridian*, at itinakda noong 1884 bilang isang linya mula sa North hanggang South Pole na dumadaan sa [British Royal Observatory sa Greenwich, England](https://wikipedia.org/wiki/Royal_Observatory,_Greenwich). + +![Mga linya ng longitude mula -180° sa kanluran ng Prime Meridian, hanggang 0° sa Prime Meridian, hanggang 180° sa silangan ng Prime Meridian](../../../../../translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.tl.png) + +> 🎓 Ang meridian ay isang imahinaryong tuwid na linya na dumadaan mula sa North Pole hanggang South Pole, na bumubuo ng kalahating bilog. + +Upang sukatin ang longitude ng isang punto, sinusukat mo ang bilang ng mga degree sa paligid ng equator mula sa Prime Meridian patungo sa isang meridian na dumadaan sa puntong iyon. Ang longitude ay mula -180°, o 180° West, hanggang 0° sa Prime Meridian, hanggang 180°, o 180° East. Ang 180° at -180° ay tumutukoy sa parehong punto, ang antimeridian o 180th meridian. Ito ay isang meridian sa kabaligtaran ng mundo mula sa Prime Meridian. + +> 💁 Ang antimeridian ay hindi dapat malito sa International Date Line, na nasa halos parehong posisyon, ngunit hindi isang tuwid na linya at nag-iiba upang umangkop sa mga geo-political boundaries. + +✅ Mag-research: Subukang hanapin ang latitude at longitude ng iyong kasalukuyang lokasyon. + +### Degrees, minutes at seconds vs decimal degrees + +Tradisyonal, ang mga sukat ng degrees ng latitude at longitude ay ginagawa gamit ang sexagesimal numbering, o base-60, isang sistema ng pagbilang na ginamit ng mga Sinaunang Babylonian na unang nagsukat at nagrekord ng oras at distansya. Ginagamit mo ang sexagesimal araw-araw marahil nang hindi mo namamalayan - ang paghahati ng oras sa 60 minuto at minuto sa 60 segundo. + +Ang longitude at latitude ay sinusukat sa degrees, minutes at seconds, kung saan ang isang minuto ay 1/60 ng degree, at 1 segundo ay 1/60 minuto. + +Halimbawa, sa equator: + +* Ang 1° ng latitude ay **111.3 kilometro** +* Ang 1 minuto ng latitude ay 111.3/60 = **1.855 kilometro** +* Ang 1 segundo ng latitude ay 1.855/60 = **0.031 kilometro** + +Ang simbolo para sa minuto ay isang single quote, para sa segundo ay isang double quote. Halimbawa, ang 2 degrees, 17 minutes, at 43 seconds ay isusulat bilang 2°17'43". Ang bahagi ng segundo ay ibinibigay bilang decimal, halimbawa kalahating segundo ay 0°0'0.5". + +Ang mga computer ay hindi gumagana sa base-60, kaya ang mga coordinates na ito ay ibinibigay bilang decimal degrees kapag gumagamit ng GPS data sa karamihan ng mga computer system. Halimbawa, ang 2°17'43" ay 2.295277. Karaniwang inaalis ang degree symbol. + +Ang mga coordinates para sa isang punto ay palaging ibinibigay bilang `latitude, longitude`, kaya ang halimbawa kanina ng Microsoft Campus sa 47.6423109,-122.117198 ay may: + +* Latitude na 47.6423109 (47.6423109 degrees hilaga ng equator) +* Longitude na -122.1390293 (122.1390293 degrees kanluran ng Prime Meridian). + +![Ang Microsoft Campus sa 47.6423109,-122.117198](../../../../../translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.tl.png) + +## Global Positioning Systems (GPS) + +Ang mga GPS system ay gumagamit ng maraming satellite na umiikot sa mundo upang matukoy ang iyong lokasyon. Marahil ay nagamit mo na ang mga GPS system nang hindi mo namamalayan - upang hanapin ang iyong lokasyon sa isang mapping app sa iyong telepono tulad ng Apple Maps o Google Maps, o upang makita kung nasaan ang iyong ride sa isang ride hailing app tulad ng Uber o Lyft, o kapag gumagamit ng satellite navigation (sat-nav) sa iyong sasakyan. + +> 🎓 Ang mga satellite sa 'satellite navigation' ay mga GPS satellite! + +Ang mga GPS system ay gumagana sa pamamagitan ng pagkakaroon ng ilang satellite na nagpapadala ng signal na may kasalukuyang posisyon ng bawat satellite, at isang eksaktong timestamp. Ang mga signal na ito ay ipinapadala sa pamamagitan ng radio waves at natatanggap ng antenna sa GPS sensor. Ang GPS sensor ay makakakita ng mga signal na ito, at gamit ang kasalukuyang oras ay sinusukat kung gaano katagal bago dumating ang signal mula sa satellite patungo sa sensor. Dahil ang bilis ng radio waves ay pare-pareho, magagamit ng GPS sensor ang timestamp na ipinadala upang malaman kung gaano kalayo ang sensor mula sa satellite. Sa pamamagitan ng pagsasama-sama ng data mula sa hindi bababa sa 3 satellite na may mga posisyong ipinadala, ang GPS sensor ay maaaring matukoy ang lokasyon nito sa mundo. + +> 💁 Ang mga GPS sensor ay nangangailangan ng mga antenna upang makita ang mga radio waves. Ang mga antenna na naka-embed sa mga trak at sasakyan na may on-board GPS ay nakaposisyon upang makakuha ng magandang signal, karaniwang sa windshield o bubong. Kung gumagamit ka ng hiwalay na GPS system, tulad ng smartphone o IoT device, kailangan mong tiyakin na ang antenna na naka-embed sa GPS system o telepono ay may malinaw na tanawin ng kalangitan, tulad ng pag-mount sa iyong windshield. + +![Sa pamamagitan ng pag-alam sa distansya mula sa sensor patungo sa maraming satellite, maaaring kalkulahin ang lokasyon](../../../../../translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.tl.png) + +Ang mga GPS satellite ay umiikot sa mundo, hindi sa isang nakapirming punto sa itaas ng sensor, kaya ang data ng lokasyon ay kinabibilangan ng altitude sa itaas ng sea level pati na rin ang latitude at longitude. + +Ang GPS ay dating may mga limitasyon sa katumpakan na ipinatupad ng militar ng US, na nililimitahan ang katumpakan sa humigit-kumulang 5 metro. Ang limitasyong ito ay inalis noong 2000, na nagpapahintulot sa katumpakan na 30 sentimetro. Ang pagkuha ng katumpakan na ito ay hindi palaging posible dahil sa interference sa mga signal. + +✅ Kung mayroon kang smartphone, buksan ang mapping app at tingnan kung gaano katumpak ang iyong lokasyon. Maaaring tumagal ng kaunting oras para sa iyong telepono na makakita ng maraming satellite upang makakuha ng mas tumpak na lokasyon. +💁 Ang mga satellite ay may dalang mga atomic clock na napaka-eksakto, ngunit nagkakaroon ito ng paglihis na 38 microseconds (0.0000038 segundo) bawat araw kumpara sa mga atomic clock sa Earth, dahil sa pagbagal ng oras habang tumataas ang bilis, ayon sa mga teorya ni Einstein ng espesyal at pangkalahatang relativity - mas mabilis ang paggalaw ng mga satellite kaysa sa pag-ikot ng Earth. Ang paglihis na ito ay ginamit upang patunayan ang mga hula ng espesyal at pangkalahatang relativity, at kailangang isaayos ito sa disenyo ng mga GPS system. Literal na mas mabagal ang takbo ng oras sa isang GPS satellite. +Ang mga GPS system ay binuo at inilunsad ng iba't ibang bansa at unyon pampulitika kabilang ang US, Russia, Japan, India, EU, at China. Ang mga modernong GPS sensor ay maaaring kumonekta sa karamihan ng mga sistemang ito upang makakuha ng mas mabilis at mas tumpak na lokasyon. + +> 🎓 Ang mga grupo ng mga satellite sa bawat deployment ay tinatawag na mga konstelasyon. + +## Basahin ang data mula sa GPS sensor + +Karamihan sa mga GPS sensor ay nagpapadala ng data sa pamamagitan ng UART. + +> ⚠️ Tinalakay ang UART sa [project 2, lesson 2](../../../2-farm/lessons/2-detect-soil-moisture/README.md#universal-asynchronous-receiver-transmitter-uart). Balikan ang araling iyon kung kinakailangan. + +Maaari mong gamitin ang GPS sensor sa iyong IoT device upang makakuha ng GPS data. + +### Gawain - ikonekta ang GPS sensor at basahin ang GPS data + +Sundin ang kaukulang gabay upang basahin ang GPS data gamit ang iyong IoT device: + +* [Arduino - Wio Terminal](wio-terminal-gps-sensor.md) +* [Single-board computer - Raspberry Pi](pi-gps-sensor.md) +* [Single-board computer - Virtual device](virtual-device-gps-sensor.md) + +## NMEA GPS data + +Kapag pinatakbo mo ang iyong code, maaaring nakita mo ang tila walang kabuluhang output. Ito ay aktwal na standard na GPS data, at bawat bahagi nito ay may kahulugan. + +Ang mga GPS sensor ay naglalabas ng data gamit ang mga NMEA message, ayon sa NMEA 0183 standard. Ang NMEA ay nangangahulugang [National Marine Electronics Association](https://www.nmea.org), isang organisasyong pangkalakalan sa US na nagtatakda ng mga pamantayan para sa komunikasyon sa pagitan ng mga elektronikong pangdagat. + +> 💁 Ang standard na ito ay proprietary at nagkakahalaga ng hindi bababa sa US$2,000, ngunit sapat na impormasyon tungkol dito ang nasa pampublikong domain kaya karamihan sa standard ay na-reverse engineer at maaaring gamitin sa open source at iba pang non-commercial na code. + +Ang mga mensaheng ito ay batay sa teksto. Ang bawat mensahe ay binubuo ng isang *pangungusap* na nagsisimula sa karakter na `$`, kasunod ng 2 karakter upang ipahiwatig ang pinagmulan ng mensahe (hal. GP para sa US GPS system, GN para sa GLONASS, ang Russian GPS system), at 3 karakter upang ipahiwatig ang uri ng mensahe. Ang natitirang bahagi ng mensahe ay mga field na pinaghihiwalay ng mga kuwit, na nagtatapos sa isang bagong linya. + +Ilan sa mga uri ng mensahe na maaaring matanggap ay: + +| Uri | Paglalarawan | +| ---- | ----------- | +| GGA | GPS Fix Data, kabilang ang latitude, longitude, at altitude ng GPS sensor, pati na rin ang bilang ng mga satellite na nasa view upang makalkula ang lokasyon. | +| ZDA | Ang kasalukuyang petsa at oras, kabilang ang lokal na time zone | +| GSV | Mga detalye ng mga satellite na nasa view - tinukoy bilang mga satellite na kayang ma-detect ng GPS sensor | + +> 💁 Kasama sa GPS data ang mga time stamp, kaya maaaring makuha ng iyong IoT device ang oras mula sa GPS sensor kung kinakailangan, sa halip na umasa sa isang NTP server o internal real-time clock. + +Ang GGA message ay kasama ang kasalukuyang lokasyon gamit ang format na `(dd)dmm.mmmm`, kasama ang isang karakter upang ipahiwatig ang direksyon. Ang `d` sa format ay degrees, ang `m` ay minutes, at ang seconds ay nasa decimal ng minutes. Halimbawa, ang 2°17'43" ay magiging 217.716666667 - 2 degrees, 17.716666667 minutes. + +Ang direksyon ay maaaring `N` o `S` para sa latitude upang ipahiwatig ang hilaga o timog, at `E` o `W` para sa longitude upang ipahiwatig ang silangan o kanluran. Halimbawa, ang latitude na 2°17'43" ay magkakaroon ng direksyon na `N`, habang ang -2°17'43" ay magkakaroon ng direksyon na `S`. + +Halimbawa - ang NMEA sentence na `$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67` + +* Ang bahagi ng latitude ay `4738.538654,N`, na nagko-convert sa 47.6423109 sa decimal degrees. Ang `4738.538654` ay 47.6423109, at ang direksyon ay `N` (hilaga), kaya ito ay positibong latitude. + +* Ang bahagi ng longitude ay `12208.341758,W`, na nagko-convert sa -122.1390293 sa decimal degrees. Ang `12208.341758` ay 122.1390293°, at ang direksyon ay `W` (kanluran), kaya ito ay negatibong longitude. + +## I-decode ang GPS sensor data + +Sa halip na gamitin ang raw NMEA data, mas mainam na i-decode ito sa mas kapaki-pakinabang na format. Maraming open-source na library na maaari mong gamitin upang makatulong na kunin ang mahalagang data mula sa raw NMEA messages. + +### Gawain - i-decode ang GPS sensor data + +Sundin ang kaukulang gabay upang i-decode ang GPS sensor data gamit ang iyong IoT device: + +* [Arduino - Wio Terminal](wio-terminal-gps-decode.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-gps-decode.md) + +--- + +## 🚀 Hamon + +Sumulat ng sarili mong NMEA decoder! Sa halip na umasa sa mga third-party library upang i-decode ang mga NMEA sentence, kaya mo bang gumawa ng sarili mong decoder upang kunin ang latitude at longitude mula sa mga NMEA sentence? + +## Post-lecture quiz + +[Post-lecture quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/22) + +## Review at Pag-aaral sa Sarili + +* Magbasa pa tungkol sa Geospatial Coordinates sa [Geographic coordinate system page sa Wikipedia](https://wikipedia.org/wiki/Geographic_coordinate_system). +* Magbasa tungkol sa Prime Meridians sa iba pang celestial bodies bukod sa Earth sa [Prime Meridian page sa Wikipedia](https://wikipedia.org/wiki/Prime_meridian#Prime_meridian_on_other_planetary_bodies) +* Mag-research tungkol sa iba't ibang GPS system mula sa iba't ibang gobyerno at unyon pampulitika tulad ng EU, Japan, Russia, India, at US. + +## Takdang Aralin + +[Pag-aralan ang iba pang GPS data](assignment.md) + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/3-transport/lessons/1-location-tracking/assignment.md b/translations/tl/3-transport/lessons/1-location-tracking/assignment.md new file mode 100644 index 00000000..eaff772d --- /dev/null +++ b/translations/tl/3-transport/lessons/1-location-tracking/assignment.md @@ -0,0 +1,29 @@ + +# Siyasatin ang iba pang GPS data + +## Mga Instruksyon + +Ang mga NMEA sentences na nagmumula sa iyong GPS sensor ay may iba pang data bukod sa lokasyon. Siyasatin ang karagdagang data, at gamitin ito sa iyong IoT device. + +Halimbawa - kaya mo bang makuha ang kasalukuyang petsa at oras? Kung gumagamit ka ng microcontroller, kaya mo bang i-set ang orasan gamit ang GPS data sa parehong paraan na ginawa mo gamit ang NTP signals sa nakaraang proyekto? Kaya mo bang makuha ang elevation (ang taas mo mula sa sea level), o ang kasalukuyang bilis mo? + +Kung gumagamit ka ng virtual na IoT device, maaari mong makuha ang ilan sa mga data na ito sa pamamagitan ng pagpapadala ng NMEA sentences na nabuo gamit ang mga tool [nmeagen.org](https://www.nmeagen.org). + +## Rubric + +| Pamantayan | Napakahusay | Katamtaman | Kailangan ng Pagpapabuti | +| ---------- | ----------- | ---------- | ------------------------ | +| Makakuha ng higit pang GPS data | Kayang makuha at magamit ang higit pang GPS data, bilang telemetry o para i-set up ang IoT device | Kayang makuha ang higit pang GPS data, ngunit hindi ito magamit | Hindi kayang makuha ang higit pang GPS data | + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa orihinal nitong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/3-transport/lessons/1-location-tracking/pi-gps-sensor.md b/translations/tl/3-transport/lessons/1-location-tracking/pi-gps-sensor.md new file mode 100644 index 00000000..f8f96763 --- /dev/null +++ b/translations/tl/3-transport/lessons/1-location-tracking/pi-gps-sensor.md @@ -0,0 +1,193 @@ + +# Basahin ang GPS Data - Raspberry Pi + +Sa bahaging ito ng aralin, magdadagdag ka ng GPS sensor sa iyong Raspberry Pi at babasahin ang mga halaga mula rito. + +## Kagamitan + +Kailangan ng Raspberry Pi ng GPS sensor. + +Ang sensor na gagamitin mo ay ang [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Ang sensor na ito ay maaaring kumonekta sa maraming GPS system para sa mabilis at tumpak na pagkuha ng lokasyon. Binubuo ang sensor ng 2 bahagi - ang pangunahing electronics ng sensor at isang panlabas na antena na nakakabit sa pamamagitan ng manipis na kawad upang makuha ang mga radio wave mula sa mga satellite. + +Ito ay isang UART sensor, kaya't nagpapadala ito ng GPS data gamit ang UART. + +## Ikonekta ang GPS Sensor + +Maaaring ikonekta ang Grove GPS sensor sa Raspberry Pi. + +### Gawain - Ikonekta ang GPS Sensor + +Ikonekta ang GPS sensor. + +![Isang Grove GPS sensor](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.tl.png) + +1. Ipasok ang isang dulo ng Grove cable sa socket ng GPS sensor. Isang paraan lamang ang tamang pagpasok nito. + +1. Kapag naka-off ang Raspberry Pi, ikonekta ang kabilang dulo ng Grove cable sa UART socket na may markang **UART** sa Grove Base hat na nakakabit sa Pi. Ang socket na ito ay nasa gitnang hilera, sa gilid na pinakamalapit sa SD Card slot, sa kabilang dulo mula sa mga USB port at ethernet socket. + + ![Ang Grove GPS sensor na nakakonekta sa UART socket](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.tl.png) + +1. Ilagay ang GPS sensor sa posisyon kung saan ang nakakabit na antena ay may malinaw na tanaw sa kalangitan - mas mainam kung malapit sa isang bukas na bintana o sa labas. Mas madali itong makakuha ng malinaw na signal kung walang nakaharang sa antena. + +## Iprograma ang GPS Sensor + +Ngayon ay maaaring i-program ang Raspberry Pi upang magamit ang nakakabit na GPS sensor. + +### Gawain - Iprograma ang GPS Sensor + +Iprograma ang device. + +1. I-on ang Pi at hintaying mag-boot. + +1. Ang GPS sensor ay may 2 LED - isang asul na LED na kumikislap kapag nagpapadala ng data, at isang berdeng LED na kumikislap bawat segundo kapag tumatanggap ng data mula sa mga satellite. Siguraduhing kumikislap ang asul na LED kapag in-on mo ang Pi. Pagkalipas ng ilang minuto, ang berdeng LED ay magsisimulang kumislap - kung hindi, maaaring kailanganin mong ilipat ang posisyon ng antena. + +1. Ilunsad ang VS Code, alinman direkta sa Pi, o kumonekta gamit ang Remote SSH extension. + + > ⚠️ Maaari kang sumangguni sa [mga tagubilin para sa pag-set up at paglulunsad ng VS Code sa aralin 1 kung kinakailangan](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. Sa mga mas bagong bersyon ng Raspberry Pi na may suporta sa Bluetooth, mayroong conflict sa pagitan ng serial port na ginagamit para sa Bluetooth at ng isa na ginagamit ng Grove UART port. Upang ayusin ito, gawin ang mga sumusunod: + + 1. Mula sa terminal ng VS Code, i-edit ang file na `/boot/config.txt` gamit ang `nano`, isang built-in na text editor sa terminal, gamit ang sumusunod na command: + + ```sh + sudo nano /boot/config.txt + ``` + + > Ang file na ito ay hindi maaaring i-edit gamit ang VS Code dahil kailangan itong i-edit gamit ang `sudo` permissions, o mas mataas na antas ng pahintulot. Ang VS Code ay hindi tumatakbo gamit ang ganitong pahintulot. + + 1. Gamitin ang mga cursor keys upang pumunta sa dulo ng file, pagkatapos ay kopyahin ang code sa ibaba at i-paste ito sa dulo ng file: + + ```ini + dtoverlay=pi3-miniuart-bt + dtoverlay=pi3-disable-bt + enable_uart=1 + ``` + + Maaari kang mag-paste gamit ang normal na keyboard shortcuts para sa iyong device (`Ctrl+v` sa Windows, Linux o Raspberry Pi OS, `Cmd+v` sa macOS). + + 1. I-save ang file na ito at lumabas sa nano sa pamamagitan ng pagpindot sa `Ctrl+x`. Pindutin ang `y` kapag tinanong kung nais mong i-save ang binagong buffer, pagkatapos ay pindutin ang `enter` upang kumpirmahin na nais mong i-overwrite ang `/boot/config.txt`. + + > Kung nagkamali ka, maaari kang lumabas nang hindi nagse-save, pagkatapos ay ulitin ang mga hakbang na ito. + + 1. I-edit ang file na `/boot/cmdline.txt` sa nano gamit ang sumusunod na command: + + ```sh + sudo nano /boot/cmdline.txt + ``` + + 1. Ang file na ito ay may maraming key/value pairs na pinaghihiwalay ng mga espasyo. Alisin ang anumang key/value pairs para sa key na `console`. Malamang na ganito ang hitsura: + + ```output + console=serial0,115200 console=tty1 + ``` + + Maaari kang gumamit ng cursor keys upang pumunta sa mga entry na ito, pagkatapos ay tanggalin gamit ang normal na `del` o `backspace` keys. + + Halimbawa, kung ganito ang orihinal na file: + + ```output + console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait + ``` + + Ang bagong bersyon ay magiging ganito: + + ```output + root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait + ``` + + 1. Sundin ang mga hakbang sa itaas upang i-save ang file na ito at lumabas sa nano. + + 1. I-reboot ang iyong Pi, pagkatapos ay muling kumonekta sa VS Code kapag ang Pi ay na-reboot na. + +1. Mula sa terminal, gumawa ng bagong folder sa home directory ng user na `pi` na tinatawag na `gps-sensor`. Gumawa ng file sa folder na ito na tinatawag na `app.py`. + +1. Buksan ang folder na ito sa VS Code. + +1. Ang GPS module ay nagpapadala ng UART data sa isang serial port. I-install ang `pyserial` Pip package upang makipag-ugnayan sa serial port mula sa iyong Python code: + + ```sh + pip3 install pyserial + ``` + +1. Idagdag ang sumusunod na code sa iyong `app.py` file: + + ```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) + ``` + + Ang code na ito ay nag-i-import ng `serial` module mula sa `pyserial` Pip package. Pagkatapos ay kumokonekta ito sa `/dev/ttyAMA0` serial port - ito ang address ng serial port na ginagamit ng Grove Pi Base Hat para sa UART port nito. Nililinis din nito ang anumang umiiral na data mula sa serial connection na ito. + + Susunod, isang function na tinatawag na `print_gps_data` ang tinutukoy na nagpi-print ng linya na ipinasa rito sa console. + + Pagkatapos, ang code ay paulit-ulit na nagbabasa ng maraming linya ng teksto mula sa serial port sa bawat loop. Tinatawag nito ang `print_gps_data` function para sa bawat linya. + + Pagkatapos mabasa ang lahat ng data, ang loop ay natutulog ng 1 segundo, pagkatapos ay muling susubukan. + +1. Patakbuhin ang code na ito. Makikita mo ang raw output mula sa GPS sensor, na maaaring ganito: + + ```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 + ``` + + > Kung makakakuha ka ng isa sa mga sumusunod na error kapag pinapatigil at muling pinapatakbo ang iyong code, magdagdag ng `try - except` block sa iyong 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) + ``` + +> 💁 Maaari mong makita ang code na ito sa [code-gps/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps/pi) folder. + +😀 Tagumpay ang iyong programa para sa GPS sensor! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md b/translations/tl/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md new file mode 100644 index 00000000..a623d57b --- /dev/null +++ b/translations/tl/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md @@ -0,0 +1,75 @@ + +# I-decode ang GPS data - Virtual IoT Hardware at Raspberry Pi + +Sa bahaging ito ng aralin, ide-decode mo ang mga NMEA message na nabasa mula sa GPS sensor gamit ang Raspberry Pi o Virtual IoT Device, at kukunin ang latitude at longitude. + +## I-decode ang GPS data + +Kapag nabasa na ang raw NMEA data mula sa serial port, maaari itong i-decode gamit ang isang open source na NMEA library. + +### Gawain - i-decode ang GPS data + +I-program ang device upang i-decode ang GPS data. + +1. Buksan ang proyekto ng `gps-sensor` app kung hindi pa ito nakabukas. + +1. I-install ang `pynmea2` Pip package. Ang package na ito ay may code para sa pag-decode ng mga NMEA message. + + ```sh + pip3 install pynmea2 + ``` + +1. Idagdag ang sumusunod na code sa mga imports sa file na `app.py` upang i-import ang `pynmea2` module: + + ```python + import pynmea2 + ``` + +1. Palitan ang nilalaman ng function na `print_gps_data` ng sumusunod: + + ```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') + ``` + + Ang code na ito ay gagamit ng `pynmea2` library upang i-parse ang linya na nabasa mula sa UART serial port. + + Kung ang uri ng sentence ng message ay `GGA`, ito ay isang position fix message at ipoproseso. Ang latitude at longitude na mga halaga ay babasahin mula sa message at iko-convert sa decimal degrees mula sa NMEA `(d)ddmm.mmmm` format. Ang function na `dm_to_sd` ang gumagawa ng conversion na ito. + + Susuriin ang direksyon ng latitude, at kung ang latitude ay nasa timog, iko-convert ang halaga sa negatibong numero. Ganoon din sa longitude, kung ito ay nasa kanluran, iko-convert ito sa negatibong numero. + + Sa huli, ipi-print ang mga coordinate sa console, kasama ang bilang ng mga satellite na ginamit upang makuha ang lokasyon. + +1. Patakbuhin ang code. Kung gumagamit ka ng virtual IoT device, siguraduhing tumatakbo ang CounterFit app at ipinapadala ang GPS data. + + ```output + pi@raspberrypi:~/gps-sensor $ python3 app.py + 47.6423109,-122.1390293 - from 3 satellites + ``` + +> 💁 Maaari mong mahanap ang code na ito sa [code-gps-decode/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/virtual-device) folder, o sa [code-gps-decode/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/pi) folder. + +😀 Tagumpay ang iyong GPS sensor program na may data decoding! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md b/translations/tl/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md new file mode 100644 index 00000000..1b88ad00 --- /dev/null +++ b/translations/tl/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md @@ -0,0 +1,144 @@ + +# Basahin ang GPS data - Virtual IoT Hardware + +Sa bahaging ito ng aralin, magdadagdag ka ng GPS sensor sa iyong virtual na IoT device, at babasahin ang mga halaga mula rito. + +## Virtual Hardware + +Ang virtual na IoT device ay gagamit ng simulated GPS sensor na naa-access sa UART sa pamamagitan ng serial port. + +Ang pisikal na GPS sensor ay may antena upang makuha ang mga radio wave mula sa mga GPS satellite, at i-convert ang mga GPS signal sa GPS data. Ang virtual na bersyon ay ginagaya ito sa pamamagitan ng pagpapahintulot sa iyo na mag-set ng latitude at longitude, magpadala ng raw NMEA sentences, o mag-upload ng GPX file na may maraming lokasyon na maaaring ibalik nang sunud-sunod. + +> 🎓 Ang NMEA sentences ay tatalakayin sa susunod na bahagi ng aralin + +### Idagdag ang sensor sa CounterFit + +Upang magamit ang virtual na GPS sensor, kailangan mong magdagdag ng isa sa CounterFit app. + +#### Gawain - idagdag ang sensor sa CounterFit + +Idagdag ang GPS sensor sa CounterFit app. + +1. Gumawa ng bagong Python app sa iyong computer sa isang folder na tinatawag na `gps-sensor` na may isang file na tinatawag na `app.py` at isang Python virtual environment, at idagdag ang CounterFit pip packages. + + > ⚠️ Maaari mong tingnan ang [mga tagubilin para sa paglikha at pag-set up ng CounterFit Python project sa aralin 1 kung kinakailangan](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Mag-install ng karagdagang Pip package upang mag-install ng CounterFit shim na maaaring makipag-usap sa mga UART-based sensors sa pamamagitan ng serial connection. Siguraduhing ini-install mo ito mula sa terminal na may activated na virtual environment. + + ```sh + pip install counterfit-shims-serial + ``` + +1. Siguraduhing tumatakbo ang CounterFit web app. + +1. Gumawa ng GPS sensor: + + 1. Sa *Create sensor* box sa *Sensors* pane, i-drop down ang *Sensor type* box at piliin ang *UART GPS*. + + 1. Iwanang nakatakda ang *Port* sa */dev/ttyAMA0*. + + 1. Piliin ang **Add** button upang gumawa ng GPS sensor sa port `/dev/ttyAMA0`. + + ![Ang mga setting ng GPS sensor](../../../../../translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.tl.png) + + Ang GPS sensor ay gagawin at lilitaw sa listahan ng mga sensor. + + ![Ang GPS sensor na ginawa](../../../../../translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.tl.png) + +## I-program ang GPS sensor + +Ang Virtual IoT device ay maaari nang i-program upang magamit ang virtual na GPS sensor. + +### Gawain - i-program ang GPS sensor + +I-program ang GPS sensor app. + +1. Siguraduhing bukas ang `gps-sensor` app sa VS Code. + +1. Buksan ang file na `app.py`. + +1. Idagdag ang sumusunod na code sa itaas ng `app.py` upang ikonekta ang app sa CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Idagdag ang sumusunod na code sa ibaba nito upang mag-import ng ilang kinakailangang libraries, kabilang ang library para sa CounterFit serial port: + + ```python + import time + import counterfit_shims_serial + + serial = counterfit_shims_serial.Serial('/dev/ttyAMA0') + ``` + + Ang code na ito ay nag-i-import ng `serial` module mula sa `counterfit_shims_serial` Pip package. Pagkatapos ay kumokonekta ito sa `/dev/ttyAMA0` serial port - ito ang address ng serial port na ginagamit ng virtual na GPS sensor para sa kanyang UART port. + +1. Idagdag ang sumusunod na code sa ibaba nito upang basahin mula sa serial port at i-print ang mga halaga sa console: + + ```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) + ``` + + Ang isang function na tinatawag na `print_gps_data` ay tinukoy na nagpi-print ng linya na ipinasa rito sa console. + + Susunod, ang code ay nag-loop nang walang katapusan, binabasa ang maraming linya ng teksto hangga't maaari mula sa serial port sa bawat loop. Tinatawag nito ang `print_gps_data` function para sa bawat linya. + + Pagkatapos mabasa ang lahat ng data, ang loop ay magpapahinga ng 1 segundo, pagkatapos ay susubukan muli. + +1. Patakbuhin ang code na ito, siguraduhing gumagamit ka ng ibang terminal kaysa sa terminal kung saan tumatakbo ang CounterFit app, upang manatiling tumatakbo ang CounterFit app. + +1. Mula sa CounterFit app, baguhin ang halaga ng GPS sensor. Maaari mo itong gawin sa isa sa mga sumusunod na paraan: + + * Itakda ang **Source** sa `Lat/Lon`, at mag-set ng tiyak na latitude, longitude, at bilang ng mga satellite na ginamit upang makuha ang GPS fix. Ang halagang ito ay ipapadala nang isang beses lamang, kaya i-check ang **Repeat** box upang ang data ay maulit bawat segundo. + + ![Ang GPS sensor na may lat lon na napili](../../../../../translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.tl.png) + + * Itakda ang **Source** sa `NMEA` at magdagdag ng ilang NMEA sentences sa text box. Ang lahat ng mga halagang ito ay ipapadala, na may delay na 1 segundo bago mabasa ang bawat bagong GGA (position fix) sentence. + + ![Ang GPS sensor na may NMEA sentences na nakatakda](../../../../../translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.tl.png) + + Maaari kang gumamit ng tool tulad ng [nmeagen.org](https://www.nmeagen.org) upang bumuo ng mga sentences sa pamamagitan ng pagguhit sa mapa. Ang mga halagang ito ay ipapadala nang isang beses lamang, kaya i-check ang **Repeat** box upang ang data ay maulit isang segundo pagkatapos maipadala ang lahat. + + * Itakda ang **Source** sa GPX file, at mag-upload ng GPX file na may mga track locations. Maaari kang mag-download ng GPX files mula sa iba't ibang sikat na mapping at hiking sites, tulad ng [AllTrails](https://www.alltrails.com/). Ang mga file na ito ay naglalaman ng maraming GPS locations bilang isang trail, at ang GPS sensor ay magbabalik ng bawat bagong lokasyon sa 1 segundo na pagitan. + + ![Ang GPS sensor na may GPX file na nakatakda](../../../../../translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.tl.png) + + Ang mga halagang ito ay ipapadala nang isang beses lamang, kaya i-check ang **Repeat** box upang ang data ay maulit isang segundo pagkatapos maipadala ang lahat. + + Kapag na-configure mo na ang mga setting ng GPS, piliin ang **Set** button upang i-commit ang mga halagang ito sa sensor. + +1. Makikita mo ang raw output mula sa GPS sensor, na maaaring ganito: + + ```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 + ``` + +> 💁 Maaari mong makita ang code na ito sa [code-gps/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps/virtual-device) folder. + +😀 Tagumpay ang iyong GPS sensor program! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na pinagmulan. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md b/translations/tl/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md new file mode 100644 index 00000000..efb06787 --- /dev/null +++ b/translations/tl/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md @@ -0,0 +1,83 @@ + +# Decode GPS data - Wio Terminal + +Sa bahaging ito ng aralin, ide-decode mo ang mga NMEA message na nabasa mula sa GPS sensor ng Wio Terminal, at kukunin ang latitude at longitude. + +## Decode GPS data + +Kapag nabasa na ang raw NMEA data mula sa serial port, maaari itong i-decode gamit ang isang open source na NMEA library. + +### Gawain - i-decode ang GPS data + +I-program ang device para i-decode ang GPS data. + +1. Buksan ang proyekto ng `gps-sensor` app kung hindi pa ito nakabukas. + +1. Magdagdag ng library dependency para sa [TinyGPSPlus](https://github.com/mikalhart/TinyGPSPlus) library sa `platformio.ini` file ng proyekto. Ang library na ito ay may code para sa pag-decode ng NMEA data. + + ```ini + lib_deps = + mikalhart/TinyGPSPlus @ 1.0.2 + ``` + +1. Sa `main.cpp`, magdagdag ng include directive para sa TinyGPSPlus library: + + ```cpp + #include + ``` + +1. Sa ibaba ng deklarasyon ng `Serial3`, magdeklara ng TinyGPSPlus object para iproseso ang mga NMEA sentence: + + ```cpp + TinyGPSPlus gps; + ``` + +1. Palitan ang nilalaman ng `printGPSData` function ng sumusunod: + + ```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"); + } + } + ``` + + Ang code na ito ay nagbabasa ng susunod na character mula sa UART serial port papunta sa `gps` NMEA decoder. Pagkatapos ng bawat character, iche-check nito kung ang decoder ay nakabasa ng valid na sentence, at pagkatapos ay iche-check kung nakabasa ito ng valid na lokasyon. Kung valid ang lokasyon, ipapadala ito sa serial monitor, kasama ang bilang ng mga satellite na tumulong sa pag-fix ng data. + +1. I-build at i-upload ang code sa Wio Terminal. + +1. Kapag na-upload na, maaari mong i-monitor ang GPS location data gamit ang 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.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 + ``` + +> 💁 Matatagpuan mo ang code na ito sa [code-gps-decode/wio-terminal](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/wio-terminal) folder. + +😀 Tagumpay ang iyong GPS sensor program na may data decoding! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md b/translations/tl/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md new file mode 100644 index 00000000..db182013 --- /dev/null +++ b/translations/tl/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md @@ -0,0 +1,154 @@ + +# Basahin ang GPS Data - Wio Terminal + +Sa bahaging ito ng aralin, magdadagdag ka ng GPS sensor sa iyong Wio Terminal at babasahin ang mga halaga mula rito. + +## Kagamitan + +Kailangan ng Wio Terminal ng GPS sensor. + +Ang sensor na gagamitin mo ay ang [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Ang sensor na ito ay maaaring kumonekta sa maraming GPS system para sa mabilis at tumpak na pagkuha ng lokasyon. Binubuo ang sensor ng 2 bahagi - ang pangunahing electronics ng sensor at isang panlabas na antena na nakakabit sa pamamagitan ng manipis na kawad upang makuha ang mga radio wave mula sa mga satellite. + +Ito ay isang UART sensor, kaya't ipinapadala nito ang GPS data sa pamamagitan ng UART. + +### Ikonekta ang GPS Sensor + +Maaaring ikonekta ang Grove GPS sensor sa Wio Terminal. + +#### Gawain - ikonekta ang GPS sensor + +Ikonekta ang GPS sensor. + +![Isang Grove GPS sensor](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.tl.png) + +1. Ipasok ang isang dulo ng Grove cable sa socket ng GPS sensor. Isang direksyon lamang ang tamang paraan ng pagpasok nito. + +1. Habang ang Wio Terminal ay hindi nakakonekta sa iyong computer o iba pang power supply, ikonekta ang kabilang dulo ng Grove cable sa kaliwang Grove socket ng Wio Terminal habang nakaharap ka sa screen. Ito ang socket na pinakamalapit sa power button. + + ![Ang Grove GPS sensor na nakakonekta sa kaliwang socket](../../../../../translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.tl.png) + +1. Iposisyon ang GPS sensor upang ang nakakabit na antena ay may malinaw na tanaw sa kalangitan - mas mainam kung malapit sa isang bukas na bintana o sa labas. Mas madali itong makakuha ng malinaw na signal kung walang nakaharang sa antena. + +1. Maaari mo nang ikonekta ang Wio Terminal sa iyong computer. + +1. Ang GPS sensor ay may 2 LED - isang asul na LED na kumikislap kapag may ipinapadalang data, at isang berdeng LED na kumikislap bawat segundo kapag tumatanggap ng data mula sa mga satellite. Siguraduhing kumikislap ang asul na LED kapag binuksan mo ang Wio Terminal. Pagkalipas ng ilang minuto, ang berdeng LED ay magsisimulang kumislap - kung hindi, maaaring kailangan mong ilipat ang posisyon ng antena. + +## Iprograma ang GPS Sensor + +Ngayon ay maaari nang iprograma ang Wio Terminal upang magamit ang nakakabit na GPS sensor. + +### Gawain - iprograma ang GPS sensor + +Iprograma ang device. + +1. Gumawa ng bagong Wio Terminal project gamit ang PlatformIO. Tawagin ang proyektong ito na `gps-sensor`. Magdagdag ng code sa `setup` function upang i-configure ang serial port. + +1. Idagdag ang sumusunod na include directive sa itaas ng `main.cpp` file. Kasama rito ang header file na may mga function para i-configure ang kaliwang Grove port para sa UART. + + ```cpp + #include + ``` + +1. Sa ibaba nito, idagdag ang sumusunod na linya ng code upang ideklara ang isang serial port connection sa UART port: + + ```cpp + static Uart Serial3(&sercom3, PIN_WIRE_SCL, PIN_WIRE_SDA, SERCOM_RX_PAD_1, UART_TX_PAD_0); + ``` + +1. Kailangan mong magdagdag ng ilang code upang i-redirect ang ilang internal signal handlers sa serial port na ito. Idagdag ang sumusunod na code sa ibaba ng deklarasyon ng `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. Sa `setup` function sa ibaba ng kung saan naka-configure ang `Serial` port, i-configure ang UART serial port gamit ang sumusunod na code: + + ```cpp + Serial3.begin(9600); + + while (!Serial3) + ; // Wait for Serial3 to be ready + + delay(1000); + ``` + +1. Sa ibaba ng code na ito sa `setup` function, idagdag ang sumusunod na code upang ikonekta ang Grove pin sa serial port: + + ```cpp + pinPeripheral(PIN_WIRE_SCL, PIO_SERCOM_ALT); + ``` + +1. Idagdag ang sumusunod na function bago ang `loop` function upang ipadala ang GPS data sa serial monitor: + + ```cpp + void printGPSData() + { + Serial.println(Serial3.readStringUntil('\n')); + } + ``` + +1. Sa `loop` function, idagdag ang sumusunod na code upang basahin mula sa UART serial port at i-print ang output sa serial monitor: + + ```cpp + while (Serial3.available() > 0) + { + printGPSData(); + } + + delay(1000); + ``` + + Binabasa ng code na ito ang data mula sa UART serial port. Ang `readStringUntil` function ay nagbabasa hanggang sa isang terminator character, sa kasong ito ay isang bagong linya. Babasahin nito ang isang buong NMEA sentence (ang mga NMEA sentence ay nagtatapos sa isang bagong linya na character). Habang may data na mababasa mula sa UART serial port, ito ay babasahin at ipapadala sa serial monitor gamit ang `printGPSData` function. Kapag wala nang mababasang data, ang `loop` ay maghihintay ng 1 segundo (1,000ms). + +1. I-build at i-upload ang code sa Wio Terminal. + +1. Kapag na-upload na, maaari mong i-monitor ang GPS data gamit ang 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.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 + ``` + +> 💁 Makikita mo ang code na ito sa [code-gps/wio-terminal](../../../../../3-transport/lessons/1-location-tracking/code-gps/wio-terminal) folder. + +😀 Tagumpay ang iyong GPS sensor program! + +--- + +**Paunawa**: +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/3-transport/lessons/2-store-location-data/README.md b/translations/tl/3-transport/lessons/2-store-location-data/README.md new file mode 100644 index 00000000..a0907bd8 --- /dev/null +++ b/translations/tl/3-transport/lessons/2-store-location-data/README.md @@ -0,0 +1,477 @@ + +# Lokasyon ng Tindahan ng Data + +![Isang sketchnote overview ng araling ito](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.tl.jpg) + +> Sketchnote ni [Nitya Narasimhan](https://github.com/nitya). I-click ang imahe para sa mas malaking bersyon. + +## Pre-lecture Quiz + +[Pre-lecture Quiz](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) + +## Panimula + +Sa nakaraang aralin, natutunan mo kung paano gamitin ang GPS sensor upang makuha ang data ng lokasyon. Upang magamit ang data na ito para maipakita ang lokasyon ng isang trak na may kargang pagkain, at ang paglalakbay nito, kailangang ipadala ito sa isang IoT service sa cloud, at pagkatapos ay itago sa isang lugar. + +Sa araling ito, matutunan mo ang iba't ibang paraan ng pag-iimbak ng IoT data, at kung paano mag-imbak ng data mula sa iyong IoT service gamit ang serverless code. + +Sa araling ito, tatalakayin natin ang: + +* [Structured at unstructured na data](../../../../../3-transport/lessons/2-store-location-data) +* [Magpadala ng GPS data sa isang IoT Hub](../../../../../3-transport/lessons/2-store-location-data) +* [Hot, warm, at cold paths](../../../../../3-transport/lessons/2-store-location-data) +* [I-handle ang GPS events gamit ang serverless code](../../../../../3-transport/lessons/2-store-location-data) +* [Azure Storage Accounts](../../../../../3-transport/lessons/2-store-location-data) +* [Ikonekta ang iyong serverless code sa storage](../../../../../3-transport/lessons/2-store-location-data) + +## Structured at Unstructured na Data + +Ang mga computer system ay humahawak ng data, at ang data na ito ay may iba't ibang anyo at laki. Maaaring mag-iba ito mula sa simpleng numero, sa malalaking dami ng teksto, sa mga video at imahe, at sa IoT data. Ang data ay karaniwang nahahati sa dalawang kategorya - *structured* na data at *unstructured* na data. + +* **Structured na data** ay data na may malinaw na tinukoy, matibay na istruktura na hindi nagbabago at karaniwang tumutugma sa mga talahanayan ng data na may mga relasyon. Isang halimbawa nito ay ang mga detalye ng isang tao kabilang ang kanilang pangalan, petsa ng kapanganakan, at address. + +* **Unstructured na data** ay data na walang malinaw na tinukoy, matibay na istruktura, kabilang ang data na maaaring magbago ng istruktura nang madalas. Isang halimbawa nito ay mga dokumento tulad ng mga nakasulat na dokumento o spreadsheet. + +✅ Mag-research: Makakaisip ka ba ng iba pang halimbawa ng structured at unstructured na data? + +> 💁 Mayroon ding semi-structured na data na structured ngunit hindi akma sa mga fixed na talahanayan ng data. + +Ang IoT data ay karaniwang itinuturing na unstructured na data. + +Isipin na nagdadagdag ka ng mga IoT device sa isang fleet ng mga sasakyan para sa isang malaking komersyal na sakahan. Maaaring gusto mong gumamit ng iba't ibang device para sa iba't ibang uri ng sasakyan. Halimbawa: + +* Para sa mga sasakyang pang-sakahan tulad ng mga traktora, gusto mo ng GPS data upang matiyak na nagtatrabaho sila sa tamang mga bukid. +* Para sa mga delivery truck na nagdadala ng pagkain sa mga warehouse, gusto mo ng GPS data pati na rin ang bilis at acceleration data upang matiyak na ligtas ang pagmamaneho ng driver, at drive identity at start/stop data upang matiyak ang pagsunod ng driver sa mga lokal na batas sa oras ng trabaho. +* Para sa mga refrigerated truck, gusto mo rin ng temperature data upang matiyak na ang pagkain ay hindi masyadong mainit o malamig at masira sa biyahe. + +Ang data na ito ay maaaring magbago nang patuloy. Halimbawa, kung ang IoT device ay nasa cab ng trak, maaaring magbago ang data na ipinapadala nito habang nagbabago ang trailer, halimbawa ay magpadala lamang ng temperature data kapag ginagamit ang isang refrigerated trailer. + +✅ Anong iba pang IoT data ang maaaring makuha? Isipin ang mga uri ng kargamento na maaaring dalhin ng mga trak, pati na rin ang data ng maintenance. + +Ang data na ito ay nag-iiba mula sa sasakyan patungo sa sasakyan, ngunit lahat ito ay ipinapadala sa parehong IoT service para sa pagproseso. Ang IoT service ay kailangang magproseso ng unstructured na data na ito, iniimbak ito sa isang paraan na maaaring hanapin o suriin, ngunit gumagana sa iba't ibang istruktura ng data na ito. + +### SQL vs NoSQL Storage + +Ang mga database ay mga serbisyo na nagbibigay-daan sa iyo upang mag-imbak at mag-query ng data. Ang mga database ay may dalawang uri - SQL at NoSQL. + +#### SQL Databases + +Ang mga unang database ay Relational Database Management Systems (RDBMS), o relational database. Kilala rin ang mga ito bilang SQL databases dahil sa Structured Query Language (SQL) na ginagamit upang makipag-ugnayan sa mga ito upang magdagdag, mag-alis, mag-update, o mag-query ng data. Ang mga database na ito ay binubuo ng isang schema - isang malinaw na tinukoy na hanay ng mga talahanayan ng data, katulad ng isang spreadsheet. Ang bawat talahanayan ay may maraming pinangalanang mga column. Kapag nagpasok ka ng data, nagdaragdag ka ng isang row sa talahanayan, inilalagay ang mga halaga sa bawat column. Pinapanatili nito ang data sa isang napakatibay na istruktura - bagaman maaari mong iwanang walang laman ang mga column, kung nais mong magdagdag ng bagong column, kailangan mong gawin ito sa database, pinupunan ang mga halaga para sa mga umiiral na row. Ang mga database na ito ay relational - kung saan ang isang talahanayan ay maaaring magkaroon ng relasyon sa isa pa. + +![Isang relational database kung saan ang ID ng User table ay nauugnay sa user ID column ng purchases table, at ang ID ng products table ay nauugnay sa product ID ng purchases table](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.tl.png) + +Halimbawa, kung iniimbak mo ang mga personal na detalye ng isang user sa isang talahanayan, magkakaroon ka ng isang uri ng internal unique ID bawat user na ginagamit sa isang row sa isang talahanayan na naglalaman ng pangalan at address ng user. Kung nais mong mag-imbak ng iba pang detalye tungkol sa user na iyon, tulad ng kanilang mga binili, sa isa pang talahanayan, magkakaroon ka ng isang column sa bagong talahanayan para sa ID ng user na iyon. Kapag hinanap mo ang isang user, maaari mong gamitin ang kanilang ID upang makuha ang kanilang personal na detalye mula sa isang talahanayan, at ang kanilang mga binili mula sa isa pa. + +Ang SQL databases ay perpekto para sa pag-iimbak ng structured na data, at para sa kapag nais mong tiyakin na ang data ay tumutugma sa iyong schema. + +✅ Kung hindi mo pa nagagamit ang SQL dati, maglaan ng oras upang basahin ito sa [SQL page sa Wikipedia](https://wikipedia.org/wiki/SQL). + +Ang ilang kilalang SQL databases ay Microsoft SQL Server, MySQL, at PostgreSQL. + +✅ Mag-research: Basahin ang tungkol sa ilan sa mga SQL databases na ito at ang kanilang mga kakayahan. + +#### NoSQL Databases + +Ang NoSQL databases ay tinatawag na NoSQL dahil wala silang parehong matibay na istruktura ng SQL databases. Kilala rin ang mga ito bilang document databases dahil maaari silang mag-imbak ng unstructured na data tulad ng mga dokumento. + +> 💁 Sa kabila ng kanilang pangalan, ang ilang NoSQL databases ay nagbibigay-daan sa iyo na gumamit ng SQL upang mag-query ng data. + +![Mga dokumento sa mga folder sa isang NoSQL database](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.tl.png) + +Ang NoSQL databases ay walang pre-defined na schema na naglilimita kung paano iniimbak ang data, sa halip maaari kang magpasok ng anumang unstructured na data, karaniwang gamit ang JSON documents. Ang mga dokumentong ito ay maaaring ayusin sa mga folder, katulad ng mga file sa iyong computer. Ang bawat dokumento ay maaaring magkaroon ng iba't ibang mga field mula sa ibang mga dokumento - halimbawa kung iniimbak mo ang IoT data mula sa iyong mga sasakyang pang-sakahan, ang ilan ay maaaring magkaroon ng mga field para sa accelerometer at speed data, ang iba ay maaaring magkaroon ng mga field para sa temperatura sa trailer. Kung magdadagdag ka ng bagong uri ng trak, tulad ng isa na may built-in na timbangan upang subaybayan ang timbang ng kargamento, ang iyong IoT device ay maaaring magdagdag ng bagong field na ito at maaari itong maimbak nang walang anumang pagbabago sa database. + +Ang ilang kilalang NoSQL databases ay Azure CosmosDB, MongoDB, at CouchDB. + +✅ Mag-research: Basahin ang tungkol sa ilan sa mga NoSQL databases na ito at ang kanilang mga kakayahan. + +Sa araling ito, gagamit ka ng NoSQL storage upang mag-imbak ng IoT data. + +## Magpadala ng GPS Data sa isang IoT Hub + +Sa nakaraang aralin, nakakuha ka ng GPS data mula sa isang GPS sensor na nakakonekta sa iyong IoT device. Upang maimbak ang IoT data na ito sa cloud, kailangan mo itong ipadala sa isang IoT service. Muli, gagamitin mo ang Azure IoT Hub, ang parehong IoT cloud service na ginamit mo sa nakaraang proyekto. + +![Pagpapadala ng GPS telemetry mula sa isang IoT device patungo sa IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.tl.png) + +### Gawain - Magpadala ng GPS Data sa isang IoT Hub + +1. Gumawa ng bagong IoT Hub gamit ang free tier. + + > ⚠️ Maaari mong tingnan ang [mga tagubilin para sa paggawa ng IoT Hub mula sa proyekto 2, aralin 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) kung kinakailangan. + + Tandaan na gumawa ng bagong Resource Group. Pangalanan ang bagong Resource Group na `gps-sensor`, at ang bagong IoT Hub ng isang natatanging pangalan batay sa `gps-sensor`, tulad ng `gps-sensor-`. + + > 💁 Kung mayroon ka pa ring IoT Hub mula sa nakaraang proyekto, maaari mo itong muling gamitin. Tandaan na gamitin ang pangalan ng IoT Hub na ito at ang Resource Group kung saan ito naroroon kapag gumagawa ng iba pang mga serbisyo. + +1. Magdagdag ng bagong device sa IoT Hub. Tawagin ang device na ito na `gps-sensor`. Kunin ang connection string para sa device. + +1. I-update ang iyong device code upang ipadala ang GPS data sa bagong IoT Hub gamit ang device connection string mula sa nakaraang hakbang. + + > ⚠️ Maaari mong tingnan ang [mga tagubilin para sa pagkonekta ng iyong device sa IoT mula sa proyekto 2, aralin 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service) kung kinakailangan. + +1. Kapag nagpapadala ng GPS data, gawin ito bilang JSON sa sumusunod na format: + + ```json + { + "gps" : + { + "lat" : , + "lon" : + } + } + ``` + +1. Magpadala ng GPS data bawat minuto upang hindi maubos ang iyong daily message allocation. + +Kung gumagamit ka ng Wio Terminal, tandaan na idagdag ang lahat ng kinakailangang libraries, at itakda ang oras gamit ang isang NTP server. Ang iyong code ay kailangan ding tiyakin na nabasa nito ang lahat ng data mula sa serial port bago ipadala ang GPS location, gamit ang umiiral na code mula sa nakaraang aralin. Gamitin ang sumusunod na code upang buuin ang JSON document: + +```cpp +DynamicJsonDocument doc(1024); +doc["gps"]["lat"] = gps.location.lat(); +doc["gps"]["lon"] = gps.location.lng(); +``` + +Kung gumagamit ka ng Virtual IoT device, tandaan na i-install ang lahat ng kinakailangang libraries gamit ang virtual environment. + +Para sa parehong Raspberry Pi at Virtual IoT device, gamitin ang umiiral na code mula sa nakaraang aralin upang makuha ang latitude at longitude values, pagkatapos ay ipadala ang mga ito sa tamang JSON format gamit ang sumusunod na code: + +```python +message_json = { "gps" : { "lat":lat, "lon":lon } } +print("Sending telemetry", message_json) +message = Message(json.dumps(message_json)) +``` + +> 💁 Maaari mong makita ang code na ito sa [code/wio-terminal](../../../../../3-transport/lessons/2-store-location-data/code/wio-terminal), [code/pi](../../../../../3-transport/lessons/2-store-location-data/code/pi) o [code/virtual-device](../../../../../3-transport/lessons/2-store-location-data/code/virtual-device) folder. + +Patakbuhin ang iyong device code at tiyakin na ang mga mensahe ay dumadaloy sa IoT Hub gamit ang `az iot hub monitor-events` CLI command. + +## Hot, Warm, at Cold Paths + +Ang data na dumadaloy mula sa isang IoT device patungo sa cloud ay hindi palaging napoproseso nang real time. Ang ilang data ay kailangang iproseso nang real time, ang iba ay maaaring iproseso nang kaunti pagkatapos, at ang iba ay maaaring iproseso nang mas matagal pa. Ang daloy ng data sa iba't ibang serbisyo na nagpoproseso ng data sa iba't ibang oras ay tinutukoy bilang hot, warm, at cold paths. + +### Hot Path + +Ang hot path ay tumutukoy sa data na kailangang iproseso nang real time o malapit sa real time. Gagamitin mo ang hot path data para sa mga alerto, tulad ng pagkuha ng alerto na ang isang sasakyan ay papalapit sa depot, o na ang temperatura sa isang refrigerated truck ay masyadong mataas. + +Upang magamit ang hot path data, ang iyong code ay tutugon sa mga event sa sandaling matanggap ang mga ito ng iyong cloud services. + +### Warm Path + +Ang warm path ay tumutukoy sa data na maaaring iproseso nang kaunti pagkatapos matanggap, halimbawa para sa pag-uulat o short-term analytics. Gagamitin mo ang warm path data para sa mga daily report sa mileage ng sasakyan, gamit ang data na nakolekta noong nakaraang araw. + +Ang warm path data ay iniimbak sa sandaling matanggap ito ng cloud service sa loob ng isang uri ng storage na maaaring mabilis na ma-access. + +### Cold Path + +Ang cold path ay tumutukoy sa historical data, iniimbak ang data para sa pangmatagalang paggamit upang iproseso kung kailan kinakailangan. Halimbawa, maaari mong gamitin ang cold path upang makakuha ng taunang mileage reports para sa mga sasakyan, o magsagawa ng analytics sa mga ruta upang mahanap ang pinaka-optimal na ruta upang mabawasan ang gastos sa gasolina. + +Ang cold path data ay iniimbak sa mga data warehouses - mga database na idinisenyo para sa pag-iimbak ng malaking dami ng data na hindi magbabago at maaaring ma-query nang mabilis at madali. Karaniwan kang magkakaroon ng regular na trabaho sa iyong cloud application na tatakbo sa regular na oras bawat araw, linggo, o buwan upang ilipat ang data mula sa warm path storage patungo sa data warehouse. + +✅ Isipin ang data na nakolekta mo sa mga araling ito. Ito ba ay hot, warm, o cold path data? + +## I-handle ang GPS Events Gamit ang Serverless Code + +Kapag ang data ay dumadaloy na sa iyong IoT Hub, maaari kang magsulat ng serverless code upang makinig sa mga event na inilathala sa Event-Hub compatible endpoint. Ito ang warm path - ang data na ito ay maiimbak at gagamitin sa susunod na aralin para sa pag-uulat sa paglalakbay. + +![Pagpapadala ng GPS telemetry mula sa isang IoT device patungo sa IoT Hub, pagkatapos sa Azure Functions sa pamamagitan ng event hub trigger](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.tl.png) + +### Gawain - I-handle ang GPS Events Gamit ang Serverless Code + +1. Gumawa ng Azure Functions app gamit ang Azure Functions CLI. Gamitin ang Python runtime, at gawin ito sa isang folder na tinatawag na `gps-trigger`, at gamitin ang parehong pangalan para sa Functions App project name. Siguraduhing gumawa ng virtual environment para dito. +> ⚠️ Maaari kang sumangguni sa [mga tagubilin para sa paglikha ng isang Azure Functions Project mula sa proyekto 2, aralin 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application) kung kinakailangan. +1. Magdagdag ng IoT Hub event trigger na gumagamit ng Event Hub compatible endpoint ng IoT Hub. + + > ⚠️ Maaari mong tingnan ang [mga tagubilin para sa paglikha ng IoT Hub event trigger mula sa proyekto 2, aralin 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) kung kinakailangan. + +1. Itakda ang Event Hub compatible endpoint connection string sa `local.settings.json` file, at gamitin ang key para sa entry na iyon sa `function.json` file. + +1. Gamitin ang Azurite app bilang isang local storage emulator. + +1. Patakbuhin ang iyong functions app upang tiyakin na ito ay tumatanggap ng mga event mula sa iyong GPS device. Siguraduhin na ang iyong IoT device ay tumatakbo rin at nagpapadala ng GPS data. + + ```output + Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} + ``` + +## Azure Storage Accounts + +![Ang logo ng Azure Storage](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.tl.png) + +Ang Azure Storage Accounts ay isang pangkalahatang serbisyo sa imbakan na maaaring mag-imbak ng data sa iba't ibang paraan. Maaari kang mag-imbak ng data bilang blobs, sa queues, sa tables, o bilang mga files, at lahat ng ito ay sabay-sabay. + +### Blob storage + +Ang salitang *Blob* ay nangangahulugang binary large objects, ngunit naging termino na ito para sa anumang unstructured data. Maaari kang mag-imbak ng anumang data sa blob storage, mula sa mga JSON document na naglalaman ng IoT data, hanggang sa mga larawan at video files. Ang Blob storage ay may konsepto ng *containers*, mga pinangalanang bucket kung saan maaari kang mag-imbak ng data, na katulad ng mga table sa relational database. Ang mga container na ito ay maaaring magkaroon ng isa o higit pang mga folder upang mag-imbak ng blobs, at bawat folder ay maaaring maglaman ng iba pang mga folder, katulad ng kung paano naka-imbak ang mga file sa iyong computer hard disk. + +Gagamitin mo ang blob storage sa araling ito upang mag-imbak ng IoT data. + +✅ Mag-research: Basahin ang tungkol sa [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) + +### Table storage + +Ang Table storage ay nagbibigay-daan sa iyo na mag-imbak ng semi-structured data. Ang Table storage ay isang NoSQL database, kaya hindi nito kinakailangan ang isang pre-defined na set ng mga table, ngunit ito ay idinisenyo upang mag-imbak ng data sa isa o higit pang mga table, na may mga unique key upang tukuyin ang bawat row. + +✅ Mag-research: Basahin ang tungkol sa [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) + +### Queue storage + +Ang Queue storage ay nagbibigay-daan sa iyo na mag-imbak ng mga mensahe na hanggang 64KB ang laki sa isang queue. Maaari kang magdagdag ng mga mensahe sa likod ng queue, at basahin ang mga ito mula sa harapan. Ang mga queue ay nag-iimbak ng mga mensahe nang walang hangganan hangga't may natitirang espasyo sa imbakan, kaya't pinapayagan nitong maimbak ang mga mensahe nang pangmatagalan at mabasa kapag kinakailangan. Halimbawa, kung nais mong magpatakbo ng buwanang trabaho upang iproseso ang GPS data, maaari kang magdagdag nito sa isang queue araw-araw sa loob ng isang buwan, at pagkatapos ay iproseso ang lahat ng mga mensahe mula sa queue sa katapusan ng buwan. + +✅ Mag-research: Basahin ang tungkol sa [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) + +### File storage + +Ang File storage ay imbakan ng mga file sa cloud, at anumang apps o device ay maaaring kumonekta gamit ang mga industry standard protocols. Maaari kang magsulat ng mga file sa file storage, pagkatapos ay i-mount ito bilang isang drive sa iyong PC o Mac. + +✅ Mag-research: Basahin ang tungkol sa [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) + +## Ikonekta ang iyong serverless code sa storage + +Ang iyong function app ay kailangang kumonekta sa blob storage upang mag-imbak ng mga mensahe mula sa IoT Hub. Mayroong dalawang paraan upang gawin ito: + +* Sa loob ng function code, kumonekta sa blob storage gamit ang blob storage Python SDK at isulat ang data bilang blobs. +* Gumamit ng output function binding upang i-bind ang return value ng function sa blob storage at awtomatikong mai-save ang blob. + +Sa araling ito, gagamitin mo ang Python SDK upang makita kung paano makipag-ugnayan sa blob storage. + +![Pagpapadala ng GPS telemetry mula sa isang IoT device papunta sa IoT Hub, pagkatapos sa Azure Functions sa pamamagitan ng isang event hub trigger, pagkatapos ay sine-save ito sa blob storage](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.tl.png) + +Ang data ay mase-save bilang isang JSON blob na may sumusunod na format: + +```json +{ + "device_id": , + "timestamp" :