diff --git a/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.da.png b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.da.png new file mode 100644 index 00000000..1ba4f5c7 Binary files /dev/null and b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.da.png differ diff --git a/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.no.png b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.no.png new file mode 100644 index 00000000..1ba4f5c7 Binary files /dev/null and b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.no.png differ diff --git a/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.sv.png b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.sv.png new file mode 100644 index 00000000..1ba4f5c7 Binary files /dev/null and b/translated_images/IMG_5305.aa291c8812a9f1e5b08f3e789f9858e9eacc88c4bbc23296df1bffbbd9c671b3.sv.png differ diff --git a/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.da.png b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.da.png new file mode 100644 index 00000000..3cac91bb Binary files /dev/null and b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.da.png differ diff --git a/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.no.png b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.no.png new file mode 100644 index 00000000..3cac91bb Binary files /dev/null and b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.no.png differ diff --git a/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.sv.png b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.sv.png new file mode 100644 index 00000000..3cac91bb Binary files /dev/null and b/translated_images/IMG_5306.d575b9ab7025877b0ceba872490fa561edf3c4fcd5e8cca4ae2607a309d48c50.sv.png differ diff --git a/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.da.png b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.da.png new file mode 100644 index 00000000..967e6539 Binary files /dev/null and b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.da.png differ diff --git a/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.no.png b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.no.png new file mode 100644 index 00000000..967e6539 Binary files /dev/null and b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.no.png differ diff --git a/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.sv.png b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.sv.png new file mode 100644 index 00000000..967e6539 Binary files /dev/null and b/translated_images/IMG_5307.f9c9b8361a8aa7345cc6e8ae05cf6b7583d43d3c37ecfbd76d3fdc531e3ac59c.sv.png differ diff --git a/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.da.png b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.da.png new file mode 100644 index 00000000..247c1dd6 Binary files /dev/null and b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.da.png differ diff --git a/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.no.png b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.no.png new file mode 100644 index 00000000..247c1dd6 Binary files /dev/null and b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.no.png differ diff --git a/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.sv.png b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.sv.png new file mode 100644 index 00000000..247c1dd6 Binary files /dev/null and b/translated_images/IMG_5308.cbd6ed7007e6906012162c19b9e4097936c57873cdb2e54159899066c4281dc5.sv.png differ diff --git a/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.da.png b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.da.png new file mode 100644 index 00000000..e89d81c4 Binary files /dev/null and b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.da.png differ diff --git a/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.no.png b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.no.png new file mode 100644 index 00000000..e89d81c4 Binary files /dev/null and b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.no.png differ diff --git a/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.sv.png b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.sv.png new file mode 100644 index 00000000..e89d81c4 Binary files /dev/null and b/translated_images/IMG_5309.23fbc3b6667bfb64fa44804f835f38885ad37d02b0a1c1c6e8d89f9a78ba19b4.sv.png differ diff --git a/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.da.png b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.da.png new file mode 100644 index 00000000..0237836d Binary files /dev/null and b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.da.png differ diff --git a/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.no.png b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.no.png new file mode 100644 index 00000000..0237836d Binary files /dev/null and b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.no.png differ diff --git a/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.sv.png b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.sv.png new file mode 100644 index 00000000..0237836d Binary files /dev/null and b/translated_images/IMG_5310.0ee0eb2fbc1c2d0e2d331e74d32b371a4086c07b0839817e9d6b7d4b5c98fc60.sv.png differ diff --git a/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.da.png b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.da.png new file mode 100644 index 00000000..4229fee0 Binary files /dev/null and b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.da.png differ diff --git a/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.no.png b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.no.png new file mode 100644 index 00000000..4229fee0 Binary files /dev/null and b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.no.png differ diff --git a/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.sv.png b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.sv.png new file mode 100644 index 00000000..4229fee0 Binary files /dev/null and b/translated_images/IMG_5311.8c90da6446c2d8c2ad70dd9e64f29b2b6f2b4d117f8502c3181be66297cc84da.sv.png differ diff --git a/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.da.png b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.da.png new file mode 100644 index 00000000..9b503ac8 Binary files /dev/null and b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.da.png differ diff --git a/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.no.png b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.no.png new file mode 100644 index 00000000..9b503ac8 Binary files /dev/null and b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.no.png differ diff --git a/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.sv.png b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.sv.png new file mode 100644 index 00000000..9b503ac8 Binary files /dev/null and b/translated_images/IMG_5312.a45550ddd8ce8e654919361d52b919e2f8b1dbd01439268b5d3b813133a4e19b.sv.png differ diff --git a/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.da.png b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.da.png new file mode 100644 index 00000000..c98b7aaf Binary files /dev/null and b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.da.png differ diff --git a/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.no.png b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.no.png new file mode 100644 index 00000000..c98b7aaf Binary files /dev/null and b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.no.png differ diff --git a/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.sv.png b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.sv.png new file mode 100644 index 00000000..c98b7aaf Binary files /dev/null and b/translated_images/IMG_5313.ed1b45211271dbd23dc596ce9f72078aba665bd5f21088a616a85dd966100427.sv.png differ diff --git a/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.da.png b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.da.png new file mode 100644 index 00000000..706f83bc Binary files /dev/null and b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.da.png differ diff --git a/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.no.png b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.no.png new file mode 100644 index 00000000..706f83bc Binary files /dev/null and b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.no.png differ diff --git a/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.sv.png b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.sv.png new file mode 100644 index 00000000..706f83bc Binary files /dev/null and b/translated_images/IMG_5314.c2203206a05a74b5a4f10a68bbe274e65849a63e1fefe008b2c94be4ae86839c.sv.png differ diff --git a/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.da.png b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.da.png new file mode 100644 index 00000000..76bec4da Binary files /dev/null and b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.da.png differ diff --git a/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.no.png b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.no.png new file mode 100644 index 00000000..76bec4da Binary files /dev/null and b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.no.png differ diff --git a/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.sv.png b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.sv.png new file mode 100644 index 00000000..76bec4da Binary files /dev/null and b/translated_images/IMG_5315.f698228e0e031bd430efcfab0d08b00d9f3af5289133ce88a9f56c0c3478cd71.sv.png differ diff --git a/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.da.png b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.da.png new file mode 100644 index 00000000..b49060a2 Binary files /dev/null and b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.da.png differ diff --git a/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.no.png b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.no.png new file mode 100644 index 00000000..b49060a2 Binary files /dev/null and b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.no.png differ diff --git a/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.sv.png b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.sv.png new file mode 100644 index 00000000..b49060a2 Binary files /dev/null and b/translated_images/IMG_5316.29dc70d802ce83497258426614e3e1426a91d6f9777e853daa4a9351b841b94f.sv.png differ diff --git a/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.da.png b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.da.png new file mode 100644 index 00000000..3ca064d5 Binary files /dev/null and b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.da.png differ diff --git a/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.no.png b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.no.png new file mode 100644 index 00000000..3ca064d5 Binary files /dev/null and b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.no.png differ diff --git a/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.sv.png b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.sv.png new file mode 100644 index 00000000..3ca064d5 Binary files /dev/null and b/translated_images/IMG_5317.ed81e4c1ca5046dc50613049e39c905157fbb318ea19db44c738db513ac501b1.sv.png differ diff --git a/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.da.png b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.da.png new file mode 100644 index 00000000..1f5f2412 Binary files /dev/null and b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.da.png differ diff --git a/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.no.png b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.no.png new file mode 100644 index 00000000..1f5f2412 Binary files /dev/null and b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.no.png differ diff --git a/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.sv.png b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.sv.png new file mode 100644 index 00000000..1f5f2412 Binary files /dev/null and b/translated_images/IMG_5318.15dfffeb7f47abf7ca0393628024c1fd45761193ab23185c315e899bd0e7048b.sv.png differ diff --git a/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.da.png b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.da.png new file mode 100644 index 00000000..2953cea1 Binary files /dev/null and b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.da.png differ diff --git a/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.no.png b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.no.png new file mode 100644 index 00000000..2953cea1 Binary files /dev/null and b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.no.png differ diff --git a/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.sv.png b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.sv.png new file mode 100644 index 00000000..2953cea1 Binary files /dev/null and b/translated_images/IMG_5319.b549b1fff0dcf143c2483044d0519a3c6dc3de12c88860911b378688e7a4e01b.sv.png differ diff --git a/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.da.png b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.da.png new file mode 100644 index 00000000..2ce7dedf Binary files /dev/null and b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.da.png differ diff --git a/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.no.png b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.no.png new file mode 100644 index 00000000..2ce7dedf Binary files /dev/null and b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.no.png differ diff --git a/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.sv.png b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.sv.png new file mode 100644 index 00000000..2ce7dedf Binary files /dev/null and b/translated_images/IMG_5320.8268d3f61972f348df46401d107399af17512db9ef769f6a44c6cbb18faba998.sv.png differ diff --git a/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.da.png b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.da.png new file mode 100644 index 00000000..157c08c6 Binary files /dev/null and b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.da.png differ diff --git a/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.no.png b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.no.png new file mode 100644 index 00000000..157c08c6 Binary files /dev/null and b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.no.png differ diff --git a/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.sv.png b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.sv.png new file mode 100644 index 00000000..157c08c6 Binary files /dev/null and b/translated_images/IMG_5321.b207cf143a59458d150cb1fbd44c3678d14f9cfffe77a0ec64e1cdfe1436df1c.sv.png differ diff --git a/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.da.png b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.da.png new file mode 100644 index 00000000..031361a6 Binary files /dev/null and b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.da.png differ diff --git a/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.no.png b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.no.png new file mode 100644 index 00000000..031361a6 Binary files /dev/null and b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.no.png differ diff --git a/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.sv.png b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.sv.png new file mode 100644 index 00000000..031361a6 Binary files /dev/null and b/translated_images/IMG_5322.974809b9461a9e200e99ae46142b4885e093e5b9b668e0fd818de461e27856a7.sv.png differ diff --git a/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.da.png b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.da.png new file mode 100644 index 00000000..3a43eb23 Binary files /dev/null and b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.da.png differ diff --git a/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.no.png b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.no.png new file mode 100644 index 00000000..3a43eb23 Binary files /dev/null and b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.no.png differ diff --git a/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.sv.png b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.sv.png new file mode 100644 index 00000000..3a43eb23 Binary files /dev/null and b/translated_images/IMG_5323.4939fa17958f291bb856032bbd044a709c0199b2e3846f1801a7836d4455dd26.sv.png differ diff --git a/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.da.png b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.da.png new file mode 100644 index 00000000..7c9552e3 Binary files /dev/null and b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.da.png differ diff --git a/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.no.png b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.no.png new file mode 100644 index 00000000..7c9552e3 Binary files /dev/null and b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.no.png differ diff --git a/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.sv.png b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.sv.png new file mode 100644 index 00000000..7c9552e3 Binary files /dev/null and b/translated_images/IMG_5324.0afbc6f0caceb1a341a9606fc9b879938eebebbc8401fce37dff2b167ed4b410.sv.png differ diff --git a/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.da.png b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.da.png new file mode 100644 index 00000000..78f695b7 Binary files /dev/null and b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.da.png differ diff --git a/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.no.png b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.no.png new file mode 100644 index 00000000..78f695b7 Binary files /dev/null and b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.no.png differ diff --git a/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.sv.png b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.sv.png new file mode 100644 index 00000000..78f695b7 Binary files /dev/null and b/translated_images/IMG_5325.9e9d9e9b85a10b06ac6038bf88ef91ef56fd371ed9e67b53495cd6878019faf9.sv.png differ diff --git a/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.da.png b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.da.png new file mode 100644 index 00000000..77f563fb Binary files /dev/null and b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.da.png differ diff --git a/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.no.png b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.no.png new file mode 100644 index 00000000..77f563fb Binary files /dev/null and b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.no.png differ diff --git a/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.sv.png b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.sv.png new file mode 100644 index 00000000..77f563fb Binary files /dev/null and b/translated_images/IMG_5326.35bbc9e054c704d0418a8ba7418aa38f51baee13bd2b00cfe8300e1500fa9f32.sv.png differ diff --git a/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.da.png b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.da.png new file mode 100644 index 00000000..8dccd514 Binary files /dev/null and b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.da.png differ diff --git a/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.no.png b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.no.png new file mode 100644 index 00000000..8dccd514 Binary files /dev/null and b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.no.png differ diff --git a/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.sv.png b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.sv.png new file mode 100644 index 00000000..8dccd514 Binary files /dev/null and b/translated_images/IMG_5327.804b63a605b5a77a7b60c2fbf370be0f7364f2b5acb98c736420728e61845b62.sv.png differ diff --git a/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.da.png b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.da.png new file mode 100644 index 00000000..b75e015e Binary files /dev/null and b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.da.png differ diff --git a/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.no.png b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.no.png new file mode 100644 index 00000000..b75e015e Binary files /dev/null and b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.no.png differ diff --git a/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.sv.png b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.sv.png new file mode 100644 index 00000000..b75e015e Binary files /dev/null and b/translated_images/IMG_5328.925a9da23d96759f6c7c13bfcd94b8063bb5082d2e8a0431058c057e6d14446b.sv.png differ diff --git a/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.da.png b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.da.png new file mode 100644 index 00000000..5bfed282 Binary files /dev/null and b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.da.png differ diff --git a/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.no.png b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.no.png new file mode 100644 index 00000000..5bfed282 Binary files /dev/null and b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.no.png differ diff --git a/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.sv.png b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.sv.png new file mode 100644 index 00000000..5bfed282 Binary files /dev/null and b/translated_images/IMG_5329.27da5fcbc3336773e94bbd2640df07799c76051bf97d2db7891d47bc462c6e09.sv.png differ diff --git a/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.da.png b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.da.png new file mode 100644 index 00000000..34ca765c Binary files /dev/null and b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.da.png differ diff --git a/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.no.png b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.no.png new file mode 100644 index 00000000..34ca765c Binary files /dev/null and b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.no.png differ diff --git a/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.sv.png b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.sv.png new file mode 100644 index 00000000..34ca765c Binary files /dev/null and b/translated_images/IMG_5330.3db3d5ea01c8cca2ae41cf5ea501a0a836569a3abbc2ae95696e0ad1dd005b6a.sv.png differ diff --git a/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.da.png b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.da.png new file mode 100644 index 00000000..d1f7bc09 Binary files /dev/null and b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.da.png differ diff --git a/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.no.png b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.no.png new file mode 100644 index 00000000..d1f7bc09 Binary files /dev/null and b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.no.png differ diff --git a/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.sv.png b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.sv.png new file mode 100644 index 00000000..d1f7bc09 Binary files /dev/null and b/translated_images/IMG_5331.181987d3d094472fbf569a61760fadf282575f2821138de50007e408fd63182e.sv.png differ diff --git a/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.da.png b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.da.png new file mode 100644 index 00000000..c215b446 Binary files /dev/null and b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.da.png differ diff --git a/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.no.png b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.no.png new file mode 100644 index 00000000..c215b446 Binary files /dev/null and b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.no.png differ diff --git a/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.sv.png b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.sv.png new file mode 100644 index 00000000..c215b446 Binary files /dev/null and b/translated_images/IMG_5332.4beed56eaa5158e3785dbacb53c9670a0ef1699ce386528f4bb9bad50adf88ca.sv.png differ diff --git a/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.da.png b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.da.png new file mode 100644 index 00000000..63f58daa Binary files /dev/null and b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.da.png differ diff --git a/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.no.png b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.no.png new file mode 100644 index 00000000..63f58daa Binary files /dev/null and b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.no.png differ diff --git a/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.sv.png b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.sv.png new file mode 100644 index 00000000..63f58daa Binary files /dev/null and b/translated_images/IMG_5333.53c3364c2ee0e7bb5db0e299915faaf31e47bb99ad045ec8f6de6ca23d323f47.sv.png differ diff --git a/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.da.png b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.da.png new file mode 100644 index 00000000..3eb38501 Binary files /dev/null and b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.da.png differ diff --git a/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.no.png b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.no.png new file mode 100644 index 00000000..3eb38501 Binary files /dev/null and b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.no.png differ diff --git a/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.sv.png b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.sv.png new file mode 100644 index 00000000..3eb38501 Binary files /dev/null and b/translated_images/IMG_5334.979472e433948c109b122ae4bbd0f96971dc2e7b1e64615776ebb7337a97e183.sv.png differ diff --git a/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.da.png b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.da.png new file mode 100644 index 00000000..4f960870 Binary files /dev/null and b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.da.png differ diff --git a/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.no.png b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.no.png new file mode 100644 index 00000000..4f960870 Binary files /dev/null and b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.no.png differ diff --git a/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.sv.png b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.sv.png new file mode 100644 index 00000000..4f960870 Binary files /dev/null and b/translated_images/IMG_5335.9f5bfba69a8d5a901c3e3b994a69f62a00d73ef9209b85561553d2ae99a56615.sv.png differ diff --git a/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.da.png b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.da.png new file mode 100644 index 00000000..ca5b5882 Binary files /dev/null and b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.da.png differ diff --git a/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.no.png b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.no.png new file mode 100644 index 00000000..ca5b5882 Binary files /dev/null and b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.no.png differ diff --git a/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.sv.png b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.sv.png new file mode 100644 index 00000000..ca5b5882 Binary files /dev/null and b/translated_images/IMG_5336.1b46586fdec957670ea71c1bd68c26f73aa95cd5671d057328fd198640729db7.sv.png differ diff --git a/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.da.png b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.da.png new file mode 100644 index 00000000..2c3440cd Binary files /dev/null and b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.da.png differ diff --git a/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.no.png b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.no.png new file mode 100644 index 00000000..2c3440cd Binary files /dev/null and b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.no.png differ diff --git a/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.sv.png b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.sv.png new file mode 100644 index 00000000..2c3440cd Binary files /dev/null and b/translated_images/IMG_5337.91c82be4d37029b03cbb07553d92b9d2dd672e22a07fee6453cbc40568fbdef3.sv.png differ diff --git a/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.da.png b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.da.png new file mode 100644 index 00000000..5294a9dc Binary files /dev/null and b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.da.png differ diff --git a/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.no.png b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.no.png new file mode 100644 index 00000000..5294a9dc Binary files /dev/null and b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.no.png differ diff --git a/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.sv.png b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.sv.png new file mode 100644 index 00000000..5294a9dc Binary files /dev/null and b/translated_images/IMG_5338.9ab356541448923b528f2dedecd72d7ecd07d53cc69118aeb861c39dccb8b8cc.sv.png differ diff --git a/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.da.png b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.da.png new file mode 100644 index 00000000..912ac4ca Binary files /dev/null and b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.da.png differ diff --git a/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.no.png b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.no.png new file mode 100644 index 00000000..912ac4ca Binary files /dev/null and b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.no.png differ diff --git a/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.sv.png b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.sv.png new file mode 100644 index 00000000..912ac4ca Binary files /dev/null and b/translated_images/IMG_5340.8440651b3ce1dd35d9962036330b32a600fb3f59078a581a05c93920c5012b3a.sv.png differ diff --git a/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.da.png b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.da.png new file mode 100644 index 00000000..8e47de7d Binary files /dev/null and b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.da.png differ diff --git a/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.no.png b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.no.png new file mode 100644 index 00000000..8e47de7d Binary files /dev/null and b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.no.png differ diff --git a/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.sv.png b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.sv.png new file mode 100644 index 00000000..8e47de7d Binary files /dev/null and b/translated_images/IMG_5341.a1aa041c42dbc534c033447b06f0546fdd779b3ed5034992ded08a45a960fff5.sv.png differ diff --git a/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.da.png b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.da.png new file mode 100644 index 00000000..b3c98d83 Binary files /dev/null and b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.da.png differ diff --git a/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.no.png b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.no.png new file mode 100644 index 00000000..b3c98d83 Binary files /dev/null and b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.no.png differ diff --git a/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.sv.png b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.sv.png new file mode 100644 index 00000000..b3c98d83 Binary files /dev/null and b/translated_images/IMG_5342.9f3b93d9fab90d3b3c1936edb55768b57024c9ebe88a214be315f5ebb083e45d.sv.png differ diff --git a/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.da.png b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.da.png new file mode 100644 index 00000000..1d494613 Binary files /dev/null and b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.da.png differ diff --git a/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.no.png b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.no.png new file mode 100644 index 00000000..1d494613 Binary files /dev/null and b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.no.png differ diff --git a/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.sv.png b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.sv.png new file mode 100644 index 00000000..1d494613 Binary files /dev/null and b/translated_images/IMG_5343.fa30105d3c10cad2079ca2b2f023e9dab8f82824a235be61837d7e9d09d8d067.sv.png differ diff --git a/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.da.png b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.da.png new file mode 100644 index 00000000..47ced39a Binary files /dev/null and b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.da.png differ diff --git a/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.no.png b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.no.png new file mode 100644 index 00000000..47ced39a Binary files /dev/null and b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.no.png differ diff --git a/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.sv.png b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.sv.png new file mode 100644 index 00000000..47ced39a Binary files /dev/null and b/translated_images/IMG_5344.acfcd61ee5281321426b2d93efeeb01a60505e73b4c5ee6224c7fa375027b9d8.sv.png differ diff --git a/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.da.png b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.da.png new file mode 100644 index 00000000..88d5c896 Binary files /dev/null and b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.da.png differ diff --git a/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.no.png b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.no.png new file mode 100644 index 00000000..88d5c896 Binary files /dev/null and b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.no.png differ diff --git a/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.sv.png b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.sv.png new file mode 100644 index 00000000..88d5c896 Binary files /dev/null and b/translated_images/IMG_5345.3d305ee2bb4ee8040102a8d1922cdf0450f619c6824add16014a4c0887c18b1d.sv.png differ diff --git a/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.da.png b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.da.png new file mode 100644 index 00000000..e0706533 Binary files /dev/null and b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.da.png differ diff --git a/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.no.png b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.no.png new file mode 100644 index 00000000..e0706533 Binary files /dev/null and b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.no.png differ diff --git a/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.sv.png b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.sv.png new file mode 100644 index 00000000..e0706533 Binary files /dev/null and b/translated_images/IMG_5346.281dcc267f69c70b2bc2353b5e8289617c7bf3608f889dae8a582b9376a9ae7d.sv.png differ diff --git a/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.da.png b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.da.png new file mode 100644 index 00000000..a1f17249 Binary files /dev/null and b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.da.png differ diff --git a/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.no.png b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.no.png new file mode 100644 index 00000000..a1f17249 Binary files /dev/null and b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.no.png differ diff --git a/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.sv.png b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.sv.png new file mode 100644 index 00000000..a1f17249 Binary files /dev/null and b/translated_images/IMG_5347.48a4a981e76910ae1c65bf75102883039be5f0ded32b73f3d09d855f5b7dc977.sv.png differ diff --git a/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.da.png b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.da.png new file mode 100644 index 00000000..3adc61ef Binary files /dev/null and b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.da.png differ diff --git a/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.no.png b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.no.png new file mode 100644 index 00000000..3adc61ef Binary files /dev/null and b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.no.png differ diff --git a/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.sv.png b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.sv.png new file mode 100644 index 00000000..3adc61ef Binary files /dev/null and b/translated_images/IMG_5348.3961d3b444537c131299f8906dc4e2f7c3c172591ffeacb45719ec3d3718b625.sv.png differ diff --git a/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.da.png b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.da.png new file mode 100644 index 00000000..1c3c8d53 Binary files /dev/null and b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.da.png differ diff --git a/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.no.png b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.no.png new file mode 100644 index 00000000..1c3c8d53 Binary files /dev/null and b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.no.png differ diff --git a/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.sv.png b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.sv.png new file mode 100644 index 00000000..1c3c8d53 Binary files /dev/null and b/translated_images/IMG_5349.1f0ec7fbf8807b3bf991dd5400cfb69ded9fe53059bd1e71934f4dbd7ff963db.sv.png differ diff --git a/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.da.jpg b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.da.jpg new file mode 100644 index 00000000..0f4a9a38 Binary files /dev/null and b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.da.jpg differ diff --git a/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.no.jpg b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.no.jpg new file mode 100644 index 00000000..0f4a9a38 Binary files /dev/null and b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.no.jpg differ diff --git a/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.sv.jpg b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.sv.jpg new file mode 100644 index 00000000..0f4a9a38 Binary files /dev/null and b/translated_images/Roadmap.bb1dec285dda0eda691788b95ddfc96d31d76bb7649e3f04a135e4ad395f323e.sv.jpg differ diff --git a/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.da.png b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.da.png new file mode 100644 index 00000000..32dab60c Binary files /dev/null and b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.da.png differ diff --git a/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.no.png b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.no.png new file mode 100644 index 00000000..32dab60c Binary files /dev/null and b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.no.png differ diff --git a/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.sv.png b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.sv.png new file mode 100644 index 00000000..32dab60c Binary files /dev/null and b/translated_images/amqp.804bd4fce83301578f19af1b877f8ce87a6473a3616fb6c3f901fe4041ab6c96.sv.png differ diff --git a/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.da.png b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.da.png new file mode 100644 index 00000000..78e9b675 Binary files /dev/null and b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.da.png differ diff --git a/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.no.png b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.no.png new file mode 100644 index 00000000..78e9b675 Binary files /dev/null and b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.no.png differ diff --git a/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.sv.png b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.sv.png new file mode 100644 index 00000000..78e9b675 Binary files /dev/null and b/translated_images/analog-sensor-voltage.3b6f3153922473997cae6f71a6110d89a020a8a1838a83fba4f97e8fa6cef3ac.sv.png differ diff --git a/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.da.png b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.da.png new file mode 100644 index 00000000..fb87dd71 Binary files /dev/null and b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.da.png differ diff --git a/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.no.png b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.no.png new file mode 100644 index 00000000..fb87dd71 Binary files /dev/null and b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.no.png differ diff --git a/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.sv.png b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.sv.png new file mode 100644 index 00000000..fb87dd71 Binary files /dev/null and b/translated_images/arducam-wio-terminal-connections.a4d5a4049bdb5ab800a2877389fc6ecf5e4ff307e6451ff56c517e6786467d0a.sv.png differ diff --git a/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.da.png b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.da.png new file mode 100644 index 00000000..acaa9a02 Binary files /dev/null and b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.da.png differ diff --git a/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.no.png b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.no.png new file mode 100644 index 00000000..acaa9a02 Binary files /dev/null and b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.no.png differ diff --git a/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.sv.png b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.sv.png new file mode 100644 index 00000000..acaa9a02 Binary files /dev/null and b/translated_images/arducam.20e4e4cbb268296570b5914e20d6c349fc42ddac9ed4e1b9deba2188204eebae.sv.png differ diff --git a/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.da.png b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.da.png new file mode 100644 index 00000000..b6afaa8a Binary files /dev/null and b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.da.png differ diff --git a/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.no.png b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.no.png new file mode 100644 index 00000000..b6afaa8a Binary files /dev/null and b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.no.png differ diff --git a/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.sv.png b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.sv.png new file mode 100644 index 00000000..b6afaa8a Binary files /dev/null and b/translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.sv.png differ diff --git a/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.da.png b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.da.png new file mode 100644 index 00000000..18f92ede Binary files /dev/null and b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.da.png differ diff --git a/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.no.png b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.no.png new file mode 100644 index 00000000..18f92ede Binary files /dev/null and b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.no.png differ diff --git a/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.sv.png b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.sv.png new file mode 100644 index 00000000..18f92ede Binary files /dev/null and b/translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.sv.png differ diff --git a/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.da.png b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.da.png new file mode 100644 index 00000000..e1eb6df0 Binary files /dev/null and b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.da.png differ diff --git a/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.no.png b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.no.png new file mode 100644 index 00000000..e1eb6df0 Binary files /dev/null and b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.no.png differ diff --git a/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.sv.png b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.sv.png new file mode 100644 index 00000000..e1eb6df0 Binary files /dev/null and b/translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.sv.png differ diff --git a/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.da.png b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.da.png new file mode 100644 index 00000000..dfcfde45 Binary files /dev/null and b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.da.png differ diff --git a/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.no.png b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.no.png new file mode 100644 index 00000000..dfcfde45 Binary files /dev/null and b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.no.png differ diff --git a/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.sv.png b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.sv.png new file mode 100644 index 00000000..dfcfde45 Binary files /dev/null and b/translated_images/azure-container-registry-logo.09494206991d4b295025ebff7d4e2900325e527a59184ffbc8464b6ab59654be.sv.png differ diff --git a/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.da.png b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.da.png new file mode 100644 index 00000000..44af1896 Binary files /dev/null and b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.da.png differ diff --git a/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.no.png b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.no.png new file mode 100644 index 00000000..44af1896 Binary files /dev/null and b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.no.png differ diff --git a/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.sv.png b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.sv.png new file mode 100644 index 00000000..44af1896 Binary files /dev/null and b/translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.sv.png differ diff --git a/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.da.png b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.da.png new file mode 100644 index 00000000..6d749e6c Binary files /dev/null and b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.da.png differ diff --git a/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.no.png b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.no.png new file mode 100644 index 00000000..6d749e6c Binary files /dev/null and b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.no.png differ diff --git a/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.sv.png b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.sv.png new file mode 100644 index 00000000..6d749e6c Binary files /dev/null and b/translated_images/azure-iot-edge-logo.c1c076749b5cba2e8755262fadc2f19ca1146b948d76990b1229199ac2292d79.sv.png differ diff --git a/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.da.png b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.da.png new file mode 100644 index 00000000..7485e36c Binary files /dev/null and b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.da.png differ diff --git a/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.no.png b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.no.png new file mode 100644 index 00000000..7485e36c Binary files /dev/null and b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.no.png differ diff --git a/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.sv.png b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.sv.png new file mode 100644 index 00000000..7485e36c Binary files /dev/null and b/translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.sv.png differ diff --git a/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.da.png b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.da.png new file mode 100644 index 00000000..0f499097 Binary files /dev/null and b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.da.png differ diff --git a/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.no.png b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.no.png new file mode 100644 index 00000000..0f499097 Binary files /dev/null and b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.no.png differ diff --git a/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.sv.png b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.sv.png new file mode 100644 index 00000000..0f499097 Binary files /dev/null and b/translated_images/azure-maps-logo.35d01dcfbd81fe6140e94257aaa1538f785a58c91576d14e0ebe7a2f6c694b99.sv.png differ diff --git a/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.da.png b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.da.png new file mode 100644 index 00000000..710c440c Binary files /dev/null and b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.da.png differ diff --git a/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.no.png b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.no.png new file mode 100644 index 00000000..710c440c Binary files /dev/null and b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.no.png differ diff --git a/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.sv.png b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.sv.png new file mode 100644 index 00000000..710c440c Binary files /dev/null and b/translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.sv.png differ diff --git a/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.da.png b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.da.png new file mode 100644 index 00000000..24cecced Binary files /dev/null and b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.da.png differ diff --git a/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.no.png b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.no.png new file mode 100644 index 00000000..24cecced Binary files /dev/null and b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.no.png differ diff --git a/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.sv.png b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.sv.png new file mode 100644 index 00000000..24cecced Binary files /dev/null and b/translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.sv.png differ diff --git a/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.da.png b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.da.png new file mode 100644 index 00000000..b36025d9 Binary files /dev/null and b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.da.png differ diff --git a/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.no.png b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.no.png new file mode 100644 index 00000000..b36025d9 Binary files /dev/null and b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.no.png differ diff --git a/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.sv.png b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.sv.png new file mode 100644 index 00000000..b36025d9 Binary files /dev/null and b/translated_images/azure-speech-logo.a1f08c4befb0159f2cb5d692d3baf5b599e7b44759d316da907bda1508f46a4a.sv.png differ diff --git a/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.da.png b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.da.png new file mode 100644 index 00000000..b21a4bed Binary files /dev/null and b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.da.png differ diff --git a/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.no.png b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.no.png new file mode 100644 index 00000000..b21a4bed Binary files /dev/null and b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.no.png differ diff --git a/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.sv.png b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.sv.png new file mode 100644 index 00000000..b21a4bed Binary files /dev/null and b/translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.sv.png differ diff --git a/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.da.png b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.da.png new file mode 100644 index 00000000..8da6f9a4 Binary files /dev/null and b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.da.png differ diff --git a/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.no.png b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.no.png new file mode 100644 index 00000000..8da6f9a4 Binary files /dev/null and b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.no.png differ diff --git a/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.sv.png b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.sv.png new file mode 100644 index 00000000..8da6f9a4 Binary files /dev/null and b/translated_images/azure-translator-logo.c6ed3a4a433edfd2f11577eca105412c50b8396b194cbbd730723dd1d0793bcd.sv.png differ diff --git a/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.da.jpg b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.da.jpg new file mode 100644 index 00000000..437f3d07 Binary files /dev/null and b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.da.jpg differ diff --git a/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.no.jpg b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.no.jpg new file mode 100644 index 00000000..437f3d07 Binary files /dev/null and b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.no.jpg differ diff --git a/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.sv.jpg b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.sv.jpg new file mode 100644 index 00000000..437f3d07 Binary files /dev/null and b/translated_images/banana-arducam.be1b32d4267a8194b0fd042362e56faa431da9cd4af172051b37243ea9be0256.sv.jpg differ diff --git a/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.da.png b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.da.png new file mode 100644 index 00000000..cc61fb13 Binary files /dev/null and b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.da.png differ diff --git a/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.no.png b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.no.png new file mode 100644 index 00000000..cc61fb13 Binary files /dev/null and b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.no.png differ diff --git a/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.sv.png b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.sv.png new file mode 100644 index 00000000..cc61fb13 Binary files /dev/null and b/translated_images/banana-picture-compare.174df164dc326a42cf7fb051a7497e6113c620e91552d92ca914220305d47d9a.sv.png differ diff --git a/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.da.png b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.da.png new file mode 100644 index 00000000..3472b1d9 Binary files /dev/null and b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.da.png differ diff --git a/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.no.png b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.no.png new file mode 100644 index 00000000..3472b1d9 Binary files /dev/null and b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.no.png differ diff --git a/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.sv.png b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.sv.png new file mode 100644 index 00000000..3472b1d9 Binary files /dev/null and b/translated_images/banana-ripe-1.6ed72365ffc9230064fbaefdb698bde74529ad5b3c747a4a28421b534730fa5f.sv.png differ diff --git a/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.da.png b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.da.png new file mode 100644 index 00000000..0bbca602 Binary files /dev/null and b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.da.png differ diff --git a/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.no.png b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.no.png new file mode 100644 index 00000000..0bbca602 Binary files /dev/null and b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.no.png differ diff --git a/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.sv.png b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.sv.png new file mode 100644 index 00000000..0bbca602 Binary files /dev/null and b/translated_images/banana-ripe-1.780e9be3a60d8879826126ee1e84e135ffa20ec91697bb759daf7ba0b76c811b.sv.png differ diff --git a/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.da.png b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.da.png new file mode 100644 index 00000000..b5775adc Binary files /dev/null and b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.da.png differ diff --git a/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.no.png b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.no.png new file mode 100644 index 00000000..b5775adc Binary files /dev/null and b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.no.png differ diff --git a/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.sv.png b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.sv.png new file mode 100644 index 00000000..b5775adc Binary files /dev/null and b/translated_images/banana-ripe-10.c3d98eb280e7464ffa36da1fa18413db4fd032da973b098bb4978d6d99c1a3af.sv.png differ diff --git a/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.da.png b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.da.png new file mode 100644 index 00000000..bc58477a Binary files /dev/null and b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.da.png differ diff --git a/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.no.png b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.no.png new file mode 100644 index 00000000..bc58477a Binary files /dev/null and b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.no.png differ diff --git a/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.sv.png b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.sv.png new file mode 100644 index 00000000..bc58477a Binary files /dev/null and b/translated_images/banana-ripe-11.3d932f292b95b9a202082ce75f5b52ecaf43718721661810b53f7a5a2c4b4133.sv.png differ diff --git a/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.da.png b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.da.png new file mode 100644 index 00000000..1b7a40f4 Binary files /dev/null and b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.da.png differ diff --git a/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.no.png b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.no.png new file mode 100644 index 00000000..1b7a40f4 Binary files /dev/null and b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.no.png differ diff --git a/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.sv.png b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.sv.png new file mode 100644 index 00000000..1b7a40f4 Binary files /dev/null and b/translated_images/banana-ripe-12.9f87e663b9da6c8525f3ce63c5c0a1c095e42675e2a6af9b0fddb14ebb1e0b4b.sv.png differ diff --git a/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.da.png b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.da.png new file mode 100644 index 00000000..011b07a3 Binary files /dev/null and b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.da.png differ diff --git a/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.no.png b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.no.png new file mode 100644 index 00000000..011b07a3 Binary files /dev/null and b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.no.png differ diff --git a/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.sv.png b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.sv.png new file mode 100644 index 00000000..011b07a3 Binary files /dev/null and b/translated_images/banana-ripe-13.b7402e05160f454309533a578849d7e79f92dd70799428943d7211c2fbb82465.sv.png differ diff --git a/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.da.png b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.da.png new file mode 100644 index 00000000..7f9d24ef Binary files /dev/null and b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.da.png differ diff --git a/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.no.png b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.no.png new file mode 100644 index 00000000..7f9d24ef Binary files /dev/null and b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.no.png differ diff --git a/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.sv.png b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.sv.png new file mode 100644 index 00000000..7f9d24ef Binary files /dev/null and b/translated_images/banana-ripe-14.85cf309aa702cfa870286a5f8838ee5875a655074a982bafe5b8d32d4d5819f2.sv.png differ diff --git a/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.da.png b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.da.png new file mode 100644 index 00000000..0c6a7067 Binary files /dev/null and b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.da.png differ diff --git a/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.no.png b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.no.png new file mode 100644 index 00000000..0c6a7067 Binary files /dev/null and b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.no.png differ diff --git a/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.sv.png b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.sv.png new file mode 100644 index 00000000..0c6a7067 Binary files /dev/null and b/translated_images/banana-ripe-15.933412eb14a3f8e419c764c8157d1e5f25256972a8dcf450aa630b8c007c8c3d.sv.png differ diff --git a/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.da.png b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.da.png new file mode 100644 index 00000000..8f7968a5 Binary files /dev/null and b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.da.png differ diff --git a/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.no.png b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.no.png new file mode 100644 index 00000000..8f7968a5 Binary files /dev/null and b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.no.png differ diff --git a/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.sv.png b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.sv.png new file mode 100644 index 00000000..8f7968a5 Binary files /dev/null and b/translated_images/banana-ripe-16.781a68a01401f89e5e523c88e659a0f9697b7de378571c91e597edc0d0c2eb07.sv.png differ diff --git a/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.da.png b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.da.png new file mode 100644 index 00000000..20c6036f Binary files /dev/null and b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.da.png differ diff --git a/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.no.png b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.no.png new file mode 100644 index 00000000..20c6036f Binary files /dev/null and b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.no.png differ diff --git a/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.sv.png b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.sv.png new file mode 100644 index 00000000..20c6036f Binary files /dev/null and b/translated_images/banana-ripe-17.f8e2853a40d3ac450e290036792b75ac4b8da5883536478722fb336d5f66517e.sv.png differ diff --git a/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.da.png b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.da.png new file mode 100644 index 00000000..f077b6e9 Binary files /dev/null and b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.da.png differ diff --git a/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.no.png b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.no.png new file mode 100644 index 00000000..f077b6e9 Binary files /dev/null and b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.no.png differ diff --git a/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.sv.png b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.sv.png new file mode 100644 index 00000000..f077b6e9 Binary files /dev/null and b/translated_images/banana-ripe-18.3d05f5f78ecf6f0d74aecdafb8e415851a5333e5dbc016ac1870ab5e4c383b07.sv.png differ diff --git a/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.da.png b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.da.png new file mode 100644 index 00000000..484206d5 Binary files /dev/null and b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.da.png differ diff --git a/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.no.png b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.no.png new file mode 100644 index 00000000..484206d5 Binary files /dev/null and b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.no.png differ diff --git a/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.sv.png b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.sv.png new file mode 100644 index 00000000..484206d5 Binary files /dev/null and b/translated_images/banana-ripe-19.ac3b0fc6cf6fdfd5523227bc246c915b228bc3d4bc1c72f6612723ed889023b5.sv.png differ diff --git a/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.da.png b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.da.png new file mode 100644 index 00000000..9fa156e2 Binary files /dev/null and b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.da.png differ diff --git a/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.no.png b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.no.png new file mode 100644 index 00000000..9fa156e2 Binary files /dev/null and b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.no.png differ diff --git a/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.sv.png b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.sv.png new file mode 100644 index 00000000..9fa156e2 Binary files /dev/null and b/translated_images/banana-ripe-2.8ab96da692df69f1c78bd3a93acfdb17bc292ac964a3f3bac9249ba1dd1681c3.sv.png differ diff --git a/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.da.png b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.da.png new file mode 100644 index 00000000..b0813972 Binary files /dev/null and b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.da.png differ diff --git a/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.no.png b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.no.png new file mode 100644 index 00000000..b0813972 Binary files /dev/null and b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.no.png differ diff --git a/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.sv.png b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.sv.png new file mode 100644 index 00000000..b0813972 Binary files /dev/null and b/translated_images/banana-ripe-2.96ddc53114c5f020a328b264174eef43d2096620c6b10ff5189e99674c1dfa8c.sv.png differ diff --git a/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.da.png b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.da.png new file mode 100644 index 00000000..4f2da8dc Binary files /dev/null and b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.da.png differ diff --git a/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.no.png b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.no.png new file mode 100644 index 00000000..4f2da8dc Binary files /dev/null and b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.no.png differ diff --git a/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.sv.png b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.sv.png new file mode 100644 index 00000000..4f2da8dc Binary files /dev/null and b/translated_images/banana-ripe-20.a4d0ad33a7e6f037ac9276dc751ae62d56d3cc16e625837197ef49da426bc3c8.sv.png differ diff --git a/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.da.png b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.da.png new file mode 100644 index 00000000..8ae3904c Binary files /dev/null and b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.da.png differ diff --git a/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.no.png b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.no.png new file mode 100644 index 00000000..8ae3904c Binary files /dev/null and b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.no.png differ diff --git a/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.sv.png b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.sv.png new file mode 100644 index 00000000..8ae3904c Binary files /dev/null and b/translated_images/banana-ripe-21.07e03d64f265d55dfe3b304df3e36f06140b87f80ae2cadd22a7736e2855eb8f.sv.png differ diff --git a/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.da.png b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.da.png new file mode 100644 index 00000000..ea5cbe30 Binary files /dev/null and b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.da.png differ diff --git a/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.no.png b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.no.png new file mode 100644 index 00000000..ea5cbe30 Binary files /dev/null and b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.no.png differ diff --git a/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.sv.png b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.sv.png new file mode 100644 index 00000000..ea5cbe30 Binary files /dev/null and b/translated_images/banana-ripe-22.a63c05aeb7f866fc64b6ac04e6fa68e1d1a22d729ad16d9fadf3357df97654a3.sv.png differ diff --git a/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.da.png b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.da.png new file mode 100644 index 00000000..eab9fb03 Binary files /dev/null and b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.da.png differ diff --git a/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.no.png b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.no.png new file mode 100644 index 00000000..eab9fb03 Binary files /dev/null and b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.no.png differ diff --git a/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.sv.png b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.sv.png new file mode 100644 index 00000000..eab9fb03 Binary files /dev/null and b/translated_images/banana-ripe-23.6f3364afcab19e571497cb5a3fa2b0c603a303beb31034cb82ae25635f4cc005.sv.png differ diff --git a/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.da.png b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.da.png new file mode 100644 index 00000000..c49c0459 Binary files /dev/null and b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.da.png differ diff --git a/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.no.png b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.no.png new file mode 100644 index 00000000..c49c0459 Binary files /dev/null and b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.no.png differ diff --git a/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.sv.png b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.sv.png new file mode 100644 index 00000000..c49c0459 Binary files /dev/null and b/translated_images/banana-ripe-24.ff2c02cc80a9c4301d1f851af0a96f414fcc844f912ea4bea902877c9d6978f6.sv.png differ diff --git a/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.da.png b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.da.png new file mode 100644 index 00000000..127b0257 Binary files /dev/null and b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.da.png differ diff --git a/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.no.png b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.no.png new file mode 100644 index 00000000..127b0257 Binary files /dev/null and b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.no.png differ diff --git a/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.sv.png b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.sv.png new file mode 100644 index 00000000..127b0257 Binary files /dev/null and b/translated_images/banana-ripe-25.65ce63418cdc4de2d1d29d0fd35401a9f99e967938e01c3578f13a6b6812ae50.sv.png differ diff --git a/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.da.png b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.da.png new file mode 100644 index 00000000..0b528799 Binary files /dev/null and b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.da.png differ diff --git a/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.no.png b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.no.png new file mode 100644 index 00000000..0b528799 Binary files /dev/null and b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.no.png differ diff --git a/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.sv.png b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.sv.png new file mode 100644 index 00000000..0b528799 Binary files /dev/null and b/translated_images/banana-ripe-3.4fae05a0a1d2b5f010998afee52fb77a113453a95331c76eb4b509c14d5cb5d7.sv.png differ diff --git a/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.da.png b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.da.png new file mode 100644 index 00000000..e5b04c65 Binary files /dev/null and b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.da.png differ diff --git a/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.no.png b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.no.png new file mode 100644 index 00000000..e5b04c65 Binary files /dev/null and b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.no.png differ diff --git a/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.sv.png b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.sv.png new file mode 100644 index 00000000..e5b04c65 Binary files /dev/null and b/translated_images/banana-ripe-5.c762086879ccec4c5402fb5dd5387f4ee4c208de3ec13fd69a5461ef36cde34a.sv.png differ diff --git a/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.da.png b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.da.png new file mode 100644 index 00000000..46543926 Binary files /dev/null and b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.da.png differ diff --git a/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.no.png b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.no.png new file mode 100644 index 00000000..46543926 Binary files /dev/null and b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.no.png differ diff --git a/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.sv.png b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.sv.png new file mode 100644 index 00000000..46543926 Binary files /dev/null and b/translated_images/banana-ripe-6.5131bcbf492980cb737c3658b96f6ff3381ced4cd6505588b05bd95d82965c49.sv.png differ diff --git a/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.da.png b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.da.png new file mode 100644 index 00000000..46e99668 Binary files /dev/null and b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.da.png differ diff --git a/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.no.png b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.no.png new file mode 100644 index 00000000..46e99668 Binary files /dev/null and b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.no.png differ diff --git a/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.sv.png b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.sv.png new file mode 100644 index 00000000..46e99668 Binary files /dev/null and b/translated_images/banana-ripe-7.5fc18dfe7b7ae9dc5afe27cc6c0ce162c819b78b69b05f6f9c1636d5d1b82edc.sv.png differ diff --git a/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.da.png b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.da.png new file mode 100644 index 00000000..c012d47d Binary files /dev/null and b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.da.png differ diff --git a/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.no.png b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.no.png new file mode 100644 index 00000000..c012d47d Binary files /dev/null and b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.no.png differ diff --git a/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.sv.png b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.sv.png new file mode 100644 index 00000000..c012d47d Binary files /dev/null and b/translated_images/banana-ripe-8.dba1d33bd34d4830201c15a9c35c56fde4b1a45dc7dc5e3a7def9986bf1b6c28.sv.png differ diff --git a/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.da.png b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.da.png new file mode 100644 index 00000000..fa44061a Binary files /dev/null and b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.da.png differ diff --git a/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.no.png b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.no.png new file mode 100644 index 00000000..fa44061a Binary files /dev/null and b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.no.png differ diff --git a/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.sv.png b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.sv.png new file mode 100644 index 00000000..fa44061a Binary files /dev/null and b/translated_images/banana-ripe-9.32f91462c8b0e2d3666f49a12afd84462212c5834835f988b3c37441c0493952.sv.png differ diff --git a/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.da.png b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.da.png new file mode 100644 index 00000000..e499b2fd Binary files /dev/null and b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.da.png differ diff --git a/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.no.png b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.no.png new file mode 100644 index 00000000..e499b2fd Binary files /dev/null and b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.no.png differ diff --git a/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.sv.png b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.sv.png new file mode 100644 index 00000000..e499b2fd Binary files /dev/null and b/translated_images/banana-training-images.530eb203346d73bc23b8b990fb4609470bf4ff7c942ccc13d4cfffeed9be1ad4.sv.png differ diff --git a/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.da.png b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.da.png new file mode 100644 index 00000000..66e9927a Binary files /dev/null and b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.da.png differ diff --git a/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.no.png b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.no.png new file mode 100644 index 00000000..66e9927a Binary files /dev/null and b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.no.png differ diff --git a/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.sv.png b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.sv.png new file mode 100644 index 00000000..66e9927a Binary files /dev/null and b/translated_images/banana-unripe-1.910c8606a300fa2014a0e0adb31348effd6e0fdd5760fdfe80b8e69533bac6f7.sv.png differ diff --git a/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.da.png b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.da.png new file mode 100644 index 00000000..e512cf63 Binary files /dev/null and b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.da.png differ diff --git a/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.no.png b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.no.png new file mode 100644 index 00000000..e512cf63 Binary files /dev/null and b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.no.png differ diff --git a/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.sv.png b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.sv.png new file mode 100644 index 00000000..e512cf63 Binary files /dev/null and b/translated_images/banana-unripe-1.b2c7051d9c8a4e617be0425bea42775d16f896f3a183344e9038da2d1fb81dea.sv.png differ diff --git a/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.da.png b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.da.png new file mode 100644 index 00000000..89e41b8a Binary files /dev/null and b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.da.png differ diff --git a/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.no.png b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.no.png new file mode 100644 index 00000000..89e41b8a Binary files /dev/null and b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.no.png differ diff --git a/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.sv.png b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.sv.png new file mode 100644 index 00000000..89e41b8a Binary files /dev/null and b/translated_images/banana-unripe-10.38dab0db918a24870e655b62e7f3af030eaebe5bcfb7cfebbfb010637b46ba44.sv.png differ diff --git a/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.da.png b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.da.png new file mode 100644 index 00000000..257c3e55 Binary files /dev/null and b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.da.png differ diff --git a/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.no.png b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.no.png new file mode 100644 index 00000000..257c3e55 Binary files /dev/null and b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.no.png differ diff --git a/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.sv.png b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.sv.png new file mode 100644 index 00000000..257c3e55 Binary files /dev/null and b/translated_images/banana-unripe-11.ec8d0eefe63e10b953579d18d4fdd9d89cedc247749ec1d11fdbe49a43f1bc90.sv.png differ diff --git a/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.da.png b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.da.png new file mode 100644 index 00000000..85a581ed Binary files /dev/null and b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.da.png differ diff --git a/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.no.png b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.no.png new file mode 100644 index 00000000..85a581ed Binary files /dev/null and b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.no.png differ diff --git a/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.sv.png b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.sv.png new file mode 100644 index 00000000..85a581ed Binary files /dev/null and b/translated_images/banana-unripe-12.b95a088ccae935db01b47786dac829cb356feb5d4dbfcf8d91e000e9ed3be7a2.sv.png differ diff --git a/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.da.png b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.da.png new file mode 100644 index 00000000..c07f67c3 Binary files /dev/null and b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.da.png differ diff --git a/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.no.png b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.no.png new file mode 100644 index 00000000..c07f67c3 Binary files /dev/null and b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.no.png differ diff --git a/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.sv.png b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.sv.png new file mode 100644 index 00000000..c07f67c3 Binary files /dev/null and b/translated_images/banana-unripe-13.37e5a7cac5aa0920343a6dd17dc720499d9f9b7c990cf4bc002f681216a545b7.sv.png differ diff --git a/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.da.png b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.da.png new file mode 100644 index 00000000..c598913b Binary files /dev/null and b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.da.png differ diff --git a/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.no.png b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.no.png new file mode 100644 index 00000000..c598913b Binary files /dev/null and b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.no.png differ diff --git a/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.sv.png b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.sv.png new file mode 100644 index 00000000..c598913b Binary files /dev/null and b/translated_images/banana-unripe-14.d19ddd6bbf63a2591db0d88a6c81e17d2186dee04b9bb4ff60031009fc0cce0a.sv.png differ diff --git a/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.da.png b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.da.png new file mode 100644 index 00000000..a630a6f3 Binary files /dev/null and b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.da.png differ diff --git a/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.no.png b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.no.png new file mode 100644 index 00000000..a630a6f3 Binary files /dev/null and b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.no.png differ diff --git a/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.sv.png b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.sv.png new file mode 100644 index 00000000..a630a6f3 Binary files /dev/null and b/translated_images/banana-unripe-15.274e48544326077a58c0e00e04e98c7abe04bc473caaab64fe3154c551d8a0a8.sv.png differ diff --git a/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.da.png b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.da.png new file mode 100644 index 00000000..f63ad48d Binary files /dev/null and b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.da.png differ diff --git a/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.no.png b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.no.png new file mode 100644 index 00000000..f63ad48d Binary files /dev/null and b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.no.png differ diff --git a/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.sv.png b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.sv.png new file mode 100644 index 00000000..f63ad48d Binary files /dev/null and b/translated_images/banana-unripe-16.bd058f64bd7ec014d10bdeb9da39568aeb5871908b5c2a6376a5f97d3101c273.sv.png differ diff --git a/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.da.png b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.da.png new file mode 100644 index 00000000..73c0aea6 Binary files /dev/null and b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.da.png differ diff --git a/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.no.png b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.no.png new file mode 100644 index 00000000..73c0aea6 Binary files /dev/null and b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.no.png differ diff --git a/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.sv.png b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.sv.png new file mode 100644 index 00000000..73c0aea6 Binary files /dev/null and b/translated_images/banana-unripe-17.408382d679bfa079fbe89e269fbc05a2602d2f980834601380633a5471c72396.sv.png differ diff --git a/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.da.png b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.da.png new file mode 100644 index 00000000..0768efbc Binary files /dev/null and b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.da.png differ diff --git a/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.no.png b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.no.png new file mode 100644 index 00000000..0768efbc Binary files /dev/null and b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.no.png differ diff --git a/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.sv.png b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.sv.png new file mode 100644 index 00000000..0768efbc Binary files /dev/null and b/translated_images/banana-unripe-18.39c0eb79d7b3b9baf71858801fb8cb8b01e395289bab8c7091a57a97d1dfa075.sv.png differ diff --git a/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.da.png b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.da.png new file mode 100644 index 00000000..a6c3afe8 Binary files /dev/null and b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.da.png differ diff --git a/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.no.png b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.no.png new file mode 100644 index 00000000..a6c3afe8 Binary files /dev/null and b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.no.png differ diff --git a/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.sv.png b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.sv.png new file mode 100644 index 00000000..a6c3afe8 Binary files /dev/null and b/translated_images/banana-unripe-19.e61e6d7efaf2d8c81a25acbff9c40f018b78c3c240c8e384d54da374eda70f9b.sv.png differ diff --git a/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.da.png b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.da.png new file mode 100644 index 00000000..eed10ecb Binary files /dev/null and b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.da.png differ diff --git a/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.no.png b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.no.png new file mode 100644 index 00000000..eed10ecb Binary files /dev/null and b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.no.png differ diff --git a/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.sv.png b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.sv.png new file mode 100644 index 00000000..eed10ecb Binary files /dev/null and b/translated_images/banana-unripe-2.43a73b544521afc7efd54de90fd585f314844de67b16509fff2ab80c05eec7bd.sv.png differ diff --git a/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.da.png b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.da.png new file mode 100644 index 00000000..4c086050 Binary files /dev/null and b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.da.png differ diff --git a/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.no.png b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.no.png new file mode 100644 index 00000000..4c086050 Binary files /dev/null and b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.no.png differ diff --git a/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.sv.png b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.sv.png new file mode 100644 index 00000000..4c086050 Binary files /dev/null and b/translated_images/banana-unripe-2.9591d1a6aa27deebbaec0955b227bbae20d6bfae43f29d832bd412bbafa45bfd.sv.png differ diff --git a/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.da.png b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.da.png new file mode 100644 index 00000000..9f641588 Binary files /dev/null and b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.da.png differ diff --git a/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.no.png b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.no.png new file mode 100644 index 00000000..9f641588 Binary files /dev/null and b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.no.png differ diff --git a/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.sv.png b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.sv.png new file mode 100644 index 00000000..9f641588 Binary files /dev/null and b/translated_images/banana-unripe-20.85b7a74eaab5634e769fe2fec57405201513094c400f71e16d75cd79bde092ab.sv.png differ diff --git a/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.da.png b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.da.png new file mode 100644 index 00000000..9404843f Binary files /dev/null and b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.da.png differ diff --git a/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.no.png b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.no.png new file mode 100644 index 00000000..9404843f Binary files /dev/null and b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.no.png differ diff --git a/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.sv.png b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.sv.png new file mode 100644 index 00000000..9404843f Binary files /dev/null and b/translated_images/banana-unripe-21.ccc1333439b344bc502fbfa9b60e5e9013a4d57ba539ba87000ccd69dc0675e2.sv.png differ diff --git a/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.da.png b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.da.png new file mode 100644 index 00000000..9636ac68 Binary files /dev/null and b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.da.png differ diff --git a/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.no.png b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.no.png new file mode 100644 index 00000000..9636ac68 Binary files /dev/null and b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.no.png differ diff --git a/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.sv.png b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.sv.png new file mode 100644 index 00000000..9636ac68 Binary files /dev/null and b/translated_images/banana-unripe-22.27dff4b438163080fcace0af6f24b8c9866b76a15269844e9ed1b722ae2220e7.sv.png differ diff --git a/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.da.png b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.da.png new file mode 100644 index 00000000..38a2b35d Binary files /dev/null and b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.da.png differ diff --git a/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.no.png b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.no.png new file mode 100644 index 00000000..38a2b35d Binary files /dev/null and b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.no.png differ diff --git a/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.sv.png b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.sv.png new file mode 100644 index 00000000..38a2b35d Binary files /dev/null and b/translated_images/banana-unripe-23.c4c9067f23370e90c5156d7659a0d17590d952e2defd6550aeded84e847c1e4b.sv.png differ diff --git a/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.da.png b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.da.png new file mode 100644 index 00000000..cd09e177 Binary files /dev/null and b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.da.png differ diff --git a/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.no.png b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.no.png new file mode 100644 index 00000000..cd09e177 Binary files /dev/null and b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.no.png differ diff --git a/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.sv.png b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.sv.png new file mode 100644 index 00000000..cd09e177 Binary files /dev/null and b/translated_images/banana-unripe-24.6f0b781c309da62f71147fcc87699967bef10c57a794029ede2eb0d1d88e4b73.sv.png differ diff --git a/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.da.png b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.da.png new file mode 100644 index 00000000..4cc4f4bc Binary files /dev/null and b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.da.png differ diff --git a/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.no.png b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.no.png new file mode 100644 index 00000000..4cc4f4bc Binary files /dev/null and b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.no.png differ diff --git a/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.sv.png b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.sv.png new file mode 100644 index 00000000..4cc4f4bc Binary files /dev/null and b/translated_images/banana-unripe-25.21d553d84880ac4ff73128909d01c79c4544424d218f740482da46bdae46f74b.sv.png differ diff --git a/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.da.png b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.da.png new file mode 100644 index 00000000..33e03220 Binary files /dev/null and b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.da.png differ diff --git a/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.no.png b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.no.png new file mode 100644 index 00000000..33e03220 Binary files /dev/null and b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.no.png differ diff --git a/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.sv.png b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.sv.png new file mode 100644 index 00000000..33e03220 Binary files /dev/null and b/translated_images/banana-unripe-26.823c48b61feb1d5c319e9cf54f5e7c2bb43f91e781bf42d57f386d0dabf3fd12.sv.png differ diff --git a/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.da.png b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.da.png new file mode 100644 index 00000000..489d49e3 Binary files /dev/null and b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.da.png differ diff --git a/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.no.png b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.no.png new file mode 100644 index 00000000..489d49e3 Binary files /dev/null and b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.no.png differ diff --git a/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.sv.png b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.sv.png new file mode 100644 index 00000000..489d49e3 Binary files /dev/null and b/translated_images/banana-unripe-27.f98fd272deeb02d9b6771340fe6da2de82db652ade770d9eca14ba6be2d0ad17.sv.png differ diff --git a/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.da.png b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.da.png new file mode 100644 index 00000000..80b39b63 Binary files /dev/null and b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.da.png differ diff --git a/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.no.png b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.no.png new file mode 100644 index 00000000..80b39b63 Binary files /dev/null and b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.no.png differ diff --git a/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.sv.png b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.sv.png new file mode 100644 index 00000000..80b39b63 Binary files /dev/null and b/translated_images/banana-unripe-28.5331ba409ce41c07caa09d72d6ad7375b5a5b3d7609fcabdaa82d9799439fd21.sv.png differ diff --git a/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.da.png b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.da.png new file mode 100644 index 00000000..2404a4ce Binary files /dev/null and b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.da.png differ diff --git a/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.no.png b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.no.png new file mode 100644 index 00000000..2404a4ce Binary files /dev/null and b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.no.png differ diff --git a/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.sv.png b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.sv.png new file mode 100644 index 00000000..2404a4ce Binary files /dev/null and b/translated_images/banana-unripe-29.84e126f389bf627ed464abdf8127f3a58e8b0131b5b1b9ee038de51703c31657.sv.png differ diff --git a/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.da.png b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.da.png new file mode 100644 index 00000000..f884cc81 Binary files /dev/null and b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.da.png differ diff --git a/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.no.png b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.no.png new file mode 100644 index 00000000..f884cc81 Binary files /dev/null and b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.no.png differ diff --git a/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.sv.png b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.sv.png new file mode 100644 index 00000000..f884cc81 Binary files /dev/null and b/translated_images/banana-unripe-3.896df8fb2c3b8f51f71b212645fc5314b591a033938208000839642858ddcabd.sv.png differ diff --git a/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.da.png b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.da.png new file mode 100644 index 00000000..9f649bd1 Binary files /dev/null and b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.da.png differ diff --git a/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.no.png b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.no.png new file mode 100644 index 00000000..9f649bd1 Binary files /dev/null and b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.no.png differ diff --git a/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.sv.png b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.sv.png new file mode 100644 index 00000000..9f649bd1 Binary files /dev/null and b/translated_images/banana-unripe-4.483e740d6fd7b5a671cb49ad1b0f2c35f1637f86ccb9746bb4cc3b59ab752bf7.sv.png differ diff --git a/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.da.png b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.da.png new file mode 100644 index 00000000..03e1fa8c Binary files /dev/null and b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.da.png differ diff --git a/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.no.png b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.no.png new file mode 100644 index 00000000..03e1fa8c Binary files /dev/null and b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.no.png differ diff --git a/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.sv.png b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.sv.png new file mode 100644 index 00000000..03e1fa8c Binary files /dev/null and b/translated_images/banana-unripe-5.e9923cf1ffcfc1c93e8c2aeb184bd071566742b738b671ab9cedcd5708239a58.sv.png differ diff --git a/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.da.png b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.da.png new file mode 100644 index 00000000..983f836f Binary files /dev/null and b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.da.png differ diff --git a/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.no.png b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.no.png new file mode 100644 index 00000000..983f836f Binary files /dev/null and b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.no.png differ diff --git a/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.sv.png b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.sv.png new file mode 100644 index 00000000..983f836f Binary files /dev/null and b/translated_images/banana-unripe-6.e3a73307558caecc9aac5ae80bbe37ca38f105e2bd7311afab61ee1014fc6c0e.sv.png differ diff --git a/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.da.png b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.da.png new file mode 100644 index 00000000..2aede939 Binary files /dev/null and b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.da.png differ diff --git a/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.no.png b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.no.png new file mode 100644 index 00000000..2aede939 Binary files /dev/null and b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.no.png differ diff --git a/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.sv.png b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.sv.png new file mode 100644 index 00000000..2aede939 Binary files /dev/null and b/translated_images/banana-unripe-7.634ca89acc17d68f8423b1a13f1bec6bdbd5135f0149c6cfaa53d7b7d5fa1c65.sv.png differ diff --git a/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.da.png b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.da.png new file mode 100644 index 00000000..7bc7bab2 Binary files /dev/null and b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.da.png differ diff --git a/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.no.png b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.no.png new file mode 100644 index 00000000..7bc7bab2 Binary files /dev/null and b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.no.png differ diff --git a/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.sv.png b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.sv.png new file mode 100644 index 00000000..7bc7bab2 Binary files /dev/null and b/translated_images/banana-unripe-8.75720b4cdebac8c36964c86e051ea962ab02e530abec3f577bd77fdbc34d7f9d.sv.png differ diff --git a/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.da.png b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.da.png new file mode 100644 index 00000000..4ffd862a Binary files /dev/null and b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.da.png differ diff --git a/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.no.png b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.no.png new file mode 100644 index 00000000..4ffd862a Binary files /dev/null and b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.no.png differ diff --git a/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.sv.png b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.sv.png new file mode 100644 index 00000000..4ffd862a Binary files /dev/null and b/translated_images/banana-unripe-9.e8076983351d2f54cfb246bc01090e7016b63fb8d81396822cbe5366c1b88b7f.sv.png differ diff --git a/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.da.png b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.da.png new file mode 100644 index 00000000..ef506579 Binary files /dev/null and b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.da.png differ diff --git a/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.no.png b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.no.png new file mode 100644 index 00000000..ef506579 Binary files /dev/null and b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.no.png differ diff --git a/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.sv.png b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.sv.png new file mode 100644 index 00000000..ef506579 Binary files /dev/null and b/translated_images/banana-unripe-quick-test-prediction.dae9b5e1c4ef7c64886422438850ea14f0be6ac918c217ea3b255c685abfabe7.sv.png differ diff --git a/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.da.png b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.da.png new file mode 100644 index 00000000..ddf79213 Binary files /dev/null and b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.da.png differ diff --git a/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.no.png b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.no.png new file mode 100644 index 00000000..ddf79213 Binary files /dev/null and b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.no.png differ diff --git a/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.sv.png b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.sv.png new file mode 100644 index 00000000..ddf79213 Binary files /dev/null and b/translated_images/bananas-ripe-vs-unripe-predictions.8d0e2034014aa50ece4e4589e724b142da0681f35470fe3db3f7d51240f69c85.sv.png differ diff --git a/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.da.png b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.da.png new file mode 100644 index 00000000..1796bcce Binary files /dev/null and b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.da.png differ diff --git a/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.no.png b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.no.png new file mode 100644 index 00000000..1796bcce Binary files /dev/null and b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.no.png differ diff --git a/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.sv.png b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.sv.png new file mode 100644 index 00000000..1796bcce Binary files /dev/null and b/translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.sv.png differ diff --git a/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.da.png b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.da.png new file mode 100644 index 00000000..ab763666 Binary files /dev/null and b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.da.png differ diff --git a/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.no.png b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.no.png new file mode 100644 index 00000000..ab763666 Binary files /dev/null and b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.no.png differ diff --git a/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.sv.png b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.sv.png new file mode 100644 index 00000000..ab763666 Binary files /dev/null and b/translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.sv.png differ diff --git a/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.da.png b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.da.png new file mode 100644 index 00000000..013f247d Binary files /dev/null and b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.da.png differ diff --git a/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.no.png b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.no.png new file mode 100644 index 00000000..013f247d Binary files /dev/null and b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.no.png differ diff --git a/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.sv.png b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.sv.png new file mode 100644 index 00000000..013f247d Binary files /dev/null and b/translated_images/bounding-box.1420a7ea0d3d15f71e1ffb5cf4b2271d184fac051f990abc541975168d163684.sv.png differ diff --git a/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.da.png b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.da.png new file mode 100644 index 00000000..fd1b7753 Binary files /dev/null and b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.da.png differ diff --git a/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.no.png b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.no.png new file mode 100644 index 00000000..fd1b7753 Binary files /dev/null and b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.no.png differ diff --git a/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.sv.png b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.sv.png new file mode 100644 index 00000000..fd1b7753 Binary files /dev/null and b/translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.sv.png differ diff --git a/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.da.png b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.da.png new file mode 100644 index 00000000..55154b84 Binary files /dev/null and b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.da.png differ diff --git a/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.no.png b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.no.png new file mode 100644 index 00000000..55154b84 Binary files /dev/null and b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.no.png differ diff --git a/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.sv.png b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.sv.png new file mode 100644 index 00000000..55154b84 Binary files /dev/null and b/translated_images/button-with-digital.3749edea8eb885af0303f7ea29e2389d704661c0ca3225b08ff0cbc22f332059.sv.png differ diff --git a/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.da.png b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.da.png new file mode 100644 index 00000000..306d6f14 Binary files /dev/null and b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.da.png differ diff --git a/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.no.png b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.no.png new file mode 100644 index 00000000..306d6f14 Binary files /dev/null and b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.no.png differ diff --git a/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.sv.png b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.sv.png new file mode 100644 index 00000000..306d6f14 Binary files /dev/null and b/translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.sv.png differ diff --git a/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.da.png b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.da.png new file mode 100644 index 00000000..dfb03646 Binary files /dev/null and b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.da.png differ diff --git a/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.no.png b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.no.png new file mode 100644 index 00000000..dfb03646 Binary files /dev/null and b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.no.png differ diff --git a/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.sv.png b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.sv.png new file mode 100644 index 00000000..dfb03646 Binary files /dev/null and b/translated_images/chart-soil-moisture-relay.fbb391236d34a64d0abf1df396e9197e0a24df14150620b9cc820a64a55c9326.sv.png differ diff --git a/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.da.png b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.da.png new file mode 100644 index 00000000..05208120 Binary files /dev/null and b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.da.png differ diff --git a/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.no.png b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.no.png new file mode 100644 index 00000000..05208120 Binary files /dev/null and b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.no.png differ diff --git a/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.sv.png b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.sv.png new file mode 100644 index 00000000..05208120 Binary files /dev/null and b/translated_images/chart-soil-moisture.fd6d9d0cdc0b5f75e78038ecb8945dfc84b38851359de99d84b16e3336d6d7c2.sv.png differ diff --git a/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.da.jpg b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.da.jpg new file mode 100644 index 00000000..e78b8c6c Binary files /dev/null and b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.da.jpg differ diff --git a/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.no.jpg b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.no.jpg new file mode 100644 index 00000000..e78b8c6c Binary files /dev/null and b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.no.jpg differ diff --git a/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.sv.jpg b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.sv.jpg new file mode 100644 index 00000000..e78b8c6c Binary files /dev/null and b/translated_images/child-watering-garden.9a5d3f1bfe6d0d8d488291e8189899b2c59f82abaa487f18d404217a25e671e7.sv.jpg differ diff --git a/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.da.png b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.da.png new file mode 100644 index 00000000..0b221a3f Binary files /dev/null and b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.da.png differ diff --git a/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.no.png b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.no.png new file mode 100644 index 00000000..0b221a3f Binary files /dev/null and b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.no.png differ diff --git a/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.sv.png b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.sv.png new file mode 100644 index 00000000..0b221a3f Binary files /dev/null and b/translated_images/cloud-with-edge.1e26462c62c126fe150bd15a5714ddf0be599f09bacbad08b85be02b76ea1ae1.sv.png differ diff --git a/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.da.png b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.da.png new file mode 100644 index 00000000..576d3f84 Binary files /dev/null and b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.da.png differ diff --git a/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.no.png b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.no.png new file mode 100644 index 00000000..576d3f84 Binary files /dev/null and b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.no.png differ diff --git a/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.sv.png b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.sv.png new file mode 100644 index 00000000..576d3f84 Binary files /dev/null and b/translated_images/cloud-without-edge.b4da641f6022c95ed6b91fde8b5323abd2f94e0d52073ad54172ae8f5dac90e9.sv.png differ diff --git a/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.da.png b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.da.png new file mode 100644 index 00000000..297ccc5e Binary files /dev/null and b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.da.png differ diff --git a/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.no.png b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.no.png new file mode 100644 index 00000000..297ccc5e Binary files /dev/null and b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.no.png differ diff --git a/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.sv.png b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.sv.png new file mode 100644 index 00000000..297ccc5e Binary files /dev/null and b/translated_images/cmos-sensor.75f9cd74decb137149a4c9ea825251a4549497d67c0ae2776159e6102bb53aa9.sv.png differ diff --git a/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.da.png b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.da.png new file mode 100644 index 00000000..89bd1ba6 Binary files /dev/null and b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.da.png differ diff --git a/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.no.png b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.no.png new file mode 100644 index 00000000..89bd1ba6 Binary files /dev/null and b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.no.png differ diff --git a/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.sv.png b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.sv.png new file mode 100644 index 00000000..89bd1ba6 Binary files /dev/null and b/translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.sv.png differ diff --git a/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.da.jpg b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.da.jpg new file mode 100644 index 00000000..383794f2 Binary files /dev/null and b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.da.jpg differ diff --git a/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.no.jpg b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.no.jpg new file mode 100644 index 00000000..383794f2 Binary files /dev/null and b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.no.jpg differ diff --git a/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.sv.jpg b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.sv.jpg new file mode 100644 index 00000000..383794f2 Binary files /dev/null and b/translated_images/condenser-mic.6f6ed5b76ca19e0ec3fd0c544601542d4479a6cb7565db336de49fbbf69f623e.sv.jpg differ diff --git a/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.da.png b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.da.png new file mode 100644 index 00000000..f28538e1 Binary files /dev/null and b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.da.png differ diff --git a/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.no.png b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.no.png new file mode 100644 index 00000000..f28538e1 Binary files /dev/null and b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.no.png differ diff --git a/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.sv.png b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.sv.png new file mode 100644 index 00000000..f28538e1 Binary files /dev/null and b/translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.sv.png differ diff --git a/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.da.png b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.da.png new file mode 100644 index 00000000..39431760 Binary files /dev/null and b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.da.png differ diff --git a/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.no.png b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.no.png new file mode 100644 index 00000000..39431760 Binary files /dev/null and b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.no.png differ diff --git a/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.sv.png b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.sv.png new file mode 100644 index 00000000..39431760 Binary files /dev/null and b/translated_images/container-edge-flow.c246050dd60ceefdb6ace026a4ce5c6aa4112bb5898ae23fbb2ab4be29ae3e1b.sv.png differ diff --git a/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.da.png b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.da.png new file mode 100644 index 00000000..46a26d45 Binary files /dev/null and b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.da.png differ diff --git a/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.no.png b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.no.png new file mode 100644 index 00000000..46a26d45 Binary files /dev/null and b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.no.png differ diff --git a/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.sv.png b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.sv.png new file mode 100644 index 00000000..46a26d45 Binary files /dev/null and b/translated_images/container-web-browser.4ee81dd4f0d8838ce622b2a0d600b6a4322b5d4fe43159facd87b7b34f84d66a.sv.png differ diff --git a/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.da.png b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.da.png new file mode 100644 index 00000000..6f70239b Binary files /dev/null and b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.da.png differ diff --git a/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.no.png b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.no.png new file mode 100644 index 00000000..6f70239b Binary files /dev/null and b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.no.png differ diff --git a/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.sv.png b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.sv.png new file mode 100644 index 00000000..6f70239b Binary files /dev/null and b/translated_images/counterfit-camera-options.eb3bd5150a8e7dffbf24bc5bcaba0cf2cdef95fbe6bbe393695d173817d6b8df.sv.png differ diff --git a/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.da.png b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.da.png new file mode 100644 index 00000000..c5cd51da Binary files /dev/null and b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.da.png differ diff --git a/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.no.png b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.no.png new file mode 100644 index 00000000..c5cd51da Binary files /dev/null and b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.no.png differ diff --git a/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.sv.png b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.sv.png new file mode 100644 index 00000000..c5cd51da Binary files /dev/null and b/translated_images/counterfit-camera.001ec52194c8ee5d3f617173da2c79e1df903d10882adc625cbfc493525125d4.sv.png differ diff --git a/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.da.png b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.da.png new file mode 100644 index 00000000..0328b3ea Binary files /dev/null and b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.da.png differ diff --git a/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.no.png b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.no.png new file mode 100644 index 00000000..0328b3ea Binary files /dev/null and b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.no.png differ diff --git a/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.sv.png b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.sv.png new file mode 100644 index 00000000..0328b3ea Binary files /dev/null and b/translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.sv.png differ diff --git a/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.da.png b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.da.png new file mode 100644 index 00000000..b3d0d223 Binary files /dev/null and b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.da.png differ diff --git a/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.no.png b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.no.png new file mode 100644 index 00000000..b3d0d223 Binary files /dev/null and b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.no.png differ diff --git a/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.sv.png b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.sv.png new file mode 100644 index 00000000..b3d0d223 Binary files /dev/null and b/translated_images/counterfit-create-camera.a5de97f59c0bd3cbe0416d7e89a3cfe86d19fbae05c641c53a91286412af0a34.sv.png differ diff --git a/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.da.png b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.da.png new file mode 100644 index 00000000..0729dbce Binary files /dev/null and b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.da.png differ diff --git a/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.no.png b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.no.png new file mode 100644 index 00000000..0729dbce Binary files /dev/null and b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.no.png differ diff --git a/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.sv.png b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.sv.png new file mode 100644 index 00000000..0729dbce Binary files /dev/null and b/translated_images/counterfit-create-distance-sensor.967c9fb98f27888d95920c9784d004c972490eb71f70397fe13bd70a79a879a3.sv.png differ diff --git a/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.da.png b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.da.png new file mode 100644 index 00000000..2e3adef5 Binary files /dev/null and b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.da.png differ diff --git a/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.no.png b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.no.png new file mode 100644 index 00000000..2e3adef5 Binary files /dev/null and b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.no.png differ diff --git a/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.sv.png b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.sv.png new file mode 100644 index 00000000..2e3adef5 Binary files /dev/null and b/translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.sv.png differ diff --git a/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.da.png b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.da.png new file mode 100644 index 00000000..4e9aa9b4 Binary files /dev/null and b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.da.png differ diff --git a/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.no.png b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.no.png new file mode 100644 index 00000000..4e9aa9b4 Binary files /dev/null and b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.no.png differ diff --git a/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.sv.png b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.sv.png new file mode 100644 index 00000000..4e9aa9b4 Binary files /dev/null and b/translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.sv.png differ diff --git a/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.da.png b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.da.png new file mode 100644 index 00000000..766527c0 Binary files /dev/null and b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.da.png differ diff --git a/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.no.png b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.no.png new file mode 100644 index 00000000..766527c0 Binary files /dev/null and b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.no.png differ diff --git a/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.sv.png b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.sv.png new file mode 100644 index 00000000..766527c0 Binary files /dev/null and b/translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.sv.png differ diff --git a/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.da.png b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.da.png new file mode 100644 index 00000000..f34ad7c6 Binary files /dev/null and b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.da.png differ diff --git a/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.no.png b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.no.png new file mode 100644 index 00000000..f34ad7c6 Binary files /dev/null and b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.no.png differ diff --git a/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.sv.png b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.sv.png new file mode 100644 index 00000000..f34ad7c6 Binary files /dev/null and b/translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.sv.png differ diff --git a/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.da.png b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.da.png new file mode 100644 index 00000000..403bb436 Binary files /dev/null and b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.da.png differ diff --git a/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.no.png b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.no.png new file mode 100644 index 00000000..403bb436 Binary files /dev/null and b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.no.png differ diff --git a/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.sv.png b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.sv.png new file mode 100644 index 00000000..403bb436 Binary files /dev/null and b/translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.sv.png differ diff --git a/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.da.png b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.da.png new file mode 100644 index 00000000..07398a97 Binary files /dev/null and b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.da.png differ diff --git a/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.no.png b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.no.png new file mode 100644 index 00000000..07398a97 Binary files /dev/null and b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.no.png differ diff --git a/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.sv.png b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.sv.png new file mode 100644 index 00000000..07398a97 Binary files /dev/null and b/translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.sv.png differ diff --git a/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.da.png b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.da.png new file mode 100644 index 00000000..83d0a29e Binary files /dev/null and b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.da.png differ diff --git a/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.no.png b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.no.png new file mode 100644 index 00000000..83d0a29e Binary files /dev/null and b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.no.png differ diff --git a/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.sv.png b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.sv.png new file mode 100644 index 00000000..83d0a29e Binary files /dev/null and b/translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.sv.png differ diff --git a/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.da.png b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.da.png new file mode 100644 index 00000000..cdd566f5 Binary files /dev/null and b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.da.png differ diff --git a/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.no.png b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.no.png new file mode 100644 index 00000000..cdd566f5 Binary files /dev/null and b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.no.png differ diff --git a/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.sv.png b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.sv.png new file mode 100644 index 00000000..cdd566f5 Binary files /dev/null and b/translated_images/counterfit-distance-sensor.079eefeeea0b68afc36431ce8fcbe2f09a7e4916ed1cd5cb30e696db53bc18fa.sv.png differ diff --git a/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.da.png b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.da.png new file mode 100644 index 00000000..50caa7a8 Binary files /dev/null and b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.da.png differ diff --git a/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.no.png b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.no.png new file mode 100644 index 00000000..50caa7a8 Binary files /dev/null and b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.no.png differ diff --git a/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.sv.png b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.sv.png new file mode 100644 index 00000000..50caa7a8 Binary files /dev/null and b/translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.sv.png differ diff --git a/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.da.png b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.da.png new file mode 100644 index 00000000..e68c1881 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.da.png differ diff --git a/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.no.png b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.no.png new file mode 100644 index 00000000..e68c1881 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.no.png differ diff --git a/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.sv.png b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.sv.png new file mode 100644 index 00000000..e68c1881 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.sv.png differ diff --git a/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.da.png b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.da.png new file mode 100644 index 00000000..357708db Binary files /dev/null and b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.da.png differ diff --git a/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.no.png b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.no.png new file mode 100644 index 00000000..357708db Binary files /dev/null and b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.no.png differ diff --git a/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.sv.png b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.sv.png new file mode 100644 index 00000000..357708db Binary files /dev/null and b/translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.sv.png differ diff --git a/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.da.png b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.da.png new file mode 100644 index 00000000..ff2cb168 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.da.png differ diff --git a/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.no.png b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.no.png new file mode 100644 index 00000000..ff2cb168 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.no.png differ diff --git a/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.sv.png b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.sv.png new file mode 100644 index 00000000..ff2cb168 Binary files /dev/null and b/translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.sv.png differ diff --git a/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.da.png b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.da.png new file mode 100644 index 00000000..4dd28830 Binary files /dev/null and b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.da.png differ diff --git a/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.no.png b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.no.png new file mode 100644 index 00000000..4dd28830 Binary files /dev/null and b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.no.png differ diff --git a/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.sv.png b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.sv.png new file mode 100644 index 00000000..4dd28830 Binary files /dev/null and b/translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.sv.png differ diff --git a/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.da.png b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.da.png new file mode 100644 index 00000000..36a0bed7 Binary files /dev/null and b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.da.png differ diff --git a/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.no.png b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.no.png new file mode 100644 index 00000000..36a0bed7 Binary files /dev/null and b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.no.png differ diff --git a/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.sv.png b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.sv.png new file mode 100644 index 00000000..36a0bed7 Binary files /dev/null and b/translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.sv.png differ diff --git a/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.da.png b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.da.png new file mode 100644 index 00000000..43b82415 Binary files /dev/null and b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.da.png differ diff --git a/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.no.png b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.no.png new file mode 100644 index 00000000..43b82415 Binary files /dev/null and b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.no.png differ diff --git a/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.sv.png b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.sv.png new file mode 100644 index 00000000..43b82415 Binary files /dev/null and b/translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.sv.png differ diff --git a/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.da.png b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.da.png new file mode 100644 index 00000000..9f42e92d Binary files /dev/null and b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.da.png differ diff --git a/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.no.png b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.no.png new file mode 100644 index 00000000..9f42e92d Binary files /dev/null and b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.no.png differ diff --git a/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.sv.png b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.sv.png new file mode 100644 index 00000000..9f42e92d Binary files /dev/null and b/translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.sv.png differ diff --git a/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.da.png b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.da.png new file mode 100644 index 00000000..91118b35 Binary files /dev/null and b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.da.png differ diff --git a/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.no.png b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.no.png new file mode 100644 index 00000000..91118b35 Binary files /dev/null and b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.no.png differ diff --git a/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.sv.png b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.sv.png new file mode 100644 index 00000000..91118b35 Binary files /dev/null and b/translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.sv.png differ diff --git a/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.da.png b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.da.png new file mode 100644 index 00000000..c1074a8e Binary files /dev/null and b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.da.png differ diff --git a/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.no.png b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.no.png new file mode 100644 index 00000000..c1074a8e Binary files /dev/null and b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.no.png differ diff --git a/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.sv.png b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.sv.png new file mode 100644 index 00000000..c1074a8e Binary files /dev/null and b/translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.sv.png differ diff --git a/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.da.png b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.da.png new file mode 100644 index 00000000..a4cca4dc Binary files /dev/null and b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.da.png differ diff --git a/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.no.png b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.no.png new file mode 100644 index 00000000..a4cca4dc Binary files /dev/null and b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.no.png differ diff --git a/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.sv.png b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.sv.png new file mode 100644 index 00000000..a4cca4dc Binary files /dev/null and b/translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.sv.png differ diff --git a/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.da.png b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.da.png new file mode 100644 index 00000000..1dd02459 Binary files /dev/null and b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.da.png differ diff --git a/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.no.png b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.no.png new file mode 100644 index 00000000..1dd02459 Binary files /dev/null and b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.no.png differ diff --git a/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.sv.png b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.sv.png new file mode 100644 index 00000000..1dd02459 Binary files /dev/null and b/translated_images/custom-vision-banana-prediction.30cdff4e1d72db5d9a0be0193790a47c2b387da034e12dc1314dd57ca2131b59.sv.png differ diff --git a/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.da.png b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.da.png new file mode 100644 index 00000000..64ba974b Binary files /dev/null and b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.da.png differ diff --git a/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.no.png b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.no.png new file mode 100644 index 00000000..64ba974b Binary files /dev/null and b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.no.png differ diff --git a/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.sv.png b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.sv.png new file mode 100644 index 00000000..64ba974b Binary files /dev/null and b/translated_images/custom-vision-create-object-detector-project.32d4fb9aa8e7e7375f8a799bfce517aca970f2cb65e42d4245c5e635c734ab29.sv.png differ diff --git a/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.da.png b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.da.png new file mode 100644 index 00000000..fd3d1f9b Binary files /dev/null and b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.da.png differ diff --git a/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.no.png b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.no.png new file mode 100644 index 00000000..fd3d1f9b Binary files /dev/null and b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.no.png differ diff --git a/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.sv.png b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.sv.png new file mode 100644 index 00000000..fd3d1f9b Binary files /dev/null and b/translated_images/custom-vision-create-project.cf46325b92d8b131089f6647cf5e07b664cb77850e106d66e3c057b6b69756c6.sv.png differ diff --git a/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.da.png b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.da.png new file mode 100644 index 00000000..f523159b Binary files /dev/null and b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.da.png differ diff --git a/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.no.png b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.no.png new file mode 100644 index 00000000..f523159b Binary files /dev/null and b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.no.png differ diff --git a/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.sv.png b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.sv.png new file mode 100644 index 00000000..f523159b Binary files /dev/null and b/translated_images/custom-vision-logo.d3d4e7c8a87ec9daf825e72e210576c3cbf60312577be7a139e22dd97ab7f1e6.sv.png differ diff --git a/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.da.png b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.da.png new file mode 100644 index 00000000..70a9bacf Binary files /dev/null and b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.da.png differ diff --git a/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.no.png b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.no.png new file mode 100644 index 00000000..70a9bacf Binary files /dev/null and b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.no.png differ diff --git a/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.sv.png b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.sv.png new file mode 100644 index 00000000..70a9bacf Binary files /dev/null and b/translated_images/custom-vision-object-detector-publish-button.34ee379fc650ccb9856c3868d0003f413b9529f102fc73c37168c98d721cc293.sv.png differ diff --git a/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.da.png b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.da.png new file mode 100644 index 00000000..9e30ab1c Binary files /dev/null and b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.da.png differ diff --git a/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.no.png b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.no.png new file mode 100644 index 00000000..9e30ab1c Binary files /dev/null and b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.no.png differ diff --git a/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.sv.png b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.sv.png new file mode 100644 index 00000000..9e30ab1c Binary files /dev/null and b/translated_images/custom-vision-prediction-key-endpoint.30c569ffd0338864f319911f052d5e9b8c5066cb0800a26dd6f7ff5713130ad8.sv.png differ diff --git a/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.da.png b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.da.png new file mode 100644 index 00000000..e9f61adc Binary files /dev/null and b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.da.png differ diff --git a/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.no.png b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.no.png new file mode 100644 index 00000000..e9f61adc Binary files /dev/null and b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.no.png differ diff --git a/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.sv.png b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.sv.png new file mode 100644 index 00000000..e9f61adc Binary files /dev/null and b/translated_images/custom-vision-publish-button.b7174e1977b0c33b8b72d4e5b1326c779e0af196f3849d09985ee2d7d5493a39.sv.png differ diff --git a/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.da.png b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.da.png new file mode 100644 index 00000000..a54521f7 Binary files /dev/null and b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.da.png differ diff --git a/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.no.png b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.no.png new file mode 100644 index 00000000..a54521f7 Binary files /dev/null and b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.no.png differ diff --git a/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.sv.png b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.sv.png new file mode 100644 index 00000000..a54521f7 Binary files /dev/null and b/translated_images/custom-vision-stock-prediction.942266ab1bcca3410ecdf23643b9f5f570cfab2345235074e24c51f285777613.sv.png differ diff --git a/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.da.png b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.da.png new file mode 100644 index 00000000..6981df8a Binary files /dev/null and b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.da.png differ diff --git a/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.no.png b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.no.png new file mode 100644 index 00000000..6981df8a Binary files /dev/null and b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.no.png differ diff --git a/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.sv.png b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.sv.png new file mode 100644 index 00000000..6981df8a Binary files /dev/null and b/translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.sv.png differ diff --git a/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.da.png b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.da.png new file mode 100644 index 00000000..2722c065 Binary files /dev/null and b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.da.png differ diff --git a/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.no.png b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.no.png new file mode 100644 index 00000000..2722c065 Binary files /dev/null and b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.no.png differ diff --git a/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.sv.png b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.sv.png new file mode 100644 index 00000000..2722c065 Binary files /dev/null and b/translated_images/dmac-adc-buffers.4509aee49145c90bc2e1be472b8ed2ddfcb2b6a81ad3e559114aca55f5fff759.sv.png differ diff --git a/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.da.jpg b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.da.jpg new file mode 100644 index 00000000..cce2a759 Binary files /dev/null and b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.da.jpg differ diff --git a/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.no.jpg b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.no.jpg new file mode 100644 index 00000000..cce2a759 Binary files /dev/null and b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.no.jpg differ diff --git a/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.sv.jpg b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.sv.jpg new file mode 100644 index 00000000..cce2a759 Binary files /dev/null and b/translated_images/dynamic-mic.8babac890a2d80dfb0874b5bf37d4b851fe2aeb9da6fd72945746176978bf3bb.sv.jpg differ diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.da.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.da.png new file mode 100644 index 00000000..26e0ae43 Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.da.png differ diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.no.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.no.png new file mode 100644 index 00000000..26e0ae43 Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.no.png differ diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.sv.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.sv.png new file mode 100644 index 00000000..26e0ae43 Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.sv.png differ diff --git a/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.da.png b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.da.png new file mode 100644 index 00000000..a5d549fd Binary files /dev/null and b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.da.png differ diff --git a/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.no.png b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.no.png new file mode 100644 index 00000000..a5d549fd Binary files /dev/null and b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.no.png differ diff --git a/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.sv.png b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.sv.png new file mode 100644 index 00000000..a5d549fd Binary files /dev/null and b/translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.sv.png differ diff --git a/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.da.png b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.da.png new file mode 100644 index 00000000..a251745c Binary files /dev/null and b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.da.png differ diff --git a/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.no.png b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.no.png new file mode 100644 index 00000000..a251745c Binary files /dev/null and b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.no.png differ diff --git a/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.sv.png b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.sv.png new file mode 100644 index 00000000..a251745c Binary files /dev/null and b/translated_images/fruit-quality-detector-message-flow.adf2a65da8fd8741ac7af11361574de89adc126785d67606bb4d2ec00467e380.sv.png differ diff --git a/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.da.png b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.da.png new file mode 100644 index 00000000..bb97d28e Binary files /dev/null and b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.da.png differ diff --git a/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.no.png b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.no.png new file mode 100644 index 00000000..bb97d28e Binary files /dev/null and b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.no.png differ diff --git a/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.sv.png b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.sv.png new file mode 100644 index 00000000..bb97d28e Binary files /dev/null and b/translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.sv.png differ diff --git a/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.da.png b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.da.png new file mode 100644 index 00000000..e34dea22 Binary files /dev/null and b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.da.png differ diff --git a/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.no.png b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.no.png new file mode 100644 index 00000000..e34dea22 Binary files /dev/null and b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.no.png differ diff --git a/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.sv.png b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.sv.png new file mode 100644 index 00000000..e34dea22 Binary files /dev/null and b/translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.sv.png differ diff --git a/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.da.png b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.da.png new file mode 100644 index 00000000..fa863501 Binary files /dev/null and b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.da.png differ diff --git a/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.no.png b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.no.png new file mode 100644 index 00000000..fa863501 Binary files /dev/null and b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.no.png differ diff --git a/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.sv.png b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.sv.png new file mode 100644 index 00000000..fa863501 Binary files /dev/null and b/translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.sv.png differ diff --git a/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.da.png b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.da.png new file mode 100644 index 00000000..0d0e0c48 Binary files /dev/null and b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.da.png differ diff --git a/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.no.png b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.no.png new file mode 100644 index 00000000..0d0e0c48 Binary files /dev/null and b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.no.png differ diff --git a/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.sv.png b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.sv.png new file mode 100644 index 00000000..0d0e0c48 Binary files /dev/null and b/translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.sv.png differ diff --git a/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.da.png b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.da.png new file mode 100644 index 00000000..6f79a498 Binary files /dev/null and b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.da.png differ diff --git a/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.no.png b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.no.png new file mode 100644 index 00000000..6f79a498 Binary files /dev/null and b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.no.png differ diff --git a/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.sv.png b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.sv.png new file mode 100644 index 00000000..6f79a498 Binary files /dev/null and b/translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.sv.png differ diff --git a/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.da.png b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.da.png new file mode 100644 index 00000000..8527d4cd Binary files /dev/null and b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.da.png differ diff --git a/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.no.png b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.no.png new file mode 100644 index 00000000..8527d4cd Binary files /dev/null and b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.no.png differ diff --git a/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.sv.png b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.sv.png new file mode 100644 index 00000000..8527d4cd Binary files /dev/null and b/translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.sv.png differ diff --git a/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.da.png b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.da.png new file mode 100644 index 00000000..8597bf4d Binary files /dev/null and b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.da.png differ diff --git a/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.no.png b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.no.png new file mode 100644 index 00000000..8597bf4d Binary files /dev/null and b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.no.png differ diff --git a/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.sv.png b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.sv.png new file mode 100644 index 00000000..8597bf4d Binary files /dev/null and b/translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.sv.png differ diff --git a/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.da.png b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.da.png new file mode 100644 index 00000000..3bf24358 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.da.png differ diff --git a/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.no.png b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.no.png new file mode 100644 index 00000000..3bf24358 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.no.png differ diff --git a/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.sv.png b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.sv.png new file mode 100644 index 00000000..3bf24358 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.sv.png differ diff --git a/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.da.png b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.da.png new file mode 100644 index 00000000..562f66d2 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.da.png differ diff --git a/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.no.png b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.no.png new file mode 100644 index 00000000..562f66d2 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.no.png differ diff --git a/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.sv.png b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.sv.png new file mode 100644 index 00000000..562f66d2 Binary files /dev/null and b/translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.sv.png differ diff --git a/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.da.png b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.da.png new file mode 100644 index 00000000..2f50d53a Binary files /dev/null and b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.da.png differ diff --git a/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.no.png b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.no.png new file mode 100644 index 00000000..2f50d53a Binary files /dev/null and b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.no.png differ diff --git a/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.sv.png b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.sv.png new file mode 100644 index 00000000..2f50d53a Binary files /dev/null and b/translated_images/grove-base-hat-ribbon-cable.501fed202fcf73b11b2b68f6d246189f7d15d3e4423c572ddee79d77b4632b47.sv.png differ diff --git a/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.da.png b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.da.png new file mode 100644 index 00000000..de7f343e Binary files /dev/null and b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.da.png differ diff --git a/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.no.png b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.no.png new file mode 100644 index 00000000..de7f343e Binary files /dev/null and b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.no.png differ diff --git a/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.sv.png b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.sv.png new file mode 100644 index 00000000..de7f343e Binary files /dev/null and b/translated_images/grove-button.a70cfbb809a8563681003250cf5b06d68cdcc68624f9e2f493d5a534ae2da1e5.sv.png differ diff --git a/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.da.png b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.da.png new file mode 100644 index 00000000..c8b1a544 Binary files /dev/null and b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.da.png differ diff --git a/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.no.png b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.no.png new file mode 100644 index 00000000..c8b1a544 Binary files /dev/null and b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.no.png differ diff --git a/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.sv.png b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.sv.png new file mode 100644 index 00000000..c8b1a544 Binary files /dev/null and b/translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.sv.png differ diff --git a/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.da.png b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.da.png new file mode 100644 index 00000000..17d1151d Binary files /dev/null and b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.da.png differ diff --git a/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.no.png b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.no.png new file mode 100644 index 00000000..17d1151d Binary files /dev/null and b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.no.png differ diff --git a/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.sv.png b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.sv.png new file mode 100644 index 00000000..17d1151d Binary files /dev/null and b/translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.sv.png differ diff --git a/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.da.png b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.da.png new file mode 100644 index 00000000..ffafc104 Binary files /dev/null and b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.da.png differ diff --git a/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.no.png b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.no.png new file mode 100644 index 00000000..ffafc104 Binary files /dev/null and b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.no.png differ diff --git a/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.sv.png b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.sv.png new file mode 100644 index 00000000..ffafc104 Binary files /dev/null and b/translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.sv.png differ diff --git a/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.da.png b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.da.png new file mode 100644 index 00000000..e3d86f8c Binary files /dev/null and b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.da.png differ diff --git a/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.no.png b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.no.png new file mode 100644 index 00000000..e3d86f8c Binary files /dev/null and b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.no.png differ diff --git a/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.sv.png b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.sv.png new file mode 100644 index 00000000..e3d86f8c Binary files /dev/null and b/translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.sv.png differ diff --git a/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.da.png b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.da.png new file mode 100644 index 00000000..3a4445ee Binary files /dev/null and b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.da.png differ diff --git a/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.no.png b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.no.png new file mode 100644 index 00000000..3a4445ee Binary files /dev/null and b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.no.png differ diff --git a/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.sv.png b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.sv.png new file mode 100644 index 00000000..3a4445ee Binary files /dev/null and b/translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.sv.png differ diff --git a/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.da.png b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.da.png new file mode 100644 index 00000000..b2bf4d3f Binary files /dev/null and b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.da.png differ diff --git a/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.no.png b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.no.png new file mode 100644 index 00000000..b2bf4d3f Binary files /dev/null and b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.no.png differ diff --git a/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.sv.png b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.sv.png new file mode 100644 index 00000000..b2bf4d3f Binary files /dev/null and b/translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.sv.png differ diff --git a/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.da.png b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.da.png new file mode 100644 index 00000000..467cedcd Binary files /dev/null and b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.da.png differ diff --git a/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.no.png b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.no.png new file mode 100644 index 00000000..467cedcd Binary files /dev/null and b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.no.png differ diff --git a/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.sv.png b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.sv.png new file mode 100644 index 00000000..467cedcd Binary files /dev/null and b/translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.sv.png differ diff --git a/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.da.png b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.da.png new file mode 100644 index 00000000..88efaa59 Binary files /dev/null and b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.da.png differ diff --git a/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.no.png b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.no.png new file mode 100644 index 00000000..88efaa59 Binary files /dev/null and b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.no.png differ diff --git a/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.sv.png b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.sv.png new file mode 100644 index 00000000..88efaa59 Binary files /dev/null and b/translated_images/grove-time-of-flight-sensor.d82ff2165bfded9f485de54d8d07195a6270a602696825fca19f629ddfe94e86.sv.png differ diff --git a/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.da.png b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.da.png new file mode 100644 index 00000000..6197ed95 Binary files /dev/null and b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.da.png differ diff --git a/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.no.png b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.no.png new file mode 100644 index 00000000..6197ed95 Binary files /dev/null and b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.no.png differ diff --git a/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.sv.png b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.sv.png new file mode 100644 index 00000000..6197ed95 Binary files /dev/null and b/translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.sv.png differ diff --git a/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.da.png b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.da.png new file mode 100644 index 00000000..ec7768da Binary files /dev/null and b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.da.png differ diff --git a/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.no.png b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.no.png new file mode 100644 index 00000000..ec7768da Binary files /dev/null and b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.no.png differ diff --git a/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.sv.png b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.sv.png new file mode 100644 index 00000000..ec7768da Binary files /dev/null and b/translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.sv.png differ diff --git a/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.da.png b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.da.png new file mode 100644 index 00000000..f68bf461 Binary files /dev/null and b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.da.png differ diff --git a/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.no.png b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.no.png new file mode 100644 index 00000000..f68bf461 Binary files /dev/null and b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.no.png differ diff --git a/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.sv.png b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.sv.png new file mode 100644 index 00000000..f68bf461 Binary files /dev/null and b/translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.sv.png differ diff --git a/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.da.png b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.da.png new file mode 100644 index 00000000..73e34cfe Binary files /dev/null and b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.da.png differ diff --git a/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.no.png b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.no.png new file mode 100644 index 00000000..73e34cfe Binary files /dev/null and b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.no.png differ diff --git a/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.sv.png b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.sv.png new file mode 100644 index 00000000..73e34cfe Binary files /dev/null and b/translated_images/image-classifier-cashews-tomato.bc2e16ab8f05cf9ac0f59f73e32efc4227f9a5b601b90b2c60f436694547a965.sv.png differ diff --git a/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.da.png b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.da.png new file mode 100644 index 00000000..21cc6bd0 Binary files /dev/null and b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.da.png differ diff --git a/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.no.png b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.no.png new file mode 100644 index 00000000..21cc6bd0 Binary files /dev/null and b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.no.png differ diff --git a/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.sv.png b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.sv.png new file mode 100644 index 00000000..21cc6bd0 Binary files /dev/null and b/translated_images/image-upload-bananas.0751639f3815e0ec42bdbc6254d1e4357a185834d1ae10c9948a0e7d6d336695.sv.png differ diff --git a/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.da.png b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.da.png new file mode 100644 index 00000000..9c7deb23 Binary files /dev/null and b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.da.png differ diff --git a/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.no.png b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.no.png new file mode 100644 index 00000000..9c7deb23 Binary files /dev/null and b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.no.png differ diff --git a/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.sv.png b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.sv.png new file mode 100644 index 00000000..9c7deb23 Binary files /dev/null and b/translated_images/image-upload-object-detector.77c7892c3093cb59b79018edecd678749a75d71a099bc8a2d2f2f76320f88a5b.sv.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.da.png b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.da.png new file mode 100644 index 00000000..ddc9958b Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.da.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.no.png b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.no.png new file mode 100644 index 00000000..ddc9958b Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.no.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.sv.png b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.sv.png new file mode 100644 index 00000000..ddc9958b Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.sv.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.da.png b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.da.png new file mode 100644 index 00000000..d181210a Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.da.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.no.png b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.no.png new file mode 100644 index 00000000..d181210a Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.no.png differ diff --git a/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.sv.png b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.sv.png new file mode 100644 index 00000000..d181210a Binary files /dev/null and b/translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.sv.png differ diff --git a/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.da.png b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.da.png new file mode 100644 index 00000000..a00ab427 Binary files /dev/null and b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.da.png differ diff --git a/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.no.png b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.no.png new file mode 100644 index 00000000..a00ab427 Binary files /dev/null and b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.no.png differ diff --git a/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.sv.png b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.sv.png new file mode 100644 index 00000000..a00ab427 Binary files /dev/null and b/translated_images/iot-for-beginners.95958e2ed1900917f0c2173dd725ae0a2c1af97b9a26e56c76d3c8c8925f32ee.sv.png differ diff --git a/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.da.png b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.da.png new file mode 100644 index 00000000..dedb38a3 Binary files /dev/null and b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.da.png differ diff --git a/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.no.png b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.no.png new file mode 100644 index 00000000..dedb38a3 Binary files /dev/null and b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.no.png differ diff --git a/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.sv.png b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.sv.png new file mode 100644 index 00000000..dedb38a3 Binary files /dev/null and b/translated_images/iot-hub-cloud-to-device-message.f4f21fea772cc20ba15004d853b805f6c01b612d257df6295ed7618550308aaf.sv.png differ diff --git a/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.da.png b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.da.png new file mode 100644 index 00000000..2b34487d Binary files /dev/null and b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.da.png differ diff --git a/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.no.png b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.no.png new file mode 100644 index 00000000..2b34487d Binary files /dev/null and b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.no.png differ diff --git a/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.sv.png b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.sv.png new file mode 100644 index 00000000..2b34487d Binary files /dev/null and b/translated_images/iot-hub-device-to-cloud-message.e46e584d87f35fd952657f0b566dcac59473fe960d87c96fa54a4b5438ddc31f.sv.png differ diff --git a/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.da.png b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.da.png new file mode 100644 index 00000000..1cae68ed Binary files /dev/null and b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.da.png differ diff --git a/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.no.png b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.no.png new file mode 100644 index 00000000..1cae68ed Binary files /dev/null and b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.no.png differ diff --git a/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.sv.png b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.sv.png new file mode 100644 index 00000000..1cae68ed Binary files /dev/null and b/translated_images/iot-hub-device-twins.7055a60fc5e2331c44298ae157d72edec0022910b1a4bf4bc93f39c620878b68.sv.png differ diff --git a/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.da.png b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.da.png new file mode 100644 index 00000000..df961cae Binary files /dev/null and b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.da.png differ diff --git a/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.no.png b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.no.png new file mode 100644 index 00000000..df961cae Binary files /dev/null and b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.no.png differ diff --git a/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.sv.png b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.sv.png new file mode 100644 index 00000000..df961cae Binary files /dev/null and b/translated_images/iot-hub-direct-method-request.86a5026e91f4ca1864e2043fab4b8199e42c2c6efc1209973cb56f199646b171.sv.png differ diff --git a/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.da.png b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.da.png new file mode 100644 index 00000000..aaeaeff8 Binary files /dev/null and b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.da.png differ diff --git a/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.no.png b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.no.png new file mode 100644 index 00000000..aaeaeff8 Binary files /dev/null and b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.no.png differ diff --git a/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.sv.png b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.sv.png new file mode 100644 index 00000000..aaeaeff8 Binary files /dev/null and b/translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.sv.png differ diff --git a/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.da.png b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.da.png new file mode 100644 index 00000000..7613fe86 Binary files /dev/null and b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.da.png differ diff --git a/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.no.png b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.no.png new file mode 100644 index 00000000..7613fe86 Binary files /dev/null and b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.no.png differ diff --git a/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.sv.png b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.sv.png new file mode 100644 index 00000000..7613fe86 Binary files /dev/null and b/translated_images/iot-reference-architecture-azure.0b8d2161af924cb18ae48a8558a19541cca47f27264851b5b7e56d7b8bb372ac.sv.png differ diff --git a/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.da.png b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.da.png new file mode 100644 index 00000000..335bdf32 Binary files /dev/null and b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.da.png differ diff --git a/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.no.png b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.no.png new file mode 100644 index 00000000..335bdf32 Binary files /dev/null and b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.no.png differ diff --git a/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.sv.png b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.sv.png new file mode 100644 index 00000000..335bdf32 Binary files /dev/null and b/translated_images/iot-reference-architecture-fruit-quality.cc705f121c3b6fa71c800d9630935ac34bc08223a04601e35f41d5e9b5dd5207.sv.png differ diff --git a/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.da.png b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.da.png new file mode 100644 index 00000000..32c8ba10 Binary files /dev/null and b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.da.png differ diff --git a/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.no.png b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.no.png new file mode 100644 index 00000000..32c8ba10 Binary files /dev/null and b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.no.png differ diff --git a/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.sv.png b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.sv.png new file mode 100644 index 00000000..32c8ba10 Binary files /dev/null and b/translated_images/iot-reference-architecture.2278b98b55c6d4e89bde18eada3688d893861d43507641804dd2f9d3079cfaa0.sv.png differ diff --git a/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.da.png b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.da.png new file mode 100644 index 00000000..82802e17 Binary files /dev/null and b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.da.png differ diff --git a/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.no.png b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.no.png new file mode 100644 index 00000000..82802e17 Binary files /dev/null and b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.no.png differ diff --git a/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.sv.png b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.sv.png new file mode 100644 index 00000000..82802e17 Binary files /dev/null and b/translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.sv.png differ diff --git a/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.da.png b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.da.png new file mode 100644 index 00000000..8214fc2c Binary files /dev/null and b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.da.png differ diff --git a/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.no.png b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.no.png new file mode 100644 index 00000000..8214fc2c Binary files /dev/null and b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.no.png differ diff --git a/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.sv.png b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.sv.png new file mode 100644 index 00000000..8214fc2c Binary files /dev/null and b/translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.sv.png differ diff --git a/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.da.png b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.da.png new file mode 100644 index 00000000..434baaad Binary files /dev/null and b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.da.png differ diff --git a/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.no.png b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.no.png new file mode 100644 index 00000000..434baaad Binary files /dev/null and b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.no.png differ diff --git a/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.sv.png b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.sv.png new file mode 100644 index 00000000..434baaad Binary files /dev/null and b/translated_images/latitude-equator.feccc3214b7d9fb1e1b2e44f938081c85149f092152de1509783b344e5f2097a.sv.png differ diff --git a/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.da.png b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.da.png new file mode 100644 index 00000000..d32271b5 Binary files /dev/null and b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.da.png differ diff --git a/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.no.png b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.no.png new file mode 100644 index 00000000..d32271b5 Binary files /dev/null and b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.no.png differ diff --git a/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.sv.png b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.sv.png new file mode 100644 index 00000000..d32271b5 Binary files /dev/null and b/translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.sv.png differ diff --git a/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.da.png b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.da.png new file mode 100644 index 00000000..04cd7dc8 Binary files /dev/null and b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.da.png differ diff --git a/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.no.png b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.no.png new file mode 100644 index 00000000..04cd7dc8 Binary files /dev/null and b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.no.png differ diff --git a/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.sv.png b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.sv.png new file mode 100644 index 00000000..04cd7dc8 Binary files /dev/null and b/translated_images/led-digital-control.13b9be14077ea49f883c2ec52e1ce1c587804f2ed653f4061661e6a8783dd8c7.sv.png differ diff --git a/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.da.png b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.da.png new file mode 100644 index 00000000..a8a12bce Binary files /dev/null and b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.da.png differ diff --git a/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.no.png b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.no.png new file mode 100644 index 00000000..a8a12bce Binary files /dev/null and b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.no.png differ diff --git a/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.sv.png b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.sv.png new file mode 100644 index 00000000..a8a12bce Binary files /dev/null and b/translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.sv.png differ diff --git a/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.da.jpg b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.da.jpg new file mode 100644 index 00000000..23ea98b2 Binary files /dev/null and b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.da.jpg differ diff --git a/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.no.jpg b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.no.jpg new file mode 100644 index 00000000..23ea98b2 Binary files /dev/null and b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.no.jpg differ diff --git a/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.sv.jpg b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.sv.jpg new file mode 100644 index 00000000..23ea98b2 Binary files /dev/null and b/translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.sv.jpg differ diff --git a/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.da.jpg b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.da.jpg new file mode 100644 index 00000000..1e3581d3 Binary files /dev/null and b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.da.jpg differ diff --git a/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.no.jpg b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.no.jpg new file mode 100644 index 00000000..1e3581d3 Binary files /dev/null and b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.no.jpg differ diff --git a/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.sv.jpg b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.sv.jpg new file mode 100644 index 00000000..1e3581d3 Binary files /dev/null and b/translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.sv.jpg differ diff --git a/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.da.jpg b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.da.jpg new file mode 100644 index 00000000..554ea37b Binary files /dev/null and b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.da.jpg differ diff --git a/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.no.jpg b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.no.jpg new file mode 100644 index 00000000..554ea37b Binary files /dev/null and b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.no.jpg differ diff --git a/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.sv.jpg b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.sv.jpg new file mode 100644 index 00000000..554ea37b Binary files /dev/null and b/translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.sv.jpg differ diff --git a/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.da.jpg b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.da.jpg new file mode 100644 index 00000000..427ba4c3 Binary files /dev/null and b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.da.jpg differ diff --git a/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.no.jpg b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.no.jpg new file mode 100644 index 00000000..427ba4c3 Binary files /dev/null and b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.no.jpg differ diff --git a/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.sv.jpg b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.sv.jpg new file mode 100644 index 00000000..427ba4c3 Binary files /dev/null and b/translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.sv.jpg differ diff --git a/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.da.jpg b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.da.jpg new file mode 100644 index 00000000..b2357285 Binary files /dev/null and b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.da.jpg differ diff --git a/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.no.jpg b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.no.jpg new file mode 100644 index 00000000..b2357285 Binary files /dev/null and b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.no.jpg differ diff --git a/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.sv.jpg b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.sv.jpg new file mode 100644 index 00000000..b2357285 Binary files /dev/null and b/translated_images/lesson-13.a259db1485021be7d7c72e90842fbe0ab977529e8684c179b5fb1ea75e92b3ef.sv.jpg differ diff --git a/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.da.jpg b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.da.jpg new file mode 100644 index 00000000..1736ebb4 Binary files /dev/null and b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.da.jpg differ diff --git a/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.no.jpg b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.no.jpg new file mode 100644 index 00000000..1736ebb4 Binary files /dev/null and b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.no.jpg differ diff --git a/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.sv.jpg b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.sv.jpg new file mode 100644 index 00000000..1736ebb4 Binary files /dev/null and b/translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.sv.jpg differ diff --git a/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.da.jpg b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.da.jpg new file mode 100644 index 00000000..bf1d724f Binary files /dev/null and b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.da.jpg differ diff --git a/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.no.jpg b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.no.jpg new file mode 100644 index 00000000..bf1d724f Binary files /dev/null and b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.no.jpg differ diff --git a/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.sv.jpg b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.sv.jpg new file mode 100644 index 00000000..bf1d724f Binary files /dev/null and b/translated_images/lesson-15.843d21afdc6fb2bba70cd9db7b7d2f91598859fafda2078b0bdc44954194b6c0.sv.jpg differ diff --git a/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.da.jpg b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.da.jpg new file mode 100644 index 00000000..bb78259a Binary files /dev/null and b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.da.jpg differ diff --git a/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.no.jpg b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.no.jpg new file mode 100644 index 00000000..bb78259a Binary files /dev/null and b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.no.jpg differ diff --git a/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.sv.jpg b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.sv.jpg new file mode 100644 index 00000000..bb78259a Binary files /dev/null and b/translated_images/lesson-16.215daf18b00631fbdfd64c6fc2dc6044dff5d544288825d8076f9fb83d964c23.sv.jpg differ diff --git a/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.da.jpg b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.da.jpg new file mode 100644 index 00000000..b311b568 Binary files /dev/null and b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.da.jpg differ diff --git a/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.no.jpg b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.no.jpg new file mode 100644 index 00000000..b311b568 Binary files /dev/null and b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.no.jpg differ diff --git a/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.sv.jpg b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.sv.jpg new file mode 100644 index 00000000..b311b568 Binary files /dev/null and b/translated_images/lesson-17.bc333c3c35ba8e42cce666cfffa82b915f787f455bd94e006aea2b6f2722421a.sv.jpg differ diff --git a/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.da.jpg b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.da.jpg new file mode 100644 index 00000000..5bd350fd Binary files /dev/null and b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.da.jpg differ diff --git a/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.no.jpg b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.no.jpg new file mode 100644 index 00000000..5bd350fd Binary files /dev/null and b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.no.jpg differ diff --git a/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.sv.jpg b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.sv.jpg new file mode 100644 index 00000000..5bd350fd Binary files /dev/null and b/translated_images/lesson-18.92c32ed1d354caa5a54baa4032cf0b172d4655e8e326ad5d46c558a0def15365.sv.jpg differ diff --git a/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.da.jpg b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.da.jpg new file mode 100644 index 00000000..66fbe114 Binary files /dev/null and b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.da.jpg differ diff --git a/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.no.jpg b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.no.jpg new file mode 100644 index 00000000..66fbe114 Binary files /dev/null and b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.no.jpg differ diff --git a/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.sv.jpg b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.sv.jpg new file mode 100644 index 00000000..66fbe114 Binary files /dev/null and b/translated_images/lesson-19.cf6973cecadf080c4b526310620dc4d6f5994c80fb0139c6f378cc9ca2d435cd.sv.jpg differ diff --git a/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.da.jpg b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.da.jpg new file mode 100644 index 00000000..050e7206 Binary files /dev/null and b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.da.jpg differ diff --git a/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.no.jpg b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.no.jpg new file mode 100644 index 00000000..050e7206 Binary files /dev/null and b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.no.jpg differ diff --git a/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.sv.jpg b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.sv.jpg new file mode 100644 index 00000000..050e7206 Binary files /dev/null and b/translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.sv.jpg differ diff --git a/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.da.jpg b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.da.jpg new file mode 100644 index 00000000..91c64faa Binary files /dev/null and b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.da.jpg differ diff --git a/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.no.jpg b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.no.jpg new file mode 100644 index 00000000..91c64faa Binary files /dev/null and b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.no.jpg differ diff --git a/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.sv.jpg b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.sv.jpg new file mode 100644 index 00000000..91c64faa Binary files /dev/null and b/translated_images/lesson-20.0211df9551a8abb300fc8fcf7dc2789468dea2eabe9202273ac077b0ba37f15e.sv.jpg differ diff --git a/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.da.jpg b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.da.jpg new file mode 100644 index 00000000..36e1a4b3 Binary files /dev/null and b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.da.jpg differ diff --git a/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.no.jpg b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.no.jpg new file mode 100644 index 00000000..36e1a4b3 Binary files /dev/null and b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.no.jpg differ diff --git a/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.sv.jpg b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.sv.jpg new file mode 100644 index 00000000..36e1a4b3 Binary files /dev/null and b/translated_images/lesson-21.e34de51354d6606fb5ee08d8c89d0222eea0a2a7aaf744a8805ae847c4f69dc4.sv.jpg differ diff --git a/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.da.jpg b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.da.jpg new file mode 100644 index 00000000..1b87df4c Binary files /dev/null and b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.da.jpg differ diff --git a/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.no.jpg b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.no.jpg new file mode 100644 index 00000000..1b87df4c Binary files /dev/null and b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.no.jpg differ diff --git a/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.sv.jpg b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.sv.jpg new file mode 100644 index 00000000..1b87df4c Binary files /dev/null and b/translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.sv.jpg differ diff --git a/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.da.jpg b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.da.jpg new file mode 100644 index 00000000..8df37a22 Binary files /dev/null and b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.da.jpg differ diff --git a/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.no.jpg b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.no.jpg new file mode 100644 index 00000000..8df37a22 Binary files /dev/null and b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.no.jpg differ diff --git a/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.sv.jpg b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.sv.jpg new file mode 100644 index 00000000..8df37a22 Binary files /dev/null and b/translated_images/lesson-23.f38483e1d4df4828990d3f02d60e46c978b075d384ae7cb4f7bab738e107c850.sv.jpg differ diff --git a/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.da.jpg b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.da.jpg new file mode 100644 index 00000000..943af1b9 Binary files /dev/null and b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.da.jpg differ diff --git a/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.no.jpg b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.no.jpg new file mode 100644 index 00000000..943af1b9 Binary files /dev/null and b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.no.jpg differ diff --git a/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.sv.jpg b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.sv.jpg new file mode 100644 index 00000000..943af1b9 Binary files /dev/null and b/translated_images/lesson-24.4246968ed058510ab275052e87ef9aa89c7b2f938915d103c605c04dc6cd5bb7.sv.jpg differ diff --git a/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.da.jpg b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.da.jpg new file mode 100644 index 00000000..5a96f7fb Binary files /dev/null and b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.da.jpg differ diff --git a/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.no.jpg b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.no.jpg new file mode 100644 index 00000000..5a96f7fb Binary files /dev/null and b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.no.jpg differ diff --git a/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.sv.jpg b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.sv.jpg new file mode 100644 index 00000000..5a96f7fb Binary files /dev/null and b/translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.sv.jpg differ diff --git a/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.da.jpg b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.da.jpg new file mode 100644 index 00000000..8f0bee50 Binary files /dev/null and b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.da.jpg differ diff --git a/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.no.jpg b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.no.jpg new file mode 100644 index 00000000..8f0bee50 Binary files /dev/null and b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.no.jpg differ diff --git a/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.sv.jpg b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.sv.jpg new file mode 100644 index 00000000..8f0bee50 Binary files /dev/null and b/translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.sv.jpg differ diff --git a/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.da.jpg b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.da.jpg new file mode 100644 index 00000000..4ba24109 Binary files /dev/null and b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.da.jpg differ diff --git a/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.no.jpg b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.no.jpg new file mode 100644 index 00000000..4ba24109 Binary files /dev/null and b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.no.jpg differ diff --git a/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.sv.jpg b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.sv.jpg new file mode 100644 index 00000000..4ba24109 Binary files /dev/null and b/translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.sv.jpg differ diff --git a/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.da.jpg b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.da.jpg new file mode 100644 index 00000000..cdf0f557 Binary files /dev/null and b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.da.jpg differ diff --git a/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.no.jpg b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.no.jpg new file mode 100644 index 00000000..cdf0f557 Binary files /dev/null and b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.no.jpg differ diff --git a/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.sv.jpg b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.sv.jpg new file mode 100644 index 00000000..cdf0f557 Binary files /dev/null and b/translated_images/lesson-6.3e493b60eee85adc8c74dfeaaec3a3a6cfba61fedbcb84aa0146e7e80603a5dd.sv.jpg differ diff --git a/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.da.jpg b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.da.jpg new file mode 100644 index 00000000..f59ee98d Binary files /dev/null and b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.da.jpg differ diff --git a/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.no.jpg b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.no.jpg new file mode 100644 index 00000000..f59ee98d Binary files /dev/null and b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.no.jpg differ diff --git a/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.sv.jpg b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.sv.jpg new file mode 100644 index 00000000..f59ee98d Binary files /dev/null and b/translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.sv.jpg differ diff --git a/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.da.jpg b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.da.jpg new file mode 100644 index 00000000..5bdbfd14 Binary files /dev/null and b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.da.jpg differ diff --git a/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.no.jpg b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.no.jpg new file mode 100644 index 00000000..5bdbfd14 Binary files /dev/null and b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.no.jpg differ diff --git a/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.sv.jpg b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.sv.jpg new file mode 100644 index 00000000..5bdbfd14 Binary files /dev/null and b/translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.sv.jpg differ diff --git a/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.da.jpg b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.da.jpg new file mode 100644 index 00000000..b78ab3ac Binary files /dev/null and b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.da.jpg differ diff --git a/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.no.jpg b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.no.jpg new file mode 100644 index 00000000..b78ab3ac Binary files /dev/null and b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.no.jpg differ diff --git a/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.sv.jpg b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.sv.jpg new file mode 100644 index 00000000..b78ab3ac Binary files /dev/null and b/translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.sv.jpg differ diff --git a/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.da.png b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.da.png new file mode 100644 index 00000000..d071dffe Binary files /dev/null and b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.da.png differ diff --git a/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.no.png b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.no.png new file mode 100644 index 00000000..d071dffe Binary files /dev/null and b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.no.png differ diff --git a/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.sv.png b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.sv.png new file mode 100644 index 00000000..d071dffe Binary files /dev/null and b/translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.sv.png differ diff --git a/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.da.png b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.da.png new file mode 100644 index 00000000..b8947f6d Binary files /dev/null and b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.da.png differ diff --git a/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.no.png b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.no.png new file mode 100644 index 00000000..b8947f6d Binary files /dev/null and b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.no.png differ diff --git a/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.sv.png b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.sv.png new file mode 100644 index 00000000..b8947f6d Binary files /dev/null and b/translated_images/lines-of-longitude-and-latitude.032aca9d3e402c4e89da3f1c269b955f0dac443ae4ae3dd6e1dada5761c39a92.sv.png differ diff --git a/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.da.png b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.da.png new file mode 100644 index 00000000..5c5dfb96 Binary files /dev/null and b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.da.png differ diff --git a/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.no.png b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.no.png new file mode 100644 index 00000000..5c5dfb96 Binary files /dev/null and b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.no.png differ diff --git a/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.sv.png b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.sv.png new file mode 100644 index 00000000..5c5dfb96 Binary files /dev/null and b/translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.sv.png differ diff --git a/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.da.png b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.da.png new file mode 100644 index 00000000..663ad7e9 Binary files /dev/null and b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.da.png differ diff --git a/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.no.png b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.no.png new file mode 100644 index 00000000..663ad7e9 Binary files /dev/null and b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.no.png differ diff --git a/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.sv.png b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.sv.png new file mode 100644 index 00000000..663ad7e9 Binary files /dev/null and b/translated_images/longitude-prime-meridian.33b01b41ce615f9ddf85d91b0f93bdc076cfa44bb10b17296de42e2d1ba1090e.sv.png differ diff --git a/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.da.png b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.da.png new file mode 100644 index 00000000..b1e33d6b Binary files /dev/null and b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.da.png differ diff --git a/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.no.png b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.no.png new file mode 100644 index 00000000..b1e33d6b Binary files /dev/null and b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.no.png differ diff --git a/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.sv.png b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.sv.png new file mode 100644 index 00000000..b1e33d6b Binary files /dev/null and b/translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.sv.png differ diff --git a/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.da.png b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.da.png new file mode 100644 index 00000000..2a03ab78 Binary files /dev/null and b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.da.png differ diff --git a/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.no.png b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.no.png new file mode 100644 index 00000000..2a03ab78 Binary files /dev/null and b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.no.png differ diff --git a/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.sv.png b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.sv.png new file mode 100644 index 00000000..2a03ab78 Binary files /dev/null and b/translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.sv.png differ diff --git a/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.da.png b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.da.png new file mode 100644 index 00000000..02ef1351 Binary files /dev/null and b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.da.png differ diff --git a/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.no.png b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.no.png new file mode 100644 index 00000000..02ef1351 Binary files /dev/null and b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.no.png differ diff --git a/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.sv.png b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.sv.png new file mode 100644 index 00000000..02ef1351 Binary files /dev/null and b/translated_images/map-image.8fb2c53eb23ef39c1c0a4410a5282e879b3b452b707eb066ff04c5488d3d72b7.sv.png differ diff --git a/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.da.png b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.da.png new file mode 100644 index 00000000..33faabd1 Binary files /dev/null and b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.da.png differ diff --git a/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.no.png b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.no.png new file mode 100644 index 00000000..33faabd1 Binary files /dev/null and b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.no.png differ diff --git a/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.sv.png b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.sv.png new file mode 100644 index 00000000..33faabd1 Binary files /dev/null and b/translated_images/map-path.896832e72dc696ffe20650e4051027d4855442d955f93fdbb80bb417ca8a406f.sv.png differ diff --git a/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.da.png b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.da.png new file mode 100644 index 00000000..aa94da2c Binary files /dev/null and b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.da.png differ diff --git a/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.no.png b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.no.png new file mode 100644 index 00000000..aa94da2c Binary files /dev/null and b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.no.png differ diff --git a/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.sv.png b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.sv.png new file mode 100644 index 00000000..aa94da2c Binary files /dev/null and b/translated_images/mems-microphone.80574019e1f5e4d9ee72fed720ecd25a39fc2969c91355d17ebb24ba4159e4c4.sv.png differ diff --git a/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.da.png b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.da.png new file mode 100644 index 00000000..ac000818 Binary files /dev/null and b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.da.png differ diff --git a/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.no.png b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.no.png new file mode 100644 index 00000000..ac000818 Binary files /dev/null and b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.no.png differ diff --git a/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.sv.png b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.sv.png new file mode 100644 index 00000000..ac000818 Binary files /dev/null and b/translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.sv.png differ diff --git a/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.da.png b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.da.png new file mode 100644 index 00000000..2fb519f5 Binary files /dev/null and b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.da.png differ diff --git a/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.no.png b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.no.png new file mode 100644 index 00000000..2fb519f5 Binary files /dev/null and b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.no.png differ diff --git a/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.sv.png b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.sv.png new file mode 100644 index 00000000..2fb519f5 Binary files /dev/null and b/translated_images/microsoft-gps-location.9eb77a13b22b7e70a0a80bd2b54c24eda141b4ee15a0373c93f8c73f4fcd81f5.sv.png differ diff --git a/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.da.png b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.da.png new file mode 100644 index 00000000..48459b92 Binary files /dev/null and b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.da.png differ diff --git a/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.no.png b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.no.png new file mode 100644 index 00000000..48459b92 Binary files /dev/null and b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.no.png differ diff --git a/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.sv.png b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.sv.png new file mode 100644 index 00000000..48459b92 Binary files /dev/null and b/translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.sv.png differ diff --git a/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.da.png b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.da.png new file mode 100644 index 00000000..d502a579 Binary files /dev/null and b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.da.png differ diff --git a/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.no.png b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.no.png new file mode 100644 index 00000000..d502a579 Binary files /dev/null and b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.no.png differ diff --git a/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.sv.png b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.sv.png new file mode 100644 index 00000000..d502a579 Binary files /dev/null and b/translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.sv.png differ diff --git a/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.da.png b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.da.png new file mode 100644 index 00000000..fca45002 Binary files /dev/null and b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.da.png differ diff --git a/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.no.png b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.no.png new file mode 100644 index 00000000..fca45002 Binary files /dev/null and b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.no.png differ diff --git a/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.sv.png b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.sv.png new file mode 100644 index 00000000..fca45002 Binary files /dev/null and b/translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.sv.png differ diff --git a/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.da.png b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.da.png new file mode 100644 index 00000000..94aa28db Binary files /dev/null and b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.da.png differ diff --git a/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.no.png b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.no.png new file mode 100644 index 00000000..94aa28db Binary files /dev/null and b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.no.png differ diff --git a/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.sv.png b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.sv.png new file mode 100644 index 00000000..94aa28db Binary files /dev/null and b/translated_images/object-detector-cashews-tomato.1af7c26686b4db0e709754aeb196f4e73271f54e2085db3bcccb70d4a0d84d97.sv.png differ diff --git a/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.da.png b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.da.png new file mode 100644 index 00000000..894df473 Binary files /dev/null and b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.da.png differ diff --git a/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.no.png b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.no.png new file mode 100644 index 00000000..894df473 Binary files /dev/null and b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.no.png differ diff --git a/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.sv.png b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.sv.png new file mode 100644 index 00000000..894df473 Binary files /dev/null and b/translated_images/object-detector-detected-tomato-paste.52656fe87af4c37b4ee540526d63e73ed075da2e54a9a060aa528e0c562fb1b6.sv.png differ diff --git a/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.da.png b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.da.png new file mode 100644 index 00000000..b75dfdd2 Binary files /dev/null and b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.da.png differ diff --git a/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.no.png b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.no.png new file mode 100644 index 00000000..b75dfdd2 Binary files /dev/null and b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.no.png differ diff --git a/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.sv.png b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.sv.png new file mode 100644 index 00000000..b75dfdd2 Binary files /dev/null and b/translated_images/object-detector-tag-tomato-paste.f47c362fb0f0eb582f3bc68cf3855fb43a805106395358d41896a269c210b7b4.sv.png differ diff --git a/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.da.png b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.da.png new file mode 100644 index 00000000..1e7934c3 Binary files /dev/null and b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.da.png differ diff --git a/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.no.png b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.no.png new file mode 100644 index 00000000..1e7934c3 Binary files /dev/null and b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.no.png differ diff --git a/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.sv.png b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.sv.png new file mode 100644 index 00000000..1e7934c3 Binary files /dev/null and b/translated_images/optical-tomato-sorting.61aa134bdda4e5b1bfb16a212c1e35a6ef0c426cbb8b1c975f79d7bfbf48d068.sv.png differ diff --git a/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.da.png b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.da.png new file mode 100644 index 00000000..5bb319ec Binary files /dev/null and b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.da.png differ diff --git a/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.no.png b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.no.png new file mode 100644 index 00000000..5bb319ec Binary files /dev/null and b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.no.png differ diff --git a/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.sv.png b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.sv.png new file mode 100644 index 00000000..5bb319ec Binary files /dev/null and b/translated_images/overlap-object-detection.d431e03cae75072a2760430eca7f2c5fdd43045bfd72dadcbf12711f7cd6c2ae.sv.png differ diff --git a/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.da.png b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.da.png new file mode 100644 index 00000000..d66e224f Binary files /dev/null and b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.da.png differ diff --git a/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.no.png b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.no.png new file mode 100644 index 00000000..d66e224f Binary files /dev/null and b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.no.png differ diff --git a/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.sv.png b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.sv.png new file mode 100644 index 00000000..d66e224f Binary files /dev/null and b/translated_images/pi-button.c7a1a4f55943341ce1baf1057658e9a205804d4131d258e820c93f951df0abf3.sv.png differ diff --git a/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.da.png b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.da.png new file mode 100644 index 00000000..ed18e7b0 Binary files /dev/null and b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.da.png differ diff --git a/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.no.png b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.no.png new file mode 100644 index 00000000..ed18e7b0 Binary files /dev/null and b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.no.png differ diff --git a/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.sv.png b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.sv.png new file mode 100644 index 00000000..ed18e7b0 Binary files /dev/null and b/translated_images/pi-camera-module.4278753c31bd6e757aa2b858be97d72049f71616278cefe4fb5abb485b40a078.sv.png differ diff --git a/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.da.png b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.da.png new file mode 100644 index 00000000..9acb21a7 Binary files /dev/null and b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.da.png differ diff --git a/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.no.png b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.no.png new file mode 100644 index 00000000..9acb21a7 Binary files /dev/null and b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.no.png differ diff --git a/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.sv.png b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.sv.png new file mode 100644 index 00000000..9acb21a7 Binary files /dev/null and b/translated_images/pi-camera-ribbon-cable.0bf82acd251611c21ac616f082849413e2b322a261d0e4f8fec344248083b07e.sv.png differ diff --git a/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.da.png b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.da.png new file mode 100644 index 00000000..1ced5fc1 Binary files /dev/null and b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.da.png differ diff --git a/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.no.png b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.no.png new file mode 100644 index 00000000..1ced5fc1 Binary files /dev/null and b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.no.png differ diff --git a/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.sv.png b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.sv.png new file mode 100644 index 00000000..1ced5fc1 Binary files /dev/null and b/translated_images/pi-camera-socket-ribbon-cable.a18309920b11800911082ed7aa6fb28e6d9be3a022e4079ff990016cae3fca10.sv.png differ diff --git a/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.da.png b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.da.png new file mode 100644 index 00000000..7293ced1 Binary files /dev/null and b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.da.png differ diff --git a/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.no.png b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.no.png new file mode 100644 index 00000000..7293ced1 Binary files /dev/null and b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.no.png differ diff --git a/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.sv.png b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.sv.png new file mode 100644 index 00000000..7293ced1 Binary files /dev/null and b/translated_images/pi-camera-upside-down.5376961ba31459883362124152ad6b823d5ac5fc14e85f317e22903bd681c2b6.sv.png differ diff --git a/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.da.png b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.da.png new file mode 100644 index 00000000..be837c63 Binary files /dev/null and b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.da.png differ diff --git a/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.no.png b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.no.png new file mode 100644 index 00000000..be837c63 Binary files /dev/null and b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.no.png differ diff --git a/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.sv.png b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.sv.png new file mode 100644 index 00000000..be837c63 Binary files /dev/null and b/translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.sv.png differ diff --git a/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.da.png b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.da.png new file mode 100644 index 00000000..73861107 Binary files /dev/null and b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.da.png differ diff --git a/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.no.png b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.no.png new file mode 100644 index 00000000..73861107 Binary files /dev/null and b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.no.png differ diff --git a/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.sv.png b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.sv.png new file mode 100644 index 00000000..73861107 Binary files /dev/null and b/translated_images/pi-hardware-kit.26dbadaedb7dd44c73b0131d5d68ea29472ed0a9744f90d5866c6d82f2d16380.sv.png differ diff --git a/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.da.png b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.da.png new file mode 100644 index 00000000..1b26d7ff Binary files /dev/null and b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.da.png differ diff --git a/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.no.png b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.no.png new file mode 100644 index 00000000..1b26d7ff Binary files /dev/null and b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.no.png differ diff --git a/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.sv.png b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.sv.png new file mode 100644 index 00000000..1b26d7ff Binary files /dev/null and b/translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.sv.png differ diff --git a/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.da.png b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.da.png new file mode 100644 index 00000000..f1905ecc Binary files /dev/null and b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.da.png differ diff --git a/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.no.png b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.no.png new file mode 100644 index 00000000..f1905ecc Binary files /dev/null and b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.no.png differ diff --git a/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.sv.png b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.sv.png new file mode 100644 index 00000000..f1905ecc Binary files /dev/null and b/translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.sv.png differ diff --git a/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.da.png b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.da.png new file mode 100644 index 00000000..edc44fa9 Binary files /dev/null and b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.da.png differ diff --git a/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.no.png b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.no.png new file mode 100644 index 00000000..edc44fa9 Binary files /dev/null and b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.no.png differ diff --git a/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.sv.png b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.sv.png new file mode 100644 index 00000000..edc44fa9 Binary files /dev/null and b/translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.sv.png differ diff --git a/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.da.png b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.da.png new file mode 100644 index 00000000..87854d3a Binary files /dev/null and b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.da.png differ diff --git a/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.no.png b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.no.png new file mode 100644 index 00000000..87854d3a Binary files /dev/null and b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.no.png differ diff --git a/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.sv.png b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.sv.png new file mode 100644 index 00000000..87854d3a Binary files /dev/null and b/translated_images/pi-respeaker-hat.f00fabe7dd039a93e2e0aa0fc946c9af0c6a9eb17c32fa1ca097fb4e384f69f0.sv.png differ diff --git a/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.da.png b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.da.png new file mode 100644 index 00000000..d1158e0d Binary files /dev/null and b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.da.png differ diff --git a/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.no.png b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.no.png new file mode 100644 index 00000000..d1158e0d Binary files /dev/null and b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.no.png differ diff --git a/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.sv.png b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.sv.png new file mode 100644 index 00000000..d1158e0d Binary files /dev/null and b/translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.sv.png differ diff --git a/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.da.png b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.da.png new file mode 100644 index 00000000..122abea4 Binary files /dev/null and b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.da.png differ diff --git a/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.no.png b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.no.png new file mode 100644 index 00000000..122abea4 Binary files /dev/null and b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.no.png differ diff --git a/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.sv.png b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.sv.png new file mode 100644 index 00000000..122abea4 Binary files /dev/null and b/translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.sv.png differ diff --git a/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.da.png b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.da.png new file mode 100644 index 00000000..dc009aa5 Binary files /dev/null and b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.da.png differ diff --git a/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.no.png b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.no.png new file mode 100644 index 00000000..dc009aa5 Binary files /dev/null and b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.no.png differ diff --git a/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.sv.png b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.sv.png new file mode 100644 index 00000000..dc009aa5 Binary files /dev/null and b/translated_images/pi-time-of-flight-sensor.58c8dc04eb3bfb57a7c3019f031433ef4d798d4d7603d565afbf6f3802840dba.sv.png differ diff --git a/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.da.png b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.da.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.da.png differ diff --git a/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.no.png b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.no.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.no.png differ diff --git a/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.sv.png b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.sv.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph copy.65baa28afd9b7f5fbc04bf7c9684b086c466a467631568c23549d54949fc71d2.sv.png differ diff --git a/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.da.png b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.da.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.da.png differ diff --git a/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.no.png b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.no.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.no.png differ diff --git a/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.sv.png b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.sv.png new file mode 100644 index 00000000..ccb0d4e1 Binary files /dev/null and b/translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.sv.png differ diff --git a/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.da.png b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.da.png new file mode 100644 index 00000000..12274b8b Binary files /dev/null and b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.da.png differ diff --git a/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.no.png b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.no.png new file mode 100644 index 00000000..12274b8b Binary files /dev/null and b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.no.png differ diff --git a/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.sv.png b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.sv.png new file mode 100644 index 00000000..12274b8b Binary files /dev/null and b/translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.sv.png differ diff --git a/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.da.png b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.da.png new file mode 100644 index 00000000..da226797 Binary files /dev/null and b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.da.png differ diff --git a/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.no.png b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.no.png new file mode 100644 index 00000000..da226797 Binary files /dev/null and b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.no.png differ diff --git a/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.sv.png b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.sv.png new file mode 100644 index 00000000..da226797 Binary files /dev/null and b/translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.sv.png differ diff --git a/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.da.png b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.da.png new file mode 100644 index 00000000..67bd8a82 Binary files /dev/null and b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.da.png differ diff --git a/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.no.png b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.no.png new file mode 100644 index 00000000..67bd8a82 Binary files /dev/null and b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.no.png differ diff --git a/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.sv.png b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.sv.png new file mode 100644 index 00000000..67bd8a82 Binary files /dev/null and b/translated_images/proximity-sensor.f5cd752c77fb62fea000156233b32fd24fad3707ec69b8bdd8d312b7af85156d.sv.png differ diff --git a/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.da.png b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.da.png new file mode 100644 index 00000000..18938f59 Binary files /dev/null and b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.da.png differ diff --git a/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.no.png b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.no.png new file mode 100644 index 00000000..18938f59 Binary files /dev/null and b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.no.png differ diff --git a/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.sv.png b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.sv.png new file mode 100644 index 00000000..18938f59 Binary files /dev/null and b/translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.sv.png differ diff --git a/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.da.png b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.da.png new file mode 100644 index 00000000..db480604 Binary files /dev/null and b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.da.png differ diff --git a/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.no.png b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.no.png new file mode 100644 index 00000000..db480604 Binary files /dev/null and b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.no.png differ diff --git a/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.sv.png b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.sv.png new file mode 100644 index 00000000..db480604 Binary files /dev/null and b/translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.sv.png differ diff --git a/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.da.png b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.da.png new file mode 100644 index 00000000..535e5798 Binary files /dev/null and b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.da.png differ diff --git a/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.no.png b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.no.png new file mode 100644 index 00000000..535e5798 Binary files /dev/null and b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.no.png differ diff --git a/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.sv.png b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.sv.png new file mode 100644 index 00000000..535e5798 Binary files /dev/null and b/translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.sv.png differ diff --git a/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.da.png b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.da.png new file mode 100644 index 00000000..b3d83ab7 Binary files /dev/null and b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.da.png differ diff --git a/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.no.png b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.no.png new file mode 100644 index 00000000..b3d83ab7 Binary files /dev/null and b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.no.png differ diff --git a/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.sv.png b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.sv.png new file mode 100644 index 00000000..b3d83ab7 Binary files /dev/null and b/translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.sv.png differ diff --git a/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.da.png b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.da.png new file mode 100644 index 00000000..4bb97d60 Binary files /dev/null and b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.da.png differ diff --git a/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.no.png b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.no.png new file mode 100644 index 00000000..4bb97d60 Binary files /dev/null and b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.no.png differ diff --git a/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.sv.png b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.sv.png new file mode 100644 index 00000000..4bb97d60 Binary files /dev/null and b/translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.sv.png differ diff --git a/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.da.jpg b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.da.jpg new file mode 100644 index 00000000..4cf0d73d Binary files /dev/null and b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.da.jpg differ diff --git a/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.no.jpg b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.no.jpg new file mode 100644 index 00000000..4cf0d73d Binary files /dev/null and b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.no.jpg differ diff --git a/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.sv.jpg b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.sv.jpg new file mode 100644 index 00000000..4cf0d73d Binary files /dev/null and b/translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.sv.jpg differ diff --git a/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.da.png b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.da.png new file mode 100644 index 00000000..0aace880 Binary files /dev/null and b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.da.png differ diff --git a/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.no.png b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.no.png new file mode 100644 index 00000000..0aace880 Binary files /dev/null and b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.no.png differ diff --git a/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.sv.png b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.sv.png new file mode 100644 index 00000000..0aace880 Binary files /dev/null and b/translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.sv.png differ diff --git a/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.da.png b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.da.png new file mode 100644 index 00000000..b19b1f6b Binary files /dev/null and b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.da.png differ diff --git a/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.no.png b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.no.png new file mode 100644 index 00000000..b19b1f6b Binary files /dev/null and b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.no.png differ diff --git a/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.sv.png b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.sv.png new file mode 100644 index 00000000..b19b1f6b Binary files /dev/null and b/translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.sv.png differ diff --git a/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.da.jpg b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.da.jpg new file mode 100644 index 00000000..827670ed Binary files /dev/null and b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.da.jpg differ diff --git a/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.no.jpg b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.no.jpg new file mode 100644 index 00000000..827670ed Binary files /dev/null and b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.no.jpg differ diff --git a/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.sv.jpg b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.sv.jpg new file mode 100644 index 00000000..827670ed Binary files /dev/null and b/translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.sv.jpg differ diff --git a/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.da.png b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.da.png new file mode 100644 index 00000000..435f901a Binary files /dev/null and b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.da.png differ diff --git a/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.no.png b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.no.png new file mode 100644 index 00000000..435f901a Binary files /dev/null and b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.no.png differ diff --git a/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.sv.png b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.sv.png new file mode 100644 index 00000000..435f901a Binary files /dev/null and b/translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.sv.png differ diff --git a/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.da.png b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.da.png new file mode 100644 index 00000000..7308a1d1 Binary files /dev/null and b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.da.png differ diff --git a/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.no.png b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.no.png new file mode 100644 index 00000000..7308a1d1 Binary files /dev/null and b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.no.png differ diff --git a/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.sv.png b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.sv.png new file mode 100644 index 00000000..7308a1d1 Binary files /dev/null and b/translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.sv.png differ diff --git a/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.da.png b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.da.png new file mode 100644 index 00000000..8454c4d2 Binary files /dev/null and b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.da.png differ diff --git a/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.no.png b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.no.png new file mode 100644 index 00000000..8454c4d2 Binary files /dev/null and b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.no.png differ diff --git a/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.sv.png b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.sv.png new file mode 100644 index 00000000..8454c4d2 Binary files /dev/null and b/translated_images/resistive-soil-moisture-sensor.728a138a3d109e0653d8e4f6744140836c67461bbd0f4d887f47ed8228dc80b5.sv.png differ diff --git a/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.da.png b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.da.png new file mode 100644 index 00000000..324b711d Binary files /dev/null and b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.da.png differ diff --git a/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.no.png b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.no.png new file mode 100644 index 00000000..324b711d Binary files /dev/null and b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.no.png differ diff --git a/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.sv.png b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.sv.png new file mode 100644 index 00000000..324b711d Binary files /dev/null and b/translated_images/respeaker-35mm-speaker.ad79ef4f128c7751f0abf854869b6b779c90c12ae3e48909944a7e48aeee3c7e.sv.png differ diff --git a/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.da.png b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.da.png new file mode 100644 index 00000000..ddfb42aa Binary files /dev/null and b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.da.png differ diff --git a/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.no.png b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.no.png new file mode 100644 index 00000000..ddfb42aa Binary files /dev/null and b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.no.png differ diff --git a/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.sv.png b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.sv.png new file mode 100644 index 00000000..ddfb42aa Binary files /dev/null and b/translated_images/respeaker-jst-speaker.a441d177809df9458041a2012dd336dbb22c00a5c9642647109d2940a50d6fcc.sv.png differ diff --git a/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.da.png b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.da.png new file mode 100644 index 00000000..280f2fe0 Binary files /dev/null and b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.da.png differ diff --git a/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.no.png b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.no.png new file mode 100644 index 00000000..280f2fe0 Binary files /dev/null and b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.no.png differ diff --git a/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.sv.png b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.sv.png new file mode 100644 index 00000000..280f2fe0 Binary files /dev/null and b/translated_images/respeaker.f5d19d1c6b14ab1676d24ac2764e64fac5339046ae07be8b45ce07633d61b79b.sv.png differ diff --git a/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.da.jpg b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.da.jpg new file mode 100644 index 00000000..89b581ef Binary files /dev/null and b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.da.jpg differ diff --git a/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.no.jpg b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.no.jpg new file mode 100644 index 00000000..89b581ef Binary files /dev/null and b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.no.jpg differ diff --git a/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.sv.jpg b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.sv.jpg new file mode 100644 index 00000000..89b581ef Binary files /dev/null and b/translated_images/ribbon-mic.eacc8e092c7441caee6d7a81e2f40e1675bf36269848964c7c09c9a9acb05127.sv.jpg differ diff --git a/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.da.jpg b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.da.jpg new file mode 100644 index 00000000..6efd2da1 Binary files /dev/null and b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.da.jpg differ diff --git a/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.no.jpg b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.no.jpg new file mode 100644 index 00000000..6efd2da1 Binary files /dev/null and b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.no.jpg differ diff --git a/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.sv.jpg b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.sv.jpg new file mode 100644 index 00000000..6efd2da1 Binary files /dev/null and b/translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.sv.jpg differ diff --git a/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.da.png b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.da.png new file mode 100644 index 00000000..348fe7a0 Binary files /dev/null and b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.da.png differ diff --git a/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.no.png b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.no.png new file mode 100644 index 00000000..348fe7a0 Binary files /dev/null and b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.no.png differ diff --git a/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.sv.png b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.sv.png new file mode 100644 index 00000000..348fe7a0 Binary files /dev/null and b/translated_images/sampling.6f4fadb3f2d9dfe7618f9edfe75a350e6b3f74293ec84f02ab69c19d2afe3d73.sv.png differ diff --git a/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.da.png b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.da.png new file mode 100644 index 00000000..a69e73f4 Binary files /dev/null and b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.da.png differ diff --git a/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.no.png b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.no.png new file mode 100644 index 00000000..a69e73f4 Binary files /dev/null and b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.no.png differ diff --git a/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.sv.png b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.sv.png new file mode 100644 index 00000000..a69e73f4 Binary files /dev/null and b/translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.sv.png differ diff --git a/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.da.png b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.da.png new file mode 100644 index 00000000..49b0ca9b Binary files /dev/null and b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.da.png differ diff --git a/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.no.png b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.no.png new file mode 100644 index 00000000..49b0ca9b Binary files /dev/null and b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.no.png differ diff --git a/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.sv.png b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.sv.png new file mode 100644 index 00000000..49b0ca9b Binary files /dev/null and b/translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.sv.png differ diff --git a/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.da.png b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.da.png new file mode 100644 index 00000000..458a3c95 Binary files /dev/null and b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.da.png differ diff --git a/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.no.png b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.no.png new file mode 100644 index 00000000..458a3c95 Binary files /dev/null and b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.no.png differ diff --git a/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.sv.png b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.sv.png new file mode 100644 index 00000000..458a3c95 Binary files /dev/null and b/translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.sv.png differ diff --git a/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.da.png b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.da.png new file mode 100644 index 00000000..90b687c2 Binary files /dev/null and b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.da.png differ diff --git a/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.no.png b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.no.png new file mode 100644 index 00000000..90b687c2 Binary files /dev/null and b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.no.png differ diff --git a/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.sv.png b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.sv.png new file mode 100644 index 00000000..90b687c2 Binary files /dev/null and b/translated_images/seeed-logo.74732b6b482b6e8e8bdcc06f0541fc92b1dabf5e3e8f37afb91e04393a8cb977.sv.png differ diff --git a/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.da.png b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.da.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.da.png differ diff --git a/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.no.png b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.no.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.no.png differ diff --git a/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.sv.png b/translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.sv.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.sv.png differ diff --git a/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.da.png b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.da.png new file mode 100644 index 00000000..e7ea8ab6 Binary files /dev/null and b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.da.png differ diff --git a/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.no.png b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.no.png new file mode 100644 index 00000000..e7ea8ab6 Binary files /dev/null and b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.no.png differ diff --git a/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.sv.png b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.sv.png new file mode 100644 index 00000000..e7ea8ab6 Binary files /dev/null and b/translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.sv.png differ diff --git a/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.da.png b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.da.png new file mode 100644 index 00000000..6f138cf9 Binary files /dev/null and b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.da.png differ diff --git a/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.no.png b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.no.png new file mode 100644 index 00000000..6f138cf9 Binary files /dev/null and b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.no.png differ diff --git a/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.sv.png b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.sv.png new file mode 100644 index 00000000..6f138cf9 Binary files /dev/null and b/translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.sv.png differ diff --git a/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.da.png b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.da.png new file mode 100644 index 00000000..2f5f2861 Binary files /dev/null and b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.da.png differ diff --git a/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.no.png b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.no.png new file mode 100644 index 00000000..2f5f2861 Binary files /dev/null and b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.no.png differ diff --git a/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.sv.png b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.sv.png new file mode 100644 index 00000000..2f5f2861 Binary files /dev/null and b/translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.sv.png differ diff --git a/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.da.png b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.da.png new file mode 100644 index 00000000..f2f1b63e Binary files /dev/null and b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.da.png differ diff --git a/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.no.png b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.no.png new file mode 100644 index 00000000..f2f1b63e Binary files /dev/null and b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.no.png differ diff --git a/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.sv.png b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.sv.png new file mode 100644 index 00000000..f2f1b63e Binary files /dev/null and b/translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.sv.png differ diff --git a/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.da.png b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.da.png new file mode 100644 index 00000000..5643c164 Binary files /dev/null and b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.da.png differ diff --git a/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.no.png b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.no.png new file mode 100644 index 00000000..5643c164 Binary files /dev/null and b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.no.png differ diff --git a/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.sv.png b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.sv.png new file mode 100644 index 00000000..5643c164 Binary files /dev/null and b/translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.sv.png differ diff --git a/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.da.png b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.da.png new file mode 100644 index 00000000..73fa30d1 Binary files /dev/null and b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.da.png differ diff --git a/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.no.png b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.no.png new file mode 100644 index 00000000..73fa30d1 Binary files /dev/null and b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.no.png differ diff --git a/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.sv.png b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.sv.png new file mode 100644 index 00000000..73fa30d1 Binary files /dev/null and b/translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.sv.png differ diff --git a/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.da.png b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.da.png new file mode 100644 index 00000000..eee39f7d Binary files /dev/null and b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.da.png differ diff --git a/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.no.png b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.no.png new file mode 100644 index 00000000..eee39f7d Binary files /dev/null and b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.no.png differ diff --git a/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.sv.png b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.sv.png new file mode 100644 index 00000000..eee39f7d Binary files /dev/null and b/translated_images/shapes-to-images.1a309f0ea88dd66fafa4da6d38e88806ce174cc6a88081efb32852230ed55de8.sv.png differ diff --git a/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.da.png b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.da.png new file mode 100644 index 00000000..5a0fb117 Binary files /dev/null and b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.da.png differ diff --git a/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.no.png b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.no.png new file mode 100644 index 00000000..5a0fb117 Binary files /dev/null and b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.no.png differ diff --git a/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.sv.png b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.sv.png new file mode 100644 index 00000000..5a0fb117 Binary files /dev/null and b/translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.sv.png differ diff --git a/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.da.png b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.da.png new file mode 100644 index 00000000..27ddbfee Binary files /dev/null and b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.da.png differ diff --git a/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.no.png b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.no.png new file mode 100644 index 00000000..27ddbfee Binary files /dev/null and b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.no.png differ diff --git a/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.sv.png b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.sv.png new file mode 100644 index 00000000..27ddbfee Binary files /dev/null and b/translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.sv.png differ diff --git a/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.da.png b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.da.png new file mode 100644 index 00000000..ee07bd10 Binary files /dev/null and b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.da.png differ diff --git a/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.no.png b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.no.png new file mode 100644 index 00000000..ee07bd10 Binary files /dev/null and b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.no.png differ diff --git a/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.sv.png b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.sv.png new file mode 100644 index 00000000..ee07bd10 Binary files /dev/null and b/translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.sv.png differ diff --git a/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.da.png b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.da.png new file mode 100644 index 00000000..37a2464a Binary files /dev/null and b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.da.png differ diff --git a/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.no.png b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.no.png new file mode 100644 index 00000000..37a2464a Binary files /dev/null and b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.no.png differ diff --git a/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.sv.png b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.sv.png new file mode 100644 index 00000000..37a2464a Binary files /dev/null and b/translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.sv.png differ diff --git a/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.da.png b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.da.png new file mode 100644 index 00000000..d852153c Binary files /dev/null and b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.da.png differ diff --git a/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.no.png b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.no.png new file mode 100644 index 00000000..d852153c Binary files /dev/null and b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.no.png differ diff --git a/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.sv.png b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.sv.png new file mode 100644 index 00000000..d852153c Binary files /dev/null and b/translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.sv.png differ diff --git a/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.da.png b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.da.png new file mode 100644 index 00000000..a457ac8d Binary files /dev/null and b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.da.png differ diff --git a/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.no.png b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.no.png new file mode 100644 index 00000000..a457ac8d Binary files /dev/null and b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.no.png differ diff --git a/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.sv.png b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.sv.png new file mode 100644 index 00000000..a457ac8d Binary files /dev/null and b/translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.sv.png differ diff --git a/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.da.png b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.da.png new file mode 100644 index 00000000..3eccd326 Binary files /dev/null and b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.da.png differ diff --git a/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.no.png b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.no.png new file mode 100644 index 00000000..3eccd326 Binary files /dev/null and b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.no.png differ diff --git a/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.sv.png b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.sv.png new file mode 100644 index 00000000..3eccd326 Binary files /dev/null and b/translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.sv.png differ diff --git a/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.da.png b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.da.png new file mode 100644 index 00000000..49083372 Binary files /dev/null and b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.da.png differ diff --git a/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.no.png b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.no.png new file mode 100644 index 00000000..49083372 Binary files /dev/null and b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.no.png differ diff --git a/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.sv.png b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.sv.png new file mode 100644 index 00000000..49083372 Binary files /dev/null and b/translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.sv.png differ diff --git a/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.da.png b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.da.png new file mode 100644 index 00000000..1b4a94e5 Binary files /dev/null and b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.da.png differ diff --git a/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.no.png b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.no.png new file mode 100644 index 00000000..1b4a94e5 Binary files /dev/null and b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.no.png differ diff --git a/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.sv.png b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.sv.png new file mode 100644 index 00000000..1b4a94e5 Binary files /dev/null and b/translated_images/stock-7-cans-tomato-paste.f86059cc573d7becaa89a0eafb9d2cd7e2fe37405a530fe565990e2333d0e4a1.sv.png differ diff --git a/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.da.png b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.da.png new file mode 100644 index 00000000..8589e88f Binary files /dev/null and b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.da.png differ diff --git a/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.no.png b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.no.png new file mode 100644 index 00000000..8589e88f Binary files /dev/null and b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.no.png differ diff --git a/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.sv.png b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.sv.png new file mode 100644 index 00000000..8589e88f Binary files /dev/null and b/translated_images/stock-rogue-corn.be1f3ada8c4578544641af66671c1711a4c02297f14cc7f503354dae0d30a954.sv.png differ diff --git a/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.da.png b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.da.png new file mode 100644 index 00000000..e1246f56 Binary files /dev/null and b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.da.png differ diff --git a/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.no.png b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.no.png new file mode 100644 index 00000000..e1246f56 Binary files /dev/null and b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.no.png differ diff --git a/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.sv.png b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.sv.png new file mode 100644 index 00000000..e1246f56 Binary files /dev/null and b/translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.sv.png differ diff --git a/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.da.png b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.da.png new file mode 100644 index 00000000..db66a52b Binary files /dev/null and b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.da.png differ diff --git a/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.no.png b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.no.png new file mode 100644 index 00000000..db66a52b Binary files /dev/null and b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.no.png differ diff --git a/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.sv.png b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.sv.png new file mode 100644 index 00000000..db66a52b Binary files /dev/null and b/translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.sv.png differ diff --git a/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.da.png b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.da.png new file mode 100644 index 00000000..66c76c2f Binary files /dev/null and b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.da.png differ diff --git a/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.no.png b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.no.png new file mode 100644 index 00000000..66c76c2f Binary files /dev/null and b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.no.png differ diff --git a/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.sv.png b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.sv.png new file mode 100644 index 00000000..66c76c2f Binary files /dev/null and b/translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.sv.png differ diff --git a/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.da.png b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.da.png new file mode 100644 index 00000000..450b824c Binary files /dev/null and b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.da.png differ diff --git a/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.no.png b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.no.png new file mode 100644 index 00000000..450b824c Binary files /dev/null and b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.no.png differ diff --git a/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.sv.png b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.sv.png new file mode 100644 index 00000000..450b824c Binary files /dev/null and b/translated_images/time-of-flight-banana.079921ad8b1496e4525dc26b4cdc71a076407aba3e72ba113ba2e38febae92c5.sv.png differ diff --git a/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.da.png b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.da.png new file mode 100644 index 00000000..615bc7a9 Binary files /dev/null and b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.da.png differ diff --git a/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.no.png b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.no.png new file mode 100644 index 00000000..615bc7a9 Binary files /dev/null and b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.no.png differ diff --git a/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.sv.png b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.sv.png new file mode 100644 index 00000000..615bc7a9 Binary files /dev/null and b/translated_images/traditional-vs-ml.5c20c169621fa539ca84a2cd9a49f6ff7410b3a6c6b46c97ff2af3f99db3c66b.sv.png differ diff --git a/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.da.png b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.da.png new file mode 100644 index 00000000..3c9e2930 Binary files /dev/null and b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.da.png differ diff --git a/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.no.png b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.no.png new file mode 100644 index 00000000..3c9e2930 Binary files /dev/null and b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.no.png differ diff --git a/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.sv.png b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.sv.png new file mode 100644 index 00000000..3c9e2930 Binary files /dev/null and b/translated_images/translated-smart-timer.08ac20057fdc5c3778ed41cb425dca5d7fbcd4584b6da7b73ca67115a5b8a883.sv.png differ diff --git a/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.da.png b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.da.png new file mode 100644 index 00000000..e4bb0186 Binary files /dev/null and b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.da.png differ diff --git a/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.no.png b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.no.png new file mode 100644 index 00000000..e4bb0186 Binary files /dev/null and b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.no.png differ diff --git a/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.sv.png b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.sv.png new file mode 100644 index 00000000..e4bb0186 Binary files /dev/null and b/translated_images/transpiration.b735aa34e4372e659f76d82527e9ce683f076d56065d0d8fddf13321666f4d80.sv.png differ diff --git a/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.da.png b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.da.png new file mode 100644 index 00000000..91e4cba6 Binary files /dev/null and b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.da.png differ diff --git a/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.no.png b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.no.png new file mode 100644 index 00000000..91e4cba6 Binary files /dev/null and b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.no.png differ diff --git a/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.sv.png b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.sv.png new file mode 100644 index 00000000..91e4cba6 Binary files /dev/null and b/translated_images/tts-overview.193843cf3f5ee09f8b3371a9fdaeb0f116698a07ca69daaa77158da4800e5453.sv.png differ diff --git a/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.da.png b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.da.png new file mode 100644 index 00000000..91230d0c Binary files /dev/null and b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.da.png differ diff --git a/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.no.png b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.no.png new file mode 100644 index 00000000..91230d0c Binary files /dev/null and b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.no.png differ diff --git a/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.sv.png b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.sv.png new file mode 100644 index 00000000..91230d0c Binary files /dev/null and b/translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.sv.png differ diff --git a/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.da.png b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.da.png new file mode 100644 index 00000000..128cd4a9 Binary files /dev/null and b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.da.png differ diff --git a/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.no.png b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.no.png new file mode 100644 index 00000000..128cd4a9 Binary files /dev/null and b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.no.png differ diff --git a/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.sv.png b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.sv.png new file mode 100644 index 00000000..128cd4a9 Binary files /dev/null and b/translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.sv.png differ diff --git a/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.da.png b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.da.png new file mode 100644 index 00000000..8d62d827 Binary files /dev/null and b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.da.png differ diff --git a/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.no.png b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.no.png new file mode 100644 index 00000000..8d62d827 Binary files /dev/null and b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.no.png differ diff --git a/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.sv.png b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.sv.png new file mode 100644 index 00000000..8d62d827 Binary files /dev/null and b/translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.sv.png differ diff --git a/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.da.png b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.da.png new file mode 100644 index 00000000..a84ab661 Binary files /dev/null and b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.da.png differ diff --git a/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.no.png b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.no.png new file mode 100644 index 00000000..a84ab661 Binary files /dev/null and b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.no.png differ diff --git a/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.sv.png b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.sv.png new file mode 100644 index 00000000..a84ab661 Binary files /dev/null and b/translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.sv.png differ diff --git a/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.da.png b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.da.png new file mode 100644 index 00000000..4c88d3d3 Binary files /dev/null and b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.da.png differ diff --git a/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.no.png b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.no.png new file mode 100644 index 00000000..4c88d3d3 Binary files /dev/null and b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.no.png differ diff --git a/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.sv.png b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.sv.png new file mode 100644 index 00000000..4c88d3d3 Binary files /dev/null and b/translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.sv.png differ diff --git a/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.da.png b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.da.png new file mode 100644 index 00000000..bc1895b8 Binary files /dev/null and b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.da.png differ diff --git a/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.no.png b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.no.png new file mode 100644 index 00000000..bc1895b8 Binary files /dev/null and b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.no.png differ diff --git a/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.sv.png b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.sv.png new file mode 100644 index 00000000..bc1895b8 Binary files /dev/null and b/translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.sv.png differ diff --git a/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.da.png b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.da.png new file mode 100644 index 00000000..d8ff3180 Binary files /dev/null and b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.da.png differ diff --git a/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.no.png b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.no.png new file mode 100644 index 00000000..d8ff3180 Binary files /dev/null and b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.no.png differ diff --git a/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.sv.png b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.sv.png new file mode 100644 index 00000000..d8ff3180 Binary files /dev/null and b/translated_images/vscode-platformio-build-command-palette.7708e7ec7d75d7ee1a0551f42229a321c7e2e4bccac7f1a64df2ed55999f723d.sv.png differ diff --git a/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.da.png b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.da.png new file mode 100644 index 00000000..06b86a65 Binary files /dev/null and b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.da.png differ diff --git a/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.no.png b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.no.png new file mode 100644 index 00000000..06b86a65 Binary files /dev/null and b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.no.png differ diff --git a/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.sv.png b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.sv.png new file mode 100644 index 00000000..06b86a65 Binary files /dev/null and b/translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.sv.png differ diff --git a/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.da.png b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.da.png new file mode 100644 index 00000000..ac7aa47a Binary files /dev/null and b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.da.png differ diff --git a/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.no.png b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.no.png new file mode 100644 index 00000000..ac7aa47a Binary files /dev/null and b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.no.png differ diff --git a/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.sv.png b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.sv.png new file mode 100644 index 00000000..ac7aa47a Binary files /dev/null and b/translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.sv.png differ diff --git a/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.da.png b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.da.png new file mode 100644 index 00000000..20480a22 Binary files /dev/null and b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.da.png differ diff --git a/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.no.png b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.no.png new file mode 100644 index 00000000..20480a22 Binary files /dev/null and b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.no.png differ diff --git a/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.sv.png b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.sv.png new file mode 100644 index 00000000..20480a22 Binary files /dev/null and b/translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.sv.png differ diff --git a/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.da.png b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.da.png new file mode 100644 index 00000000..9d90f435 Binary files /dev/null and b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.da.png differ diff --git a/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.no.png b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.no.png new file mode 100644 index 00000000..9d90f435 Binary files /dev/null and b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.no.png differ diff --git a/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.sv.png b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.sv.png new file mode 100644 index 00000000..9d90f435 Binary files /dev/null and b/translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.sv.png differ diff --git a/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.da.png b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.da.png new file mode 100644 index 00000000..27b0ea2c Binary files /dev/null and b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.da.png differ diff --git a/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.no.png b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.no.png new file mode 100644 index 00000000..27b0ea2c Binary files /dev/null and b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.no.png differ diff --git a/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.sv.png b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.sv.png new file mode 100644 index 00000000..27b0ea2c Binary files /dev/null and b/translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.sv.png differ diff --git a/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.da.png b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.da.png new file mode 100644 index 00000000..3526a6d0 Binary files /dev/null and b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.da.png differ diff --git a/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.no.png b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.no.png new file mode 100644 index 00000000..3526a6d0 Binary files /dev/null and b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.no.png differ diff --git a/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.sv.png b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.sv.png new file mode 100644 index 00000000..3526a6d0 Binary files /dev/null and b/translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.sv.png differ diff --git a/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.da.png b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.da.png new file mode 100644 index 00000000..855d442e Binary files /dev/null and b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.da.png differ diff --git a/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.no.png b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.no.png new file mode 100644 index 00000000..855d442e Binary files /dev/null and b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.no.png differ diff --git a/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.sv.png b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.sv.png new file mode 100644 index 00000000..855d442e Binary files /dev/null and b/translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.sv.png differ diff --git a/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.da.png b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.da.png new file mode 100644 index 00000000..aed3d813 Binary files /dev/null and b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.da.png differ diff --git a/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.no.png b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.no.png new file mode 100644 index 00000000..aed3d813 Binary files /dev/null and b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.no.png differ diff --git a/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.sv.png b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.sv.png new file mode 100644 index 00000000..aed3d813 Binary files /dev/null and b/translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.sv.png differ diff --git a/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.da.png b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.da.png new file mode 100644 index 00000000..9bfca6c2 Binary files /dev/null and b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.da.png differ diff --git a/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.no.png b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.no.png new file mode 100644 index 00000000..9bfca6c2 Binary files /dev/null and b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.no.png differ diff --git a/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.sv.png b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.sv.png new file mode 100644 index 00000000..9bfca6c2 Binary files /dev/null and b/translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.sv.png differ diff --git a/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.da.png b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.da.png new file mode 100644 index 00000000..0490e302 Binary files /dev/null and b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.da.png differ diff --git a/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.no.png b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.no.png new file mode 100644 index 00000000..0490e302 Binary files /dev/null and b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.no.png differ diff --git a/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.sv.png b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.sv.png new file mode 100644 index 00000000..0490e302 Binary files /dev/null and b/translated_images/wio-hardware-kit.4c70c48b85e4283a1d73e248d87d49587c0cd077eeb69cb3eca803166f63c9a5.sv.png differ diff --git a/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.da.png b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.da.png new file mode 100644 index 00000000..676e2378 Binary files /dev/null and b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.da.png differ diff --git a/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.no.png b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.no.png new file mode 100644 index 00000000..676e2378 Binary files /dev/null and b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.no.png differ diff --git a/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.sv.png b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.sv.png new file mode 100644 index 00000000..676e2378 Binary files /dev/null and b/translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.sv.png differ diff --git a/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.da.png b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.da.png new file mode 100644 index 00000000..280e18c3 Binary files /dev/null and b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.da.png differ diff --git a/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.no.png b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.no.png new file mode 100644 index 00000000..280e18c3 Binary files /dev/null and b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.no.png differ diff --git a/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.sv.png b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.sv.png new file mode 100644 index 00000000..280e18c3 Binary files /dev/null and b/translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.sv.png differ diff --git a/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.da.png b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.da.png new file mode 100644 index 00000000..bb70a905 Binary files /dev/null and b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.da.png differ diff --git a/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.no.png b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.no.png new file mode 100644 index 00000000..bb70a905 Binary files /dev/null and b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.no.png differ diff --git a/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.sv.png b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.sv.png new file mode 100644 index 00000000..bb70a905 Binary files /dev/null and b/translated_images/wio-mic.3f8c843dbe8ad917424037a93e3d25c62634add00a04dd8e091317b5a7a90088.sv.png differ diff --git a/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.da.png b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.da.png new file mode 100644 index 00000000..c0860d6e Binary files /dev/null and b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.da.png differ diff --git a/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.no.png b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.no.png new file mode 100644 index 00000000..c0860d6e Binary files /dev/null and b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.no.png differ diff --git a/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.sv.png b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.sv.png new file mode 100644 index 00000000..c0860d6e Binary files /dev/null and b/translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.sv.png differ diff --git a/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.da.png b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.da.png new file mode 100644 index 00000000..9a34d708 Binary files /dev/null and b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.da.png differ diff --git a/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.no.png b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.no.png new file mode 100644 index 00000000..9a34d708 Binary files /dev/null and b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.no.png differ diff --git a/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.sv.png b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.sv.png new file mode 100644 index 00000000..9a34d708 Binary files /dev/null and b/translated_images/wio-respeaker-hat.bd54917d446e6f6f142f9371ea52c12fd708873986bf46191208a151cd929bad.sv.png differ diff --git a/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.da.png b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.da.png new file mode 100644 index 00000000..2c683d8b Binary files /dev/null and b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.da.png differ diff --git a/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.no.png b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.no.png new file mode 100644 index 00000000..2c683d8b Binary files /dev/null and b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.no.png differ diff --git a/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.sv.png b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.sv.png new file mode 100644 index 00000000..2c683d8b Binary files /dev/null and b/translated_images/wio-respeaker-wiring-0.767f80aa6508103880d256cdf99ee7219e190db257c7261e4aec219759dc67b9.sv.png differ diff --git a/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.da.png b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.da.png new file mode 100644 index 00000000..1ba4c5b0 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.da.png differ diff --git a/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.no.png b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.no.png new file mode 100644 index 00000000..1ba4c5b0 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.no.png differ diff --git a/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.sv.png b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.sv.png new file mode 100644 index 00000000..1ba4c5b0 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-1.8d894727f2ba24004824ee5e06b83b6d10952550003a3efb603182121521b0ef.sv.png differ diff --git a/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.da.png b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.da.png new file mode 100644 index 00000000..93aa3743 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.da.png differ diff --git a/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.no.png b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.no.png new file mode 100644 index 00000000..93aa3743 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.no.png differ diff --git a/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.sv.png b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.sv.png new file mode 100644 index 00000000..93aa3743 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-2.329e1cbd306e754f8ffe56f9294794f4a8fa123860d76067a79e9ea385d1bf56.sv.png differ diff --git a/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.da.png b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.da.png new file mode 100644 index 00000000..3089e5e1 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.da.png differ diff --git a/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.no.png b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.no.png new file mode 100644 index 00000000..3089e5e1 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.no.png differ diff --git a/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.sv.png b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.sv.png new file mode 100644 index 00000000..3089e5e1 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-3.75b0be447e2fa9307a6a954f9ae8a71b77e39ada6a5ef1a059d341dc850fd90c.sv.png differ diff --git a/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.da.png b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.da.png new file mode 100644 index 00000000..53468420 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.da.png differ diff --git a/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.no.png b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.no.png new file mode 100644 index 00000000..53468420 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.no.png differ diff --git a/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.sv.png b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.sv.png new file mode 100644 index 00000000..53468420 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-4.aa9cd434d8779437de720cba2719d83992413caed1b620b6148f6c8924889afb.sv.png differ diff --git a/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.da.png b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.da.png new file mode 100644 index 00000000..003dc174 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.da.png differ diff --git a/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.no.png b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.no.png new file mode 100644 index 00000000..003dc174 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.no.png differ diff --git a/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.sv.png b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.sv.png new file mode 100644 index 00000000..003dc174 Binary files /dev/null and b/translated_images/wio-respeaker-wiring-5.af117c20acf622f3cd656ccd8f4053f8845d6aaa3af164d24cb7dbd54a4bb470.sv.png differ diff --git a/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.da.png b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.da.png new file mode 100644 index 00000000..3c0d2f87 Binary files /dev/null and b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.da.png differ diff --git a/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.no.png b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.no.png new file mode 100644 index 00000000..3c0d2f87 Binary files /dev/null and b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.no.png differ diff --git a/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.sv.png b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.sv.png new file mode 100644 index 00000000..3c0d2f87 Binary files /dev/null and b/translated_images/wio-sd-card.acdcbe322fa4ee7f8f9c8cc015b3263964bb26ab5c7e25b41747988cc5280d64.sv.png differ diff --git a/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.da.png b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.da.png new file mode 100644 index 00000000..56f285f2 Binary files /dev/null and b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.da.png differ diff --git a/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.no.png b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.no.png new file mode 100644 index 00000000..56f285f2 Binary files /dev/null and b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.no.png differ diff --git a/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.sv.png b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.sv.png new file mode 100644 index 00000000..56f285f2 Binary files /dev/null and b/translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.sv.png differ diff --git a/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.da.png b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.da.png new file mode 100644 index 00000000..ec8bbe2f Binary files /dev/null and b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.da.png differ diff --git a/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.no.png b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.no.png new file mode 100644 index 00000000..ec8bbe2f Binary files /dev/null and b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.no.png differ diff --git a/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.sv.png b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.sv.png new file mode 100644 index 00000000..ec8bbe2f Binary files /dev/null and b/translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.sv.png differ diff --git a/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.da.png b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.da.png new file mode 100644 index 00000000..bbaae894 Binary files /dev/null and b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.da.png differ diff --git a/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.no.png b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.no.png new file mode 100644 index 00000000..bbaae894 Binary files /dev/null and b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.no.png differ diff --git a/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.sv.png b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.sv.png new file mode 100644 index 00000000..bbaae894 Binary files /dev/null and b/translated_images/wio-terminal-c-button.73df3cb1c1445ea07ee98316af0e7925fcb43135df0abed58d3d4822b2589c3b.sv.png differ diff --git a/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.da.png b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.da.png new file mode 100644 index 00000000..ef71f6da Binary files /dev/null and b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.da.png differ diff --git a/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.no.png b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.no.png new file mode 100644 index 00000000..ef71f6da Binary files /dev/null and b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.no.png differ diff --git a/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.sv.png b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.sv.png new file mode 100644 index 00000000..ef71f6da Binary files /dev/null and b/translated_images/wio-terminal-pin-sticker.b90b1535937b84bd00d853f0004aea74fac2aec04b43f14b887796b2633f855e.sv.png differ diff --git a/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.da.png b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.da.png new file mode 100644 index 00000000..4e9390eb Binary files /dev/null and b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.da.png differ diff --git a/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.no.png b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.no.png new file mode 100644 index 00000000..4e9390eb Binary files /dev/null and b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.no.png differ diff --git a/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.sv.png b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.sv.png new file mode 100644 index 00000000..4e9390eb Binary files /dev/null and b/translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.sv.png differ diff --git a/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.da.png b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.da.png new file mode 100644 index 00000000..16d7af80 Binary files /dev/null and b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.da.png differ diff --git a/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.no.png b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.no.png new file mode 100644 index 00000000..16d7af80 Binary files /dev/null and b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.no.png differ diff --git a/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.sv.png b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.sv.png new file mode 100644 index 00000000..16d7af80 Binary files /dev/null and b/translated_images/wio-time-of-flight-sensor.c4c182131d2ea73df67febd004dc0313d271013d016be9c47e7da4d77c6c20a8.sv.png differ diff --git a/translations/da/1-getting-started/README.md b/translations/da/1-getting-started/README.md new file mode 100644 index 00000000..1131086d --- /dev/null +++ b/translations/da/1-getting-started/README.md @@ -0,0 +1,30 @@ + +# Kom godt i gang med IoT + +I denne del af pensum vil du blive introduceret til Internet of Things og lære de grundlæggende begreber, herunder hvordan du bygger dit første 'Hello World'-IoT-projekt, der forbinder til skyen. Dette projekt er en natlampe, der lyser op, når lysniveauerne målt af en sensor falder. + +![LED'en forbundet til WIO, der tænder og slukker, når lysniveauet ændrer sig](../../../images/wio-running-assignment-1-1.gif) + +## Emner + +1. [Introduktion til IoT](lessons/1-introduction-to-iot/README.md) +1. [En dybere indsigt i IoT](lessons/2-deeper-dive/README.md) +1. [Interagér med den fysiske verden med sensorer og aktuatorer](lessons/3-sensors-and-actuators/README.md) +1. [Forbind din enhed til internettet](lessons/4-connect-internet/README.md) + +## Kreditering + +Alle lektionerne er skrevet med ♥️ af [Jim Bennett](https://GitHub.com/JimBobBennett) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/1-introduction-to-iot/README.md b/translations/da/1-getting-started/lessons/1-introduction-to-iot/README.md new file mode 100644 index 00000000..f4d249d6 --- /dev/null +++ b/translations/da/1-getting-started/lessons/1-introduction-to-iot/README.md @@ -0,0 +1,242 @@ + +# Introduktion til IoT + +![En sketchnote oversigt over denne lektion](../../../../../translated_images/lesson-1.2606670fa61ee904687da5d6fa4e726639d524d064c895117da1b95b9ff6251d.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +Denne lektion blev undervist som en del af [Hello IoT-serien](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) fra [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Lektionen blev præsenteret i 2 videoer - en 1-times lektion og en 1-times spørgetime, hvor dele af lektionen blev uddybet, og spørgsmål blev besvaret. + +[![Lektion 1: Introduktion til IoT](https://img.youtube.com/vi/bVFfcYh6UBw/0.jpg)](https://youtu.be/bVFfcYh6UBw) + +[![Lektion 1: Introduktion til IoT - Spørgetime](https://img.youtube.com/vi/YI772q5v3yI/0.jpg)](https://youtu.be/YI772q5v3yI) + +> 🎥 Klik på billederne ovenfor for at se videoerne + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/1) + +## Introduktion + +Denne lektion dækker nogle af de grundlæggende emner omkring Internet of Things og hjælper dig med at komme i gang med at opsætte din hardware. + +I denne lektion vil vi gennemgå: + +* [Hvad er 'Internet of Things'?](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [IoT-enheder](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Opsæt din enhed](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Anvendelser af IoT](../../../../../1-getting-started/lessons/1-introduction-to-iot) +* [Eksempler på IoT-enheder omkring dig](../../../../../1-getting-started/lessons/1-introduction-to-iot) + +## Hvad er 'Internet of Things'? + +Begrebet 'Internet of Things' blev opfundet af [Kevin Ashton](https://wikipedia.org/wiki/Kevin_Ashton) i 1999 for at beskrive forbindelsen mellem internettet og den fysiske verden via sensorer. Siden da er begrebet blevet brugt til at beskrive enhver enhed, der interagerer med den fysiske verden omkring den, enten ved at indsamle data fra sensorer eller ved at levere interaktioner i den virkelige verden via aktuatorer (enheder, der udfører handlinger som at tænde en kontakt eller lyse en LED), ofte forbundet med andre enheder eller internettet. + +> **Sensorer** indsamler information fra verden, såsom måling af hastighed, temperatur eller placering. +> +> **Aktuatorer** konverterer elektriske signaler til interaktioner i den virkelige verden, såsom at aktivere en kontakt, tænde lys, lave lyde eller sende kontrolsignaler til andet hardware, for eksempel for at tænde en stikkontakt. + +IoT som teknologiområde er mere end bare enheder - det inkluderer cloud-baserede tjenester, der kan behandle sensordata eller sende anmodninger til aktuatorer forbundet med IoT-enheder. Det inkluderer også enheder, der ikke har eller ikke behøver internetforbindelse, ofte kaldet edge-enheder. Disse enheder kan selv behandle og reagere på sensordata, normalt ved hjælp af AI-modeller, der er trænet i skyen. + +IoT er et hurtigt voksende teknologiområde. Det anslås, at der ved udgangen af 2020 var 30 milliarder IoT-enheder implementeret og forbundet til internettet. Ser vi fremad, anslås det, at IoT-enheder i 2025 vil indsamle næsten 80 zettabytes data eller 80 billioner gigabytes. Det er en enorm mængde data! + +![En graf, der viser aktive IoT-enheder over tid, med en opadgående tendens fra under 5 milliarder i 2015 til over 30 milliarder i 2025](../../../../../images/connected-iot-devices.svg) + +✅ Lav lidt research: Hvor meget af de data, der genereres af IoT-enheder, bliver faktisk brugt, og hvor meget går til spilde? Hvorfor bliver så mange data ignoreret? + +Disse data er nøglen til IoT's succes. For at blive en succesfuld IoT-udvikler skal du forstå, hvilke data du skal indsamle, hvordan du indsamler dem, hvordan du træffer beslutninger baseret på dem, og hvordan du bruger disse beslutninger til at interagere med den fysiske verden, hvis det er nødvendigt. + +## IoT-enheder + +**T** i IoT står for **Things** - enheder, der interagerer med den fysiske verden omkring dem, enten ved at indsamle data fra sensorer eller levere interaktioner i den virkelige verden via aktuatorer. + +Enheder til produktion eller kommerciel brug, såsom fitness-trackere til forbrugere eller industrielle maskinstyringer, er normalt specialfremstillede. De bruger skræddersyede kredsløb, måske endda specialdesignede processorer, der er designet til at opfylde behovene for en bestemt opgave, hvad enten det er at være lille nok til at passe på et håndled eller robust nok til at fungere i et miljø med høj temperatur, højt stress eller høj vibration. + +Som udvikler, der enten lærer om IoT eller skaber en prototype, skal du starte med et udviklersæt. Disse er generelle IoT-enheder designet til udviklere, ofte med funktioner, som du ikke ville have på en produktionsenhed, såsom eksterne pins til at forbinde sensorer eller aktuatorer, hardware til debugging eller ekstra ressourcer, der ville tilføje unødvendige omkostninger ved masseproduktion. + +Disse udviklersæt falder normalt i to kategorier - mikrocontrollere og single-board computere. Disse vil blive introduceret her, og vi vil gå mere i detaljer i den næste lektion. + +> 💁 Din telefon kan også betragtes som en generel IoT-enhed med indbyggede sensorer og aktuatorer, hvor forskellige apps bruger sensorer og aktuatorer på forskellige måder med forskellige cloud-tjenester. Du kan endda finde nogle IoT-tutorials, der bruger en telefonapp som en IoT-enhed. + +### Mikrocontrollere + +En mikrocontroller (ofte kaldet MCU, kort for microcontroller unit) er en lille computer bestående af: + +🧠 En eller flere centralenheder (CPU'er) - mikrocontrollerens 'hjerne', der kører dit program + +💾 Hukommelse (RAM og programhukommelse) - hvor dit program, data og variabler gemmes + +🔌 Programmerbare input/output (I/O) forbindelser - til at kommunikere med eksterne enheder (tilsluttede enheder) såsom sensorer og aktuatorer + +Mikrocontrollere er typisk lavpris computerenheder, med gennemsnitspriser for dem, der bruges i specialfremstillet hardware, der falder til omkring US$0.50, og nogle enheder så billige som US$0.03. Udviklersæt kan starte så lavt som US$4, med omkostninger, der stiger, når du tilføjer flere funktioner. [Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html), et mikrocontroller-udviklersæt fra [Seeed studios](https://www.seeedstudio.com), der har sensorer, aktuatorer, WiFi og en skærm, koster omkring US$30. + +![En Wio Terminal](../../../../../translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.da.png) + +> 💁 Når du søger på internettet efter mikrocontrollere, skal du være opmærksom på at søge efter termen **MCU**, da dette vil give mange resultater for Marvel Cinematic Universe, ikke mikrocontrollere. + +Mikrocontrollere er designet til at blive programmeret til at udføre et begrænset antal meget specifikke opgaver, snarere end at være generelle computere som PC'er eller Mac'er. Bortset fra meget specifikke scenarier kan du ikke tilslutte en skærm, tastatur og mus og bruge dem til generelle opgaver. + +Udviklersæt til mikrocontrollere kommer normalt med ekstra sensorer og aktuatorer ombord. De fleste boards vil have en eller flere LED'er, du kan programmere, sammen med andre enheder såsom standardstik til at tilføje flere sensorer eller aktuatorer ved hjælp af forskellige producenters økosystemer eller indbyggede sensorer (normalt de mest populære som temperatursensorer). Nogle mikrocontrollere har indbygget trådløs forbindelse såsom Bluetooth eller WiFi eller har ekstra mikrocontrollere på boardet for at tilføje denne forbindelse. + +> 💁 Mikrocontrollere programmeres normalt i C/C++. + +### Single-board computere + +En single-board computer er en lille computerenhed, der har alle elementerne i en komplet computer samlet på et enkelt lille board. Disse enheder har specifikationer, der minder om en desktop eller laptop PC eller Mac, kører et fuldt operativsystem, men er små, bruger mindre strøm og er betydeligt billigere. + +![En Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.da.jpg) + +Raspberry Pi er en af de mest populære single-board computere. + +Ligesom en mikrocontroller har single-board computere en CPU, hukommelse og input/output pins, men de har ekstra funktioner såsom en grafikchip, der gør det muligt at tilslutte skærme, lydudgange og USB-porte til at tilslutte tastaturer, mus og andre standard USB-enheder som webcams eller eksterne lagringsenheder. Programmer gemmes på SD-kort eller harddiske sammen med et operativsystem, i stedet for en hukommelseschip indbygget i boardet. + +> 🎓 Du kan tænke på en single-board computer som en mindre, billigere version af den PC eller Mac, du læser dette på, med tilføjelsen af GPIO (general-purpose input/output) pins til at interagere med sensorer og aktuatorer. + +Single-board computere er fuldt udstyrede computere, så de kan programmeres i ethvert sprog. IoT-enheder programmeres typisk i Python. + +### Hardwarevalg til resten af lektionerne + +Alle de efterfølgende lektioner inkluderer opgaver, der bruger en IoT-enhed til at interagere med den fysiske verden og kommunikere med skyen. Hver lektion understøtter 3 hardwarevalg - Arduino (ved hjælp af en Seeed Studios Wio Terminal) eller en single-board computer, enten en fysisk enhed (en Raspberry Pi 4) eller en virtuel single-board computer, der kører på din PC eller Mac. + +Du kan læse om den hardware, der er nødvendig for at fuldføre alle opgaverne, i [hardwareguiden](../../../hardware.md). + +> 💁 Du behøver ikke købe nogen IoT-hardware for at fuldføre opgaverne; du kan gøre alt ved hjælp af en virtuel single-board computer. + +Hvilken hardware du vælger, afhænger af, hvad du har til rådighed enten derhjemme eller på din skole, og hvilket programmeringssprog du kender eller planlægger at lære. Begge hardwarevarianter vil bruge det samme sensor-økosystem, så hvis du starter med én vej, kan du skifte til den anden uden at skulle udskifte det meste af udstyret. Den virtuelle single-board computer vil være det samme som at lære på en Raspberry Pi, med det meste af koden overførbar til Pi'en, hvis du senere får en enhed og sensorer. + +### Arduino udviklersæt + +Hvis du er interesseret i at lære mikrocontroller-udvikling, kan du fuldføre opgaverne ved hjælp af en Arduino-enhed. Du skal have en grundlæggende forståelse af C/C++-programmering, da lektionerne kun vil undervise i kode, der er relevant for Arduino-frameworket, de sensorer og aktuatorer, der bruges, og de biblioteker, der interagerer med skyen. + +Opgaverne vil bruge [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) med [PlatformIO-udvidelsen til mikrocontroller-udvikling](https://platformio.org). Du kan også bruge Arduino IDE, hvis du er erfaren med dette værktøj, da der ikke vil blive givet instruktioner. + +### Single-board computer udviklersæt + +Hvis du er interesseret i at lære IoT-udvikling ved hjælp af single-board computere, kan du fuldføre opgaverne ved hjælp af en Raspberry Pi eller en virtuel enhed, der kører på din PC eller Mac. + +Du skal have en grundlæggende forståelse af Python-programmering, da lektionerne kun vil undervise i kode, der er relevant for de sensorer og aktuatorer, der bruges, og de biblioteker, der interagerer med skyen. + +> 💁 Hvis du vil lære at programmere i Python, kan du tjekke følgende to videoserier: +> +> * [Python for begyndere](https://channel9.msdn.com/Series/Intro-to-Python-Development?WT.mc_id=academic-17441-jabenn) +> * [Mere Python for begyndere](https://channel9.msdn.com/Series/More-Python-for-Beginners?WT.mc_id=academic-7372-jabenn) + +Opgaverne vil bruge [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn). + +Hvis du bruger en Raspberry Pi, kan du enten køre din Pi med den fulde desktopversion af Raspberry Pi OS og lave al kodning direkte på Pi'en ved hjælp af [Raspberry Pi OS-versionen af VS Code](https://code.visualstudio.com/docs/setup/raspberry-pi?WT.mc_id=academic-17441-jabenn), eller køre din Pi som en headless enhed og kode fra din PC eller Mac ved hjælp af VS Code med [Remote SSH-udvidelsen](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn), der giver dig mulighed for at forbinde til din Pi og redigere, debugge og køre kode, som om du kodede direkte på den. + +Hvis du bruger den virtuelle enhedsmulighed, vil du kode direkte på din computer. I stedet for at tilgå sensorer og aktuatorer vil du bruge et værktøj til at simulere denne hardware, der leverer sensorværdier, som du kan definere, og viser resultaterne af aktuatorer på skærmen. + +## Opsæt din enhed + +Før du kan komme i gang med at programmere din IoT-enhed, skal du lave en lille opsætning. Følg de relevante instruktioner nedenfor afhængigt af, hvilken enhed du vil bruge. +> 💁 Hvis du endnu ikke har en enhed, kan du se [hardwareguiden](../../../hardware.md) for at få hjælp til at beslutte, hvilken enhed du vil bruge, og hvilket ekstra hardware du skal købe. Du behøver ikke at købe hardware, da alle projekterne kan køre på virtuel hardware. +Disse instruktioner inkluderer links til tredjepartswebsites fra skaberne af den hardware eller de værktøjer, du vil bruge. Dette er for at sikre, at du altid bruger de mest opdaterede instruktioner til de forskellige værktøjer og hardware. + +Gennemgå den relevante vejledning for at opsætte din enhed og fuldføre et 'Hello World'-projekt. Dette vil være det første skridt i at skabe en IoT-natlampe over de 4 lektioner i denne introduktionsdel. + +* [Arduino - Wio Terminal](wio-terminal.md) +* [Single-board computer - Raspberry Pi](pi.md) +* [Single-board computer - Virtuel enhed](virtual-device.md) + +✅ Du vil bruge VS Code til både Arduino og single-board computere. Hvis du ikke har brugt det før, kan du læse mere om det på [VS Code-siden](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) + +## Anvendelser af IoT + +IoT dækker et enormt udvalg af anvendelsesområder, fordelt på nogle brede kategorier: + +* Forbruger-IoT +* Kommerciel IoT +* Industriel IoT +* Infrastruktur-IoT + +✅ Lav lidt research: Find et konkret eksempel for hver af de områder, der er beskrevet nedenfor, som ikke er nævnt i teksten. + +### Forbruger-IoT + +Forbruger-IoT refererer til IoT-enheder, som forbrugere køber og bruger i hjemmet. Nogle af disse enheder er utroligt nyttige, såsom smarte højttalere, smarte varmesystemer og robotstøvsugere. Andre er mere tvivlsomme i deres nytte, såsom stemmestyrede vandhaner, der gør det umuligt at slukke for vandet, fordi stemmestyringen ikke kan høre dig over lyden af rindende vand. + +Forbruger-IoT-enheder giver folk mulighed for at opnå mere i deres omgivelser, især de 1 milliard mennesker, der har en funktionsnedsættelse. Robotstøvsugere kan give rene gulve til personer med mobilitetsproblemer, der ikke selv kan støvsuge, stemmestyrede ovne giver personer med begrænset syn eller motorisk kontrol mulighed for at opvarme deres ovne med kun deres stemme, og sundhedsmonitorer giver patienter mulighed for at overvåge kroniske tilstande med mere regelmæssige og detaljerede opdateringer om deres helbred. Disse enheder bliver så udbredte, at selv små børn bruger dem som en del af deres daglige liv, for eksempel elever, der under COVID-pandemien satte timere på smarte hjemmeenheder for at holde styr på deres skolearbejde eller alarmer for at minde dem om kommende klassemøder. + +✅ Hvilke forbruger-IoT-enheder har du på dig eller i dit hjem? + +### Kommerciel IoT + +Kommerciel IoT dækker brugen af IoT på arbejdspladsen. På et kontor kan der være sensorer for tilstedeværelse og bevægelsesdetektorer til at styre belysning og opvarmning, så lys og varme kun er tændt, når det er nødvendigt, hvilket reducerer omkostninger og CO2-udledning. På en fabrik kan IoT-enheder overvåge sikkerhedsrisici, såsom arbejdere, der ikke bærer sikkerhedshjelme, eller støjniveauer, der er blevet farlige. I detailhandlen kan IoT-enheder måle temperaturen i køleopbevaring og advare butiksejeren, hvis et køleskab eller en fryser er uden for det krævede temperaturområde, eller de kan overvåge varer på hylderne for at dirigere medarbejdere til at genopfylde produkter, der er blevet solgt. Transportindustrien bruger i stigende grad IoT til at overvåge køretøjers placering, spore kørte kilometer for vejafgifter, overvåge chaufførers arbejdstimer og pauser eller give besked til personalet, når et køretøj nærmer sig en terminal for at forberede lastning eller losning. + +✅ Hvilke kommercielle IoT-enheder har du på din skole eller arbejdsplads? + +### Industriel IoT (IIoT) + +Industriel IoT, eller IIoT, er brugen af IoT-enheder til at styre og administrere maskiner i stor skala. Dette dækker en bred vifte af anvendelsesområder, fra fabrikker til digitalt landbrug. + +Fabrikker bruger IoT-enheder på mange forskellige måder. Maskiner kan overvåges med flere sensorer for at spore ting som temperatur, vibration og rotationshastighed. Disse data kan derefter overvåges for at stoppe maskinen, hvis den går uden for visse tolerancer - for eksempel hvis den bliver for varm og skal slukkes. Disse data kan også indsamles og analyseres over tid for at udføre prædiktiv vedligeholdelse, hvor AI-modeller analyserer dataene op til en fejl og bruger det til at forudsige andre fejl, før de opstår. + +Digitalt landbrug er vigtigt, hvis planeten skal brødføde den voksende befolkning, især de 2 milliarder mennesker i 500 millioner husstande, der lever af [subsistenslandbrug](https://wikipedia.org/wiki/Subsistence_agriculture). Digitalt landbrug kan variere fra få sensorer til få dollars til massive kommercielle opsætninger. En landmand kan starte med at overvåge temperaturer og bruge [vækstgrad-dage](https://wikipedia.org/wiki/Growing_degree-day) til at forudsige, hvornår en afgrøde vil være klar til høst. De kan forbinde jordfugtighedsmonitorer til automatiske vandingssystemer for at give deres planter så meget vand, som de har brug for, men ikke mere, for at sikre, at deres afgrøder ikke tørrer ud uden at spilde vand. Landmænd går endda videre og bruger droner, satellitdata og AI til at overvåge afgrødeudvikling, sygdomme og jordkvalitet over store områder af landbrugsjord. + +✅ Hvilke andre IoT-enheder kunne hjælpe landmænd? + +### Infrastruktur-IoT + +Infrastruktur-IoT handler om at overvåge og styre den lokale og globale infrastruktur, som folk bruger hver dag. + +[Smart Cities](https://wikipedia.org/wiki/Smart_city) er byområder, der bruger IoT-enheder til at indsamle data om byen og bruge det til at forbedre, hvordan byen fungerer. Disse byer drives normalt med samarbejder mellem lokale myndigheder, akademia og lokale virksomheder, der sporer og styrer ting som transport, parkering og forurening. For eksempel er luftforurening vigtigt for beboerne i København, Danmark, så det måles, og dataene bruges til at give information om de reneste cykel- og løberuter. + +[Smart power grids](https://wikipedia.org/wiki/Smart_grid) giver bedre analyser af energibehov ved at indsamle brugsdata på niveau med individuelle hjem. Disse data kan vejlede beslutninger på landsniveau, herunder hvor nye kraftværker skal bygges, og på personligt niveau ved at give brugerne indsigt i, hvor meget strøm de bruger, hvornår de bruger den, og endda forslag til, hvordan de kan reducere omkostninger, såsom at oplade elektriske biler om natten. + +✅ Hvis du kunne tilføje IoT-enheder til at måle noget der, hvor du bor, hvad skulle det være? + +## Eksempler på IoT-enheder, du måske har omkring dig + +Du vil blive overrasket over, hvor mange IoT-enheder du har omkring dig. Jeg skriver dette hjemmefra, og jeg har følgende enheder forbundet til internettet med smarte funktioner såsom app-styring, stemmestyring eller evnen til at sende data til mig via min telefon: + +* Flere smarte højttalere +* Køleskab, opvaskemaskine, ovn og mikrobølgeovn +* Elektricitetsmonitor til solpaneler +* Smarte stik +* Videodørklokke og sikkerhedskameraer +* Smart termostat med flere smarte rumfølere +* Garageportåbner +* Hjemmeunderholdningssystemer og stemmestyrede TV'er +* Lys +* Fitness- og sundhedstrackere + +Alle disse typer enheder har sensorer og/eller aktuatorer og kommunikerer med internettet. Jeg kan fra min telefon se, om min garageport er åben, og bede min smarte højttaler om at lukke den for mig. Jeg kan endda sætte den på en timer, så hvis den stadig er åben om natten, lukker den automatisk. Når min dørklokke ringer, kan jeg se fra min telefon, hvem der er der, uanset hvor jeg er i verden, og tale med dem via en højttaler og mikrofon indbygget i dørklokken. Jeg kan overvåge mit blodsukker, min puls og mine søvnmønstre og lede efter mønstre i dataene for at forbedre mit helbred. Jeg kan styre mine lys via skyen og sidde i mørke, når min internetforbindelse går ned. + +--- + +## 🚀 Udfordring + +Lav en liste over så mange IoT-enheder som muligt, der er i dit hjem, din skole eller din arbejdsplads - der er måske flere, end du tror! + +## Quiz efter lektionen + +[Quiz efter lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/2) + +## Gennemgang & Selvstudie + +Læs om fordelene og fejltagelserne ved forbruger-IoT-projekter. Tjek nyhedssider for artikler om, hvornår det er gået galt, såsom privatlivsproblemer, hardwareproblemer eller problemer forårsaget af manglende forbindelse. + +Nogle eksempler: + +* Tjek Twitter-kontoen **[Internet of Sh*t](https://twitter.com/internetofshit)** *(advarsel om bandeord)* for nogle gode eksempler på fejltagelser med forbruger-IoT. +* [c|net - Mit Apple Watch reddede mit liv: 5 personer deler deres historier](https://www.cnet.com/news/apple-watch-lifesaving-health-features-read-5-peoples-stories/) +* [c|net - ADT-tekniker erkender sig skyldig i at have spioneret på kunders kamerafeeds i årevis](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on-customer-camera-feeds-for-years/) *(advarsel - ikke-samtykkebaseret voyeurisme)* + +## Opgave + +[Undersøg et IoT-projekt](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/1-introduction-to-iot/assignment.md b/translations/da/1-getting-started/lessons/1-introduction-to-iot/assignment.md new file mode 100644 index 00000000..df04b2d9 --- /dev/null +++ b/translations/da/1-getting-started/lessons/1-introduction-to-iot/assignment.md @@ -0,0 +1,27 @@ + +# Undersøg et IoT-projekt + +## Instruktioner + +Der bliver globalt implementeret mange store og små IoT-projekter, fra smarte landbrug til smarte byer, inden for sundhedsovervågning, transport og brug af offentlige områder. + +Søg på nettet efter detaljer om et projekt, der interesserer dig, helst et tæt på hvor du bor. Forklar fordelene og ulemperne ved projektet, såsom hvilke fordele det medfører, eventuelle problemer det skaber, og hvordan privatliv bliver taget i betragtning. + +## Bedømmelseskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Forklar fordelene og ulemperne | Gav en klar forklaring af projektets fordele og ulemper | Gav en kort forklaring af projektets fordele og ulemper | Forklarede ikke projektets fordele eller ulemper | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/1-introduction-to-iot/pi.md b/translations/da/1-getting-started/lessons/1-introduction-to-iot/pi.md new file mode 100644 index 00000000..974a2d4e --- /dev/null +++ b/translations/da/1-getting-started/lessons/1-introduction-to-iot/pi.md @@ -0,0 +1,286 @@ + +# Raspberry Pi + +[Raspberry Pi](https://raspberrypi.org) er en enkeltbrætscomputer. Du kan tilføje sensorer og aktuatorer ved hjælp af en bred vifte af enheder og økosystemer, og i disse lektioner bruger vi et hardware-økosystem kaldet [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html). Du vil programmere din Pi og tilgå Grove-sensorerne ved hjælp af Python. + +![En Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.da.jpg) + +## Opsætning + +Hvis du bruger en Raspberry Pi som din IoT-hardware, har du to muligheder - du kan gennemgå alle disse lektioner og programmere direkte på Pi'en, eller du kan oprette fjernforbindelse til en 'headless' Pi og programmere fra din computer. + +Før du begynder, skal du også tilslutte Grove Base Hat til din Pi. + +### Opgave - opsætning + +Installer Grove Base Hat på din Pi og konfigurer Pi'en. + +1. Tilslut Grove Base Hat til din Pi. Stikket på hatten passer over alle GPIO-pins på Pi'en og glider helt ned på pinsene, så den sidder fast på basen. Den dækker Pi'en. + + ![Montering af Grove Hat](../../../../../images/pi-grove-hat-fitting.gif) + +1. Beslut, hvordan du vil programmere din Pi, og gå til den relevante sektion nedenfor: + + * [Arbejd direkte på din Pi](../../../../../1-getting-started/lessons/1-introduction-to-iot) + * [Fjernadgang til at programmere Pi'en](../../../../../1-getting-started/lessons/1-introduction-to-iot) + +### Arbejd direkte på din Pi + +Hvis du vil arbejde direkte på din Pi, kan du bruge desktopversionen af Raspberry Pi OS og installere alle de nødvendige værktøjer. + +#### Opgave - arbejd direkte på din Pi + +Opsæt din Pi til udvikling. + +1. Følg instruktionerne i [Raspberry Pi opsætningsguiden](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up) for at opsætte din Pi, tilslutte den til et tastatur/mus/skærm, tilslutte den til dit WiFi- eller ethernet-netværk og opdatere softwaren. + +For at programmere Pi'en med Grove-sensorer og aktuatorer skal du installere en editor til at skrive enhedskoden samt forskellige biblioteker og værktøjer, der interagerer med Grove-hardware. + +1. Når din Pi er genstartet, skal du starte Terminalen ved at klikke på **Terminal**-ikonet i topmenuen eller vælge *Menu -> Accessories -> Terminal*. + +1. Kør følgende kommando for at sikre, at operativsystemet og den installerede software er opdateret: + + ```sh + sudo apt update && sudo apt full-upgrade --yes + ``` + +1. Kør følgende kommandoer for at installere alle nødvendige biblioteker til Grove-hardware: + + ```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 + ``` + + Dette starter med at installere Git sammen med Pip til installation af Python-pakker. + + En af de stærke funktioner ved Python er muligheden for at installere [Pip-pakker](https://pypi.org) - disse er pakker med kode skrevet af andre og offentliggjort på internettet. Du kan installere en Pip-pakke på din computer med én kommando og derefter bruge den pakke i din kode. + + Seeed Grove Python-pakkerne skal installeres fra kildekoden. Disse kommandoer kloner repoen, der indeholder kildekoden til denne pakke, og installerer den derefter lokalt. + + > 💁 Som standard, når du installerer en pakke, er den tilgængelig overalt på din computer, hvilket kan føre til problemer med pakkeversioner - som når en applikation afhænger af én version af en pakke, der bryder, når du installerer en ny version til en anden applikation. For at omgå dette problem kan du bruge et [Python-virtuelt miljø](https://docs.python.org/3/library/venv.html), som i bund og grund er en kopi af Python i en dedikeret mappe, og når du installerer Pip-pakker, bliver de kun installeret i den mappe. Du vil ikke bruge virtuelle miljøer, når du bruger din Pi. Grove-installationsscriptet installerer Grove Python-pakkerne globalt, så for at bruge et virtuelt miljø skal du opsætte et virtuelt miljø og derefter manuelt geninstallere Grove-pakkerne i det miljø. Det er nemmere bare at bruge globale pakker, især da mange Pi-udviklere vil genflashe et rent SD-kort til hvert projekt. + + Til sidst aktiveres I2C-grænsefladen. + +1. Genstart Pi'en enten via menuen eller ved at køre følgende kommando i Terminalen: + + ```sh + sudo reboot + ``` + +1. Når Pi'en er genstartet, skal du genstarte Terminalen og køre følgende kommando for at installere [Visual Studio Code (VS Code)](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) - dette er editoren, du vil bruge til at skrive din enhedskode i Python. + + ```sh + sudo apt install code + ``` + + Når dette er installeret, vil VS Code være tilgængelig fra topmenuen. + + > 💁 Du er fri til at bruge enhver Python IDE eller editor til disse lektioner, hvis du har et foretrukket værktøj, men lektionerne vil give instruktioner baseret på brugen af VS Code. + +1. Installer Pylance. Dette er en udvidelse til VS Code, der giver Python-sprogsupport. Se [Pylance-udvidelsesdokumentationen](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) for instruktioner om installation af denne udvidelse i VS Code. + +### Fjernadgang til at programmere Pi'en + +I stedet for at programmere direkte på Pi'en kan den køre 'headless', det vil sige uden at være tilsluttet et tastatur/mus/skærm, og du kan konfigurere og programmere den fra din computer ved hjælp af Visual Studio Code. + +#### Opsæt Pi OS + +For at programmere eksternt skal Pi OS installeres på et SD-kort. + +##### Opgave - opsæt Pi OS + +Opsæt det headless Pi OS. + +1. Download **Raspberry Pi Imager** fra [Raspberry Pi OS software-siden](https://www.raspberrypi.org/software/) og installer det. + +1. Indsæt et SD-kort i din computer, brug en adapter hvis nødvendigt. + +1. Start Raspberry Pi Imager. + +1. Fra Raspberry Pi Imager skal du vælge knappen **CHOOSE OS**, derefter vælge *Raspberry Pi OS (Other)*, efterfulgt af *Raspberry Pi OS Lite (32-bit)*. + + ![Raspberry Pi Imager med Raspberry Pi OS Lite valgt](../../../../../translated_images/raspberry-pi-imager.24aedeab9e233d841a1504ed7cfeb871b1f8e1134cfcd8370e7f60a092056be2.da.png) + + > 💁 Raspberry Pi OS Lite er en version af Raspberry Pi OS, der ikke har desktop-UI eller UI-baserede værktøjer. Disse er ikke nødvendige for en headless Pi og gør installationen mindre og opstartstiden hurtigere. + +1. Vælg knappen **CHOOSE STORAGE**, og vælg derefter dit SD-kort. + +1. Start **Advanced Options** ved at trykke på `Ctrl+Shift+X`. Disse muligheder tillader en vis forudkonfiguration af Raspberry Pi OS, før det bliver skrevet til SD-kortet. + + 1. Marker afkrydsningsfeltet **Enable SSH**, og indstil en adgangskode til brugeren `pi`. Dette er adgangskoden, du vil bruge til at logge ind på Pi'en senere. + + 1. Hvis du planlægger at tilslutte Pi'en via WiFi, skal du markere afkrydsningsfeltet **Configure WiFi** og indtaste dit WiFi SSID og adgangskode samt vælge dit WiFi-land. Du behøver ikke gøre dette, hvis du vil bruge et ethernet-kabel. Sørg for, at det netværk, du tilslutter til, er det samme som din computer er på. + + 1. Marker afkrydsningsfeltet **Set locale settings**, og indstil dit land og tidszone. + + 1. Vælg knappen **SAVE**. + +1. Vælg knappen **WRITE** for at skrive OS til SD-kortet. Hvis du bruger macOS, vil du blive bedt om at indtaste din adgangskode, da det underliggende værktøj, der skriver diskbilleder, kræver privilegeret adgang. + +Operativsystemet vil blive skrevet til SD-kortet, og når det er færdigt, vil kortet blive skubbet ud af operativsystemet, og du vil blive underrettet. Fjern SD-kortet fra din computer, indsæt det i Pi'en, tænd for Pi'en og vent cirka 2 minutter, så den kan starte korrekt. + +#### Tilslut til Pi'en + +Næste trin er at få fjernadgang til Pi'en. Dette kan gøres ved hjælp af `ssh`, som er tilgængelig på macOS, Linux og nyere versioner af Windows. + +##### Opgave - tilslut til Pi'en + +Få fjernadgang til Pi'en. + +1. Start en Terminal eller Kommandoprompt, og indtast følgende kommando for at tilslutte til Pi'en: + + ```sh + ssh pi@raspberrypi.local + ``` + + Hvis du bruger Windows med en ældre version, der ikke har `ssh` installeret, kan du bruge OpenSSH. Du kan finde installationsinstruktionerne i [OpenSSH installationsdokumentationen](https://docs.microsoft.com//windows-server/administration/openssh/openssh_install_firstuse?WT.mc_id=academic-17441-jabenn). + +1. Dette bør tilslutte til din Pi og bede om adgangskoden. + + At kunne finde computere på dit netværk ved hjælp af `.local` er en forholdsvis ny funktion i Linux og Windows. Hvis du bruger Linux eller Windows og får fejl om, at værtsnavnet ikke kan findes, skal du installere yderligere software for at aktivere ZeroConf-netværk (også kaldet Bonjour af Apple): + + 1. Hvis du bruger Linux, skal du installere Avahi ved hjælp af følgende kommando: + + ```sh + sudo apt-get install avahi-daemon + ``` + + 1. Hvis du bruger Windows, er den nemmeste måde at aktivere ZeroConf på at installere [Bonjour Print Services for Windows](http://support.apple.com/kb/DL999). Du kan også installere [iTunes for Windows](https://www.apple.com/itunes/download/) for at få en nyere version af værktøjet (som ikke er tilgængelig separat). + + > 💁 Hvis du ikke kan tilslutte ved hjælp af `raspberrypi.local`, kan du bruge IP-adressen på din Pi. Se [Raspberry Pi IP-adresse dokumentationen](https://www.raspberrypi.org/documentation/remote-access/ip-address.md) for instruktioner om flere måder at finde IP-adressen på. + +1. Indtast den adgangskode, du indstillede i Raspberry Pi Imager Advanced Options. + +#### Konfigurer software på Pi'en + +Når du er tilsluttet Pi'en, skal du sikre dig, at operativsystemet er opdateret, og installere forskellige biblioteker og værktøjer, der interagerer med Grove-hardware. + +##### Opgave - konfigurer software på Pi'en + +Konfigurer den installerede Pi-software og installer Grove-bibliotekerne. + +1. Fra din `ssh`-session skal du køre følgende kommando for at opdatere og derefter genstarte Pi'en: + + ```sh + sudo apt update && sudo apt full-upgrade --yes && sudo reboot + ``` + + Pi'en vil blive opdateret og genstartet. `ssh`-sessionen afsluttes, når Pi'en genstartes, så vent cirka 30 sekunder og tilslut igen. + +1. Fra den genoprettede `ssh`-session skal du køre følgende kommandoer for at installere alle nødvendige biblioteker til Grove-hardware: + + ```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 + ``` + + Dette starter med at installere Git sammen med Pip til installation af Python-pakker. + + En af de stærke funktioner ved Python er muligheden for at installere [Pip-pakker](https://pypi.org) - disse er pakker med kode skrevet af andre og offentliggjort på internettet. Du kan installere en Pip-pakke på din computer med én kommando og derefter bruge den pakke i din kode. + + Seeed Grove Python-pakkerne skal installeres fra kildekoden. Disse kommandoer kloner repoen, der indeholder kildekoden til denne pakke, og installerer den derefter lokalt. + + > 💁 Som standard, når du installerer en pakke, er den tilgængelig overalt på din computer, hvilket kan føre til problemer med pakkeversioner - som når en applikation afhænger af én version af en pakke, der bryder, når du installerer en ny version til en anden applikation. For at omgå dette problem kan du bruge et [Python-virtuelt miljø](https://docs.python.org/3/library/venv.html), som i bund og grund er en kopi af Python i en dedikeret mappe, og når du installerer Pip-pakker, bliver de kun installeret i den mappe. Du vil ikke bruge virtuelle miljøer, når du bruger din Pi. Grove-installationsscriptet installerer Grove Python-pakkerne globalt, så for at bruge et virtuelt miljø skal du opsætte et virtuelt miljø og derefter manuelt geninstallere Grove-pakkerne i det miljø. Det er nemmere bare at bruge globale pakker, især da mange Pi-udviklere vil genflashe et rent SD-kort til hvert projekt. + + Til sidst aktiveres I2C-grænsefladen. + +1. Genstart Pi'en ved at køre følgende kommando: + + ```sh + sudo reboot + ``` + + `ssh`-sessionen afsluttes, når Pi'en genstartes. Der er ingen grund til at tilslutte igen. + +#### Konfigurer VS Code til fjernadgang + +Når Pi'en er konfigureret, kan du tilslutte til den ved hjælp af Visual Studio Code (VS Code) fra din computer - dette er en gratis udviklerteksteditor, som du vil bruge til at skrive din enhedskode i Python. + +##### Opgave - konfigurer VS Code til fjernadgang + +Installer den nødvendige software og tilslut eksternt til din Pi. + +1. Installer VS Code på din computer ved at følge [VS Code dokumentationen](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn). + +1. Følg instruktionerne i [VS Code Remote Development using SSH dokumentationen](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn) for at installere de nødvendige komponenter. + +1. Følg de samme instruktioner for at tilslutte VS Code til Pi'en. + +1. Når du er tilsluttet, skal du følge instruktionerne i [managing extensions](https://code.visualstudio.com/docs/remote/ssh#_managing-extensions?WT.mc_id=academic-17441-jabenn) for at installere [Pylance-udvidelsen](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) eksternt på Pi'en. + +## Hello world +Det er traditionelt, når man starter med et nyt programmeringssprog eller en ny teknologi, at lave en 'Hello World'-applikation - en lille applikation, der viser noget som teksten `"Hello World"` for at bekræfte, at alle værktøjer er korrekt konfigureret. + +Hello World-appen til Pi vil sikre, at du har Python og Visual Studio Code korrekt installeret. + +Denne app vil være i en mappe kaldet `nightlight`, og den vil blive genbrugt med forskellig kode i senere dele af denne opgave for at bygge natlygsapplikationen. + +### Opgave - hello world + +Lav Hello World-appen. + +1. Start VS Code, enten direkte på Pi'en eller på din computer og forbundet til Pi'en ved hjælp af Remote SSH-udvidelsen. + +1. Åbn VS Code-terminalen ved at vælge *Terminal -> New Terminal* eller ved at trykke `` CTRL+` ``. Den vil åbne i `pi`-brugerens hjemmemappe. + +1. Kør følgende kommandoer for at oprette en mappe til din kode og oprette en Python-fil kaldet `app.py` inde i den mappe: + + ```sh + mkdir nightlight + cd nightlight + touch app.py + ``` + +1. Åbn denne mappe i VS Code ved at vælge *File -> Open...* og vælge *nightlight*-mappen, og vælg derefter **OK**. + + ![VS Code-åbningsdialogen, der viser nightlight-mappen](../../../../../translated_images/vscode-open-nightlight-remote.d3d2a4011e30d535c4b70084f6e94bf6b5b1327fd8e77affe64465ac151ee766.da.png) + +1. Åbn `app.py`-filen fra VS Code-udforskeren, og tilføj følgende kode: + + ```python + print('Hello World!') + ``` + + `print`-funktionen udskriver det, der bliver sendt til den, i konsollen. + +1. Fra VS Code-terminalen skal du køre følgende for at køre din Python-app: + + ```sh + python app.py + ``` + + > 💁 Du skal muligvis eksplicit kalde `python3` for at køre denne kode, hvis du har Python 2 installeret ud over Python 3 (den nyeste version). Hvis du har Python 2 installeret, vil kaldet `python` bruge Python 2 i stedet for Python 3. Som standard har de nyeste versioner af Raspberry Pi OS kun Python 3 installeret. + + Følgende output vil vises i terminalen: + + ```output + pi@raspberrypi:~/nightlight $ python3 app.py + Hello World! + ``` + +> 💁 Du kan finde denne kode i [code/pi](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/pi)-mappen. + +😀 Dit 'Hello World'-program var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md b/translations/da/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md new file mode 100644 index 00000000..c9fbb14e --- /dev/null +++ b/translations/da/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md @@ -0,0 +1,245 @@ + +# Virtuel single-board computer + +I stedet for at købe en IoT-enhed sammen med sensorer og aktuatorer, kan du bruge din computer til at simulere IoT-hardware. [CounterFit-projektet](https://github.com/CounterFit-IoT/CounterFit) giver dig mulighed for at køre en app lokalt, der simulerer IoT-hardware såsom sensorer og aktuatorer, og få adgang til sensorer og aktuatorer fra lokal Python-kode, som er skrevet på samme måde som den kode, du ville skrive på en Raspberry Pi med fysisk hardware. + +## Opsætning + +For at bruge CounterFit skal du installere noget gratis software på din computer. + +### Opgave + +Installer den nødvendige software. + +1. Installer Python. Se [Python downloads-siden](https://www.python.org/downloads/) for instruktioner om, hvordan du installerer den nyeste version af Python. + +1. Installer Visual Studio Code (VS Code). Dette er den editor, du vil bruge til at skrive din virtuelle enhedskode i Python. Se [VS Code-dokumentationen](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) for instruktioner om, hvordan du installerer VS Code. + + > 💁 Du er fri til at bruge enhver Python IDE eller editor til disse lektioner, hvis du har et foretrukket værktøj, men lektionerne vil give instruktioner baseret på brugen af VS Code. + +1. Installer VS Code Pylance-udvidelsen. Dette er en udvidelse til VS Code, der giver understøttelse af Python-sproget. Se [Pylance-udvidelsesdokumentationen](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) for instruktioner om, hvordan du installerer denne udvidelse i VS Code. + +Instruktionerne til at installere og konfigurere CounterFit-appen vil blive givet på det relevante tidspunkt i opgaveinstruktionerne, da den installeres på projektbasis. + +## Hello world + +Det er traditionelt, når man starter med et nyt programmeringssprog eller en ny teknologi, at lave en 'Hello World'-applikation - en lille applikation, der viser noget som teksten `"Hello World"` for at demonstrere, at alle værktøjer er korrekt konfigureret. + +Hello World-appen for den virtuelle IoT-hardware vil sikre, at du har Python og Visual Studio Code korrekt installeret. Den vil også oprette forbindelse til CounterFit for de virtuelle IoT-sensorer og aktuatorer. Den vil ikke bruge nogen hardware, den vil blot oprette forbindelse for at bevise, at alt fungerer. + +Denne app vil være i en mappe kaldet `nightlight`, og den vil blive genbrugt med forskellig kode i senere dele af denne opgave for at bygge natlampe-applikationen. + +### Konfigurer et Python-virtuelt miljø + +En af de kraftfulde funktioner i Python er muligheden for at installere [Pip-pakker](https://pypi.org) - dette er pakker med kode skrevet af andre og offentliggjort på internettet. Du kan installere en Pip-pakke på din computer med én kommando og derefter bruge den pakke i din kode. Du vil bruge Pip til at installere en pakke til at kommunikere med CounterFit. + +Som standard, når du installerer en pakke, er den tilgængelig overalt på din computer, og dette kan føre til problemer med pakkeversioner - såsom en applikation, der afhænger af én version af en pakke, som bryder, når du installerer en ny version til en anden applikation. For at omgå dette problem kan du bruge et [Python-virtuelt miljø](https://docs.python.org/3/library/venv.html), som i bund og grund er en kopi af Python i en dedikeret mappe, og når du installerer Pip-pakker, bliver de kun installeret i den mappe. + +> 💁 Hvis du bruger en Raspberry Pi, har du ikke oprettet et virtuelt miljø på den enhed til at administrere Pip-pakker, i stedet bruger du globale pakker, da Grove-pakkerne er installeret globalt af installationsscriptet. + +#### Opgave - konfigurer et Python-virtuelt miljø + +Konfigurer et Python-virtuelt miljø og installer Pip-pakkerne til CounterFit. + +1. Fra din terminal eller kommandolinje skal du køre følgende på et sted efter eget valg for at oprette og navigere til en ny mappe: + + ```sh + mkdir nightlight + cd nightlight + ``` + +1. Kør nu følgende for at oprette et virtuelt miljø i `.venv`-mappen: + + ```sh + python3 -m venv .venv + ``` + + > 💁 Du skal eksplicit kalde `python3` for at oprette det virtuelle miljø, i tilfælde af at du har Python 2 installeret ud over Python 3 (den nyeste version). Hvis du har Python 2 installeret, vil kaldet `python` bruge Python 2 i stedet for Python 3. + +1. Aktiver det virtuelle miljø: + + * På Windows: + * Hvis du bruger Command Prompt eller Command Prompt gennem Windows Terminal, skal du køre: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Hvis du bruger PowerShell, skal du køre: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + > Hvis du får en fejl om, at kørsel af scripts er deaktiveret på dette system, skal du aktivere kørsel af scripts ved at indstille en passende eksekveringspolitik. Du kan gøre dette ved at starte PowerShell som administrator og derefter køre følgende kommando: + + ```powershell + Set-ExecutionPolicy -ExecutionPolicy Unrestricted + ``` + + Indtast `Y`, når du bliver bedt om at bekræfte. Genstart derefter PowerShell og prøv igen. + + Du kan nulstille denne eksekveringspolitik på et senere tidspunkt, hvis det er nødvendigt. Du kan læse mere om dette på [Execution Policies-siden på Microsoft Docs](https://docs.microsoft.com/powershell/module/microsoft.powershell.core/about/about_execution_policies?WT.mc_id=academic-17441-jabenn). + + * På macOS eller Linux skal du køre: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Disse kommandoer skal køres fra samme placering, som du kørte kommandoen for at oprette det virtuelle miljø. Du behøver aldrig navigere ind i `.venv`-mappen, du skal altid køre aktiveringskommandoen og eventuelle kommandoer for at installere pakker eller køre kode fra den mappe, du var i, da du oprettede det virtuelle miljø. + +1. Når det virtuelle miljø er aktiveret, vil standardkommandoen `python` køre den version af Python, der blev brugt til at oprette det virtuelle miljø. Kør følgende for at få versionen: + + ```sh + python --version + ``` + + Outputtet skal indeholde følgende: + + ```output + (.venv) ➜ nightlight python --version + Python 3.9.1 + ``` + + > 💁 Din Python-version kan være anderledes - så længe det er version 3.6 eller højere, er du godt kørende. Hvis ikke, skal du slette denne mappe, installere en nyere version af Python og prøve igen. + +1. Kør følgende kommandoer for at installere Pip-pakkerne til CounterFit. Disse pakker inkluderer hovedappen CounterFit samt shims til Grove-hardware. Disse shims giver dig mulighed for at skrive kode, som om du programmerede med fysiske sensorer og aktuatorer fra Grove-økosystemet, men forbundet til virtuelle IoT-enheder. + + ```sh + pip install CounterFit + pip install counterfit-connection + pip install counterfit-shims-grove + ``` + + Disse Pip-pakker vil kun blive installeret i det virtuelle miljø og vil ikke være tilgængelige uden for dette. + +### Skriv koden + +Når det virtuelle Python-miljø er klar, kan du skrive koden til 'Hello World'-applikationen. + +#### Opgave - skriv koden + +Opret en Python-applikation, der udskriver `"Hello World"` til konsollen. + +1. Fra din terminal eller kommandolinje skal du køre følgende inde i det virtuelle miljø for at oprette en Python-fil kaldet `app.py`: + + * Fra Windows skal du køre: + + ```cmd + type nul > app.py + ``` + + * På macOS eller Linux skal du køre: + + ```cmd + touch app.py + ``` + +1. Åbn den aktuelle mappe i VS Code: + + ```sh + code . + ``` + + > 💁 Hvis din terminal returnerer `command not found` på macOS, betyder det, at VS Code ikke er blevet tilføjet til din PATH. Du kan tilføje VS Code til din PATH ved at følge instruktionerne i [Launching from the command line-sektionen i VS Code-dokumentationen](https://code.visualstudio.com/docs/setup/mac?WT.mc_id=academic-17441-jabenn#_launching-from-the-command-line) og derefter køre kommandoen igen. VS Code tilføjes som standard til din PATH på Windows og Linux. + +1. Når VS Code starter, vil det aktivere det virtuelle Python-miljø. Det valgte virtuelle miljø vil vises i den nederste statuslinje: + + ![VS Code viser det valgte virtuelle miljø](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.da.png) + +1. Hvis VS Code-terminalen allerede kører, når VS Code starter op, vil den ikke have det virtuelle miljø aktiveret i sig. Det nemmeste er at lukke terminalen ved at bruge knappen **Kill the active terminal instance**: + + ![VS Code Kill the active terminal instance-knap](../../../../../translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.da.png) + + Du kan se, om terminalen har det virtuelle miljø aktiveret, da navnet på det virtuelle miljø vil være et præfiks på terminalprompten. For eksempel kan det være: + + ```sh + (.venv) ➜ nightlight + ``` + + Hvis du ikke har `.venv` som præfiks på prompten, er det virtuelle miljø ikke aktivt i terminalen. + +1. Start en ny VS Code-terminal ved at vælge *Terminal -> New Terminal*, eller ved at trykke på `` CTRL+` ``. Den nye terminal vil indlæse det virtuelle miljø, og kaldet til at aktivere dette vil vises i terminalen. Prompten vil også have navnet på det virtuelle miljø (`.venv`): + + ```output + ➜ nightlight source .venv/bin/activate + (.venv) ➜ nightlight + ``` + +1. Åbn `app.py`-filen fra VS Code-udforskeren og tilføj følgende kode: + + ```python + print('Hello World!') + ``` + + `print`-funktionen udskriver det, der bliver sendt til den, til konsollen. + +1. Fra VS Code-terminalen skal du køre følgende for at køre din Python-app: + + ```sh + python app.py + ``` + + Følgende vil være i outputtet: + + ```output + (.venv) ➜ nightlight python app.py + Hello World! + ``` + +😀 Dit 'Hello World'-program var en succes! + +### Tilslut 'hardwaren' + +Som et andet 'Hello World'-trin vil du køre CounterFit-appen og forbinde din kode til den. Dette er den virtuelle ækvivalent til at tilslutte noget IoT-hardware til et udviklingskit. + +#### Opgave - tilslut 'hardwaren' + +1. Fra VS Code-terminalen skal du starte CounterFit-appen med følgende kommando: + + ```sh + counterfit + ``` + + Appen vil begynde at køre og åbne i din webbrowser: + + ![CounterFit-appen kører i en browser](../../../../../translated_images/counterfit-first-run.433326358b669b31d0e99c3513cb01bfbb13724d162c99cdcc8f51ecf5f9c779.da.png) + + Den vil være markeret som *Disconnected*, med LED'en i øverste højre hjørne slukket. + +1. Tilføj følgende kode til toppen af `app.py`: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + + Denne kode importerer `CounterFitConnection`-klassen fra modulet `counterfit_connection`, som kommer fra Pip-pakken `counterfit-connection`, du installerede tidligere. Den initialiserer derefter en forbindelse til CounterFit-appen, der kører på `127.0.0.1`, som er en IP-adresse, du altid kan bruge til at få adgang til din lokale computer (ofte kaldet *localhost*), på port 5000. + + > 💁 Hvis du har andre apps, der kører på port 5000, kan du ændre dette ved at opdatere porten i koden og køre CounterFit ved hjælp af `CounterFit --port `, hvor `` erstattes med den port, du vil bruge. + +1. Du skal starte en ny VS Code-terminal ved at vælge knappen **Create a new integrated terminal**. Dette skyldes, at CounterFit-appen kører i den aktuelle terminal. + + ![VS Code Create a new integrated terminal-knap](../../../../../translated_images/vscode-new-terminal.77db8fc0f9cd31824b0e49a201beafe4ae4616d6c7339992cb2819e789b3eff9.da.png) + +1. I denne nye terminal skal du køre `app.py`-filen som før. Status for CounterFit vil ændre sig til **Connected**, og LED'en vil lyse op. + + ![CounterFit viser som connected](../../../../../translated_images/counterfit-connected.ed30b46d8f79b0921f3fc70be10366e596a89dca3f80c2224a9d9fc98fccf884.da.png) + +> 💁 Du kan finde denne kode i [code/virtual-device](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/virtual-device)-mappen. + +😀 Din forbindelse til hardwaren var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md b/translations/da/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md new file mode 100644 index 00000000..86a9e131 --- /dev/null +++ b/translations/da/1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md @@ -0,0 +1,222 @@ + +# Wio Terminal + +[Wio Terminal fra Seeed Studios](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) er en Arduino-kompatibel mikrocontroller med indbygget WiFi, sensorer og aktuatorer samt porte til at tilføje flere sensorer og aktuatorer via et hardwareøkosystem kaldet [Grove](https://www.seeedstudio.com/category/Grove-c-1003.html). + +![En Seeed Studios Wio Terminal](../../../../../translated_images/wio-terminal.b8299ee16587db9aa9e05fabf9721bccd9eb8fb541b7c1a8267241282d81b603.da.png) + +## Opsætning + +For at bruge din Wio Terminal skal du installere noget gratis software på din computer. Du skal også opdatere Wio Terminal-firmwaren, før du kan forbinde den til WiFi. + +### Opgave - opsætning + +Installer den nødvendige software og opdater firmwaren. + +1. Installer Visual Studio Code (VS Code). Dette er den editor, du vil bruge til at skrive din enhedskode i C/C++. Se [VS Code-dokumentationen](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) for instruktioner om installation af VS Code. + + > 💁 En anden populær IDE til Arduino-udvikling er [Arduino IDE](https://www.arduino.cc/en/software). Hvis du allerede er bekendt med dette værktøj, kan du bruge det i stedet for VS Code og PlatformIO, men lektionerne vil give instruktioner baseret på brugen af VS Code. + +1. Installer VS Code PlatformIO-udvidelsen. Dette er en udvidelse til VS Code, der understøtter programmering af mikrocontrollere i C/C++. Se [PlatformIO-udvidelsesdokumentationen](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=platformio.platformio-ide) for instruktioner om installation af denne udvidelse i VS Code. Denne udvidelse afhænger af Microsoft C/C++-udvidelsen for at arbejde med C- og C++-kode, og C/C++-udvidelsen installeres automatisk, når du installerer PlatformIO. + +1. Tilslut din Wio Terminal til din computer. Wio Terminal har en USB-C-port i bunden, som skal forbindes til en USB-port på din computer. Wio Terminal leveres med et USB-C til USB-A-kabel, men hvis din computer kun har USB-C-porte, skal du enten bruge et USB-C-kabel eller en USB-A til USB-C-adapter. + +1. Følg instruktionerne i [Wio Terminal Wiki WiFi Overview-dokumentationen](https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/) for at opsætte din Wio Terminal og opdatere firmwaren. + +## Hello World + +Det er traditionelt, når man starter med et nyt programmeringssprog eller en ny teknologi, at lave en 'Hello World'-applikation - en lille applikation, der viser tekst som `"Hello World"` for at sikre, at alle værktøjer er korrekt konfigureret. + +Hello World-appen til Wio Terminal vil sikre, at du har Visual Studio Code korrekt installeret med PlatformIO og opsat til mikrocontrollerudvikling. + +### Opret et PlatformIO-projekt + +Det første skridt er at oprette et nyt projekt ved hjælp af PlatformIO, konfigureret til Wio Terminal. + +#### Opgave - opret et PlatformIO-projekt + +Opret PlatformIO-projektet. + +1. Tilslut Wio Terminal til din computer + +1. Start VS Code + +1. PlatformIO-ikonet vil være på sidemenuen: + + ![PlatformIO-menuvalgmuligheden](../../../../../translated_images/vscode-platformio-menu.297be26b9733e5c4635d9d8e636e93fed2015809eafb7cc8fd409c37b3ef2ef5.da.png) + + Vælg dette menuemne, og vælg derefter *PIO Home -> Open* + + ![PlatformIO-åbningsvalgmuligheden](../../../../../translated_images/vscode-platformio-home-open.3f9a41bfd3f4da1c866ec3e69f1675faa30b823b5b58ab58ac88e5df9a85da19.da.png) + +1. Fra velkomstskærmen skal du vælge knappen **+ New Project** + + ![Knappen til nyt projekt](../../../../../translated_images/vscode-platformio-welcome-new-button.ba6fc8a4c7b78cc822e1ce47ba29c5db96668cce7c5f4adbfd2f1196422baa26.da.png) + +1. Konfigurer projektet i *Project Wizard*: + + 1. Navngiv dit projekt `nightlight` + + 1. Fra *Board*-dropdownmenuen skal du skrive `WIO` for at filtrere boards og vælge *Seeeduino Wio Terminal* + + 1. Lad *Framework* være *Arduino* + + 1. Enten lad *Use default location*-afkrydsningsfeltet være markeret, eller fjern markeringen og vælg en placering til dit projekt + + 1. Vælg knappen **Finish** + + ![Den færdige projektguide](../../../../../translated_images/vscode-platformio-nightlight-project-wizard.5c64db4da6037420827c2597507897233457210ee23975711fa2285efdcd0dc7.da.png) + + PlatformIO vil downloade de komponenter, der er nødvendige for at kompilere kode til Wio Terminal og oprette dit projekt. Dette kan tage et par minutter. + +### Undersøg PlatformIO-projektet + +VS Code-udforskeren vil vise en række filer og mapper, der er oprettet af PlatformIO-guiden. + +#### Mapper + +* `.pio` - denne mappe indeholder midlertidige data, der er nødvendige for PlatformIO, såsom biblioteker eller kompileret kode. Den genskabes automatisk, hvis den slettes, og du behøver ikke tilføje den til kildekodekontrol, hvis du deler dit projekt på sider som GitHub. +* `.vscode` - denne mappe indeholder konfigurationen, der bruges af PlatformIO og VS Code. Den genskabes automatisk, hvis den slettes, og du behøver ikke tilføje den til kildekodekontrol, hvis du deler dit projekt på sider som GitHub. +* `include` - denne mappe er til eksterne headerfiler, der er nødvendige, når du tilføjer yderligere biblioteker til din kode. Du vil ikke bruge denne mappe i nogen af disse lektioner. +* `lib` - denne mappe er til eksterne biblioteker, som du vil kalde fra din kode. Du vil ikke bruge denne mappe i nogen af disse lektioner. +* `src` - denne mappe indeholder hovedkildekoden til din applikation. Oprindeligt vil den indeholde en enkelt fil - `main.cpp`. +* `test` - denne mappe er, hvor du vil placere eventuelle enhedstests for din kode. + +#### Filer + +* `main.cpp` - denne fil i `src`-mappen indeholder indgangspunktet for din applikation. Åbn denne fil, og den vil indeholde følgende kode: + + ```cpp + #include + + void setup() { + // put your setup code here, to run once: + } + + void loop() { + // put your main code here, to run repeatedly: + } + ``` + + Når enheden starter op, vil Arduino-frameworket køre `setup`-funktionen én gang og derefter køre `loop`-funktionen gentagne gange, indtil enheden slukkes. + +* `.gitignore` - denne fil lister de filer og mapper, der skal ignoreres, når du tilføjer din kode til git kildekodekontrol, såsom upload til et repository på GitHub. + +* `platformio.ini` - denne fil indeholder konfigurationen for din enhed og app. Åbn denne fil, og den vil indeholde følgende kode: + + ```ini + [env:seeed_wio_terminal] + platform = atmelsam + board = seeed_wio_terminal + framework = arduino + ``` + + Sektionen `[env:seeed_wio_terminal]` har konfigurationen for Wio Terminal. Du kan have flere `env`-sektioner, så din kode kan kompileres til flere boards. + + De øvrige værdier matcher konfigurationen fra projektguiden: + + * `platform = atmelsam` definerer den hardware, som Wio Terminal bruger (en ATSAMD51-baseret mikrocontroller) + * `board = seeed_wio_terminal` definerer typen af mikrocontrollerboard (Wio Terminal) + * `framework = arduino` definerer, at dette projekt bruger Arduino-frameworket. + +### Skriv Hello World-appen + +Du er nu klar til at skrive Hello World-appen. + +#### Opgave - skriv Hello World-appen + +Skriv Hello World-appen. + +1. Åbn filen `main.cpp` i VS Code + +1. Ændr koden, så den matcher følgende: + + ```cpp + #include + + void setup() + { + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + } + + void loop() + { + Serial.println("Hello World"); + delay(5000); + } + ``` + + `setup`-funktionen initialiserer en forbindelse til den serielle port - i dette tilfælde USB-porten, der bruges til at forbinde Wio Terminal til din computer. Parameteren `9600` er [baudraten](https://wikipedia.org/wiki/Symbol_rate), eller hastigheden, som data sendes over den serielle port i bits per sekund. Denne indstilling betyder, at 9.600 bits (0'er og 1'er) data sendes hvert sekund. Den venter derefter på, at den serielle port er klar. + + `loop`-funktionen sender linjen `Hello World!` til den serielle port, så tegnene `Hello World!` sammen med et linjeskift. Den sover derefter i 5.000 millisekunder eller 5 sekunder. Efter `loop` afsluttes, køres den igen og igen, så længe mikrocontrolleren er tændt. + +1. Sæt din Wio Terminal i upload-tilstand. Du skal gøre dette hver gang, du uploader ny kode til enheden: + + 1. Træk hurtigt ned to gange på tænd/sluk-knappen - den springer tilbage til tændt position hver gang. + + 1. Tjek den blå status-LED til højre for USB-porten. Den skal pulsere. + + [![En video, der viser, hvordan man sætter Wio Terminal i upload-tilstand](https://img.youtube.com/vi/LeKU_7zLRrQ/0.jpg)](https://youtu.be/LeKU_7zLRrQ) + + Klik på billedet ovenfor for en video, der viser, hvordan man gør dette. + +1. Byg og upload koden til Wio Terminal + + 1. Åbn VS Code-kommandopaletten + + 1. Skriv `PlatformIO Upload` for at søge efter upload-muligheden, og vælg *PlatformIO: Upload* + + ![PlatformIO-upload-muligheden i kommandopaletten](../../../../../translated_images/vscode-platformio-upload-command-palette.9e0f49cf80d1f1c3eb5c6689b8705ad8b89f0374b21698e996fec11e4ed09347.da.png) + + PlatformIO vil automatisk bygge koden, hvis det er nødvendigt, før den uploades. + + 1. Koden vil blive kompileret og uploadet til Wio Terminal + + > 💁 Hvis du bruger macOS, vil en notifikation om *DISK NOT EJECTED PROPERLY* dukke op. Dette skyldes, at Wio Terminal bliver monteret som et drev som en del af flash-processen, og det afbrydes, når den kompilerede kode skrives til enheden. Du kan ignorere denne notifikation. + + ⚠️ Hvis du får fejl om, at upload-porten ikke er tilgængelig, skal du først sikre dig, at du har Wio Terminal tilsluttet din computer, tændt med kontakten på venstre side af skærmen og sat i upload-tilstand. Det grønne lys i bunden skal være tændt, og det blå lys skal pulsere. Hvis du stadig får fejlen, skal du trække tænd/sluk-knappen ned to gange hurtigt igen for at tvinge Wio Terminal i upload-tilstand og prøve uploaden igen. + +PlatformIO har en Serial Monitor, der kan overvåge data sendt over USB-kablet fra Wio Terminal. Dette giver dig mulighed for at overvåge de data, der sendes af `Serial.println("Hello World");`-kommandoen. + +1. Åbn VS Code-kommandopaletten + +1. Skriv `PlatformIO Serial` for at søge efter Serial Monitor-muligheden, og vælg *PlatformIO: Serial Monitor* + + ![PlatformIO Serial Monitor-muligheden i kommandopaletten](../../../../../translated_images/vscode-platformio-serial-monitor-command-palette.b348ec841b8a1c14af503d6fc0bf73c657c79c9acc12a6b6dd485ce3b5826f48.da.png) + + Et nyt terminalvindue åbnes, og data sendt over den serielle port vil blive streamet ind i dette terminalvindue: + + ```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` vil blive printet til den serielle monitor hvert 5. sekund. + +> 💁 Du kan finde denne kode i [code/wio-terminal](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/wio-terminal)-mappen. + +😀 Din 'Hello World'-program var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/2-deeper-dive/README.md b/translations/da/1-getting-started/lessons/2-deeper-dive/README.md new file mode 100644 index 00000000..1089f41a --- /dev/null +++ b/translations/da/1-getting-started/lessons/2-deeper-dive/README.md @@ -0,0 +1,277 @@ + +# En dybere indsigt i IoT + +![En sketchnote oversigt over denne lektion](../../../../../translated_images/lesson-2.324b0580d620c25e0a24fb7fddfc0b29a846dd4b82c08e7a9466d580ee78ce51.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +Denne lektion blev undervist som en del af [Hello IoT-serien](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) fra [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Lektionen blev præsenteret i 2 videoer - en 1-times lektion og en 1-times spørgetime, hvor der blev dykket dybere ned i dele af lektionen og besvaret spørgsmål. + +[![Lektion 2: En dybere indsigt i IoT](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M) + +[![Lektion 2: En dybere indsigt i IoT - Spørgetime](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E) + +> 🎥 Klik på billederne ovenfor for at se videoerne + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3) + +## Introduktion + +Denne lektion går dybere ned i nogle af de begreber, der blev dækket i den sidste lektion. + +I denne lektion vil vi dække: + +* [Komponenter i en IoT-applikation](../../../../../1-getting-started/lessons/2-deeper-dive) +* [Dybere indsigt i mikrocontrollere](../../../../../1-getting-started/lessons/2-deeper-dive) +* [Dybere indsigt i single-board computere](../../../../../1-getting-started/lessons/2-deeper-dive) + +## Komponenter i en IoT-applikation + +De to komponenter i en IoT-applikation er *Internet* og *ting*. Lad os se nærmere på disse to komponenter. + +### Tingen + +![En Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.da.jpg) + +**Tingen** i IoT refererer til en enhed, der kan interagere med den fysiske verden. Disse enheder er normalt små, prisvenlige computere, der kører med lav hastighed og bruger lidt strøm - for eksempel simple mikrocontrollere med kilobyte RAM (i modsætning til gigabyte i en PC), der kører med kun et par hundrede megahertz (i modsætning til gigahertz i en PC), men som nogle gange bruger så lidt strøm, at de kan køre i uger, måneder eller endda år på batterier. + +Disse enheder interagerer med den fysiske verden, enten ved at bruge sensorer til at indsamle data fra deres omgivelser eller ved at kontrollere output eller aktuatorer for at foretage fysiske ændringer. Et typisk eksempel er en smart termostat - en enhed, der har en temperatursensor, en måde at indstille en ønsket temperatur på, såsom en drejeknap eller touchscreen, og en forbindelse til et varme- eller kølesystem, der kan tændes, når den registrerede temperatur er uden for det ønskede område. Temperatursensoren registrerer, at rummet er for koldt, og en aktuator tænder for varmen. + +![Et diagram, der viser temperatur og en drejeknap som input til en IoT-enhed, og kontrol af en varmeenhed som output](../../../../../translated_images/basic-thermostat.a923217fd1f37e5a6f3390396a65c22a387419ea2dd17e518ec24315ba6ae9a8.da.png) + +Der findes et enormt udvalg af forskellige ting, der kan fungere som IoT-enheder, fra dedikeret hardware, der registrerer én ting, til generelle enheder, endda din smartphone! En smartphone kan bruge sensorer til at registrere verden omkring sig og aktuatorer til at interagere med verden - for eksempel ved at bruge en GPS-sensor til at registrere din placering og en højttaler til at give dig navigationsinstruktioner til en destination. + +✅ Tænk på andre systemer, du har omkring dig, der læser data fra en sensor og bruger det til at træffe beslutninger. Et eksempel kunne være termostaten i en ovn. Kan du finde flere? + +### Internettet + +**Internet**-delen af en IoT-applikation består af applikationer, som IoT-enheden kan forbinde til for at sende og modtage data, samt andre applikationer, der kan behandle data fra IoT-enheden og hjælpe med at træffe beslutninger om, hvilke anmodninger der skal sendes til IoT-enhedens aktuatorer. + +En typisk opsætning kunne være at have en slags cloud-tjeneste, som IoT-enheden forbinder til, og denne cloud-tjeneste håndterer ting som sikkerhed, modtager beskeder fra IoT-enheden og sender beskeder tilbage til enheden. Denne cloud-tjeneste ville derefter forbinde til andre applikationer, der kan behandle eller gemme sensordata, eller bruge sensordata sammen med data fra andre systemer til at træffe beslutninger. + +Enheder forbinder heller ikke altid direkte til internettet via WiFi eller kabelforbindelser. Nogle enheder bruger mesh-netværk til at tale med hinanden via teknologier som Bluetooth, og forbinder via en hub-enhed, der har en internetforbindelse. + +Med eksemplet med en smart termostat ville termostaten forbinde via hjemmets WiFi til en cloud-tjeneste, der kører i skyen. Den ville sende temperaturdata til denne cloud-tjeneste, og derfra ville dataene blive skrevet til en slags database, der gør det muligt for husejeren at tjekke aktuelle og tidligere temperaturer via en telefonapp. En anden tjeneste i skyen ville vide, hvilken temperatur husejeren ønsker, og sende beskeder tilbage til IoT-enheden via cloud-tjenesten for at fortælle varmesystemet, om det skal tændes eller slukkes. + +![Et diagram, der viser temperatur og en drejeknap som input til en IoT-enhed, IoT-enheden med tovejskommunikation til skyen, som igen har tovejskommunikation til en telefon, og kontrol af en varmeenhed som output fra IoT-enheden](../../../../../translated_images/mobile-controlled-thermostat.4a994010473d8d6a52ba68c67e5f02dc8928c717e93ca4b9bc55525aa75bbb60.da.png) + +En endnu smartere version kunne bruge AI i skyen med data fra andre sensorer, der er forbundet til andre IoT-enheder, såsom bevægelsessensorer, der registrerer, hvilke rum der er i brug, samt data som vejr og endda din kalender, for at træffe beslutninger om, hvordan temperaturen skal indstilles på en intelligent måde. For eksempel kunne den slukke for varmen, hvis den læser fra din kalender, at du er på ferie, eller slukke for varmen rum for rum afhængigt af, hvilke rum du bruger, og lære af dataene for at blive mere og mere præcis over tid. + +![Et diagram, der viser flere temperatursensorer og en drejeknap som input til en IoT-enhed, IoT-enheden med tovejskommunikation til skyen, som igen har tovejskommunikation til en telefon, en kalender og en vejrtjeneste, og kontrol af en varmeenhed som output fra IoT-enheden](../../../../../translated_images/smarter-thermostat.a75855f15d2d9e63d5da9d7ba5847a987f6c9d98e96e770c203532275194e27d.da.png) + +✅ Hvilke andre data kunne hjælpe med at gøre en internetforbundet termostat smartere? + +### IoT på kanten + +Selvom I'et i IoT står for Internet, behøver disse enheder ikke at være forbundet til internettet. I nogle tilfælde kan enheder forbinde til 'edge'-enheder - gateway-enheder, der kører på dit lokale netværk, hvilket betyder, at du kan behandle data uden at lave et opkald over internettet. Dette kan være hurtigere, når du har mange data eller en langsom internetforbindelse, det giver dig mulighed for at køre offline, hvor internetforbindelse ikke er mulig, såsom på et skib eller i et katastrofeområde, når du reagerer på en humanitær krise, og det giver dig mulighed for at holde data private. Nogle enheder vil indeholde behandlingskode, der er oprettet ved hjælp af cloud-værktøjer, og køre dette lokalt for at indsamle og reagere på data uden at bruge en internetforbindelse til at træffe en beslutning. + +Et eksempel på dette er en smart hjemmeenhed såsom en Apple HomePod, Amazon Alexa eller Google Home, som vil lytte til din stemme ved hjælp af AI-modeller, der er trænet i skyen, men som kører lokalt på enheden. Disse enheder vil 'vågne op', når et bestemt ord eller en sætning bliver sagt, og først derefter sende din tale over internettet til behandling. Enheden vil stoppe med at sende tale på et passende tidspunkt, såsom når den registrerer en pause i din tale. Alt, hvad du siger før du vækker enheden med vækkeordet, og alt, hvad du siger efter enheden er stoppet med at lytte, vil ikke blive sendt over internettet til enhedens udbyder og vil derfor være privat. + +✅ Tænk på andre scenarier, hvor privatliv er vigtigt, så behandling af data ville være bedre udført på kanten frem for i skyen. Som et hint - tænk på IoT-enheder med kameraer eller andre billedbehandlingsenheder. + +### IoT-sikkerhed + +Med enhver internetforbindelse er sikkerhed en vigtig overvejelse. Der er en gammel joke, der siger, at 'S'et i IoT står for sikkerhed' - der er intet 'S' i IoT, hvilket antyder, at det ikke er sikkert. + +IoT-enheder forbinder til en cloud-tjeneste og er derfor kun så sikre som den cloud-tjeneste - hvis din cloud-tjeneste tillader enhver enhed at forbinde, kan der sendes skadelige data, eller virusangreb kan finde sted. Dette kan have meget reelle konsekvenser, da IoT-enheder interagerer og kontrollerer andre enheder. For eksempel manipulerede [Stuxnet-ormen](https://wikipedia.org/wiki/Stuxnet) ventiler i centrifuger for at beskadige dem. Hackere har også udnyttet [dårlig sikkerhed til at få adgang til babyalarmer](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) og andre hjemmeovervågningsenheder. + +> 💁 Nogle gange kører IoT-enheder og edge-enheder på et netværk, der er helt isoleret fra internettet for at holde data private og sikre. Dette kaldes [air-gapping](https://wikipedia.org/wiki/Air_gap_(networking)). + +## Dybere indsigt i mikrocontrollere + +I den sidste lektion introducerede vi mikrocontrollere. Lad os nu se nærmere på dem. + +### CPU + +CPU'en er 'hjernen' i mikrocontrolleren. Det er processoren, der kører din kode og kan sende data til og modtage data fra tilsluttede enheder. CPU'er kan indeholde en eller flere kerner - i bund og grund en eller flere CPU'er, der kan arbejde sammen for at køre din kode. + +CPU'er er afhængige af en clock, der tikker mange millioner eller milliarder gange i sekundet. Hver tik, eller cyklus, synkroniserer de handlinger, som CPU'en kan udføre. Ved hver tik kan CPU'en udføre en instruktion fra et program, såsom at hente data fra en ekstern enhed eller udføre en matematisk beregning. Denne regelmæssige cyklus gør det muligt for alle handlinger at blive afsluttet, før den næste instruktion behandles. + +Jo hurtigere clock-cyklussen er, jo flere instruktioner kan behandles pr. sekund, og derfor jo hurtigere CPU'en er. CPU-hastigheder måles i [Hertz (Hz)](https://wikipedia.org/wiki/Hertz), en standardenhed, hvor 1 Hz betyder én cyklus eller clock-tik pr. sekund. + +> 🎓 CPU-hastigheder angives ofte i MHz eller GHz. 1MHz er 1 million Hz, 1GHz er 1 milliard Hz. + +> 💁 CPU'er udfører programmer ved hjælp af [fetch-decode-execute-cyklussen](https://wikipedia.org/wiki/Instruction_cycle). For hver clock-tik vil CPU'en hente den næste instruktion fra hukommelsen, afkode den og derefter udføre den, såsom at bruge en aritmetisk logisk enhed (ALU) til at lægge 2 tal sammen. Nogle udførelser vil tage flere tik at køre, så den næste cyklus vil køre ved næste tik, efter instruktionen er afsluttet. + +![Fetch-decode-execute-cyklussen, der viser, hvordan fetch henter en instruktion fra programmet, der er gemt i RAM, og derefter afkoder og udfører den på en CPU](../../../../../translated_images/fetch-decode-execute.2fd6f150f6280392807f4475382319abd0cee0b90058e1735444d6baa6f2078c.da.png) + +Mikrocontrollere har meget lavere clock-hastigheder end stationære eller bærbare computere eller endda de fleste smartphones. Wio Terminal har for eksempel en CPU, der kører ved 120MHz eller 120.000.000 cyklusser pr. sekund. + +✅ En gennemsnitlig PC eller Mac har en CPU med flere kerner, der kører ved flere gigahertz, hvilket betyder, at clocken tikker milliarder af gange i sekundet. Undersøg clock-hastigheden på din computer og sammenlign, hvor mange gange hurtigere den er end Wio Terminal. + +Hver clock-cyklus bruger strøm og genererer varme. Jo hurtigere tik, jo mere strøm forbruges og jo mere varme genereres. PC'er har køleplader og blæsere til at fjerne varme, uden hvilke de ville overophede og lukke ned inden for få sekunder. Mikrocontrollere har ofte ingen af delene, da de kører meget køligere og derfor meget langsommere. PC'er kører på netstrøm eller store batterier i et par timer, mikrocontrollere kan køre i dage, måneder eller endda år på små batterier. Mikrocontrollere kan også have kerner, der kører ved forskellige hastigheder, og skifte til langsommere lavstrømskerner, når CPU-belastningen er lav, for at reducere strømforbruget. + +> 💁 Nogle PC'er og Mac'er begynder at anvende den samme blanding af hurtige højstrømskerner og langsommere lavstrømskerner, der skifter for at spare batteri. For eksempel kan M1-chippen i de nyeste Apple-laptops skifte mellem 4 performance-kerner og 4 effektivitetskerner for at optimere batterilevetid eller hastighed afhængigt af den opgave, der udføres. + +✅ Lav lidt research: Læs om CPU'er på [Wikipedia CPU-artiklen](https://wikipedia.org/wiki/Central_processing_unit) + +#### Opgave + +Undersøg Wio Terminal. + +Hvis du bruger en Wio Terminal til disse lektioner, så prøv at finde CPU'en. Find afsnittet *Hardware Overview* på [Wio Terminal-produktets side](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) for et billede af de interne dele, og prøv at finde CPU'en gennem det klare plastvindue på bagsiden. + +### Hukommelse + +Mikrocontrollere har normalt to typer hukommelse - programhukommelse og random-access memory (RAM). + +Programhukommelse er ikke-flygtig, hvilket betyder, at det, der er skrevet til den, forbliver, når der ikke er strøm til enheden. Dette er hukommelsen, der gemmer din programkode. + +RAM er den hukommelse, der bruges af programmet til at køre, og indeholder variabler, der er tildelt af dit program, og data, der er indsamlet fra perifere enheder. RAM er flygtig, og når strømmen går ud, går indholdet tabt, hvilket effektivt nulstiller dit program. +🎓 Programhukommelse gemmer din kode og forbliver, selv når der ikke er strøm. +🎓 RAM bruges til at køre dit program og nulstilles, når der ikke er strøm + +Ligesom med CPU'en er hukommelsen i en mikrocontroller mange gange mindre end i en PC eller Mac. En typisk PC kan have 8 Gigabyte (GB) RAM, eller 8.000.000.000 bytes, hvor hver byte har plads nok til at gemme et enkelt bogstav eller et tal fra 0-255. En mikrocontroller har derimod kun kilobytes (KB) RAM, hvor en kilobyte er 1.000 bytes. Wio-terminalen, der er nævnt ovenfor, har 192KB RAM, eller 192.000 bytes - mere end 40.000 gange mindre end en gennemsnitlig PC! + +Diagrammet nedenfor viser den relative størrelsesforskel mellem 192KB og 8GB - den lille prik i midten repræsenterer 192KB. + +![En sammenligning mellem 192KB og 8GB - mere end 40.000 gange større](../../../../../translated_images/ram-comparison.6beb73541b42ac6ffde64cdf79fc925a84b932ce7ebd4d41d5fd7afc1257a696.da.png) + +Programlagring er også mindre end på en PC. En typisk PC kan have en harddisk på 500GB til programlagring, mens en mikrocontroller måske kun har kilobytes eller måske et par megabytes (MB) lagerplads (1MB er 1.000KB, eller 1.000.000 bytes). Wio-terminalen har 4MB programlagring. + +✅ Lav lidt research: Hvor meget RAM og lagerplads har den computer, du bruger til at læse dette? Hvordan sammenlignes det med en mikrocontroller? + +### Input/Output + +Mikrocontrollere har brug for input- og outputforbindelser (I/O) til at læse data fra sensorer og sende styresignaler til aktuatorer. De indeholder normalt et antal generelle input/output (GPIO)-pins. Disse pins kan konfigureres i software til at være input (dvs. de modtager et signal) eller output (de sender et signal). + +🧠⬅️ Input-pins bruges til at læse værdier fra sensorer + +🧠➡️ Output-pins sender instruktioner til aktuatorer + +✅ Du vil lære mere om dette i en senere lektion. + +#### Opgave + +Undersøg Wio-terminalen. + +Hvis du bruger en Wio-terminal til disse lektioner, så find GPIO-pinsene. Find sektionen *Pinout diagram* på [Wio Terminal produktets side](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) for at lære, hvilke pins der er hvilke. Wio-terminalen leveres med et klistermærke, som du kan sætte på bagsiden med pin-numre, så sæt det på nu, hvis du ikke allerede har gjort det. + +### Fysisk størrelse + +Mikrocontrollere er typisk små i størrelse, hvor den mindste, en [Freescale Kinetis KL03 MCU, er lille nok til at passe i fordybningen af en golfbold](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/). Bare CPU'en i en PC kan måle 40mm x 40mm, og det er uden at inkludere køleplader og blæsere, der er nødvendige for at sikre, at CPU'en kan køre i mere end et par sekunder uden at overophede, hvilket gør den væsentligt større end en komplet mikrocontroller. Wio-terminalens udviklingskit med en mikrocontroller, et kabinet, en skærm og en række forbindelser og komponenter er ikke meget større end en bar Intel i9 CPU og væsentligt mindre end CPU'en med en køleplade og blæser! + +| Enhed | Størrelse | +| ------------------------------- | ---------------------- | +| Freescale Kinetis KL03 | 1,6mm x 2mm x 1mm | +| Wio-terminal | 72mm x 57mm x 12mm | +| Intel i9 CPU, køleplade og blæser | 136mm x 145mm x 103mm | + +### Frameworks og operativsystemer + +På grund af deres lave hastighed og hukommelsesstørrelse kører mikrocontrollere ikke et operativsystem (OS) i den forstand, som vi kender det fra desktops. Operativsystemet, der får din computer til at køre (Windows, Linux eller macOS), kræver meget hukommelse og processorkraft for at udføre opgaver, der er helt unødvendige for en mikrocontroller. Husk, at mikrocontrollere normalt er programmeret til at udføre en eller flere meget specifikke opgaver, i modsætning til en generel computer som en PC eller Mac, der skal understøtte en brugergrænseflade, afspille musik eller film, give værktøjer til at skrive dokumenter eller kode, spille spil eller surfe på internettet. + +For at programmere en mikrocontroller uden et OS har du brug for nogle værktøjer, der gør det muligt at bygge din kode på en måde, som mikrocontrolleren kan køre, ved hjælp af API'er, der kan kommunikere med eventuelle perifere enheder. Hver mikrocontroller er forskellig, så producenter understøtter normalt standardframeworks, der giver dig mulighed for at følge en standard 'opskrift' for at bygge din kode og få den til at køre på enhver mikrocontroller, der understøtter det framework. + +Du kan programmere mikrocontrollere ved hjælp af et OS - ofte kaldet et realtidsoperativsystem (RTOS), da disse er designet til at håndtere dataudveksling med perifere enheder i realtid. Disse operativsystemer er meget lette og tilbyder funktioner som: + +* Multitråding, der gør det muligt for din kode at køre mere end én kodeblok på samme tid, enten på flere kerner eller ved at tage ture på én kerne +* Netværk, der gør det muligt at kommunikere sikkert over internettet +* Grafiske brugergrænsefladekomponenter (GUI) til at bygge brugergrænseflader (UI) på enheder med skærme. + +✅ Læs om nogle forskellige RTOS'er: [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [Zephyr](https://www.zephyrproject.org) + +#### Arduino + +![Arduino-logoet](../../../../../images/arduino-logo.svg) + +[Arduino](https://www.arduino.cc) er sandsynligvis det mest populære mikrocontroller-framework, især blandt studerende, hobbyister og gør-det-selv-entusiaster. Arduino er en open source elektronikplatform, der kombinerer software og hardware. Du kan købe Arduino-kompatible boards fra Arduino selv eller fra andre producenter og derefter kode ved hjælp af Arduino-frameworket. + +Arduino-boards programmeres i C eller C++. Brug af C/C++ gør det muligt at kompilere din kode meget lille og køre hurtigt, hvilket er nødvendigt på en begrænset enhed som en mikrocontroller. Kernen i en Arduino-applikation kaldes en sketch og er C/C++-kode med 2 funktioner - `setup` og `loop`. Når boardet starter op, vil Arduino-frameworket køre `setup`-funktionen én gang, og derefter vil det køre `loop`-funktionen igen og igen, kontinuerligt, indtil strømmen slukkes. + +Du vil skrive din opsætningskode i `setup`-funktionen, såsom at oprette forbindelse til WiFi og cloud-tjenester eller initialisere pins til input og output. Din loop-kode vil derefter indeholde behandlingskode, såsom at læse fra en sensor og sende værdien til skyen. Du vil normalt inkludere en forsinkelse i hver loop, for eksempel hvis du kun vil sende sensordata hvert 10. sekund, vil du tilføje en forsinkelse på 10 sekunder i slutningen af loopen, så mikrocontrolleren kan sove og spare strøm, og derefter køre loopen igen, når det er nødvendigt 10 sekunder senere. + +![En Arduino-sketch, der kører setup først og derefter kører loop gentagne gange](../../../../../translated_images/arduino-sketch.79590cb837ff7a7c6a68d1afda6cab83fd53d3bb1bd9a8bf2eaf8d693a4d3ea6.da.png) + +✅ Denne programarkitektur kaldes en *event loop* eller *message loop*. Mange applikationer bruger dette under motorhjelmen og er standarden for de fleste desktop-applikationer, der kører på OS'er som Windows, macOS eller Linux. `loop` lytter efter beskeder fra brugergrænsefladekomponenter som knapper eller enheder som tastaturet og reagerer på dem. Du kan læse mere i denne [artikel om event loops](https://wikipedia.org/wiki/Event_loop). + +Arduino tilbyder standardbiblioteker til at interagere med mikrocontrollere og I/O-pins, med forskellige implementeringer under motorhjelmen for at køre på forskellige mikrocontrollere. For eksempel vil [`delay`-funktionen](https://www.arduino.cc/reference/en/language/functions/time/delay/) pause programmet i en given periode, og [`digitalRead`-funktionen](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/) vil læse en værdi af `HIGH` eller `LOW` fra den givne pin, uanset hvilket board koden kører på. Disse standardbiblioteker betyder, at Arduino-kode skrevet til ét board kan genkompileres til ethvert andet Arduino-board og vil køre, forudsat at pinsene er de samme, og at boardene understøtter de samme funktioner. + +Der er et stort økosystem af tredjeparts Arduino-biblioteker, der giver dig mulighed for at tilføje ekstra funktioner til dine Arduino-projekter, såsom at bruge sensorer og aktuatorer eller oprette forbindelse til cloud IoT-tjenester. + +##### Opgave + +Undersøg Wio-terminalen. + +Hvis du bruger en Wio-terminal til disse lektioner, så genlæs den kode, du skrev i den sidste lektion. Find `setup`- og `loop`-funktionen. Overvåg den serielle output for at se, at `loop`-funktionen kaldes gentagne gange. Prøv at tilføje kode til `setup`-funktionen for at skrive til den serielle port, og observer, at denne kode kun kaldes én gang hver gang, du genstarter. Prøv at genstarte din enhed med tænd/sluk-knappen på siden for at vise, at dette kaldes hver gang enheden genstarter. + +## Dybdegående kig på enkeltkortcomputere + +I den sidste lektion introducerede vi enkeltkortcomputere. Lad os nu kigge nærmere på dem. + +### Raspberry Pi + +![Raspberry Pi-logoet](../../../../../translated_images/raspberry-pi-logo.4efaa16605cee05489d8fa53941e991b3757aa24c20a95abdcf8cfd761953596.da.png) + +[Raspberry Pi Foundation](https://www.raspberrypi.org) er en velgørenhedsorganisation fra Storbritannien, der blev grundlagt i 2009 for at fremme studiet af datalogi, især på skoleplan. Som en del af denne mission udviklede de en enkeltkortcomputer, kaldet Raspberry Pi. Raspberry Pi fås i øjeblikket i 3 varianter - en fuld størrelse version, den mindre Pi Zero og en compute-modul, der kan bygges ind i din endelige IoT-enhed. + +![En Raspberry Pi 4](../../../../../translated_images/raspberry-pi-4.fd4590d308c3d456db1327e86b395ddcd735513267aafd4879ea2785f7792eac.da.jpg) + +Den nyeste iteration af den fulde størrelse Raspberry Pi er Raspberry Pi 4B. Den har en quad-core (4 kerner) CPU, der kører ved 1,5GHz, 2, 4 eller 8GB RAM, gigabit ethernet, WiFi, 2 HDMI-porte, der understøtter 4k-skærme, en lyd- og kompositvideo-udgangsport, USB-porte (2 USB 2.0, 2 USB 3.0), 40 GPIO-pins, en kameraforbindelse til et Raspberry Pi-kameramodul og en SD-kortplads. Alt dette på et board, der måler 88mm x 58mm x 19,5mm og drives af en 3A USB-C strømforsyning. Disse starter ved US$35, hvilket er meget billigere end en PC eller Mac. + +> 💁 Der findes også en Pi400 alt-i-en-computer med en Pi4 indbygget i et tastatur. + +![En Raspberry Pi Zero](../../../../../translated_images/raspberry-pi-zero.f7a4133e1e7d54bb3dbb32319b217a53c5b94871995a54647f2894b54206b8d8.da.jpg) + +Pi Zero er meget mindre og har lavere strømforbrug. Den har en enkeltkerne 1GHz CPU, 512MB RAM, WiFi (i Zero W-modellen), en enkelt HDMI-port, en mikro-USB-port, 40 GPIO-pins, en kameraforbindelse til et Raspberry Pi-kameramodul og en SD-kortplads. Den måler 65mm x 30mm x 5mm og bruger meget lidt strøm. Zero koster US$5, mens W-versionen med WiFi koster US$10. + +> 🎓 CPU'erne i begge disse er ARM-processorer, i modsætning til Intel/AMD x86 eller x64 processorer, som du finder i de fleste PC'er og Mac'er. Disse ligner de CPU'er, du finder i nogle mikrocontrollere, såvel som næsten alle mobiltelefoner, Microsoft Surface X og de nye Apple Silicon-baserede Apple Mac'er. + +Alle varianter af Raspberry Pi kører en version af Debian Linux kaldet Raspberry Pi OS. Dette fås som en let version uden desktop, hvilket er perfekt til 'headless'-projekter, hvor du ikke har brug for en skærm, eller en fuld version med et komplet desktopmiljø, inklusive webbrowser, kontorapplikationer, kodningsværktøjer og spil. Da operativsystemet er en version af Debian Linux, kan du installere enhver applikation eller værktøj, der kører på Debian og er bygget til ARM-processoren i Pi. + +#### Opgave + +Undersøg Raspberry Pi. + +Hvis du bruger en Raspberry Pi til disse lektioner, så læs om de forskellige hardwarekomponenter på boardet. + +* Du kan finde detaljer om processorerne, der bruges, på [Raspberry Pi hardware dokumentationssiden](https://www.raspberrypi.org/documentation/hardware/raspberrypi/). Læs om processoren, der bruges i den Pi, du bruger. +* Find GPIO-pinsene. Læs mere om dem på [Raspberry Pi GPIO dokumentationen](https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md). Brug [GPIO Pin Usage guide](https://www.raspberrypi.org/documentation/usage/gpio/README.md) til at identificere de forskellige pins på din Pi. + +### Programmering af enkeltkortcomputere + +Enkeltkortcomputere er fulde computere, der kører et fuldt operativsystem. Dette betyder, at der er et bredt udvalg af programmeringssprog, frameworks og værktøjer, du kan bruge til at kode dem, i modsætning til mikrocontrollere, der er afhængige af understøttelse af boardet i frameworks som Arduino. De fleste programmeringssprog har biblioteker, der kan få adgang til GPIO-pins for at sende og modtage data fra sensorer og aktuatorer. + +✅ Hvilke programmeringssprog er du bekendt med? Understøttes de på Linux? + +Det mest almindelige programmeringssprog til at bygge IoT-applikationer på en Raspberry Pi er Python. Der er et stort økosystem af hardware designet til Pi, og næsten alle disse inkluderer den nødvendige kode for at bruge dem som Python-biblioteker. Nogle af disse økosystemer er baseret på 'hats' - såkaldte, fordi de sidder oven på Pi som en hat og forbinder med en stor sokkel til de 40 GPIO-pins. Disse hats giver ekstra funktioner, såsom skærme, sensorer, fjernstyrede biler eller adaptere, der gør det muligt at tilslutte sensorer med standardiserede kabler. +### Brug af single-board computere i professionelle IoT-implementeringer + +Single-board computere bruges til professionelle IoT-implementeringer, ikke kun som udviklingskits. De kan være en kraftfuld måde at styre hardware og udføre komplekse opgaver, såsom at køre maskinlæringsmodeller. For eksempel findes der en [Raspberry Pi 4 compute module](https://www.raspberrypi.org/blog/raspberry-pi-compute-module-4/), som tilbyder al kraften fra en Raspberry Pi 4, men i en kompakt og billigere formfaktor uden de fleste porte, designet til at blive installeret i specialtilpasset hardware. + +--- + +## 🚀 Udfordring + +Udfordringen i den sidste lektion var at liste så mange IoT-enheder som muligt, der findes i dit hjem, skole eller arbejdsplads. For hver enhed på denne liste, tror du, de er bygget omkring mikrocontrollere eller single-board computere, eller måske en blanding af begge dele? + +## Quiz efter lektionen + +[Quiz efter lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4) + +## Gennemgang & Selvstudie + +* Læs [Arduino introduktionsguide](https://www.arduino.cc/en/Guide/Introduction) for at forstå mere om Arduino-platformen. +* Læs [introduktionen til Raspberry Pi 4](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) for at lære mere om Raspberry Pis. +* Lær mere om nogle af begreberne og akronymerne i [What the FAQ are CPUs, MPUs, MCUs, and GPUs artikel i Electrical Engineering Journal](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/). + +✅ Brug disse guides sammen med de viste omkostninger ved at følge linkene i [hardwareguiden](../../../hardware.md) for at beslutte, hvilken hardwareplatform du vil bruge, eller om du hellere vil bruge en virtuel enhed. + +## Opgave + +[Sammenlign og kontraster mikrocontrollere og single-board computere](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/2-deeper-dive/assignment.md b/translations/da/1-getting-started/lessons/2-deeper-dive/assignment.md new file mode 100644 index 00000000..284ed836 --- /dev/null +++ b/translations/da/1-getting-started/lessons/2-deeper-dive/assignment.md @@ -0,0 +1,26 @@ + +# Sammenlign og kontraster mikrocontrollere og single-board computere + +## Instruktioner + +Denne lektion dækkede mikrocontrollere og single-board computere. Opret en tabel, der sammenligner og kontrasterer dem, og noter mindst 2 grunde til, hvorfor du ville bruge en mikrocontroller frem for en single-board computer, og mindst 2 grunde til, hvorfor du ville bruge en single-board computer frem for en mikrocontroller. + +## Bedømmelseskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Opret en tabel, der sammenligner mikrocontrollere med single-board computere | Oprettede en liste med flere punkter, der korrekt sammenligner og kontrasterer | Oprettede en liste med kun et par punkter | Kunne kun komme med ét punkt eller ingen punkter til at sammenligne og kontrastere | +| Grunde til at bruge den ene frem for den anden | Kunne give 2 eller flere grunde for mikrocontrollere og 2 eller flere for single-board computere | Kunne kun give 1-2 grunde for en mikrocontroller og 1-2 grunde for en single-board computer | Kunne ikke give 1 eller flere grunde for en mikrocontroller eller for en single-board computer | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/3-sensors-and-actuators/README.md b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/README.md new file mode 100644 index 00000000..60359672 --- /dev/null +++ b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/README.md @@ -0,0 +1,230 @@ + +# Interager med den fysiske verden med sensorer og aktuatorer + +![En sketchnote oversigt over denne lektion](../../../../../translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +Denne lektion blev undervist som en del af [Hello IoT-serien](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) fra [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Lektionen blev præsenteret i 2 videoer - en 1-times lektion og en 1-times spørgetime, hvor dele af lektionen blev uddybet, og spørgsmål blev besvaret. + +[![Lektion 3: Interager med den fysiske verden med sensorer og aktuatorer](https://img.youtube.com/vi/Lqalu1v6aF4/0.jpg)](https://youtu.be/Lqalu1v6aF4) + +[![Lektion 3: Interager med den fysiske verden med sensorer og aktuatorer - Spørgetime](https://img.youtube.com/vi/qR3ekcMlLWA/0.jpg)](https://youtu.be/qR3ekcMlLWA) + +> 🎥 Klik på billederne ovenfor for at se videoerne + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5) + +## Introduktion + +Denne lektion introducerer to vigtige begreber for din IoT-enhed - sensorer og aktuatorer. Du vil også få praktisk erfaring med begge dele, ved at tilføje en lyssensor til dit IoT-projekt og derefter tilføje en LED, der styres af lysniveauer, hvilket i praksis skaber en natlampe. + +I denne lektion dækker vi: + +* [Hvad er sensorer?](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Brug en sensor](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Sensortyper](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Hvad er aktuatorer?](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Brug en aktuator](../../../../../1-getting-started/lessons/3-sensors-and-actuators) +* [Aktuatortyper](../../../../../1-getting-started/lessons/3-sensors-and-actuators) + +## Hvad er sensorer? + +Sensorer er hardwareenheder, der registrerer den fysiske verden - det vil sige, de måler en eller flere egenskaber omkring dem og sender informationen til en IoT-enhed. Sensorer dækker et enormt udvalg af enheder, da der er så mange ting, der kan måles, fra naturlige egenskaber som lufttemperatur til fysiske interaktioner som bevægelse. + +Nogle almindelige sensorer inkluderer: + +* Temperatursensorer - disse registrerer lufttemperaturen eller temperaturen på det, de er nedsænket i. For hobbyister og udviklere er disse ofte kombineret med lufttryk og fugtighed i en enkelt sensor. +* Knapper - disse registrerer, når de bliver trykket. +* Lyssensorer - disse registrerer lysniveauer og kan være specifikke for farver, UV-lys, IR-lys eller generelt synligt lys. +* Kameraer - disse registrerer en visuel repræsentation af verden ved at tage et fotografi eller streame video. +* Accelerometre - disse registrerer bevægelse i flere retninger. +* Mikrofoner - disse registrerer lyd, enten generelle lydniveauer eller retningsbestemt lyd. + +✅ Lav lidt research. Hvilke sensorer har din telefon? + +Alle sensorer har én ting til fælles - de konverterer det, de registrerer, til et elektrisk signal, som kan tolkes af en IoT-enhed. Hvordan dette elektriske signal tolkes afhænger af sensoren samt kommunikationsprotokollen, der bruges til at kommunikere med IoT-enheden. + +## Brug en sensor + +Følg den relevante vejledning nedenfor for at tilføje en sensor til din IoT-enhed: + +* [Arduino - Wio Terminal](wio-terminal-sensor.md) +* [Single-board computer - Raspberry Pi](pi-sensor.md) +* [Single-board computer - Virtuel enhed](virtual-device-sensor.md) + +## Sensortyper + +Sensorer er enten analoge eller digitale. + +### Analoge sensorer + +Nogle af de mest grundlæggende sensorer er analoge sensorer. Disse sensorer modtager en spænding fra IoT-enheden, sensorens komponenter justerer denne spænding, og spændingen, der returneres fra sensoren, måles for at give sensorværdien. + +> 🎓 Spænding er et mål for, hvor meget kraft der er til at flytte elektricitet fra et sted til et andet, såsom fra den positive terminal på et batteri til den negative terminal. For eksempel er et standard AA-batteri 1,5V (V er symbolet for volt) og kan skubbe elektricitet med en kraft på 1,5V fra sin positive terminal til sin negative terminal. Forskellige elektriske hardware kræver forskellige spændinger for at fungere, for eksempel kan en LED lyse med mellem 2-3V, men en 100W glødepære ville kræve 240V. Du kan læse mere om spænding på [Wikipedia-siden om spænding](https://wikipedia.org/wiki/Voltage). + +Et eksempel på dette er en potentiometer. Dette er en drejeknap, som du kan rotere mellem to positioner, og sensoren måler rotationen. + +![En potentiometer indstillet til et midtpunkt, der modtager 5 volt og returnerer 3,8 volt](../../../../../translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.da.png) + +IoT-enheden sender et elektrisk signal til potentiometeret med en spænding, såsom 5 volt (5V). Når potentiometeret justeres, ændrer det spændingen, der kommer ud på den anden side. Forestil dig, at du har en potentiometer mærket som en drejeknap, der går fra 0 til [11](https://wikipedia.org/wiki/Up_to_eleven), såsom en volumenknap på en forstærker. Når potentiometeret er i den fulde slukket position (0), vil 0V (0 volt) komme ud. Når det er i den fulde tændt position (11), vil 5V (5 volt) komme ud. + +> 🎓 Dette er en forenkling, og du kan læse mere om potentiometre og variable modstande på [Wikipedia-siden om potentiometre](https://wikipedia.org/wiki/Potentiometer). + +Spændingen, der kommer ud af sensoren, læses derefter af IoT-enheden, og enheden kan reagere på den. Afhængigt af sensoren kan denne spænding være en vilkårlig værdi eller kan kortlægges til en standardenhed. For eksempel ændrer en analog temperatursensor baseret på en [termistor](https://wikipedia.org/wiki/Thermistor) sin modstand afhængigt af temperaturen. Den udgående spænding kan derefter konverteres til en temperatur i Kelvin og tilsvarende til °C eller °F ved beregninger i kode. + +✅ Hvad tror du sker, hvis sensoren returnerer en højere spænding, end der blev sendt (for eksempel fra en ekstern strømforsyning)? ⛔️ TEST IKKE dette. + +#### Analog til digital konvertering + +IoT-enheder er digitale - de kan ikke arbejde med analoge værdier, de arbejder kun med 0'er og 1'er. Dette betyder, at analoge sensorværdier skal konverteres til et digitalt signal, før de kan behandles. Mange IoT-enheder har analog-til-digital konvertere (ADCs) til at konvertere analoge input til digitale repræsentationer af deres værdi. Sensorer kan også arbejde med ADC'er via en forbindelsesplade. For eksempel i Seeed Grove-økosystemet med en Raspberry Pi, forbinder analoge sensorer til specifikke porte på en 'hat', der sidder på Pi'en forbundet til Pi'ens GPIO-pins, og denne hat har en ADC til at konvertere spændingen til et digitalt signal, der kan sendes fra Pi'ens GPIO-pins. + +Forestil dig, at du har en analog lyssensor forbundet til en IoT-enhed, der bruger 3,3V og returnerer en værdi på 1V. Denne 1V betyder ikke noget i den digitale verden, så den skal konverteres. Spændingen vil blive konverteret til en analog værdi ved hjælp af en skala afhængigt af enheden og sensoren. Et eksempel er Seeed Grove-lyssensoren, som outputter værdier fra 0 til 1.023. For denne sensor, der kører ved 3,3V, ville en 1V output være en værdi på 300. En IoT-enhed kan ikke håndtere 300 som en analog værdi, så værdien ville blive konverteret til `0000000100101100`, den binære repræsentation af 300 af Grove-hatten. Dette ville derefter blive behandlet af IoT-enheden. + +✅ Hvis du ikke kender binær, så lav lidt research for at lære, hvordan tal repræsenteres af 0'er og 1'er. [BBC Bitesize introduktion til binær](https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1) er et godt sted at starte. + +Fra et kodningsperspektiv håndteres alt dette normalt af biblioteker, der følger med sensorerne, så du behøver ikke bekymre dig om denne konvertering selv. For Grove-lyssensoren ville du bruge Python-biblioteket og kalde `light`-egenskaben eller bruge Arduino-biblioteket og kalde `analogRead` for at få en værdi på 300. + +### Digitale sensorer + +Digitale sensorer, ligesom analoge sensorer, registrerer verden omkring dem ved hjælp af ændringer i elektrisk spænding. Forskellen er, at de outputter et digitalt signal, enten ved kun at måle to tilstande eller ved at bruge en indbygget ADC. Digitale sensorer bliver mere og mere almindelige for at undgå behovet for at bruge en ADC enten i en forbindelsesplade eller på selve IoT-enheden. + +Den enkleste digitale sensor er en knap eller kontakt. Dette er en sensor med to tilstande, tændt eller slukket. + +![En knap modtager 5 volt. Når den ikke er trykket, returnerer den 0 volt, når den er trykket, returnerer den 5 volt](../../../../../translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.da.png) + +Pins på IoT-enheder, såsom GPIO-pins, kan måle dette signal direkte som en 0 eller 1. Hvis den sendte spænding er den samme som den returnerede spænding, læses værdien som 1, ellers læses værdien som 0. Der er ingen grund til at konvertere signalet, det kan kun være 1 eller 0. + +> 💁 Spændinger er aldrig helt præcise, især da komponenterne i en sensor vil have en vis modstand, så der er normalt en tolerance. For eksempel arbejder GPIO-pins på en Raspberry Pi med 3,3V og læser et returneret signal over 1,8V som en 1, under 1,8V som 0. + +* 3,3V går ind i knappen. Knappen er slukket, så 0V kommer ud, hvilket giver en værdi på 0 +* 3,3V går ind i knappen. Knappen er tændt, så 3,3V kommer ud, hvilket giver en værdi på 1 + +Mere avancerede digitale sensorer læser analoge værdier og konverterer dem derefter ved hjælp af indbyggede ADC'er til digitale signaler. For eksempel vil en digital temperatursensor stadig bruge et termoelement på samme måde som en analog sensor og stadig måle ændringen i spænding forårsaget af termoelementets modstand ved den aktuelle temperatur. I stedet for at returnere en analog værdi og stole på enheden eller forbindelsespladen til at konvertere til et digitalt signal, vil en indbygget ADC i sensoren konvertere værdien og sende den som en række 0'er og 1'er til IoT-enheden. Disse 0'er og 1'er sendes på samme måde som det digitale signal for en knap, hvor 1 er fuld spænding og 0 er 0V. + +![En digital temperatursensor konverterer en analog aflæsning til binære data med 0 som 0 volt og 1 som 5 volt, før den sender det til en IoT-enhed](../../../../../translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.da.png) + +At sende digitale data gør det muligt for sensorer at blive mere komplekse og sende mere detaljerede data, endda krypterede data for sikre sensorer. Et eksempel er et kamera. Dette er en sensor, der fanger et billede og sender det som digitale data, der indeholder det billede, normalt i et komprimeret format som JPEG, til at blive læst af IoT-enheden. Det kan endda streame video ved at fange billeder og sende enten det komplette billede frame for frame eller en komprimeret videostream. + +## Hvad er aktuatorer? + +Aktuatorer er det modsatte af sensorer - de konverterer et elektrisk signal fra din IoT-enhed til en interaktion med den fysiske verden, såsom at udsende lys eller lyd eller bevæge en motor. + +Nogle almindelige aktuatorer inkluderer: + +* LED - disse udsender lys, når de tændes +* Højttaler - disse udsender lyd baseret på det signal, der sendes til dem, fra en simpel buzzer til en lydhøjttaler, der kan spille musik +* Steppermotor - disse konverterer et signal til en defineret mængde rotation, såsom at dreje en drejeknap 90° +* Relæ - disse er kontakter, der kan tændes eller slukkes af et elektrisk signal. De tillader en lille spænding fra en IoT-enhed at tænde større spændinger. +* Skærme - disse er mere komplekse aktuatorer og viser information på en multi-segment display. Skærme varierer fra simple LED-displays til højopløsnings videomonitorer. + +✅ Lav lidt research. Hvilke aktuatorer har din telefon? + +## Brug en aktuator + +Følg den relevante vejledning nedenfor for at tilføje en aktuator til din IoT-enhed, styret af sensoren, for at bygge en IoT-natlampe. Den vil indsamle lysniveauer fra lyssensoren og bruge en aktuator i form af en LED til at udsende lys, når det registrerede lysniveau er for lavt. + +![Et flowdiagram over opgaven, der viser lysniveauer, der bliver læst og kontrolleret, og LED'en bliver styret](../../../../../translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.da.png) + +* [Arduino - Wio Terminal](wio-terminal-actuator.md) +* [Single-board computer - Raspberry Pi](pi-actuator.md) +* [Single-board computer - Virtuel enhed](virtual-device-actuator.md) + +## Aktuatortyper + +Ligesom sensorer er aktuatorer enten analoge eller digitale. + +### Analoge aktuatorer + +Analoge aktuatorer tager et analogt signal og konverterer det til en form for interaktion, hvor interaktionen ændrer sig baseret på den leverede spænding. + +Et eksempel er en dæmpbar lampe, såsom dem du måske har i dit hjem. Mængden af spænding, der leveres til lampen, bestemmer, hvor lys den er. +![En lysdæmper ved lav spænding og lysere ved højere spænding](../../../../../translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.da.png) + +Ligesom med sensorer fungerer den faktiske IoT-enhed med digitale signaler, ikke analoge. Det betyder, at for at sende et analogt signal skal IoT-enheden have en digital-til-analog-konverter (DAC), enten direkte på IoT-enheden eller på et tilslutningskort. Dette konverterer 0'erne og 1'erne fra IoT-enheden til en analog spænding, som aktuatoren kan bruge. + +✅ Hvad tror du der sker, hvis IoT-enheden sender en højere spænding, end aktuatoren kan håndtere? +⛔️ PRØV IKKE at teste dette. + +#### Pulsbreddemodulation + +En anden mulighed for at konvertere digitale signaler fra en IoT-enhed til et analogt signal er pulsbreddemodulation. Dette indebærer at sende mange korte digitale impulser, der fungerer som et analogt signal. + +For eksempel kan du bruge PWM til at kontrollere hastigheden på en motor. + +Forestil dig, at du styrer en motor med en 5V strømforsyning. Du sender en kort impuls til din motor, hvor spændingen skifter til høj (5V) i to hundrededele af et sekund (0,02s). I den tid kan din motor rotere en tiendedel af en rotation, eller 36°. Signalet pauser derefter i to hundrededele af et sekund (0,02s), hvor der sendes et lavt signal (0V). Hver cyklus af tændt og slukket varer 0,04s. Cyklussen gentages derefter. + +![Pulsbreddemodulation rotation af en motor ved 150 RPM](../../../../../translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.da.png) + +Dette betyder, at du på ét sekund har 25 5V impulser af 0,02s, der roterer motoren, hver efterfulgt af en pause på 0,02s med 0V, hvor motoren ikke roterer. Hver impuls roterer motoren en tiendedel af en rotation, hvilket betyder, at motoren fuldfører 2,5 rotationer per sekund. Du har brugt et digitalt signal til at rotere motoren med 2,5 rotationer per sekund, eller 150 [omdrejninger per minut](https://wikipedia.org/wiki/Revolutions_per_minute) (en ikke-standard måleenhed for rotationshastighed). + +```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 +``` + +> 🎓 Når et PWM-signal er tændt halvdelen af tiden og slukket halvdelen af tiden, kaldes det en [50% duty cycle](https://wikipedia.org/wiki/Duty_cycle). Duty cycles måles som procentdelen af tiden, signalet er i tændt tilstand sammenlignet med slukket tilstand. + +![Pulsbreddemodulation rotation af en motor ved 75 RPM](../../../../../translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.da.png) + +Du kan ændre motorens hastighed ved at ændre størrelsen på impulserne. For eksempel kan du med den samme motor beholde den samme cyklustid på 0,04s, men halvere den tændte impuls til 0,01s og øge den slukkede impuls til 0,03s. Du har det samme antal impulser per sekund (25), men hver tændt impuls er halvt så lang. En halv længde impuls drejer kun motoren en tyvendedel af en rotation, og ved 25 impulser per sekund vil den fuldføre 1,25 rotationer per sekund eller 75rpm. Ved at ændre impulsens hastighed på et digitalt signal har du halveret hastigheden på en analog motor. + +```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 +``` + +✅ Hvordan ville du holde motorens rotation jævn, især ved lave hastigheder? Ville du bruge et lille antal lange impulser med lange pauser eller mange meget korte impulser med meget korte pauser? + +> 💁 Nogle sensorer bruger også PWM til at konvertere analoge signaler til digitale signaler. + +> 🎓 Du kan læse mere om pulsbreddemodulation på [pulsbreddemodulationssiden på Wikipedia](https://wikipedia.org/wiki/Pulse-width_modulation). + +### Digitale aktuatorer + +Digitale aktuatorer, ligesom digitale sensorer, har enten to tilstande, der styres af en høj eller lav spænding, eller har en indbygget DAC, der kan konvertere et digitalt signal til et analogt. + +En simpel digital aktuator er en LED. Når en enhed sender et digitalt signal på 1, sendes en høj spænding, der tænder LED'en. Når et digitalt signal på 0 sendes, falder spændingen til 0V, og LED'en slukkes. + +![En LED er slukket ved 0 volt og tændt ved 5V](../../../../../translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.da.png) + +✅ Hvilke andre simple 2-tilstands aktuatorer kan du komme i tanke om? Et eksempel er en solenoid, som er en elektromagnet, der kan aktiveres til at gøre ting som at flytte en dørlås, der låser/oplåser en dør. + +Mere avancerede digitale aktuatorer, såsom skærme, kræver, at de digitale data sendes i bestemte formater. De kommer normalt med biblioteker, der gør det lettere at sende de korrekte data til at styre dem. + +--- + +## 🚀 Udfordring + +Udfordringen i de sidste to lektioner var at liste så mange IoT-enheder som muligt, der findes i dit hjem, skole eller arbejdsplads, og afgøre, om de er bygget omkring mikrocontrollere eller single-board computere, eller endda en blanding af begge. + +For hver enhed, du listede, hvilke sensorer og aktuatorer er de forbundet til? Hvad er formålet med hver sensor og aktuator, der er forbundet til disse enheder? + +## Quiz efter lektionen + +[Quiz efter lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6) + +## Gennemgang & Selvstudie + +* Læs om elektricitet og kredsløb på [ThingLearn](http://thinglearn.jenlooper.com/curriculum/). +* Læs om de forskellige typer temperatursensorer på [Seeed Studios guide til temperatursensorer](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/) +* Læs om LED'er på [Wikipedia-siden om LED](https://wikipedia.org/wiki/Light-emitting_diode) + +## Opgave + +[Undersøg sensorer og aktuatorer](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at opnå nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/3-sensors-and-actuators/assignment.md b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/assignment.md new file mode 100644 index 00000000..f0864718 --- /dev/null +++ b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/assignment.md @@ -0,0 +1,31 @@ + +# Forskning i sensorer og aktuatorer + +## Instruktioner + +Denne lektion dækkede sensorer og aktuatorer. Undersøg og beskriv en sensor og en aktuator, der kan bruges med et IoT-udviklingssæt, inklusive: + +* Hvad den gør +* Den elektronik/hardware, der bruges indeni +* Om den er analog eller digital +* Hvad enhederne og området for input eller målinger er + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Beskriv en sensor | Beskrev en sensor med detaljer for alle 4 sektioner nævnt ovenfor. | Beskrev en sensor, men kunne kun give detaljer for 2-3 af sektionerne ovenfor. | Beskrev en sensor, men kunne kun give detaljer for 1 af sektionerne ovenfor. | +| Beskriv en aktuator | Beskrev en aktuator med detaljer for alle 4 sektioner nævnt ovenfor. | Beskrev en aktuator, men kunne kun give detaljer for 2-3 af sektionerne ovenfor. | Beskrev en aktuator, men kunne kun give detaljer for 1 af sektionerne ovenfor. | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md new file mode 100644 index 00000000..52ce763f --- /dev/null +++ b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/pi-actuator.md @@ -0,0 +1,130 @@ + +# Byg en natlampe - Raspberry Pi + +I denne del af lektionen vil du tilføje en LED til din Raspberry Pi og bruge den til at skabe en natlampe. + +## Hardware + +Natlampen har nu brug for en aktuator. + +Aktuatoren er en **LED**, en [lysdioder](https://wikipedia.org/wiki/Light-emitting_diode), der udsender lys, når strøm løber igennem den. Dette er en digital aktuator, der har to tilstande: tændt og slukket. Ved at sende en værdi på 1 tændes LED'en, og ved at sende en værdi på 0 slukkes den. LED'en er en ekstern Grove-aktuator og skal tilsluttes Grove Base-hatten på Raspberry Pi. + +Natlampens logik i pseudo-kode er: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Tilslut LED'en + +Grove LED'en leveres som en modul med et udvalg af LED'er, så du kan vælge farven. + +#### Opgave - tilslut LED'en + +Tilslut LED'en. + +![En Grove LED](../../../../../translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.da.png) + +1. Vælg din foretrukne LED, og indsæt benene i de to huller på LED-modulet. + + LED'er er lysdioder, og dioder er elektroniske komponenter, der kun kan føre strøm i én retning. Det betyder, at LED'en skal tilsluttes korrekt, ellers virker den ikke. + + Et af LED'ens ben er den positive pin, og det andet er den negative pin. LED'en er ikke helt rund og er en smule fladere på den ene side. Den lidt fladere side er den negative pin. Når du tilslutter LED'en til modulet, skal du sørge for, at benet ved den runde side er forbundet til stikket mærket **+** på ydersiden af modulet, og den fladere side er forbundet til stikket tættere på midten af modulet. + +1. LED-modulet har en drejeknap, der giver dig mulighed for at justere lysstyrken. Drej denne helt op til at starte med ved at rotere den mod uret så langt som muligt med en lille stjerneskruetrækker. + +1. Sæt den ene ende af et Grove-kabel i stikket på LED-modulet. Det kan kun sættes i på én måde. + +1. Med Raspberry Pi slukket skal du tilslutte den anden ende af Grove-kablet til det digitale stik mærket **D5** på Grove Base-hatten, der er tilsluttet Pi'en. Dette stik er det andet fra venstre i rækken af stik ved siden af GPIO-pindene. + +![Grove LED tilsluttet stik D5](../../../../../translated_images/pi-led.97f1d474981dc35d1c7996c7b17de355d3d0a6bc9606d79fa5f89df933415122.da.png) + +## Programmer natlampen + +Natlampen kan nu programmeres ved hjælp af Grove-lyssensoren og Grove LED'en. + +### Opgave - programmer natlampen + +Programmer natlampen. + +1. Tænd for Pi'en, og vent på, at den starter op. + +1. Åbn natlampeprojektet i VS Code, som du oprettede i den forrige del af denne opgave, enten direkte på Pi'en eller ved hjælp af Remote SSH-udvidelsen. + +1. Tilføj følgende kode til `app.py`-filen for at importere et nødvendigt bibliotek. Dette skal tilføjes øverst, under de andre `import`-linjer. + + ```python + from grove.grove_led import GroveLed + ``` + + `from grove.grove_led import GroveLed`-sætningen importerer `GroveLed` fra Grove Python-bibliotekerne. Dette bibliotek indeholder kode til at interagere med en Grove LED. + +1. Tilføj følgende kode efter `light_sensor`-deklarationen for at oprette en instans af klassen, der styrer LED'en: + + ```python + led = GroveLed(5) + ``` + + Linjen `led = GroveLed(5)` opretter en instans af `GroveLed`-klassen, der forbinder til pin **D5** - den digitale Grove-pin, som LED'en er tilsluttet. + + > 💁 Alle stikkene har unikke pin-numre. Pins 0, 2, 4 og 6 er analoge pins, mens pins 5, 16, 18, 22, 24 og 26 er digitale pins. + +1. Tilføj en kontrol inde i `while`-løkken, og før `time.sleep` for at tjekke lysniveauerne og tænde eller slukke LED'en: + + ```python + if light < 300: + led.on() + else: + led.off() + ``` + + Denne kode tjekker værdien `light`. Hvis denne er mindre end 300, kalder den `on`-metoden fra `GroveLed`-klassen, som sender en digital værdi på 1 til LED'en og tænder den. Hvis lysværdien er større end eller lig med 300, kalder den `off`-metoden, som sender en digital værdi på 0 til LED'en og slukker den. + + > 💁 Denne kode skal indrykkes på samme niveau som linjen `print('Light level:', light)` for at være inde i while-løkken! + + > 💁 Når der sendes digitale værdier til aktuatorer, er en værdi på 0 lig med 0V, og en værdi på 1 er den maksimale spænding for enheden. For Raspberry Pi med Grove-sensorer og -aktuatorer er spændingen for 1 3,3V. + +1. Fra VS Code-terminalen skal du køre følgende for at køre din Python-app: + + ```sh + python3 app.py + ``` + + Lysværdier vil blive vist i konsollen. + + ```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. Dæk og afdæk lyssensoren. Bemærk, hvordan LED'en lyser op, hvis lysniveauet er 300 eller mindre, og slukker, når lysniveauet er større end 300. + + > 💁 Hvis LED'en ikke tænder, skal du sikre dig, at den er tilsluttet korrekt, og at drejeknappen er sat til fuld styrke. + +![LED'en tilsluttet Pi'en tænder og slukker, når lysniveauet ændrer sig](../../../../../images/pi-running-assignment-1-1.gif) + +> 💁 Du kan finde denne kode i [code-actuator/pi](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/pi)-mappen. + +😀 Dit natlampeprogram var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md new file mode 100644 index 00000000..725ab76c --- /dev/null +++ b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/pi-sensor.md @@ -0,0 +1,110 @@ + +# Byg en natlampe - Raspberry Pi + +I denne del af lektionen vil du tilføje en lyssensor til din Raspberry Pi. + +## Hardware + +Sensoren til denne lektion er en **lyssensor**, der bruger en [fotodiode](https://wikipedia.org/wiki/Photodiode) til at omdanne lys til et elektrisk signal. Dette er en analog sensor, der sender en heltalsværdi fra 0 til 1.000, som angiver en relativ mængde lys. Denne værdi svarer ikke til nogen standard måleenhed som f.eks. [lux](https://wikipedia.org/wiki/Lux). + +Lyssensoren er en ekstern Grove-sensor og skal tilsluttes Grove Base-hatten på Raspberry Pi. + +### Tilslut lyssensoren + +Grove-lyssensoren, der bruges til at registrere lysniveauer, skal forbindes til Raspberry Pi. + +#### Opgave - tilslut lyssensoren + +Tilslut lyssensoren. + +![En Grove-lyssensor](../../../../../translated_images/grove-light-sensor.b8127b7c434e632d6bcdb57587a14e9ef69a268a22df95d08628f62b8fa5505c.da.png) + +1. Sæt den ene ende af et Grove-kabel i stikket på lyssensormodulet. Det kan kun sættes i på én måde. + +1. Med Raspberry Pi slukket, tilslut den anden ende af Grove-kablet til det analoge stik mærket **A0** på Grove Base-hatten, der er tilsluttet Pi'en. Dette stik er det andet fra højre i rækken af stik ved siden af GPIO-pindene. + +![Grove-lyssensoren tilsluttet stik A0](../../../../../translated_images/pi-light-sensor.66cc1e31fa48cd7d5f23400d4b2119aa41508275cb7c778053a7923b4e972d7e.da.png) + +## Programmer lyssensoren + +Enheden kan nu programmeres ved hjælp af Grove-lyssensoren. + +### Opgave - programmer lyssensoren + +Programmer enheden. + +1. Tænd for Pi'en og vent, til den er startet op. + +1. Åbn natlampeprojektet i VS Code, som du oprettede i den forrige del af denne opgave, enten direkte på Pi'en eller ved hjælp af Remote SSH-udvidelsen. + +1. Åbn filen `app.py`, og fjern al eksisterende kode fra den. + +1. Tilføj følgende kode til `app.py`-filen for at importere nogle nødvendige biblioteker: + + ```python + import time + from grove.grove_light_sensor_v1_2 import GroveLightSensor + ``` + + `import time`-sætningen importerer `time`-modulet, som vil blive brugt senere i denne opgave. + + `from grove.grove_light_sensor_v1_2 import GroveLightSensor`-sætningen importerer `GroveLightSensor` fra Grove Python-bibliotekerne. Dette bibliotek indeholder kode til at interagere med en Grove-lyssensor og blev installeret globalt under opsætningen af Pi'en. + +1. Tilføj følgende kode efter ovenstående for at oprette en instans af klassen, der styrer lyssensoren: + + ```python + light_sensor = GroveLightSensor(0) + ``` + + Linjen `light_sensor = GroveLightSensor(0)` opretter en instans af `GroveLightSensor`-klassen, der forbinder til pin **A0** - det analoge Grove-stik, som lyssensoren er tilsluttet. + +1. Tilføj en uendelig løkke efter ovenstående kode for at aflæse lyssensorens værdi og udskrive den til konsollen: + + ```python + while True: + light = light_sensor.light + print('Light level:', light) + ``` + + Dette vil aflæse det aktuelle lysniveau på en skala fra 0-1.023 ved hjælp af `light`-egenskaben i `GroveLightSensor`-klassen. Denne egenskab aflæser den analoge værdi fra stikket. Værdien udskrives derefter til konsollen. + +1. Tilføj en kort pause på et sekund i slutningen af `loop`, da lysniveauerne ikke behøver at blive kontrolleret kontinuerligt. En pause reducerer enhedens strømforbrug. + + ```python + time.sleep(1) + ``` + +1. Fra VS Code-terminalen skal du køre følgende for at starte din Python-app: + + ```sh + python3 app.py + ``` + + Lysværdier vil blive udskrevet til konsollen. Dæk og afdæk lyssensoren, og værdierne vil ændre sig: + + ```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 + ``` + +> 💁 Du kan finde denne kode i [code-sensor/pi](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/pi)-mappen. + +😀 Det var en succes at tilføje en sensor til dit natlampeprogram! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md new file mode 100644 index 00000000..a967496c --- /dev/null +++ b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md @@ -0,0 +1,124 @@ + +# Byg en natlampe - Virtuel IoT-hardware + +I denne del af lektionen vil du tilføje en LED til din virtuelle IoT-enhed og bruge den til at skabe en natlampe. + +## Virtuel hardware + +Natlampen kræver én aktuator, som oprettes i CounterFit-appen. + +Aktuatoren er en **LED**. På en fysisk IoT-enhed ville det være en [lysdiod](https://wikipedia.org/wiki/Light-emitting_diode), der udsender lys, når strøm løber igennem den. Dette er en digital aktuator, der har to tilstande: tændt og slukket. Hvis du sender en værdi på 1, tændes LED'en, og hvis du sender en værdi på 0, slukkes den. + +Natlampens logik i pseudo-kode er: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Tilføj aktuatoren til CounterFit + +For at bruge en virtuel LED skal du tilføje den til CounterFit-appen. + +#### Opgave - tilføj aktuatoren til CounterFit + +Tilføj LED'en til CounterFit-appen. + +1. Sørg for, at CounterFit-webappen kører fra den tidligere del af denne opgave. Hvis ikke, start den og tilføj lyssensoren igen. + +1. Opret en LED: + + 1. I boksen *Create actuator* i panelet *Actuator*, klik på rullemenuen *Actuator type* og vælg *LED*. + + 1. Sæt *Pin* til *5*. + + 1. Vælg knappen **Add** for at oprette LED'en på Pin 5. + + ![LED-indstillingerne](../../../../../translated_images/counterfit-create-led.ba9db1c9b8c622a635d6dfae5cdc4e70c2b250635bd4f0601c6cf0bd22b7ba46.da.png) + + LED'en vil blive oprettet og vises i listen over aktuatorer. + + ![LED'en oprettet](../../../../../translated_images/counterfit-led.c0ab02de6d256ad84d9bad4d67a7faa709f0ea83e410cfe9b5561ef0cef30b1c.da.png) + + Når LED'en er oprettet, kan du ændre farven ved hjælp af *Color*-vælgeren. Vælg knappen **Set** for at ændre farven, efter du har valgt den. + +### Programmer natlampen + +Natlampen kan nu programmeres ved hjælp af CounterFit-lyssensoren og LED'en. + +#### Opgave - programmer natlampen + +Programmer natlampen. + +1. Åbn natlampeprojektet i VS Code, som du oprettede i den tidligere del af denne opgave. Luk og genopret terminalen for at sikre, at den kører med det virtuelle miljø, hvis nødvendigt. + +1. Åbn filen `app.py`. + +1. Tilføj følgende kode til filen `app.py` for at importere et nødvendigt bibliotek. Dette skal tilføjes øverst, under de andre `import`-linjer. + + ```python + from counterfit_shims_grove.grove_led import GroveLed + ``` + + Sætningen `from counterfit_shims_grove.grove_led import GroveLed` importerer `GroveLed` fra CounterFit Grove shim Python-bibliotekerne. Dette bibliotek indeholder kode til at interagere med en LED, der er oprettet i CounterFit-appen. + +1. Tilføj følgende kode efter `light_sensor`-deklarationen for at oprette en instans af klassen, der styrer LED'en: + + ```python + led = GroveLed(5) + ``` + + Linjen `led = GroveLed(5)` opretter en instans af klassen `GroveLed`, der forbinder til pin **5** - CounterFit Grove-pinnen, som LED'en er tilsluttet. + +1. Tilføj en kontrol inde i `while`-løkken og før `time.sleep` for at kontrollere lysniveauerne og tænde eller slukke LED'en: + + ```python + if light < 300: + led.on() + else: + led.off() + ``` + + Denne kode kontrollerer værdien `light`. Hvis denne er mindre end 300, kalder den metoden `on` fra klassen `GroveLed`, som sender en digital værdi på 1 til LED'en og tænder den. Hvis lysværdien er større end eller lig med 300, kalder den metoden `off`, som sender en digital værdi på 0 til LED'en og slukker den. + + > 💁 Denne kode skal indrykkes på samme niveau som linjen `print('Light level:', light)` for at være inde i while-løkken! + +1. Fra VS Code-terminalen skal du køre følgende for at køre din Python-app: + + ```sh + python3 app.py + ``` + + Lysværdier vil blive vist i konsollen. + + ```output + (.venv) ➜ GroveTest python3 app.py + Light level: 143 + Light level: 244 + Light level: 246 + Light level: 253 + ``` + +1. Ændr indstillingen *Value* eller *Random* for at variere lysniveauet over og under 300. LED'en vil tænde og slukke. + +![LED'en i CounterFit-appen tænder og slukker, når lysniveauet ændrer sig](../../../../../images/virtual-device-running-assignment-1-1.gif) + +> 💁 Du kan finde denne kode i mappen [code-actuator/virtual-device](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/virtual-device). + +😀 Dit natlampeprogram var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md new file mode 100644 index 00000000..cece8b13 --- /dev/null +++ b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md @@ -0,0 +1,124 @@ + +# Byg en natlampe - Virtuel IoT-hardware + +I denne del af lektionen vil du tilføje en lyssensor til din virtuelle IoT-enhed. + +## Virtuel hardware + +Natlampen har brug for én sensor, som oprettes i CounterFit-appen. + +Sensoren er en **lyssensor**. På en fysisk IoT-enhed ville det være en [fotodiode](https://wikipedia.org/wiki/Photodiode), der konverterer lys til et elektrisk signal. Lyssensorer er analoge sensorer, der sender en heltalsværdi, som angiver en relativ mængde lys, uden at det svarer til en standard måleenhed som [lux](https://wikipedia.org/wiki/Lux). + +### Tilføj sensorer til CounterFit + +For at bruge en virtuel lyssensor skal du tilføje den til CounterFit-appen. + +#### Opgave - tilføj sensorer til CounterFit + +Tilføj lyssensoren til CounterFit-appen. + +1. Sørg for, at CounterFit-webappen kører fra den tidligere del af denne opgave. Hvis ikke, start den. + +1. Opret en lyssensor: + + 1. I boksen *Create sensor* i panelet *Sensors*, klik på rullemenuen *Sensor type* og vælg *Light*. + + 1. Lad *Units* være indstillet til *NoUnits*. + + 1. Sørg for, at *Pin* er indstillet til *0*. + + 1. Klik på knappen **Add** for at oprette lyssensoren på Pin 0. + + ![Indstillinger for lyssensoren](../../../../../translated_images/counterfit-create-light-sensor.9f36a5e0d4458d8d554d54b34d2c806d56093d6e49fddcda2d20f6fef7f5cce1.da.png) + + Lyssensoren vil blive oprettet og vises i sensorlisten. + + ![Lyssensoren oprettet](../../../../../translated_images/counterfit-light-sensor.5d0f5584df56b90f6b2561910d9cb20dfbd73eeff2177c238d38f4de54aefae1.da.png) + +## Programmer lyssensoren + +Enheden kan nu programmeres til at bruge den indbyggede lyssensor. + +### Opgave - programmer lyssensoren + +Programmer enheden. + +1. Åbn natlampeprojektet i VS Code, som du oprettede i den tidligere del af denne opgave. Luk og genopret terminalen for at sikre, at den kører med det virtuelle miljø, hvis nødvendigt. + +1. Åbn filen `app.py`. + +1. Tilføj følgende kode øverst i filen `app.py` sammen med de øvrige `import`-udsagn for at importere nogle nødvendige biblioteker: + + ```python + import time + from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor + ``` + + Udsagnet `import time` importerer Pythons `time`-modul, som vil blive brugt senere i denne opgave. + + Udsagnet `from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor` importerer `GroveLightSensor` fra CounterFit Grove shim Python-bibliotekerne. Dette bibliotek indeholder kode til at interagere med en lyssensor oprettet i CounterFit-appen. + +1. Tilføj følgende kode nederst i filen for at oprette instanser af klasser, der styrer lyssensoren: + + ```python + light_sensor = GroveLightSensor(0) + ``` + + Linjen `light_sensor = GroveLightSensor(0)` opretter en instans af klassen `GroveLightSensor`, der forbinder til pin **0** - CounterFit Grove-pinnen, som lyssensoren er tilsluttet. + +1. Tilføj en uendelig løkke efter koden ovenfor for at aflæse lyssensorens værdi og udskrive den til konsollen: + + ```python + while True: + light = light_sensor.light + print('Light level:', light) + ``` + + Dette vil aflæse det aktuelle lysniveau ved hjælp af egenskaben `light` fra klassen `GroveLightSensor`. Denne egenskab aflæser den analoge værdi fra pinnen. Værdien udskrives derefter til konsollen. + +1. Tilføj en kort pause på ét sekund i slutningen af `while`-løkken, da lysniveauerne ikke behøver at blive kontrolleret kontinuerligt. En pause reducerer enhedens strømforbrug. + + ```python + time.sleep(1) + ``` + +1. Fra VS Code-terminalen skal du køre følgende for at starte din Python-app: + + ```sh + python3 app.py + ``` + + Lysværdier vil blive udskrevet til konsollen. I starten vil denne værdi være 0. + +1. Fra CounterFit-appen skal du ændre værdien af lyssensoren, som vil blive aflæst af appen. Du kan gøre dette på to måder: + + * Indtast et tal i boksen *Value* for lyssensoren, og klik derefter på knappen **Set**. Det tal, du indtaster, vil være den værdi, sensoren returnerer. + + * Marker afkrydsningsfeltet *Random*, og indtast en *Min* og *Max*-værdi, og klik derefter på knappen **Set**. Hver gang sensoren aflæser en værdi, vil den aflæse et tilfældigt tal mellem *Min* og *Max*. + + De værdier, du indstiller, vil blive udskrevet til konsollen. Ændr *Value* eller *Random*-indstillingerne for at få værdien til at ændre sig. + + ```output + (.venv) ➜ GroveTest python3 app.py + Light level: 143 + Light level: 244 + Light level: 246 + Light level: 253 + ``` + +> 💁 Du kan finde denne kode i mappen [code-sensor/virtual-device](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/virtual-device). + +😀 Dit natlampeprogram var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md new file mode 100644 index 00000000..4bdc1b4f --- /dev/null +++ b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-actuator.md @@ -0,0 +1,124 @@ + +# Byg en natlampe - Wio Terminal + +I denne del af lektionen vil du tilføje en LED til din Wio Terminal og bruge den til at lave en natlampe. + +## Hardware + +Natlampen har nu brug for en aktuator. + +Aktuatoren er en **LED**, en [lysemitterende diode](https://wikipedia.org/wiki/Light-emitting_diode), der udsender lys, når strøm løber igennem den. Dette er en digital aktuator, der har to tilstande: tændt og slukket. Hvis du sender en værdi på 1, tændes LED'en, og hvis du sender en værdi på 0, slukkes den. Dette er en ekstern Grove-aktuator, som skal tilsluttes Wio Terminal. + +Logikken for natlampen i pseudokode er: + +```output +Check the light level. +If the light is less than 300 + Turn the LED on +Otherwise + Turn the LED off +``` + +### Tilslut LED'en + +Grove LED'en kommer som en modul med et udvalg af LED'er, så du kan vælge farven. + +#### Opgave - tilslut LED'en + +Tilslut LED'en. + +![En Grove LED](../../../../../translated_images/grove-led.6c853be93f473cf2c439cfc74bb1064732b22251a83cedf66e62f783f9cc1a79.da.png) + +1. Vælg din favorit LED og indsæt benene i de to huller på LED-modulet. + + LED'er er lysemitterende dioder, og dioder er elektroniske komponenter, der kun kan føre strøm i én retning. Det betyder, at LED'en skal tilsluttes korrekt, ellers virker den ikke. + + Et af benene på LED'en er den positive pin, og det andet er den negative pin. LED'en er ikke helt rund og er lidt fladere på den ene side. Den lidt fladere side er den negative pin. Når du tilslutter LED'en til modulet, skal du sørge for, at benet ved den runde side er tilsluttet stikket markeret med **+** på ydersiden af modulet, og den fladere side er tilsluttet stikket tættere på midten af modulet. + +1. LED-modulet har en drejeknap, der giver dig mulighed for at kontrollere lysstyrken. Drej denne helt op til at starte med ved at rotere den mod uret så langt som muligt med en lille stjerneskruetrækker. + +1. Indsæt den ene ende af et Grove-kabel i stikket på LED-modulet. Det kan kun indsættes på én måde. + +1. Med Wio Terminal frakoblet fra din computer eller anden strømkilde, tilslut den anden ende af Grove-kablet til det højre Grove-stik på Wio Terminal, når du ser på skærmen. Dette er stikket længst væk fra tænd/sluk-knappen. + + > 💁 Det højre Grove-stik kan bruges med analoge eller digitale sensorer og aktuatorer. Det venstre stik er kun til digitale sensorer og aktuatorer. C vil blive dækket i en senere lektion. + +![Grove LED tilsluttet det højre stik](../../../../../translated_images/wio-led.265a1897e72d7f21c753257516a4b677d8e30ce2b95fee98189458b3275ba0a6.da.png) + +## Programmer natlampen + +Natlampen kan nu programmeres ved hjælp af den indbyggede lyssensor og Grove LED'en. + +### Opgave - programmer natlampen + +Programmer natlampen. + +1. Åbn natlampeprojektet i VS Code, som du oprettede i den tidligere del af denne opgave. + +1. Tilføj følgende linje nederst i `setup`-funktionen: + + ```cpp + pinMode(D0, OUTPUT); + ``` + + Denne linje konfigurerer den pin, der bruges til at kommunikere med LED'en via Grove-porten. + + `D0`-pinnen er den digitale pin for det højre Grove-stik. Denne pin er sat til `OUTPUT`, hvilket betyder, at den er forbundet til en aktuator, og data vil blive skrevet til pinnen. + +1. Tilføj følgende kode umiddelbart før `delay` i loop-funktionen: + + ```cpp + if (light < 300) + { + digitalWrite(D0, HIGH); + } + else + { + digitalWrite(D0, LOW); + } + ``` + + Denne kode kontrollerer `light`-værdien. Hvis denne er mindre end 300, sendes en `HIGH`-værdi til den digitale pin `D0`. Denne `HIGH` er en værdi på 1, som tænder LED'en. Hvis lyset er større end eller lig med 300, sendes en `LOW`-værdi på 0 til pinnen, hvilket slukker LED'en. + + > 💁 Når der sendes digitale værdier til aktuatorer, er en LOW-værdi 0v, og en HIGH-værdi er den maksimale spænding for enheden. For Wio Terminal er den høje spænding 3.3V. + +1. Tilslut Wio Terminal til din computer igen, og upload den nye kode, som du gjorde før. + +1. Tilslut Serial Monitor. Lysværdier vil blive vist i terminalen. + + ```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. Dæk og afdæk lyssensoren. Bemærk, hvordan LED'en lyser op, hvis lysniveauet er 300 eller mindre, og slukker, når lysniveauet er større end 300. + +![LED'en tilsluttet Wio Terminal tænder og slukker, når lysniveauet ændrer sig](../../../../../images/wio-running-assignment-1-1.gif) + +> 💁 Du kan finde denne kode i [code-actuator/wio-terminal](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-actuator/wio-terminal)-mappen. + +😀 Dit natlampeprogram var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md new file mode 100644 index 00000000..571e4707 --- /dev/null +++ b/translations/da/1-getting-started/lessons/3-sensors-and-actuators/wio-terminal-sensor.md @@ -0,0 +1,87 @@ + +# Tilføj en sensor - Wio Terminal + +I denne del af lektionen vil du bruge lyssensoren på din Wio Terminal. + +## Hardware + +Sensoren til denne lektion er en **lyssensor**, der bruger en [fotodiode](https://wikipedia.org/wiki/Photodiode) til at omdanne lys til et elektrisk signal. Dette er en analog sensor, der sender en heltalsværdi fra 0 til 1.023, som angiver en relativ mængde lys, der ikke svarer til nogen standard måleenhed som [lux](https://wikipedia.org/wiki/Lux). + +Lyssensoren er indbygget i Wio Terminal og er synlig gennem det klare plastvindue på bagsiden. + +![Lyssensoren på bagsiden af Wio Terminal](../../../../../translated_images/wio-light-sensor.b1f529f3c95f51654f2e2c1d2d4b55fe547d189f588c974f5c2462c728133840.da.png) + +## Programmer lyssensoren + +Enheden kan nu programmeres til at bruge den indbyggede lyssensor. + +### Opgave + +Programmer enheden. + +1. Åbn natlyset-projektet i VS Code, som du oprettede i den tidligere del af denne opgave. + +1. Tilføj følgende linje nederst i `setup`-funktionen: + + ```cpp + pinMode(WIO_LIGHT, INPUT); + ``` + + Denne linje konfigurerer de pins, der bruges til at kommunikere med sensorens hardware. + + `WIO_LIGHT`-pinnen er nummeret på GPIO-pinnen, der er forbundet til den indbyggede lyssensor. Denne pin er sat til `INPUT`, hvilket betyder, at den er forbundet til en sensor, og data vil blive læst fra pinnen. + +1. Slet indholdet af `loop`-funktionen. + +1. Tilføj følgende kode til den nu tomme `loop`-funktion. + + ```cpp + int light = analogRead(WIO_LIGHT); + Serial.print("Light value: "); + Serial.println(light); + ``` + + Denne kode læser en analog værdi fra `WIO_LIGHT`-pinnen. Den læser en værdi fra 0-1.023 fra den indbyggede lyssensor. Denne værdi sendes derefter til den serielle port, så du kan læse den i Serial Monitor, når denne kode kører. `Serial.print` skriver teksten uden en ny linje i slutningen, så hver linje starter med `Light value:` og slutter med den faktiske lysværdi. + +1. Tilføj en lille forsinkelse på et sekund (1.000ms) i slutningen af `loop`, da lysniveauerne ikke behøver at blive kontrolleret kontinuerligt. En forsinkelse reducerer enhedens strømforbrug. + + ```cpp + delay(1000); + ``` + +1. Tilslut Wio Terminal til din computer igen, og upload den nye kode, som du gjorde før. + +1. Tilslut Serial Monitor. Lysværdier vil blive output til terminalen. Dæk og afdæk lyssensoren på bagsiden af Wio Terminal, og værdierne vil ændre sig. + + ```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 + ``` + +> 💁 Du kan finde denne kode i [code-sensor/wio-terminal](../../../../../1-getting-started/lessons/3-sensors-and-actuators/code-sensor/wio-terminal)-mappen. + +😀 Det var en succes at tilføje en sensor til dit natlyset-program! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at opnå nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/4-connect-internet/README.md b/translations/da/1-getting-started/lessons/4-connect-internet/README.md new file mode 100644 index 00000000..c18b8ae3 --- /dev/null +++ b/translations/da/1-getting-started/lessons/4-connect-internet/README.md @@ -0,0 +1,468 @@ + +# Tilslut din enhed til internettet + +![En sketchnote-oversigt over denne lektion](../../../../../translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +Denne lektion blev undervist som en del af [Hello IoT-serien](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) fra [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Lektionen blev præsenteret i to videoer - en 1-times lektion og en 1-times spørgetime, hvor dele af lektionen blev uddybet, og spørgsmål blev besvaret. + +[![Lektion 4: Tilslut din enhed til internettet](https://img.youtube.com/vi/O4dd172mZhs/0.jpg)](https://youtu.be/O4dd172mZhs) + +[![Lektion 4: Tilslut din enhed til internettet - Spørgetime](https://img.youtube.com/vi/j-cVCzRDE2Q/0.jpg)](https://youtu.be/j-cVCzRDE2Q) + +> 🎥 Klik på billederne ovenfor for at se videoerne + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/7) + +## Introduktion + +**I** i IoT står for **Internet** - den cloud-forbindelse og de tjenester, der muliggør mange af funktionerne i IoT-enheder, fra at indsamle målinger fra sensorerne, der er tilsluttet enheden, til at sende beskeder for at styre aktuatorer. IoT-enheder forbinder typisk til en enkelt cloud IoT-tjeneste ved hjælp af en standard kommunikationsprotokol, og denne tjeneste er forbundet til resten af din IoT-applikation, fra AI-tjenester til at træffe smarte beslutninger baseret på dine data, til webapps til kontrol eller rapportering. + +> 🎓 Data, der indsamles fra sensorer og sendes til skyen, kaldes telemetri. + +IoT-enheder kan modtage beskeder fra skyen. Ofte indeholder disse beskeder kommandoer - altså instruktioner til at udføre en handling enten internt (såsom genstart eller opdatering af firmware) eller ved hjælp af en aktuator (såsom at tænde et lys). + +Denne lektion introducerer nogle af de kommunikationsprotokoller, som IoT-enheder kan bruge til at forbinde til skyen, og de typer data, de kan sende eller modtage. Du vil også få praktisk erfaring med begge dele, hvor du tilføjer internetkontrol til din natlampe og flytter LED-styringslogikken til 'server'-kode, der kører lokalt. + +I denne lektion dækker vi: + +* [Kommunikationsprotokoller](../../../../../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) +* [Kommandoer](../../../../../1-getting-started/lessons/4-connect-internet) + +## Kommunikationsprotokoller + +Der findes en række populære kommunikationsprotokoller, som IoT-enheder bruger til at kommunikere med internettet. De mest populære er baseret på publish/subscribe-messaging via en form for broker. IoT-enheder forbinder til brokeren og publicerer telemetri og abonnerer på kommandoer. Cloud-tjenester forbinder også til brokeren og abonnerer på alle telemetribeskeder og publicerer kommandoer enten til specifikke enheder eller til grupper af enheder. + +![IoT-enheder forbinder til en broker og publicerer telemetri og abonnerer på kommandoer. Cloud-tjenester forbinder til brokeren og abonnerer på al telemetri og sender kommandoer til specifikke enheder.](../../../../../translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.da.png) + +MQTT er den mest populære kommunikationsprotokol for IoT-enheder og dækkes i denne lektion. Andre protokoller inkluderer AMQP og HTTP/HTTPS. + +## Message Queueing Telemetry Transport (MQTT) + +[MQTT](http://mqtt.org) er en letvægts, åben standard messaging-protokol, der kan sende beskeder mellem enheder. Den blev designet i 1999 til at overvåge olieledninger og blev frigivet som en åben standard 15 år senere af IBM. + +MQTT har en enkelt broker og flere klienter. Alle klienter forbinder til brokeren, og brokeren videresender beskeder til de relevante klienter. Beskeder videresendes ved hjælp af navngivne emner (topics) i stedet for at blive sendt direkte til en individuel klient. En klient kan publicere til et emne, og alle klienter, der abonnerer på det emne, vil modtage beskeden. + +![IoT-enhed, der publicerer telemetri på /telemetry-emnet, og cloud-tjenesten, der abonnerer på det emne](../../../../../translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.da.png) + +✅ Lav noget research. Hvis du har mange IoT-enheder, hvordan kan du sikre, at din MQTT-broker kan håndtere alle beskederne? + +### Forbind din IoT-enhed til MQTT + +Den første del af at tilføje internetkontrol til din natlampe er at forbinde den til en MQTT-broker. + +#### Opgave + +Forbind din enhed til en MQTT-broker. + +I denne del af lektionen vil du forbinde din IoT-natlampe til internettet for at gøre det muligt at styre den eksternt. Senere i lektionen vil din IoT-enhed sende en telemetribesked over MQTT til en offentlig MQTT-broker med lysniveauet, hvor den vil blive opfanget af noget serverkode, som du vil skrive. Denne kode vil kontrollere lysniveauet og sende en kommando tilbage til enheden, der fortæller den, om LED'en skal tændes eller slukkes. + +En reel anvendelse af et sådant setup kunne være at indsamle data fra flere lyssensorer, før man beslutter at tænde lysene i et område med mange lys, såsom et stadion. Dette kunne forhindre, at lysene tændes, hvis kun én sensor er dækket af skyer eller en fugl, mens de andre sensorer registrerer tilstrækkeligt lys. + +✅ Hvilke andre situationer kunne kræve, at data fra flere sensorer evalueres, før der sendes kommandoer? + +I stedet for at håndtere kompleksiteten ved at opsætte en MQTT-broker som en del af denne opgave, kan du bruge en offentlig testserver, der kører [Eclipse Mosquitto](https://www.mosquitto.org), en open-source MQTT-broker. Denne testbroker er offentligt tilgængelig på [test.mosquitto.org](https://test.mosquitto.org) og kræver ikke, at du opretter en konto, hvilket gør den til et fantastisk værktøj til at teste MQTT-klienter og -servere. + +> 💁 Denne testbroker er offentlig og ikke sikker. Enhver kan lytte til, hvad du publicerer, så den bør ikke bruges til data, der skal holdes private. + +![Et flowdiagram over opgaven, der viser lysniveauer, der aflæses og kontrolleres, og LED'en, der styres](../../../../../translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.da.png) + +Følg det relevante trin nedenfor for at forbinde din enhed til MQTT-brokeren: + +* [Arduino - Wio Terminal](wio-terminal-mqtt.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-mqtt.md) + +### En dybere forståelse af MQTT + +Emner (topics) kan have en hierarki, og klienter kan abonnere på forskellige niveauer af hierarkiet ved hjælp af wildcards. For eksempel kan du sende temperaturtelemetri til `/telemetry/temperature`-emnet og fugtighedsdata til `/telemetry/humidity`-emnet og derefter i din cloud-app abonnere på `/telemetry/*`-emnet for at modtage både temperatur- og fugtighedsdata. + +Beskeder kan sendes med en kvalitet af service (QoS), som bestemmer garantien for, at beskeden modtages. + +* Højst én gang - beskeden sendes kun én gang, og klienten og brokeren tager ingen yderligere skridt for at bekræfte levering (fire and forget). +* Mindst én gang - beskeden genforsøges af afsenderen flere gange, indtil bekræftelse modtages (acknowledged delivery). +* Præcis én gang - afsender og modtager engagerer sig i en to-niveau håndtryk for at sikre, at kun én kopi af beskeden modtages (assured delivery). + +✅ Hvilke situationer kunne kræve en sikret levering frem for en "fire and forget"-besked? + +Selvom navnet er Message Queueing (MQ i MQTT), understøtter det faktisk ikke beskedkøer. Dette betyder, at hvis en klient afbrydes og derefter genforbindes, vil den ikke modtage beskeder sendt under afbrydelsen, undtagen for de beskeder, den allerede var begyndt at behandle ved hjælp af QoS-processen. Beskeder kan have et "retained"-flag sat på dem. Hvis dette er sat, vil MQTT-brokeren gemme den sidste besked sendt på et emne med dette flag og sende det til enhver klient, der senere abonnerer på emnet. På denne måde vil klienterne altid få den nyeste besked. + +MQTT understøtter også en "keep alive"-funktion, der tjekker, om forbindelsen stadig er aktiv under lange pauser mellem beskeder. + +> 🦟 [Mosquitto fra Eclipse Foundation](https://mosquitto.org) har en gratis MQTT-broker, som du selv kan køre for at eksperimentere med MQTT, sammen med en offentlig MQTT-broker, du kan bruge til at teste din kode, hostet på [test.mosquitto.org](https://test.mosquitto.org). + +MQTT-forbindelser kan være offentlige og åbne eller krypterede og sikrede ved hjælp af brugernavne og adgangskoder eller certifikater. + +> 💁 MQTT kommunikerer over TCP/IP, det samme underliggende netværksprotokol som HTTP, men på en anden port. Du kan også bruge MQTT over websockets til at kommunikere med webapps, der kører i en browser, eller i situationer, hvor firewalls eller andre netværksregler blokerer standard MQTT-forbindelser. + +## Telemetri + +Ordet telemetri stammer fra græske rødder og betyder at måle på afstand. Telemetri er handlingen med at indsamle data fra sensorer og sende det til skyen. + +> 💁 En af de tidligste telemetrianordninger blev opfundet i Frankrig i 1874 og sendte realtidsdata om vejr og sneforhold fra Mont Blanc til Paris. Den brugte fysiske ledninger, da trådløse teknologier ikke var tilgængelige på det tidspunkt. + +Lad os se tilbage på eksemplet med den smarte termostat fra Lektion 1. + +![En internetforbundet termostat, der bruger flere rumfølere](../../../../../translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.da.png) + +Termostaten har temperatursensorer til at indsamle telemetri. Den vil sandsynligvis have en indbygget temperatursensor og kan forbinde til flere eksterne temperatursensorer via en trådløs protokol som [Bluetooth Low Energy](https://wikipedia.org/wiki/Bluetooth_Low_Energy) (BLE). + +Et eksempel på telemetridata, den kunne sende, kunne være: + +| Navn | Værdi | Beskrivelse | +| ---- | ----- | ----------- | +| `thermostat_temperature` | 18°C | Temperaturen målt af termostatens indbyggede temperatursensor | +| `livingroom_temperature` | 19°C | Temperaturen målt af en fjernsensor, der er navngivet `livingroom` for at identificere rummet | +| `bedroom_temperature` | 21°C | Temperaturen målt af en fjernsensor, der er navngivet `bedroom` for at identificere rummet | + +Cloud-tjenesten kan derefter bruge disse telemetridata til at træffe beslutninger om, hvilke kommandoer der skal sendes for at styre opvarmningen. + +### Send telemetri fra din IoT-enhed + +Den næste del i at tilføje internetkontrol til din natlampe er at sende lysniveau-telemetri til MQTT-brokeren på et telemetri-emne. + +#### Opgave - send telemetri fra din IoT-enhed + +Send lysniveau-telemetri til MQTT-brokeren. + +Data sendes kodet som JSON - en forkortelse for JavaScript Object Notation, en standard til at kode data i tekst ved hjælp af nøgle/værdi-par. + +✅ Hvis du ikke er stødt på JSON før, kan du lære mere om det i [JSON.org-dokumentationen](https://www.json.org/). + +Følg det relevante trin nedenfor for at sende telemetri fra din enhed til MQTT-brokeren: + +* [Arduino - Wio Terminal](wio-terminal-telemetry.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-telemetry.md) + +### Modtag telemetri fra MQTT-brokeren + +Der er ingen mening i at sende telemetri, hvis der ikke er noget i den anden ende til at lytte til det. Lysniveau-telemetrien har brug for noget, der lytter til den for at behandle dataene. Denne 'server'-kode er den slags kode, du vil implementere i en cloud-tjeneste som en del af en større IoT-applikation, men her vil du køre denne kode lokalt på din computer (eller på din Pi, hvis du koder direkte der). + +Serverkoden består af en Python-app, der lytter til telemetribeskeder over MQTT med lysniveauer. Senere i denne lektion vil du få den til at svare med en kommando, der instruerer om at tænde eller slukke LED'en. + +✅ Lav noget research: Hvad sker der med MQTT-beskeder, hvis der ikke er nogen lytter? + +#### Installer Python og VS Code + +Hvis du ikke har Python og VS Code installeret lokalt, skal du installere begge dele for at kode serveren. Hvis du bruger en virtuel IoT-enhed eller arbejder på din Raspberry Pi, kan du springe dette trin over, da du allerede bør have det installeret og konfigureret. + +##### Opgave - installer Python og VS Code + +Installer Python og VS Code. + +1. Installer Python. Se [Python-downloadsiden](https://www.python.org/downloads/) for instruktioner om, hvordan du installerer den nyeste version af Python. + +2. Installer Visual Studio Code (VS Code). Dette er den editor, du vil bruge til at skrive din virtuelle enhedskode i Python. Se [VS Code-dokumentationen](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) for instruktioner om, hvordan du installerer VS Code. +💁 Du er velkommen til at bruge enhver Python IDE eller editor til disse lektioner, hvis du har et foretrukket værktøj, men lektionerne vil give instruktioner baseret på brugen af VS Code. +1. Installer VS Code Pylance-udvidelsen. Dette er en udvidelse til VS Code, der giver understøttelse af Python-sproget. Se [Pylance-udvidelsens dokumentation](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance) for instruktioner om, hvordan du installerer denne udvidelse i VS Code. + +#### Konfigurer et Python-virtuelt miljø + +En af de stærke funktioner ved Python er muligheden for at installere [pip-pakker](https://pypi.org) - det er pakker med kode skrevet af andre og offentliggjort på internettet. Du kan installere en pip-pakke på din computer med én kommando og derefter bruge den i din kode. Du vil bruge pip til at installere en pakke til kommunikation via MQTT. + +Som standard, når du installerer en pakke, er den tilgængelig overalt på din computer, og dette kan føre til problemer med pakkeversioner - som f.eks. en applikation, der afhænger af én version af en pakke, som bryder, når du installerer en ny version til en anden applikation. For at omgå dette problem kan du bruge et [Python-virtuelt miljø](https://docs.python.org/3/library/venv.html), som i bund og grund er en kopi af Python i en dedikeret mappe, og når du installerer pip-pakker, bliver de kun installeret i den mappe. + +##### Opgave - konfigurer et Python-virtuelt miljø + +Konfigurer et Python-virtuelt miljø og installer MQTT-pip-pakkerne. + +1. Fra din terminal eller kommandolinje skal du køre følgende på et sted efter eget valg for at oprette og navigere til en ny mappe: + + ```sh + mkdir nightlight-server + cd nightlight-server + ``` + +1. Kør nu følgende for at oprette et virtuelt miljø i `.venv`-mappen: + + ```sh + python3 -m venv .venv + ``` + + > 💁 Du skal eksplicit kalde `python3` for at oprette det virtuelle miljø, hvis du har Python 2 installeret ud over Python 3 (den nyeste version). Hvis du har Python 2 installeret, vil kaldet `python` bruge Python 2 i stedet for Python 3. + +1. Aktivér det virtuelle miljø: + + * På Windows: + * Hvis du bruger Command Prompt eller Command Prompt via Windows Terminal, skal du køre: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Hvis du bruger PowerShell, skal du køre: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + * På macOS eller Linux skal du køre: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Disse kommandoer skal køres fra samme sted, som du kørte kommandoen for at oprette det virtuelle miljø. Du behøver aldrig navigere ind i `.venv`-mappen; du skal altid køre aktiveringskommandoen og eventuelle kommandoer for at installere pakker eller køre kode fra den mappe, du var i, da du oprettede det virtuelle miljø. + +1. Når det virtuelle miljø er aktiveret, vil standardkommandoen `python` køre den version af Python, der blev brugt til at oprette det virtuelle miljø. Kør følgende for at få versionen: + + ```sh + python --version + ``` + + Outputtet vil være lignende følgende: + + ```output + (.venv) ➜ nightlight-server python --version + Python 3.9.1 + ``` + + > 💁 Din Python-version kan være anderledes - så længe det er version 3.6 eller højere, er du godt kørende. Hvis ikke, skal du slette denne mappe, installere en nyere version af Python og prøve igen. + +1. Kør følgende kommandoer for at installere pip-pakken for [Paho-MQTT](https://pypi.org/project/paho-mqtt/), et populært MQTT-bibliotek. + + ```sh + pip install paho-mqtt + ``` + + Denne pip-pakke vil kun blive installeret i det virtuelle miljø og vil ikke være tilgængelig uden for dette. + +#### Skriv serverkoden + +Serverkoden kan nu skrives i Python. + +##### Opgave - skriv serverkoden + +Skriv serverkoden. + +1. Fra din terminal eller kommandolinje skal du køre følgende inde i det virtuelle miljø for at oprette en Python-fil kaldet `app.py`: + + * Fra Windows skal du køre: + + ```cmd + type nul > app.py + ``` + + * På macOS eller Linux skal du køre: + + ```cmd + touch app.py + ``` + +1. Åbn den aktuelle mappe i VS Code: + + ```sh + code . + ``` + +1. Når VS Code starter, vil det aktivere det virtuelle Python-miljø. Dette vil blive rapporteret i den nederste statuslinje: + + ![VS Code viser det valgte virtuelle miljø](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.da.png) + +1. Hvis VS Code-terminalen allerede kører, når VS Code starter op, vil den ikke have det virtuelle miljø aktiveret i sig. Det nemmeste er at lukke terminalen ved hjælp af knappen **Kill the active terminal instance**: + + ![VS Code Kill the active terminal instance-knap](../../../../../translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.da.png) + +1. Start en ny VS Code-terminal ved at vælge *Terminal -> New Terminal* eller ved at trykke på `` CTRL+` ``. Den nye terminal vil indlæse det virtuelle miljø, med kaldet til aktivering, der vises i terminalen. Navnet på det virtuelle miljø (`.venv`) vil også være i prompten: + + ```output + ➜ nightlight-server source .venv/bin/activate + (.venv) ➜ nightlight + ``` + +1. Åbn `app.py`-filen fra VS Code-udforskeren og tilføj følgende kode: + + ```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) + ``` + + Erstat `` på linje 6 med det unikke ID, du brugte, da du oprettede din enhedskode. + + ⚠️ Dette **skal** være det samme ID, som du brugte på din enhed, ellers vil serverkoden ikke abonnere eller publicere til det rigtige emne. + + Denne kode opretter en MQTT-klient med et unikt navn og forbinder til *test.mosquitto.org*-broker. Den starter derefter en behandlingssløjfe, der kører i en baggrundstråd og lytter efter beskeder på alle abonnerede emner. + + Klienten abonnerer derefter på beskeder på telemetriemnet og definerer en funktion, der kaldes, når en besked modtages. Når en telemetribesked modtages, kaldes funktionen `handle_telemetry`, som udskriver den modtagne besked til konsollen. + + Endelig holder en uendelig sløjfe applikationen kørende. MQTT-klienten lytter til beskeder i en baggrundstråd og kører hele tiden, mens hovedapplikationen kører. + +1. Fra VS Code-terminalen skal du køre følgende for at køre din Python-app: + + ```sh + python app.py + ``` + + Appen vil begynde at lytte til beskeder fra IoT-enheden. + +1. Sørg for, at din enhed kører og sender telemetribeskeder. Juster lysniveauerne, der registreres af din fysiske eller virtuelle enhed. Modtagne beskeder vil blive udskrevet til terminalen. + + ```output + (.venv) ➜ nightlight-server python app.py + Message received: {'light': 0} + Message received: {'light': 400} + ``` + + `app.py`-filen i nightlight-virtuelle miljø skal køre, for at `app.py`-filen i nightlight-server-virtuelle miljø kan modtage de beskeder, der sendes. + +> 💁 Du kan finde denne kode i [code-server/server](../../../../../1-getting-started/lessons/4-connect-internet/code-server/server)-mappen. + +### Hvor ofte skal telemetri sendes? + +En vigtig overvejelse med telemetri er, hvor ofte data skal måles og sendes? Svaret er - det afhænger. Hvis du måler ofte, kan du reagere hurtigere på ændringer i målinger, men du bruger mere strøm, mere båndbredde, genererer mere data og har brug for flere cloud-ressourcer til at behandle det. Du skal måle ofte nok, men ikke for ofte. + +For en termostat er det sandsynligvis mere end nok at måle hvert par minutter, da temperaturer ikke ændrer sig så ofte. Hvis du kun måler én gang om dagen, kan du ende med at opvarme dit hus til nattemperaturer midt på en solrig dag, mens hvis du måler hvert sekund, vil du have tusindvis af unødvendigt duplikerede temperaturmålinger, der vil belaste brugerens internethastighed og båndbredde (et problem for folk med begrænsede båndbreddeplaner), bruge mere strøm, hvilket kan være et problem for batteridrevne enheder som fjernsensorer, og øge omkostningerne ved cloud computing-ressourcer til behandling og lagring. + +Hvis du overvåger data omkring en maskine i en fabrik, hvor en fejl kan forårsage katastrofale skader og millioner af dollars i tabt indtjening, kan det være nødvendigt at måle flere gange i sekundet. Det er bedre at spilde båndbredde end at misse telemetri, der indikerer, at en maskine skal stoppes og repareres, før den går i stykker. + +> 💁 I denne situation kan du overveje at have en edge-enhed til at behandle telemetrien først for at reducere afhængigheden af internettet. + +### Tab af forbindelse + +Internetforbindelser kan være upålidelige, med hyppige afbrydelser. Hvad skal en IoT-enhed gøre under disse omstændigheder - skal den miste dataene, eller skal den gemme dem, indtil forbindelsen er genoprettet? Igen, svaret er det afhænger. + +For en termostat kan dataene sandsynligvis gå tabt, så snart en ny temperaturmåling er taget. Varmeanlægget er ligeglad med, at det for 20 minutter siden var 20,5°C, hvis temperaturen nu er 19°C; det er temperaturen nu, der afgør, om varmen skal være tændt eller slukket. + +For maskiner vil du måske beholde dataene, især hvis de bruges til at lede efter tendenser. Der findes maskinlæringsmodeller, der kan opdage anomalier i datastrømme ved at kigge over data fra en defineret tidsperiode (såsom den sidste time) og finde unormale data. Dette bruges ofte til prædiktiv vedligeholdelse, hvor man leder efter indikationer på, at noget måske snart går i stykker, så man kan reparere eller udskifte det, før det sker. Du vil måske have hver eneste telemetri for en maskine sendt, så den kan behandles for anomali-detektion, så når IoT-enheden kan genoprette forbindelsen, vil den sende al telemetri, der blev genereret under internetafbrydelsen. + +IoT-enhedsdesignere bør også overveje, om IoT-enheden kan bruges under en internetafbrydelse eller tab af signal forårsaget af placering. En smart termostat bør kunne træffe nogle begrænsede beslutninger for at kontrollere opvarmning, hvis den ikke kan sende telemetri til skyen på grund af en afbrydelse. + +[![Denne Ferrari blev ubrugelig, fordi nogen forsøgte at opgradere den under jorden, hvor der ikke er mobilsignal](../../../../../translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.da.png)](https://twitter.com/internetofshit/status/1315736960082808832) + +For MQTT til at håndtere tab af forbindelse skal enheden og serverkoden være ansvarlige for at sikre beskedlevering, hvis det er nødvendigt, f.eks. ved at kræve, at alle beskeder, der sendes, besvares med yderligere beskeder på et svar-emne, og hvis ikke, bliver de manuelt køet til at blive afspillet senere. + +## Kommandoer + +Kommandoer er beskeder sendt af skyen til en enhed, der instruerer den i at gøre noget. Det involverer ofte at give en form for output via en aktuator, men det kan også være en instruktion til selve enheden, såsom at genstarte eller indsamle ekstra telemetri og returnere det som svar på kommandoen. + +![En internetforbundet termostat modtager en kommando om at tænde for varmen](../../../../../translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.da.png) + +En termostat kunne modtage en kommando fra skyen om at tænde for varmen. Baseret på telemetridata fra alle sensorer, hvis cloud-tjenesten har besluttet, at varmen skal være tændt, sender den den relevante kommando. + +### Send kommandoer til MQTT-broker + +Næste trin for vores internetstyrede natlampe er, at serverkoden sender en kommando tilbage til IoT-enheden for at kontrollere lyset baseret på de lysniveauer, den registrerer. + +1. Åbn serverkoden i VS Code. + +1. Tilføj følgende linje efter deklarationen af `client_telemetry_topic` for at definere, hvilket emne der skal sendes kommandoer til: + + ```python + server_command_topic = id + '/commands' + ``` + +1. Tilføj følgende kode til slutningen af `handle_telemetry`-funktionen: + + ```python + command = { 'led_on' : payload['light'] < 300 } + print("Sending message:", command) + + client.publish(server_command_topic, json.dumps(command)) + ``` + + Dette sender en JSON-besked til kommandoemnet med værdien `led_on` sat til true eller false afhængigt af, om lyset er mindre end 300 eller ej. Hvis lyset er mindre end 300, sendes true for at instruere enheden om at tænde LED'en. + +1. Kør koden som før. + +1. Juster lysniveauerne, der registreres af din fysiske eller virtuelle enhed. Modtagne beskeder og sendte kommandoer vil blive skrevet til terminalen: + + ```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 og kommandoer sendes på et enkelt emne hver. Det betyder, at telemetri fra flere enheder vil vises på samme telemetriemne, og kommandoer til flere enheder vil vises på samme kommandoemne. Hvis du ville sende en kommando til en specifik enhed, kunne du bruge flere emner, navngivet med et unikt enheds-id, såsom `/commands/device1`, `/commands/device2`. På den måde kan en enhed lytte til beskeder, der kun er beregnet til den ene enhed. + +> 💁 Du kan finde denne kode i [code-commands/server](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/server)-mappen. + +### Håndter kommandoer på IoT-enheden + +Nu hvor kommandoer sendes fra serveren, kan du tilføje kode til IoT-enheden for at håndtere dem og kontrollere LED'en. + +Følg det relevante trin nedenfor for at lytte til kommandoer fra MQTT-broker: + +* [Arduino - Wio Terminal](wio-terminal-commands.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-commands.md) + +Når denne kode er skrevet og kører, kan du eksperimentere med at ændre lysniveauer. Se output fra serveren og enheden, og se LED'en, mens du ændrer lysniveauer. + +### Tab af forbindelse + +Hvad skal en cloud-tjeneste gøre, hvis den skal sende en kommando til en IoT-enhed, der er offline? Igen, svaret er det afhænger. + +Hvis den nyeste kommando overskriver en tidligere, kan de tidligere sandsynligvis ignoreres. Hvis en cloud-tjeneste sender en kommando om at tænde for varmen og derefter sender en kommando om at slukke for den, kan tænd-kommandoen ignoreres og ikke sendes igen. + +Hvis kommandoerne skal behandles i rækkefølge, såsom at flytte en robotarm op og derefter lukke en griber, skal de sendes i rækkefølge, når forbindelsen er genoprettet. + +✅ Hvordan kunne enheden eller serverkoden sikre, at kommandoer altid sendes og behandles i rækkefølge over MQTT, hvis det er nødvendigt? + +--- + +## 🚀 Udfordring + +Udfordringen i de sidste tre lektioner var at liste så mange IoT-enheder som muligt, der findes i dit hjem, skole eller arbejdsplads, og afgøre, om de er bygget omkring mikrocontrollere eller single-board computere, eller endda en blanding af begge, og tænke over, hvilke sensorer og aktuatorer de bruger. +For disse enheder, overvej hvilke beskeder de muligvis sender eller modtager. Hvilken telemetri sender de? Hvilke beskeder eller kommandoer kunne de modtage? Tror du, de er sikre? + +## Quiz efter forelæsning + +[Quiz efter forelæsning](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8) + +## Gennemgang & Selvstudie + +Læs mere om MQTT på [MQTT Wikipedia-siden](https://wikipedia.org/wiki/MQTT). + +Prøv selv at køre en MQTT-broker ved hjælp af [Mosquitto](https://www.mosquitto.org) og forbind til den fra din IoT-enhed og serverkode. + +> 💁 Tip - som standard tillader Mosquitto ikke anonyme forbindelser (det vil sige forbindelser uden brugernavn og adgangskode) og tillader ikke forbindelser fra computere uden for den, hvor den kører. +> Du kan løse dette med en [`mosquitto.conf` konfigurationsfil](https://www.mosquitto.org/man/mosquitto-conf-5.html) med følgende: +> +> ```sh +> listener 1883 0.0.0.0 +> allow_anonymous true +> ``` + +## Opgave + +[Sammenlign og kontraster MQTT med andre kommunikationsprotokoller](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/4-connect-internet/assignment.md b/translations/da/1-getting-started/lessons/4-connect-internet/assignment.md new file mode 100644 index 00000000..bcba6f15 --- /dev/null +++ b/translations/da/1-getting-started/lessons/4-connect-internet/assignment.md @@ -0,0 +1,28 @@ + +# Sammenlign og kontrast MQTT med andre kommunikationsprotokoller + +## Instruktioner + +Denne lektion dækkede MQTT som en kommunikationsprotokol. Der findes andre, herunder AMQP og HTTP/HTTPS. + +Undersøg begge disse og sammenlign/kontrast dem med MQTT. Overvej strømforbrug, sikkerhed og beskedpersistens, hvis forbindelser mistes. + +## Bedømmelseskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Sammenlign AMQP med MQTT | Er i stand til at sammenligne og kontrastere AMQP med MQTT og dækker strømforbrug, sikkerhed og beskedpersistens. | Er delvist i stand til at sammenligne og kontrastere AMQP med MQTT og dækker to af strømforbrug, sikkerhed og beskedpersistens. | Er delvist i stand til at sammenligne og kontrastere AMQP med MQTT og dækker én af strømforbrug, sikkerhed og beskedpersistens. | +| Sammenlign HTTP/HTTPS med MQTT | Er i stand til at sammenligne og kontrastere HTTP/HTTPS med MQTT og dækker strømforbrug, sikkerhed og beskedpersistens. | Er delvist i stand til at sammenligne og kontrastere HTTP/HTTPS med MQTT og dækker to af strømforbrug, sikkerhed og beskedpersistens. | Er delvist i stand til at sammenligne og kontrastere HTTP/HTTPS med MQTT og dækker én af strømforbrug, sikkerhed og beskedpersistens. | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md b/translations/da/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md new file mode 100644 index 00000000..2fe1c22f --- /dev/null +++ b/translations/da/1-getting-started/lessons/4-connect-internet/single-board-computer-commands.md @@ -0,0 +1,67 @@ + +# Styr din natlampe over internettet - Virtuel IoT-hardware og Raspberry Pi + +I denne del af lektionen vil du abonnere på kommandoer sendt fra en MQTT-broker til din Raspberry Pi eller virtuelle IoT-enhed. + +## Abonner på kommandoer + +Næste trin er at abonnere på de kommandoer, der sendes fra MQTT-brokeren, og reagere på dem. + +### Opgave + +Abonner på kommandoer. + +1. Åbn natlampeprojektet i VS Code. + +1. Hvis du bruger en virtuel IoT-enhed, skal du sikre dig, at terminalen kører det virtuelle miljø. Hvis du bruger en Raspberry Pi, vil du ikke bruge et virtuelt miljø. + +1. Tilføj følgende kode efter definitionerne af `client_telemetry_topic`: + + ```python + server_command_topic = id + '/commands' + ``` + + `server_command_topic` er MQTT-emnet, som enheden vil abonnere på for at modtage LED-kommandoer. + +1. Tilføj følgende kode lige over hovedløkken, efter linjen `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 + ``` + + Denne kode definerer en funktion, `handle_command`, der læser en besked som et JSON-dokument og leder efter værdien af egenskaben `led_on`. Hvis den er sat til `True`, tændes LED'en, ellers slukkes den. + + MQTT-klienten abonnerer på det emne, som serveren vil sende beskeder på, og sætter funktionen `handle_command` til at blive kaldt, når en besked modtages. + + > 💁 `on_message`-handleren kaldes for alle emner, der abonneres på. Hvis du senere skriver kode, der lytter til flere emner, kan du få det emne, som beskeden blev sendt til, fra `message`-objektet, der sendes til handlerfunktionen. + +1. Kør koden på samme måde som du kørte koden fra den tidligere del af opgaven. Hvis du bruger en virtuel IoT-enhed, skal du sikre dig, at CounterFit-appen kører, og at lyssensoren og LED'en er oprettet på de korrekte pins. + +1. Juster lysniveauerne, der registreres af din fysiske eller virtuelle enhed. Beskeder, der modtages, og kommandoer, der sendes, vil blive skrevet til terminalen. LED'en vil også blive tændt og slukket afhængigt af lysniveauet. + +> 💁 Du kan finde denne kode i mappen [code-commands/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/virtual-device) eller mappen [code-commands/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/pi). + +😀 Du har med succes kodet din enhed til at reagere på kommandoer fra en MQTT-broker. + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md b/translations/da/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md new file mode 100644 index 00000000..e695eb18 --- /dev/null +++ b/translations/da/1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md @@ -0,0 +1,93 @@ + +# Styr din natlampe over internettet - Virtuel IoT-hardware og Raspberry Pi + +IoT-enheden skal kodes til at kommunikere med *test.mosquitto.org* ved hjælp af MQTT for at sende telemetridata med lysfølerens aflæsninger og modtage kommandoer til at styre LED'en. + +I denne del af lektionen vil du forbinde din Raspberry Pi eller virtuelle IoT-enhed til en MQTT-broker. + +## Installer MQTT-klientpakken + +For at kommunikere med MQTT-brokeren skal du installere en MQTT-biblioteks-pip-pakke enten på din Pi eller i dit virtuelle miljø, hvis du bruger en virtuel enhed. + +### Opgave + +Installer pip-pakken + +1. Åbn natlampeprojektet i VS Code. + +1. Hvis du bruger en virtuel IoT-enhed, skal du sikre dig, at terminalen kører det virtuelle miljø. Hvis du bruger en Raspberry Pi, vil du ikke bruge et virtuelt miljø. + +1. Kør følgende kommando for at installere MQTT-pip-pakken: + + ```sh + pip3 install paho-mqtt + ``` + +## Kod enheden + +Enheden er klar til at blive kodet. + +### Opgave + +Skriv enhedens kode. + +1. Tilføj følgende import øverst i `app.py`-filen: + + ```python + import paho.mqtt.client as mqtt + ``` + + Biblioteket `paho.mqtt.client` gør det muligt for din app at kommunikere via MQTT. + +1. Tilføj følgende kode efter definitionerne af lysføleren og LED'en: + + ```python + id = '' + + client_name = id + 'nightlight_client' + ``` + + Erstat `` med en unik ID, der vil blive brugt som navnet på denne enhedsklient og senere til de emner, som denne enhed publicerer og abonnerer på. Brokeren *test.mosquitto.org* er offentlig og bruges af mange mennesker, inklusive andre studerende, der arbejder med denne opgave. At have et unikt MQTT-klientnavn og emnenavne sikrer, at din kode ikke konflikter med andres. Du vil også få brug for denne ID, når du opretter serverkoden senere i denne opgave. + + > 💁 Du kan bruge en hjemmeside som [GUIDGen](https://www.guidgen.com) til at generere en unik ID. + + `client_name` er et unikt navn for denne MQTT-klient på brokeren. + +1. Tilføj følgende kode under denne nye kode for at oprette et MQTT-klientobjekt og forbinde til MQTT-brokeren: + + ```python + mqtt_client = mqtt.Client(client_name) + mqtt_client.connect('test.mosquitto.org') + + mqtt_client.loop_start() + + print("MQTT connected!") + ``` + + Denne kode opretter klientobjektet, forbinder til den offentlige MQTT-broker og starter en behandlingssløjfe, der kører i en baggrundstråd og lytter efter meddelelser på alle abonnerede emner. + +1. Kør koden på samme måde, som du kørte koden fra den forrige del af opgaven. Hvis du bruger en virtuel IoT-enhed, skal du sikre dig, at CounterFit-appen kører, og at lysføleren og LED'en er oprettet på de korrekte pins. + + ```output + (.venv) ➜ nightlight python app.py + MQTT connected! + Light level: 0 + Light level: 0 + ``` + +> 💁 Du kan finde denne kode i mappen [code-mqtt/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/virtual-device) eller mappen [code-mqtt/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/pi). + +😀 Du har med succes forbundet din enhed til en MQTT-broker. + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md b/translations/da/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md new file mode 100644 index 00000000..0def0c99 --- /dev/null +++ b/translations/da/1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md @@ -0,0 +1,74 @@ + +# Styr din natlampe over internettet - Virtuel IoT-hardware og Raspberry Pi + +I denne del af lektionen vil du sende telemetri med lysniveauer fra din Raspberry Pi eller virtuelle IoT-enhed til en MQTT-broker. + +## Udgiv telemetri + +Det næste trin er at oprette et JSON-dokument med telemetri og sende det til MQTT-brokeren. + +### Opgave + +Udgiv telemetri til MQTT-brokeren. + +1. Åbn natlampeprojektet i VS Code. + +1. Hvis du bruger en virtuel IoT-enhed, skal du sikre dig, at terminalen kører det virtuelle miljø. Hvis du bruger en Raspberry Pi, vil du ikke bruge et virtuelt miljø. + +1. Tilføj følgende import øverst i `app.py`-filen: + + ```python + import json + ``` + + `json`-biblioteket bruges til at kode telemetrien som et JSON-dokument. + +1. Tilføj følgende efter deklarationen af `client_name`: + + ```python + client_telemetry_topic = id + '/telemetry' + ``` + + `client_telemetry_topic` er det MQTT-emne, som enheden vil udgive lysniveauer til. + +1. Erstat indholdet af `while True:`-løkken i slutningen af filen med følgende: + + ```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) + ``` + + Denne kode pakker lysniveauet ind i et JSON-dokument og udgiver det til MQTT-brokeren. Derefter sættes programmet på pause for at reducere frekvensen af de sendte beskeder. + +1. Kør koden på samme måde, som du kørte koden fra den tidligere del af opgaven. Hvis du bruger en virtuel IoT-enhed, skal du sikre dig, at CounterFit-appen kører, og at lyssensoren og LED'en er oprettet på de korrekte pins. + + ```output + (.venv) ➜ nightlight python app.py + MQTT connected! + Sending telemetry {"light": 0} + Sending telemetry {"light": 0} + ``` + +> 💁 Du kan finde denne kode i [code-telemetry/virtual-device](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/virtual-device)-mappen eller [code-telemetry/pi](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/pi)-mappen. + +😀 Du har med succes sendt telemetri fra din enhed. + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md b/translations/da/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md new file mode 100644 index 00000000..9b188ad4 --- /dev/null +++ b/translations/da/1-getting-started/lessons/4-connect-internet/wio-terminal-commands.md @@ -0,0 +1,93 @@ + +# Styr din natlampe over internettet - Wio Terminal + +I denne del af lektionen vil du abonnere på kommandoer sendt fra en MQTT-broker til din Wio Terminal. + +## Abonner på kommandoer + +Næste trin er at abonnere på de kommandoer, der sendes fra MQTT-brokeren, og reagere på dem. + +### Opgave + +Abonner på kommandoer. + +1. Åbn natlampeprojektet i VS Code. + +1. Tilføj følgende kode nederst i `config.h`-filen for at definere emnenavnet for kommandoerne: + + ```cpp + const string SERVER_COMMAND_TOPIC = ID + "/commands"; + ``` + + `SERVER_COMMAND_TOPIC` er det emne, som enheden vil abonnere på for at modtage LED-kommandoer. + +1. Tilføj følgende linje til slutningen af funktionen `reconnectMQTTClient` for at abonnere på kommandoemnet, når MQTT-klienten genopretter forbindelsen: + + ```cpp + client.subscribe(SERVER_COMMAND_TOPIC.c_str()); + ``` + +1. Tilføj følgende kode under funktionen `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); + } + ``` + + Denne funktion vil være den callback, som MQTT-klienten kalder, når den modtager en besked fra serveren. + + Beskeden modtages som et array af usignerede 8-bit heltal og skal konverteres til et karakterarray for at blive behandlet som tekst. + + Beskeden indeholder et JSON-dokument, som dekodes ved hjælp af ArduinoJson-biblioteket. `led_on`-egenskaben i JSON-dokumentet læses, og afhængigt af værdien tændes eller slukkes LED'en. + +1. Tilføj følgende kode til funktionen `createMQTTClient`: + + ```cpp + client.setCallback(clientCallback); + ``` + + Denne kode sætter `clientCallback` som den callback, der skal kaldes, når en besked modtages fra MQTT-brokeren. + + > 💁 `clientCallback`-handleren kaldes for alle emner, der er abonneret på. Hvis du senere skriver kode, der lytter til flere emner, kan du få det emne, som beskeden blev sendt til, fra parameteren `topic`, der sendes til callback-funktionen. + +1. Upload koden til din Wio Terminal, og brug Serial Monitor til at se lysniveauerne, der sendes til MQTT-brokeren. + +1. Juster lysniveauerne, der registreres af din fysiske eller virtuelle enhed. Du vil se beskeder blive modtaget og kommandoer blive sendt i terminalen. Du vil også se LED'en blive tændt og slukket afhængigt af lysniveauet. + +> 💁 Du kan finde denne kode i mappen [code-commands/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal). + +😀 Du har med succes kodet din enhed til at reagere på kommandoer fra en MQTT-broker. + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md b/translations/da/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md new file mode 100644 index 00000000..953255a2 --- /dev/null +++ b/translations/da/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md @@ -0,0 +1,251 @@ + +# Styr din natlampe over internettet - Wio Terminal + +IoT-enheden skal kodes til at kommunikere med *test.mosquitto.org* ved hjælp af MQTT for at sende telemetriværdier med lysfølerens aflæsning og modtage kommandoer til at styre LED'en. + +I denne del af lektionen vil du forbinde din Wio Terminal til en MQTT-broker. + +## Installer WiFi- og MQTT Arduino-biblioteker + +For at kommunikere med MQTT-brokeren skal du installere nogle Arduino-biblioteker, der gør det muligt at bruge WiFi-chippen i Wio Terminal og kommunikere med MQTT. Når du udvikler til Arduino-enheder, kan du bruge et bredt udvalg af biblioteker, der indeholder open source-kode og implementerer en lang række funktioner. Seeed udgiver biblioteker til Wio Terminal, som gør det muligt at kommunikere via WiFi. Andre udviklere har udgivet biblioteker til at kommunikere med MQTT-brokere, og du vil bruge disse med din enhed. + +Disse biblioteker leveres som kildekode, der kan importeres automatisk til PlatformIO og kompileres til din enhed. På denne måde vil Arduino-biblioteker fungere på enhver enhed, der understøtter Arduino-frameworket, forudsat at enheden har den specifikke hardware, som biblioteket kræver. Nogle biblioteker, såsom Seeed WiFi-bibliotekerne, er specifikke for visse hardwaretyper. + +Biblioteker kan installeres globalt og kompileres efter behov eller i et specifikt projekt. Til denne opgave vil bibliotekerne blive installeret i projektet. + +✅ Du kan lære mere om bibliotekshåndtering og hvordan du finder og installerer biblioteker i [PlatformIO library documentation](https://docs.platformio.org/en/latest/librarymanager/index.html). + +### Opgave - installer WiFi- og MQTT Arduino-biblioteker + +Installer Arduino-bibliotekerne. + +1. Åbn natlampeprojektet i VS Code. + +1. Tilføj følgende til slutningen af `platformio.ini`-filen: + + ```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 + ``` + + Dette importerer Seeed WiFi-bibliotekerne. `@ `-syntaksen refererer til et specifikt versionsnummer af biblioteket. + + > 💁 Du kan fjerne `@ ` for altid at bruge den nyeste version af bibliotekerne, men der er ingen garantier for, at senere versioner vil fungere med koden nedenfor. Koden her er testet med denne version af bibliotekerne. + + Dette er alt, hvad du behøver for at tilføje bibliotekerne. Næste gang PlatformIO bygger projektet, vil det downloade kildekoden til disse biblioteker og kompilere dem ind i dit projekt. + +1. Tilføj følgende til `lib_deps`: + + ```ini + knolleary/PubSubClient @ 2.8 + ``` + + Dette importerer [PubSubClient](https://github.com/knolleary/pubsubclient), en Arduino MQTT-klient. + +## Forbind til WiFi + +Wio Terminal kan nu forbindes til WiFi. + +### Opgave - forbind til WiFi + +Forbind Wio Terminal til WiFi. + +1. Opret en ny fil i `src`-mappen kaldet `config.h`. Du kan gøre dette ved at vælge `src`-mappen eller `main.cpp`-filen indeni og vælge **Ny fil**-knappen fra explorer. Denne knap vises kun, når din cursor er over explorer. + + ![Den nye fil-knap](../../../../../translated_images/vscode-new-file-button.182702340fe6723c8cbb4cfa1a9a9fb0d0a5227643b4e46b91ff67b07a39a92f.da.png) + +1. Tilføj følgende kode til denne fil for at definere konstanter for dine WiFi-legitimationsoplysninger: + + ```cpp + #pragma once + + #include + + using namespace std; + + // WiFi credentials + const char *SSID = ""; + const char *PASSWORD = ""; + ``` + + Erstat `` med SSID'en for dit WiFi. Erstat `` med din WiFi-adgangskode. + +1. Åbn `main.cpp`-filen. + +1. Tilføj følgende `#include`-direktiver til toppen af filen: + + ```cpp + #include + #include + #include + + #include "config.h" + ``` + + Dette inkluderer headerfilerne for de biblioteker, du tilføjede tidligere, samt config-headerfilen. Disse headerfiler er nødvendige for at fortælle PlatformIO at inkludere koden fra bibliotekerne. Uden eksplicit at inkludere disse headerfiler vil noget kode ikke blive kompileret, og du vil få compiler-fejl. + +1. Tilføj følgende kode over `setup`-funktionen: + + ```cpp + void connectWiFi() + { + while (WiFi.status() != WL_CONNECTED) + { + Serial.println("Connecting to WiFi.."); + WiFi.begin(SSID, PASSWORD); + delay(500); + } + + Serial.println("Connected!"); + } + ``` + + Denne kode kører i en løkke, mens enheden ikke er forbundet til WiFi, og forsøger at oprette forbindelse ved hjælp af SSID og adgangskode fra config-headerfilen. + +1. Tilføj et kald til denne funktion nederst i `setup`-funktionen, efter at pins er blevet konfigureret. + + ```cpp + connectWiFi(); + ``` + +1. Upload denne kode til din enhed for at kontrollere, at WiFi-forbindelsen fungerer. Du bør se dette i den serielle 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.usbmodem1101 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Connecting to WiFi.. + Connected! + ``` + +## Forbind til MQTT + +Når Wio Terminal er forbundet til WiFi, kan den forbindes til MQTT-brokeren. + +### Opgave - forbind til MQTT + +Forbind til MQTT-brokeren. + +1. Tilføj følgende kode nederst i `config.h`-filen for at definere forbindelsesdetaljer for MQTT-brokeren: + + ```cpp + // MQTT settings + const string ID = ""; + + const string BROKER = "test.mosquitto.org"; + const string CLIENT_NAME = ID + "nightlight_client"; + ``` + + Erstat `` med et unikt ID, der vil blive brugt som navnet på denne enhedsklient og senere til de emner, som denne enhed publicerer og abonnerer på. *test.mosquitto.org*-brokeren er offentlig og bruges af mange mennesker, inklusive andre studerende, der arbejder med denne opgave. At have et unikt MQTT-klientnavn og emnenavne sikrer, at din kode ikke kolliderer med andres. Du vil også bruge dette ID, når du opretter serverkoden senere i denne opgave. + + > 💁 Du kan bruge en hjemmeside som [GUIDGen](https://www.guidgen.com) til at generere et unikt ID. + + `BROKER` er URL'en til MQTT-brokeren. + + `CLIENT_NAME` er et unikt navn for denne MQTT-klient på brokeren. + +1. Åbn `main.cpp`-filen, og tilføj følgende kode under `connectWiFi`-funktionen og over `setup`-funktionen: + + ```cpp + WiFiClient wioClient; + PubSubClient client(wioClient); + ``` + + Denne kode opretter en WiFi-klient ved hjælp af Wio Terminal WiFi-bibliotekerne og bruger den til at oprette en MQTT-klient. + +1. Tilføj følgende kode nedenunder: + + ```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); + } + } + } + ``` + + Denne funktion tester forbindelsen til MQTT-brokeren og genopretter forbindelsen, hvis den ikke er forbundet. Den kører i en løkke, mens den ikke er forbundet, og forsøger at oprette forbindelse ved hjælp af det unikke klientnavn, der er defineret i config-headerfilen. + + Hvis forbindelsen mislykkes, prøver den igen efter 5 sekunder. + +1. Tilføj følgende kode under `reconnectMQTTClient`-funktionen: + + ```cpp + void createMQTTClient() + { + client.setServer(BROKER.c_str(), 1883); + reconnectMQTTClient(); + } + ``` + + Denne kode indstiller MQTT-brokeren for klienten samt opsætter callback-funktionen, når en besked modtages. Den forsøger derefter at oprette forbindelse til brokeren. + +1. Kald `createMQTTClient`-funktionen i `setup`-funktionen, efter at WiFi er forbundet. + +1. Erstat hele `loop`-funktionen med følgende: + + ```cpp + void loop() + { + reconnectMQTTClient(); + client.loop(); + + delay(2000); + } + ``` + + Denne kode starter med at genoprette forbindelsen til MQTT-brokeren. Disse forbindelser kan nemt blive afbrudt, så det er værd at regelmæssigt kontrollere og genoprette forbindelsen, hvis det er nødvendigt. Derefter kalder den `loop`-metoden på MQTT-klienten for at behandle eventuelle beskeder, der kommer ind på det emne, der er abonneret på. Denne app er enkelttrådet, så beskeder kan ikke modtages på en baggrundstråd, derfor skal der afsættes tid på hovedtråden til at behandle eventuelle beskeder, der venter på netværksforbindelsen. + + Endelig sikrer en forsinkelse på 2 sekunder, at lysniveauerne ikke sendes for ofte og reducerer enhedens strømforbrug. + +1. Upload koden til din Wio Terminal, og brug den serielle monitor til at se enheden oprette forbindelse til WiFi og 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 + ``` + +> 💁 Du kan finde denne kode i [code-mqtt/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal)-mappen. + +😀 Du har med succes forbundet din enhed til en MQTT-broker. + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md b/translations/da/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md new file mode 100644 index 00000000..774cf66a --- /dev/null +++ b/translations/da/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md @@ -0,0 +1,93 @@ + +# Styr din natlampe over internettet - Wio Terminal + +I denne del af lektionen vil du sende telemetri med lysniveauer fra din Wio Terminal til MQTT-broker. + +## Installer JSON Arduino-bibliotekerne + +En populær måde at sende beskeder over MQTT er ved at bruge JSON. Der findes et Arduino-bibliotek til JSON, som gør det nemmere at læse og skrive JSON-dokumenter. + +### Opgave + +Installer Arduino JSON-biblioteket. + +1. Åbn natlampeprojektet i VS Code. + +1. Tilføj følgende som en ekstra linje til `lib_deps`-listen i `platformio.ini`-filen: + + ```ini + bblanchon/ArduinoJson @ 6.17.3 + ``` + + Dette importerer [ArduinoJson](https://arduinojson.org), et Arduino JSON-bibliotek. + +## Udsend telemetri + +Næste trin er at oprette et JSON-dokument med telemetri og sende det til MQTT-broker. + +### Opgave - udsend telemetri + +Udsend telemetri til MQTT-broker. + +1. Tilføj følgende kode nederst i `config.h`-filen for at definere telemetri-emnenavnet til MQTT-broker: + + ```cpp + const string CLIENT_TELEMETRY_TOPIC = ID + "/telemetry"; + ``` + + `CLIENT_TELEMETRY_TOPIC` er det emne, enheden vil udsende lysniveauer til. + +1. Åbn `main.cpp`-filen. + +1. Tilføj følgende `#include`-direktiv øverst i filen: + + ```cpp + #include + ``` + +1. Tilføj følgende kode inde i `loop`-funktionen, lige før `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()); + ``` + + Denne kode læser lysniveauet og opretter et JSON-dokument ved hjælp af ArduinoJson, som indeholder dette niveau. Det bliver derefter serialiseret til en streng og udsendt på telemetri-MQTT-emnet af MQTT-klienten. + +1. Upload koden til din Wio Terminal, og brug Serial Monitor til at se lysniveauerne blive sendt til MQTT-broker. + + ```output + Connecting to WiFi.. + Connected! + Attempting MQTT connection...connected + Sending telemetry {"light":652} + Sending telemetry {"light":612} + Sending telemetry {"light":583} + ``` + +> 💁 Du kan finde denne kode i [code-telemetry/wio-terminal](../../../../../1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal)-mappen. + +😀 Du har med succes sendt telemetri fra din enhed. + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/README.md b/translations/da/2-farm/README.md new file mode 100644 index 00000000..8a338cb3 --- /dev/null +++ b/translations/da/2-farm/README.md @@ -0,0 +1,34 @@ + +# Landbrug med IoT + +Efterhånden som befolkningen vokser, øges også presset på landbruget. Mængden af tilgængelig jord ændrer sig ikke, men klimaet gør - hvilket giver endnu flere udfordringer for landmænd, især de 2 milliarder [subsistenslandmænd](https://wikipedia.org/wiki/Subsistence_agriculture), der er afhængige af det, de dyrker, for at kunne spise og forsørge deres familier. IoT kan hjælpe landmænd med at træffe smartere beslutninger om, hvad de skal dyrke, og hvornår de skal høste, øge udbyttet, reducere mængden af manuelt arbejde og opdage samt håndtere skadedyr. + +I disse 6 lektioner vil du lære, hvordan du kan anvende Internet of Things til at forbedre og automatisere landbruget. + +> 💁 Disse lektioner vil bruge nogle cloud-ressourcer. Hvis du ikke gennemfører alle lektionerne i dette projekt, skal du sørge for at [rydde op i dit projekt](../clean-up.md). + +## Emner + +1. [Forudsig plantevækst med IoT](lessons/1-predict-plant-growth/README.md) +1. [Registrer jordfugtighed](lessons/2-detect-soil-moisture/README.md) +1. [Automatisk plantevanding](lessons/3-automated-plant-watering/README.md) +1. [Flyt din plante til skyen](lessons/4-migrate-your-plant-to-the-cloud/README.md) +1. [Flyt din applikationslogik til skyen](lessons/5-migrate-application-to-the-cloud/README.md) +1. [Hold din plante sikker](lessons/6-keep-your-plant-secure/README.md) + +## Kreditering + +Alle lektionerne er skrevet med ♥️ af [Jim Bennett](https://GitHub.com/JimBobBennett) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/1-predict-plant-growth/README.md b/translations/da/2-farm/lessons/1-predict-plant-growth/README.md new file mode 100644 index 00000000..4072a4d5 --- /dev/null +++ b/translations/da/2-farm/lessons/1-predict-plant-growth/README.md @@ -0,0 +1,284 @@ + +# Forudsig plantevækst med IoT + +![En sketchnote-oversigt over denne lektion](../../../../../translated_images/lesson-5.42b234299279d263143148b88ab4583861a32ddb03110c6c1120e41bb88b2592.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/9) + +## Introduktion + +Planter har brug for visse ting for at vokse - vand, kuldioxid, næringsstoffer, lys og varme. I denne lektion lærer du, hvordan man beregner vækst- og modningshastigheder for planter ved at måle lufttemperaturen. + +I denne lektion dækker vi: + +* [Digitalt landbrug](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Hvorfor er temperatur vigtigt i landbrug?](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Mål omgivelsestemperaturen](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Vækstgradedage (GDD)](../../../../../2-farm/lessons/1-predict-plant-growth) +* [Beregn GDD ved hjælp af temperatursensordata](../../../../../2-farm/lessons/1-predict-plant-growth) + +## Digitalt landbrug + +Digitalt landbrug revolutionerer måden, vi dyrker jorden på, ved at bruge værktøjer til at indsamle, gemme og analysere data fra landbruget. Vi befinder os i øjeblikket i en periode, som Verdensøkonomiforum beskriver som den 'Fjerde Industrielle Revolution', og fremkomsten af digitalt landbrug er blevet kaldt den 'Fjerde Landbrugsrevolution' eller 'Landbrug 4.0'. + +> 🎓 Begrebet Digitalt Landbrug omfatter også hele 'landbrugsværdikæden', det vil sige hele rejsen fra mark til bord. Det inkluderer sporing af fødevarekvalitet, mens maden transporteres og forarbejdes, lager- og e-handelssystemer, og endda apps til leje af traktorer! + +Disse ændringer giver landmænd mulighed for at øge udbyttet, bruge mindre gødning og pesticider og vande mere effektivt. Selvom det primært bruges i rigere lande, falder priserne på sensorer og andre enheder langsomt, hvilket gør dem mere tilgængelige i udviklingslande. + +Nogle teknikker, der muliggøres af digitalt landbrug, er: + +* Temperaturmåling - måling af temperatur gør det muligt for landmænd at forudsige plantevækst og modning. +* Automatisk vanding - måling af jordfugtighed og aktivering af vandingssystemer, når jorden er for tør, i stedet for tidsindstillet vanding. Tidsindstillet vanding kan føre til, at afgrøder bliver undervandet under en varm, tør periode eller overvandet under regn. Ved kun at vande, når jorden har brug for det, kan landmænd optimere deres vandforbrug. +* Skadedyrsbekæmpelse - landmænd kan bruge kameraer på automatiserede robotter eller droner til at tjekke for skadedyr og derefter kun anvende pesticider, hvor det er nødvendigt, hvilket reducerer mængden af pesticider og mindsker pesticidafstrømning i lokale vandforsyninger. + +✅ Lav lidt research. Hvilke andre teknikker bruges til at forbedre landbrugsudbyttet? + +> 🎓 Begrebet 'Præcisionslandbrug' bruges til at definere observation, måling og reaktion på afgrøder på basis af individuelle marker eller endda dele af en mark. Dette inkluderer måling af vand-, næringsstof- og skadedyrsniveauer og præcist at reagere, som f.eks. kun at vande en lille del af en mark. + +## Hvorfor er temperatur vigtigt i landbrug? + +Når man lærer om planter, bliver de fleste elever undervist i nødvendigheden af vand, lys, kuldioxid og næringsstoffer. Planter har også brug for varme for at vokse - det er derfor, planter blomstrer om foråret, når temperaturen stiger, hvorfor vintergækker eller påskeliljer kan spire tidligt på grund af en kort varm periode, og hvorfor drivhuse og væksthuse er så gode til at få planter til at vokse. + +> 🎓 Drivhuse og væksthuse har en lignende funktion, men med en vigtig forskel. Drivhuse opvarmes kunstigt og giver landmænd mulighed for at kontrollere temperaturen mere præcist, mens væksthuse er afhængige af solen for varme og normalt kun har vinduer eller andre åbninger til at slippe varmen ud. + +Planter har en basistemperatur, en optimal temperatur og en maksimumtemperatur, alle baseret på daglige gennemsnitstemperaturer. + +* Basistemperatur - dette er den minimale daglige gennemsnitstemperatur, der kræves for, at en plante kan vokse. +* Optimal temperatur - dette er den bedste daglige gennemsnitstemperatur for at opnå maksimal vækst. +* Maksimumtemperatur - dette er den maksimale temperatur, en plante kan tåle. Over denne temperatur stopper planten sin vækst for at forsøge at bevare vand og overleve. + +> 💁 Dette er gennemsnitstemperaturer, beregnet som gennemsnittet af dag- og nattemperaturer. Planter har også brug for forskellige temperaturer dag og nat for at fotosyntetisere mere effektivt og spare energi om natten. + +Hver plantesort har forskellige værdier for deres basis-, optimale og maksimale temperatur. Det er derfor, nogle planter trives i varme lande, og andre i koldere lande. + +✅ Lav lidt research. For planter i din have, skole eller lokale park, kan du finde deres basistemperatur? + +![En graf, der viser væksthastigheden stige, når temperaturen stiger, og derefter falde, når temperaturen bliver for høj](../../../../../translated_images/plant-growth-temp-graph.c6d69c9478e6ca832baa8dcb8d4adcbb67304074ce50e94ac8faae95975177f9.da.png) + +Grafen ovenfor viser et eksempel på en væksthastighed i forhold til temperatur. Op til basistemperaturen er der ingen vækst. Væksthastigheden stiger op til den optimale temperatur og falder derefter efter at have nået denne top. + +Grafens form varierer fra plantesort til plantesort. Nogle har skarpere fald over den optimale temperatur, mens andre har langsommere stigninger fra basis til optimal. + +> 💁 For at en landmand kan opnå den bedste vækst, skal de kende de tre temperaturværdier og forstå grafens form for de planter, de dyrker. + +Hvis en landmand har kontrol over temperaturen, for eksempel i et kommercielt drivhus, kan de optimere for deres planter. Et kommercielt drivhus, der dyrker tomater, vil for eksempel have temperaturen indstillet til omkring 25°C om dagen og 20°C om natten for at opnå den hurtigste vækst. + +> 🍅 Ved at kombinere disse temperaturer med kunstigt lys, gødning og kontrollerede CO2-niveauer kan kommercielle dyrkere dyrke og høste året rundt. + +## Mål omgivelsestemperaturen + +Temperatursensorer kan bruges med IoT-enheder til at måle omgivelsestemperaturen. + +### Opgave - mål temperaturen + +Følg den relevante vejledning for at overvåge temperaturer ved hjælp af din IoT-enhed: + +* [Arduino - Wio Terminal](wio-terminal-temp.md) +* [Single-board computer - Raspberry Pi](pi-temp.md) +* [Single-board computer - Virtuel enhed](virtual-device-temp.md) + +## Vækstgradedage + +Vækstgradedage (også kendt som vækstgradsenheder) er en måde at måle planters vækst baseret på temperaturen. Forudsat at en plante har nok vand, næringsstoffer og CO2, bestemmer temperaturen væksthastigheden. + +Vækstgradedage, eller GDD, beregnes pr. dag som den gennemsnitlige temperatur i Celsius for en dag over plantens basistemperatur. Hver plante har brug for et bestemt antal GDD for at vokse, blomstre eller producere og modne en afgrøde. Jo flere GDD hver dag, jo hurtigere vokser planten. + +> 🇺🇸 For amerikanere kan vækstgradedage også beregnes ved hjælp af Fahrenheit. 5 GDD (i Celsius) svarer til 9 GDD (i Fahrenheit). + +Den fulde formel for GDD er lidt kompliceret, men der findes en forenklet ligning, der ofte bruges som en god tilnærmelse: + +![GDD = T max + T min divideret med 2, alt minus T base](../../../../../translated_images/gdd-calculation.79b3660f9c5757aa92dc2dd2cdde75344e2d2c1565c4b3151640f7887edc0275.da.png) + +* **GDD** - dette er antallet af vækstgradedage +* **T max** - dette er den daglige maksimumtemperatur i grader Celsius +* **T min** - dette er den daglige minimumtemperatur i grader Celsius +* **T base** - dette er plantens basistemperatur i grader Celsius + +> 💁 Der findes variationer, der tager højde for T max over 30°C eller T min under T base, men vi ser bort fra disse for nu. + +### Eksempel - Majs 🌽 + +Afhængigt af sorten har majs brug for mellem 800 og 2.700 GDD for at modne, med en basistemperatur på 10°C. + +På den første dag over basistemperaturen blev følgende temperaturer målt: + +| Måling | Temp °C | +| :---------- | :-----: | +| Maksimum | 16 | +| Minimum | 12 | + +Ved at indsætte disse tal i vores beregning: + +* T max = 16 +* T min = 12 +* T base = 10 + +Dette giver en beregning på: + +![GDD = 16 + 12 divideret med 2, alt minus 10, hvilket giver et svar på 4](../../../../../translated_images/gdd-calculation-corn.64a58b7a7afcd0dfd46ff733996d939f17f4f3feac9f0d1c632be3523e51ebd9.da.png) + +Majsen modtog 4 GDD den dag. Hvis vi antager en majsvariant, der har brug for 800 GDD for at modne, vil den have brug for yderligere 796 GDD for at nå modenhed. + +✅ Lav lidt research. For planter i din have, skole eller lokale park, kan du finde antallet af GDD, der kræves for at nå modenhed eller producere afgrøder? + +## Beregn GDD ved hjælp af temperatursensordata + +Planter vokser ikke på faste datoer - for eksempel kan du ikke plante et frø og vide, at planten vil bære frugt præcis 100 dage senere. I stedet kan en landmand have en grov idé om, hvor lang tid en plante tager at vokse, og derefter tjekke dagligt for at se, hvornår afgrøderne er klar. + +Dette har en stor arbejdsbyrde på en stor gård og risikerer, at landmanden overser afgrøder, der er klar uventet tidligt. Ved at måle temperaturer kan landmanden beregne de GDD, en plante har modtaget, hvilket gør det muligt kun at tjekke tæt på den forventede modenhed. + +Ved at indsamle temperaturdata ved hjælp af en IoT-enhed kan en landmand automatisk blive underrettet, når planter nærmer sig modenhed. En typisk arkitektur for dette er at lade IoT-enhederne måle temperaturen og derefter sende disse telemetridata over internettet ved hjælp af noget som MQTT. Serverkode lytter derefter til disse data og gemmer dem et sted, såsom i en database. Dette betyder, at dataene derefter kan analyseres senere, for eksempel et natligt job til at beregne dagens GDD, summere GDD for hver afgrøde hidtil og give besked, hvis en plante nærmer sig modenhed. + +![Telemetridata sendes til en server og gemmes derefter i en database](../../../../../translated_images/save-telemetry-database.ddc9c6bea0c5ba39449966a463ca6748cd8e2d565dab44ff31c9f1d2f6c21d27.da.png) + +Serverkoden kan også tilføje ekstra information til dataene. For eksempel kan IoT-enheden sende en identifikator for at angive, hvilken enhed det er, og serverkoden kan bruge dette til at finde placeringen af enheden og hvilke afgrøder, den overvåger. Den kan også tilføje grundlæggende data som det aktuelle tidspunkt, da nogle IoT-enheder ikke har den nødvendige hardware til at holde styr på præcise tidspunkter eller kræver yderligere kode for at læse det aktuelle tidspunkt over internettet. + +✅ Hvorfor tror du, at forskellige marker kan have forskellige temperaturer? + +### Opgave - send temperaturinformation + +Følg den relevante vejledning for at sende temperaturdata over MQTT ved hjælp af din IoT-enhed, så de kan analyseres senere: + +* [Arduino - Wio Terminal](wio-terminal-temp-publish.md) +* [Single-board computer - Raspberry Pi/Virtuel IoT-enhed](single-board-computer-temp-publish.md) + +### Opgave - indfang og gem temperaturinformation + +Når IoT-enheden sender telemetri, kan serverkoden skrives til at abonnere på disse data og gemme dem. I stedet for at gemme dem i en database vil serverkoden gemme dem i en kommasepareret værdifil (CSV). CSV-filer gemmer data som rækker af værdier som tekst, hvor hver værdi er adskilt af et komma, og hver post på en ny linje. De er en praktisk, menneskeligt læsbar og bredt understøttet måde at gemme data som en fil. + +CSV-filen vil have to kolonner - *dato* og *temperatur*. *Dato*-kolonnen angiver den aktuelle dato og tid, hvor beskeden blev modtaget af serveren, og *temperatur* kommer fra telemetribeskeden. + +1. Gentag trinnene i lektion 4 for at oprette serverkode til at abonnere på telemetri. Du behøver ikke tilføje kode til at sende kommandoer. + + Trinnene for dette er: + + * Konfigurer og aktiver et Python-virtuelt miljø + + * Installer paho-mqtt pip-pakken + + * Skriv koden til at lytte efter MQTT-beskeder, der sendes på telemetriemnet + + > ⚠️ Du kan henvise til [instruktionerne i lektion 4 for at oprette en Python-app til at modtage telemetri, hvis det er nødvendigt](../../../1-getting-started/lessons/4-connect-internet/README.md#receive-telemetry-from-the-mqtt-broker). + + Navngiv mappen for dette projekt `temperature-sensor-server`. + +1. Sørg for, at `client_name` afspejler dette projekt: + + ```cpp + client_name = id + 'temperature_sensor_server' + ``` + +1. Tilføj følgende imports øverst i filen, under de eksisterende imports: + + ```python + from os import path + import csv + from datetime import datetime + ``` + + Dette importerer et bibliotek til læsning af filer, et bibliotek til at interagere med CSV-filer og et bibliotek til at hjælpe med datoer og tidspunkter. + +1. Tilføj følgende kode før `handle_telemetry`-funktionen: + + ```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() + ``` + + Denne kode erklærer nogle konstanter for navnet på filen, der skal skrives til, og navnet på kolonneoverskrifterne for CSV-filen. Den første række i en CSV-fil indeholder traditionelt kolonneoverskrifter adskilt af kommaer. + + Koden tjekker derefter, om CSV-filen allerede eksisterer. Hvis den ikke eksisterer, oprettes den med kolonneoverskrifterne på den første række. + +1. Tilføj følgende kode til slutningen af `handle_telemetry`-funktionen: + + ```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']}) + ``` +Denne kode åbner CSV-filen og tilføjer en ny række i slutningen. Rækken indeholder den aktuelle dato og tid formateret i et menneskelæsbart format, efterfulgt af temperaturen modtaget fra IoT-enheden. Dataene gemmes i [ISO 8601 format](https://wikipedia.org/wiki/ISO_8601) med tidszone, men uden mikrosekunder. + +1. Kør denne kode på samme måde som før, og sørg for, at din IoT-enhed sender data. En CSV-fil kaldet `temperature.csv` vil blive oprettet i samme mappe. Hvis du åbner den, vil du se dato/tidspunkter og temperaturmålinger: + + ```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. Kør denne kode i et stykke tid for at indsamle data. Ideelt set bør du køre den i en hel dag for at samle nok data til GDD-beregninger. + + +> 💁 Hvis du bruger en virtuel IoT-enhed, skal du vælge tilfældighedsafkrydsningsfeltet og angive et interval for at undgå at få den samme temperatur hver gang temperaturværdien returneres. + ![Vælg tilfældighedsafkrydsningsfeltet og angiv et interval](../../../../../translated_images/select-the-random-checkbox-and-set-a-range.32cf4bc7c12e797f8c76616b10c7c23a6592321bb1a6310e0b481e72f97d23b3.da.png) + + > 💁 Hvis du vil køre dette i en hel dag, skal du sørge for, at computeren, som din serverkode kører på, ikke går i dvale, enten ved at ændre dine strømindstillinger eller ved at køre noget som [denne Python-script til at holde systemet aktivt](https://github.com/jaqsparow/keep-system-active). + +> 💁 Du kan finde denne kode i mappen [code-server/temperature-sensor-server](../../../../../2-farm/lessons/1-predict-plant-growth/code-server/temperature-sensor-server). + +### Opgave - beregn GDD ved hjælp af de gemte data + +Når serveren har indsamlet temperaturdata, kan GDD for en plante beregnes. + +Trinene til at gøre dette manuelt er: + +1. Find basistemperaturen for planten. For eksempel er basistemperaturen for jordbær 10°C. + +1. Fra `temperature.csv`, find dagens højeste og laveste temperaturer. + +1. Brug GDD-beregningen, der blev givet tidligere, til at beregne GDD. + +For eksempel, hvis dagens højeste temperatur er 25°C, og den laveste er 12°C: + +![GDD = 25 + 12 divideret med 2, derefter træk 10 fra resultatet, hvilket giver 8.5](../../../../../translated_images/gdd-calculation-strawberries.59f57db94b22adb8ff6efb951ace33af104a1c6ccca3ffb0f8169c14cb160c90.da.png) + +* 25 + 12 = 37 +* 37 / 2 = 18.5 +* 18.5 - 10 = 8.5 + +Derfor har jordbærrene modtaget **8.5** GDD. Jordbær har brug for omkring 250 GDD for at bære frugt, så der er stadig et stykke vej. + +--- + +## 🚀 Udfordring + +Planter har brug for mere end varme for at vokse. Hvilke andre ting er nødvendige? + +For disse, undersøg om der findes sensorer, der kan måle dem. Hvad med aktuatorer til at kontrollere disse niveauer? Hvordan ville du sammensætte en eller flere IoT-enheder for at optimere plantevækst? + +## Quiz efter forelæsning + +[Quiz efter forelæsning](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/10) + +## Gennemgang & Selvstudie + +* Læs mere om digital landbrug på [Digital Agriculture Wikipedia-siden](https://wikipedia.org/wiki/Digital_agriculture). Læs også mere om præcisionslandbrug på [Precision Agriculture Wikipedia-siden](https://wikipedia.org/wiki/Precision_agriculture). +* Den fulde beregning af vækstdage (GDD) er mere kompliceret end den forenklede, der er givet her. Læs mere om den mere komplicerede ligning og hvordan man håndterer temperaturer under baseline på [Growing Degree Day Wikipedia-siden](https://wikipedia.org/wiki/Growing_degree-day). +* Mad kan blive knap i fremtiden, hvis vi fortsat bruger de samme metoder til landbrug. Lær mere om højteknologiske landbrugsteknikker i denne [Hi-Tech Farms of Future video på YouTube](https://www.youtube.com/watch?v=KIEOuKD9KX8). + +## Opgave + +[Visualiser GDD-data ved hjælp af en Jupyter Notebook](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/1-predict-plant-growth/assignment.md b/translations/da/2-farm/lessons/1-predict-plant-growth/assignment.md new file mode 100644 index 00000000..55a2b683 --- /dev/null +++ b/translations/da/2-farm/lessons/1-predict-plant-growth/assignment.md @@ -0,0 +1,57 @@ + +# Visualiser GDD-data ved hjælp af en Jupyter Notebook + +## Instruktioner + +I denne lektion har du indsamlet GDD-data ved hjælp af en IoT-sensor. For at få gode GDD-data skal du indsamle data over flere dage. For at hjælpe med at visualisere temperaturdata og beregne GDD kan du bruge værktøjer som [Jupyter Notebooks](https://jupyter.org) til at analysere dataene. + +Start med at indsamle data i et par dage. Du skal sikre dig, at din serverkode kører hele tiden, mens din IoT-enhed er aktiv, enten ved at justere dine strømstyringsindstillinger eller ved at køre noget som [denne Python-script til at holde systemet aktivt](https://github.com/jaqsparow/keep-system-active). + +Når du har temperaturdata, kan du bruge Jupyter Notebook i dette repo til at visualisere dem og beregne GDD. Jupyter Notebooks blander kode og instruktioner i blokke kaldet *celler*, ofte kode i Python. Du kan læse instruktionerne og derefter køre hver kodeblok, blok for blok. Du kan også redigere koden. I denne notebook kan du for eksempel redigere basistemperaturen, der bruges til at beregne GDD for din plante. + +1. Opret en mappe kaldet `gdd-calculation` + +1. Download filen [gdd.ipynb](./code-notebook/gdd.ipynb) og kopier den ind i mappen `gdd-calculation`. + +1. Kopier filen `temperature.csv`, der blev oprettet af MQTT-serveren. + +1. Opret et nyt Python-virtuelt miljø i mappen `gdd-calculation`. + +1. Installer nogle pip-pakker til Jupyter Notebooks sammen med biblioteker, der er nødvendige for at håndtere og plotte data: + + ```sh + pip install --upgrade pip + pip install pandas + pip install matplotlib + pip install jupyter + ``` + +1. Kør notebooken i Jupyter: + + ```sh + jupyter notebook gdd.ipynb + ``` + + Jupyter starter op og åbner notebooken i din browser. Arbejd dig igennem instruktionerne i notebooken for at visualisere de målte temperaturer og beregne vækstdage (GDD). + + ![Jupyter Notebook](../../../../../translated_images/gdd-jupyter-notebook.c5b52cf21094f158a61f47f455490fd95f1729777ff90861a4521820bf354cdc.da.png) + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Indsamling af data | Indsamler mindst 2 komplette dages data | Indsamler mindst 1 komplet dags data | Indsamler nogle data | +| Beregning af GDD | Kører notebooken med succes og beregner GDD | Kører notebooken med succes | Kan ikke køre notebooken | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb b/translations/da/2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb new file mode 100644 index 00000000..cb04d287 --- /dev/null +++ b/translations/da/2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb @@ -0,0 +1,167 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Vækstgraddage\n", + "\n", + "Denne notebook indlæser temperaturdata gemt i en CSV-fil og analyserer dem. Den plotter temperaturerne, viser den højeste og laveste værdi for hver dag og beregner GDD.\n", + "\n", + "For at bruge denne notebook:\n", + "\n", + "* Kopiér filen `temperature.csv` til samme mappe som denne notebook\n", + "* Kør alle cellerne ved hjælp af knappen **▶︎ Kør** ovenfor. Dette vil køre den valgte celle og derefter gå videre til den næste.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I cellen nedenfor skal du sætte `base_temperature` til plantens basistemperatur.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "base_temperature = 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "CSV-filen skal nu indlæses ved hjælp af 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": [ + "Når dataene er blevet læst, kan de grupperes efter `date`-kolonnen, og minimums- og maksimumstemperaturerne kan udtrækkes for hver dato.\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 kan beregnes ved hjælp af den standard GDD-ligning\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**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "metadata": { + "interpreter": { + "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + } + }, + "coopTranslator": { + "original_hash": "8fcf954f6042f0bf3601a2c836a09574", + "translation_date": "2025-08-27T22:59:43+00:00", + "source_file": "2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb", + "language_code": "da" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/translations/da/2-farm/lessons/1-predict-plant-growth/pi-temp.md b/translations/da/2-farm/lessons/1-predict-plant-growth/pi-temp.md new file mode 100644 index 00000000..a8cbea3e --- /dev/null +++ b/translations/da/2-farm/lessons/1-predict-plant-growth/pi-temp.md @@ -0,0 +1,125 @@ + +# Mål temperatur - Raspberry Pi + +I denne del af lektionen vil du tilføje en temperatursensor til din Raspberry Pi. + +## Hardware + +Sensoren, du vil bruge, er en [DHT11 fugtigheds- og temperatursensor](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html), som kombinerer 2 sensorer i én pakke. Denne sensor er ret populær, og der findes mange kommercielt tilgængelige sensorer, der kombinerer temperatur, fugtighed og nogle gange atmosfærisk tryk. Temperaturkomponenten er en negativ temperaturkoefficient (NTC) termistor, en termistor hvor modstanden falder, når temperaturen stiger. + +Dette er en digital sensor, så den har en indbygget ADC, der skaber et digitalt signal med temperatur- og fugtighedsdata, som mikrocontrolleren kan læse. + +### Tilslut temperatursensoren + +Grove-temperatursensoren kan tilsluttes Raspberry Pi. + +#### Opgave + +Tilslut temperatursensoren + +![En Grove-temperatursensor](../../../../../translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.da.png) + +1. Sæt den ene ende af et Grove-kabel i stikket på fugtigheds- og temperatursensoren. Det kan kun sættes i på én måde. + +1. Med Raspberry Pi slukket, tilslut den anden ende af Grove-kablet til det digitale stik markeret **D5** på Grove Base-hatten, der er tilsluttet Pi'en. Dette stik er det andet fra venstre i rækken af stik ved siden af GPIO-pinnene. + +![Grove-temperatursensoren tilsluttet stik A0](../../../../../translated_images/pi-temperature-sensor.3ff82fff672c8e565ef25a39d26d111de006b825a7e0867227ef4e7fbff8553c.da.png) + +## Programmer temperatursensoren + +Enheden kan nu programmeres til at bruge den tilsluttede temperatursensor. + +### Opgave + +Programmer enheden. + +1. Tænd for Pi'en og vent, indtil den er startet op. + +1. Start VS Code, enten direkte på Pi'en eller ved at oprette forbindelse via Remote SSH-udvidelsen. + + > ⚠️ Du kan finde [instruktionerne til opsætning og start af VS Code i lektion 1, hvis det er nødvendigt](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. Fra terminalen skal du oprette en ny mappe i `pi`-brugerens hjemmekatalog kaldet `temperature-sensor`. Opret en fil i denne mappe kaldet `app.py`: + + ```sh + mkdir temperature-sensor + cd temperature-sensor + touch app.py + ``` + +1. Åbn denne mappe i VS Code. + +1. For at bruge fugtigheds- og temperatursensoren skal en ekstra Pip-pakke installeres. Fra terminalen i VS Code skal du køre følgende kommando for at installere denne Pip-pakke på Pi'en: + + ```sh + pip3 install seeed-python-dht + ``` + +1. Tilføj følgende kode til `app.py`-filen for at importere de nødvendige biblioteker: + + ```python + import time + from seeed_dht import DHT + ``` + + `from seeed_dht import DHT`-sætningen importerer `DHT`-sensor-klassen for at interagere med en Grove-temperatursensor fra `seeed_dht`-modulet. + +1. Tilføj følgende kode efter ovenstående for at oprette en instans af klassen, der styrer temperatursensoren: + + ```python + sensor = DHT("11", 5) + ``` + + Dette erklærer en instans af `DHT`-klassen, der styrer den **D**igitale **H**umidity og **T**emperature sensor. Den første parameter angiver, at den sensor, der bruges, er *DHT11*-sensoren - det bibliotek, du bruger, understøtter andre varianter af denne sensor. Den anden parameter angiver, at sensoren er tilsluttet digital port `D5` på Grove Base-hatten. + + > ✅ Husk, alle stikkene har unikke pin-numre. Pins 0, 2, 4 og 6 er analoge pins, pins 5, 16, 18, 22, 24 og 26 er digitale pins. + +1. Tilføj en uendelig løkke efter ovenstående kode for at aflæse temperatursensorens værdi og udskrive den til konsollen: + + ```python + while True: + _, temp = sensor.read() + print(f'Temperature {temp}°C') + ``` + + Kaldet til `sensor.read()` returnerer en tuple med fugtighed og temperatur. Du har kun brug for temperaturværdien, så fugtigheden ignoreres. Temperaturværdien udskrives derefter til konsollen. + +1. Tilføj en kort pause på ti sekunder i slutningen af `loop`, da temperaturværdierne ikke behøver at blive kontrolleret kontinuerligt. En pause reducerer enhedens strømforbrug. + + ```python + time.sleep(10) + ``` + +1. Fra VS Code-terminalen skal du køre følgende for at køre din Python-app: + + ```sh + python3 app.py + ``` + + Du bør se temperaturværdier blive udskrevet til konsollen. Brug noget til at varme sensoren op, som at trykke din tommelfinger på den eller bruge en ventilator for at se værdierne ændre sig: + + ```output + pi@raspberrypi:~/temperature-sensor $ python3 app.py + Temperature 26°C + Temperature 26°C + Temperature 28°C + Temperature 30°C + Temperature 32°C + ``` + +> 💁 Du kan finde denne kode i [code-temperature/pi](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/pi)-mappen. + +😀 Dit program til temperatursensoren var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md b/translations/da/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md new file mode 100644 index 00000000..37d73f02 --- /dev/null +++ b/translations/da/2-farm/lessons/1-predict-plant-growth/single-board-computer-temp-publish.md @@ -0,0 +1,71 @@ + +# Udgiv temperatur - Virtuel IoT-hardware og Raspberry Pi + +I denne del af lektionen vil du udgive temperaturværdier, der er registreret af Raspberry Pi eller Virtuel IoT-enhed via MQTT, så de senere kan bruges til at beregne GDD. + +## Udgiv temperaturen + +Når temperaturen er blevet aflæst, kan den udgives via MQTT til noget 'server'-kode, der vil læse værdierne og gemme dem klar til brug i en GDD-beregning. + +### Opgave - udgiv temperaturen + +Programmer enheden til at udgive temperaturdata. + +1. Åbn `temperature-sensor` app-projektet, hvis det ikke allerede er åbent. + +1. Gentag de trin, du udførte i lektion 4 for at oprette forbindelse til MQTT og sende telemetri. Du vil bruge den samme offentlige Mosquitto-broker. + + Trinnene for dette er: + + - Tilføj MQTT pip-pakken + - Tilføj koden for at oprette forbindelse til MQTT-brokeren + - Tilføj koden for at udgive telemetri + + > ⚠️ Se [instruktionerne for at oprette forbindelse til MQTT](../../../1-getting-started/lessons/4-connect-internet/single-board-computer-mqtt.md) og [instruktionerne for at sende telemetri](../../../1-getting-started/lessons/4-connect-internet/single-board-computer-telemetry.md) fra lektion 4, hvis det er nødvendigt. + +1. Sørg for, at `client_name` afspejler dette projekts navn: + + ```python + client_name = id + 'temperature_sensor_client' + ``` + +1. For telemetrien, i stedet for at sende en lysværdi, skal du sende temperaturværdien, der er aflæst fra DHT-sensoren, i en egenskab på JSON-dokumentet kaldet `temperature`: + + ```python + _, temp = sensor.read() + telemetry = json.dumps({'temperature' : temp}) + ``` + +1. Temperaturværdien behøver ikke aflæses særlig ofte - den vil ikke ændre sig meget på kort tid, så sæt `time.sleep` til 10 minutter: + + ```cpp + time.sleep(10 * 60); + ``` + + > 💁 Funktionen `sleep` tager tiden i sekunder, så for at gøre det lettere at læse, sendes værdien som resultatet af en beregning. 60 sekunder i et minut, så 10 x (60 sekunder i et minut) giver en forsinkelse på 10 minutter. + +1. Kør koden på samme måde som du kørte koden fra den tidligere del af opgaven. Hvis du bruger en virtuel IoT-enhed, skal du sørge for, at CounterFit-appen kører, og at fugtigheds- og temperatursensorerne er oprettet på de korrekte pins. + + ```output + pi@raspberrypi:~/temperature-sensor $ python3 app.py + MQTT connected! + Sending telemetry {"temperature": 25} + Sending telemetry {"temperature": 25} + ``` + +> 💁 Du kan finde denne kode i mappen [code-publish-temperature/virtual-device](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/virtual-device) eller mappen [code-publish-temperature/pi](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/pi). + +😀 Du har med succes udgivet temperaturen som telemetri fra din enhed. + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md b/translations/da/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md new file mode 100644 index 00000000..77b7d28a --- /dev/null +++ b/translations/da/2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md @@ -0,0 +1,154 @@ + +# Mål temperatur - Virtuel IoT-hardware + +I denne del af lektionen vil du tilføje en temperatursensor til din virtuelle IoT-enhed. + +## Virtuel hardware + +Den virtuelle IoT-enhed vil bruge en simuleret Grove Digital Humidity and Temperature-sensor. Dette gør denne øvelse identisk med at bruge en Raspberry Pi med en fysisk Grove DHT11-sensor. + +Sensoren kombinerer en **temperatursensor** med en **fugtighedssensor**, men i denne øvelse er du kun interesseret i temperatursensor-komponenten. På en fysisk IoT-enhed ville temperatursensoren være en [termistor](https://wikipedia.org/wiki/Thermistor), der måler temperatur ved at registrere ændringer i modstand, når temperaturen ændrer sig. Temperatursensorer er normalt digitale sensorer, der internt konverterer den målte modstand til en temperatur i grader Celsius (eller Kelvin, eller Fahrenheit). + +### Tilføj sensorerne til CounterFit + +For at bruge en virtuel fugtigheds- og temperatursensor skal du tilføje de to sensorer til CounterFit-appen. + +#### Opgave - tilføj sensorerne til CounterFit + +Tilføj fugtigheds- og temperatursensorerne til CounterFit-appen. + +1. Opret en ny Python-app på din computer i en mappe kaldet `temperature-sensor` med en enkelt fil kaldet `app.py` og et Python-virtuelt miljø, og tilføj CounterFit pip-pakkerne. + + > ⚠️ Du kan henvise til [instruktionerne for at oprette og opsætte et CounterFit Python-projekt i lektion 1, hvis nødvendigt](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Installer en ekstra Pip-pakke for at installere en CounterFit shim til DHT11-sensoren. Sørg for, at du installerer dette fra en terminal med det virtuelle miljø aktiveret. + + ```sh + pip install counterfit-shims-seeed-python-dht + ``` + +1. Sørg for, at CounterFit-webappen kører. + +1. Opret en fugtighedssensor: + + 1. I boksen *Create sensor* i panelet *Sensors*, vælg *Sensor type* og vælg *Humidity*. + + 1. Lad *Units* være indstillet til *Percentage*. + + 1. Sørg for, at *Pin* er indstillet til *5*. + + 1. Vælg knappen **Add** for at oprette fugtighedssensoren på Pin 5. + + ![Indstillinger for fugtighedssensor](../../../../../translated_images/counterfit-create-humidity-sensor.2750e27b6f30e09cf4e22101defd5252710717620816ab41ba688f91f757c49a.da.png) + + Fugtighedssensoren vil blive oprettet og vises i sensorlisten. + + ![Fugtighedssensor oprettet](../../../../../translated_images/counterfit-humidity-sensor.7b12f7f339e430cb26c8211d2dba4ef75261b353a01da0932698b5bebd693f27.da.png) + +1. Opret en temperatursensor: + + 1. I boksen *Create sensor* i panelet *Sensors*, vælg *Sensor type* og vælg *Temperature*. + + 1. Lad *Units* være indstillet til *Celsius*. + + 1. Sørg for, at *Pin* er indstillet til *6*. + + 1. Vælg knappen **Add** for at oprette temperatursensoren på Pin 6. + + ![Indstillinger for temperatursensor](../../../../../translated_images/counterfit-create-temperature-sensor.199350ed34f7343d79dccbe95eaf6c11d2121f03d1c35ab9613b330c23f39b29.da.png) + + Temperatursensoren vil blive oprettet og vises i sensorlisten. + + ![Temperatursensor oprettet](../../../../../translated_images/counterfit-temperature-sensor.f0560236c96a9016bafce7f6f792476fe3367bc6941a1f7d5811d144d4bcbfff.da.png) + +## Programmer temperatursensor-appen + +Temperatursensor-appen kan nu programmeres ved hjælp af CounterFit-sensorerne. + +### Opgave - programmer temperatursensor-appen + +Programmer temperatursensor-appen. + +1. Sørg for, at `temperature-sensor`-appen er åben i VS Code. + +1. Åbn filen `app.py`. + +1. Tilføj følgende kode øverst i `app.py` for at forbinde appen til CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Tilføj følgende kode til `app.py` for at importere de nødvendige biblioteker: + + ```python + import time + from counterfit_shims_seeed_python_dht import DHT + ``` + + `from seeed_dht import DHT`-sætningen importerer `DHT`-sensor-klassen for at interagere med en virtuel Grove-temperatursensor ved hjælp af en shim fra modulet `counterfit_shims_seeed_python_dht`. + +1. Tilføj følgende kode efter ovenstående for at oprette en instans af klassen, der styrer den virtuelle fugtigheds- og temperatursensor: + + ```python + sensor = DHT("11", 5) + ``` + + Dette erklærer en instans af `DHT`-klassen, der styrer den virtuelle **D**igitale **H**umidity og **T**emperature-sensor. Den første parameter fortæller koden, at sensoren, der bruges, er en virtuel *DHT11*-sensor. Den anden parameter fortæller koden, at sensoren er tilsluttet port `5`. + + > 💁 CounterFit simulerer denne kombinerede fugtigheds- og temperatursensor ved at forbinde til 2 sensorer: en fugtighedssensor på den pin, der gives, når `DHT`-klassen oprettes, og en temperatursensor, der kører på den næste pin. Hvis fugtighedssensoren er på pin 5, forventer shimmen, at temperatursensoren er på pin 6. + +1. Tilføj en uendelig løkke efter ovenstående kode for at aflæse temperatursensorens værdi og udskrive den til konsollen: + + ```python + while True: + _, temp = sensor.read() + print(f'Temperature {temp}°C') + ``` + + Kaldet til `sensor.read()` returnerer en tuple med fugtighed og temperatur. Du har kun brug for temperaturværdien, så fugtigheden ignoreres. Temperaturværdien udskrives derefter til konsollen. + +1. Tilføj en kort pause på ti sekunder i slutningen af `loop`, da temperaturværdierne ikke behøver at blive kontrolleret kontinuerligt. En pause reducerer enhedens strømforbrug. + + ```python + time.sleep(10) + ``` + +1. Fra VS Code-terminalen med et aktiveret virtuelt miljø, kør følgende for at køre din Python-app: + + ```sh + python app.py + ``` + +1. Fra CounterFit-appen skal du ændre værdien af temperatursensoren, der vil blive aflæst af appen. Du kan gøre dette på to måder: + + * Indtast et tal i *Value*-boksen for temperatursensoren, og vælg derefter knappen **Set**. Det tal, du indtaster, vil være den værdi, sensoren returnerer. + + * Marker afkrydsningsfeltet *Random*, og indtast en *Min*- og *Max*-værdi, og vælg derefter knappen **Set**. Hver gang sensoren aflæser en værdi, vil den aflæse et tilfældigt tal mellem *Min* og *Max*. + + Du bør se de værdier, du har indstillet, vises i konsollen. Ændr *Value* eller *Random*-indstillingerne for at se værdien ændre sig. + + ```output + (.venv) ➜ temperature-sensor python app.py + Temperature 28.25°C + Temperature 30.71°C + Temperature 25.17°C + ``` + +> 💁 Du kan finde denne kode i mappen [code-temperature/virtual-device](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/virtual-device). + +😀 Dit temperatursensorprogram var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md b/translations/da/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md new file mode 100644 index 00000000..d17866b4 --- /dev/null +++ b/translations/da/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp-publish.md @@ -0,0 +1,82 @@ + +# Udgiv temperatur - Wio Terminal + +I denne del af lektionen vil du udgive de temperaturværdier, som Wio Terminal registrerer, via MQTT, så de senere kan bruges til at beregne GDD. + +## Udgiv temperaturen + +Når temperaturen er blevet aflæst, kan den udgives via MQTT til noget 'server'-kode, der vil læse værdierne og gemme dem, så de er klar til at blive brugt til en GDD-beregning. Mikrocontrollere aflæser ikke tiden fra internettet og holder ikke styr på tiden med et realtidsur som standard. Enheden skal programmeres til dette, forudsat at den har det nødvendige hardware. + +For at gøre tingene enklere i denne lektion vil tiden ikke blive sendt sammen med sensordataene. I stedet kan den tilføjes af serverkoden senere, når den modtager beskederne. + +### Opgave + +Programmer enheden til at udgive temperaturdata. + +1. Åbn `temperature-sensor` Wio Terminal-projektet. + +1. Gentag de trin, du udførte i lektion 4 for at oprette forbindelse til MQTT og sende telemetri. Du vil bruge den samme offentlige Mosquitto-broker. + + Trinnene er som følger: + + - Tilføj Seeed WiFi- og MQTT-bibliotekerne til `.ini`-filen + - Tilføj konfigurationsfilen og koden til at oprette forbindelse til WiFi + - Tilføj koden til at oprette forbindelse til MQTT-brokeren + - Tilføj koden til at udgive telemetri + + > ⚠️ Se [instruktionerne for at oprette forbindelse til MQTT](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md) og [instruktionerne for at sende telemetri](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md) fra lektion 4, hvis det er nødvendigt. + +1. Sørg for, at `CLIENT_NAME` i `config.h` header-filen afspejler dette projekt: + + ```cpp + const string CLIENT_NAME = ID + "temperature_sensor_client"; + ``` + +1. For telemetrien, i stedet for at sende en lysværdi, skal du sende temperaturværdien, der aflæses fra DHT-sensoren, i en egenskab i JSON-dokumentet kaldet `temperature` ved at ændre `loop`-funktionen i `main.cpp`: + + ```cpp + float temp_hum_val[2] = {0}; + dht.readTempAndHumidity(temp_hum_val); + + DynamicJsonDocument doc(1024); + doc["temperature"] = temp_hum_val[1]; + ``` + +1. Temperaturværdien behøver ikke at blive aflæst særlig ofte - den ændrer sig ikke meget på kort tid, så sæt `delay` i `loop`-funktionen til 10 minutter: + + ```cpp + delay(10 * 60 * 1000); + ``` + + > 💁 `delay`-funktionen tager tiden i millisekunder, så for at gøre det lettere at læse bliver værdien givet som resultatet af en beregning. 1.000 ms i et sekund, 60 sekunder i et minut, så 10 x (60 sekunder i et minut) x (1.000 ms i et sekund) giver en forsinkelse på 10 minutter. + +1. Upload dette til din Wio Terminal, og brug seriel monitor til at se temperaturen blive sendt til MQTT-brokeren. + + ```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} + ``` + +> 💁 Du kan finde denne kode i [code-publish-temperature/wio-terminal](../../../../../2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal)-mappen. + +😀 Du har med succes udgivet temperaturen som telemetri fra din enhed. + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md b/translations/da/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md new file mode 100644 index 00000000..617b741a --- /dev/null +++ b/translations/da/2-farm/lessons/1-predict-plant-growth/wio-terminal-temp.md @@ -0,0 +1,143 @@ + +# Mål temperatur - Wio Terminal + +I denne del af lektionen vil du tilføje en temperatursensor til din Wio Terminal og aflæse temperaturværdier fra den. + +## Hardware + +Wio Terminalen kræver en temperatursensor. + +Sensoren, du vil bruge, er en [DHT11 fugtigheds- og temperatursensor](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html), som kombinerer 2 sensorer i én pakke. Denne sensor er ret populær, og der findes mange kommercielt tilgængelige sensorer, der kombinerer temperatur, fugtighed og nogle gange atmosfærisk tryk. Temperaturkomponenten er en negativ temperaturkoefficient (NTC) termistor, en termistor hvor modstanden falder, når temperaturen stiger. + +Dette er en digital sensor, så den har en indbygget ADC, der skaber et digitalt signal med temperatur- og fugtighedsdata, som mikrocontrolleren kan læse. + +### Tilslut temperatursensoren + +Grove-temperatursensoren kan tilsluttes Wio Terminalens digitale port. + +#### Opgave - tilslut temperatursensoren + +Tilslut temperatursensoren. + +![En Grove-temperatursensor](../../../../../translated_images/grove-dht11.07f8eafceee170043efbb53e1d15722bd4e00fbaa9ff74290b57e9f66eb82c17.da.png) + +1. Sæt den ene ende af et Grove-kabel i stikket på fugtigheds- og temperatursensoren. Det kan kun sættes i på én måde. + +1. Med Wio Terminalen frakoblet fra din computer eller anden strømkilde, tilslut den anden ende af Grove-kablet til den højre Grove-port på Wio Terminalen, når du ser på skærmen. Dette er porten længst væk fra tænd/sluk-knappen. + +![Grove-temperatursensoren tilsluttet den højre port](../../../../../translated_images/wio-temperature-sensor.2934928f38c7f79a68d24879d2c8986c78244696f931e2e33c293f426ecdc0ad.da.png) + +## Programmer temperatursensoren + +Wio Terminalen kan nu programmeres til at bruge den tilsluttede temperatursensor. + +### Opgave - programmer temperatursensoren + +Programmer enheden. + +1. Opret et helt nyt Wio Terminal-projekt ved hjælp af PlatformIO. Kald dette projekt `temperature-sensor`. Tilføj kode i `setup`-funktionen for at konfigurere den serielle port. + + > ⚠️ Du kan finde [instruktionerne til at oprette et PlatformIO-projekt i projekt 1, lektion 1, hvis nødvendigt](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#create-a-platformio-project). + +1. Tilføj en biblioteksafhængighed for Seeed Grove Fugtigheds- og Temperatursensor-biblioteket til projektets `platformio.ini`-fil: + + ```ini + lib_deps = + seeed-studio/Grove Temperature And Humidity Sensor @ 1.0.1 + ``` + + > ⚠️ Du kan finde [instruktionerne til at tilføje biblioteker til et PlatformIO-projekt i projekt 1, lektion 4, hvis nødvendigt](../../../1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md#install-the-wifi-and-mqtt-arduino-libraries). + +1. Tilføj følgende `#include`-direktiver øverst i filen, under den eksisterende `#include `: + + ```cpp + #include + #include + ``` + + Dette importerer filer, der er nødvendige for at interagere med sensoren. `DHT.h`-headerfilen indeholder koden til selve sensoren, og tilføjelsen af `SPI.h`-headeren sikrer, at den kode, der er nødvendig for at kommunikere med sensoren, bliver linket ind, når appen kompileres. + +1. Før `setup`-funktionen, deklarer DHT-sensoren: + + ```cpp + DHT dht(D0, DHT11); + ``` + + Dette deklarerer en instans af `DHT`-klassen, som styrer den **D**igitale **H**umidity og **T**emperature sensor. Denne er tilsluttet port `D0`, den højre Grove-port på Wio Terminalen. Den anden parameter fortæller koden, at den sensor, der bruges, er *DHT11*-sensoren - det bibliotek, du bruger, understøtter andre varianter af denne sensor. + +1. I `setup`-funktionen, tilføj kode for at opsætte den serielle forbindelse: + + ```cpp + void setup() + { + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + } + ``` + +1. I slutningen af `setup`-funktionen, efter den sidste `delay`, tilføj et kald for at starte DHT-sensoren: + + ```cpp + dht.begin(); + ``` + +1. I `loop`-funktionen, tilføj kode for at kalde sensoren og udskrive temperaturen til den serielle port: + + ```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); + } + ``` + + Denne kode deklarerer et tomt array med 2 floats og sender det til kaldet `readTempAndHumidity` på `DHT`-instansen. Dette kald udfylder arrayet med 2 værdier - fugtigheden placeres i det 0. element i arrayet (husk, at arrays i C++ er 0-baserede, så det 0. element er det 'første' element i arrayet), og temperaturen placeres i det 1. element. + + Temperaturen aflæses fra det 1. element i arrayet og udskrives til den serielle port. + + > 🇺🇸 Temperaturen aflæses i Celsius. For amerikanere, for at konvertere dette til Fahrenheit, divider Celsius-værdien med 5, gang med 9, og læg 32 til. For eksempel bliver en temperaturaflæsning på 20°C til ((20/5)*9) + 32 = 68°F. + +1. Byg og upload koden til Wio Terminalen. + + > ⚠️ Du kan finde [instruktionerne til at oprette et PlatformIO-projekt i projekt 1, lektion 1, hvis nødvendigt](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#write-the-hello-world-app). + +1. Når koden er uploadet, kan du overvåge temperaturen ved hjælp af den serielle 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 + ``` + +> 💁 Du kan finde denne kode i [code-temperature/wio-terminal](../../../../../2-farm/lessons/1-predict-plant-growth/code-temperature/wio-terminal)-mappen. + +😀 Dit program til temperatursensoren var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at opnå nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/2-detect-soil-moisture/README.md b/translations/da/2-farm/lessons/2-detect-soil-moisture/README.md new file mode 100644 index 00000000..fc4387a5 --- /dev/null +++ b/translations/da/2-farm/lessons/2-detect-soil-moisture/README.md @@ -0,0 +1,169 @@ + +C, udtalt *I-squared-C*, er en multi-controller, multi-periferi protokol, hvor enhver tilsluttet enhed kan fungere som enten controller eller periferi og kommunikere over I²C-bussen (navnet for et kommunikationssystem, der overfører data). Data sendes som adresserede pakker, hvor hver pakke indeholder adressen på den tilsluttede enhed, den er beregnet til. + +> 💁 Denne model blev tidligere omtalt som master/slave, men denne terminologi er ved at blive udfaset på grund af dens association med slaveri. [Open Source Hardware Association har vedtaget controller/periferi](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/), men du kan stadig støde på referencer til den gamle terminologi. + +Enheder har en adresse, der bruges, når de tilsluttes I²C-bussen, og denne adresse er normalt hardkodet på enheden. For eksempel har hver type Grove-sensor fra Seeed den samme adresse, så alle lyssensorer har den samme adresse, og alle knapper har en anden adresse, der adskiller sig fra lyssensorens adresse. Nogle enheder har måder at ændre adressen på, ved at ændre jumperindstillinger eller lodde pins sammen. + +I²C har en bus bestående af 2 hovedledninger samt 2 strømledninger: + +| Ledning | Navn | Beskrivelse | +| ---- | --------- | ----------- | +| SDA | Serial Data | Denne ledning bruges til at sende data mellem enheder. | +| SCL | Serial Clock | Denne ledning sender et clock-signal med en hastighed, der er indstillet af controlleren. | +| VCC | Voltage common collector | Strømforsyningen til enhederne. Denne er forbundet til SDA- og SCL-ledningerne for at levere deres strøm via en pull-up modstand, der slukker signalet, når ingen enhed er controller. | +| GND | Ground | Dette giver en fælles jordforbindelse for det elektriske kredsløb. | + +![I2C-bus med 3 enheder forbundet til SDA- og SCL-ledningerne, der deler en fælles jordledning](../../../../../translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.da.png) + +For at sende data vil en enhed udsende en startbetingelse for at vise, at den er klar til at sende data. Den vil derefter blive controller. Controlleren sender derefter adressen på den enhed, den ønsker at kommunikere med, sammen med information om, hvorvidt den vil læse eller skrive data. Når dataene er blevet overført, sender controlleren en stopbetingelse for at indikere, at den er færdig. Herefter kan en anden enhed blive controller og sende eller modtage data. + +2C har hastighedsbegrænsninger med 3 forskellige tilstande, der kører med faste hastigheder. Den hurtigste er High Speed-tilstand med en maksimal hastighed på 3,4 Mbps (megabit per sekund), selvom meget få enheder understøtter denne hastighed. Raspberry Pi er for eksempel begrænset til fast mode ved 400 Kbps (kilobit per sekund). Standardtilstand kører ved 100 Kbps. + +> 💁 Hvis du bruger en Raspberry Pi med en Grove Base hat som din IoT-hardware, vil du kunne se en række I2C-stik på kortet, som du kan bruge til at kommunikere med I2C-sensorer. Analoge Grove-sensorer bruger også I2C med en ADC til at sende analoge værdier som digitale data, så lyssensoren, du brugte, simulerede en analog pin, hvor værdien blev sendt over I2C, da Raspberry Pi kun understøtter digitale pins. + +### Universal asynkron modtager-transmitter (UART) + +UART involverer fysisk kredsløb, der gør det muligt for to enheder at kommunikere. Hver enhed har 2 kommunikationspins - transmit (Tx) og receive (Rx), hvor Tx-pinnen på den første enhed er forbundet til Rx-pinnen på den anden, og Tx-pinnen på den anden enhed er forbundet til Rx-pinnen på den første. Dette gør det muligt at sende data i begge retninger. + +* Enhed 1 sender data fra sin Tx-pin, som modtages af enhed 2 på dens Rx-pin +* Enhed 1 modtager data på sin Rx-pin, som sendes af enhed 2 fra dens Tx-pin + +![UART med Tx-pinnen på én chip forbundet til Rx-pinnen på en anden og omvendt](../../../../../translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.da.png) + +> 🎓 Data sendes én bit ad gangen, og dette kaldes *seriel* kommunikation. De fleste operativsystemer og mikrocontrollere har *serielle porte*, det vil sige forbindelser, der kan sende og modtage serielle data, som er tilgængelige for din kode. + +UART-enheder har en [baudrate](https://wikipedia.org/wiki/Symbol_rate) (også kendt som symbolrate), som er den hastighed, data sendes og modtages med i bits per sekund. En almindelig baudrate er 9.600, hvilket betyder, at 9.600 bits (0'er og 1-taller) data sendes hvert sekund. + +UART bruger start- og stopbits - det vil sige, at den sender et startbit for at indikere, at den er ved at sende en byte (8 bits) data, og derefter et stopbit, når de 8 bits er sendt. + +UART-hastighed afhænger af hardware, men selv de hurtigste implementeringer overstiger ikke 6,5 Mbps (megabit per sekund, eller millioner af bits, 0 eller 1, sendt per sekund). + +Du kan bruge UART over GPIO-pins - du kan sætte én pin som Tx og en anden som Rx og derefter forbinde disse til en anden enhed. + +> 💁 Hvis du bruger en Raspberry Pi med en Grove Base hat som din IoT-hardware, vil du kunne se et UART-stik på kortet, som du kan bruge til at kommunikere med sensorer, der bruger UART-protokollen. + +### Serial Peripheral Interface (SPI) + +SPI er designet til kommunikation over korte afstande, såsom på en mikrocontroller til at tale med en lagringsenhed som flashhukommelse. Det er baseret på en controller/periferimodel med en enkelt controller (normalt processoren i IoT-enheden), der interagerer med flere perifere enheder. Controlleren styrer alt ved at vælge en periferienhed og sende eller anmode om data. + +> 💁 Ligesom I2C er termerne controller og periferienhed nyere ændringer, så du kan støde på de ældre termer stadig i brug. + +SPI-controllere bruger 3 ledninger sammen med 1 ekstra ledning per periferienhed. Periferienheder bruger 4 ledninger. Disse ledninger er: + +| Ledning | Navn | Beskrivelse | +| ---- | --------- | ----------- | +| COPI | Controller Output, Peripheral Input | Denne ledning bruges til at sende data fra controlleren til periferienheden. | +| CIPO | Controller Input, Peripheral Output | Denne ledning bruges til at sende data fra periferienheden til controlleren. | +| SCLK | Seriel Clock | Denne ledning sender et clock-signal med en hastighed, der er indstillet af controlleren. | +| CS | Chip Select | Controlleren har flere ledninger, én per periferienhed, og hver ledning forbinder til CS-ledningen på den tilsvarende periferienhed. | + +![SPI med én controller og to periferienheder](../../../../../translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.da.png) + +CS-ledningen bruges til at aktivere én periferienhed ad gangen og kommunikere over COPI- og CIPO-ledningerne. Når controlleren skal skifte periferienhed, deaktiverer den CS-ledningen, der er forbundet til den aktuelt aktive periferienhed, og aktiverer derefter ledningen, der er forbundet til den periferienhed, den ønsker at kommunikere med næste gang. + +SPI er *fuld-dupleks*, hvilket betyder, at controlleren kan sende og modtage data samtidig fra den samme periferienhed ved hjælp af COPI- og CIPO-ledningerne. SPI bruger et clock-signal på SCLK-ledningen til at holde enhederne synkroniserede, så i modsætning til at sende direkte over UART, behøver den ikke start- og stopbits. + +Der er ingen definerede hastighedsgrænser for SPI, og implementeringer kan ofte transmittere flere megabytes data per sekund. + +IoT-udviklingssæt understøtter ofte SPI over nogle af GPIO-pinsene. For eksempel kan du på en Raspberry Pi bruge GPIO-pins 19, 21, 23, 24 og 26 til SPI. + +### Trådløs + +Nogle sensorer kan kommunikere over standard trådløse protokoller, såsom Bluetooth (primært Bluetooth Low Energy, eller BLE), LoRaWAN (en **Lo**ng **Ra**nge lavenergi-netværksprotokol) eller WiFi. Disse gør det muligt for fjernsensorer ikke fysisk at være forbundet til en IoT-enhed. + +Et eksempel er kommercielle jordfugtighedssensorer. Disse måler jordfugtighed i en mark og sender derefter dataene over LoRaWAN til en hub-enhed, som behandler dataene eller sender dem over internettet. Dette gør det muligt for sensoren at være væk fra IoT-enheden, der administrerer dataene, hvilket reducerer strømforbruget og behovet for store WiFi-netværk eller lange kabler. + +BLE er populært til avancerede sensorer som fitness-trackere, der bæres på håndleddet. Disse kombinerer flere sensorer og sender sensordataene til en IoT-enhed, som din telefon, via BLE. + +✅ Har du nogen Bluetooth-sensorer på dig, i dit hjem eller på din skole? Disse kan omfatte temperatursensorer, tilstedeværelsessensorer, enhedssporere og fitness-enheder. + +En populær måde for kommercielle enheder at forbinde på er Zigbee. Zigbee bruger WiFi til at danne mesh-netværk mellem enheder, hvor hver enhed forbinder til så mange nærliggende enheder som muligt og danner et stort antal forbindelser som et spindelvæv. Når en enhed ønsker at sende en besked til internettet, kan den sende den til de nærmeste enheder, som derefter videresender den til andre nærliggende enheder og så videre, indtil den når en koordinator og kan sendes til internettet. + +> 🐝 Navnet Zigbee refererer til honningbiernes dans, når de vender tilbage til bikuben. + +## Mål fugtighedsniveauet i jord + +Du kan måle fugtighedsniveauet i jord ved hjælp af en jordfugtighedssensor, en IoT-enhed og en stueplante eller et nærliggende jordstykke. + +### Opgave - mål jordfugtighed + +Følg den relevante vejledning for at måle jordfugtighed ved hjælp af din IoT-enhed: + +* [Arduino - Wio Terminal](wio-terminal-soil-moisture.md) +* [Single-board computer - Raspberry Pi](pi-soil-moisture.md) +* [Single-board computer - Virtuel enhed](virtual-device-soil-moisture.md) + +## Sensor kalibrering + +Sensorer er afhængige af at måle elektriske egenskaber som modstand eller kapacitans. + +> 🎓 Modstand, målt i ohm (Ω), er hvor meget modstand der er mod den elektriske strøm, der passerer gennem noget. Når en spænding påføres et materiale, afhænger mængden af strøm, der passerer igennem, af materialets modstand. Du kan læse mere på [siden om elektrisk modstand på Wikipedia](https://wikipedia.org/wiki/Electrical_resistance_and_conductance). + +> 🎓 Kapacitans, målt i farad (F), er en komponent eller et kredsløbs evne til at opsamle og lagre elektrisk energi. Du kan læse mere om kapacitans på [siden om kapacitans på Wikipedia](https://wikipedia.org/wiki/Capacitance). + +Disse målinger er ikke altid nyttige - forestil dig en temperatursensor, der gav dig en måling på 22,5 kΩ! I stedet skal den målte værdi konverteres til en brugbar enhed ved at blive kalibreret - det vil sige at matche de målte værdier til den målte størrelse for at gøre det muligt at konvertere nye målinger til den rigtige enhed. + +Nogle sensorer leveres forkalibrerede. For eksempel var temperatursensoren, du brugte i den sidste lektion, allerede kalibreret, så den kan returnere en temperaturmåling i °C. På fabrikken ville den første sensor, der blev skabt, blive udsat for en række kendte temperaturer, og modstanden ville blive målt. Dette ville derefter blive brugt til at opbygge en beregning, der kan konvertere fra den målte værdi i Ω (modstandens enhed) til °C. + +> 💁 Formlen til at beregne modstand ud fra temperatur kaldes [Steinhart–Hart-ligningen](https://wikipedia.org/wiki/Steinhart–Hart_equation). + +### Kalibrering af jordfugtighedssensor + +Jordfugtighed måles ved hjælp af gravimetrisk eller volumetrisk vandindhold. + +* Gravimetrisk er vægten af vand i en enhedsvægt af jord målt som antallet af kilogram vand per kilogram tør jord +* Volumetrisk er volumenet af vand i en enhedsvolumen af jord målt som antallet af kubikmeter vand per kubikmeter tør jord + +> 🇺🇸 For amerikanere, på grund af enhedernes konsistens, kan disse måles i pund i stedet for kilogram eller kubikfod i stedet for kubikmeter. + +Jordfugtighedssensorer måler elektrisk modstand eller kapacitans - dette varierer ikke kun med jordfugtighed, men også jordtype, da komponenterne i jorden kan ændre dens elektriske egenskaber. Ideelt set bør sensorer kalibreres - det vil sige at tage aflæsninger fra sensoren og sammenligne dem med målinger fundet ved hjælp af en mere videnskabelig tilgang. For eksempel kan et laboratorium beregne den gravimetriske jordfugtighed ved hjælp af prøver fra et specifikt felt taget et par gange om året, og disse tal kan bruges til at kalibrere sensoren, så sensoraflæsningen matcher den gravimetriske jordfugtighed. + +![En graf over spænding vs jordfugtighedsindhold](../../../../../translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.da.png) + +Grafen ovenfor viser, hvordan man kalibrerer en sensor. Spændingen registreres for en jordprøve, der derefter måles i et laboratorium ved at sammenligne den fugtige vægt med den tørre vægt (ved at måle vægten våd, derefter tørre i en ovn og måle tør). Når der er taget et par aflæsninger, kan disse plottes på en graf, og en linje kan tilpasses punkterne. Denne linje kan derefter bruges til at konvertere jordfugtighedssensoraflæsninger taget af en IoT-enhed til faktiske jordfugtighedsmålinger. + +💁 For resistive jordfugtighedssensorer stiger spændingen, når jordfugtigheden stiger. For kapacitive jordfugtighedssensorer falder spændingen, når jordfugtigheden stiger, så graferne for disse ville hælde nedad, ikke opad. + +![En jordfugtighedsværdi interpoleret fra grafen](../../../../../translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.da.png) + +Grafen ovenfor viser en spændingsaflæsning fra en jordfugtighedssensor, og ved at følge den til linjen på grafen kan den faktiske jordfugtighed beregnes. + +Denne tilgang betyder, at landmanden kun behøver at få et par laboratoriemålinger for et felt, og derefter kan de bruge IoT-enheder til at måle jordfugtighed - hvilket drastisk fremskynder tiden til at tage målinger. + +--- + +## 🚀 Udfordring + +Resistive og kapacitive jordfugtighedssensorer har en række forskelle. Hvad er disse forskelle, og hvilken type (hvis nogen) er bedst for en landmand at bruge? Ændrer dette svar sig mellem udviklingslande og udviklede lande? + +## Quiz efter lektionen + +[Quiz efter lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/12) + +## Gennemgang & Selvstudie + +Læs om hardware og protokoller, der bruges af sensorer og aktuatorer: + +* [GPIO Wikipedia-side](https://wikipedia.org/wiki/General-purpose_input/output) +* [UART Wikipedia-side](https://wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter) +* [SPI Wikipedia-side](https://wikipedia.org/wiki/Serial_Peripheral_Interface) +* [I2C Wikipedia-side](https://wikipedia.org/wiki/I²C) +* [Zigbee Wikipedia-side](https://wikipedia.org/wiki/Zigbee) + +## Opgave + +[Kalibrer din sensor](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/2-detect-soil-moisture/assignment.md b/translations/da/2-farm/lessons/2-detect-soil-moisture/assignment.md new file mode 100644 index 00000000..6c9a9da2 --- /dev/null +++ b/translations/da/2-farm/lessons/2-detect-soil-moisture/assignment.md @@ -0,0 +1,61 @@ + +# Kalibrer din sensor + +## Instruktioner + +I denne lektion har du indsamlet målinger fra en jordfugtighedssensor, målt som værdier fra 0-1023. For at omdanne disse til faktiske jordfugtighedsmålinger skal du kalibrere din sensor. Dette kan du gøre ved at tage målinger fra jordprøver og derefter beregne den gravimetriske jordfugtighedsindhold fra disse prøver. + +Du skal gentage disse trin flere gange for at få de nødvendige målinger, med forskellig fugtighed i jorden hver gang. + +1. Tag en jordfugtighedsmåling ved hjælp af jordfugtighedssensoren. Notér denne måling. + +1. Tag en prøve af jorden og vej den. Notér denne vægt. + +1. Tør jorden - en varm ovn ved 110°C (230°F) i et par timer er den bedste metode. Du kan også gøre dette i sollys eller placere den et varmt, tørt sted, indtil jorden er helt tør. Den skal være pulveragtig og løs. + + > 💁 I et laboratorium for de mest præcise resultater ville du tørre jorden i en ovn i 48-72 timer. Hvis din skole har tørreovne, så se, om du kan bruge dem til at tørre længere. Jo længere tid, jo tørrere bliver prøven, og jo mere præcise bliver resultaterne. + +1. Vej jorden igen. + + > 🔥 Hvis du tørrede den i en ovn, skal du sørge for, at den er kølet af først! + +Den gravimetriske jordfugtighed beregnes som: + +![jordfugtighed % er vægt våd minus vægt tør, divideret med vægt tør, gange 100](../../../../../translated_images/gsm-calculation.6da38c6201eec14e7573bb2647aa18892883193553d23c9d77e5dc681522dfb2.da.png) + +* W - vægten af den våde jord +* W - vægten af den tørre jord + +For eksempel, lad os sige, at du har en jordprøve, der vejer 212g våd og 197g tør. + +![Beregningen udfyldt](../../../../../translated_images/gsm-calculation-example.99f9803b4f29e97668e7c15412136c0c399ab12dbba0b89596fdae9d8aedb6fb.da.png) + +* W = 212g +* W = 197g +* 212 - 197 = 15 +* 15 / 197 = 0,076 +* 0,076 * 100 = 7,6% + +I dette eksempel har jorden en gravimetrisk jordfugtighed på 7,6%. + +Når du har målingerne for mindst 3 prøver, skal du lave en graf over jordfugtighed % i forhold til jordfugtighedssensormåling og tilføje en linje, der bedst passer til punkterne. Du kan derefter bruge denne til at beregne den gravimetriske jordfugtighedsindhold for en given sensormåling ved at aflæse værdien fra linjen. + +## Bedømmelseskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver Forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Indsamling af kalibreringsdata | Indsamler mindst 3 kalibreringsprøver | Indsamler mindst 2 kalibreringsprøver | Indsamler mindst 1 kalibreringsprøve | +| Foretag en kalibreret måling | Plotter succesfuldt kalibreringsgrafen, foretager en måling fra sensoren og omregner den til gravimetrisk jordfugtighedsindhold | Plotter succesfuldt kalibreringsgrafen | Kan ikke plotte grafen | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md b/translations/da/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md new file mode 100644 index 00000000..366c2745 --- /dev/null +++ b/translations/da/2-farm/lessons/2-detect-soil-moisture/pi-soil-moisture.md @@ -0,0 +1,108 @@ + +# Mål jordfugtighed - Raspberry Pi + +I denne del af lektionen vil du tilføje en kapacitiv jordfugtighedssensor til din Raspberry Pi og aflæse værdier fra den. + +## Hardware + +Raspberry Pi'en har brug for en kapacitiv jordfugtighedssensor. + +Den sensor, du skal bruge, er en [Kapacitiv Jordfugtighedssensor](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), der måler jordfugtighed ved at registrere jordens kapacitans, en egenskab der ændrer sig, når jordens fugtighed ændrer sig. Når jordfugtigheden stiger, falder spændingen. + +Dette er en analog sensor, så den bruger en analog pin og den 10-bit ADC i Grove Base Hat på Pi'en til at konvertere spændingen til et digitalt signal fra 1-1.023. Dette sendes derefter via I²C gennem GPIO-pins på Pi'en. + +### Tilslut jordfugtighedssensoren + +Grove jordfugtighedssensoren kan tilsluttes Raspberry Pi'en. + +#### Opgave - tilslut jordfugtighedssensoren + +Tilslut jordfugtighedssensoren. + +![En Grove jordfugtighedssensor](../../../../../translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.da.png) + +1. Sæt den ene ende af et Grove-kabel i stikket på jordfugtighedssensoren. Det kan kun sættes i på én måde. + +1. Med Raspberry Pi'en slukket, tilslut den anden ende af Grove-kablet til det analoge stik mærket **A0** på Grove Base Hat, der er tilsluttet Pi'en. Dette stik er det næstsidste til højre i rækken af stik ved siden af GPIO-pins. + +![Grove jordfugtighedssensor tilsluttet A0-stikket](../../../../../translated_images/pi-soil-moisture-sensor.fdd7eb2393792cf6739cacf1985d9f55beda16d372f30d0b5a51d586f978a870.da.png) + +1. Sæt jordfugtighedssensoren i jorden. Den har en 'højeste positionslinje' - en hvid linje på tværs af sensoren. Sæt sensoren i jorden op til, men ikke over, denne linje. + +![Grove jordfugtighedssensor i jord](../../../../../translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.da.png) + +## Programmer jordfugtighedssensoren + +Raspberry Pi'en kan nu programmeres til at bruge den tilsluttede jordfugtighedssensor. + +### Opgave - programmer jordfugtighedssensoren + +Programmer enheden. + +1. Tænd for Pi'en og vent, til den er startet op. + +1. Start VS Code, enten direkte på Pi'en eller ved at forbinde via Remote SSH-udvidelsen. + + > ⚠️ Du kan finde [instruktionerne til opsætning og start af VS Code i nightlight - lektion 1, hvis nødvendigt](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. Fra terminalen skal du oprette en ny mappe i `pi`-brugerens hjemmemappe kaldet `soil-moisture-sensor`. Opret en fil i denne mappe kaldet `app.py`. + +1. Åbn denne mappe i VS Code. + +1. Tilføj følgende kode til filen `app.py` for at importere nogle nødvendige biblioteker: + + ```python + import time + from grove.adc import ADC + ``` + + `import time`-sætningen importerer `time`-modulet, som vil blive brugt senere i denne opgave. + + `from grove.adc import ADC`-sætningen importerer `ADC` fra Grove Python-bibliotekerne. Dette bibliotek indeholder kode til at interagere med den analoge-til-digitale konverter på Pi Base Hat og aflæse spændinger fra analoge sensorer. + +1. Tilføj følgende kode nedenfor for at oprette en instans af `ADC`-klassen: + + ```python + adc = ADC() + ``` + +1. Tilføj en uendelig løkke, der aflæser fra denne ADC på A0-pinnen og skriver resultatet til konsollen. Denne løkke kan derefter sove i 10 sekunder mellem aflæsninger. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. Kør Python-appen. Du vil se jordfugtighedsmålingerne skrevet til konsollen. Tilføj noget vand til jorden, eller fjern sensoren fra jorden, og se værdien ændre sig. + + ```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 + ``` + + I det viste eksempeloutput kan du se spændingen falde, når der tilføjes vand. + +> 💁 Du kan finde denne kode i [code/pi](../../../../../2-farm/lessons/2-detect-soil-moisture/code/pi)-mappen. + +😀 Dit program til jordfugtighedssensoren var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md b/translations/da/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md new file mode 100644 index 00000000..f0fd0fcf --- /dev/null +++ b/translations/da/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md @@ -0,0 +1,123 @@ + +# Mål jordfugtighed - Virtuel IoT-hardware + +I denne del af lektionen vil du tilføje en kapacitiv jordfugtighedssensor til din virtuelle IoT-enhed og læse værdier fra den. + +## Virtuel hardware + +Den virtuelle IoT-enhed vil bruge en simuleret Grove kapacitiv jordfugtighedssensor. Dette gør denne øvelse identisk med at bruge en Raspberry Pi med en fysisk Grove kapacitiv jordfugtighedssensor. + +På en fysisk IoT-enhed ville jordfugtighedssensoren være en kapacitiv sensor, der måler jordfugtighed ved at registrere jordens kapacitans, en egenskab der ændrer sig, når jordens fugtighed ændrer sig. Når jordfugtigheden stiger, falder spændingen. + +Dette er en analog sensor, så den bruger en simuleret 10-bit ADC til at rapportere en værdi fra 1-1.023. + +### Tilføj jordfugtighedssensoren til CounterFit + +For at bruge en virtuel jordfugtighedssensor skal du tilføje den til CounterFit-appen. + +#### Opgave - Tilføj jordfugtighedssensoren til CounterFit + +Tilføj jordfugtighedssensoren til CounterFit-appen. + +1. Opret en ny Python-app på din computer i en mappe kaldet `soil-moisture-sensor` med en enkelt fil kaldet `app.py` og et Python-virtuelt miljø, og tilføj CounterFit pip-pakkerne. + + > ⚠️ Du kan henvise til [instruktionerne for at oprette og opsætte et CounterFit Python-projekt i lektion 1, hvis det er nødvendigt](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Sørg for, at CounterFit-webappen kører. + +1. Opret en jordfugtighedssensor: + + 1. I *Create sensor*-boksen i *Sensors*-panelet, rul ned i *Sensor type*-boksen og vælg *Soil Moisture*. + + 1. Lad *Units* være indstillet til *NoUnits*. + + 1. Sørg for, at *Pin* er indstillet til *0*. + + 1. Vælg knappen **Add** for at oprette *Soil Moisture*-sensoren på Pin 0. + + ![Indstillinger for jordfugtighedssensoren](../../../../../translated_images/counterfit-create-soil-moisture-sensor.35266135a5e0ae68b29a684d7db0d2933a8098b2307d197f7c71577b724603aa.da.png) + + Jordfugtighedssensoren vil blive oprettet og vises i sensorlisten. + + ![Den oprettede jordfugtighedssensor](../../../../../translated_images/counterfit-soil-moisture-sensor.81742b2de0e9de60a3b3b9a2ff8ecc686d428eb6d71820f27a693be26e5aceee.da.png) + +## Programmer jordfugtighedssensor-appen + +Jordfugtighedssensor-appen kan nu programmeres ved hjælp af CounterFit-sensorer. + +### Opgave - Programmer jordfugtighedssensor-appen + +Programmer jordfugtighedssensor-appen. + +1. Sørg for, at `soil-moisture-sensor`-appen er åben i VS Code. + +1. Åbn filen `app.py`. + +1. Tilføj følgende kode øverst i `app.py` for at forbinde appen til CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Tilføj følgende kode til filen `app.py` for at importere nogle nødvendige biblioteker: + + ```python + import time + from counterfit_shims_grove.adc import ADC + ``` + + `import time`-sætningen importerer `time`-modulet, som vil blive brugt senere i denne opgave. + + `from counterfit_shims_grove.adc import ADC`-sætningen importerer `ADC`-klassen for at interagere med en virtuel analog-til-digital-konverter, der kan forbindes til en CounterFit-sensor. + +1. Tilføj følgende kode nedenfor for at oprette en instans af `ADC`-klassen: + + ```python + adc = ADC() + ``` + +1. Tilføj en uendelig løkke, der læser fra denne ADC på pin 0 og skriver resultatet til konsollen. Denne løkke kan derefter sove i 10 sekunder mellem aflæsninger. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. Fra CounterFit-appen skal du ændre værdien af jordfugtighedssensoren, som vil blive læst af appen. Du kan gøre dette på to måder: + + * Indtast et tal i *Value*-boksen for jordfugtighedssensoren, og vælg derefter knappen **Set**. Det tal, du indtaster, vil være den værdi, sensoren returnerer. + + * Marker *Random*-afkrydsningsfeltet, og indtast en *Min*- og *Max*-værdi, og vælg derefter knappen **Set**. Hver gang sensoren læser en værdi, vil den læse et tilfældigt tal mellem *Min* og *Max*. + +1. Kør Python-appen. Du vil se jordfugtighedsmålingerne skrevet til konsollen. Ændr *Value*- eller *Random*-indstillingerne for at se værdien ændre sig. + + ```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 + ``` + +> 💁 Du kan finde denne kode i [code/virtual-device](../../../../../2-farm/lessons/2-detect-soil-moisture/code/virtual-device)-mappen. + +😀 Dit jordfugtighedssensorprogram var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md b/translations/da/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md new file mode 100644 index 00000000..ec6d29f9 --- /dev/null +++ b/translations/da/2-farm/lessons/2-detect-soil-moisture/wio-terminal-soil-moisture.md @@ -0,0 +1,117 @@ + +# Mål jordfugtighed - Wio Terminal + +I denne del af lektionen vil du tilføje en kapacitiv jordfugtighedssensor til din Wio Terminal og aflæse værdier fra den. + +## Hardware + +Wio Terminalen kræver en kapacitiv jordfugtighedssensor. + +Sensoren, du vil bruge, er en [Kapacitiv Jordfugtighedssensor](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), der måler jordfugtighed ved at registrere jordens kapacitans, en egenskab der ændrer sig, når jordens fugtighed ændrer sig. Når jordfugtigheden stiger, falder spændingen. + +Dette er en analog sensor, så den forbindes til analoge pins på Wio Terminalen, der bruger en indbygget ADC til at skabe en værdi fra 0-1.023. + +### Tilslut jordfugtighedssensoren + +Grove jordfugtighedssensoren kan tilsluttes Wio Terminalens konfigurerbare analog/digital port. + +#### Opgave - tilslut jordfugtighedssensoren + +Tilslut jordfugtighedssensoren. + +![En Grove jordfugtighedssensor](../../../../../translated_images/grove-capacitive-soil-moisture-sensor.e7f0776cce30e78be5cc5a07839385fd6718857f31b5bf5ad3d0c73c83b2f0ef.da.png) + +1. Sæt den ene ende af et Grove-kabel i stikket på jordfugtighedssensoren. Det kan kun sættes i på én måde. + +1. Med Wio Terminalen frakoblet fra din computer eller anden strømkilde, tilslut den anden ende af Grove-kablet til det højre Grove-stik på Wio Terminalen, når du ser på skærmen. Dette er stikket længst væk fra tænd/sluk-knappen. + +![Grove jordfugtighedssensor tilsluttet det højre stik](../../../../../translated_images/wio-soil-moisture-sensor.46919b61c3f6cb7497662251b29038ee0e57a4c8b9d071feb996c3b0d7f65aaf.da.png) + +1. Sæt jordfugtighedssensoren i jorden. Den har en 'højeste positionslinje' - en hvid linje på tværs af sensoren. Sæt sensoren i jorden op til, men ikke over, denne linje. + +![Grove jordfugtighedssensor i jord](../../../../../translated_images/soil-moisture-sensor-in-soil.bfad91002bda5e960f8c51ee64b02ee59b32c8c717e3515a2c945f33e614e403.da.png) + +1. Du kan nu tilslutte Wio Terminalen til din computer. + +## Programmer jordfugtighedssensoren + +Wio Terminalen kan nu programmeres til at bruge den tilsluttede jordfugtighedssensor. + +### Opgave - programmer jordfugtighedssensoren + +Programmer enheden. + +1. Opret et helt nyt Wio Terminal-projekt ved hjælp af PlatformIO. Kald dette projekt `soil-moisture-sensor`. Tilføj kode i `setup`-funktionen for at konfigurere den serielle port. + + > ⚠️ Du kan henvise til [instruktionerne for at oprette et PlatformIO-projekt i projekt 1, lektion 1, hvis nødvendigt](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#create-a-platformio-project). + +1. Der findes ikke et bibliotek til denne sensor, men du kan læse fra den analoge pin ved hjælp af den indbyggede Arduino-funktion [`analogRead`](https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/). Start med at konfigurere den analoge pin som input, så værdier kan aflæses fra den, ved at tilføje følgende til `setup`-funktionen. + + ```cpp + pinMode(A0, INPUT); + ``` + + Dette sætter `A0`-pinnen, den kombinerede analog/digital pin, som en inputpin, hvor spænding kan aflæses. + +1. Tilføj følgende til `loop`-funktionen for at aflæse spændingen fra denne pin: + + ```cpp + int soil_moisture = analogRead(A0); + ``` + +1. Tilføj derefter følgende kode for at udskrive værdien til den serielle port: + + ```cpp + Serial.print("Soil Moisture: "); + Serial.println(soil_moisture); + ``` + +1. Til sidst tilføj en forsinkelse på 10 sekunder: + + ```cpp + delay(10000); + ``` + +1. Byg og upload koden til Wio Terminalen. + + > ⚠️ Du kan henvise til [instruktionerne for at oprette et PlatformIO-projekt i projekt 1, lektion 1, hvis nødvendigt](../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.md#write-the-hello-world-app). + +1. Når koden er uploadet, kan du overvåge jordfugtigheden ved hjælp af den serielle monitor. Tilføj noget vand til jorden, eller fjern sensoren fra jorden, og se værdien ændre sig. + + ```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 + ``` + + I det viste eksempeloutput kan du se spændingen falde, når der tilføjes vand. + +> 💁 Du kan finde denne kode i [code/wio-terminal](../../../../../2-farm/lessons/2-detect-soil-moisture/code/wio-terminal)-mappen. + +😀 Dit program til jordfugtighedssensoren var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/3-automated-plant-watering/README.md b/translations/da/2-farm/lessons/3-automated-plant-watering/README.md new file mode 100644 index 00000000..9e441a89 --- /dev/null +++ b/translations/da/2-farm/lessons/3-automated-plant-watering/README.md @@ -0,0 +1,314 @@ + +# Automatisk plantevanding + +![En sketchnote oversigt over denne lektion](../../../../../translated_images/lesson-7.30b5f577d3cb8e031238751475cb519c7d6dbaea261b5df4643d086ffb2a03bb.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +Denne lektion blev undervist som en del af [IoT for Beginners Project 2 - Digital Agriculture-serien](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) fra [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![IoT-drevet automatisk plantevanding](https://img.youtube.com/vi/g9FfZwv9R58/0.jpg)](https://youtu.be/g9FfZwv9R58) + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/13) + +## Introduktion + +I den sidste lektion lærte du, hvordan man overvåger jordfugtighed. I denne lektion vil du lære at bygge de centrale komponenter i et automatisk vandingssystem, der reagerer på jordfugtighed. Du vil også lære om timing - hvordan sensorer kan tage tid om at reagere på ændringer, og hvordan aktuatorer kan tage tid om at ændre de egenskaber, der måles af sensorer. + +I denne lektion vil vi dække: + +* [Styr højstrømsenheder fra en lavstrøms IoT-enhed](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Styr en relæ](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Styr din plante via MQTT](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Sensor- og aktuator-timing](../../../../../2-farm/lessons/3-automated-plant-watering) +* [Tilføj timing til din plantekontrolserver](../../../../../2-farm/lessons/3-automated-plant-watering) + +## Styr højstrømsenheder fra en lavstrøms IoT-enhed + +IoT-enheder bruger lav spænding. Selvom dette er nok til sensorer og lavstrømsaktuatorer som LED'er, er det for lavt til at styre større hardware, såsom en vandpumpe, der bruges til vanding. Selv små pumper, du kunne bruge til stueplanter, trækker for meget strøm til en IoT-udviklingskit og ville brænde printkortet af. + +> 🎓 Strøm, målt i ampere (A), er mængden af elektricitet, der bevæger sig gennem et kredsløb. Spænding giver skubbet, strøm er hvor meget der skubbes. Du kan læse mere om strøm på [Wikipedia-siden om elektrisk strøm](https://wikipedia.org/wiki/Electric_current). + +Løsningen på dette er at have en pumpe tilsluttet en ekstern strømforsyning og bruge en aktuator til at tænde pumpen, ligesom du ville tænde en lampe. Det kræver en lille mængde energi (i form af energi i din krop) for din finger at trykke på en kontakt, og dette forbinder lampen til elnettet, der kører på 110v/240v. + +![En lyskontakt tænder strømmen til en lampe](../../../../../translated_images/light-switch.760317ad6ab8bd6d611da5352dfe9c73a94a0822ccec7df3c8bae35da18e1658.da.png) + +> 🎓 [Elnet](https://wikipedia.org/wiki/Mains_electricity) refererer til den elektricitet, der leveres til hjem og virksomheder gennem national infrastruktur i mange dele af verden. + +✅ IoT-enheder kan normalt levere 3,3V eller 5V, med mindre end 1 ampere (1A) strøm. Sammenlign dette med elnettet, som oftest er på 230V (120V i Nordamerika og 100V i Japan) og kan levere strøm til enheder, der trækker 30A. + +Der findes en række aktuatorer, der kan gøre dette, herunder mekaniske enheder, du kan fastgøre til eksisterende kontakter, der efterligner en finger, der tænder dem. Den mest populære er et relæ. + +### Relæer + +Et relæ er en elektromekanisk kontakt, der konverterer et elektrisk signal til en mekanisk bevægelse, der tænder en kontakt. Kernen i et relæ er en elektromagnet. + +> 🎓 [Elektromagneter](https://wikipedia.org/wiki/Electromagnet) er magneter, der skabes ved at føre elektricitet gennem en spole af ledning. Når elektriciteten tændes, bliver spolen magnetiseret. Når elektriciteten slukkes, mister spolen sin magnetisme. + +![Når tændt, skaber elektromagneten et magnetfelt, der tænder kontakten for udgangskredsløbet](../../../../../translated_images/relay-on.4db16a0fd6b669262fd6699aff3fbcd31b6057c06d90411b6bddc06326d1cf75.da.png) + +I et relæ driver et kontrolkredsløb elektromagneten. Når elektromagneten er tændt, trækker den en arm, der bevæger en kontakt, lukker et par kontakter og fuldender et udgangskredsløb. + +![Når slukket, skaber elektromagneten ikke et magnetfelt, der slukker kontakten for udgangskredsløbet](../../../../../translated_images/relay-off.c34a178a2960fecdc3c6400d43e633ed11c6746cd653cfb4a768fa097c40394c.da.png) + +Når kontrolkredsløbet er slukket, slukkes elektromagneten, frigiver armen og åbner kontakterne, hvilket slukker udgangskredsløbet. Relæer er digitale aktuatorer - et højt signal til relæet tænder det, et lavt signal slukker det. + +Udgangskredsløbet kan bruges til at drive ekstra hardware, såsom et vandingssystem. IoT-enheden kan tænde relæet, fuldende udgangskredsløbet, der driver vandingssystemet, og planterne bliver vandet. IoT-enheden kan derefter slukke relæet, afbryde strømmen til vandingssystemet og slukke for vandet. + +![Et relæ, der tænder en pumpe, der sender vand til en plante](../../../../../images/strawberry-pump.gif) + +I videoen ovenfor tændes et relæ. En LED på relæet lyser op for at indikere, at det er tændt (nogle relæboards har LED'er til at indikere, om relæet er tændt eller slukket), og strøm sendes til pumpen, som tænder og pumper vand til en plante. + +> 💁 Relæer kan også bruges til at skifte mellem to udgangskredsløb i stedet for at tænde og slukke for et. Når armen bevæger sig, flytter den en kontakt fra at fuldende et udgangskredsløb til at fuldende et andet udgangskredsløb, normalt med en fælles strømforbindelse eller fælles jordforbindelse. + +✅ Undersøg: Der findes flere typer relæer med forskelle såsom om kontrolkredsløbet tænder eller slukker relæet, når strøm tilføres, eller flere udgangskredsløb. Find ud af mere om disse forskellige typer. + +Når armen bevæger sig, kan du normalt høre den lave kontakt med elektromagneten med en veldefineret kliklyd. + +> 💁 Et relæ kan forbindes, så det at lave forbindelsen faktisk afbryder strømmen til relæet, hvilket slukker relæet, som derefter sender strøm til relæet og tænder det igen, og så videre. Dette betyder, at relæet vil klikke utroligt hurtigt og lave en summende lyd. Sådan fungerede nogle af de første summer, der blev brugt i elektriske dørklokker. + +### Relæstrøm + +Elektromagneten behøver ikke meget strøm for at aktivere og trække armen; den kan styres med 3,3V eller 5V output fra en IoT-udviklingskit. Udgangskredsløbet kan bære meget mere strøm, afhængigt af relæet, inklusive elnetspænding eller endda højere strømniveauer til industriel brug. På denne måde kan en IoT-udviklingskit styre et vandingssystem, fra en lille pumpe til en enkelt plante, op til et massivt industrielt system til en hel kommerciel gård. + +![Et Grove-relæ med kontrolkredsløb, udgangskredsløb og relæ mærket](../../../../../translated_images/grove-relay-labelled.293e068f5c3c2a199bd7892f2661fdc9e10c920b535cfed317fbd6d1d4ae1168.da.png) + +Billedet ovenfor viser et Grove-relæ. Kontrolkredsløbet forbinder til en IoT-enhed og tænder eller slukker relæet ved hjælp af 3,3V eller 5V. Udgangskredsløbet har to terminaler, hvoraf en kan være strøm eller jord. Udgangskredsløbet kan håndtere op til 250V ved 10A, nok til en række enheder, der drives af elnettet. Du kan få relæer, der kan håndtere endnu højere strømniveauer. + +![En pumpe forbundet via et relæ](../../../../../translated_images/pump-wired-to-relay.66c5cfc0d89189900cd601777f5caeb39ee35c6250f6c86bf38feaceedb21fe9.da.png) + +I billedet ovenfor leveres strøm til en pumpe via et relæ. Der er en rød ledning, der forbinder +5V-terminalen på en USB-strømforsyning til en terminal på relæets udgangskredsløb, og en anden rød ledning, der forbinder den anden terminal på udgangskredsløbet til pumpen. En sort ledning forbinder pumpen til jord på USB-strømforsyningen. Når relæet tændes, fuldender det kredsløbet, sender 5V til pumpen og tænder pumpen. + +## Styr et relæ + +Du kan styre et relæ fra din IoT-udviklingskit. + +### Opgave - styr et relæ + +Følg den relevante vejledning for at styre et relæ ved hjælp af din IoT-enhed: + +* [Arduino - Wio Terminal](wio-terminal-relay.md) +* [Single-board computer - Raspberry Pi](pi-relay.md) +* [Single-board computer - Virtuel enhed](virtual-device-relay.md) + +## Styr din plante via MQTT + +Indtil videre er dit relæ styret direkte af IoT-enheden baseret på en enkelt jordfugtighedsmåling. I et kommercielt vandingssystem vil kontrollogikken være centraliseret, så den kan træffe beslutninger om vanding ved hjælp af data fra flere sensorer og tillade, at enhver konfiguration ændres ét sted. For at simulere dette kan du styre relæet via MQTT. + +### Opgave - styr relæet via MQTT + +1. Tilføj de relevante MQTT-biblioteker/pip-pakker og kode til dit `soil-moisture-sensor`-projekt for at oprette forbindelse til MQTT. Navngiv klient-ID'et som `soilmoisturesensor_client` med dit ID som præfiks. + + > ⚠️ Du kan henvise til [instruktionerne for at oprette forbindelse til MQTT i projekt 1, lektion 4, hvis nødvendigt](../../../1-getting-started/lessons/4-connect-internet/README.md#connect-your-iot-device-to-mqtt). + +1. Tilføj den relevante enhedskode for at sende telemetri med jordfugtighedsindstillingerne. For telemetribeskeden skal du navngive egenskaben `soil_moisture`. + + > ⚠️ Du kan henvise til [instruktionerne for at sende telemetri til MQTT i projekt 1, lektion 4, hvis nødvendigt](../../../1-getting-started/lessons/4-connect-internet/README.md#send-telemetry-from-your-iot-device). + +1. Opret noget lokal serverkode for at abonnere på telemetri og sende en kommando for at styre relæet i en mappe kaldet `soil-moisture-sensor-server`. Navngiv egenskaben i kommandobeskeden `relay_on`, og sæt klient-ID'et som `soilmoisturesensor_server` med dit ID som præfiks. Behold samme struktur som serverkoden, du skrev til projekt 1, lektion 4, da du vil tilføje til denne kode senere i lektionen. + + > ⚠️ Du kan henvise til [instruktionerne for at sende telemetri til MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#write-the-server-code) og [sende kommandoer via MQTT](../../../1-getting-started/lessons/4-connect-internet/README.md#send-commands-to-the-mqtt-broker) i projekt 1, lektion 4, hvis nødvendigt. + +1. Tilføj den relevante enhedskode for at styre relæet fra modtagne kommandoer ved hjælp af egenskaben `relay_on` fra beskeden. Send true for `relay_on`, hvis `soil_moisture` er større end 450, ellers send false, samme logik som du tilføjede til IoT-enheden tidligere. + + > ⚠️ Du kan henvise til [instruktionerne for at reagere på kommandoer fra MQTT i projekt 1, lektion 4, hvis nødvendigt](../../../1-getting-started/lessons/4-connect-internet/README.md#handle-commands-on-the-iot-device). + +> 💁 Du kan finde denne kode i [code-mqtt](../../../../../2-farm/lessons/3-automated-plant-watering/code-mqtt)-mappen. + +Sørg for, at koden kører på din enhed og lokale server, og test den ved at ændre jordfugtighedsniveauer, enten ved at ændre de værdier, der sendes af den virtuelle sensor, eller ved at ændre jordens fugtighedsniveauer ved at tilføje vand eller fjerne sensoren fra jorden. + +## Sensor- og aktuator-timing + +Tilbage i lektion 3 byggede du en natlampe - en LED, der tænder, så snart et lavt lysniveau blev registreret af en lyssensor. Lyssensoren registrerede en ændring i lysniveauer øjeblikkeligt, og enheden kunne reagere hurtigt, kun begrænset af længden af forsinkelsen i `loop`-funktionen eller `while True:`-løkken. Som IoT-udvikler kan du ikke altid stole på en så hurtig feedback-loop. + +### Timing for jordfugtighed + +Hvis du lavede den sidste lektion om jordfugtighed med en fysisk sensor, ville du have bemærket, at det tog et par sekunder for jordfugtighedsmålingen at falde, efter du vandede din plante. Dette skyldes ikke, at sensoren er langsom, men fordi det tager tid for vand at trænge igennem jorden. +💁 Hvis du vandede for tæt på sensoren, har du måske set aflæsningen falde hurtigt og derefter stige igen - dette skyldes, at vandet nær sensoren spreder sig i resten af jorden, hvilket reducerer jordfugtigheden omkring sensoren. +![En måling af jordfugtighed på 658 ændrer sig ikke under vanding, den falder først til 320 efter vanding, når vandet er trængt igennem jorden](../../../../../translated_images/soil-moisture-travel.a0e31af222cf14385de5380dfc32c7b8213960965228b8e4f7b7ab7f73b310a3.da.png) + +I diagrammet ovenfor viser en måling af jordfugtighed 658. Planten bliver vandet, men denne måling ændrer sig ikke med det samme, da vandet endnu ikke har nået sensoren. Vanding kan endda afsluttes, før vandet når sensoren, og værdien falder for at afspejle det nye fugtighedsniveau. + +Hvis du skulle skrive kode til at styre et vandingssystem via et relæ baseret på jordfugtighedsniveauer, ville du være nødt til at tage denne forsinkelse i betragtning og indbygge smartere timing i din IoT-enhed. + +✅ Tag et øjeblik til at overveje, hvordan du kunne gøre dette. + +### Styring af sensor- og aktuator-timing + +Forestil dig, at du har fået til opgave at bygge et vandingssystem til en gård. Baseret på jordtypen er det ideelle jordfugtighedsniveau for de dyrkede planter blevet fastsat til at matche en analog spændingsmåling på 400-450. + +Du kunne programmere enheden på samme måde som natlampen - så længe sensoren viser over 450, tænd et relæ for at aktivere en pumpe. Problemet er, at det tager tid for vandet at bevæge sig fra pumpen, gennem jorden og til sensoren. Sensoren vil stoppe vandet, når den registrerer et niveau på 450, men vandniveauet vil fortsætte med at falde, da det pumpede vand fortsætter med at trænge igennem jorden. Det endelige resultat er spildt vand og risiko for rodskader. + +✅ Husk - for meget vand kan være lige så skadeligt for planter som for lidt, og det spilder en værdifuld ressource. + +Den bedre løsning er at forstå, at der er en forsinkelse mellem aktuatoren, der tændes, og den egenskab, som sensoren måler, ændrer sig. Det betyder, at sensoren ikke kun skal vente et stykke tid, før den måler værdien igen, men aktuatoren skal også slukkes i et stykke tid, før den næste måling foretages. + +Hvor længe skal relæet være tændt hver gang? Det er bedre at være forsigtig og kun tænde relæet i kort tid, derefter vente på, at vandet trænger igennem, og så genkontrollere fugtighedsniveauerne. Når alt kommer til alt, kan du altid tænde det igen for at tilføje mere vand, men du kan ikke fjerne vand fra jorden. + +> 💁 Denne form for timingkontrol er meget specifik for den IoT-enhed, du bygger, den egenskab, du måler, og de sensorer og aktuatorer, der bruges. + +![En jordbærplante forbundet til vand via en pumpe, hvor pumpen er forbundet til et relæ. Relæet og en jordfugtighedssensor i planten er begge forbundet til en Raspberry Pi](../../../../../translated_images/strawberry-with-pump.b410fc72ac6aabad3e28de9775bf2393ead73dcfec6fd8c9bc01cf107ecd171a.da.png) + +For eksempel har jeg en jordbærplante med en jordfugtighedssensor og en pumpe, der styres af et relæ. Jeg har observeret, at når jeg tilføjer vand, tager det cirka 20 sekunder, før målingen af jordfugtighed stabiliserer sig. Det betyder, at jeg skal slukke relæet og vente 20 sekunder, før jeg kontrollerer fugtighedsniveauerne. Jeg vil hellere have for lidt vand end for meget - jeg kan altid tænde pumpen igen, men jeg kan ikke fjerne vand fra planten. + +![Trin 1, tag måling. Trin 2, tilføj vand. Trin 3, vent på, at vandet trænger igennem jorden. Trin 4, tag måling igen](../../../../../translated_images/soil-moisture-delay.865f3fae206db01d5f8f100f4f44040215d44a0412dd3450aef7ff7b93b6d273.da.png) + +Det betyder, at den bedste proces ville være en vandingscyklus, der ser sådan ud: + +* Tænd pumpen i 5 sekunder +* Vent 20 sekunder +* Kontroller jordfugtigheden +* Hvis niveauet stadig er over det ønskede, gentag ovenstående trin + +5 sekunder kan være for lang tid for pumpen, især hvis fugtighedsniveauerne kun er lidt over det krævede niveau. Den bedste måde at finde ud af, hvilken timing der skal bruges, er at prøve det og derefter justere, når du har sensordata, med en konstant feedback-loop. Dette kan endda føre til mere granulær timing, såsom at tænde pumpen i 1 sekund for hver 100 over det krævede jordfugtighedsniveau i stedet for faste 5 sekunder. + +✅ Undersøg: Er der andre timingovervejelser? Kan planten vandes når som helst, hvis jordfugtigheden er for lav, eller er der specifikke tidspunkter på dagen, der er gode og dårlige til at vande planter? + +> 💁 Vejrprognoser kan også tages i betragtning, når man styrer automatiske vandingssystemer til udendørs dyrkning. Hvis der forventes regn, kan vandingen sættes på pause, indtil regnen er overstået. På det tidspunkt kan jorden være fugtig nok til, at den ikke behøver vanding, hvilket er meget mere effektivt end at spilde vand ved at vande lige før regnen. + +## Tilføj timing til din plantekontrolserver + +Serverkoden kan ændres for at tilføje kontrol omkring timingen af vandingscyklussen og vente på, at jordfugtighedsniveauerne ændrer sig. Serverlogikken for styring af relætiming er: + +1. Telemetrimeddelelse modtaget +1. Kontroller jordfugtighedsniveauet +1. Hvis det er ok, gør ingenting. Hvis målingen er for høj (hvilket betyder, at jordfugtigheden er for lav), så: + 1. Send en kommando for at tænde relæet + 1. Vent i 5 sekunder + 1. Send en kommando for at slukke relæet + 1. Vent i 20 sekunder, så jordfugtighedsniveauerne kan stabilisere sig + +Vandingscyklussen, processen fra modtagelse af telemetrimeddelelse til at være klar til at behandle jordfugtighedsniveauer igen, tager cirka 25 sekunder. Vi sender jordfugtighedsniveauer hvert 10. sekund, så der er et overlap, hvor en meddelelse modtages, mens serveren venter på, at jordfugtighedsniveauerne stabiliserer sig, hvilket kunne starte en ny vandingscyklus. + +Der er to muligheder for at omgå dette: + +* Ændre IoT-enhedens kode til kun at sende telemetri hvert minut, så vandingscyklussen er afsluttet, før den næste meddelelse sendes +* Afmelde telemetri under vandingscyklussen + +Den første mulighed er ikke altid en god løsning for store gårde. Landmanden vil måske gerne registrere jordfugtighedsniveauerne, mens jorden vandes, til senere analyse, for eksempel for at være opmærksom på vandstrømmen i forskellige områder på gården for at guide mere målrettet vanding. Den anden mulighed er bedre - koden ignorerer bare telemetri, når den ikke kan bruge den, men telemetrien er stadig tilgængelig for andre tjenester, der måske abonnerer på den. + +> 💁 IoT-data sendes ikke kun fra én enhed til én tjeneste, i stedet kan mange enheder sende data til en broker, og mange tjenester kan lytte til dataene fra brokeren. For eksempel kan én tjeneste lytte til jordfugtighedsdata og gemme dem i en database til analyse på et senere tidspunkt. En anden tjeneste kan også lytte til den samme telemetri for at styre et vandingssystem. + +### Opgave - tilføj timing til din plantekontrolserver + +Opdater din serverkode til at køre relæet i 5 sekunder og derefter vente 20 sekunder. + +1. Åbn mappen `soil-moisture-sensor-server` i VS Code, hvis den ikke allerede er åben. Sørg for, at det virtuelle miljø er aktiveret. + +1. Åbn filen `app.py` + +1. Tilføj følgende kode til filen `app.py` under de eksisterende imports: + + ```python + import threading + ``` + + Denne erklæring importerer `threading` fra Python-bibliotekerne. Threading gør det muligt for Python at udføre anden kode, mens den venter. + +1. Tilføj følgende kode før funktionen `handle_telemetry`, der håndterer telemetrimeddelelser modtaget af serverkoden: + + ```python + water_time = 5 + wait_time = 20 + ``` + + Dette definerer, hvor længe relæet skal køre (`water_time`), og hvor længe der skal ventes bagefter for at kontrollere jordfugtigheden (`wait_time`). + +1. Under denne kode skal du tilføje følgende: + + ```python + def send_relay_command(client, state): + command = { 'relay_on' : state } + print("Sending message:", command) + client.publish(server_command_topic, json.dumps(command)) + ``` + + Denne kode definerer en funktion kaldet `send_relay_command`, der sender en kommando over MQTT for at styre relæet. Telemetrien oprettes som en ordbog og konverteres derefter til en JSON-streng. Værdien, der sendes til `state`, bestemmer, om relæet skal være tændt eller slukket. + +1. Efter funktionen `send_relay_code` skal du tilføje følgende kode: + + ```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) + ``` + + Dette definerer en funktion til at styre relæet baseret på den krævede timing. Den starter med at afmelde telemetri, så jordfugtighedsmeddelelser ikke behandles, mens vandingen foregår. Derefter sender den en kommando for at tænde relæet. Den venter derefter i `water_time`, før den sender en kommando for at slukke relæet. Til sidst venter den i `wait_time` sekunder, så jordfugtighedsniveauerne kan stabilisere sig. Den genabonnerer derefter på telemetri. + +1. Ændr funktionen `handle_telemetry` til følgende: + + ```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() + ``` + + Denne kode kontrollerer jordfugtighedsniveauet. Hvis det er større end 450, har jorden brug for vanding, så den kalder funktionen `control_relay`. Denne funktion køres på en separat tråd, der kører i baggrunden. + +1. Sørg for, at din IoT-enhed kører, og kør derefter denne kode. Ændr jordfugtighedsniveauerne og observer, hvad der sker med relæet - det skulle tænde i 5 sekunder og derefter forblive slukket i mindst 20 sekunder, kun tænde igen, hvis jordfugtighedsniveauerne ikke er tilstrækkelige. + + ```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} + ``` + + En god måde at teste dette i et simuleret vandingssystem er at bruge tør jord og derefter hælde vand i manuelt, mens relæet er tændt, og stoppe med at hælde, når relæet slukker. + +> 💁 Du kan finde denne kode i mappen [code-timing](../../../../../2-farm/lessons/3-automated-plant-watering/code-timing). + +> 💁 Hvis du vil bruge en pumpe til at bygge et rigtigt vandingssystem, kan du bruge en [6V vandpumpe](https://www.seeedstudio.com/6V-Mini-Water-Pump-p-1945.html) med en [USB-terminal strømforsyning](https://www.adafruit.com/product/3628). Sørg for, at strømmen til eller fra pumpen er forbundet via relæet. + +--- + +## 🚀 Udfordring + +Kan du komme i tanke om andre IoT- eller elektriske enheder, der har et lignende problem, hvor det tager tid, før resultaterne af aktuatoren når sensoren? Du har sandsynligvis et par stykker i dit hus eller din skole. + +* Hvilke egenskaber måler de? +* Hvor lang tid tager det for egenskaben at ændre sig, efter en aktuator er brugt? +* Er det ok, at egenskaben ændrer sig forbi det ønskede niveau? +* Hvordan kan den bringes tilbage til det ønskede niveau, hvis det er nødvendigt? + +## Quiz efter forelæsning + +[Quiz efter forelæsning](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/14) + +## Gennemgang & Selvstudie + +* Læs mere om relæer, inklusive deres historiske brug i telefoncentraler, på [relæ Wikipedia-siden](https://wikipedia.org/wiki/Relay). + +## Opgave + +[Byg en mere effektiv vandingscyklus](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/3-automated-plant-watering/assignment.md b/translations/da/2-farm/lessons/3-automated-plant-watering/assignment.md new file mode 100644 index 00000000..b2049c60 --- /dev/null +++ b/translations/da/2-farm/lessons/3-automated-plant-watering/assignment.md @@ -0,0 +1,54 @@ + +# Byg en mere effektiv vandingscyklus + +## Instruktioner + +Denne lektion dækkede, hvordan man styrer et relæ via sensordata, og det relæ kunne igen styre en pumpe til et vandingssystem. For en defineret mængde jord bør det at køre en pumpe i en fastsat tidsperiode altid have den samme effekt på jordens fugtighed. Det betyder, at du kan få en idé om, hvor mange sekunders vanding der svarer til et bestemt fald i jordfugtighedsmålingen. Ved at bruge disse data kan du bygge et mere kontrolleret vandingssystem. + +Til denne opgave skal du beregne, hvor længe pumpen skal køre for at opnå en bestemt stigning i jordens fugtighed. + +> ⚠️ Hvis du bruger virtuel IoT-hardware, kan du gennemgå denne proces, men simulere resultaterne ved manuelt at øge jordfugtighedsmålingen med et fast beløb pr. sekund, relæet er tændt. + +1. Start med tør jord. Mål jordens fugtighed. + +1. Tilsæt en fast mængde vand, enten ved at køre pumpen i 1 sekund eller ved at hælde en fast mængde i. + + > Pumpen skal altid køre med en konstant hastighed, så hvert sekund pumpen kører, skal den levere den samme mængde vand. + +1. Vent, indtil jordfugtighedsniveauet stabiliserer sig, og tag en måling. + +1. Gentag dette flere gange og opret en tabel med resultaterne. Et eksempel på denne tabel er givet nedenfor. + + | Total pumpetid | Jordfugtighed | Fald | + | --- | --: | -: | + | Tør | 643 | 0 | + | 1s | 621 | 22 | + | 2s | 601 | 20 | + | 3s | 579 | 22 | + | 4s | 560 | 19 | + | 5s | 539 | 21 | + | 6s | 521 | 18 | + +1. Beregn en gennemsnitlig stigning i jordfugtighed pr. sekund vand. I eksemplet ovenfor falder målingen med et gennemsnit på 20,3 pr. sekund. + +1. Brug disse data til at forbedre effektiviteten af din serverkode, så pumpen kører i den nødvendige tid for at bringe jordfugtigheden til det ønskede niveau. + +## Bedømmelseskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Indsamling af jordfugtighedsdata | Er i stand til at indsamle flere målinger efter at have tilføjet faste mængder vand | Er i stand til at indsamle nogle målinger med faste mængder vand | Kan kun indsamle en eller to målinger eller er ude af stand til at bruge faste mængder vand | +| Kalibrering af serverkode | Er i stand til at beregne et gennemsnitligt fald i jordfugtighedsmålingen og opdatere serverkoden til at bruge dette | Er i stand til at beregne et gennemsnitligt fald, men kan ikke opdatere serverkoden, eller er ude af stand til korrekt at beregne et gennemsnit, men bruger denne værdi til korrekt at opdatere serverkoden | Er ude af stand til at beregne et gennemsnit eller opdatere serverkoden | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/3-automated-plant-watering/pi-relay.md b/translations/da/2-farm/lessons/3-automated-plant-watering/pi-relay.md new file mode 100644 index 00000000..4d88fa4b --- /dev/null +++ b/translations/da/2-farm/lessons/3-automated-plant-watering/pi-relay.md @@ -0,0 +1,123 @@ + +# Styr en relæ - Raspberry Pi + +I denne del af lektionen vil du tilføje et relæ til din Raspberry Pi ud over jordfugtighedssensoren og styre det baseret på jordfugtighedsniveauet. + +## Hardware + +Raspberry Pi'en har brug for et relæ. + +Det relæ, du vil bruge, er et [Grove-relæ](https://www.seeedstudio.com/Grove-Relay.html), et normalt åbent relæ (hvilket betyder, at udgangskredsløbet er åbent eller afbrudt, når der ikke sendes et signal til relæet), som kan håndtere udgangskredsløb op til 250V og 10A. + +Dette er en digital aktuator, så det forbindes til en digital pin på Grove Base Hat. + +### Tilslut relæet + +Grove-relæet kan tilsluttes Raspberry Pi'en. + +#### Opgave + +Tilslut relæet. + +![Et Grove-relæ](../../../../../translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.da.png) + +1. Sæt den ene ende af et Grove-kabel i stikket på relæet. Det kan kun sættes i på én måde. + +1. Med Raspberry Pi'en slukket, tilslut den anden ende af Grove-kablet til det digitale stik markeret **D5** på Grove Base Hat, der er tilsluttet Pi'en. Dette stik er det andet fra venstre på rækken af stik ved siden af GPIO-pinnene. Lad jordfugtighedssensoren være tilsluttet **A0**-stikket. + +![Grove-relæet tilsluttet D5-stikket og jordfugtighedssensoren tilsluttet A0-stikket](../../../../../translated_images/pi-relay-and-soil-moisture-sensor.02f3198975b8c53e69ec716cd2719ce117700bd1fc933eaf93476c103c57939b.da.png) + +1. Sæt jordfugtighedssensoren i jorden, hvis den ikke allerede er det fra den forrige lektion. + +## Programmer relæet + +Raspberry Pi'en kan nu programmeres til at bruge det tilsluttede relæ. + +### Opgave + +Programmer enheden. + +1. Tænd for Pi'en og vent, indtil den er startet op. + +1. Åbn `soil-moisture-sensor`-projektet fra den sidste lektion i VS Code, hvis det ikke allerede er åbent. Du vil tilføje til dette projekt. + +1. Tilføj følgende kode til `app.py`-filen under de eksisterende imports: + + ```python + from grove.grove_relay import GroveRelay + ``` + + Denne erklæring importerer `GroveRelay` fra Grove Python-bibliotekerne for at interagere med Grove-relæet. + +1. Tilføj følgende kode under deklarationen af `ADC`-klassen for at oprette en `GroveRelay`-instans: + + ```python + relay = GroveRelay(5) + ``` + + Dette opretter et relæ ved hjælp af pin **D5**, den digitale pin, du tilsluttede relæet til. + +1. For at teste, om relæet fungerer, tilføj følgende til `while True:`-løkken: + + ```python + relay.on() + time.sleep(.5) + relay.off() + ``` + + Koden tænder relæet, venter 0,5 sekunder og slukker derefter relæet. + +1. Kør Python-appen. Relæet vil tænde og slukke hvert 10. sekund med en halv sekunds forsinkelse mellem tænding og slukning. Du vil høre relæet klikke, når det tænder og slukker. En LED på Grove-boardet vil lyse, når relæet er tændt, og slukke, når relæet er slukket. + + ![Relæet tænder og slukker](../../../../../images/relay-turn-on-off.gif) + +## Styr relæet baseret på jordfugtighed + +Nu hvor relæet fungerer, kan det styres som reaktion på aflæsninger fra jordfugtighedssensoren. + +### Opgave + +Styr relæet. + +1. Slet de 3 linjer kode, du tilføjede for at teste relæet. Erstat dem med følgende kode: + + ```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() + ``` + + Denne kode tjekker jordfugtighedsniveauet fra jordfugtighedssensoren. Hvis det er over 450, tænder det relæet, og slukker det, når det går under 450. + + > 💁 Husk, at den kapacitive jordfugtighedssensor aflæser: Jo lavere jordfugtighedsniveau, jo mere fugt er der i jorden og omvendt. + +1. Kør Python-appen. Du vil se relæet tænde eller slukke afhængigt af jordfugtighedsniveauet. Prøv i tør jord, og tilsæt derefter vand. + + ```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. + ``` + +> 💁 Du kan finde denne kode i [code-relay/pi](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/pi)-mappen. + +😀 Dit program til styring af relæet baseret på jordfugtighedssensoren var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at opnå nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md b/translations/da/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md new file mode 100644 index 00000000..837a2103 --- /dev/null +++ b/translations/da/2-farm/lessons/3-automated-plant-watering/virtual-device-relay.md @@ -0,0 +1,127 @@ + +# Styr en relæ - Virtuel IoT-hardware + +I denne del af lektionen vil du tilføje et relæ til din virtuelle IoT-enhed ud over jordfugtighedssensoren og styre det baseret på jordfugtighedsniveauet. + +## Virtuel hardware + +Den virtuelle IoT-enhed vil bruge et simuleret Grove-relæ. Dette holder denne øvelse identisk med at bruge en Raspberry Pi med et fysisk Grove-relæ. + +På en fysisk IoT-enhed ville relæet være et normalt åbent relæ (hvilket betyder, at udgangskredsløbet er åbent eller afbrudt, når der ikke sendes et signal til relæet). Et relæ som dette kan håndtere udgangskredsløb op til 250V og 10A. + +### Tilføj relæet til CounterFit + +For at bruge et virtuelt relæ skal du tilføje det til CounterFit-appen. + +#### Opgave + +Tilføj relæet til CounterFit-appen. + +1. Åbn `soil-moisture-sensor`-projektet fra sidste lektion i VS Code, hvis det ikke allerede er åbent. Du vil tilføje til dette projekt. + +1. Sørg for, at CounterFit-webappen kører. + +1. Opret et relæ: + + 1. I *Create actuator*-boksen i *Actuators*-panelet, rul ned i *Actuator type*-boksen og vælg *Relay*. + + 1. Sæt *Pin* til *5*. + + 1. Vælg **Add**-knappen for at oprette relæet på Pin 5. + + ![Relæindstillingerne](../../../../../translated_images/counterfit-create-relay.fa7c40fd0f2f6afc33b35ea94fcb235085be4861e14e3fe6b9b7bcfc82d1c888.da.png) + + Relæet vil blive oprettet og vises i listen over aktuatorer. + + ![Relæet oprettet](../../../../../translated_images/counterfit-relay.bbf74c1dbdc8b9acd983367fcbd06703a402aefef6af54ddb28e11307ba8a12c.da.png) + +## Programmer relæet + +Jordfugtighedssensor-appen kan nu programmeres til at bruge det virtuelle relæ. + +### Opgave + +Programmer den virtuelle enhed. + +1. Åbn `soil-moisture-sensor`-projektet fra sidste lektion i VS Code, hvis det ikke allerede er åbent. Du vil tilføje til dette projekt. + +1. Tilføj følgende kode til `app.py`-filen under de eksisterende imports: + + ```python + from counterfit_shims_grove.grove_relay import GroveRelay + ``` + + Denne erklæring importerer `GroveRelay` fra Grove Python shim-bibliotekerne for at interagere med det virtuelle Grove-relæ. + +1. Tilføj følgende kode under deklarationen af `ADC`-klassen for at oprette en `GroveRelay`-instans: + + ```python + relay = GroveRelay(5) + ``` + + Dette opretter et relæ ved hjælp af pin **5**, den pin du tilsluttede relæet til. + +1. For at teste om relæet fungerer, tilføj følgende til `while True:`-løkken: + + ```python + relay.on() + time.sleep(.5) + relay.off() + ``` + + Koden tænder relæet, venter 0,5 sekunder og slukker derefter relæet. + +1. Kør Python-appen. Relæet vil tænde og slukke hvert 10. sekund med en halv sekunds forsinkelse mellem tænding og slukning. Du vil se det virtuelle relæ i CounterFit-appen lukke og åbne, når relæet tændes og slukkes. + + ![Det virtuelle relæ tænder og slukker](../../../../../images/virtual-relay-turn-on-off.gif) + +## Styr relæet ud fra jordfugtighed + +Nu hvor relæet fungerer, kan det styres som reaktion på jordfugtighedsaflæsninger. + +### Opgave + +Styr relæet. + +1. Slet de 3 linjer kode, du tilføjede for at teste relæet. Erstat dem med følgende kode på samme sted: + + ```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() + ``` + + Denne kode kontrollerer jordfugtighedsniveauet fra jordfugtighedssensoren. Hvis det er over 450, tænder det relæet, og slukker det, hvis det falder under 450. + + > 💁 Husk, at den kapacitive jordfugtighedssensor aflæser: Jo lavere jordfugtighedsniveau, jo mere fugt er der i jorden og omvendt. + +1. Kør Python-appen. Du vil se relæet tænde eller slukke afhængigt af jordfugtighedsniveauerne. Ændr *Value* eller *Random*-indstillingerne for jordfugtighedssensoren for at se værdien ændre sig. + + ```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. + ``` + +> 💁 Du kan finde denne kode i [code-relay/virtual-device](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/virtual-device)-mappen. + +😀 Dit virtuelle jordfugtighedssensorprogram, der styrer et relæ, var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md b/translations/da/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md new file mode 100644 index 00000000..2d5c53fa --- /dev/null +++ b/translations/da/2-farm/lessons/3-automated-plant-watering/wio-terminal-relay.md @@ -0,0 +1,121 @@ + +# Styr et relæ - Wio Terminal + +I denne del af lektionen vil du tilføje et relæ til din Wio Terminal ud over jordfugtighedssensoren og styre det baseret på jordfugtighedsniveauet. + +## Hardware + +Wio Terminalen har brug for et relæ. + +Det relæ, du skal bruge, er et [Grove-relæ](https://www.seeedstudio.com/Grove-Relay.html), et normalt åbent relæ (hvilket betyder, at udgangskredsløbet er åbent eller afbrudt, når der ikke sendes et signal til relæet), som kan håndtere udgangskredsløb op til 250V og 10A. + +Dette er en digital aktuator, så den tilsluttes til digitale pins på Wio Terminalen. Den kombinerede analog/digital-port er allerede i brug med jordfugtighedssensoren, så denne tilsluttes til den anden port, som er en kombineret I2C- og digitalport. + +### Tilslut relæet + +Grove-relæet kan tilsluttes Wio Terminalens digitale port. + +#### Opgave + +Tilslut relæet. + +![Et Grove-relæ](../../../../../translated_images/grove-relay.d426958ca210fbd0fb7983d7edc069d46c73a8b0a099d94797bd756f7b6bb6be.da.png) + +1. Sæt den ene ende af et Grove-kabel i stikket på relæet. Det kan kun sættes i på én måde. + +1. Med Wio Terminalen frakoblet din computer eller anden strømkilde, tilslut den anden ende af Grove-kablet til den venstre Grove-port på Wio Terminalen, når du ser på skærmen. Lad jordfugtighedssensoren være tilsluttet den højre port. + +![Grove-relæet tilsluttet venstre port og jordfugtighedssensoren tilsluttet højre port](../../../../../translated_images/wio-relay-and-soil-moisture-sensor.ed722202d42babe0be5f4518cf13e8c2c81e8df21d37839266cbdb60cf30172d.da.png) + +1. Sæt jordfugtighedssensoren i jorden, hvis den ikke allerede er det fra den forrige lektion. + +## Programmer relæet + +Wio Terminalen kan nu programmeres til at bruge det tilsluttede relæ. + +### Opgave + +Programmer enheden. + +1. Åbn projektet `soil-moisture-sensor` fra den sidste lektion i VS Code, hvis det ikke allerede er åbent. Du vil tilføje til dette projekt. + +2. Der findes ikke et bibliotek til denne aktuator - det er en digital aktuator, der styres af et højt eller lavt signal. For at tænde den sender du et højt signal til pinnen (3,3V), og for at slukke sender du et lavt signal (0V). Dette kan gøres ved hjælp af den indbyggede Arduino-funktion [`digitalWrite`](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/). Start med at tilføje følgende til bunden af `setup`-funktionen for at konfigurere den kombinerede I2C/digital-port som en output-pin til at sende spænding til relæet: + + ```cpp + pinMode(PIN_WIRE_SCL, OUTPUT); + ``` + + `PIN_WIRE_SCL` er portnummeret for den kombinerede I2C/digital-port. + +1. For at teste om relæet fungerer, tilføj følgende til `loop`-funktionen under den sidste `delay`: + + ```cpp + digitalWrite(PIN_WIRE_SCL, HIGH); + delay(500); + digitalWrite(PIN_WIRE_SCL, LOW); + ``` + + Koden sender et højt signal til den pin, som relæet er tilsluttet, for at tænde det, venter 500ms (et halvt sekund), og sender derefter et lavt signal for at slukke det. + +1. Byg og upload koden til Wio Terminalen. + +1. Når koden er uploadet, vil relæet tænde og slukke hvert 10. sekund med et halvt sekunds forsinkelse mellem tænd og sluk. Du vil høre relæet klikke, når det tænder og slukker. En LED på Grove-boardet vil lyse, når relæet er tændt, og slukke, når relæet er slukket. + + ![Relæet tænder og slukker](../../../../../images/relay-turn-on-off.gif) + +## Styr relæet ud fra jordfugtighed + +Nu hvor relæet fungerer, kan det styres i forhold til aflæsninger fra jordfugtighedssensoren. + +### Opgave + +Styr relæet. + +1. Slet de 3 linjer kode, du tilføjede for at teste relæet. Erstat dem med følgende kode: + + ```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); + } + ``` + + Denne kode tjekker jordfugtighedsniveauet fra jordfugtighedssensoren. Hvis det er over 450, tænder den relæet, og slukker det, når det går under 450. + + > 💁 Husk, at den kapacitive jordfugtighedssensor aflæser: Jo lavere jordfugtighedsniveau, desto mere fugt er der i jorden og omvendt. + +1. Byg og upload koden til Wio Terminalen. + +1. Overvåg enheden via den serielle monitor. Du vil se relæet tænde eller slukke afhængigt af jordfugtighedsniveauet. Prøv i tør jord, og tilsæt derefter vand. + + ```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. + ``` + +> 💁 Du kan finde denne kode i mappen [code-relay/wio-terminal](../../../../../2-farm/lessons/3-automated-plant-watering/code-relay/wio-terminal). + +😀 Dit program til at styre et relæ med en jordfugtighedssensor var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md b/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md new file mode 100644 index 00000000..fb5feeed --- /dev/null +++ b/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md @@ -0,0 +1,451 @@ + +# Migrér din plante til skyen + +![En sketchnote-oversigt over denne lektion](../../../../../translated_images/lesson-8.3f21f3c11159e6a0a376351973ea5724d5de68fa23b4288853a174bed9ac48c3.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +Denne lektion blev undervist som en del af [IoT for Beginners Projekt 2 - Digital Agriculture-serien](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) fra [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Forbind din enhed til skyen med Azure IoT Hub](https://img.youtube.com/vi/bNxjopXkhvk/0.jpg)](https://youtu.be/bNxjopXkhvk) + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/15) + +## Introduktion + +I den sidste lektion lærte du, hvordan du forbinder din plante til en MQTT-broker og styrer et relæ fra serverkode, der kører lokalt. Dette udgør kernen i den slags internetforbundne automatiske vandingssystemer, der bruges fra individuelle planter derhjemme til kommercielle landbrug. + +IoT-enheden kommunikerede med en offentlig MQTT-broker som en måde at demonstrere principperne på, men dette er ikke den mest pålidelige eller sikre metode. I denne lektion vil du lære om skyen og de IoT-funktioner, der tilbydes af offentlige cloud-tjenester. Du vil også lære, hvordan du migrerer din plante til en af disse cloud-tjenester fra den offentlige MQTT-broker. + +I denne lektion dækker vi: + +* [Hvad er skyen?](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Opret et cloud-abonnement](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Cloud IoT-tjenester](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Opret en IoT-tjeneste i skyen](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Kommunikér med IoT Hub](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) +* [Forbind din enhed til IoT-tjenesten](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud) + +## Hvad er skyen? + +Før skyen, når en virksomhed ønskede at levere tjenester til deres medarbejdere (såsom databaser eller filopbevaring) eller til offentligheden (såsom hjemmesider), byggede og drev de et datacenter. Dette kunne variere fra et rum med et lille antal computere til en bygning med mange computere. Virksomheden skulle selv håndtere alt, herunder: + +* Køb af computere +* Vedligeholdelse af hardware +* Strøm og køling +* Netværk +* Sikkerhed, herunder sikring af bygningen og softwaren på computerne +* Installation og opdatering af software + +Dette kunne være meget dyrt, kræve en bred vifte af dygtige medarbejdere og være meget langsomt at ændre, når det var nødvendigt. For eksempel, hvis en onlinebutik skulle planlægge til en travl højsæson, skulle de planlægge måneder i forvejen for at købe mere hardware, konfigurere det, installere det og installere den nødvendige software til at håndtere salgsprocessen. Efter højsæsonen, når salget faldt igen, ville de stå tilbage med computere, de havde betalt for, som stod ubrugte indtil næste travle periode. + +✅ Tror du, at dette ville give virksomheder mulighed for at handle hurtigt? Hvis en online tøjforhandler pludselig blev populær, fordi en kendis blev set i deres tøj, ville de så kunne øge deres computerkraft hurtigt nok til at håndtere den pludselige stigning i ordrer? + +### En andens computer + +Skyen omtales ofte spøgende som 'en andens computer'. Den oprindelige idé var simpel - i stedet for at købe computere, lejer du en andens computer. En anden, en cloud-udbyder, ville administrere enorme datacentre. De ville være ansvarlige for at købe og installere hardware, håndtere strøm og køling, netværk, bygningssikkerhed, hardware- og softwareopdateringer, alt. Som kunde ville du leje de computere, du har brug for, leje flere, når efterspørgslen stiger, og reducere antallet, når efterspørgslen falder. Disse cloud-datacentre findes over hele verden. + +![Et Microsoft cloud-datacenter](../../../../../translated_images/azure-region-existing.73f704604f2aa6cb9b5a49ed40e93d4fd81ae3f4e6af4a8ca504023902832f56.da.png) +![Planlagt udvidelse af et Microsoft cloud-datacenter](../../../../../translated_images/azure-region-planned-expansion.a5074a1e8af74f156a73552d502429e5b126ea5019274d767ecb4b9afdad442b.da.png) + +Disse datacentre kan være flere kvadratkilometer store. Billederne ovenfor blev taget for nogle år siden i et Microsoft cloud-datacenter og viser den oprindelige størrelse sammen med en planlagt udvidelse. Området, der er ryddet til udvidelsen, er over 5 kvadratkilometer. + +> 💁 Disse datacentre kræver så store mængder strøm, at nogle har deres egne kraftværker. På grund af deres størrelse og cloud-udbydernes investeringer er de normalt meget miljøvenlige. De er mere effektive end et stort antal små datacentre, de kører hovedsageligt på vedvarende energi, og cloud-udbydere arbejder hårdt på at reducere affald, skære ned på vandforbrug og genplante skove for at kompensere for dem, der blev fældet for at give plads til at bygge datacentre. Du kan læse mere om, hvordan en cloud-udbyder arbejder med bæredygtighed på [Azure bæredygtighedssiden](https://azure.microsoft.com/global-infrastructure/sustainability/?WT.mc_id=academic-17441-jabenn). + +✅ Lav noget research: Læs om de store cloud-udbydere som [Azure fra Microsoft](https://azure.microsoft.com/?WT.mc_id=academic-17441-jabenn) eller [GCP fra Google](https://cloud.google.com). Hvor mange datacentre har de, og hvor i verden er de placeret? + +Ved at bruge skyen kan virksomheder holde omkostningerne nede og fokusere på det, de er bedst til, mens cloud-ekspertisen overlades til udbyderen. Virksomheder behøver ikke længere at leje eller købe datacenterplads, betale forskellige leverandører for forbindelse og strøm eller ansætte eksperter. I stedet kan de betale én månedlig regning til cloud-udbyderen for at få alt håndteret. + +Cloud-udbyderen kan derefter bruge stordriftsfordele til at reducere omkostningerne, købe computere i store mængder til lavere priser, investere i værktøjer til at reducere arbejdsbyrden for vedligeholdelse og endda designe og bygge deres egen hardware for at forbedre deres cloud-tilbud. + +### Microsoft Azure + +Azure er udviklerens cloud fra Microsoft, og det er den cloud, du vil bruge i disse lektioner. Videoen nedenfor giver en kort oversigt over Azure: + +[![Oversigt over Azure-video](../../../../../translated_images/what-is-azure-video-thumbnail.20174db09e03bbb87d213f928d3cb27410305d2e567e952827de8478dbda959b.da.png)](https://www.microsoft.com/videoplayer/embed/RE4Ibng?WT.mc_id=academic-17441-jabenn) + +## Opret et cloud-abonnement + +For at bruge tjenester i skyen skal du tilmelde dig et abonnement hos en cloud-udbyder. Til denne lektion skal du tilmelde dig et Microsoft Azure-abonnement. Hvis du allerede har et Azure-abonnement, kan du springe denne opgave over. De abonnementdetaljer, der beskrives her, er korrekte på tidspunktet for skrivningen, men kan ændre sig. + +> 💁 Hvis du får adgang til disse lektioner gennem din skole, har du måske allerede et Azure-abonnement til rådighed. Tjek med din lærer. + +Der er to forskellige typer gratis Azure-abonnementer, du kan tilmelde dig: + +* **Azure for Studerende** - Dette er et abonnement designet til studerende på 18+. Du behøver ikke et kreditkort for at tilmelde dig, og du bruger din skole-e-mailadresse til at bekræfte, at du er studerende. Når du tilmelder dig, får du 100 USD til at bruge på cloud-ressourcer sammen med gratis tjenester, herunder en gratis version af en IoT-tjeneste. Dette varer i 12 måneder, og du kan forny det hvert år, du forbliver studerende. + +* **Azure gratis abonnement** - Dette er et abonnement for alle, der ikke er studerende. Du skal bruge et kreditkort for at tilmelde dig abonnementet, men dit kort bliver ikke opkrævet; det bruges kun til at verificere, at du er et rigtigt menneske og ikke en bot. Du får 200 USD i kredit til at bruge i de første 30 dage på enhver tjeneste sammen med gratis niveauer af Azure-tjenester. Når din kredit er brugt op, bliver dit kort ikke opkrævet, medmindre du konverterer til et betalingsabonnement. + +> 💁 Microsoft tilbyder et Azure for Students Starter-abonnement for studerende under 18 år, men på tidspunktet for skrivningen understøtter dette ikke IoT-tjenester. + +### Opgave - tilmeld dig et gratis cloud-abonnement + +Hvis du er studerende på 18+, kan du tilmelde dig et Azure for Studerende-abonnement. Du skal bekræfte med en skole-e-mailadresse. Dette kan gøres på to måder: + +* Tilmeld dig en GitHub Student Developer Pack på [education.github.com/pack](https://education.github.com/pack). Dette giver dig adgang til en række værktøjer og tilbud, herunder GitHub og Microsoft Azure. Når du har tilmeldt dig udviklerpakken, kan du derefter aktivere Azure for Studerende-tilbuddet. + +* Tilmeld dig direkte til en Azure for Studerende-konto på [azure.microsoft.com/free/students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-17441-jabenn). + +> ⚠️ Hvis din skole-e-mailadresse ikke genkendes, skal du oprette en [issue i dette repo](https://github.com/Microsoft/IoT-For-Beginners/issues), så vi kan undersøge, om den kan tilføjes til Azure for Studerende-allow-listen. + +Hvis du ikke er studerende, eller du ikke har en gyldig skole-e-mailadresse, kan du tilmelde dig et Azure gratis abonnement. + +* Tilmeld dig et Azure gratis abonnement på [azure.microsoft.com/free](https://azure.microsoft.com/free/?WT.mc_id=academic-17441-jabenn) + +## Cloud IoT-tjenester + +Den offentlige test-MQTT-broker, du har brugt, er et fantastisk værktøj til læring, men har en række ulemper som et værktøj til brug i en kommerciel sammenhæng: + +* Pålidelighed - det er en gratis tjeneste uden garantier og kan slukkes når som helst +* Sikkerhed - den er offentlig, så enhver kunne lytte til din telemetri eller sende kommandoer til at styre din hardware +* Ydeevne - den er designet til kun et par testbeskeder og ville ikke kunne håndtere et stort antal beskeder, der sendes +* Opdagelse - der er ingen måde at vide, hvilke enheder der er forbundet + +IoT-tjenester i skyen løser disse problemer. De vedligeholdes af store cloud-udbydere, der investerer massivt i pålidelighed og er klar til at løse eventuelle problemer, der måtte opstå. De har sikkerhed indbygget for at forhindre hackere i at læse dine data eller sende falske kommandoer. De er også højtydende og kan håndtere mange millioner beskeder hver dag ved at udnytte skyen til at skalere efter behov. + +> 💁 Selvom du betaler for disse fordele med et månedligt gebyr, tilbyder de fleste cloud-udbydere en gratis version af deres IoT-tjeneste med et begrænset antal beskeder pr. dag eller enheder, der kan tilsluttes. Denne gratis version er normalt mere end nok for en udvikler til at lære om tjenesten. I denne lektion vil du bruge en gratis version. + +IoT-enheder forbinder til en cloud-tjeneste enten ved hjælp af en enheds-SDK (et bibliotek, der leverer kode til at arbejde med tjenestens funktioner) eller direkte via en kommunikationsprotokol som MQTT eller HTTP. Enheds-SDK'en er normalt den nemmeste vej at tage, da den håndterer alt for dig, såsom at vide, hvilke emner der skal publiceres eller abonneres på, og hvordan man håndterer sikkerhed. + +![Enheder forbinder til en tjeneste ved hjælp af en enheds-SDK. Serverkode forbinder også til tjenesten via en SDK](../../../../../translated_images/iot-service-connectivity.7e873847921a5d6fd60d0ba3a943210194518cee0d4e362476624316443275c3.da.png) + +Din enhed kommunikerer derefter med andre dele af din applikation via denne tjeneste - ligesom du sendte telemetri og modtog kommandoer via MQTT. Dette sker normalt ved hjælp af en service-SDK eller et lignende bibliotek. Beskeder kommer fra din enhed til tjenesten, hvor andre komponenter i din applikation derefter kan læse dem, og beskeder kan derefter sendes tilbage til din enhed. + +![Enheder uden en gyldig hemmelig nøgle kan ikke forbinde til IoT-tjenesten](../../../../../translated_images/iot-service-allowed-denied-connection.818b0063ac213fb84204a7229303764d9b467ca430fb822b4ac2fca267d56726.da.png) + +Disse tjenester implementerer sikkerhed ved at kende til alle de enheder, der kan forbinde og sende data, enten ved at have enhederne forudregistreret hos tjenesten eller ved at give enhederne hemmelige nøgler eller certifikater, som de kan bruge til at registrere sig selv hos tjenesten første gang, de forbinder. Ukendte enheder kan ikke forbinde; hvis de prøver, afviser tjenesten forbindelsen og ignorerer beskeder sendt af dem. + +✅ Lav noget research: Hvad er ulempen ved at have en åben IoT-tjeneste, hvor enhver enhed eller kode kan forbinde? Kan du finde specifikke eksempler på hackere, der har udnyttet dette? + +Andre komponenter i din applikation kan forbinde til IoT-tjenesten og lære om alle de enheder, der er forbundet eller registreret, og kommunikere med dem direkte enten samlet eller individuelt. +💁 IoT-tjenester implementerer også yderligere funktioner, og cloud-udbydere har ekstra tjenester og applikationer, der kan tilsluttes tjenesten. For eksempel, hvis du ønsker at gemme alle telemetribeskeder sendt af alle enheder i en database, kræver det som regel kun få klik i cloud-udbyderens konfigurationsværktøj for at forbinde tjenesten til en database og strømme dataene ind. +## Opret en IoT-tjeneste i skyen + +Nu hvor du har et Azure-abonnement, kan du tilmelde dig en IoT-tjeneste. IoT-tjenesten fra Microsoft hedder Azure IoT Hub. + +![Azure IoT Hub-logoet](../../../../../translated_images/azure-iot-hub-logo.28a19de76d0a1932464d858f7558712bcdace3e5ec69c434d482ed7ce41c3a26.da.png) + +Videoen nedenfor giver en kort oversigt over Azure IoT Hub: + +[![Oversigt over Azure IoT Hub-video](https://img.youtube.com/vi/smuZaZZXKsU/0.jpg)](https://www.youtube.com/watch?v=smuZaZZXKsU) + +> 🎥 Klik på billedet ovenfor for at se videoen + +✅ Tag et øjeblik til at lave lidt research og læs oversigten over IoT Hub i [Microsoft IoT Hub-dokumentationen](https://docs.microsoft.com/azure/iot-hub/about-iot-hub?WT.mc_id=academic-17441-jabenn). + +De cloud-tjenester, der er tilgængelige i Azure, kan konfigureres via en webbaseret portal eller via en kommandolinjegrænseflade (CLI). Til denne opgave vil du bruge CLI. + +### Opgave - installer Azure CLI + +For at bruge Azure CLI skal det først installeres på din PC eller Mac. + +1. Følg instruktionerne i [Azure CLI-dokumentationen](https://docs.microsoft.com/cli/azure/install-azure-cli?WT.mc_id=academic-17441-jabenn) for at installere CLI. + +1. Azure CLI understøtter en række udvidelser, der tilføjer funktioner til at administrere en bred vifte af Azure-tjenester. Installer IoT-udvidelsen ved at køre følgende kommando fra din kommandolinje eller terminal: + + ```sh + az extension add --name azure-iot + ``` + +1. Fra din kommandolinje eller terminal skal du køre følgende kommando for at logge ind på dit Azure-abonnement fra Azure CLI. + + ```sh + az login + ``` + + En webside vil blive åbnet i din standardbrowser. Log ind med den konto, du brugte til at tilmelde dig dit Azure-abonnement. Når du er logget ind, kan du lukke browsertabben. + +1. Hvis du har flere Azure-abonnementer, såsom et skoleabonnement og dit eget Azure for Students-abonnement, skal du vælge det, du vil bruge. Kør følgende kommando for at liste alle de abonnementer, du har adgang til: + + ```sh + az account list --output table + ``` + + I outputtet vil du se navnet på hvert abonnement sammen med dets `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 + ``` + + For at vælge det abonnement, du vil bruge, skal du bruge følgende kommando: + + ```sh + az account set --subscription + ``` + + Erstat `` med Id'et for det abonnement, du vil bruge. Efter at have kørt denne kommando, skal du genkøre kommandoen for at liste dine konti. Du vil se, at kolonnen `IsDefault` er markeret som `True` for det abonnement, du lige har valgt. + +### Opgave - opret en ressourcegruppe + +Azure-tjenester, såsom IoT Hub-instanser, virtuelle maskiner, databaser eller AI-tjenester, kaldes **ressourcer**. Hver ressource skal placeres i en **Ressourcegruppe**, en logisk gruppering af en eller flere ressourcer. + +> 💁 Ved at bruge ressourcegrupper kan du administrere flere tjenester på én gang. For eksempel, når du har afsluttet alle lektionerne for dette projekt, kan du slette ressourcegruppen, og alle ressourcerne i den vil automatisk blive slettet. + +1. Der er flere Azure-datacentre rundt om i verden, opdelt i regioner. Når du opretter en Azure-ressource eller ressourcegruppe, skal du angive, hvor du vil have den oprettet. Kør følgende kommando for at få listen over placeringer: + + ```sh + az account list-locations --output table + ``` + + Du vil se en liste over placeringer. Denne liste vil være lang. + + > 💁 På tidspunktet for skrivningen er der 65 placeringer, du kan implementere til. + + ```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 + ... + ``` + + Notér værdien fra kolonnen `Name` for den region, der er tættest på dig. Du kan finde regionerne på et kort på [Azure geographies-siden](https://azure.microsoft.com/global-infrastructure/geographies/?WT.mc_id=academic-17441-jabenn). + +1. Kør følgende kommando for at oprette en ressourcegruppe kaldet `soil-moisture-sensor`. Navne på ressourcegrupper skal være unikke i dit abonnement. + + ```sh + az group create --name soil-moisture-sensor \ + --location + ``` + + Erstat `` med den placering, du valgte i det foregående trin. + +### Opgave - opret en IoT Hub + +Du kan nu oprette en IoT Hub-ressource i din ressourcegruppe. + +1. Brug følgende kommando til at oprette din IoT Hub-ressource: + + ```sh + az iot hub create --resource-group soil-moisture-sensor \ + --sku F1 \ + --partition-count 2 \ + --name + ``` + + Erstat `` med et navn til din hub. Dette navn skal være globalt unikt - det vil sige, at ingen anden IoT Hub oprettet af nogen kan have det samme navn. Dette navn bruges i en URL, der peger på hubben, så det skal være unikt. Brug noget som `soil-moisture-sensor-` og tilføj en unik identifikator på slutningen, som nogle tilfældige ord eller dit navn. + + Muligheden `--sku F1` angiver, at der skal bruges en gratis tier. Den gratis tier understøtter 8.000 beskeder om dagen sammen med de fleste funktioner fra de fuldt betalte tiers. + + > 🎓 Forskellige prisniveauer for Azure-tjenester kaldes tiers. Hver tier har en forskellig pris og tilbyder forskellige funktioner eller datamængder. + + > 💁 Hvis du vil lære mere om priser, kan du tjekke [Azure IoT Hub-prisguiden](https://azure.microsoft.com/pricing/details/iot-hub/?WT.mc_id=academic-17441-jabenn). + + Muligheden `--partition-count 2` definerer, hvor mange datastrømme IoT Hub understøtter. Flere partitioner reducerer datablokering, når flere enheder læser og skriver fra IoT Hub. Partitioner er uden for omfanget af disse lektioner, men denne værdi skal indstilles for at oprette en gratis tier IoT Hub. + + > 💁 Du kan kun have én gratis tier IoT Hub pr. abonnement. + +IoT Hub vil blive oprettet. Det kan tage et minut eller to at fuldføre. + +## Kommuniker med IoT Hub + +I den forrige lektion brugte du MQTT og sendte beskeder frem og tilbage på forskellige emner, hvor de forskellige emner havde forskellige formål. I stedet for at sende beskeder over forskellige emner har IoT Hub en række definerede måder for enheden at kommunikere med hubben eller for hubben at kommunikere med enheden. + +> 💁 Under overfladen kan denne kommunikation mellem IoT Hub og din enhed bruge MQTT, HTTPS eller AMQP. + +* Enhed-til-sky (D2C) beskeder - dette er beskeder sendt fra en enhed til IoT Hub, såsom telemetri. De kan derefter læses fra IoT Hub af din applikationskode. + + > 🎓 Under overfladen bruger IoT Hub en Azure-tjeneste kaldet [Event Hubs](https://docs.microsoft.com/azure/event-hubs/?WT.mc_id=academic-17441-jabenn). Når du skriver kode for at læse beskeder sendt til hubben, kaldes disse ofte begivenheder. + +* Sky-til-enhed (C2D) beskeder - dette er beskeder sendt fra applikationskode via en IoT Hub til en IoT-enhed. + +* Direkte metodeanmodninger - dette er beskeder sendt fra applikationskode via en IoT Hub til en IoT-enhed for at anmode om, at enheden gør noget, såsom at kontrollere en aktuator. Disse beskeder kræver et svar, så din applikationskode kan se, om det blev behandlet korrekt. + +* Enhedstvillinger - dette er JSON-dokumenter, der holdes synkroniseret mellem enheden og IoT Hub og bruges til at gemme indstillinger eller andre egenskaber, enten rapporteret af enheden eller som skal indstilles på enheden (kendt som ønsket) af IoT Hub. + +IoT Hub kan gemme beskeder og direkte metodeanmodninger i en konfigurerbar periode (standard er én dag), så hvis en enhed eller applikationskode mister forbindelsen, kan den stadig hente beskeder sendt, mens den var offline, efter den genopretter forbindelsen. Enhedstvillinger gemmes permanent i IoT Hub, så en enhed til enhver tid kan genoprette forbindelsen og få den nyeste enhedstvilling. + +✅ Lav lidt research: Læs mere om disse beskedtyper i [Device-to-cloud communications guidance](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-d2c-guidance?WT.mc_id=academic-17441-jabenn) og [Cloud-to-device communications guidance](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-c2d-guidance?WT.mc_id=academic-17441-jabenn) i IoT Hub-dokumentationen. + +## Tilslut din enhed til IoT-tjenesten + +Når hubben er oprettet, kan din IoT-enhed tilslutte sig den. Kun registrerede enheder kan tilslutte sig en tjeneste, så du skal registrere din enhed først. Når du registrerer, kan du få en forbindelsesstreng tilbage, som enheden kan bruge til at tilslutte sig. Denne forbindelsesstreng er enhedsspecifik og indeholder information om IoT Hub, enheden og en hemmelig nøgle, der giver denne enhed mulighed for at tilslutte sig. + +> 🎓 En forbindelsesstreng er et generelt udtryk for et stykke tekst, der indeholder forbindelsesdetaljer. Disse bruges, når man tilslutter sig IoT Hubs, databaser og mange andre tjenester. De består normalt af en identifikator for tjenesten, såsom en URL, og sikkerhedsoplysninger såsom en hemmelig nøgle. Disse gives til SDK'er for at tilslutte sig tjenesten. + +> ⚠️ Forbindelsesstrenge bør holdes sikre! Sikkerhed vil blive dækket mere detaljeret i en fremtidig lektion. + +### Opgave - registrer din IoT-enhed + +IoT-enheden kan registreres med din IoT Hub ved hjælp af Azure CLI. + +1. Kør følgende kommando for at registrere en enhed: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor \ + --hub-name + ``` + + Erstat `` med det navn, du brugte til din IoT Hub. + + Dette vil oprette en enhed med et ID af `soil-moisture-sensor`. + +1. Når din IoT-enhed tilslutter sig din IoT Hub ved hjælp af SDK'en, skal den bruge en forbindelsesstreng, der giver URL'en til hubben sammen med en hemmelig nøgle. Kør følgende kommando for at få forbindelsesstrengen: + + ```sh + az iot hub device-identity connection-string show --device-id soil-moisture-sensor \ + --output table \ + --hub-name + ``` + + Erstat `` med det navn, du brugte til din IoT Hub. + +1. Gem forbindelsesstrengen, der vises i outputtet, da du vil få brug for den senere. + +### Opgave - tilslut din IoT-enhed til skyen + +Arbejd dig igennem den relevante guide for at tilslutte din IoT-enhed til skyen: + +* [Arduino - Wio Terminal](wio-terminal-connect-hub.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-connect-hub.md) + +### Opgave - overvåg begivenheder + +For nu vil du ikke opdatere din serverkode. I stedet kan du bruge Azure CLI til at overvåge begivenheder fra din IoT-enhed. + +1. Sørg for, at din IoT-enhed kører og sender jordfugtigheds-telemetriværdier. + +1. Kør følgende kommando i din kommandoprompt eller terminal for at overvåge beskeder sendt til din IoT Hub: + + ```sh + az iot hub monitor-events --hub-name + ``` + + Erstat `` med det navn, du brugte til din IoT Hub. + + Du vil se beskeder dukke op i konsoloutputtet, efterhånden som de sendes af din IoT-enhed. + + ```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}" + } + } + ``` + + Indholdet af `payload` vil matche beskeden sendt af din IoT-enhed. + + > På tidspunktet for skrivningen fungerer `az iot`-udvidelsen ikke fuldt ud på Apple Silicon. Hvis du bruger en Apple Silicon-enhed, skal du overvåge beskederne på en anden måde, såsom ved at bruge [Azure IoT Tools for Visual Studio Code](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-vscode-iot-toolkit-cloud-device-messaging). + +1. Disse beskeder har en række egenskaber knyttet til dem automatisk, såsom tidsstemplet de blev sendt. Disse kaldes *annoteringer*. For at se alle beskedannoteringerne skal du bruge følgende kommando: + + ```sh + az iot hub monitor-events --properties anno --hub-name + ``` + + Erstat `` med det navn, du brugte til din IoT Hub. + + Du vil se beskeder dukke op i konsoloutputtet, efterhånden som de sendes af din IoT-enhed. + + ```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}" + } + } + ``` + + Tidsværdierne i annoteringerne er i [UNIX-tid](https://wikipedia.org/wiki/Unix_time), der repræsenterer antallet af sekunder siden midnat den 1. januar 1970. + + Afslut begivenhedsovervågningen, når du er færdig. + +### Opgave - kontrolér din IoT-enhed + +Du kan også bruge Azure CLI til at kalde direkte metoder på din IoT-enhed. + +1. Kør følgende kommando i din kommandoprompt eller terminal for at kalde metoden `relay_on` på IoT-enheden: + + ```sh + az iot hub invoke-device-method --device-id soil-moisture-sensor \ + --method-name relay_on \ + --method-payload '{}' \ + --hub-name + ``` + + Erstat ` + +` med det navn, du brugte til din IoT Hub. + + Dette sender en direkte metodeanmodning for den metode, der er angivet af `method-name`. Direkte metoder kan tage en payload, der indeholder data til metoden, og dette kan specificeres i parameteren `method-payload` som JSON. + + Du vil se relæet tænde, og den tilsvarende output fra din IoT-enhed: + + ```output + Direct method received - relay_on + ``` + +1. Gentag ovenstående trin, men sæt `--method-name` til `relay_off`. Du vil se relæet slukke og den tilsvarende output fra IoT-enheden. + +--- + +## 🚀 Udfordring + +Den gratis version af IoT Hub tillader 8.000 beskeder om dagen. Den kode, du skrev, sender telemetribeskeder hvert 10. sekund. Hvor mange beskeder om dagen svarer det til, hvis der sendes én besked hvert 10. sekund? + +Tænk over, hvor ofte målinger af jordfugtighed bør sendes? Hvordan kan du ændre din kode for at holde dig inden for den gratis version og tjekke så ofte som nødvendigt, men ikke for ofte? Hvad hvis du ønskede at tilføje en anden enhed? + +## Quiz efter forelæsning + +[Quiz efter forelæsning](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/16) + +## Gennemgang & Selvstudie + +IoT Hub SDK er open source for både Arduino og Python. I kode-repos på GitHub er der en række eksempler, der viser, hvordan man arbejder med forskellige IoT Hub-funktioner. + +* Hvis du bruger en Wio Terminal, kan du tjekke [Arduino-eksemplerne på GitHub](https://github.com/Azure/azure-iot-pal-arduino/tree/master/pal/samples) +* Hvis du bruger en Raspberry Pi eller en virtuel enhed, kan du tjekke [Python-eksemplerne på GitHub](https://github.com/Azure/azure-iot-sdk-python/tree/master/azure-iot-hub/samples) + +## Opgave + +[Lær om cloud-tjenester](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md b/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md new file mode 100644 index 00000000..ffcf85cf --- /dev/null +++ b/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/assignment.md @@ -0,0 +1,33 @@ + +# Lær om cloud-tjenester + +## Instruktioner + +Clouds, såsom Azure fra Microsoft, tilbyder mere end bare computekraft til leje. De primære typer af cloud-tilbud inkluderer: + +* Infrastruktur som en tjeneste (IaaS) +* Platform som en tjeneste (PaaS) +* Serverless +* Software som en tjeneste (SaaS) + +Lær om disse forskellige typer af tilbud, og forklar hvad de er, samt hvordan de adskiller sig. Forklar hvilke tilbud der er relevante for IoT-udviklere. + +## Bedømmelseskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Forklar de forskellige cloud-tilbud | Gav klare forklaringer på alle 4 typer af tilbud | Kunne forklare 3 typer af tilbud | Kunne kun forklare 1 eller 2 af tilbuddene | +| Forklar hvilket tilbud der er relevant for IoT | Beskrev en forklaring på hvilke tilbud der er relevante for IoT-udviklere og hvorfor | Beskrev en forklaring på hvilke tilbud der er relevante for IoT-udviklere, men ikke hvorfor | Kunne ikke beskrive hvilke tilbud der er relevante for IoT-udviklere | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md b/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md new file mode 100644 index 00000000..b2fff3db --- /dev/null +++ b/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/single-board-computer-connect-hub.md @@ -0,0 +1,130 @@ + +# Tilslut din IoT-enhed til skyen - Virtuel IoT-hardware og Raspberry Pi + +I denne del af lektionen vil du tilslutte din virtuelle IoT-enhed eller Raspberry Pi til din IoT Hub for at sende telemetri og modtage kommandoer. + +## Tilslut din enhed til IoT Hub + +Det næste trin er at tilslutte din enhed til IoT Hub. + +### Opgave - tilslut til IoT Hub + +1. Åbn mappen `soil-moisture-sensor` i VS Code. Sørg for, at det virtuelle miljø kører i terminalen, hvis du bruger en virtuel IoT-enhed. + +1. Installer nogle ekstra Pip-pakker: + + ```sh + pip3 install azure-iot-device + ``` + + `azure-iot-device` er et bibliotek til at kommunikere med din IoT Hub. + +1. Tilføj følgende imports øverst i filen `app.py`, under de eksisterende imports: + + ```python + from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse + ``` + + Denne kode importerer SDK'et til at kommunikere med din IoT Hub. + +1. Fjern linjen `import paho.mqtt.client as mqtt`, da dette bibliotek ikke længere er nødvendigt. Fjern al MQTT-kode, inklusive emnenavne, al kode der bruger `mqtt_client` og `handle_command`. Behold `while True:`-løkken, men slet linjen `mqtt_client.publish` fra denne løkke. + +1. Tilføj følgende kode under import-udsagnene: + + ```python + connection_string = "" + ``` + + Erstat `` med den forbindelsesstreng, du hentede til enheden tidligere i denne lektion. + + > 💁 Dette er ikke bedste praksis. Forbindelsesstrenge bør aldrig gemmes i kildekode, da de kan blive tjekket ind i kildekodekontrol og fundet af andre. Vi gør dette her for enkelhedens skyld. Ideelt set bør du bruge noget som en miljøvariabel og et værktøj som [`python-dotenv`](https://pypi.org/project/python-dotenv/). Du vil lære mere om dette i en kommende lektion. + +1. Tilføj nedenstående kode for at oprette et enhedsklientobjekt, der kan kommunikere med IoT Hub, og tilslut det: + + ```python + device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) + + print('Connecting') + device_client.connect() + print('Connected') + ``` + +1. Kør denne kode. Du vil se din enhed tilslutte sig. + + ```output + pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py + Connecting + Connected + Soil moisture: 379 + ``` + +## Send telemetri + +Nu hvor din enhed er tilsluttet, kan du sende telemetri til IoT Hub i stedet for MQTT-broker. + +### Opgave - send telemetri + +1. Tilføj følgende kode inde i `while True`-løkken, lige før sleep: + + ```python + message = Message(json.dumps({ 'soil_moisture': soil_moisture })) + device_client.send_message(message) + ``` + + Denne kode opretter en IoT Hub `Message`, der indeholder jordfugtighedsaflæsningen som en JSON-streng, og sender dette til IoT Hub som en enhed-til-sky-besked. + +## Håndter kommandoer + +Din enhed skal håndtere en kommando fra serverkoden for at styre relæet. Dette sendes som en direkte metodeanmodning. + +## Opgave - håndter en direkte metodeanmodning + +1. Tilføj følgende kode før `while True`-løkken: + + ```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() + ``` + + Dette definerer en metode, `handle_method_request`, der vil blive kaldt, når en direkte metode kaldes af IoT Hub. Hver direkte metode har et navn, og denne kode forventer en metode kaldet `relay_on` for at tænde relæet og `relay_off` for at slukke det. + + > 💁 Dette kunne også implementeres i en enkelt direkte metodeanmodning, hvor den ønskede tilstand for relæet sendes i en payload, der kan sendes med metodeanmodningen og være tilgængelig fra `request`-objektet. + +1. Direkte metoder kræver et svar for at fortælle den kaldende kode, at de er blevet håndteret. Tilføj følgende kode i slutningen af funktionen `handle_method_request` for at oprette et svar på anmodningen: + + ```python + method_response = MethodResponse.create_from_method_request(request, 200) + device_client.send_method_response(method_response) + ``` + + Denne kode sender et svar til den direkte metodeanmodning med en HTTP-statuskode på 200 og sender dette tilbage til IoT Hub. + +1. Tilføj følgende kode under denne funktionsdefinition: + + ```python + device_client.on_method_request_received = handle_method_request + ``` + + Denne kode fortæller IoT Hub-klienten at kalde funktionen `handle_method_request`, når en direkte metode kaldes. + +> 💁 Du kan finde denne kode i mappen [code/pi](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/pi) eller [code/virtual-device](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/virtual-device). + +😀 Dit jordfugtighedssensorprogram er nu tilsluttet din IoT Hub! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md b/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md new file mode 100644 index 00000000..50cb9839 --- /dev/null +++ b/translations/da/2-farm/lessons/4-migrate-your-plant-to-the-cloud/wio-terminal-connect-hub.md @@ -0,0 +1,306 @@ + +# Tilslut din IoT-enhed til skyen - Wio Terminal + +I denne del af lektionen vil du forbinde din Wio Terminal til din IoT Hub for at sende telemetri og modtage kommandoer. + +## Forbind din enhed til IoT Hub + +Det næste trin er at forbinde din enhed til IoT Hub. + +### Opgave - forbind til IoT Hub + +1. Åbn projektet `soil-moisture-sensor` i VS Code. + +1. Åbn filen `platformio.ini`. Fjern afhængigheden af biblioteket `knolleary/PubSubClient`. Dette blev brugt til at forbinde til den offentlige MQTT-broker og er ikke nødvendigt for at forbinde til IoT Hub. + +1. Tilføj følgende biblioteksafhængigheder: + + ```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 + ``` + + Biblioteket `Seeed Arduino RTC` giver kode til at interagere med et realtidsur i Wio Terminal, som bruges til at holde styr på tiden. De resterende biblioteker gør det muligt for din IoT-enhed at forbinde til IoT Hub. + +1. Tilføj følgende til bunden af filen `platformio.ini`: + + ```ini + build_flags = + -DDONT_USE_UPLOADTOBLOB + ``` + + Dette sætter et compiler-flag, der er nødvendigt, når Arduino IoT Hub-koden kompileres. + +1. Åbn header-filen `config.h`. Fjern alle MQTT-indstillingerne, og tilføj følgende konstant for enhedens forbindelsesstreng: + + ```cpp + // IoT Hub settings + const char *CONNECTION_STRING = ""; + ``` + + Erstat `` med forbindelsesstrengen for din enhed, som du kopierede tidligere. + +1. Forbindelsen til IoT Hub bruger et tidsbaseret token. Det betyder, at IoT-enheden skal kende den aktuelle tid. I modsætning til operativsystemer som Windows, macOS eller Linux synkroniserer mikrokontrollere ikke automatisk den aktuelle tid over internettet. Det betyder, at du skal tilføje kode for at hente den aktuelle tid fra en [NTP](https://wikipedia.org/wiki/Network_Time_Protocol)-server. Når tiden er hentet, kan den gemmes i et realtidsur i Wio Terminal, så den korrekte tid kan anmodes om senere, forudsat at enheden ikke mister strøm. Tilføj en ny fil kaldet `ntp.h` med følgende kode: + + ```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); + } + ``` + + Detaljerne i denne kode ligger uden for denne lektions omfang. Den definerer en funktion kaldet `initTime`, som henter den aktuelle tid fra en NTP-server og bruger den til at indstille uret på Wio Terminal. + +1. Åbn filen `main.cpp`, og fjern al MQTT-koden, inklusive header-filen `PubSubClient.h`, deklarationen af variablen `PubSubClient`, metoderne `reconnectMQTTClient` og `createMQTTClient` samt alle kald til disse variabler og metoder. Denne fil skal kun indeholde kode til at forbinde til WiFi, hente jordfugtighed og oprette et JSON-dokument med det. + +1. Tilføj følgende `#include`-direktiver øverst i filen `main.cpp` for at inkludere header-filer til IoT Hub-bibliotekerne og til at indstille tiden: + + ```cpp + #include + #include + #include + #include "ntp.h" + ``` + +1. Tilføj følgende kald til slutningen af funktionen `setup` for at indstille den aktuelle tid: + + ```cpp + initTime(); + ``` + +1. Tilføj følgende variabeldeklaration øverst i filen, lige under include-direktiverne: + + ```cpp + IOTHUB_DEVICE_CLIENT_LL_HANDLE _device_ll_handle; + ``` + + Dette erklærer en `IOTHUB_DEVICE_CLIENT_LL_HANDLE`, et håndtag til en forbindelse til IoT Hub. + +1. Tilføj nedenunder følgende kode: + + ```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"); + } + } + ``` + + Dette erklærer en callback-funktion, der vil blive kaldt, når forbindelsen til IoT Hub ændrer status, såsom at forbinde eller afbryde. Statussen sendes til den serielle port. + +1. Tilføj nedenunder en funktion til at forbinde til 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); + } + ``` + + Denne kode initialiserer IoT Hub-bibliotekskoden og opretter derefter en forbindelse ved hjælp af forbindelsesstrengen i header-filen `config.h`. Denne forbindelse er baseret på MQTT. Hvis forbindelsen fejler, sendes dette til den serielle port - hvis du ser dette i outputtet, skal du tjekke forbindelsesstrengen. Endelig opsættes callback-funktionen for forbindelsesstatus. + +1. Kald denne funktion i funktionen `setup` under kaldet til `initTime`: + + ```cpp + connectIoTHub(); + ``` + +1. Ligesom med MQTT-klienten kører denne kode på en enkelt tråd og har derfor brug for tid til at behandle meddelelser, der sendes af hubben og til hubben. Tilføj følgende øverst i funktionen `loop` for at gøre dette: + + ```cpp + IoTHubDeviceClient_LL_DoWork(_device_ll_handle); + ``` + +1. Byg og upload denne kode. Du vil se forbindelsen i den serielle monitor: + + ```output + Connecting to WiFi.. + Connected! + Fetched NTP epoch time is: 1619983687 + Sending telemetry {"soil_moisture":391} + The device client is connected to iothub + ``` + + I outputtet kan du se, at NTP-tiden hentes, efterfulgt af, at enhedsklienten forbinder. Det kan tage et par sekunder at forbinde, så du kan se jordfugtigheden i outputtet, mens enheden forbinder. + + > 💁 Du kan konvertere UNIX-tiden for NTP til en mere læsbar version ved hjælp af en hjemmeside som [unixtimestamp.com](https://www.unixtimestamp.com) + +## Send telemetri + +Nu hvor din enhed er forbundet, kan du sende telemetri til IoT Hub i stedet for til MQTT-brokeren. + +### Opgave - send telemetri + +1. Tilføj følgende funktion over funktionen `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); + } + ``` + + Denne kode opretter en IoT Hub-meddelelse fra en streng, der sendes som en parameter, sender den til hubben og rydder derefter op i meddelelsesobjektet. + +1. Kald denne kode i funktionen `loop`, lige efter linjen, hvor telemetrien sendes til den serielle port: + + ```cpp + sendTelemetry(telemetry.c_str()); + ``` + +## Håndter kommandoer + +Din enhed skal kunne håndtere en kommando fra serverkoden for at styre relæet. Dette sendes som en direkte metodeanmodning. + +## Opgave - håndter en direkte metodeanmodning + +1. Tilføj følgende kode før funktionen `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); + } + } + ``` + + Denne kode definerer en callback-metode, som IoT Hub-biblioteket kan kalde, når det modtager en direkte metodeanmodning. Den metode, der anmodes om, sendes i parameteren `method_name`. Denne funktion udskriver den kaldte metode til den serielle port og tænder eller slukker for relæet afhængigt af metodenavnet. + + > 💁 Dette kunne også implementeres i en enkelt direkte metodeanmodning, hvor den ønskede tilstand for relæet sendes i en payload, der kan sendes med metodeanmodningen og er tilgængelig fra parameteren `payload`. + +1. Tilføj følgende kode til slutningen af funktionen `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; + ``` + + Direkte metodeanmodninger kræver et svar, og svaret består af to dele - et svar som tekst og en returkode. Denne kode opretter et resultat som følgende JSON-dokument: + + ```JSON + { + "Result": "" + } + ``` + + Dette kopieres derefter ind i parameteren `response`, og størrelsen af dette svar sættes i parameteren `response_size`. Denne kode returnerer derefter `IOTHUB_CLIENT_OK` for at vise, at metoden blev håndteret korrekt. + +1. Tilslut callback-funktionen ved at tilføje følgende til slutningen af funktionen `connectIoTHub`: + + ```cpp + IoTHubClient_LL_SetDeviceMethodCallback(_device_ll_handle, directMethodCallback, NULL); + ``` + +1. Funktionen `loop` vil kalde funktionen `IoTHubDeviceClient_LL_DoWork` for at behandle hændelser sendt af IoT Hub. Dette kaldes kun hvert 10. sekund på grund af `delay`, hvilket betyder, at direkte metoder kun behandles hvert 10. sekund. For at gøre dette mere effektivt kan forsinkelsen på 10 sekunder implementeres som mange kortere forsinkelser, hvor `IoTHubDeviceClient_LL_DoWork` kaldes hver gang. For at gøre dette skal du tilføje følgende kode over funktionen `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); + } + ``` + + Denne kode vil gentage sig gentagne gange, kalde `IoTHubDeviceClient_LL_DoWork` og forsinke i 100 ms hver gang. Den vil gøre dette så mange gange som nødvendigt for at forsinke i den tid, der gives i parameteren `delay_time`. Dette betyder, at enheden højst venter 100 ms på at behandle direkte metodeanmodninger. + +1. I funktionen `loop` skal du fjerne kaldet til `IoTHubDeviceClient_LL_DoWork` og erstatte kaldet `delay(10000)` med følgende for at kalde denne nye funktion: + + ```cpp + work_delay(10000); + ``` + +> 💁 Du kan finde denne kode i mappen [code/wio-terminal](../../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal). + +😀 Dit jordfugtighedssensorprogram er nu forbundet til din IoT Hub! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/5-migrate-application-to-the-cloud/README.md b/translations/da/2-farm/lessons/5-migrate-application-to-the-cloud/README.md new file mode 100644 index 00000000..9539edc7 --- /dev/null +++ b/translations/da/2-farm/lessons/5-migrate-application-to-the-cloud/README.md @@ -0,0 +1,656 @@ + +# Migrer din applikationslogik til skyen + +![En sketchnote-oversigt over denne lektion](../../../../../translated_images/lesson-9.dfe99c8e891f48e179724520da9f5794392cf9a625079281ccdcbf09bd85e1b6.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +Denne lektion blev undervist som en del af [IoT for Beginners Project 2 - Digital Agriculture-serien](https://youtube.com/playlist?list=PLmsFUfdnGr3yCutmcVg6eAUEfsGiFXgcx) fra [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). + +[![Styr din IoT-enhed med serverløs kode](https://img.youtube.com/vi/VVZDcs5u1_I/0.jpg)](https://youtu.be/VVZDcs5u1_I) + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/17) + +## Introduktion + +I den sidste lektion lærte du, hvordan du forbinder din plantes jordfugtighedsovervågning og relækontrol til en skybaseret IoT-tjeneste. Det næste skridt er at flytte serverkoden, der styrer relæets timing, til skyen. I denne lektion lærer du, hvordan du gør dette ved hjælp af serverløse funktioner. + +I denne lektion dækker vi: + +* [Hvad er serverløs?](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Opret en serverløs applikation](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Opret en IoT Hub-hændelsesudløser](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Send direkte metodeanmodninger fra serverløs kode](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) +* [Udrul din serverløse kode til skyen](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud) + +## Hvad er serverløs? + +Serverløs, eller serverløs computing, indebærer at oprette små kodeblokke, der køres i skyen som svar på forskellige typer hændelser. Når hændelsen opstår, køres din kode, og den får data om hændelsen. Disse hændelser kan komme fra mange forskellige kilder, herunder webanmodninger, beskeder i en kø, ændringer i en database eller beskeder sendt til en IoT-tjeneste af IoT-enheder. + +![Hændelser, der sendes fra en IoT-tjeneste til en serverløs tjeneste, og behandles samtidig af flere funktioner](../../../../../translated_images/iot-messages-to-serverless.0194da1cc0732bb7d0f823aed3fce54735c6b1ad3bf36089804d8aaefc0a774f.da.png) + +> 💁 Hvis du tidligere har brugt database-triggere, kan du tænke på dette som noget lignende: kode, der udløses af en hændelse som f.eks. indsættelse af en række. + +![Når mange hændelser sendes samtidig, skalerer den serverløse tjeneste op for at køre dem alle på samme tid](../../../../../translated_images/serverless-scaling.f8c769adf0413fd17be1af4f07ff63016b347e2ff869be6c4abb211f9e93909d.da.png) + +Din kode køres kun, når hændelsen opstår; der er intet, der holder din kode aktiv på andre tidspunkter. Hændelsen opstår, din kode indlæses og køres. Dette gør serverløs meget skalerbar – hvis mange hændelser opstår samtidig, kan cloud-udbyderen køre din funktion så mange gange, som det er nødvendigt, på tværs af de tilgængelige servere. Ulempen er, at hvis du har brug for at dele information mellem hændelser, skal du gemme det et sted som en database i stedet for at opbevare det i hukommelsen. + +Din kode skrives som en funktion, der tager detaljer om hændelsen som en parameter. Du kan bruge en bred vifte af programmeringssprog til at skrive disse serverløse funktioner. + +> 🎓 Serverløs kaldes også Functions as a Service (FaaS), da hver hændelsesudløser implementeres som en funktion i koden. + +På trods af navnet bruger serverløs faktisk servere. Navnet skyldes, at du som udvikler ikke behøver at bekymre dig om de servere, der er nødvendige for at køre din kode; alt, hvad du skal bekymre dig om, er, at din kode køres som svar på en hændelse. Cloud-udbyderen har en serverløs *runtime*, der håndterer tildeling af servere, netværk, lager, CPU, hukommelse og alt andet, der er nødvendigt for at køre din kode. Denne model betyder, at du ikke betaler pr. server for tjenesten, da der ikke er nogen server. I stedet betaler du for den tid, din kode kører, og den mængde hukommelse, der bruges. + +> 💰 Serverløs er en af de billigste måder at køre kode i skyen på. For eksempel tillader en cloud-udbyder på tidspunktet for denne skrivning, at alle dine serverløse funktioner tilsammen kan udføres 1.000.000 gange om måneden, før de begynder at opkræve betaling. Derefter koster det 0,20 USD for hver 1.000.000 udførelser. Når din kode ikke kører, betaler du ikke. + +Som IoT-udvikler er den serverløse model ideel. Du kan skrive en funktion, der kaldes som svar på beskeder sendt fra enhver IoT-enhed, der er forbundet til din skyhostede IoT-tjeneste. Din kode vil håndtere alle beskeder, der sendes, men kun køre, når det er nødvendigt. + +✅ Kig tilbage på den kode, du skrev som serverkode, der lytter til beskeder over MQTT. Hvordan kunne denne kode køre i skyen ved hjælp af serverløs? Hvordan tror du, koden kunne ændres for at understøtte serverløs computing? + +> 💁 Den serverløse model udvides til andre cloud-tjenester ud over at køre kode. For eksempel er serverløse databaser tilgængelige i skyen med en serverløs prismodel, hvor du betaler pr. forespørgsel mod databasen, såsom en forespørgsel eller indsættelse. Prisen baseres typisk på, hvor meget arbejde der udføres for at håndtere forespørgslen. For eksempel vil en enkelt forespørgsel efter en række mod en primær nøgle koste mindre end en kompleks operation, der sammenkæder mange tabeller og returnerer tusindvis af rækker. + +## Opret en serverløs applikation + +Den serverløse computing-tjeneste fra Microsoft kaldes Azure Functions. + +![Azure Functions-logoet](../../../../../translated_images/azure-functions-logo.1cfc8e3204c9c44aaf80fcf406fc8544d80d7f00f8d3e8ed6fed764563e17564.da.png) + +Den korte video nedenfor giver et overblik over Azure Functions. + +[![Azure Functions introduktionsvideo](https://img.youtube.com/vi/8-jz5f_JyEQ/0.jpg)](https://www.youtube.com/watch?v=8-jz5f_JyEQ) + +> 🎥 Klik på billedet ovenfor for at se videoen. + +✅ Tag et øjeblik til at undersøge og læse oversigten over Azure Functions i [Microsoft Azure Functions-dokumentationen](https://docs.microsoft.com/azure/azure-functions/functions-overview?WT.mc_id=academic-17441-jabenn). + +For at skrive Azure Functions starter du med en Azure Functions-app i det sprog, du foretrækker. Azure Functions understøtter som standard Python, JavaScript, TypeScript, C#, F#, Java og Powershell. I denne lektion lærer du, hvordan du skriver en Azure Functions-app i Python. + +> 💁 Azure Functions understøtter også brugerdefinerede håndterere, så du kan skrive dine funktioner i ethvert sprog, der understøtter HTTP-anmodninger, herunder ældre sprog som COBOL. + +Functions-apps består af en eller flere *triggere* – funktioner, der reagerer på hændelser. Du kan have flere triggere i én Functions-app, som alle deler fælles konfiguration. For eksempel kan du i konfigurationsfilen for din Functions-app have forbindelsesdetaljer for din IoT Hub, og alle funktionerne i appen kan bruge dette til at oprette forbindelse og lytte efter hændelser. + +### Opgave – installer Azure Functions-værktøjer + +> På tidspunktet for denne skrivning fungerer Azure Functions-værktøjerne ikke fuldt ud på Apple Silicon med Python-projekter. Du skal bruge en Intel-baseret Mac, Windows-PC eller Linux-PC i stedet. + +En fantastisk funktion ved Azure Functions er, at du kan køre dem lokalt. Den samme runtime, der bruges i skyen, kan køres på din computer, så du kan skrive kode, der reagerer på IoT-beskeder, og køre den lokalt. Du kan endda fejlfinde din kode, mens hændelser håndteres. Når du er tilfreds med din kode, kan den udrulles til skyen. + +Azure Functions-værktøjerne er tilgængelige som en CLI, kendt som Azure Functions Core Tools. + +1. Installer Azure Functions Core Tools ved at følge instruktionerne i [Azure Functions Core Tools-dokumentationen](https://docs.microsoft.com/azure/azure-functions/functions-run-local?WT.mc_id=academic-17441-jabenn). + +1. Installer Azure Functions-udvidelsen til VS Code. Denne udvidelse giver support til at oprette, fejlfinde og udrulle Azure Functions. Se [Azure Functions-udvidelsesdokumentationen](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-azuretools.vscode-azurefunctions) for instruktioner om installation af denne udvidelse i VS Code. + +Når du udruller din Azure Functions-app til skyen, skal den bruge en lille mængde cloud-lagring til at gemme ting som applikationsfiler og logfiler. Når du kører din Functions-app lokalt, skal du stadig oprette forbindelse til cloud-lagring, men i stedet for at bruge faktisk cloud-lagring kan du bruge en lagringsemulator kaldet [Azurite](https://github.com/Azure/Azurite). Denne kører lokalt, men fungerer som cloud-lagring. + +> 🎓 I Azure er den lagring, som Azure Functions bruger, en Azure Storage Account. Disse konti kan gemme filer, blobs, data i tabeller eller data i køer. Du kan dele én lagringskonto mellem mange apps, såsom en Functions-app og en webapp. + +1. Azurite er en Node.js-app, så du skal installere Node.js. Du kan finde download- og installationsinstruktioner på [Node.js-websitet](https://nodejs.org/). Hvis du bruger en Mac, kan du også installere det via [Homebrew](https://formulae.brew.sh/formula/node). + +1. Installer Azurite ved hjælp af følgende kommando (`npm` er et værktøj, der installeres sammen med Node.js): + + ```sh + npm install -g azurite + ``` + +1. Opret en mappe kaldet `azurite`, som Azurite kan bruge til at gemme data: + + ```sh + mkdir azurite + ``` + +1. Kør Azurite og angiv denne nye mappe: + + ```sh + azurite --location azurite + ``` + + Azurite-lagringsemulatoren starter og er klar til, at den lokale Functions-runtime kan oprette forbindelse. + + ```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 + ``` + +### Opgave – opret et Azure Functions-projekt + +Azure Functions CLI kan bruges til at oprette en ny Functions-app. + +1. Opret en mappe til din Functions-app, og naviger til den. Kald den `soil-moisture-trigger`. + + ```sh + mkdir soil-moisture-trigger + cd soil-moisture-trigger + ``` + +1. Opret et Python-virtuelt miljø i denne mappe: + + ```sh + python3 -m venv .venv + ``` + +1. Aktivér det virtuelle miljø: + + * På Windows: + * Hvis du bruger Command Prompt eller Command Prompt via Windows Terminal, skal du køre: + + ```cmd + .venv\Scripts\activate.bat + ``` + + * Hvis du bruger PowerShell, skal du køre: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` + + * På macOS eller Linux skal du køre: + + ```cmd + source ./.venv/bin/activate + ``` + + > 💁 Disse kommandoer skal køres fra samme placering, som du kørte kommandoen for at oprette det virtuelle miljø. Du behøver aldrig navigere ind i `.venv`-mappen; du skal altid køre aktiveringskommandoen og eventuelle kommandoer for at installere pakker eller køre kode fra den mappe, hvor du oprettede det virtuelle miljø. + +1. Kør følgende kommando for at oprette en Functions-app i denne mappe: + + ```sh + func init --worker-runtime python soil-moisture-trigger + ``` + + Dette vil oprette tre filer i den aktuelle mappe: + + * `host.json` – dette JSON-dokument indeholder indstillinger for din Functions-app. Du behøver ikke ændre disse indstillinger. + * `local.settings.json` – dette JSON-dokument indeholder indstillinger, som din app bruger, når den kører lokalt, såsom forbindelsesstrenge til din IoT Hub. Disse indstillinger er kun lokale og bør ikke tilføjes til versionskontrol. Når du udruller appen til skyen, udrulles disse indstillinger ikke; i stedet indlæses dine indstillinger fra applikationsindstillinger. Dette vil blive dækket senere i denne lektion. + * `requirements.txt` – dette er en [Pip-kravfil](https://pip.pypa.io/en/stable/user_guide/#requirements-files), der indeholder de Pip-pakker, der er nødvendige for at køre din Functions-app. + +1. `local.settings.json`-filen har en indstilling for den lagringskonto, som Functions-appen vil bruge. Denne er som standard tom og skal derfor sættes. For at oprette forbindelse til Azurite-lagringsemulatoren lokalt skal du sætte denne værdi til følgende: + + ```json + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + ``` + +1. Installer de nødvendige Pip-pakker ved hjælp af kravfilen: + + ```sh + pip install -r requirements.txt + ``` + + > 💁 De nødvendige Pip-pakker skal være i denne fil, så når Functions-appen udrulles til skyen, kan runtime sikre, at de korrekte pakker installeres. + +1. For at teste, om alt fungerer korrekt, kan du starte Functions-runtime. Kør følgende kommando for at gøre dette: + + ```sh + func start + ``` + + Du vil se, at runtime starter og rapporterer, at den ikke har fundet nogen jobfunktioner (triggere). + + ```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. + ``` +> ⚠️ Hvis du får en firewall-meddelelse, skal du give adgang, da `func`-applikationen skal kunne læse og skrive til dit netværk. +> ⚠️ Hvis du bruger macOS, kan der være advarsler i outputtet: +> +> ```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. + > ``` +> +> Du kan ignorere disse, så længe Functions-appen starter korrekt og viser de kørende funktioner. Som nævnt i [dette spørgsmål på 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) kan det ignoreres. + +1. Stop Functions-appen ved at trykke på `ctrl+c`. + +1. Åbn den aktuelle mappe i VS Code, enten ved at åbne VS Code og derefter åbne denne mappe, eller ved at køre følgende kommando: + + ```sh + code . + ``` + + VS Code vil registrere dit Functions-projekt og vise en notifikation, der siger: + + ```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? + ``` + + ![Notifikationen](../../../../../translated_images/vscode-azure-functions-init-notification.bd19b49229963edb5311fb3a79445ea469424759d2917ee2f2eb6f92d65d5086.da.png) + + Vælg **Yes** i denne notifikation. + +1. Sørg for, at det virtuelle Python-miljø kører i VS Code-terminalen. Afslut og genstart det, hvis nødvendigt. + +## Opret en IoT Hub-hændelsesudløser + +Functions-appen er skallen for din serverløse kode. For at reagere på IoT Hub-hændelser kan du tilføje en IoT Hub-udløser til denne app. Denne udløser skal oprette forbindelse til strømmen af meddelelser, der sendes til IoT Hub, og reagere på dem. For at få denne strøm af meddelelser skal din udløser oprette forbindelse til IoT Hubs *event hub-kompatible endpoint*. + +IoT Hub er baseret på en anden Azure-tjeneste kaldet Azure Event Hubs. Event Hubs er en tjeneste, der giver dig mulighed for at sende og modtage meddelelser. IoT Hub udvider dette med funktioner til IoT-enheder. Måden, du opretter forbindelse for at læse meddelelser fra IoT Hub, er den samme som ved brug af Event Hubs. + +✅ Lav lidt research: Læs oversigten over Event Hubs i [Azure Event Hubs-dokumentationen](https://docs.microsoft.com/azure/event-hubs/event-hubs-about?WT.mc_id=academic-17441-jabenn). Hvordan sammenligner de grundlæggende funktioner sig med IoT Hub? + +For at en IoT-enhed kan oprette forbindelse til IoT Hub, skal den bruge en hemmelig nøgle, der sikrer, at kun tilladte enheder kan oprette forbindelse. Det samme gælder, når du opretter forbindelse for at læse meddelelser. Din kode skal bruge en forbindelsesstreng, der indeholder en hemmelig nøgle sammen med detaljer om IoT Hub. + +> 💁 Den standardforbindelsesstreng, du får, har **iothubowner**-tilladelser, hvilket giver enhver kode, der bruger den, fulde tilladelser på IoT Hub. Ideelt set bør du oprette forbindelse med det laveste nødvendige tilladelsesniveau. Dette vil blive dækket i næste lektion. + +Når din udløser er forbundet, vil koden inde i funktionen blive kaldt for hver meddelelse, der sendes til IoT Hub, uanset hvilken enhed der sendte den. Udløseren vil få meddelelsen som en parameter. + +### Opgave - få forbindelsesstrengen til det event hub-kompatible endpoint + +1. Kør følgende kommando fra VS Code-terminalen for at få forbindelsesstrengen til IoT Hubs event hub-kompatible endpoint: + + ```sh + az iot hub connection-string show --default-eventhub \ + --output table \ + --hub-name + ``` + + Erstat `` med navnet, du brugte til din IoT Hub. + +1. Åbn `local.settings.json`-filen i VS Code. Tilføj følgende værdi i `Values`-sektionen: + + ```json + "IOT_HUB_CONNECTION_STRING": "" + ``` + + Erstat `` med værdien fra det forrige trin. Du skal tilføje et komma efter linjen ovenfor for at gøre dette til gyldig JSON. + +### Opgave - opret en hændelsesudløser + +Du er nu klar til at oprette hændelsesudløseren. + +1. Kør følgende kommando fra VS Code-terminalen inde fra mappen `soil-moisture-trigger`: + + ```sh + func new --name iot-hub-trigger --template "Azure Event Hub trigger" + ``` + + Dette opretter en ny funktion kaldet `iot-hub-trigger`. Udløseren vil oprette forbindelse til det event hub-kompatible endpoint på IoT Hub, så du kan bruge en event hub-udløser. Der er ingen specifik IoT Hub-udløser. + +Dette vil oprette en mappe inde i mappen `soil-moisture-trigger` kaldet `iot-hub-trigger`, der indeholder denne funktion. Denne mappe vil have følgende filer: + +* `__init__.py` - dette er Python-kodefilen, der indeholder udløseren, ved hjælp af standard Python-filnavnekonventionen for at gøre denne mappe til et Python-modul. + + Denne fil vil indeholde følgende kode: + + ```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')) + ``` + + Kernen i udløseren er funktionen `main`. Det er denne funktion, der kaldes med hændelserne fra IoT Hub. Denne funktion har en parameter kaldet `event`, der indeholder en `EventHubEvent`. Hver gang en meddelelse sendes til IoT Hub, kaldes denne funktion og sender meddelelsen som `event` sammen med egenskaber, der svarer til de annoteringer, du så i sidste lektion. + + Kernen i denne funktion logger hændelsen. + +* `function.json` - denne fil indeholder konfigurationen for udløseren. Hovedkonfigurationen er i en sektion kaldet `bindings`. En binding er betegnelsen for en forbindelse mellem Azure Functions og andre Azure-tjenester. Denne funktion har en inputbinding til en event hub - den opretter forbindelse til en event hub og modtager data. + + > 💁 Du kan også have outputbindinger, så outputtet fra en funktion sendes til en anden tjeneste. For eksempel kunne du tilføje en outputbinding til en database og returnere IoT Hub-hændelsen fra funktionen, og den vil automatisk blive indsat i databasen. + + ✅ Lav lidt research: Læs om bindinger i [Azure Functions triggers and bindings concepts-dokumentationen](https://docs.microsoft.com/azure/azure-functions/functions-triggers-bindings?WT.mc_id=academic-17441-jabenn&tabs=python). + + Sektionen `bindings` inkluderer konfigurationen for bindingen. De interessante værdier er: + + * `"type": "eventHubTrigger"` - dette fortæller funktionen, at den skal lytte til hændelser fra en Event Hub + * `"name": "events"` - dette er parameternavnet, der skal bruges til Event Hub-hændelserne. Dette matcher parameternavnet i `main`-funktionen i Python-koden. + * `"direction": "in"` - dette er en inputbinding, dataene fra event hub kommer ind i funktionen + * `"connection": ""` - dette definerer navnet på indstillingen for at læse forbindelsesstrengen fra. Når du kører lokalt, vil denne indstilling blive læst fra `local.settings.json`-filen. + + > 💁 Forbindelsesstrengen kan ikke gemmes i `function.json`-filen, den skal læses fra indstillingerne. Dette er for at forhindre, at du ved et uheld eksponerer din forbindelsesstreng. + +1. På grund af [en fejl i Azure Functions-skabelonen](https://github.com/Azure/azure-functions-templates/issues/1250) har `function.json` en forkert værdi for feltet `cardinality`. Opdater dette felt fra `many` til `one`: + + ```json + "cardinality": "one", + ``` + +1. Opdater værdien af `"connection"` i `function.json`-filen, så den peger på den nye værdi, du tilføjede til `local.settings.json`-filen: + + ```json + "connection": "IOT_HUB_CONNECTION_STRING", + ``` + + > 💁 Husk - dette skal pege på indstillingen, ikke indeholde den faktiske forbindelsesstreng. + +1. Forbindelsesstrengen indeholder værdien `eventHubName`, så værdien for dette i `function.json`-filen skal ryddes. Opdater denne værdi til en tom streng: + + ```json + "eventHubName": "", + ``` + +### Opgave - kør hændelsesudløseren + +1. Sørg for, at du ikke kører IoT Hub-hændelsesmonitoren. Hvis denne kører samtidig med Functions-appen, vil Functions-appen ikke kunne oprette forbindelse og forbruge hændelser. + + > 💁 Flere apps kan oprette forbindelse til IoT Hub-endpoints ved hjælp af forskellige *forbrugergrupper*. Disse dækkes i en senere lektion. + +1. For at køre Functions-appen skal du køre følgende kommando fra VS Code-terminalen: + + ```sh + func start + ``` + + Functions-appen starter op og opdager funktionen `iot-hub-trigger`. Den vil derefter behandle alle hændelser, der allerede er sendt til IoT Hub inden for det seneste døgn. + + ```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) + ``` + + Hver kald til funktionen vil være omgivet af en `Executing 'Functions.iot-hub-trigger'`/`Executed 'Functions.iot-hub-trigger'` blok i outputtet, så du kan se, hvor mange meddelelser der blev behandlet i hvert funktionskald. + +1. Sørg for, at din IoT-enhed kører. Du vil se nye jordfugtighedsmeddelelser dukke op i Functions-appen. + +1. Stop og genstart Functions-appen. Du vil se, at den ikke vil behandle tidligere meddelelser igen, men kun behandle nye meddelelser. + +> 💁 VS Code understøtter også fejlfinding af dine funktioner. Du kan sætte breakpoints ved at klikke på kanten ved starten af hver kodelinje, eller ved at placere markøren på en kodelinje og vælge *Run -> Toggle breakpoint*, eller trykke på `F9`. Du kan starte debuggeren ved at vælge *Run -> Start debugging*, trykke på `F5`, eller vælge *Run and debug*-panelet og vælge **Start debugging**-knappen. Ved at gøre dette kan du se detaljerne for de hændelser, der behandles. + +#### Fejlfinding + +* Hvis du får følgende fejl: + + ```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. + ``` + + Tjek, at Azurite kører, og at du har indstillet `AzureWebJobsStorage` i `local.settings.json`-filen til `UseDevelopmentStorage=true`. + +* Hvis du får følgende fejl: + + ```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' + ``` + + Tjek, at du har indstillet `cardinality` i `function.json`-filen til `one`. + +* Hvis du får følgende fejl: + + ```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'). + ``` + + Tjek, at du har indstillet `eventHubName` i `function.json`-filen til en tom streng. + +## Send direkte metodeanmodninger fra serverløs kode + +Indtil videre lytter din Functions-app til meddelelser fra IoT Hub ved hjælp af det event hub-kompatible endpoint. Du skal nu sende kommandoer til IoT-enheden. Dette gøres ved at bruge en anden forbindelse til IoT Hub via *Registry Manager*. Registry Manager er et værktøj, der giver dig mulighed for at se, hvilke enheder der er registreret i IoT Hub, og kommunikere med disse enheder ved at sende cloud-til-enhed-meddelelser, direkte metodeanmodninger eller opdatere enhedens tvilling. Du kan også bruge det til at registrere, opdatere eller slette IoT-enheder fra IoT Hub. + +For at oprette forbindelse til Registry Manager skal du bruge en forbindelsesstreng. + +### Opgave - få Registry Manager-forbindelsesstrengen + +1. For at få forbindelsesstrengen skal du køre følgende kommando: + + ```sh + az iot hub connection-string show --policy-name service \ + --output table \ + --hub-name + ``` + + Erstat `` med navnet, du brugte til din IoT Hub. + + Forbindelsesstrengen anmodes for *ServiceConnect*-politikken ved hjælp af parameteren `--policy-name service`. Når du anmoder om en forbindelsesstreng, kan du specificere, hvilke tilladelser denne forbindelsesstreng vil tillade. ServiceConnect-politikken giver din kode mulighed for at oprette forbindelse og sende meddelelser til IoT-enheder. + + ✅ Lav lidt research: Læs om de forskellige politikker i [IoT Hub-tilladelsesdokumentationen](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-security#iot-hub-permissions?WT.mc_id=academic-17441-jabenn) + +1. Åbn `local.settings.json`-filen i VS Code. Tilføj følgende værdi i `Values`-sektionen: + + ```json + "REGISTRY_MANAGER_CONNECTION_STRING": "" + ``` + + Erstat `` med værdien fra det forrige trin. Du skal tilføje et komma efter linjen ovenfor for at gøre dette til gyldig JSON. + +### Opgave - send en direkte metodeanmodning til en enhed + +1. SDK'en til Registry Manager er tilgængelig via en Pip-pakke. Tilføj følgende linje til `requirements.txt`-filen for at tilføje afhængigheden til denne pakke: + + ```sh + azure-iot-hub + ``` + +1. Sørg for, at VS Code-terminalen har det virtuelle miljø aktiveret, og kør følgende kommando for at installere Pip-pakkerne: + + ```sh + pip install -r requirements.txt + ``` + +1. Tilføj følgende imports til `__init__.py`-filen: + + ```python + import json + import os + from azure.iot.hub import IoTHubRegistryManager + from azure.iot.hub.models import CloudToDeviceMethod + ``` + + Dette importerer nogle systembiblioteker samt bibliotekerne til at interagere med Registry Manager og sende direkte metodeanmodninger. + +1. Fjern koden fra `main`-metoden, men behold selve metoden. + +1. I `main`-metoden skal du tilføje følgende kode: + + ```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}') + ``` + + Denne kode udtrækker indholdet af hændelsen, som indeholder JSON-meddelelsen sendt af IoT-enheden. + + Den henter derefter enhedens ID fra annoteringerne, der sendes med meddelelsen. Indholdet af hændelsen indeholder meddelelsen sendt som telemetri, mens ordbogen `iothub_metadata` indeholder egenskaber, der er indstillet af IoT Hub, såsom enhedens ID for afsenderen og tidspunktet, hvor meddelelsen blev sendt. + + Disse oplysninger logges derefter. Du vil se denne logning i terminalen, når du kører Functions-appen lokalt. + +1. Tilføj nedenstående kode: + + ```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='{}') + ``` + + Denne kode henter jordfugtigheden fra meddelelsen. Den kontrollerer derefter jordfugtigheden og opretter afhængigt af værdien en hjælpeklasse til den direkte metodeanmodning for enten `relay_on` eller `relay_off`. Metodeanmodningen behøver ikke en nyttelast, så et tomt JSON-dokument sendes. + +1. Tilføj nedenstående kode: + + ```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) + ``` +Denne kode indlæser `REGISTRY_MANAGER_CONNECTION_STRING` fra filen `local.settings.json`. Værdierne i denne fil gøres tilgængelige som miljøvariabler, og disse kan læses ved hjælp af funktionen `os.environ`, en funktion der returnerer en ordbog med alle miljøvariabler. + +> 💁 Når denne kode implementeres i skyen, vil værdierne i filen `local.settings.json` blive sat som *Application Settings*, og disse kan læses fra miljøvariabler. + +Koden opretter derefter en instans af Registry Manager-hjælpeklassen ved hjælp af forbindelsesstrengen. + +1. Tilføj følgende kode nedenfor: + + ```python + registry_manager.invoke_device_method(device_id, direct_method) + + logging.info('Direct method request sent!') + ``` + + Denne kode instruerer registry manageren til at sende en direkte metodeanmodning til den enhed, der sendte telemetrien. + + > 💁 I de versioner af appen, du oprettede i tidligere lektioner ved hjælp af MQTT, blev relækontrolkommandoerne sendt til alle enheder. Koden antog, at du kun ville have én enhed. Denne version af koden sender metodeanmodningen til en enkelt enhed, så den vil fungere, hvis du har flere opsætninger af fugtighedssensorer og relæer, og sender den rigtige direkte metodeanmodning til den rigtige enhed. + +1. Kør Functions-appen, og sørg for, at din IoT-enhed sender data. Du vil se meddelelserne blive behandlet og de direkte metodeanmodninger blive sendt. Flyt jordfugtighedssensoren ind og ud af jorden for at se værdierne ændre sig og relæet tænde og slukke. + +> 💁 Du kan finde denne kode i mappen [code/functions](../../../../../2-farm/lessons/5-migrate-application-to-the-cloud/code/functions). + +## Implementer din serverløse kode i skyen + +Din kode fungerer nu lokalt, så næste skridt er at implementere Functions App i skyen. + +### Opgave - opret cloud-ressourcerne + +Din Functions App skal implementeres til en Functions App-ressource i Azure, som ligger i den Resource Group, du oprettede til din IoT Hub. Du skal også have en Storage Account oprettet i Azure for at erstatte den emulerede, du kører lokalt. + +1. Kør følgende kommando for at oprette en storage account: + + ```sh + az storage account create --resource-group soil-moisture-sensor \ + --sku Standard_LRS \ + --name + ``` + + Erstat `` med et navn til din storage account. Dette skal være globalt unikt, da det udgør en del af URL'en, der bruges til at få adgang til storage account. Du kan kun bruge små bogstaver og tal til dette navn, ingen andre tegn, og det er begrænset til 24 tegn. Brug noget som `sms` og tilføj en unik identifikator til sidst, som nogle tilfældige ord eller dit navn. + + `--sku Standard_LRS` vælger prisniveauet og vælger den billigste general-purpose konto. Der er ikke en gratis lagringsmulighed, og du betaler for det, du bruger. Omkostningerne er relativt lave, med den dyreste lagring til mindre end 0,05 USD pr. måned pr. gigabyte lagret. + + ✅ Læs mere om priser på [Azure Storage Account-prissiden](https://azure.microsoft.com/pricing/details/storage/?WT.mc_id=academic-17441-jabenn) + +1. Kør følgende kommando for at oprette en 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 + ``` + + Erstat `` med den placering, du brugte, da du oprettede Resource Group i den forrige lektion. + + Erstat `` med navnet på den storage account, du oprettede i det forrige trin. + + Erstat `` med et unikt navn til din Functions App. Dette skal være globalt unikt, da det udgør en del af en URL, der kan bruges til at få adgang til Functions App. Brug noget som `soil-moisture-sensor-` og tilføj en unik identifikator til sidst, som nogle tilfældige ord eller dit navn. + + `--functions-version 3` indstiller versionen af Azure Functions, der skal bruges. Version 3 er den nyeste version. + + `--os-type Linux` fortæller Functions runtime at bruge Linux som operativsystem til at hoste disse funktioner. Functions kan hostes på Linux eller Windows, afhængigt af det programmeringssprog, der bruges. Python-apps understøttes kun på Linux. + +### Opgave - upload dine applikationsindstillinger + +Da du udviklede din Functions App, gemte du nogle indstillinger i filen `local.settings.json` for forbindelsesstrenge til din IoT Hub. Disse skal skrives til Application Settings i din Function App i Azure, så de kan bruges af din kode. + +> 🎓 Filen `local.settings.json` er kun til lokale udviklingsindstillinger og bør ikke tjekkes ind i kildekodekontrol, såsom GitHub. Når den implementeres i skyen, bruges Application Settings. Application Settings er nøgle/værdi-par, der hostes i skyen og læses fra miljøvariabler enten i din kode eller af runtime, når din kode forbindes til IoT Hub. + +1. Kør følgende kommando for at indstille `IOT_HUB_CONNECTION_STRING`-indstillingen i Functions App Application Settings: + + ```sh + az functionapp config appsettings set --resource-group soil-moisture-sensor \ + --name \ + --settings "IOT_HUB_CONNECTION_STRING=" + ``` + + Erstat `` med det navn, du brugte til din Functions App. + + Erstat `` med værdien af `IOT_HUB_CONNECTION_STRING` fra din `local.settings.json`-fil. + +1. Gentag ovenstående trin, men indstil værdien af `REGISTRY_MANAGER_CONNECTION_STRING` til den tilsvarende værdi fra din `local.settings.json`-fil. + +Når du kører disse kommandoer, vil de også udskrive en liste over alle Application Settings for function appen. Du kan bruge dette til at kontrollere, at dine værdier er indstillet korrekt. + +> 💁 Du vil se en værdi, der allerede er indstillet for `AzureWebJobsStorage`. I din `local.settings.json`-fil var denne indstillet til en værdi for at bruge den lokale storage emulator. Når du oprettede Functions App, angav du storage account som en parameter, og dette blev automatisk indstillet i denne indstilling. + +### Opgave - implementer din Functions App i skyen + +Nu hvor Functions App er klar, kan din kode implementeres. + +1. Kør følgende kommando fra VS Code-terminalen for at publicere din Functions App: + + ```sh + func azure functionapp publish + ``` + + Erstat `` med det navn, du brugte til din Functions App. + +Koden vil blive pakket og sendt til Functions App, hvor den vil blive implementeret og startet. Der vil være en masse konsoloutput, der slutter med en bekræftelse af implementeringen og en liste over de implementerede funktioner. I dette tilfælde vil listen kun indeholde triggeren. + +```output +Deployment successful. +Remote build succeeded! +Syncing triggers... +Functions in soil-moisture-sensor: + iot-hub-trigger - [eventHubTrigger] +``` + +Sørg for, at din IoT-enhed kører. Ændr fugtighedsniveauerne ved at justere jordfugtigheden eller flytte sensoren ind og ud af jorden. Du vil se relæet tænde og slukke, når jordfugtigheden ændrer sig. + +--- + +## 🚀 Udfordring + +I den forrige lektion styrede du timing for relæet ved at afmelde dig fra MQTT-meddelelser, mens relæet var tændt, og i en kort periode efter det blev slukket. Du kan ikke bruge denne metode her - du kan ikke afmelde din IoT Hub-trigger. + +Overvej forskellige måder, du kunne håndtere dette i din Functions App. + +## Quiz efter lektionen + +[Quiz efter lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/18) + +## Gennemgang & Selvstudie + +* Læs om serverløs computing på [Serverless Computing-siden på Wikipedia](https://wikipedia.org/wiki/Serverless_computing) +* Læs om brug af serverløs i Azure, inklusive nogle flere eksempler, i [Go serverless for your IoT needs Azure-blogindlægget](https://azure.microsoft.com/blog/go-serverless-for-your-iot-needs/?WT.mc_id=academic-17441-jabenn) +* Lær mere om Azure Functions på [Azure Functions YouTube-kanalen](https://www.youtube.com/c/AzureFunctions) + +## Opgave + +[Tilføj manuel relækontrol](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md b/translations/da/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md new file mode 100644 index 00000000..8d947249 --- /dev/null +++ b/translations/da/2-farm/lessons/5-migrate-application-to-the-cloud/assignment.md @@ -0,0 +1,70 @@ + +# Tilføj manuel relækontrol + +## Instruktioner + +Serverløs kode kan udløses af mange forskellige ting, herunder HTTP-forespørgsler. Du kan bruge HTTP-udløsere til at tilføje en manuel overstyring til din relækontrol, så nogen kan tænde eller slukke for relæet via en webforespørgsel. + +Til denne opgave skal du tilføje to HTTP-udløsere til din Functions App for at tænde og slukke for relæet, og genbruge det, du har lært i denne lektion, til at sende kommandoer til enheden. + +Nogle tips: + +* Du kan tilføje en HTTP-udløser til din eksisterende Functions App med følgende kommando: + + ```sh + func new --name --template "HTTP trigger" + ``` + + Erstat `` med navnet på din HTTP-udløser. Brug noget som `relay_on` og `relay_off`. + +* HTTP-udløsere kan have adgangskontrol. Som standard kræver de en funktionsspecifik API-nøgle, der skal sendes med URL'en for at køre. Til denne opgave kan du fjerne denne begrænsning, så alle kan køre funktionen. For at gøre dette skal du opdatere `authLevel`-indstillingen i `function.json`-filen for HTTP-udløserne til følgende: + + ```json + "authLevel": "anonymous" + ``` + + > 💁 Du kan læse mere om denne adgangskontrol i [Function access keys-dokumentationen](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?WT.mc_id=academic-17441-jabenn#authorization-keys). + +* HTTP-udløsere understøtter som standard GET- og POST-forespørgsler. Det betyder, at du kan kalde dem ved hjælp af din webbrowser - webbrowsere laver GET-forespørgsler. + + Når du kører din Functions App lokalt, vil du se URL'en til udløseren: + + ```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 + ``` + + Indsæt URL'en i din browser og tryk på `return`, eller `Ctrl+klik` (`Cmd+klik` på macOS) på linket i terminalvinduet i VS Code for at åbne det i din standardbrowser. Dette vil køre udløseren. + + > 💁 Bemærk, at URL'en har `/api` i sig - HTTP-udløsere er som standard i `api`-underdomænet. + +* Når du implementerer Functions App, vil HTTP-udløserens URL være: + + `https://.azurewebsites.net/api/` + + Hvor `` er navnet på din Functions App, og `` er navnet på din udløser. + +## Bedømmelseskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver Forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Opret HTTP-udløsere | Oprettede 2 udløsere til at tænde og slukke for relæet med passende navne | Oprettede én udløser med et passende navn | Kunne ikke oprette nogen udløsere | +| Kontroller relæet fra HTTP-udløsere | Kunne forbinde begge udløsere til IoT Hub og kontrollere relæet korrekt | Kunne forbinde én udløser til IoT Hub og kontrollere relæet korrekt | Kunne ikke forbinde udløserne til IoT Hub | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/6-keep-your-plant-secure/README.md b/translations/da/2-farm/lessons/6-keep-your-plant-secure/README.md new file mode 100644 index 00000000..6bd10865 --- /dev/null +++ b/translations/da/2-farm/lessons/6-keep-your-plant-secure/README.md @@ -0,0 +1,245 @@ + +# Hold din plante sikker + +![En sketchnote-oversigt over denne lektion](../../../../../translated_images/lesson-10.829c86b80b9403bb770929ee553a1d293afe50dc23121aaf9be144673ae012cc.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/19) + +## Introduktion + +I de sidste par lektioner har du oprettet en IoT-enhed til jordovervågning og forbundet den til skyen. Men hvad nu hvis hackere, der arbejder for en konkurrerende landmand, fik kontrol over dine IoT-enheder? Hvad hvis de sendte høje jordfugtighedsaflæsninger, så dine planter aldrig blev vandet, eller tændte dit vandingssystem konstant, hvilket dræbte dine planter på grund af overvanding og kostede dig en formue i vand? + +I denne lektion vil du lære om at sikre IoT-enheder. Da dette er den sidste lektion i dette projekt, vil du også lære, hvordan du rydder op i dine skyressourcer for at reducere eventuelle omkostninger. + +I denne lektion dækker vi: + +* [Hvorfor skal du sikre IoT-enheder?](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Kryptografi](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Sikring af dine IoT-enheder](../../../../../2-farm/lessons/6-keep-your-plant-secure) +* [Generering og brug af et X.509-certifikat](../../../../../2-farm/lessons/6-keep-your-plant-secure) + +> 🗑 Dette er den sidste lektion i dette projekt, så efter at have gennemført denne lektion og opgaven, skal du huske at rydde op i dine skyservices. Du skal bruge tjenesterne for at fuldføre opgaven, så sørg for at gøre det først. +> +> Se [guiden til oprydning af dit projekt](../../../clean-up.md), hvis du har brug for instruktioner om, hvordan du gør dette. + +## Hvorfor skal du sikre IoT-enheder? + +IoT-sikkerhed handler om at sikre, at kun forventede enheder kan oprette forbindelse til din sky-IoT-tjeneste og sende telemetri, og at kun din skytjeneste kan sende kommandoer til dine enheder. IoT-data kan også være personlige, herunder medicinske eller intime data, så hele din applikation skal tage højde for sikkerhed for at forhindre, at disse data lækkes. + +Hvis din IoT-applikation ikke er sikker, er der en række risici: + +* En falsk enhed kunne sende forkerte data, hvilket får din applikation til at reagere forkert. For eksempel kunne de sende konstant høje jordfugtighedsaflæsninger, hvilket betyder, at dit vandingssystem aldrig tændes, og dine planter dør af mangel på vand. +* Uautoriserede brugere kunne læse data fra IoT-enheder, herunder personlige eller forretningskritiske data. +* Hackere kunne sende kommandoer for at kontrollere en enhed på en måde, der kunne forårsage skade på enheden eller tilsluttet hardware. +* Ved at oprette forbindelse til en IoT-enhed kan hackere bruge dette til at få adgang til yderligere netværk og få adgang til private systemer. +* Ondsindede brugere kunne få adgang til personlige data og bruge dem til afpresning. + +Dette er scenarier fra den virkelige verden og sker hele tiden. Nogle eksempler blev givet i tidligere lektioner, men her er nogle flere: + +* I 2018 brugte hackere et åbent WiFi-adgangspunkt på en termostat til en fisketank til at få adgang til et casinos netværk og stjæle data. [The Hacker News - Casino Gets Hacked Through Its Internet-Connected Fish Tank Thermometer](https://thehackernews.com/2018/04/iot-hacking-thermometer.html) +* I 2016 lancerede Mirai Botnet et denial-of-service-angreb mod Dyn, en internetudbyder, hvilket tog store dele af internettet ned. Denne botnet brugte malware til at forbinde til IoT-enheder som DVR'er og kameraer, der brugte standardbrugernavne og -adgangskoder, og derfra lancerede angrebet. [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 havde en database med brugere af deres CloudPets-forbundne legetøj offentligt tilgængelig på internettet. [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 markerede løbere, du løb forbi, og viste deres ruter, hvilket gjorde det muligt for fremmede at se, hvor du bor. [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/). + +✅ Lav noget research: Søg efter flere eksempler på IoT-hacks og brud på IoT-data, især med personlige genstande som internetforbundne tandbørster eller vægte. Tænk over, hvilken indvirkning disse hacks kunne have på ofrene eller kunderne. + +> 💁 Sikkerhed er et enormt emne, og denne lektion vil kun berøre nogle af de grundlæggende ting omkring at forbinde din enhed til skyen. Andre emner, der ikke vil blive dækket, inkluderer overvågning af dataændringer under overførsel, hacking af enheder direkte eller ændringer i enhedskonfigurationer. IoT-hacking er en så stor trussel, at værktøjer som [Azure Defender for IoT](https://azure.microsoft.com/services/azure-defender-for-iot/?WT.mc_id=academic-17441-jabenn) er blevet udviklet. Disse værktøjer ligner de antivirus- og sikkerhedsværktøjer, du måske har på din computer, men er designet til små, lavdrevne IoT-enheder. + +## Kryptografi + +Når en enhed opretter forbindelse til en IoT-tjeneste, bruger den en ID til at identificere sig selv. Problemet er, at denne ID kan klones - en hacker kunne opsætte en ondsindet enhed, der bruger den samme ID som en rigtig enhed, men sender falske data. + +![Både gyldige og ondsindede enheder kunne bruge den samme ID til at sende telemetri](../../../../../translated_images/iot-device-and-hacked-device-connecting.e0671675df74d6d99eb1dedb5a670e606f698efa6202b1ad4c8ae548db299cc6.da.png) + +Løsningen på dette er at konvertere de data, der sendes, til et krypteret format ved hjælp af en værdi, der kun er kendt af enheden og skyen. Denne proces kaldes *kryptering*, og værdien, der bruges til at kryptere dataene, kaldes en *krypteringsnøgle*. + +![Hvis kryptering bruges, accepteres kun krypterede meddelelser, andre afvises](../../../../../translated_images/iot-device-and-hacked-device-connecting-encryption.5941aff601fc978f979e46f2849b573564eeb4a4dc5b52f669f62745397492fb.da.png) + +Skytjenesten kan derefter konvertere dataene tilbage til et læsbart format ved hjælp af en proces kaldet *dekryptering*, enten ved hjælp af den samme krypteringsnøgle eller en *dekrypteringsnøgle*. Hvis den krypterede meddelelse ikke kan dekrypteres med nøglen, er enheden blevet hacket, og meddelelsen afvises. + +Teknikken til at udføre kryptering og dekryptering kaldes *kryptografi*. + +### Tidlig kryptografi + +De tidligste typer kryptografi var substitutionskrypter, der går 3.500 år tilbage. Substitutionskrypter indebærer at erstatte ét bogstav med et andet. For eksempel indebærer [Caesar-krypteringen](https://wikipedia.org/wiki/Caesar_cipher) at forskyde alfabetet med en defineret mængde, hvor kun afsenderen af den krypterede meddelelse og den tilsigtede modtager ved, hvor mange bogstaver der skal forskydes. + +[Vigenère-krypteringen](https://wikipedia.org/wiki/Vigenère_cipher) tog dette videre ved at bruge ord til at kryptere tekst, så hvert bogstav i den oprindelige tekst blev forskudt med en forskellig mængde i stedet for altid at forskyde med det samme antal bogstaver. + +Kryptografi blev brugt til en bred vifte af formål, såsom at beskytte en pottemagers glasuropskrift i det gamle Mesopotamien, skrive hemmelige kærlighedsnoter i Indien eller holde gamle egyptiske magiske formularer hemmelige. + +### Moderne kryptografi + +Moderne kryptografi er meget mere avanceret og gør det sværere at bryde end tidlige metoder. Moderne kryptografi bruger kompliceret matematik til at kryptere data med alt for mange mulige nøgler til, at brute force-angreb er mulige. + +Kryptografi bruges på mange forskellige måder til sikker kommunikation. Hvis du læser denne side på GitHub, bemærker du måske, at webadressen starter med *HTTPS*, hvilket betyder, at kommunikationen mellem din browser og GitHubs webservere er krypteret. Hvis nogen kunne læse internettrafikken mellem din browser og GitHub, ville de ikke kunne læse dataene, da de er krypteret. Din computer kan endda kryptere alle data på din harddisk, så hvis nogen stjæler den, kan de ikke læse nogen af dine data uden din adgangskode. + +> 🎓 HTTPS står for HyperText Transfer Protocol **Secure** + +Desværre er ikke alt sikkert. Nogle enheder har ingen sikkerhed, andre er sikret med lette at bryde nøgler, eller nogle gange bruger alle enheder af samme type den samme nøgle. Der har været beretninger om meget personlige IoT-enheder, der alle har den samme adgangskode til at forbinde til dem via WiFi eller Bluetooth. Hvis du kan forbinde til din egen enhed, kan du forbinde til andres. Når du er forbundet, kan du få adgang til meget private data eller få kontrol over deres enhed. + +> 💁 På trods af kompleksiteten i moderne kryptografi og påstandene om, at det kan tage milliarder af år at bryde kryptering, har fremkomsten af kvantecomputing ført til muligheden for at bryde al kendt kryptering på meget kort tid! + +### Symmetriske og asymmetriske nøgler + +Kryptering findes i to typer - symmetrisk og asymmetrisk. + +**Symmetrisk** kryptering bruger den samme nøgle til at kryptere og dekryptere dataene. Både afsender og modtager skal kende den samme nøgle. Dette er den mindst sikre type, da nøglen skal deles på en eller anden måde. For at en afsender kan sende en krypteret meddelelse til en modtager, skal afsenderen først sende modtageren nøglen. + +![Symmetrisk nøglekryptering bruger den samme nøgle til at kryptere og dekryptere en meddelelse](../../../../../translated_images/send-message-symmetric-key.a2e8ad0d495896ffcdf15d25bb4491c695a5cb851457b359fb0f0c89d67707c9.da.png) + +Hvis nøglen bliver stjålet under overførsel, eller hvis afsenderen eller modtageren bliver hacket, og nøglen bliver fundet, kan krypteringen brydes. + +![Symmetrisk nøglekryptering er kun sikker, hvis en hacker ikke får fat i nøglen - hvis det sker, kan de opsnappe og dekryptere meddelelsen](../../../../../translated_images/send-message-symmetric-key-hacker.e7cb53db1707adfb1486a8144060cb76435fe8dbdede8cecc09e7d15b2d9a251.da.png) + +**Asymmetrisk** kryptering bruger 2 nøgler - en krypteringsnøgle og en dekrypteringsnøgle, kendt som et offentligt/privat nøglepar. Den offentlige nøgle bruges til at kryptere meddelelsen, men kan ikke bruges til at dekryptere den, mens den private nøgle bruges til at dekryptere meddelelsen, men kan ikke bruges til at kryptere den. + +![Asymmetrisk kryptering bruger en anden nøgle til at kryptere og dekryptere. Krypteringsnøglen sendes til enhver meddelelsesafsender, så de kan kryptere en meddelelse, før den sendes til modtageren, der ejer nøglerne](../../../../../translated_images/send-message-asymmetric.7abe327c62615b8c19805252af5d4b6c5e7aaeb8fbc455efeff866fe2d300b62.da.png) + +Modtageren deler sin offentlige nøgle, og afsenderen bruger denne til at kryptere meddelelsen. Når meddelelsen er sendt, dekrypterer modtageren den med sin private nøgle. Asymmetrisk kryptering er mere sikker, da den private nøgle holdes privat af modtageren og aldrig deles. Alle kan få den offentlige nøgle, da den kun kan bruges til at kryptere meddelelser. + +Symmetrisk kryptering er hurtigere end asymmetrisk kryptering, mens asymmetrisk er mere sikker. Nogle systemer bruger begge dele - asymmetrisk kryptering til at kryptere og dele den symmetriske nøgle og derefter den symmetriske nøgle til at kryptere alle data. Dette gør det mere sikkert at dele den symmetriske nøgle mellem afsender og modtager og hurtigere, når data krypteres og dekrypteres. + +## Sikring af dine IoT-enheder + +IoT-enheder kan sikres ved hjælp af symmetrisk eller asymmetrisk kryptering. Symmetrisk er lettere, men mindre sikker. + +### Symmetriske nøgler + +Da du opsatte din IoT-enhed til at interagere med IoT Hub, brugte du en forbindelsesstreng. Et eksempel på en forbindelsesstreng er: + +```output +HostName=soil-moisture-sensor.azure-devices.net;DeviceId=soil-moisture-sensor;SharedAccessKey=Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0= +``` + +Denne forbindelsesstreng består af tre dele adskilt af semikolon, hvor hver del er en nøgle og en værdi: + +| Nøgle | Værdi | Beskrivelse | +| --- | ----- | ----------- | +| HostName | `soil-moisture-sensor.azure-devices.net` | URL'en til IoT Hub | +| DeviceId | `soil-moisture-sensor` | Enhedens unikke ID | +| SharedAccessKey | `Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0=` | En symmetrisk nøgle kendt af enheden og IoT Hub | + +Den sidste del af denne forbindelsesstreng, `SharedAccessKey`, er den symmetriske nøgle, der er kendt af både enheden og IoT Hub. Denne nøgle sendes aldrig fra enheden til skyen eller fra skyen til enheden. I stedet bruges den til at kryptere data, der sendes eller modtages. + +✅ Lav et eksperiment. Hvad tror du, der vil ske, hvis du ændrer `SharedAccessKey`-delen af forbindelsesstrengen, når du forbinder din IoT-enhed? Prøv det. + +Når enheden først forsøger at oprette forbindelse, sender den en delt adgangssignatur (SAS-token), der består af URL'en til IoT Hub, et tidsstempel for, hvornår adgangssignaturen udløber (normalt 1 dag fra det aktuelle tidspunkt), og en signatur. Denne signatur består af URL'en og udløbstiden krypteret med den delte adgangsnøgle fra forbindelsesstrengen. + +IoT Hub dekrypterer denne signatur med den delte adgangsnøgle, og hvis den dekrypterede værdi matcher URL'en og udløbstiden, får enheden lov til at oprette forbindelse. Den verificerer også, at det aktuelle tidspunkt er før udløbstiden for at forhindre en ondsindet enhed i at opsnappe SAS-tokenet fra en rigtig enhed og bruge det. + +Dette er en elegant måde at verificere, at afsenderen er den korrekte enhed. Ved at sende nogle kendte data i både en dekrypteret og krypteret form kan serveren verificere enheden ved at sikre, at når den dekrypterer de krypterede data, matcher resultatet den dekrypterede version, der blev sendt. Hvis det matcher, har både afsender og modtager den samme symmetriske krypteringsnøgle. +💁 På grund af udløbstiden skal din IoT-enhed kende den præcise tid, som normalt læses fra en [NTP](https://wikipedia.org/wiki/Network_Time_Protocol)-server. Hvis tiden ikke er korrekt, vil forbindelsen mislykkes. +Efter forbindelsen vil alle data, der sendes til IoT Hub fra enheden, eller til enheden fra IoT Hub, blive krypteret med den delte adgangsnøgle. + +✅ Hvad tror du, der vil ske, hvis flere enheder deler den samme forbindelsesstreng? + +> 💁 Det er en dårlig sikkerhedspraksis at gemme denne nøgle i koden. Hvis en hacker får adgang til din kildekode, kan de få fat i din nøgle. Det gør det også mere besværligt at udgive kode, da du skal genkompilere med en opdateret nøgle for hver enhed. Det er bedre at indlæse denne nøgle fra en hardware-sikkerhedsmodul - en chip på IoT-enheden, der gemmer krypterede værdier, som kan læses af din kode. +> +> Når man lærer om IoT, er det ofte nemmere at placere nøglen i koden, som du gjorde i en tidligere lektion, men du skal sikre dig, at denne nøgle ikke bliver tjekket ind i offentlig kildekodekontrol. + +Enheder har 2 nøgler og 2 tilsvarende forbindelsesstrenge. Dette giver dig mulighed for at rotere nøglerne - det vil sige skifte fra en nøgle til en anden, hvis den første bliver kompromitteret, og derefter gendanne den første nøgle. + +### X.509-certifikater + +Når du bruger asymmetrisk kryptering med et offentligt/privat nøglepar, skal du give din offentlige nøgle til alle, der ønsker at sende dig data. Problemet er, hvordan kan modtageren af din nøgle være sikker på, at det faktisk er din offentlige nøgle og ikke en anden, der udgiver sig for at være dig? I stedet for at give en nøgle kan du i stedet give din offentlige nøgle i et certifikat, der er blevet verificeret af en betroet tredjepart, kaldet et X.509-certifikat. + +X.509-certifikater er digitale dokumenter, der indeholder den offentlige nøgle-del af det offentlige/private nøglepar. De udstedes normalt af en række betroede organisationer kaldet [Certificeringsmyndigheder](https://wikipedia.org/wiki/Certificate_authority) (CAs) og er digitalt underskrevet af CA'en for at indikere, at nøglen er gyldig og kommer fra dig. Du stoler på certifikatet og på, at den offentlige nøgle er fra den, certifikatet siger, det er fra, fordi du stoler på CA'en, ligesom du ville stole på et pas eller kørekort, fordi du stoler på det land, der udsteder det. Certifikater koster penge, så du kan også 'selv-underskrive', det vil sige oprette et certifikat selv, der er underskrevet af dig, til testformål. + +> 💁 Du bør aldrig bruge et selv-underskrevet certifikat til en produktionsudgivelse. + +Disse certifikater har en række felter i sig, herunder hvem den offentlige nøgle er fra, oplysninger om CA'en, der udstedte det, hvor længe det er gyldigt, og selve den offentlige nøgle. Før du bruger et certifikat, er det god praksis at verificere det ved at kontrollere, at det er underskrevet af den oprindelige CA. + +✅ Du kan læse en fuld liste over felterne i certifikatet i [Microsofts vejledning om X.509 Public Key Certificates](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-certificates?WT.mc_id=academic-17441-jabenn#certificate-fields) + +Når du bruger X.509-certifikater, vil både afsenderen og modtageren have deres egne offentlige og private nøgler samt begge have X.509-certifikater, der indeholder den offentlige nøgle. De udveksler derefter X.509-certifikater på en eller anden måde, bruger hinandens offentlige nøgler til at kryptere de data, de sender, og deres egne private nøgler til at dekryptere de data, de modtager. + +![I stedet for at dele en offentlig nøgle kan du dele et certifikat. Brugeren af certifikatet kan verificere, at det kommer fra dig, ved at kontrollere med den certificeringsmyndighed, der har underskrevet det.](../../../../../translated_images/send-message-certificate.9cc576ac1e46b76eb58ebc8eedaa522566fa0700076da46f5180aad78c2435db.da.png) + +En stor fordel ved at bruge X.509-certifikater er, at de kan deles mellem enheder. Du kan oprette ét certifikat, uploade det til IoT Hub og bruge det til alle dine enheder. Hver enhed skal derefter kun kende den private nøgle for at dekryptere de meddelelser, den modtager fra IoT Hub. + +Certifikatet, der bruges af din enhed til at kryptere meddelelser, den sender til IoT Hub, er udgivet af Microsoft. Det er det samme certifikat, som mange Azure-tjenester bruger, og det er nogle gange indbygget i SDK'erne. + +> 💁 Husk, en offentlig nøgle er netop det - offentlig. Azure's offentlige nøgle kan kun bruges til at kryptere data, der sendes til Azure, ikke til at dekryptere dem, så den kan deles overalt, inklusive i kildekode. For eksempel kan du se den i [Azure IoT C SDK kildekoden](https://github.com/Azure/azure-iot-sdk-c/blob/master/certs/certs.c). + +✅ Der er mange fagudtryk med X.509-certifikater. Du kan læse definitionerne af nogle af de termer, du kan støde på, i [Den letforståelige guide til X.509-certifikat-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) + +## Generer og brug et X.509-certifikat + +Trinene til at generere et X.509-certifikat er: + +1. Opret et offentligt/privat nøglepar. En af de mest anvendte algoritmer til at generere et offentligt/privat nøglepar kaldes [Rivest–Shamir–Adleman](https://wikipedia.org/wiki/RSA_(cryptosystem))(RSA). + +1. Indsend den offentlige nøgle med tilhørende data til underskrift, enten af en CA eller ved selv-underskrift. + +Azure CLI har kommandoer til at oprette en ny enhedsidentitet i IoT Hub og automatisk generere det offentlige/private nøglepar og oprette et selv-underskrevet certifikat. + +> 💁 Hvis du vil se trinnene i detaljer i stedet for at bruge Azure CLI, kan du finde det i [Brug af OpenSSL til at oprette selv-underskrevne certifikater i Microsoft IoT Hub-dokumentationen](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-self-sign?WT.mc_id=academic-17441-jabenn) + +### Opgave - opret en enhedsidentitet ved hjælp af et X.509-certifikat + +1. Kør følgende kommando for at registrere den nye enhedsidentitet og automatisk generere nøgler og certifikater: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor-x509 \ + --am x509_thumbprint \ + --output-dir . \ + --hub-name + ``` + + Erstat `` med navnet, du brugte til din IoT Hub. + + Dette vil oprette en enhed med et ID af `soil-moisture-sensor-x509` for at skelne fra den enhedsidentitet, du oprettede i den sidste lektion. Denne kommando vil også oprette 2 filer i den aktuelle mappe: + + * `soil-moisture-sensor-x509-key.pem` - denne fil indeholder den private nøgle til enheden. + * `soil-moisture-sensor-x509-cert.pem` - dette er X.509-certifikatfilen til enheden. + + Hold disse filer sikre! Filen med den private nøgle bør ikke tjekkes ind i offentlig kildekodekontrol. + +### Opgave - brug X.509-certifikatet i din enhedskode + +Arbejd dig igennem den relevante vejledning for at forbinde din IoT-enhed til skyen ved hjælp af X.509-certifikatet: + +* [Arduino - Wio Terminal](wio-terminal-x509.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-x509.md) + +--- + +## 🚀 Udfordring + +Der er flere måder at oprette, administrere og slette Azure-tjenester som Resource Groups og IoT Hubs. En måde er [Azure Portal](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) - en webbaseret grænseflade, der giver dig en GUI til at administrere dine Azure-tjenester. + +Gå til [portal.azure.com](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) og undersøg portalen. Se, om du kan oprette en IoT Hub ved hjælp af portalen, og derefter slette den. + +**Tip** - når du opretter tjenester gennem portalen, behøver du ikke at oprette en Resource Group på forhånd, en kan oprettes, når du opretter tjenesten. Sørg for at slette den, når du er færdig! + +Du kan finde masser af dokumentation, vejledninger og guides om Azure Portal i [Azure portal-dokumentationen](https://docs.microsoft.com/azure/azure-portal/?WT.mc_id=academic-17441-jabenn). + +## Quiz efter lektionen + +[Quiz efter lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/20) + +## Gennemgang & Selvstudie + +* Læs om kryptografiens historie på [Historien om kryptografi-siden på Wikipedia](https://wikipedia.org/wiki/History_of_cryptography). +* Læs om X.509-certifikater på [X.509-siden på Wikipedia](https://wikipedia.org/wiki/X.509). + +## Opgave + +[Byg en ny IoT-enhed](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/6-keep-your-plant-secure/assignment.md b/translations/da/2-farm/lessons/6-keep-your-plant-secure/assignment.md new file mode 100644 index 00000000..7f9c9339 --- /dev/null +++ b/translations/da/2-farm/lessons/6-keep-your-plant-secure/assignment.md @@ -0,0 +1,29 @@ + +# Byg en ny IoT-enhed + +## Instruktioner + +I løbet af de sidste 6 lektioner har du lært om digital landbrug og hvordan man bruger IoT-enheder til at indsamle data for at forudsige plantevækst og automatisere vanding baseret på målinger af jordfugtighed. + +Brug det, du har lært, til at bygge en ny IoT-enhed ved hjælp af en sensor og aktuator efter eget valg. Send telemetri til en IoT Hub, og brug den til at styre en aktuator via serverløs kode. Du kan bruge en sensor og en aktuator, som du allerede har brugt i dette eller det tidligere projekt, eller hvis du har andet hardware, kan du prøve noget nyt. + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Kod en IoT-enhed til at bruge en sensor og aktuator | Kodede en IoT-enhed, der fungerer med både sensor og aktuator | Kodede en IoT-enhed, der fungerer med enten sensor eller aktuator | Kunne ikke kode en IoT-enhed til at bruge sensor eller aktuator | +| Forbind IoT-enheden til IoT Hub | Kunne implementere en IoT Hub og sende telemetri til den samt modtage kommandoer fra den | Kunne implementere en IoT Hub og enten sende telemetri eller modtage kommandoer | Kunne ikke implementere en IoT Hub og kommunikere med den fra en IoT-enhed | +| Styr aktuatoren ved hjælp af serverløs kode | Kunne implementere en Azure Function til at styre enheden udløst af telemetrihændelser | Kunne implementere en Azure Function udløst af telemetrihændelser, men kunne ikke styre aktuatoren | Kunne ikke implementere en Azure Function | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md b/translations/da/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md new file mode 100644 index 00000000..4ee6628b --- /dev/null +++ b/translations/da/2-farm/lessons/6-keep-your-plant-secure/single-board-computer-x509.md @@ -0,0 +1,71 @@ + +# Brug X.509-certifikatet i din enhedskode - Virtuel IoT-hardware og Raspberry Pi + +I denne del af lektionen vil du forbinde din virtuelle IoT-enhed eller Raspberry Pi til din IoT Hub ved hjælp af X.509-certifikatet. + +## Forbind din enhed til IoT Hub + +Det næste skridt er at forbinde din enhed til IoT Hub ved hjælp af X.509-certifikater. + +### Opgave - forbind til IoT Hub + +1. Kopiér nøgle- og certifikatfilerne til mappen, der indeholder din IoT-enhedskode. Hvis du bruger en Raspberry Pi via VS Code Remote SSH og har oprettet nøglerne på din PC eller Mac, kan du trække og slippe filerne ind i explorer i VS Code for at kopiere dem. + +1. Åbn filen `app.py`. + +1. For at forbinde ved hjælp af et X.509-certifikat skal du bruge værtsnavnet på IoT Hub og X.509-certifikatet. Start med at oprette en variabel, der indeholder værtsnavnet, ved at tilføje følgende kode før enhedsklienten oprettes: + + ```python + host_name = "" + ``` + + Erstat `` med værtsnavnet på din IoT Hub. Du kan finde dette i sektionen `HostName` i `connection_string`. Det vil være navnet på din IoT Hub, som slutter med `.azure-devices.net`. + +1. Under dette skal du erklære en variabel med enheds-ID'et: + + ```python + device_id = "soil-moisture-sensor-x509" + ``` + +1. Du skal bruge en instans af klassen `X509`, der indeholder X.509-filerne. Tilføj `X509` til listen over klasser, der importeres fra modulet `azure.iot.device`: + + ```python + from azure.iot.device import IoTHubDeviceClient, Message, MethodResponse, X509 + ``` + +1. Opret en instans af klassen `X509` ved hjælp af dine certifikat- og nøglefiler ved at tilføje denne kode under erklæringen af `host_name`: + + ```python + x509 = X509("./soil-moisture-sensor-x509-cert.pem", "./soil-moisture-sensor-x509-key.pem") + ``` + + Dette vil oprette klassen `X509` ved hjælp af filerne `soil-moisture-sensor-x509-cert.pem` og `soil-moisture-sensor-x509-key.pem`, som blev oprettet tidligere. + +1. Erstat linjen med kode, der opretter `device_client` fra en forbindelsesstreng, med følgende: + + ```python + device_client = IoTHubDeviceClient.create_from_x509_certificate(x509, host_name, device_id) + ``` + + Dette vil forbinde ved hjælp af X.509-certifikatet i stedet for en forbindelsesstreng. + +1. Slet linjen med variablen `connection_string`. + +1. Kør din kode. Overvåg de beskeder, der sendes til IoT Hub, og send direkte metodeanmodninger som før. Du vil se enheden forbinde og sende målinger af jordfugtighed samt modtage direkte metodeanmodninger. + +> 💁 Du kan finde denne kode i mappen [code/pi](../../../../../2-farm/lessons/6-keep-your-plant-secure/code/pi) eller [code/virtual-device](../../../../../2-farm/lessons/6-keep-your-plant-secure/code/virtual-device). + +😀 Dit program til jordfugtighedssensoren er nu forbundet til din IoT Hub ved hjælp af et X.509-certifikat! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md b/translations/da/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md new file mode 100644 index 00000000..5415fa7a --- /dev/null +++ b/translations/da/2-farm/lessons/6-keep-your-plant-secure/wio-terminal-x509.md @@ -0,0 +1,17 @@ + +# Brug X.509-certifikatet i din enhedskode - Wio Terminal + +På tidspunktet for skrivningen understøtter Azure Arduino SDK ikke X.509-certifikater. Hvis du ønsker at eksperimentere med X.509-certifikater, kan du henvise til [Virtuelle IoT-enhedsinstruktioner ved brug af Python SDK](single-board-computer-x509.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/3-transport/README.md b/translations/da/3-transport/README.md new file mode 100644 index 00000000..e9a22b64 --- /dev/null +++ b/translations/da/3-transport/README.md @@ -0,0 +1,38 @@ + +# Transport fra gård til fabrik - brug af IoT til at spore fødevareleverancer + +Mange landmænd dyrker fødevarer til salg - enten er de kommercielle landmænd, der sælger alt, hvad de dyrker, eller også er de selvforsynende landmænd, der sælger deres overskudsproduktion for at købe nødvendigheder. På en eller anden måde skal fødevarerne transporteres fra gården til forbrugeren, og dette afhænger normalt af bulktransport fra gårde til knudepunkter eller forarbejdningsanlæg og derefter til butikker. For eksempel vil en tomatdyrker høste tomater, pakke dem i kasser, læsse kasserne på en lastbil og derefter levere dem til et forarbejdningsanlæg. Tomaterne vil derefter blive sorteret og derfra leveret til forbrugerne i form af forarbejdede fødevarer, detailsalg eller som ingredienser på restauranter. + +IoT kan hjælpe med denne forsyningskæde ved at spore fødevarerne under transport - sikre, at chaufførerne kører, hvor de skal, overvåge køretøjernes placeringer og få besked, når køretøjerne ankommer, så fødevarerne kan losses og være klar til forarbejdning så hurtigt som muligt. + +> 🎓 En *forsyningskæde* er rækkefølgen af aktiviteter, der skal til for at fremstille og levere noget. For eksempel, i tomatdyrkning dækker det frø, jord, gødning og vandforsyning, dyrkning af tomater, levering af tomater til et centralt knudepunkt, transport til et supermarkeds lokale knudepunkt, transport til det enkelte supermarked, udstilling i butikken, salg til en forbruger og hjemtagning for at spise. Hvert trin er som et led i en kæde. + +> 🎓 Transportdelen af forsyningskæden kaldes *logistik*. + +I disse 4 lektioner lærer du, hvordan du anvender Internet of Things til at forbedre forsyningskæden ved at overvåge fødevarer, mens de læsses på en (virtuel) lastbil, som spores, mens den bevæger sig mod sin destination. Du vil lære om GPS-sporing, hvordan man gemmer og visualiserer GPS-data, og hvordan man modtager besked, når en lastbil ankommer til sin destination. + +> 💁 Disse lektioner vil bruge nogle cloud-ressourcer. Hvis du ikke gennemfører alle lektionerne i dette projekt, skal du sørge for at [rydde op i dit projekt](../clean-up.md). + +## Emner + +1. [Sporing af placering](lessons/1-location-tracking/README.md) +1. [Gem placeringdata](lessons/2-store-location-data/README.md) +1. [Visualiser placeringdata](lessons/3-visualize-location-data/README.md) +1. [Geofences](lessons/4-geofences/README.md) + +## Credits + +Alle lektionerne er skrevet med ♥️ af [Jen Looper](https://github.com/jlooper) og [Jim Bennett](https://GitHub.com/JimBobBennett) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/3-transport/lessons/1-location-tracking/README.md b/translations/da/3-transport/lessons/1-location-tracking/README.md new file mode 100644 index 00000000..90efae44 --- /dev/null +++ b/translations/da/3-transport/lessons/1-location-tracking/README.md @@ -0,0 +1,216 @@ + +# Sporing af placering + +![En sketchnote oversigt over denne lektion](../../../../../translated_images/lesson-11.9fddbac4b664c6d50ab7ac9bb32f1fc3f945f03760e72f7f43938073762fb017.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/21) + +## Introduktion + +Hovedprocessen for at få mad fra en landmand til en forbruger indebærer at læsse kasser med produkter på lastbiler, skibe, fly eller andre kommercielle transportmidler og levere maden et sted - enten direkte til en kunde eller til et centralt knudepunkt eller lager til videre behandling. Hele processen fra landmand til forbruger er en del af en proces kaldet *forsyningskæden*. Videoen nedenfor fra Arizona State University's W. P. Carey School of Business forklarer idéen om forsyningskæden og hvordan den administreres i mere detaljeret grad. + +[![Hvad er Supply Chain Management? En video fra Arizona State University's W. P. Carey School of Business](https://img.youtube.com/vi/Mi1QBxVjZAw/0.jpg)](https://www.youtube.com/watch?v=Mi1QBxVjZAw) + +> 🎥 Klik på billedet ovenfor for at se videoen + +Tilføjelse af IoT-enheder kan drastisk forbedre din forsyningskæde, hvilket giver dig mulighed for at administrere, hvor varer befinder sig, planlægge transport og varehåndtering bedre og reagere hurtigere på problemer. + +Når man administrerer en flåde af køretøjer som lastbiler, er det nyttigt at vide, hvor hvert køretøj befinder sig på et givet tidspunkt. Køretøjer kan udstyres med GPS-sensorer, der sender deres placering til IoT-systemer, hvilket giver ejerne mulighed for at finde deres placering, se den rute, de har taget, og vide, hvornår de vil ankomme til deres destination. De fleste køretøjer opererer uden for WiFi-dækning, så de bruger mobilnetværk til at sende denne type data. Nogle gange er GPS-sensoren indbygget i mere komplekse IoT-enheder som elektroniske logbøger. Disse enheder sporer, hvor længe en lastbil har været i transit for at sikre, at chauffører overholder lokale love om arbejdstid. + +I denne lektion vil du lære, hvordan du sporer et køretøjs placering ved hjælp af en Global Positioning System (GPS)-sensor. + +I denne lektion dækker vi: + +* [Forbundne køretøjer](../../../../../3-transport/lessons/1-location-tracking) +* [Geospatiale koordinater](../../../../../3-transport/lessons/1-location-tracking) +* [Global Positioning Systems (GPS)](../../../../../3-transport/lessons/1-location-tracking) +* [Læs GPS-sensordata](../../../../../3-transport/lessons/1-location-tracking) +* [NMEA GPS-data](../../../../../3-transport/lessons/1-location-tracking) +* [Dekod GPS-sensordata](../../../../../3-transport/lessons/1-location-tracking) + +## Forbundne køretøjer + +IoT ændrer måden, varer transporteres på, ved at skabe flåder af *forbundne køretøjer*. Disse køretøjer er forbundet til centrale IT-systemer, der rapporterer information om deres placering og andre sensordata. At have en flåde af forbundne køretøjer har en bred vifte af fordele: + +* Sporing af placering - du kan finde ud af, hvor et køretøj befinder sig på ethvert tidspunkt, hvilket giver dig mulighed for at: + + * Modtage advarsler, når et køretøj er ved at ankomme til en destination, så et team kan forberede sig på aflæsning + * Lokalisere stjålne køretøjer + * Kombinere placering og rutedata med trafikproblemer for at give mulighed for at omdirigere køretøjer midt på rejsen + * Overholde skat. Nogle lande opkræver køretøjer for den mængde kilometer, der køres på offentlige veje (såsom [New Zealands RUC](https://www.nzta.govt.nz/vehicles/licensing-rego/road-user-charges/)), så det er lettere at beregne skyldig skat, når man ved, hvornår et køretøj er på offentlige veje kontra private veje. + * Vide, hvor man skal sende vedligeholdelsesteams i tilfælde af nedbrud + +* Chaufførtelemetri - sikre, at chauffører overholder hastighedsgrænser, tager sving med passende hastighed, bremser tidligt og effektivt og kører sikkert. Forbundne køretøjer kan også have kameraer til at optage hændelser. Dette kan kobles til forsikring, hvilket giver lavere satser for gode chauffører. + +* Overholdelse af chaufførens arbejdstimer - sikre, at chauffører kun kører inden for deres lovligt tilladte timer baseret på de tidspunkter, de tænder og slukker motoren. + +Disse fordele kan kombineres - for eksempel ved at kombinere overholdelse af chaufførens arbejdstimer med sporing af placering for at omdirigere chauffører, hvis de ikke kan nå deres destination inden for deres tilladte køretimer. Disse kan også kombineres med anden køretøjsspecifik telemetri, såsom temperaturdata fra temperaturkontrollerede lastbiler, hvilket gør det muligt at omdirigere køretøjer, hvis deres nuværende rute betyder, at varer ikke kan holdes ved den rette temperatur. + +> 🎓 Logistik er processen med at transportere varer fra et sted til et andet, såsom fra en gård til et supermarked via et eller flere lagre. En landmand pakker kasser med tomater, der læsses på en lastbil, leveres til et centralt lager og læsses på en anden lastbil, der kan indeholde en blanding af forskellige typer produkter, som derefter leveres til et supermarked. + +Den centrale komponent i køretøjssporing er GPS - sensorer, der kan finde deres placering hvor som helst på Jorden. I denne lektion vil du lære, hvordan du bruger en GPS-sensor, begyndende med at lære, hvordan man definerer en placering på Jorden. + +## Geospatiale koordinater + +Geospatiale koordinater bruges til at definere punkter på Jordens overflade, på samme måde som koordinater kan bruges til at tegne en pixel på en computerskærm eller placere sting i korssting. For et enkelt punkt har du et par koordinater. For eksempel ligger Microsoft Campus i Redmond, Washington, USA på 47.6423109, -122.1390293. + +### Breddegrad og længdegrad + +Jorden er en kugle - en tredimensionel cirkel. På grund af dette defineres punkter ved at opdele den i 360 grader, det samme som geometrien af cirkler. Breddegrad måler antallet af grader nord til syd, længdegrad måler antallet af grader øst til vest. + +> 💁 Ingen ved helt præcist, hvorfor cirkler oprindeligt blev opdelt i 360 grader. [Wikipedia-siden om grader (vinkel)](https://wikipedia.org/wiki/Degree_(angle)) dækker nogle af de mulige årsager. + +![Linjer af breddegrad fra 90° ved Nordpolen, 45° halvvejs mellem Nordpolen og ækvator, 0° ved ækvator, -45° halvvejs mellem ækvator og Sydpolen og -90° ved Sydpolen](../../../../../translated_images/latitude-lines.11d8d91dfb2014a57437272d7db7fd6607243098e8685f06e0c5f1ec984cb7eb.da.png) + +Breddegrad måles ved hjælp af linjer, der cirkler Jorden og løber parallelt med ækvator, og opdeler den nordlige og sydlige halvkugle i hver 90°. Ækvator er ved 0°, Nordpolen er ved 90°, også kendt som 90° Nord, og Sydpolen er ved -90°, eller 90° Syd. + +Længdegrad måles som antallet af grader målt øst og vest. 0°-udgangspunktet for længdegrad kaldes *Prime Meridian* og blev i 1884 defineret som en linje fra Nordpolen til Sydpolen, der går gennem [British Royal Observatory i Greenwich, England](https://wikipedia.org/wiki/Royal_Observatory,_Greenwich). + +![Linjer af længdegrad, der går fra -180° vest for Prime Meridian, til 0° på Prime Meridian, til 180° øst for Prime Meridian](../../../../../translated_images/longitude-meridians.ab4ef1c91c064586b0185a3c8d39e585903696c6a7d28c098a93a629cddb5d20.da.png) + +> 🎓 En meridian er en imaginær lige linje, der går fra Nordpolen til Sydpolen og danner en halvcirkel. + +For at måle længdegraden af et punkt måler du antallet af grader rundt om ækvator fra Prime Meridian til en meridian, der passerer gennem det punkt. Længdegrad går fra -180°, eller 180° Vest, gennem 0° ved Prime Meridian, til 180°, eller 180° Øst. 180° og -180° refererer til det samme punkt, antimeridianen eller den 180. meridian. Dette er en meridian på den modsatte side af Jorden fra Prime Meridian. + +> 💁 Antimeridianen må ikke forveksles med den internationale datolinje, som ligger omtrent samme sted, men ikke er en lige linje og varierer for at passe til geo-politiske grænser. + +✅ Lav lidt research: Prøv at finde bredde- og længdegraden for din nuværende placering. + +### Grader, minutter og sekunder vs decimale grader + +Traditionelt blev målinger af grader af bredde- og længdegrad udført ved hjælp af sexagesimal nummerering, eller base-60, et nummereringssystem brugt af de gamle babylonere, der foretog de første målinger og registreringer af tid og afstand. Du bruger sexagesimal hver dag, sandsynligvis uden at være klar over det - ved at opdele timer i 60 minutter og minutter i 60 sekunder. + +Længde- og breddegrad måles i grader, minutter og sekunder, hvor et minut er 1/60 af en grad, og 1 sekund er 1/60 minut. + +For eksempel ved ækvator: + +* 1° breddegrad er **111,3 kilometer** +* 1 minut breddegrad er 111,3/60 = **1,855 kilometer** +* 1 sekund breddegrad er 1,855/60 = **0,031 kilometer** + +Symbolet for et minut er en enkelt apostrof, for et sekund er det en dobbelt apostrof. 2 grader, 17 minutter og 43 sekunder ville for eksempel blive skrevet som 2°17'43". Dele af sekunder gives som decimaler, for eksempel er en halv sekund 0°0'0.5". + +Computere arbejder ikke i base-60, så disse koordinater gives som decimale grader, når GPS-data bruges i de fleste computersystemer. For eksempel er 2°17'43" 2.295277. Gradsymbolet udelades normalt. + +Koordinater for et punkt gives altid som `breddegrad, længdegrad`, så eksemplet tidligere med Microsoft Campus på 47.6423109,-122.117198 har: + +* En breddegrad på 47.6423109 (47.6423109 grader nord for ækvator) +* En længdegrad på -122.1390293 (122.1390293 grader vest for Prime Meridian). + +![Microsoft Campus på 47.6423109,-122.117198](../../../../../translated_images/microsoft-gps-location-world.a321d481b010f6adfcca139b2ba0adc53b79f58a540495b8e2ce7f779ea64bfe.da.png) + +## Global Positioning Systems (GPS) + +GPS-systemer bruger flere satellitter, der kredser om Jorden, til at finde din position. Du har sandsynligvis brugt GPS-systemer uden at vide det - til at finde din placering på en kortapp på din telefon som Apple Maps eller Google Maps, eller til at se, hvor din transport er i en app som Uber eller Lyft, eller når du bruger satellitnavigation (sat-nav) i din bil. + +> 🎓 Satellitterne i 'satellitnavigation' er GPS-satellitter! + +GPS-systemer fungerer ved at have et antal satellitter, der sender et signal med hver satellits aktuelle position og en præcis tidsstempel. Disse signaler sendes via radiobølger og opfanges af en antenne i GPS-sensoren. En GPS-sensor vil opfange disse signaler og ved hjælp af den aktuelle tid måle, hvor lang tid det tog for signalet at nå sensoren fra satellitten. Da hastigheden af radiobølger er konstant, kan GPS-sensoren bruge tidsstemplet, der blev sendt, til at beregne, hvor langt sensoren er fra satellitten. Ved at kombinere data fra mindst 3 satellitter med de sendte positioner kan GPS-sensoren finde sin placering på Jorden. + +> 💁 GPS-sensorer har brug for antenner for at opfange radiobølger. Antennerne, der er indbygget i lastbiler og biler med indbygget GPS, er placeret for at få et godt signal, normalt på forruden eller taget. Hvis du bruger et separat GPS-system, såsom en smartphone eller en IoT-enhed, skal du sikre dig, at antennen, der er indbygget i GPS-systemet eller telefonen, har frit udsyn til himlen, såsom at være monteret på din forrude. + +![Ved at kende afstanden fra sensoren til flere satellitter kan placeringen beregnes](../../../../../translated_images/gps-satellites.04acf1148fe25fbf1586bc2e8ba698e8d79b79a50c36824b38417dd13372b90f.da.png) + +GPS-satellitter kredser om Jorden, ikke på et fast punkt over sensoren, så placeringsdata inkluderer højde over havets overflade samt bredde- og længdegrad. + +GPS havde tidligere begrænsninger på nøjagtighed, som blev håndhævet af det amerikanske militær, hvilket begrænsede nøjagtigheden til omkring 5 meter. Denne begrænsning blev fjernet i 2000, hvilket tillod en nøjagtighed på 30 centimeter. Det er dog ikke altid muligt at opnå denne nøjagtighed på grund af interferens med signalerne. + +✅ Hvis du har en smartphone, start kortappen og se, hvor præcis din placering er. Det kan tage lidt tid for din telefon at opfange signaler fra flere satellitter for at få en mere præcis placering. +💁 Satellitterne indeholder atomure, der er utroligt præcise, men de afviger med 38 mikrosekunder (0,0000038 sekunder) om dagen sammenlignet med atomure på Jorden. Dette skyldes, at tiden går langsommere, når hastigheden øges, som forudsagt af Einsteins teorier om speciel og generel relativitet - satellitterne bevæger sig hurtigere end Jordens rotation. Denne afvigelse er blevet brugt til at bevise forudsigelserne i speciel og generel relativitet og skal justeres i designet af GPS-systemer. Bogstaveligt talt går tiden langsommere på en GPS-satellit. +GPS-systemer er blevet udviklet og implementeret af en række lande og politiske unioner, herunder USA, Rusland, Japan, Indien, EU og Kina. Moderne GPS-sensorer kan forbinde til de fleste af disse systemer for at opnå hurtigere og mere præcise positioner. + +> 🎓 Grupperne af satellitter i hver implementering kaldes konstellationer. + +## Læs GPS-sensordata + +De fleste GPS-sensorer sender GPS-data via UART. + +> ⚠️ UART blev gennemgået i [projekt 2, lektion 2](../../../2-farm/lessons/2-detect-soil-moisture/README.md#universal-asynchronous-receiver-transmitter-uart). Gå tilbage til den lektion, hvis det er nødvendigt. + +Du kan bruge en GPS-sensor på din IoT-enhed til at hente GPS-data. + +### Opgave - tilslut en GPS-sensor og læs GPS-data + +Følg den relevante vejledning for at læse GPS-data med din IoT-enhed: + +* [Arduino - Wio Terminal](wio-terminal-gps-sensor.md) +* [Single-board computer - Raspberry Pi](pi-gps-sensor.md) +* [Single-board computer - Virtuel enhed](virtual-device-gps-sensor.md) + +## NMEA GPS-data + +Når du kørte din kode, så du måske noget, der lignede volapyk i outputtet. Dette er faktisk standard GPS-data, og det har alt sammen en betydning. + +GPS-sensorer udsender data ved hjælp af NMEA-beskeder, som følger NMEA 0183-standarden. NMEA er en forkortelse for [National Marine Electronics Association](https://www.nmea.org), en amerikansk handelsorganisation, der fastsætter standarder for kommunikation mellem marinelektronik. + +> 💁 Denne standard er proprietær og koster mindst 2.000 USD, men der er nok information i det offentlige domæne til, at det meste af standarden er blevet reverse-engineered og kan bruges i open source og anden ikke-kommerciel kode. + +Disse beskeder er tekstbaserede. Hver besked består af en *sætning*, der starter med et `$`-tegn, efterfulgt af 2 tegn, der angiver kilden til beskeden (f.eks. GP for det amerikanske GPS-system, GN for GLONASS, det russiske GPS-system), og 3 tegn, der angiver typen af besked. Resten af beskeden er felter adskilt af kommaer, der slutter med et linjeskift. + +Nogle af de typer beskeder, der kan modtages, er: + +| Type | Beskrivelse | +| ---- | ----------- | +| GGA | GPS Fix Data, inklusive breddegrad, længdegrad og højde for GPS-sensoren samt antallet af satellitter i sigte for at beregne denne position. | +| ZDA | Den aktuelle dato og tid, inklusive den lokale tidszone | +| GSV | Detaljer om satellitter i sigte - defineret som de satellitter, GPS-sensoren kan opfange signaler fra | + +> 💁 GPS-data inkluderer tidsstempler, så din IoT-enhed kan hente tiden fra en GPS-sensor, hvis det er nødvendigt, i stedet for at stole på en NTP-server eller en intern realtidsur. + +GGA-beskeden inkluderer den aktuelle position i formatet `(dd)dmm.mmmm`, sammen med et enkelt tegn, der angiver retning. `d` i formatet er grader, `m` er minutter, og sekunder er angivet som decimaler af minutter. For eksempel ville 2°17'43" være 217.716666667 - 2 grader, 17.716666667 minutter. + +Retningstegnet kan være `N` eller `S` for breddegrad for at angive nord eller syd, og `E` eller `W` for længdegrad for at angive øst eller vest. For eksempel ville en breddegrad på 2°17'43" have et retningstegn `N`, mens -2°17'43" ville have et retningstegn `S`. + +For eksempel - NMEA-sætningen `$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67` + +* Breddegradsdelen er `4738.538654,N`, som konverteres til 47.6423109 i decimalgrader. `4738.538654` er 47.6423109, og retningen er `N` (nord), så det er en positiv breddegrad. + +* Længdegradsdelen er `12208.341758,W`, som konverteres til -122.1390293 i decimalgrader. `12208.341758` er 122.1390293°, og retningen er `W` (vest), så det er en negativ længdegrad. + +## Dekod GPS-sensordata + +I stedet for at bruge de rå NMEA-data er det bedre at dekode dem til et mere brugbart format. Der findes flere open source-biblioteker, du kan bruge til at hjælpe med at udtrække nyttige data fra de rå NMEA-beskeder. + +### Opgave - dekod GPS-sensordata + +Følg den relevante vejledning for at dekode GPS-sensordata med din IoT-enhed: + +* [Arduino - Wio Terminal](wio-terminal-gps-decode.md) +* [Single-board computer - Raspberry Pi/Virtuel IoT-enhed](single-board-computer-gps-decode.md) + +--- + +## 🚀 Udfordring + +Skriv din egen NMEA-dekoder! I stedet for at stole på tredjepartsbiblioteker til at dekode NMEA-sætninger, kan du prøve at skrive din egen dekoder til at udtrække breddegrad og længdegrad fra NMEA-sætninger. + +## Quiz efter lektionen + +[Quiz efter lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/22) + +## Gennemgang & Selvstudie + +* Læs mere om geospatiale koordinater på [Geografisk koordinatsystem-siden på Wikipedia](https://wikipedia.org/wiki/Geographic_coordinate_system). +* Læs om nulmeridianer på andre himmellegemer end Jorden på [Nulmeridian-siden på Wikipedia](https://wikipedia.org/wiki/Prime_meridian#Prime_meridian_on_other_planetary_bodies). +* Undersøg de forskellige GPS-systemer fra forskellige regeringer og politiske unioner som EU, Japan, Rusland, Indien og USA. + +## Opgave + +[Undersøg andre GPS-data](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/3-transport/lessons/1-location-tracking/assignment.md b/translations/da/3-transport/lessons/1-location-tracking/assignment.md new file mode 100644 index 00000000..9e50fa2e --- /dev/null +++ b/translations/da/3-transport/lessons/1-location-tracking/assignment.md @@ -0,0 +1,29 @@ + +# Undersøg andre GPS-data + +## Instruktioner + +NMEA-sætningerne fra din GPS-sensor indeholder andre data ud over lokation. Undersøg de ekstra data, og brug dem i din IoT-enhed. + +For eksempel - kan du få den aktuelle dato og tid? Hvis du bruger en mikrocontroller, kan du så indstille uret ved hjælp af GPS-data på samme måde, som du gjorde med NTP-signaler i det tidligere projekt? Kan du få højde (din højde over havets overflade) eller din aktuelle hastighed? + +Hvis du bruger en virtuel IoT-enhed, kan du få nogle af disse data ved at sende NMEA-sætninger genereret ved hjælp af værktøjer [nmeagen.org](https://www.nmeagen.org). + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilstrækkelig | Kræver forbedring | +| --------- | ----------- | ------------- | ----------------- | +| Få flere GPS-data | Er i stand til at få og bruge flere GPS-data, enten som telemetri eller til at konfigurere IoT-enheden | Er i stand til at få flere GPS-data, men kan ikke bruge dem | Er ikke i stand til at få flere GPS-data | + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/3-transport/lessons/1-location-tracking/pi-gps-sensor.md b/translations/da/3-transport/lessons/1-location-tracking/pi-gps-sensor.md new file mode 100644 index 00000000..e8f3cf5d --- /dev/null +++ b/translations/da/3-transport/lessons/1-location-tracking/pi-gps-sensor.md @@ -0,0 +1,193 @@ + +# Læs GPS-data - Raspberry Pi + +I denne del af lektionen vil du tilføje en GPS-sensor til din Raspberry Pi og læse værdier fra den. + +## Hardware + +Raspberry Pi'en har brug for en GPS-sensor. + +Den sensor, du skal bruge, er en [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Denne sensor kan forbinde til flere GPS-systemer for en hurtig og præcis positionering. Sensoren består af to dele - sensorens kerneelektronik og en ekstern antenne, der er forbundet med en tynd ledning for at opfange radiosignaler fra satellitterne. + +Dette er en UART-sensor, så den sender GPS-data via UART. + +## Tilslut GPS-sensoren + +Grove GPS-sensoren kan tilsluttes Raspberry Pi'en. + +### Opgave - tilslut GPS-sensoren + +Tilslut GPS-sensoren. + +![En Grove GPS-sensor](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.da.png) + +1. Sæt den ene ende af et Grove-kabel i stikket på GPS-sensoren. Det kan kun sættes i på én måde. + +1. Med Raspberry Pi'en slukket, tilslut den anden ende af Grove-kablet til UART-stikket markeret **UART** på Grove Base-hatten, der er tilsluttet Pi'en. Dette stik er placeret på den midterste række, på siden tættest på SD-kortslottet, i den modsatte ende af USB-portene og ethernet-stikket. + + ![Grove GPS-sensoren tilsluttet UART-stikket](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.da.png) + +1. Placer GPS-sensoren, så den tilkoblede antenne har udsyn til himlen - ideelt set ved et åbent vindue eller udenfor. Det er lettere at få et klart signal uden forhindringer foran antennen. + +## Programmer GPS-sensoren + +Raspberry Pi'en kan nu programmeres til at bruge den tilsluttede GPS-sensor. + +### Opgave - programmer GPS-sensoren + +Programmer enheden. + +1. Tænd for Pi'en og vent, indtil den er startet op. + +1. GPS-sensoren har 2 LED'er - en blå LED, der blinker, når data overføres, og en grøn LED, der blinker hvert sekund, når den modtager data fra satellitter. Sørg for, at den blå LED blinker, når du tænder Pi'en. Efter et par minutter vil den grønne LED begynde at blinke - hvis ikke, kan det være nødvendigt at flytte antennen. + +1. Start VS Code, enten direkte på Pi'en eller ved at forbinde via Remote SSH-udvidelsen. + + > ⚠️ Du kan finde [instruktionerne til opsætning og start af VS Code i lektion 1, hvis det er nødvendigt](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md). + +1. Med nyere versioner af Raspberry Pi, der understøtter Bluetooth, er der en konflikt mellem den serielle port, der bruges til Bluetooth, og den, der bruges af Grove UART-porten. For at løse dette skal du gøre følgende: + + 1. Fra VS Code-terminalen skal du redigere filen `/boot/config.txt` ved hjælp af `nano`, en indbygget terminalteksteditor, med følgende kommando: + + ```sh + sudo nano /boot/config.txt + ``` + + > Denne fil kan ikke redigeres i VS Code, da du skal bruge `sudo`-rettigheder, en forhøjet tilladelse. VS Code kører ikke med denne tilladelse. + + 1. Brug piletasterne til at navigere til slutningen af filen, og kopier derefter koden nedenfor og indsæt den i slutningen af filen: + + ```ini + dtoverlay=pi3-miniuart-bt + dtoverlay=pi3-disable-bt + enable_uart=1 + ``` + + Du kan indsætte ved at bruge de normale tastaturgenveje for din enhed (`Ctrl+v` på Windows, Linux eller Raspberry Pi OS, `Cmd+v` på macOS). + + 1. Gem filen og afslut nano ved at trykke på `Ctrl+x`. Tryk på `y`, når du bliver spurgt, om du vil gemme den ændrede buffer, og tryk derefter på `enter` for at bekræfte, at du vil overskrive `/boot/config.txt`. + + > Hvis du laver en fejl, kan du afslutte uden at gemme og derefter gentage disse trin. + + 1. Rediger filen `/boot/cmdline.txt` i nano med følgende kommando: + + ```sh + sudo nano /boot/cmdline.txt + ``` + + 1. Denne fil indeholder en række nøgle/værdi-par adskilt af mellemrum. Fjern eventuelle nøgle/værdi-par for nøglen `console`. De vil sandsynligvis se sådan ud: + + ```output + console=serial0,115200 console=tty1 + ``` + + Du kan navigere til disse poster ved hjælp af piletasterne og derefter slette dem ved hjælp af de normale `del`- eller `backspace`-taster. + + For eksempel, hvis din oprindelige fil ser sådan ud: + + ```output + console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait + ``` + + Den nye version vil være: + + ```output + root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait + ``` + + 1. Følg ovenstående trin for at gemme denne fil og afslutte nano. + + 1. Genstart din Pi, og forbind derefter igen i VS Code, når Pi'en er genstartet. + +1. Fra terminalen skal du oprette en ny mappe i `pi`-brugerens hjemmemappe kaldet `gps-sensor`. Opret en fil i denne mappe kaldet `app.py`. + +1. Åbn denne mappe i VS Code. + +1. GPS-modulet sender UART-data via en seriel port. Installer `pyserial` Pip-pakken for at kommunikere med den serielle port fra din Python-kode: + + ```sh + pip3 install pyserial + ``` + +1. Tilføj følgende kode til din `app.py`-fil: + + ```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) + ``` + + Denne kode importerer `serial`-modulet fra `pyserial` Pip-pakken. Den opretter derefter forbindelse til den serielle port `/dev/ttyAMA0` - dette er adressen på den serielle port, som Grove Pi Base Hat bruger til sin UART-port. Den rydder derefter eventuelle eksisterende data fra denne serielle forbindelse. + + Derefter defineres en funktion kaldet `print_gps_data`, der udskriver den linje, der sendes til den, til konsollen. + + Dernæst kører koden i en uendelig løkke, hvor den læser så mange tekstlinjer som muligt fra den serielle port i hver iteration. Den kalder funktionen `print_gps_data` for hver linje. + + Når alle data er læst, sover løkken i 1 sekund og prøver derefter igen. + +1. Kør denne kode. Du vil se rå output fra GPS-sensoren, noget i stil med følgende: + + ```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 + ``` + + > Hvis du får en af følgende fejl, når du stopper og genstarter din kode, skal du tilføje en `try - except`-blok til din while-løkke. + + ```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) + ``` + +> 💁 Du kan finde denne kode i [code-gps/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps/pi)-mappen. + +😀 Dit GPS-sensorprogram var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md b/translations/da/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md new file mode 100644 index 00000000..4554af54 --- /dev/null +++ b/translations/da/3-transport/lessons/1-location-tracking/single-board-computer-gps-decode.md @@ -0,0 +1,75 @@ + +# Dekodér GPS-data - Virtuel IoT-hardware og Raspberry Pi + +I denne del af lektionen vil du dekodere NMEA-beskeder, der er læst fra GPS-sensoren af Raspberry Pi eller Virtuel IoT-enhed, og udtrække bredde- og længdegrad. + +## Dekodér GPS-data + +Når de rå NMEA-data er blevet læst fra den serielle port, kan de dekodes ved hjælp af et open source NMEA-bibliotek. + +### Opgave - dekodér GPS-data + +Programmer enheden til at dekodere GPS-data. + +1. Åbn `gps-sensor`-app-projektet, hvis det ikke allerede er åbent. + +1. Installer `pynmea2` Pip-pakken. Denne pakke indeholder kode til dekodering af NMEA-beskeder. + + ```sh + pip3 install pynmea2 + ``` + +1. Tilføj følgende kode til imports i `app.py`-filen for at importere `pynmea2`-modulet: + + ```python + import pynmea2 + ``` + +1. Erstat indholdet af funktionen `print_gps_data` med følgende: + + ```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') + ``` + + Denne kode vil bruge `pynmea2`-biblioteket til at analysere linjen, der er læst fra UART-serielporten. + + Hvis sætningstypen for beskeden er `GGA`, er dette en positionsfix-besked og behandles. Bredde- og længdegradsværdierne læses fra beskeden og konverteres til decimalgrader fra NMEA-formatet `(d)ddmm.mmmm`. Funktionen `dm_to_sd` udfører denne konvertering. + + Retningen for breddegraden kontrolleres derefter, og hvis breddegraden er syd, konverteres værdien til et negativt tal. Det samme gælder for længdegraden; hvis den er vest, konverteres den til et negativt tal. + + Til sidst udskrives koordinaterne til konsollen sammen med antallet af satellitter, der blev brugt til at bestemme positionen. + +1. Kør koden. Hvis du bruger en virtuel IoT-enhed, skal du sørge for, at CounterFit-appen kører, og at GPS-dataene bliver sendt. + + ```output + pi@raspberrypi:~/gps-sensor $ python3 app.py + 47.6423109,-122.1390293 - from 3 satellites + ``` + +> 💁 Du kan finde denne kode i mappen [code-gps-decode/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/virtual-device) eller mappen [code-gps-decode/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/pi). + +😀 Dit GPS-sensorprogram med datadekodering var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md b/translations/da/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md new file mode 100644 index 00000000..f407bcb3 --- /dev/null +++ b/translations/da/3-transport/lessons/1-location-tracking/virtual-device-gps-sensor.md @@ -0,0 +1,144 @@ + +# Læs GPS-data - Virtuel IoT-hardware + +I denne del af lektionen vil du tilføje en GPS-sensor til din virtuelle IoT-enhed og læse værdier fra den. + +## Virtuel hardware + +Den virtuelle IoT-enhed vil bruge en simuleret GPS-sensor, der er tilgængelig via UART gennem en seriel port. + +En fysisk GPS-sensor har en antenne til at opfange radiobølger fra GPS-satellitter og konvertere GPS-signaler til GPS-data. Den virtuelle version simulerer dette ved at lade dig enten indstille en bredde- og længdegrad, sende rå NMEA-sætninger eller uploade en GPX-fil med flere lokationer, der kan returneres sekventielt. + +> 🎓 NMEA-sætninger vil blive gennemgået senere i denne lektion + +### Tilføj sensoren til CounterFit + +For at bruge en virtuel GPS-sensor skal du tilføje en til CounterFit-appen. + +#### Opgave - tilføj sensoren til CounterFit + +Tilføj GPS-sensoren til CounterFit-appen. + +1. Opret en ny Python-app på din computer i en mappe kaldet `gps-sensor` med en enkelt fil kaldet `app.py` og et Python-virtuelt miljø, og tilføj CounterFit pip-pakkerne. + + > ⚠️ Du kan henvise til [instruktionerne for at oprette og opsætte et CounterFit Python-projekt i lektion 1, hvis nødvendigt](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md). + +1. Installer en ekstra Pip-pakke for at installere en CounterFit shim, der kan kommunikere med UART-baserede sensorer via en seriel forbindelse. Sørg for, at du installerer dette fra en terminal med det virtuelle miljø aktiveret. + + ```sh + pip install counterfit-shims-serial + ``` + +1. Sørg for, at CounterFit-webappen kører. + +1. Opret en GPS-sensor: + + 1. I boksen *Create sensor* i panelet *Sensors*, vælg *Sensor type* og vælg *UART GPS*. + + 1. Lad *Port* være indstillet til */dev/ttyAMA0*. + + 1. Vælg knappen **Add** for at oprette GPS-sensoren på porten `/dev/ttyAMA0`. + + ![Indstillinger for GPS-sensoren](../../../../../translated_images/counterfit-create-gps-sensor.6385dc9357d85ad1d47b4abb2525e7651fd498917d25eefc5a72feab09eedc70.da.png) + + GPS-sensoren vil blive oprettet og vises i sensorlisten. + + ![Den oprettede GPS-sensor](../../../../../translated_images/counterfit-gps-sensor.3fbb15af0a5367566f2f11324ef5a6f30861cdf2b497071a5e002b7aa473550e.da.png) + +## Programmer GPS-sensoren + +Den virtuelle IoT-enhed kan nu programmeres til at bruge den virtuelle GPS-sensor. + +### Opgave - programmer GPS-sensoren + +Programmer GPS-sensor-appen. + +1. Sørg for, at `gps-sensor`-appen er åben i VS Code. + +1. Åbn filen `app.py`. + +1. Tilføj følgende kode øverst i `app.py` for at forbinde appen til CounterFit: + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Tilføj følgende kode nedenunder for at importere nogle nødvendige biblioteker, inklusive biblioteket til CounterFit-seriel port: + + ```python + import time + import counterfit_shims_serial + + serial = counterfit_shims_serial.Serial('/dev/ttyAMA0') + ``` + + Denne kode importerer `serial`-modulet fra Pip-pakken `counterfit_shims_serial`. Den forbinder derefter til den serielle port `/dev/ttyAMA0` - dette er adressen på den serielle port, som den virtuelle GPS-sensor bruger til sin UART-port. + +1. Tilføj følgende kode nedenunder for at læse fra den serielle port og udskrive værdierne til konsollen: + + ```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) + ``` + + En funktion kaldet `print_gps_data` defineres, som udskriver den linje, der sendes til den, til konsollen. + + Derefter kører koden i en uendelig løkke, hvor den læser så mange tekstlinjer som muligt fra den serielle port i hver iteration. Den kalder funktionen `print_gps_data` for hver linje. + + Når alle data er læst, sover løkken i 1 sekund og prøver derefter igen. + +1. Kør denne kode, og sørg for, at du bruger en anden terminal end den, hvor CounterFit-appen kører, så CounterFit-appen forbliver aktiv. + +1. Fra CounterFit-appen kan du ændre værdien af GPS-sensoren. Du kan gøre dette på en af følgende måder: + + * Indstil **Source** til `Lat/Lon`, og angiv en specifik breddegrad, længdegrad og antal satellitter, der bruges til at få GPS-fix. Denne værdi sendes kun én gang, så marker **Repeat**-boksen for at få dataene til at gentage hvert sekund. + + ![GPS-sensoren med lat/lon valgt](../../../../../translated_images/counterfit-gps-sensor-latlon.008c867d75464fbe7f84107cc57040df565ac07cb57d2f21db37d087d470197d.da.png) + + * Indstil **Source** til `NMEA`, og tilføj nogle NMEA-sætninger i tekstboksen. Alle disse værdier sendes med en forsinkelse på 1 sekund, før hver ny GGA (positionsfix)-sætning kan læses. + + ![GPS-sensoren med NMEA-sætninger indstillet](../../../../../translated_images/counterfit-gps-sensor-nmea.c62eea442171e17e19528b051b104cfcecdc9cd18db7bc72920f29821ae63f73.da.png) + + Du kan bruge et værktøj som [nmeagen.org](https://www.nmeagen.org) til at generere disse sætninger ved at tegne på et kort. Disse værdier sendes kun én gang, så marker **Repeat**-boksen for at få dataene til at gentage 1 sekund efter, at de alle er sendt. + + * Indstil **Source** til GPX-fil, og upload en GPX-fil med spor-lokationer. Du kan downloade GPX-filer fra en række populære kort- og vandresider, såsom [AllTrails](https://www.alltrails.com/). Disse filer indeholder flere GPS-lokationer som en rute, og GPS-sensoren returnerer hver ny lokation med 1 sekunds interval. + + ![GPS-sensoren med en GPX-fil indstillet](../../../../../translated_images/counterfit-gps-sensor-gpxfile.8310b063ce8a425ccc8ebeec8306aeac5e8e55207f007d52c6e1194432a70cd9.da.png) + + Disse værdier sendes kun én gang, så marker **Repeat**-boksen for at få dataene til at gentage 1 sekund efter, at de alle er sendt. + + Når du har konfigureret GPS-indstillingerne, skal du vælge knappen **Set** for at gemme disse værdier på sensoren. + +1. Du vil se rå output fra GPS-sensoren, noget i stil med følgende: + + ```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 + ``` + +> 💁 Du kan finde denne kode i mappen [code-gps/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps/virtual-device). + +😀 Dit GPS-sensorprogram var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at opnå nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md b/translations/da/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md new file mode 100644 index 00000000..5305527f --- /dev/null +++ b/translations/da/3-transport/lessons/1-location-tracking/wio-terminal-gps-decode.md @@ -0,0 +1,83 @@ + +# Dekodér GPS-data - Wio Terminal + +I denne del af lektionen vil du dekodere NMEA-beskeder, der er læst fra GPS-sensoren af Wio Terminal, og udtrække bredde- og længdegrad. + +## Dekodér GPS-data + +Når de rå NMEA-data er blevet læst fra den serielle port, kan de dekodes ved hjælp af et open source NMEA-bibliotek. + +### Opgave - dekodér GPS-data + +Programmer enheden til at dekodere GPS-data. + +1. Åbn `gps-sensor` app-projektet, hvis det ikke allerede er åbent. + +1. Tilføj en biblioteksafhængighed for [TinyGPSPlus](https://github.com/mikalhart/TinyGPSPlus)-biblioteket til projektets `platformio.ini`-fil. Dette bibliotek indeholder kode til dekodering af NMEA-data. + + ```ini + lib_deps = + mikalhart/TinyGPSPlus @ 1.0.2 + ``` + +1. I `main.cpp` skal du tilføje en include-direktiv for TinyGPSPlus-biblioteket: + + ```cpp + #include + ``` + +1. Under deklarationen af `Serial3` skal du deklarere et TinyGPSPlus-objekt til at behandle NMEA-sætningerne: + + ```cpp + TinyGPSPlus gps; + ``` + +1. Ændr indholdet af funktionen `printGPSData` til følgende: + + ```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"); + } + } + ``` + + Denne kode læser det næste tegn fra UART-serielporten ind i `gps` NMEA-dekoderen. Efter hvert tegn vil den kontrollere, om dekoderen har læst en gyldig sætning, og derefter kontrollere, om den har læst en gyldig position. Hvis positionen er gyldig, sender den den til den serielle monitor sammen med antallet af satellitter, der bidrog til denne fix. + +1. Byg og upload koden til Wio Terminal. + +1. Når koden er uploadet, kan du overvåge GPS-positioneringsdataene ved hjælp af den serielle 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 + ``` + +> 💁 Du kan finde denne kode i [code-gps-decode/wio-terminal](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/wio-terminal)-mappen. + +😀 Dit GPS-sensorprogram med datadekodering var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at opnå nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md b/translations/da/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md new file mode 100644 index 00000000..9cf0b99a --- /dev/null +++ b/translations/da/3-transport/lessons/1-location-tracking/wio-terminal-gps-sensor.md @@ -0,0 +1,154 @@ + +# Læs GPS-data - Wio Terminal + +I denne del af lektionen vil du tilføje en GPS-sensor til din Wio Terminal og læse værdier fra den. + +## Hardware + +Wio Terminal kræver en GPS-sensor. + +Den sensor, du skal bruge, er en [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html). Denne sensor kan forbinde til flere GPS-systemer for en hurtig og præcis positionering. Sensoren består af to dele - selve sensorelektronikken og en ekstern antenne, der er forbundet med en tynd ledning for at opfange radiosignaler fra satellitterne. + +Dette er en UART-sensor, så den sender GPS-data via UART. + +### Tilslut GPS-sensoren + +Grove GPS-sensoren kan tilsluttes Wio Terminal. + +#### Opgave - tilslut GPS-sensoren + +Tilslut GPS-sensoren. + +![En Grove GPS-sensor](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.da.png) + +1. Sæt den ene ende af et Grove-kabel i stikket på GPS-sensoren. Det kan kun sættes i på én måde. + +1. Med Wio Terminal frakoblet din computer eller anden strømkilde, tilslut den anden ende af Grove-kablet til det venstre Grove-stik på Wio Terminal, når du ser på skærmen. Dette er stikket tættest på tænd/sluk-knappen. + + ![Grove GPS-sensoren tilsluttet det venstre stik](../../../../../translated_images/wio-gps-sensor.19fd52b81ce58095d5deb3d4e5a1fdd88818d76569b00b1f0d740c92dc986525.da.png) + +1. Placer GPS-sensoren, så den tilkoblede antenne har frit udsyn til himlen - ideelt set ved et åbent vindue eller udenfor. Det er nemmere at få et klart signal, hvis der ikke er noget, der blokerer for antennen. + +1. Du kan nu tilslutte Wio Terminal til din computer. + +1. GPS-sensoren har 2 LED'er - en blå LED, der blinker, når data overføres, og en grøn LED, der blinker hvert sekund, når den modtager data fra satellitter. Sørg for, at den blå LED blinker, når du tænder for Wio Terminal. Efter et par minutter vil den grønne LED begynde at blinke - hvis ikke, kan det være nødvendigt at flytte antennen. + +## Programmer GPS-sensoren + +Wio Terminal kan nu programmeres til at bruge den tilsluttede GPS-sensor. + +### Opgave - programmer GPS-sensoren + +Programmer enheden. + +1. Opret et helt nyt Wio Terminal-projekt ved hjælp af PlatformIO. Kald dette projekt `gps-sensor`. Tilføj kode i `setup`-funktionen for at konfigurere serielporten. + +1. Tilføj følgende include-direktiv øverst i `main.cpp`-filen. Dette inkluderer en headerfil med funktioner til at konfigurere det venstre Grove-stik til UART. + + ```cpp + #include + ``` + +1. Tilføj derefter følgende linje kode for at erklære en seriel portforbindelse til UART-porten: + + ```cpp + static Uart Serial3(&sercom3, PIN_WIRE_SCL, PIN_WIRE_SDA, SERCOM_RX_PAD_1, UART_TX_PAD_0); + ``` + +1. Du skal tilføje noget kode for at omdirigere nogle interne signalhåndterere til denne serielport. Tilføj følgende kode under `Serial3`-deklarationen: + + ```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. I `setup`-funktionen, under hvor `Serial`-porten er konfigureret, skal du konfigurere UART-serielporten med følgende kode: + + ```cpp + Serial3.begin(9600); + + while (!Serial3) + ; // Wait for Serial3 to be ready + + delay(1000); + ``` + +1. Tilføj derefter følgende kode i `setup`-funktionen for at forbinde Grove-pinden til serielporten: + + ```cpp + pinPeripheral(PIN_WIRE_SCL, PIO_SERCOM_ALT); + ``` + +1. Tilføj følgende funktion før `loop`-funktionen for at sende GPS-data til serielmonitoren: + + ```cpp + void printGPSData() + { + Serial.println(Serial3.readStringUntil('\n')); + } + ``` + +1. I `loop`-funktionen skal du tilføje følgende kode for at læse fra UART-serielporten og udskrive output til serielmonitoren: + + ```cpp + while (Serial3.available() > 0) + { + printGPSData(); + } + + delay(1000); + ``` + + Denne kode læser fra UART-serielporten. Funktionen `readStringUntil` læser op til et terminator-tegn, i dette tilfælde en ny linje. Dette vil læse en hel NMEA-sætning (NMEA-sætninger afsluttes med et nyt linjetegn). Så længe der kan læses data fra UART-serielporten, læses det og sendes til serielmonitoren via `printGPSData`-funktionen. Når der ikke kan læses mere data, forsinkes `loop` i 1 sekund (1.000 ms). + +1. Byg og upload koden til Wio Terminal. + +1. Når koden er uploadet, kan du overvåge GPS-dataene ved hjælp af serielmonitoren. + + ```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 + ``` + +> 💁 Du kan finde denne kode i [code-gps/wio-terminal](../../../../../3-transport/lessons/1-location-tracking/code-gps/wio-terminal)-mappen. + +😀 Dit GPS-sensorprogram var en succes! + +--- + +**Ansvarsfraskrivelse**: +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at opnå nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse. \ No newline at end of file diff --git a/translations/da/3-transport/lessons/2-store-location-data/README.md b/translations/da/3-transport/lessons/2-store-location-data/README.md new file mode 100644 index 00000000..f7ad40a8 --- /dev/null +++ b/translations/da/3-transport/lessons/2-store-location-data/README.md @@ -0,0 +1,477 @@ + +# Gem lokationsdata + +![En sketchnote-oversigt over denne lektion](../../../../../translated_images/lesson-12.ca7f53039712a3ec14ad6474d8445361c84adab643edc53fa6269b77895606bb.da.jpg) + +> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version. + +## Quiz før lektionen + +[Quiz før lektionen](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) + +## Introduktion + +I den sidste lektion lærte du, hvordan man bruger en GPS-sensor til at indfange lokationsdata. For at bruge disse data til at visualisere placeringen af en lastbil fyldt med mad og dens rejse, skal dataene sendes til en IoT-tjeneste i skyen og derefter gemmes et sted. + +I denne lektion vil du lære om de forskellige måder at gemme IoT-data på og lære, hvordan man gemmer data fra din IoT-tjeneste ved hjælp af serverløs kode. + +I denne lektion dækker vi: + +* [Strukturerede og ustrukturerede data](../../../../../3-transport/lessons/2-store-location-data) +* [Send GPS-data til en IoT Hub](../../../../../3-transport/lessons/2-store-location-data) +* [Hot, warm og cold paths](../../../../../3-transport/lessons/2-store-location-data) +* [Håndter GPS-hændelser med serverløs kode](../../../../../3-transport/lessons/2-store-location-data) +* [Azure Storage Accounts](../../../../../3-transport/lessons/2-store-location-data) +* [Forbind din serverløse kode til lager](../../../../../3-transport/lessons/2-store-location-data) + +## Strukturerede og ustrukturerede data + +Computersystemer arbejder med data, og disse data kommer i mange forskellige former og størrelser. De kan variere fra enkelte tal til store mængder tekst, videoer og billeder samt IoT-data. Data kan normalt opdeles i en af to kategorier - *strukturerede* data og *ustrukturerede* data. + +* **Strukturerede data** er data med en veldefineret, fast struktur, der ikke ændrer sig og som normalt kan mappes til tabeller med relationer. Et eksempel er en persons oplysninger, herunder deres navn, fødselsdato og adresse. + +* **Ustrukturerede data** er data uden en veldefineret, fast struktur, herunder data, der ofte kan ændre struktur. Et eksempel er dokumenter som skrevne tekster eller regneark. + +✅ Lav lidt research: Kan du komme i tanke om andre eksempler på strukturerede og ustrukturerede data? + +> 💁 Der findes også semi-strukturerede data, som er strukturerede, men som ikke passer ind i faste datatabeller. + +IoT-data betragtes normalt som ustrukturerede data. + +Forestil dig, at du tilføjede IoT-enheder til en flåde af køretøjer for en stor kommerciel gård. Du vil måske bruge forskellige enheder til forskellige typer køretøjer. For eksempel: + +* For landbrugskøretøjer som traktorer ønsker du GPS-data for at sikre, at de arbejder på de rigtige marker. +* For leveringslastbiler, der transporterer mad til lagre, ønsker du GPS-data samt hastigheds- og accelerationsdata for at sikre, at chaufføren kører sikkert, samt føreridentitet og start/stop-data for at sikre overholdelse af lokale arbejdstidslove. +* For kølebiler ønsker du også temperaturdata for at sikre, at maden ikke bliver for varm eller kold og dermed ødelægges under transport. + +Disse data kan ændre sig konstant. For eksempel, hvis IoT-enheden er i en lastbilskabine, kan de data, den sender, ændre sig, når traileren skiftes, for eksempel kun at sende temperaturdata, når en køletrailer bruges. + +✅ Hvilke andre IoT-data kunne indfanges? Tænk på de typer last, som lastbiler kan transportere, samt vedligeholdelsesdata. + +Disse data varierer fra køretøj til køretøj, men de sendes alle til den samme IoT-tjeneste til behandling. IoT-tjenesten skal kunne behandle disse ustrukturerede data og gemme dem på en måde, der gør det muligt at søge eller analysere dem, men som også fungerer med forskellige strukturer af disse data. + +### SQL vs NoSQL-lagring + +Databaser er tjenester, der giver dig mulighed for at gemme og forespørge data. Databaser findes i to typer - SQL og NoSQL. + +#### SQL-databaser + +De første databaser var Relationelle Database Management Systemer (RDBMS), eller relationelle databaser. Disse er også kendt som SQL-databaser efter Structured Query Language (SQL), der bruges til at interagere med dem for at tilføje, fjerne, opdatere eller forespørge data. Disse databaser består af et skema - et veldefineret sæt tabeller, der minder om et regneark. Hver tabel har flere navngivne kolonner. Når du indsætter data, tilføjer du en række til tabellen og placerer værdier i hver af kolonnerne. Dette holder dataene i en meget fast struktur - selvom du kan lade kolonner stå tomme, skal du tilføje en ny kolonne til databasen og udfylde værdier for de eksisterende rækker, hvis du vil tilføje en ny kolonne. Disse databaser er relationelle - en tabel kan have en relation til en anden. + +![En relationel database med ID'et fra User-tabellen, der relaterer til user ID-kolonnen i purchases-tabellen, og ID'et fra products-tabellen, der relaterer til product ID i purchases-tabellen](../../../../../translated_images/sql-database.be160f12bfccefd3ca718a66468c2c4c89c53e5aad4c295324d576da87f9dfdd.da.png) + +For eksempel, hvis du gemte en brugers personlige oplysninger i en tabel, ville du have en slags intern unik ID pr. bruger, der bruges i en række i en tabel, der indeholder brugerens navn og adresse. Hvis du derefter ville gemme andre detaljer om den bruger, såsom deres køb, i en anden tabel, ville du have en kolonne i den nye tabel for den brugers ID. Når du slår en bruger op, kan du bruge deres ID til at få deres personlige oplysninger fra én tabel og deres køb fra en anden. + +SQL-databaser er ideelle til at gemme strukturerede data og til, når du vil sikre, at dataene matcher dit skema. + +✅ Hvis du ikke har brugt SQL før, så tag et øjeblik til at læse om det på [SQL-siden på Wikipedia](https://wikipedia.org/wiki/SQL). + +Nogle kendte SQL-databaser er Microsoft SQL Server, MySQL og PostgreSQL. + +✅ Lav lidt research: Læs om nogle af disse SQL-databaser og deres funktioner. + +#### NoSQL-databaser + +NoSQL-databaser kaldes NoSQL, fordi de ikke har den samme faste struktur som SQL-databaser. De er også kendt som dokumentdatabaser, da de kan gemme ustrukturerede data som dokumenter. + +> 💁 På trods af deres navn tillader nogle NoSQL-databaser, at du bruger SQL til at forespørge data. + +![Dokumenter i mapper i en NoSQL-database](../../../../../translated_images/noqsl-database.62d24ccf5b73f60d35c245a8533f1c7147c0928e955b82cb290b2e184bb434df.da.png) + +NoSQL-databaser har ikke et foruddefineret skema, der begrænser, hvordan data gemmes. I stedet kan du indsætte enhver form for ustrukturerede data, normalt ved hjælp af JSON-dokumenter. Disse dokumenter kan organiseres i mapper, ligesom filer på din computer. Hvert dokument kan have forskellige felter fra andre dokumenter - for eksempel, hvis du gemte IoT-data fra dine landbrugskøretøjer, kunne nogle have felter for accelerometer- og hastighedsdata, mens andre kunne have felter for temperaturen i traileren. Hvis du tilføjede en ny lastbiltype, såsom en med indbyggede vægte til at spore vægten af den transporterede last, kunne din IoT-enhed tilføje dette nye felt, og det kunne gemmes uden ændringer i databasen. + +Nogle kendte NoSQL-databaser inkluderer Azure CosmosDB, MongoDB og CouchDB. + +✅ Lav lidt research: Læs om nogle af disse NoSQL-databaser og deres funktioner. + +I denne lektion vil du bruge NoSQL-lagring til at gemme IoT-data. + +## Send GPS-data til en IoT Hub + +I den sidste lektion indfangede du GPS-data fra en GPS-sensor, der var forbundet til din IoT-enhed. For at gemme disse IoT-data i skyen skal du sende dem til en IoT-tjeneste. Igen vil du bruge Azure IoT Hub, den samme IoT-skytjeneste, som du brugte i det forrige projekt. + +![Afsendelse af GPS-telemetri fra en IoT-enhed til IoT Hub](../../../../../translated_images/gps-telemetry-iot-hub.8115335d51cd2c1285d20e9d1b18cf685e59a8e093e7797291ef173445af6f3d.da.png) + +### Opgave - send GPS-data til en IoT Hub + +1. Opret en ny IoT Hub ved hjælp af den gratis version. + + > ⚠️ Du kan henvise til [instruktionerne for at oprette en IoT Hub fra projekt 2, lektion 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud), hvis det er nødvendigt. + + Husk at oprette en ny Ressourcegruppe. Navngiv den nye Ressourcegruppe `gps-sensor`, og giv den nye IoT Hub et unikt navn baseret på `gps-sensor`, såsom `gps-sensor-`. + + > 💁 Hvis du stadig har din IoT Hub fra det forrige projekt, kan du genbruge den. Husk at bruge navnet på denne IoT Hub og Ressourcegruppen, den er i, når du opretter andre tjenester. + +1. Tilføj en ny enhed til IoT Hub. Kald denne enhed `gps-sensor`. Tag forbindelsesstrengen for enheden. + +1. Opdater din enhedskode til at sende GPS-dataene til den nye IoT Hub ved hjælp af forbindelsesstrengen fra det forrige trin. + + > ⚠️ Du kan henvise til [instruktionerne for at forbinde din enhed til en IoT-tjeneste fra projekt 2, lektion 4](../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service), hvis det er nødvendigt. + +1. Når du sender GPS-dataene, skal du gøre det som JSON i følgende format: + + ```json + { + "gps" : + { + "lat" : , + "lon" : + } + } + ``` + +1. Send GPS-data hvert minut, så du ikke bruger din daglige meddelelsesallokering. + +Hvis du bruger Wio Terminal, skal du huske at tilføje alle nødvendige biblioteker og indstille tiden ved hjælp af en NTP-server. Din kode skal også sikre, at den har læst alle data fra den serielle port, før den sender GPS-positionen, ved at bruge den eksisterende kode fra den sidste lektion. Brug følgende kode til at konstruere JSON-dokumentet: + +```cpp +DynamicJsonDocument doc(1024); +doc["gps"]["lat"] = gps.location.lat(); +doc["gps"]["lon"] = gps.location.lng(); +``` + +Hvis du bruger en Virtuel IoT-enhed, skal du huske at installere alle nødvendige biblioteker ved hjælp af et virtuelt miljø. + +For både Raspberry Pi og Virtuel IoT-enhed skal du bruge den eksisterende kode fra den sidste lektion til at få bredde- og længdegradsdataene og derefter sende dem i det korrekte JSON-format med følgende kode: + +```python +message_json = { "gps" : { "lat":lat, "lon":lon } } +print("Sending telemetry", message_json) +message = Message(json.dumps(message_json)) +``` + +> 💁 Du kan finde denne kode i [code/wio-terminal](../../../../../3-transport/lessons/2-store-location-data/code/wio-terminal), [code/pi](../../../../../3-transport/lessons/2-store-location-data/code/pi) eller [code/virtual-device](../../../../../3-transport/lessons/2-store-location-data/code/virtual-device)-mappen. + +Kør din enhedskode, og sørg for, at meddelelser flyder ind i IoT Hub ved hjælp af `az iot hub monitor-events` CLI-kommandoen. + +## Hot, warm og cold paths + +Data, der flyder fra en IoT-enhed til skyen, behandles ikke altid i realtid. Nogle data skal behandles i realtid, andre kan behandles kort tid senere, og andre kan behandles meget senere. Flowet af data til forskellige tjenester, der behandler dataene på forskellige tidspunkter, kaldes hot, warm og cold paths. + +### Hot path + +Hot path refererer til data, der skal behandles i realtid eller næsten realtid. Du ville bruge hot path-data til alarmer, såsom at få besked om, at et køretøj nærmer sig et depot, eller at temperaturen i en kølebil er for høj. + +For at bruge hot path-data ville din kode reagere på hændelser, så snart de modtages af dine skytjenester. + +### Warm path + +Warm path refererer til data, der kan behandles kort tid efter modtagelse, for eksempel til rapportering eller kortsigtet analyse. Du ville bruge warm path-data til daglige rapporter om køretøjers kilometertal ved hjælp af data indsamlet dagen før. + +Warm path-data gemmes, så snart de modtages af skytjenesten, i en form for lager, der hurtigt kan tilgås. + +### Cold path + +Cold path refererer til historiske data, der gemmes på lang sigt og kan behandles, når det er nødvendigt. For eksempel kunne du bruge cold path til at få årlige kilometerrapporter for køretøjer eller køre analyser på ruter for at finde den mest optimale rute for at reducere brændstofomkostninger. + +Cold path-data gemmes i datalagre - databaser designet til at gemme store mængder data, der aldrig ændres, og som kan forespørges hurtigt og nemt. Du vil normalt have en regelmæssig opgave i din skyapplikation, der kører på et fast tidspunkt hver dag, uge eller måned for at flytte data fra warm path-lager til datalageret. + +✅ Tænk over de data, du har indsamlet indtil videre i disse lektioner. Er det hot, warm eller cold path-data? + +## Håndter GPS-hændelser med serverløs kode + +Når data flyder ind i din IoT Hub, kan du skrive noget serverløs kode til at lytte efter hændelser, der offentliggøres til den Event-Hub-kompatible endpoint. Dette er warm path - disse data vil blive gemt og brugt i den næste lektion til rapportering om rejsen. + +![Afsendelse af GPS-telemetri fra en IoT-enhed til IoT Hub og derefter til Azure Functions via en event hub-trigger](../../../../../translated_images/gps-telemetry-iot-hub-functions.24d3fa5592455e9f4e2fe73856b40c3915a292b90263c31d652acfd976cfedd8.da.png) + +### Opgave - håndter GPS-hændelser med serverløs kode + +1. Opret en Azure Functions-app ved hjælp af Azure Functions CLI. Brug Python-runtime, og opret den i en mappe kaldet `gps-trigger`, og brug det samme navn til Functions App-projektnavnet. Sørg for at oprette et virtuelt miljø til dette. +> ⚠️ Du kan henvise til [instruktionerne for at oprette et Azure Functions-projekt fra projekt 2, lektion 5](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application), hvis det er nødvendigt. +1. Tilføj en IoT Hub-hændelsesudløser, der bruger IoT Hubs Event Hub-kompatible endpoint. + + > ⚠️ Du kan finde vejledningen til at oprette en IoT Hub-hændelsesudløser fra projekt 2, lektion 5 [her](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger), hvis det er nødvendigt. + +1. Angiv forbindelsesstrengen for Event Hub-kompatible endpoint i filen `local.settings.json`, og brug nøglen for denne post i filen `function.json`. + +1. Brug Azurite-appen som en lokal lageremulator. + +1. Kør din Functions-app for at sikre, at den modtager hændelser fra din GPS-enhed. Sørg for, at din IoT-enhed også kører og sender GPS-data. + + ```output + Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} + ``` + +## Azure Storage-konti + +![Azure Storage-logoet](../../../../../translated_images/azure-storage-logo.605c0f602c640d482a80f1b35a2629a32d595711b7ab1d7ceea843250615ff32.da.png) + +Azure Storage-konti er en alsidig lagringstjeneste, der kan gemme data på forskellige måder. Du kan gemme data som blobs, i køer, i tabeller eller som filer – og alt dette på samme tid. + +### Blob-lagring + +Ordet *Blob* betyder binære store objekter, men bruges som betegnelse for enhver ustruktureret data. Du kan gemme enhver form for data i blob-lagring, fra JSON-dokumenter med IoT-data til billed- og videofiler. Blob-lagring har konceptet *containers*, navngivne "spande", hvor du kan gemme data, svarende til tabeller i en relationsdatabase. Disse containere kan have en eller flere mapper til at gemme blobs, og hver mappe kan indeholde andre mapper, ligesom filer gemmes på din computers harddisk. + +Du vil bruge blob-lagring i denne lektion til at gemme IoT-data. + +✅ Undersøg: Læs om [Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) + +### Tabel-lagring + +Tabel-lagring giver dig mulighed for at gemme semi-struktureret data. Tabel-lagring er faktisk en NoSQL-database, så det kræver ikke et foruddefineret sæt tabeller, men det er designet til at gemme data i en eller flere tabeller med unikke nøgler til at definere hver række. + +✅ Undersøg: Læs om [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) + +### Kø-lagring + +Kø-lagring giver dig mulighed for at gemme beskeder på op til 64 KB i størrelse i en kø. Du kan tilføje beskeder til bagenden af køen og læse dem fra fronten. Køer gemmer beskeder på ubestemt tid, så længe der stadig er lagerplads, hvilket gør det muligt at gemme beskeder langvarigt og læse dem, når det er nødvendigt. For eksempel, hvis du ville køre en månedlig opgave for at behandle GPS-data, kunne du tilføje dem til en kø hver dag i en måned og derefter behandle alle beskederne i slutningen af måneden. + +✅ Undersøg: Læs om [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) + +### Fil-lagring + +Fil-lagring er lagring af filer i skyen, og enhver app eller enhed kan oprette forbindelse ved hjælp af standardprotokoller. Du kan skrive filer til fil-lagring og derefter montere det som et drev på din PC eller Mac. + +✅ Undersøg: Læs om [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) + +## Forbind din serverløse kode til lagring + +Din Functions-app skal nu forbindes til blob-lagring for at gemme beskederne fra IoT Hub. Der er to måder at gøre dette på: + +* Inde i funktionskoden, forbind til blob-lagring ved hjælp af blob-lagringens Python SDK og skriv data som blobs. +* Brug en output-funktionsbinding til at binde returværdien af funktionen til blob-lagring og få blobben gemt automatisk. + +I denne lektion vil du bruge Python SDK til at se, hvordan man interagerer med blob-lagring. + +![Sender GPS-telemetri fra en IoT-enhed til IoT Hub, derefter til Azure Functions via en Event Hub-trigger, og gemmer det i blob-lagring](../../../../../translated_images/save-telemetry-to-storage-from-functions.ed3b1820980097f143d9f0570072da11304c2bc7906359dfa075b4d9b253c20f.da.png) + +Dataene vil blive gemt som en JSON-blob med følgende format: + +```json +{ + "device_id": , + "timestamp" :