

> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -203,7 +203,7 @@ Som et andet 'Hello World'-trin vil du køre CounterFit-appen og forbinde din ko
Appen vil begynde at køre og åbne i din webbrowser:


Den vil være markeret som *Disconnected*, med LED'en i øverste højre hjørne slukket.
@ -224,7 +224,7 @@ Som et andet 'Hello World'-trin vil du køre CounterFit-appen og forbinde din ko
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.


> 💁 Du kan finde denne kode i [code/virtual-device](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/virtual-device)-mappen.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -38,7 +38,7 @@ De to komponenter i en IoT-applikation er *Internet* og *ting*. Lad os se nærme
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.


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.
@ -54,7 +54,7 @@ Enheder forbinder heller ikke altid direkte til internettet via WiFi eller kabel
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.


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.
@ -94,7 +94,7 @@ Jo hurtigere clock-cyklussen er, jo flere instruktioner kan behandles pr. sekund
> 💁 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.


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.
@ -182,7 +182,7 @@ Arduino-boards programmeres i C eller C++. Brug af C/C++ gør det muligt at komp
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.


✅ 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).
# Interager med den fysiske verden med sensorer og aktuatorer


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -92,7 +92,7 @@ Digitale sensorer, ligesom analoge sensorer, registrerer verden omkring dem ved
Den enkleste digitale sensor er en knap eller kontakt. Dette er en sensor med to tilstande, tændt eller slukket.


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.
@ -125,7 +125,7 @@ Nogle almindelige aktuatorer inkluderer:
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.


@ -140,7 +140,7 @@ Ligesom sensorer er aktuatorer enten analoge eller digitale.
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.


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.
@ -187,7 +187,7 @@ Digitale aktuatorer, ligesom digitale sensorer, har enten to tilstande, der styr
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.


✅ 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.
@ -26,7 +26,7 @@ Grove LED'en leveres som en modul med et udvalg af LED'er, så du kan vælge far
Tilslut LED'en.


1. Vælg din foretrukne LED, og indsæt benene i de to huller på LED-modulet.
@ -40,7 +40,7 @@ Tilslut LED'en.
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.


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.
@ -28,11 +28,11 @@ Tilføj lyssensoren til CounterFit-appen.
1. Klik på knappen **Add** for at oprette lyssensoren på Pin 0.


Lyssensoren vil blive oprettet og vises i sensorlisten.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -47,7 +47,7 @@ MQTT er den mest populære kommunikationsprotokol for IoT-enheder og dækkes i d
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.


✅ Lav noget research. Hvis du har mange IoT-enheder, hvordan kan du sikre, at din MQTT-broker kan håndtere alle beskederne?
@ -69,7 +69,7 @@ I stedet for at håndtere kompleksiteten ved at opsætte en MQTT-broker som en d
> 💁 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.


Følg det relevante trin nedenfor for at forbinde din enhed til MQTT-brokeren:
@ -352,7 +352,7 @@ For maskiner vil du måske beholde dataene, især hvis de bruges til at lede eft
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.
[](https://twitter.com/internetofshit/status/1315736960082808832)
[](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.
@ -360,7 +360,7 @@ For MQTT til at håndtere tab af forbindelse skal enheden og serverkoden være a
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 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.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -90,7 +90,7 @@ Vækstgradedage, eller GDD, beregnes pr. dag som den gennemsnitlige temperatur i
Den fulde formel for GDD er lidt kompliceret, men der findes en forenklet ligning, der ofte bruges som en god tilnærmelse:


* **GDD** - dette er antallet af vækstgradedage
* **T max** - dette er den daglige maksimumtemperatur i grader Celsius
@ -118,7 +118,7 @@ Ved at indsætte disse tal i vores beregning:
Dette giver en beregning på:


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.
@ -239,7 +239,7 @@ Trinene til at gøre dette manuelt er:
For eksempel, hvis dagens højeste temperatur er 25°C, og den laveste er 12°C:


@ -33,7 +33,7 @@ Når du har temperaturdata, kan du bruge Jupyter Notebook i dette repo til at vi
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).
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.
@ -38,11 +38,11 @@ Tilføj fugtigheds- og temperatursensorerne til CounterFit-appen.
1. Vælg knappen **Add** for at oprette fugtighedssensoren på Pin 5.


Fugtighedssensoren vil blive oprettet og vises i sensorlisten.
@ -54,11 +54,11 @@ Tilføj fugtigheds- og temperatursensorerne til CounterFit-appen.
1. Vælg knappen **Add** for at oprette temperatursensoren på Pin 6.


Temperatursensoren vil blive oprettet og vises i sensorlisten.
@ -13,7 +13,7 @@ I²C har en bus bestående af 2 hovedledninger samt 2 strømledninger:
| 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. |


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.
@ -20,14 +20,14 @@ Du skal gentage disse trin flere gange for at få de nødvendige målinger, med
Den gravimetriske jordfugtighed beregnes som:


* 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.
@ -18,13 +18,13 @@ Grove jordfugtighedssensoren kan tilsluttes Raspberry Pi'en.
Tilslut jordfugtighedssensoren.


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.
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.
@ -34,11 +34,11 @@ Tilføj jordfugtighedssensoren til CounterFit-appen.
1. Vælg knappen **Add** for at oprette *Soil Moisture*-sensoren på Pin 0.


Jordfugtighedssensoren vil blive oprettet og vises i sensorlisten.
@ -18,7 +18,7 @@ Grove jordfugtighedssensoren kan tilsluttes Wio Terminalens konfigurerbare analo
Tilslut jordfugtighedssensoren.


1. Sæt den ene ende af et Grove-kabel i stikket på jordfugtighedssensoren. Det kan kun sættes i på én måde.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -32,7 +32,7 @@ IoT-enheder bruger lav spænding. Selvom dette er nok til sensorer og lavstrøms
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.


> 🎓 [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.
@ -72,7 +72,7 @@ Når armen bevæger sig, kan du normalt høre den lave kontakt med elektromagnet
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.


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.
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.


1. Sæt jordfugtighedssensoren i jorden, hvis den ikke allerede er det fra den forrige lektion.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -46,8 +46,8 @@ Dette kunne være meget dyrt, kræve en bred vifte af dygtige medarbejdere og v
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.




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.
@ -108,11 +108,11 @@ IoT-tjenester i skyen løser disse problemer. De vedligeholdes af store cloud-ud
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.


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.


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.
@ -124,7 +124,7 @@ Andre komponenter i din applikation kan forbinde til IoT-tjenesten og lære om a
Nu hvor du har et Azure-abonnement, kan du tilmelde dig en IoT-tjeneste. IoT-tjenesten fra Microsoft hedder Azure IoT Hub.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -28,7 +28,7 @@ I denne lektion dækker vi:
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.


> 💁 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.
@ -54,7 +54,7 @@ Som IoT-udvikler er den serverløse model ideel. Du kan skrive en funktion, der
Den serverløse computing-tjeneste fra Microsoft kaldes Azure Functions.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -52,11 +52,11 @@ Dette er scenarier fra den virkelige verden og sker hele tiden. Nogle eksempler
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.


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*.


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.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -63,13 +63,13 @@ Jorden er en kugle - en tredimensionel cirkel. På grund af dette defineres punk
> 💁 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.


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).


> 🎓 En meridian er en imaginær lige linje, der går fra Nordpolen til Sydpolen og danner en halvcirkel.
@ -100,7 +100,7 @@ Koordinater for et punkt gives altid som `breddegrad, længdegrad`, så eksemple
* En breddegrad på 47.6423109 (47.6423109 grader nord for ækvator)
* En længdegrad på -122.1390293 (122.1390293 grader vest for Prime Meridian).


## Global Positioning Systems (GPS)
@ -112,7 +112,7 @@ GPS-systemer fungerer ved at have et antal satellitter, der sender et signal med
> 💁 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.


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.
@ -18,13 +18,13 @@ Grove GPS-sensoren kan tilsluttes Raspberry Pi'en.
Tilslut GPS-sensoren.


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.
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.
@ -38,11 +38,11 @@ Tilføj GPS-sensoren til CounterFit-appen.
1. Vælg knappen **Add** for at oprette GPS-sensoren på porten `/dev/ttyAMA0`.


GPS-sensoren vil blive oprettet og vises i sensorlisten.
* 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.


* 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.


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.


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.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -75,7 +75,7 @@ NoSQL-databaser kaldes NoSQL, fordi de ikke har den samme faste struktur som SQL
> 💁 På trods af deres navn tillader nogle NoSQL-databaser, at du bruger SQL til at forespørge data.


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.
@ -89,7 +89,7 @@ I denne lektion vil du bruge NoSQL-lagring til at gemme IoT-data.
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.


### Opgave - send GPS-data til en IoT Hub
@ -171,7 +171,7 @@ Cold path-data gemmes i datalagre - databaser designet til at gemme store mængd
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.


### Opgave - håndter GPS-hændelser med serverløs kode
@ -193,7 +193,7 @@ Når data flyder ind i din IoT Hub, kan du skrive noget serverløs kode til at l
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.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -64,11 +64,11 @@ Lad os tage et simpelt eksempel - tilbage i landbrugsprojektet indsamlede du dat
Som menneske kan det være svært at forstå disse data. Det er en mur af tal uden nogen mening. Som et første skridt til at visualisere disse data kan de plottes på et linjediagram:


Dette kan yderligere forbedres ved at tilføje en linje, der indikerer, hvornår det automatiske vandingssystem blev tændt ved en jordfugtighedsaflæsning på 450:


Dette diagram viser meget hurtigt ikke kun, hvad jordfugtighedsniveauerne var, men også de punkter, hvor vandingssystemet blev tændt.
@ -84,7 +84,7 @@ Når man arbejder med GPS-data, kan den mest klare visualisering være at plotte
At arbejde med kort er en interessant øvelse, og der er mange at vælge imellem, såsom Bing Maps, Leaflet, Open Street Maps og Google Maps. I denne lektion vil du lære om [Azure Maps](https://azure.microsoft.com/services/azure-maps/?WT.mc_id=academic-17441-jabenn) og hvordan de kan vise dine GPS-data.
Azure Maps er "en samling af geospatiale tjenester og SDK'er, der bruger friske kortdata til at give geografisk kontekst til web- og mobilapplikationer." Udviklere får værktøjer til at skabe smukke, interaktive kort, der kan gøre ting som at give anbefalede trafikruter, give information om trafikulykker, indendørs navigation, søgefunktioner, højdeinformation, vejrtjenester og mere.
@ -185,7 +185,7 @@ Nu kan du tage det næste skridt, som er at vise dit kort på en webside. Vi vil
Hvis du åbner din `index.html`-side i en webbrowser, bør du se et kort indlæst og fokuseret på Seattle-området.


✅ Eksperimentér med zoom- og centerparametrene for at ændre dit korts visning. Du kan tilføje forskellige koordinater, der svarer til din datas bredde- og længdegrad, for at re-centrere kortet.
@ -318,7 +318,7 @@ Hvis du foretager et kald til din lagring for at hente dataene, kan du blive ove
1. Indlæs HTML-siden i din browser. Den vil indlæse kortet, derefter indlæse alle GPS-data fra lagringen og plotte dem på kortet.


> 💁 Du kan finde denne kode i [code](../../../../../3-transport/lessons/3-visualize-location-data/code)-mappen.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -35,7 +35,7 @@ I denne lektion dækker vi:
En geofence er en virtuel afgrænsning for et geografisk område i den virkelige verden. Geofences kan være cirkler defineret som et punkt og en radius (for eksempel en cirkel på 100 m omkring en bygning) eller en polygon, der dækker et område som en skolezone, bygrænser eller et universitets- eller kontorområde.


> 💁 Du har måske allerede brugt geofences uden at vide det. Hvis du har sat en påmindelse i iOS' påmindelsesapp eller Google Keep baseret på en placering, har du brugt en geofence. Disse apps opsætter en geofence baseret på den angivne placering og giver dig besked, når din telefon træder ind i geofencen.
@ -212,7 +212,7 @@ Det er vigtigt at kende afstanden til kanten af geofencen og kombinere dette med
For eksempel, forestil dig GPS-aflæsninger, der viser, at et køretøj kører langs en vej, der ender med at løbe tæt på en geofence. Hvis en enkelt GPS-værdi er unøjagtig og placerer køretøjet inden for geofencen, på trods af at der ikke er nogen adgangsvej, kan den ignoreres.


På billedet ovenfor er der en geofence over en del af Microsoft-campus. Den røde linje viser en lastbil, der kører langs 520, med cirkler, der viser GPS-aflæsningerne. De fleste af disse aflæsninger er præcise og følger 520, men én aflæsning er unøjagtig og befinder sig inden for geofencen. Denne aflæsning kan umuligt være korrekt – der er ingen veje, hvor lastbilen pludselig kan dreje fra 520 ind på campus og derefter tilbage på 520. Koden, der tjekker denne geofence, skal tage de tidligere aflæsninger i betragtning, før den handler på resultaterne af geofence-testen.
✅ Hvilke yderligere data ville du have brug for at tjekke for at afgøre, om en GPS-aflæsning kan betragtes som korrekt?
@ -284,7 +284,7 @@ Som du måske husker fra tidligere lektioner, giver IoT Hub dig mulighed for at
Svaret er, at det kan den ikke! I stedet kan du definere flere separate forbindelser til at læse hændelser, og hver af dem kan administrere afspilningen af ulæste meddelelser. Disse kaldes *forbrugergrupper*. Når du opretter forbindelse til endpointet, kan du angive, hvilken forbrugergruppe du vil oprette forbindelse til. Hver komponent i din applikation vil oprette forbindelse til en anden forbrugergruppe.


I teorien kan op til 5 applikationer oprette forbindelse til hver forbrugergruppe, og de vil alle modtage meddelelser, når de ankommer. Det er bedst at have kun én applikation, der tilgår hver forbrugergruppe, for at undgå dobbeltbehandling af meddelelser og sikre, at alle køede meddelelser behandles korrekt ved genstart. For eksempel, hvis du kører din Functions-app lokalt samtidig med, at den kører i skyen, vil begge behandle meddelelser, hvilket fører til dubletter i blob-lageret.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -38,7 +38,7 @@ Ikke alle afgrøder modnes jævnt. Tomater, for eksempel, kan stadig have nogle
Den stigende automatisering af høst flyttede sorteringen af produkter fra marken til fabrikken. Mad ville rejse på lange transportbånd med hold af mennesker, der gennemgik produkterne og fjernede alt, der ikke levede op til kvalitetsstandarderne. Høst blev billigere takket være maskiner, men der var stadig en omkostning ved manuelt at sortere mad.


Den næste udvikling var at bruge maskiner til at sortere, enten indbygget i høstmaskinen eller i forarbejdningsanlæggene. Den første generation af disse maskiner brugte optiske sensorer til at registrere farver og styrede aktuatorer til at skubbe grønne tomater i en affaldsbeholder ved hjælp af arme eller lufttryk, mens røde tomater fortsatte på et netværk af transportbånd.
@ -62,7 +62,7 @@ For eksempel kunne du give en model millioner af billeder af umodne bananer som
> 🎓 Resultaterne af ML-modeller kaldes *forudsigelser*.


ML-modeller giver ikke et binært svar, men i stedet sandsynligheder. For eksempel kan en model få et billede af en banan og forudsige `moden` med 99,7% og `umoden` med 0,3%. Din kode ville derefter vælge den bedste forudsigelse og beslutte, at bananen er moden.
@ -90,7 +90,7 @@ Der findes en bred vifte af værktøjer, der kan hjælpe dig med dette, herunder
Custom Vision er et cloud-baseret værktøj til træning af billedklassifikatorer. Det giver dig mulighed for at træne en klassifikator ved kun at bruge et lille antal billeder. Du kan uploade billeder via en webportal, web-API eller et SDK og give hvert billede en *tag*, der angiver klassifikationen af det billede. Du træner derefter modellen og tester den for at se, hvor godt den fungerer. Når du er tilfreds med modellen, kan du udgive versioner af den, der kan tilgås via en web-API eller et SDK.
> 💁 Du kan træne en Custom Vision-model med så lidt som 5 billeder pr. klassifikation, men flere er bedre. Du kan opnå bedre resultater med mindst 30 billeder.
@ -146,7 +146,7 @@ For at bruge Custom Vision skal du først oprette to Cognitive Services-ressourc
Når du opretter dit projekt, skal du sørge for at bruge den `fruit-quality-detector-training`-ressource, du oprettede tidligere. Brug en *Classification*-projekttype, en *Multiclass*-klassifikationstype og *Food*-domænet.


✅ Tag dig tid til at udforske Custom Vision-brugergrænsefladen for din billedklassifikator.
@ -164,7 +164,7 @@ Billedklassificeringsmodeller kører ved meget lav opløsning. For eksempel kan
* Brug 2 modne bananer, og tag nogle billeder af hver fra forskellige vinkler, mindst 7 billeder (5 til træning, 2 til test), men helst flere.


* Gentag samme proces med 2 umodne bananer.
@ -174,7 +174,7 @@ Billedklassificeringsmodeller kører ved meget lav opløsning. For eksempel kan
1. Følg [upload og tag billeder-sektionen i quickstart-guiden til at bygge en klassificeringsmodel på Microsoft Docs](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/getting-started-build-a-classifier?WT.mc_id=academic-17441-jabenn#upload-and-tag-images) for at uploade dine træningsbilleder. Tag de modne frugter som `ripe` og de umodne som `unripe`.


1. Følg [træn klassificeringsmodellen-sektionen i quickstart-guiden til at bygge en klassificeringsmodel på Microsoft Docs](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/getting-started-build-a-classifier?WT.mc_id=academic-17441-jabenn#train-the-classifier) for at træne billedklassificeringsmodellen med dine uploadede billeder.
@ -192,7 +192,7 @@ Når din model er trænet, kan du teste den ved at give den et nyt billede til k
1. Følg [test din model-dokumentationen på Microsoft Docs](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/test-your-model?WT.mc_id=academic-17441-jabenn#test-your-model) for at teste din billedklassificeringsmodel. Brug de testbilleder, du oprettede tidligere, ikke nogen af de billeder, du brugte til træning.


1. Prøv alle de testbilleder, du har adgang til, og observer sandsynlighederne.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -26,7 +26,7 @@ I denne lektion dækker vi:
Kamerasensorer, som navnet antyder, er kameraer, du kan tilslutte til din IoT-enhed. De kan tage stillbilleder eller optage streamingvideo. Nogle returnerer rå billeddata, mens andre komprimerer billeddataene til en billedfil som JPEG eller PNG. Normalt er de kameraer, der fungerer med IoT-enheder, meget mindre og har lavere opløsning end dem, du måske er vant til, men du kan få kameraer med høj opløsning, der kan konkurrere med de bedste smartphones. Du kan få alle slags udskiftelige linser, opsætninger med flere kameraer, infrarøde termiske kameraer eller UV-kameraer.


De fleste kamerasensorer bruger billedsensorer, hvor hver pixel er en fotodiode. En linse fokuserer billedet på billedsensoren, og tusinder eller millioner af fotodioder registrerer lyset, der falder på hver enkelt, og gemmer det som pixeldata.
@ -74,7 +74,7 @@ Iterationer publiceres fra Custom Vision-portalen.
1. I dialogboksen *Publish Model* skal du indstille *Prediction resource* til den `fruit-quality-detector-prediction`-ressource, du oprettede i den sidste lektion. Lad navnet være `Iteration2`, og vælg knappen **Publish**.
@ -88,7 +88,7 @@ Iterationer publiceres fra Custom Vision-portalen.
Tag også en kopi af værdien *Prediction-Key*. Dette er en sikker nøgle, som du skal sende, når du kalder modellen. Kun applikationer, der sender denne nøgle, har tilladelse til at bruge modellen, alle andre applikationer afvises.


✅ Når en ny iteration publiceres, vil den have et andet navn. Hvordan tror du, du ville ændre den iteration, en IoT-enhed bruger?
@ -109,7 +109,7 @@ Du kan opleve, at de resultater, du får, når du bruger kameraet tilsluttet din
For at få de bedste resultater for en billedklassifikator vil du gerne træne modellen med billeder, der er så ens som muligt med de billeder, der bruges til forudsigelser. Hvis du for eksempel brugte dit telefonkamera til at tage billeder til træning, vil billedkvaliteten, skarpheden og farverne være anderledes end et kamera tilsluttet en IoT-enhed.


På billedet ovenfor blev bananbilledet til venstre taget med et Raspberry Pi-kamera, mens det til højre blev taget af den samme banan på samme sted med en iPhone. Der er en tydelig forskel i kvalitet - iPhone-billedet er skarpere, med lysere farver og mere kontrast.
@ -16,7 +16,7 @@ Kameraet kan tilsluttes Raspberry Pi ved hjælp af et fladkabel.
### Opgave - tilslut kameraet


1. Sluk for Pi'en.
@ -24,17 +24,17 @@ Kameraet kan tilsluttes Raspberry Pi ved hjælp af et fladkabel.
Du kan finde en animation, der viser, hvordan man åbner klipsen og indsætter kablet, i [Raspberry Pi Getting Started with the Camera module documentation](https://projects.raspberrypi.org/en/projects/getting-started-with-picamera/2).


1. Fjern Grove Base Hat fra Pi'en.
1. Før fladkablet gennem kamerahullet i Grove Base Hat. Sørg for, at den blå side af kablet vender mod de analoge porte mærket **A0**, **A1** osv.


1. Indsæt fladkablet i kamerastikket på Pi'en. Træk igen den sorte plastikklips op, indsæt kablet, og skub derefter klipsen tilbage på plads. Den blå side af kablet skal vende mod USB- og ethernet-portene.


1. Monter Grove Base Hat igen.
@ -101,7 +101,7 @@ Programmer enheden.
Linjen `camera.rotation = 0` angiver rotationen af billedet. Fladkablet kommer ind i bunden af kameraet, men hvis dit kamera blev roteret for at gøre det lettere at pege på det objekt, du vil klassificere, kan du ændre denne linje til antallet af grader af rotation.


For eksempel, hvis du hænger fladkablet over noget, så det er øverst på kameraet, skal du sætte rotationen til 180:
@ -84,7 +84,7 @@ Custom Vision-tjenesten har et Python SDK, som du kan bruge til at klassificere
Du vil kunne se det billede, der blev taget, og disse værdier i fanen **Predictions** i Custom Vision.


> 💁 Du kan finde denne kode i mappen [code-classify/pi](../../../../../4-manufacturing/lessons/2-check-fruit-from-device/code-classify/pi) eller [code-classify/virtual-iot-device](../../../../../4-manufacturing/lessons/2-check-fruit-from-device/code-classify/virtual-iot-device).
1. Konfigurer billedet, som kameraet i CounterFit vil fange. Du kan enten sætte *Source* til *File* og derefter uploade en billedfil, eller sætte *Source* til *WebCam*, og billeder vil blive fanget fra dit webcam. Sørg for at vælge knappen **Set** efter at have valgt et billede eller dit webcam.


1. Et billede vil blive fanget og gemt som `image.jpg` i den aktuelle mappe. Du vil se denne fil i VS Code-udforskeren. Vælg filen for at se billedet. Hvis det skal roteres, opdater linjen `camera.rotation = 0` som nødvendigt og tag et nyt billede.
1. Pindene på bunden af ArduCam skal forbindes til GPIO-pindene på Wio Terminalen. For at gøre det nemmere at finde de rigtige pins, skal du sætte GPIO-pin-klistermærket, der følger med Wio Terminalen, rundt om pindene:
@ -35,7 +35,7 @@ Tilslut kameraet.
| SDA | 3 (I2C1_SDA) | I2C Serial Data |
| SCL | 5 (I2C1_SCL) | I2C Serial Clock |


GND- og VCC-forbindelserne leverer en 5V strømforsyning til ArduCam. Det kører på 5V, i modsætning til Grove-sensorer, der kører på 3V. Denne strøm kommer direkte fra USB-C-forbindelsen, der forsyner enheden.
@ -456,7 +456,7 @@ Wio Terminalen understøtter kun microSD-kort på op til 16GB. Hvis du har et st
1. Sluk for microSD-kortet og fjern det ved at skubbe det lidt ind og slippe, så det springer ud. Du skal muligvis bruge et tyndt værktøj til dette. Sæt microSD-kortet i din computer for at se billederne.


> 💁 Det kan tage et par billeder, før kameraets hvidbalance justerer sig selv. Du vil bemærke dette baseret på farven på de billeder, der bliver taget, de første par kan se ud til at have forkert farve. Du kan altid omgå dette ved at ændre koden til at tage et par billeder, der ignoreres i `setup`-funktionen.
@ -208,7 +208,7 @@ Disse certifikater indeholder offentlige nøgler og behøver ikke at blive holdt
Du vil kunne se det billede, der blev taget, og disse værdier i **Predictions**-fanen i Custom Vision.


> 💁 Du kan finde denne kode i mappen [code-classify/wio-terminal](../../../../../4-manufacturing/lessons/2-check-fruit-from-device/code-classify/wio-terminal).


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -33,11 +33,11 @@ I denne lektion dækker vi:
Edge computing indebærer, at computere behandler IoT-data så tæt som muligt på det sted, hvor dataene genereres. I stedet for at have denne behandling i skyen, flyttes den til kanten af skyen - dit interne netværk.


I de tidligere lektioner har du haft enheder, der indsamler data og sender data til skyen for at blive analyseret, hvor serverløse funktioner eller AI-modeller kører i skyen.


Edge computing indebærer at flytte nogle af cloud-tjenesterne væk fra skyen og over på computere, der kører på samme netværk som IoT-enhederne, og kun kommunikere med skyen, hvis det er nødvendigt. For eksempel kan du køre AI-modeller på edge-enheder for at analysere frugtens modenhed og kun sende analyser tilbage til skyen, såsom antallet af modne frugter kontra umodne.
@ -85,7 +85,7 @@ For IoT-systemer vil du ofte have en blanding af cloud- og edge computing, hvor
Azure IoT Edge er en tjeneste, der kan hjælpe dig med at flytte arbejdsbelastninger ud af skyen og til kanten. Du opsætter en enhed som en edge-enhed, og fra skyen kan du implementere kode på den edge-enhed. Dette giver dig mulighed for at blande skyens og kantens kapaciteter.
@ -99,7 +99,7 @@ IoT Edge er indbygget i IoT Hub, så du kan administrere edge-enheder ved hjælp
IoT Edge kører kode fra *containere* - selvstændige applikationer, der kører isoleret fra resten af applikationerne på din computer. Når du kører en container, fungerer den som en separat computer, der kører inde i din computer, med sin egen software, tjenester og applikationer. De fleste gange kan containere ikke få adgang til noget på din computer, medmindre du vælger at dele ting som en mappe med containeren. Containeren eksponerer derefter tjenester via en åben port, som du kan forbinde til eller eksponere for dit netværk.


For eksempel kan du have en container med et websted, der kører på port 80, standard HTTP-porten, og du kan derefter eksponere den fra din computer også på port 80.
@ -195,11 +195,11 @@ Når modellen er blevet trænet, skal den eksporteres som en container.
## Forbered din container til implementering


Når du har downloadet din model, skal den bygges som en container og derefter pushes til et containerregister - et online sted, hvor du kan gemme containere. IoT Edge kan derefter downloade containeren fra registeret og sende den til din enhed.
Det containerregister, du vil bruge i denne lektion, er Azure Container Registry. Dette er ikke en gratis tjeneste, så for at spare penge skal du sørge for at [rydde op i dit projekt](../../../clean-up.md), når du er færdig.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -39,7 +39,7 @@ IoT-applikationer kan beskrives som *ting* (enheder), der sender data, som gener
Diagrammet ovenfor viser nogle af de komponenter og tjenester, der er dækket indtil videre i disse lektioner, og hvordan de hænger sammen i en reference IoT-arkitektur.
@ -89,7 +89,7 @@ Du skal bygge et system, hvor frugt registreres, når det ankommer på transport
### Prototyping af din applikation


Diagrammet ovenfor viser en referencearkitektur for denne prototype-applikation.
@ -124,7 +124,7 @@ Følg den relevante guide for at bruge en nærhedssensor til at registrere et ob
Prototypen af frugtdetektoren har flere komponenter, der kommunikerer med hinanden.


* En nærhedssensor måler afstanden til et stykke frugt og sender dette til IoT Hub
* Kommandoen til at styre kameraet kommer fra IoT Hub til kameraenheden
@ -20,7 +20,7 @@ Grove time of flight-sensoren kan tilsluttes Raspberry Pi'en.
Tilslut time of flight-sensoren.


1. Sæt den ene ende af et Grove-kabel i stikket på time of flight-sensoren. Det kan kun sættes i på én måde.
@ -36,11 +36,11 @@ Tilføj afstandssensoren til CounterFit-appen.
1. Vælg knappen **Add** for at oprette afstandssensoren.


Afstandssensoren vil blive oprettet og vises i sensorlisten.
@ -20,7 +20,7 @@ Grove Time of Flight-sensoren kan tilsluttes Wio Terminalen.
Tilslut Time of Flight-sensoren.


1. Sæt den ene ende af et Grove-kabel i stikket på Time of Flight-sensoren. Det kan kun sættes i på én måde.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -36,7 +36,7 @@ Objektgenkendelse indebærer at finde objekter i billeder ved hjælp af AI. I mo
Billedklassifikation handler om at klassificere et billede som helhed - hvad er sandsynligheden for, at hele billedet matcher hvert tag. Du får sandsynligheder tilbage for hvert tag, der blev brugt til at træne modellen.


I eksemplet ovenfor klassificeres to billeder ved hjælp af en model, der er trænet til at klassificere bøtter med cashewnødder eller dåser med tomatpuré. Det første billede er en bøtte med cashewnødder og har to resultater fra billedklassifikatoren:
@ -60,7 +60,7 @@ Når du derefter bruger den til at forudsige billeder, får du ikke en liste ove
> 🎓 *Afgrænsningsbokse* er boksene omkring et objekt.


Billedet ovenfor indeholder både en bøtte med cashewnødder og tre dåser tomatpuré. Objektgenkendelsesmodellen har fundet cashewnødderne og returneret afgrænsningsboksen, der indeholder cashewnødderne, med sandsynligheden for, at afgrænsningsboksen indeholder objektet, i dette tilfælde 97.6%. Modellen har også fundet tre dåser tomatpuré og giver tre separate afgrænsningsbokse, én for hver fundet dåse, og hver med en sandsynlighedsprocent for, at afgrænsningsboksen indeholder en dåse tomatpuré.
@ -111,7 +111,7 @@ Du kan træne en objektgenkendelsesmodel ved hjælp af Custom Vision, på en lig
Når du opretter dit projekt, skal du sørge for at bruge `stock-detector-training`-ressourcen, du oprettede tidligere. Brug projekttypen *Object Detection* og domænet *Products on Shelves*.


✅ Domænet *Products on Shelves* er specifikt målrettet mod at genkende lager på butikshylder. Læs mere om de forskellige domæner i [Select a domain-dokumentationen på Microsoft Docs](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/select-domain?WT.mc_id=academic-17441-jabenn#object-detection)
@ -133,11 +133,11 @@ For at træne din model skal du bruge et sæt billeder, der indeholder de objekt
1. Følg [Upload og tag billeder-sektionen i Build an object detector quickstart på Microsoft Docs](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/get-started-build-detector?WT.mc_id=academic-17441-jabenn#upload-and-tag-images) for at uploade dine træningsbilleder. Opret relevante tags afhængigt af de typer objekter, du vil genkende.


Når du tegner afgrænsningsbokse for objekter, skal du holde dem stramt omkring objektet. Det kan tage lidt tid at markere alle billederne, men værktøjet vil foreslå, hvad det tror er afgrænsningsboksene, hvilket gør det hurtigere.


> 💁 Hvis du har mere end 15 billeder for hvert objekt, kan du træne efter 15 og derefter bruge funktionen **Suggested tags**. Dette vil bruge den trænede model til at genkende objekterne i de ikke-mærkede billeder. Du kan derefter bekræfte de genkendte objekter eller afvise og gen-tegne afgrænsningsboksene. Dette kan spare *meget* tid.
@ -155,7 +155,7 @@ Når din objektgenkendelsesmodel er trænet, kan du teste den ved at give den ny
1. Brug knappen **Quick Test** til at uploade testbilleder og verificere, at objekterne genkendes. Brug de testbilleder, du oprettede tidligere, ikke nogen af de billeder, du brugte til træning.


1. Prøv alle de testbilleder, du har adgang til, og observer sandsynlighederne.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -62,7 +62,7 @@ Iterationer udgives fra Custom Vision-portalen.
1. I dialogboksen *Publish Model* skal du indstille *Prediction resource* til den `stock-detector-prediction`-ressource, du oprettede i den sidste lektion. Lad navnet være `Iteration2`, og vælg knappen **Publish**.
@ -76,7 +76,7 @@ Iterationer udgives fra Custom Vision-portalen.
Tag også en kopi af værdien *Prediction-Key*. Dette er en sikker nøgle, som du skal sende, når du kalder modellen. Kun applikationer, der sender denne nøgle, har tilladelse til at bruge modellen, alle andre applikationer afvises.


✅ Når en ny iteration udgives, vil den have et andet navn. Hvordan tror du, at du ville ændre den iteration, som en IoT-enhed bruger?
@ -95,7 +95,7 @@ Når du bruger objektdetektoren, får du ikke kun de registrerede objekter med d
Resultaterne af en forudsigelse i fanen **Predictions** i Custom Vision har afgrænsningsboksene tegnet på det billede, der blev sendt til forudsigelse.


I billedet ovenfor blev 4 dåser tomatpuré registreret. I resultaterne er en rød firkant overlejret for hvert objekt, der blev registreret i billedet, hvilket angiver afgrænsningsboksen for billedet.
@ -103,7 +103,7 @@ I billedet ovenfor blev 4 dåser tomatpuré registreret. I resultaterne er en r
Afgrænsningsbokse defineres med 4 værdier - top, venstre, højde og bredde. Disse værdier er på en skala fra 0-1, der repræsenterer positionerne som en procentdel af billedets størrelse. Oprindelsen (0,0-positionen) er øverste venstre hjørne af billedet, så topværdien er afstanden fra toppen, og bunden af afgrænsningsboksen er toppen plus højden.


Billedet ovenfor er 600 pixels bredt og 800 pixels højt. Afgrænsningsboksen starter 320 pixels nede, hvilket giver en topkoordinat på 0,4 (800 x 0,4 = 320). Fra venstre starter afgrænsningsboksen 240 pixels inde, hvilket giver en venstre koordinat på 0,4 (600 x 0,4 = 240). Højden på afgrænsningsboksen er 240 pixels, hvilket giver en højdeværdi på 0,3 (800 x 0,3 = 240). Bredden på afgrænsningsboksen er 120 pixels, hvilket giver en breddeværdi på 0,2 (600 x 0,2 = 120).
@ -118,7 +118,7 @@ Ved at bruge procentværdier fra 0-1 betyder det, at uanset hvilken størrelse b
Du kan bruge afgrænsningsbokse kombineret med sandsynligheder til at evaluere, hvor præcis en registrering er. For eksempel kan en objektdetektor registrere flere objekter, der overlapper hinanden, for eksempel registrere én dåse inde i en anden. Din kode kunne se på afgrænsningsboksene, forstå, at dette er umuligt, og ignorere eventuelle objekter, der har en betydelig overlapning med andre objekter.


I eksemplet ovenfor angav en afgrænsningsboks en forudsagt dåse tomatpuré med 78,3 %. En anden afgrænsningsboks er lidt mindre og er inde i den første afgrænsningsboks med en sandsynlighed på 64,3 %. Din kode kan tjekke afgrænsningsboksene, se, at de overlapper fuldstændigt, og ignorere den lavere sandsynlighed, da det ikke er muligt, at én dåse er inde i en anden.
@ -67,7 +67,7 @@ Koden, du brugte til at klassificere billeder, ligner meget koden til at detekte
Du vil kunne se det billede, der blev taget, og disse værdier i **Predictions**-fanen i Custom Vision.


> 💁 Du kan finde denne kode i mappen [code-detect/pi](../../../../../5-retail/lessons/2-check-stock-device/code-detect/pi) eller [code-detect/virtual-iot-device](../../../../../5-retail/lessons/2-check-stock-device/code-detect/virtual-iot-device).
@ -95,7 +95,7 @@ Den kode, du brugte til at klassificere billeder, ligner meget koden til at dete
Du vil kunne se det billede, der blev taget, og disse værdier i **Predictions**-fanen i Custom Vision.


> 💁 Du kan finde denne kode i mappen [code-detect/wio-terminal](../../../../../5-retail/lessons/2-check-stock-device/code-detect/wio-terminal).


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -51,7 +51,7 @@ Mikrofoner findes i forskellige typer:
Dynamiske mikrofoner behøver ikke strøm for at fungere; det elektriske signal skabes udelukkende af mikrofonen.


* Bånd - Båndmikrofoner ligner dynamiske mikrofoner, men de har et metalbånd i stedet for en membran. Dette bånd bevæger sig i et magnetfelt og genererer en elektrisk strøm. Ligesom dynamiske mikrofoner behøver båndmikrofoner ikke strøm for at fungere.
@ -59,11 +59,11 @@ Mikrofoner findes i forskellige typer:
* Kondensator - Kondensatormikrofoner har en tynd metalmembran og en fast metalbagplade. Elektricitet påføres begge dele, og når membranen vibrerer, ændres den statiske ladning mellem pladerne og genererer et signal. Kondensatormikrofoner kræver strøm for at fungere - kaldet *Phantom power*.


* MEMS - Mikroelektromekaniske systemmikrofoner, eller MEMS, er mikrofoner på en chip. De har en trykfølsom membran ætset på en siliciumchip og fungerer på samme måde som en kondensatormikrofon. Disse mikrofoner kan være meget små og integreret i kredsløb.


På billedet ovenfor er chippen mærket **LEFT** en MEMS-mikrofon med en lille membran mindre end en millimeter bred.
@ -159,7 +159,7 @@ For at undgå kompleksiteten ved at træne og bruge en vågningsordsmodel vil de
## Konverter tale til tekst


Ligesom med billedklassifikation i et tidligere projekt findes der forudbyggede AI-tjenester, der kan tage tale som en lydfil og konvertere det til tekst. En sådan tjeneste er Speech Service, en del af Cognitive Services, forudbyggede AI-tjenester, du kan bruge i dine apps.
1. Sæt den ene ende af et Grove-kabel i stikket på knapmodulet. 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 mærket **D5** på Grove Base HAT'en, der er tilsluttet Pi'en. Dette stik er det andet fra venstre i rækken af stik ved siden af GPIO-pindene.
@ -34,7 +34,7 @@ Mikrofonen og højttalerne skal tilsluttes og konfigureres.
1. Hvis du bruger ReSpeaker 2-Mics Pi HAT, kan du fjerne Grove-basen og derefter montere ReSpeaker-hatten i stedet.


Du får brug for en Grove-knap senere i denne lektion, men en er indbygget i denne hat, så Grove-basen er ikke nødvendig.
@ -10,7 +10,7 @@ Den indbyggede mikrofon opfanger et analogt signal, som bliver konverteret til e
✅ Læs mere om DMA på [siden om direkte hukommelsesadgang på Wikipedia](https://wikipedia.org/wiki/Direct_memory_access).


DMAC kan optage lyd fra ADC'en med faste intervaller, for eksempel 16.000 gange i sekundet for 16KHz lyd. Den kan skrive disse optagede data til en forudallokeret hukommelsesbuffer, og når denne er fuld, gøre den tilgængelig for din kode til behandling. Brug af denne hukommelse kan forsinke lydoptagelsen, men du kan opsætte flere buffere. DMAC skriver til buffer 1, og når den er fuld, giver den besked til din kode om at behandle buffer 1, mens DMAC skriver til buffer 2. Når buffer 2 er fuld, giver den besked til din kode og går tilbage til at skrive til buffer 1. På den måde mister du ingen data, så længe du behandler hver buffer hurtigere, end det tager at fylde en.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -46,7 +46,7 @@ Sprogforståelsesmodeller er AI-modeller, der er trænet til at udtrække visse
Du kan oprette sprogforståelsesmodeller ved hjælp af LUIS, en sprogforståelsestjeneste fra Microsoft, der er en del af Cognitive Services.
@ -169,7 +169,7 @@ Du kan finde instruktioner til brug af LUIS-portalen i [Quickstart: Build your a
1. Når du indtaster hvert eksempel, vil LUIS begynde at registrere entiteter og understrege og mærke dem, den finder.




> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
@ -74,7 +74,7 @@ Der findes en række AI-tjenester, som du kan bruge fra dine applikationer til a
### Cognitive Services Speech Service


Tale-tjenesten, som du har brugt i de sidste par lektioner, har oversættelsesmuligheder for talegenkendelse. Når du genkender tale, kan du anmode om ikke kun teksten af talen på samme sprog, men også på andre sprog.
@ -82,7 +82,7 @@ Tale-tjenesten, som du har brugt i de sidste par lektioner, har oversættelsesmu
### Cognitive Services Translator Service


Translator-tjenesten er en dedikeret oversættelsestjeneste, der kan oversætte tekst fra ét sprog til ét eller flere målsprog. Ud over at oversætte understøtter den en bred vifte af ekstra funktioner, herunder maskering af bandeord. Den giver dig også mulighed for at angive en specifik oversættelse for et bestemt ord eller en sætning, så du kan arbejde med termer, du ikke ønsker oversat, eller have en specifik velkendt oversættelse.
@ -25,7 +25,7 @@ REST API'en for taletjenesten understøtter ikke direkte oversættelser, men du
>
> For eksempel, hvis du træner LUIS på engelsk, men ønsker at bruge fransk som brugersprog, kan du oversætte sætninger som "set a 2 minute and 27 second timer" fra engelsk til fransk ved hjælp af Bing Translate og derefter bruge knappen **Lyt til oversættelse** til at tale oversættelsen ind i din mikrofon.
>
> 
> 
1. Tilføj oversættelses-API-nøglen under `speech_api_key`:
@ -37,7 +37,7 @@ Tale-tjenesten kan tage tale og ikke kun konvertere den til tekst på samme spro
>
> For eksempel, hvis du træner LUIS på engelsk, men ønsker at bruge fransk som brugersprog, kan du oversætte sætninger som "set a 2 minute and 27 second timer" fra engelsk til fransk ved hjælp af Bing Translate og derefter bruge knappen **Lyt til oversættelse** til at tale oversættelsen ind i din mikrofon.
>
> 
> 
1. Erstat deklarationerne `recognizer_config` og `recognizer` med følgende:
@ -105,7 +105,7 @@ REST API'en for taletjenesten understøtter ikke direkte oversættelser. I stede
>
> For eksempel, hvis du træner LUIS på engelsk, men ønsker at bruge fransk som brugersprog, kan du oversætte sætninger som "set a 2 minute and 27 second timer" fra engelsk til fransk ved hjælp af Bing Translate, og derefter bruge knappen **Lyt til oversættelse** til at tale oversættelsen ind i din mikrofon.
>
> 
> 
1. Tilføj oversættelsestjenestens API-nøgle og placering under `SPEECH_LOCATION`:
Hvis du sidder fast eller har spørgsmål om at bygge AI-apps. Deltag i diskussioner om MCP med andre lærende og erfarne udviklere. Det er et støttende fællesskab, hvor spørgsmål er velkomne, og viden deles frit.
Hvis du sidder fast eller har spørgsmål om at bygge AI-apps, så deltag med lærende og erfarne udviklere i diskussioner om MCP. Det er et støttende fællesskab, hvor spørgsmål er velkomne, og viden deles frit.
> git sparse-checkout set --no-cone "/*" "!translations" "!translated_images"
> ```
>
> Dette giver dig alt, hvad du behøver for at gennemføre kurset med en meget hurtigere download.
<!-- CO-OP TRANSLATOR LANGUAGES TABLE END -->
# IoT for Begyndere – Et læseplan
# IoT for Begyndere - Et Curriculum
Azure Cloud Advocates hos Microsoft er glade for at tilbyde en 12-ugers, 24-lektioners læseplan, der handler om IoT-grundlæggende. Hver lektion inkluderer for- og efter-quizzer, skriftlige instruktioner til at gennemføre lektionen, en løsning, en opgave og mere. Vores projektbaserede undervisningsmetode gør det muligt for dig at lære ved at bygge, en dokumenteret måde at fastholde nye færdigheder på.
Azure Cloud Advocates hos Microsoft er glade for at tilbyde et 12-ugers, 24-lektioners curriculum, der handler om IoT grundlæggende. Hver lektion inkluderer quizzer før og efter lektionen, skriftlige instruktioner til at gennemføre lektionen, en løsning, en opgave og mere. Vores projektbaserede pædagogik giver dig mulighed for at lære mens du bygger, en dokumenteret måde for nye færdigheder at 'sætte sig fast'.
Projekterne dækker fødevarens rejse fra mark til bord. Dette inkluderer landbrug, logistik, produktion, detailhandel og forbruger – alle populære industrisektorer for IoT-enheder.
Projekterne dækker fødevarets rejse fra gård til bord. Dette inkluderer landbrug, logistik, fremstilling, detailhandel og forbruger – alle populære brancheområder for IoT-enheder.


> Sketchnote af [Nitya Narasimhan](https://github.com/nitya). Klik på billedet for en større version.
**En hjertelig tak til vores forfattere [Jen Fox](https://github.com/jenfoxbot), [Jen Looper](https://github.com/jlooper), [Jim Bennett](https://github.com/jimbobbennett), og vores sketchnote-kunstner [Nitya Narasimhan](https://github.com/nitya).**
**En hjertelig tak til vores forfattere [Jen Fox](https://github.com/jenfoxbot), [Jen Looper](https://github.com/jlooper), [Jim Bennett](https://github.com/jimbobbennett), og vores sketchnote-artist [Nitya Narasimhan](https://github.com/nitya).**
**Tak også til vores team af [Microsoft Learn Student Ambassadors](https://studentambassadors.microsoft.com?WT.mc_id=academic-17441-jabenn), som har gennemgået og oversat denne læseplan – [Aditya Garg](https://github.com/AdityaGarg00), [Anurag Sharma](https://github.com/Anurag-0-1-A), [Arpita Das](https://github.com/Arpiiitaaa), [Aryan Jain](https://www.linkedin.com/in/aryan-jain-47a4a1145/), [Bhavesh Suneja](https://github.com/EliteWarrior315), [Faith Hunja](https://faithhunja.github.io/), [Lateefah Bello](https://www.linkedin.com/in/lateefah-bello/), [Manvi Jha](https://github.com/Severus-Matthew), [Mireille Tan](https://www.linkedin.com/in/mireille-tan-a4834819a/), [Mohammad Iftekher (Iftu) Ebne Jalal](https://github.com/Iftu119), [Mohammad Zulfikar](https://github.com/mohzulfikar), [Priyanshu Srivastav](https://www.linkedin.com/in/priyanshu-srivastav-b067241ba), [Thanmai Gowducheruvu](https://github.com/innovation-platform), og [Zina Kamel](https://www.linkedin.com/in/zina-kamel/).**
**Tak også til vores team af [Microsoft Learn Student Ambassadors](https://studentambassadors.microsoft.com?WT.mc_id=academic-17441-jabenn), som har gennemgået og oversat dette curriculum - [Aditya Garg](https://github.com/AdityaGarg00), [Anurag Sharma](https://github.com/Anurag-0-1-A), [Arpita Das](https://github.com/Arpiiitaaa), [Aryan Jain](https://www.linkedin.com/in/aryan-jain-47a4a1145/), [Bhavesh Suneja](https://github.com/EliteWarrior315), [Faith Hunja](https://faithhunja.github.io/), [Lateefah Bello](https://www.linkedin.com/in/lateefah-bello/), [Manvi Jha](https://github.com/Severus-Matthew), [Mireille Tan](https://www.linkedin.com/in/mireille-tan-a4834819a/), [Mohammad Iftekher (Iftu) Ebne Jalal](https://github.com/Iftu119), [Mohammad Zulfikar](https://github.com/mohzulfikar), [Priyanshu Srivastav](https://www.linkedin.com/in/priyanshu-srivastav-b067241ba), [Thanmai Gowducheruvu](https://github.com/innovation-platform), og [Zina Kamel](https://www.linkedin.com/in/zina-kamel/).**
Mød teamet!
@ -64,9 +74,9 @@ Mød teamet!
> 🎥 Klik på billedet ovenfor for en video om projektet!
> **Lærere**, vi har [inkluderet nogle forslag](for-teachers.md) til, hvordan man bruger denne læseplan. Hvis du ønsker at oprette dine egne lektioner, har vi også inkluderet en [lektionsskabelon](lesson-template/README.md).
> **Lærere**, vi har [inkluderet nogle forslag](for-teachers.md) til, hvordan man bruger dette curriculum. Hvis du ønsker at oprette dine egne lektioner, har vi også inkluderet en [lektion-skabelon](lesson-template/README.md).
> **[Studerende](https://aka.ms/student-page)**, for at bruge denne læseplan på egen hånd, forgrene hele repoet og gennemføre øvelserne alene, startende med en for-forelæsningsquiz, derefter læs forelæsningen og gennemfør resten af aktiviteterne. Prøv at skabe projekterne ved at forstå lektionerne i stedet for blot at kopiere løsningskoden; denne kode er dog tilgængelig i /solutions-mapperne i hver projektorienteret lektion. En anden ide er at danne en studiegruppe med venner og gennemgå indholdet sammen. Til yderligere studier anbefaler vi [Microsoft Learn](https://docs.microsoft.com/users/jimbobbennett/collections/ke2ehd351jopwr?WT.mc_id=academic-17441-jabenn).
> **[Studerende](https://aka.ms/student-page)**, for at bruge dette curriculum på egen hånd, forkynd hele repo'et og gennemfør øvelserne selv, startende med en quiz før lektionen, læs lektionen og gennemfør resten af aktiviteterne. Prøv at skabe projekterne ved at forstå lektionerne i stedet for blot at kopiere løsningskoden; dog er denne kode tilgængelig i /solutions mapperne i hver projektorienterede lektion. En anden idé er at danne en studiegruppe med venner og gennemgå materialet sammen. Til yderligere studie anbefaler vi [Microsoft Learn](https://docs.microsoft.com/users/jimbobbennett/collections/ke2ehd351jopwr?WT.mc_id=academic-17441-jabenn).
For en videooversigt over dette kursus, se denne video:
@ -76,76 +86,76 @@ For en videooversigt over dette kursus, se denne video:
## Pædagogik
Vi har valgt to pædagogiske principper, mens vi byggede denne læseplan: at sikre, at den er projektbaseret, og at den inkluderer hyppige quizzer. Ved slutningen af denne serie vil eleverne have bygget et system til overvågning og vanding af planter, en køretøjs-tracker, et smart fabriks-setup til at spore og kontrollere mad og en stemmestyret madlavningstimer, og vil have lært det grundlæggende om Internet of Things, herunder hvordan man skriver enhedskode, forbinder til skyen, analyserer telemetri og kører AI ved kanten.
Vi har valgt to pædagogiske principper under udformningen af dette curriculum: sikring af at det er projektbaseret og at det indeholder hyppige quizzer. Ved slutningen af denne serie vil de studerende have bygget et system til overvågning og vanding af planter, en køretøjssporing, et smart fabriksetup til at spore og kontrollere mad, og en stemmestyret madlavningstimer, samt lært det grundlæggende om Internet of Things, inklusive hvordan man skriver enhedskode, forbinder til skyen, analyserer telemetri og kører AI ved kanten.
Ved at sikre, at indholdet hænger sammen med projekterne, bliver processen mere engagerende for eleverne, og fastholdelsen af koncepter vil blive forbedret.
Ved at sikre at indholdet stemmer overens med projekterne, bliver processen mere engagerende for de studerende og fastholdelsen af begreber øges.
Derudover sætter en lavrisiko-quiz før en klasse elevens hensigt mod at lære et emne, mens en anden quiz efter klassen sikrer yderligere fastholdelse. Denne læseplan er designet til at være fleksibel og sjov og kan tages helt eller delvist. Projekterne starter småt og bliver gradvist mere komplekse ved slutningen af den 12-ugers cyklus.
Derudover sætter en lavrisiko quiz før en klasse den studerendes intention mod at lære et emne, mens en anden quiz efter klassen sikrer yderligere fastholdelse. Dette curriculum er designet til at være fleksibelt og sjovt og kan tages helt eller delvist. Projekterne starter småt og bliver mere komplekse ved slutningen af den 12-ugers cyklus.
Hvert projekt er baseret på hardware fra den virkelige verden, som er tilgængelig for studerende og hobbyister. Hvert projekt undersøger det specifikke projektområde og giver relevant baggrundsviden. For at være en succesfuld udvikler hjælper det at forstå det domæne, hvor man løser problemer; ved at give denne baggrundsviden kan eleverne tænke over deres IoT-løsninger og læring i konteksten af den slags virkelige problemer, de kunne blive bedt om at løse som IoT-udvikler. Eleverne lærer ’hvorfor’ bag de løsninger, de bygger, og får en forståelse for slutbrugeren.
Hvert projekt er baseret på hardware fra den virkelige verden, som er tilgængelig for studerende og hobbyister. Hvert projekt dykker ned i det specifikke projektområde og giver relevant baggrundsviden. For at blive en succesfuld udvikler hjælper det at forstå domænet, hvor du løser problemer. Denne baggrundsviden giver de studerende mulighed for at tænke over deres IoT-løsninger og lære i konteksten af den slags virkelige problemer, de kan blive bedt om at løse som IoT-udviklere. Studerende lærer 'hvorfor' af de løsninger, de bygger, og får en forståelse for slutbrugeren.
## Hardware
Vi har to valgmuligheder for IoT-hardware til brug for projekterne afhængigt af personlige præferencer, programmeringssprogskundskaber eller præferencer, læringsmål og tilgængelighed. Vi har også leveret en 'virtuel hardware'-version til dem, der ikke har adgang til hardware, eller som ønsker at lære mere, inden de forpligter sig til et køb. Du kan læse mere og finde en 'indkøbsliste' på [hardware-siden](./hardware.md), inklusive links til køb af komplette kits fra vores venner hos Seeed Studio.
Vi har to valgmuligheder for IoT-hardware til projekterne afhængig af personlige præferencer, programmeringssprogs-kendskab, læringsmål og tilgængelighed. Vi har også leveret en 'virtuel hardware'-version for dem, der ikke har adgang til fysisk hardware, eller som ønsker at lære mere inden de køber. Du kan læse mere og finde en ’indkøbsliste’ på [hardware-siden](./hardware.md), inklusive links til at købe komplette kits fra vores venner hos Seeed Studio.
> 💁 Find vores [Code of Conduct](CODE_OF_CONDUCT.md), [Contributing](CONTRIBUTING.md) og [Translation](TRANSLATIONS.md) retningslinjer. Vi byder din konstruktive feedback velkommen!
> 💁 Find vores [Adfærdskodeks](CODE_OF_CONDUCT.md), [Bidrag](CONTRIBUTING.md) og [Oversættelses](TRANSLATIONS.md) retningslinjer. Vi byder din konstruktive feedback velkommen!
>
> 🔧 Har du problemer? Se vores [Troubleshooting Guide](TROUBLESHOOTING.md) for løsninger på almindelige problemer.
> 🔧 Har du problemer? Tjek vores [Fejlfinding Guide](TROUBLESHOOTING.md) for løsninger på almindelige problemer.
## Hver lektion inkluderer:
- sketchnote
- valgfri supplerende video
- warmup quiz før lektionen
- skreven lektion
- for projektbaserede lektioner, trin-for-trin-vejledninger i hvordan man bygger projektet
- videnschecks
- opvarmningsquiz før lektionen
- skriftlig lektion
- for projektbaserede lektioner trin-for-trin vejledninger om, hvordan man bygger projektet
- videnskontroller
- en udfordring
- supplerende læsning
- opgave
- [quiz efter lektionen](https://ff-quizzes.netlify.app/en/)
> **En note om quizzer**: Alle quizzer findes i quiz-app mappen, med i alt 48 quizzer med tre spørgsmål hver. De er linket fra lektionerne, men quiz-appen kan køre lokalt eller deployeres til Azure; følg instruktionerne i `quiz-app` mappen. De bliver gradvist lokaliseret.
> **En note om quizzer**: Alle quizzer findes i quiz-app mappen, i alt 48 quizzer med tre spørgsmål hver. De er linket fra lektionerne, men quiz-appen kan køres lokalt eller implementeres på Azure; følg instruktionerne i `quiz-app` mappen. De bliver gradvist oversat.
| 01 | [Kom godt i gang](./1-getting-started/README.md) | Introduktion til IoT | Lær de grundlæggende principper for IoT og grundlæggende byggeklodser til IoT-løsninger såsom sensorer og cloud-tjenester mens du opsætter din første IoT-enhed | [Introduktion til IoT](./1-getting-started/lessons/1-introduction-to-iot/README.md) |
| 02 | [Kom godt i gang](./1-getting-started/README.md) | En dybere introduktion til IoT | Lær mere om komponenterne i et IoT-system, samt mikrokontrollere og enkeltkort-computere | [En dybere introduktion til IoT](./1-getting-started/lessons/2-deeper-dive/README.md) |
| 03 | [Kom godt i gang](./1-getting-started/README.md) | Interagér med den fysiske verden med sensorer og aktuatorer | Lær om sensorer til at indsamle data fra den fysiske verden, og aktuatorer til at sende feedback, mens du bygger et natlys | [Interagér med den fysiske verden med sensorer og aktuatorer](./1-getting-started/lessons/3-sensors-and-actuators/README.md) |
| 04 | [Kom godt i gang](./1-getting-started/README.md) | Forbind din enhed til internettet | Lær om, hvordan man forbinder en IoT-enhed til internettet for at sende og modtage beskeder ved at forbinde dit natlys til en MQTT-broker | [Forbind din enhed til internettet](./1-getting-started/lessons/4-connect-internet/README.md) |
| 05 | [Farm](./2-farm/README.md) | Forudsig plantevækst | Lær hvordan man forudsiger plantevækst ved hjælp af temperaturdata indsamlet af en IoT-enhed | [Forudsig plantevækst](./2-farm/lessons/1-predict-plant-growth/README.md) |
| 06 | [Farm](./2-farm/README.md) | Registrer jordfugtighed | Lær hvordan man registrerer jordfugtighed og kalibrerer en jordfugtighedssensor | [Registrer jordfugtighed](./2-farm/lessons/2-detect-soil-moisture/README.md) |
| 07 | [Farm](./2-farm/README.md) | Automatiseret plantevanding | Lær hvordan man automatiserer og timer vanding ved hjælp af et relæ og MQTT | [Automatiseret plantevanding](./2-farm/lessons/3-automated-plant-watering/README.md) |
| 08 | [Farm](./2-farm/README.md) | Migrer din plante til skyen | Lær om skyen og cloud-hostede IoT-tjenester og hvordan du forbinder din plante til en af disse i stedet for en offentlig MQTT-broker | [Migrer din plante til skyen](./2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md) |
| 09 | [Farm](./2-farm/README.md) | Migrer din applikationslogik til skyen | Lær om, hvordan du kan skrive applikationslogik i skyen, der reagerer på IoT-beskeder | [Migrer din applikationslogik til skyen](./2-farm/lessons/5-migrate-application-to-the-cloud/README.md) |
| 10 | [Farm](./2-farm/README.md) | Hold din plante sikker | Lær om sikkerhed med IoT og hvordan du holder din plante sikker med nøgler og certifikater | [Hold din plante sikker](./2-farm/lessons/6-keep-your-plant-secure/README.md) |
| 11 | [Transport](./3-transport/README.md) | Lokationssporing | Lær om GPS-lokationssporing for IoT-enheder | [Lokationssporing](./3-transport/lessons/1-location-tracking/README.md) |
| 12 | [Transport](./3-transport/README.md) | Gem lokationsdata | Lær hvordan man gemmer IoT-data for senere visualisering eller analyse | [Gem lokationsdata](./3-transport/lessons/2-store-location-data/README.md) |
| 13 | [Transport](./3-transport/README.md) | Visualisér lokationsdata | Lær om at visualisere lokationsdata på et kort, og hvordan kort repræsenterer den virkelige 3D-verden i 2 dimensioner | [Visualisér lokationsdata](./3-transport/lessons/3-visualize-location-data/README.md) |
| 14 | [Transport](./3-transport/README.md) | Geofences | Lær om geofences, og hvordan de kan bruges til at advare, når køretøjer i forsyningskæden er tæt på deres destination | [Geofences](./3-transport/lessons/4-geofences/README.md) |
| 15 | [Manufacturing](./4-manufacturing/README.md) | Træn en frugtkvalitetsdetektor | Lær om at træne en billedklassifikator i skyen til at detektere frugtkvalitet | [Træn en frugtkvalitetsdetektor](./4-manufacturing/lessons/1-train-fruit-detector/README.md) |
| 16 | [Manufacturing](./4-manufacturing/README.md) | Tjek frugtkvalitet fra en IoT-enhed | Lær om brugen af din frugtkvalitetsdetektor fra en IoT-enhed | [Tjek frugtkvalitet fra en IoT-enhed](./4-manufacturing/lessons/2-check-fruit-from-device/README.md) |
| 17 | [Manufacturing](./4-manufacturing/README.md) | Kør din frugtdetektor på kanten | Lær om at køre din frugtdetektor på en IoT-enhed på kanten | [Kør din frugtdetektor på kanten](./4-manufacturing/lessons/3-run-fruit-detector-edge/README.md) |
| 18 | [Manufacturing](./4-manufacturing/README.md) | Udløs frugtkvalitetsdetektion fra en sensor | Lær om at udløse frugtkvalitetsdetektion fra en sensor | [Udløs frugtkvalitetsdetektion fra en sensor](./4-manufacturing/lessons/4-trigger-fruit-detector/README.md) |
| 19 | [Retail](./5-retail/README.md) | Træn en lagerdetektor | Lær hvordan du bruger objektdetektion til at træne en lagerdetektor til at tælle lager i en butik | [Træn en lagerdetektor](./5-retail/lessons/1-train-stock-detector/README.md) |
| 20 | [Retail](./5-retail/README.md) | Tjek lager fra en IoT-enhed | Lær hvordan man tjekker lager fra en IoT-enhed ved hjælp af en objektdetekteringsmodel| [Tjek lager fra en IoT-enhed](./5-retail/lessons/2-check-stock-device/README.md) |
| 21 | [Consumer](./6-consumer/README.md) | Genkend tale med en IoT-enhed | Lær hvordan man genkender tale fra en IoT-enhed til at bygge en smart timer | [Genkend tale med en IoT-enhed](./6-consumer/lessons/1-speech-recognition/README.md) |
| 22 | [Consumer](./6-consumer/README.md) | Forstå sprog | Lær hvordan man forstår sætninger talt til en IoT-enhed | [Forstå sprog](./6-consumer/lessons/2-language-understanding/README.md) |
| 23 | [Consumer](./6-consumer/README.md) | Stil en timer og giv talt feedback | Lær hvordan du stiller en timer på en IoT-enhed og giver talt feedback om, hvornår timeren startes og slutter | [Stil en timer og giv talt feedback](./6-consumer/lessons/3-spoken-feedback/README.md) |
| 24 | [Consumer](./6-consumer/README.md) | Understøt flere sprog | Lær hvordan man understøtter flere sprog, både i tale til enheden og i svarene fra din smart timer | [Understøt flere sprog](./6-consumer/lessons/4-multiple-language-support/README.md) |
| | Projekt navn | Underviste begreber | Læringsmål | Linket lektion |
| 01 | [Kom godt i gang](./1-getting-started/README.md) | Introduktion til IoT | Lær de grundlæggende principper for IoT og de grundlæggende byggesten i IoT-løsninger såsom sensorer og cloud-tjenester, mens du opsætter din første IoT-enhed | [Introduktion til IoT](./1-getting-started/lessons/1-introduction-to-iot/README.md) |
| 02 | [Kom godt i gang](./1-getting-started/README.md) | Et dybere dyk i IoT | Lær mere om komponenterne i et IoT-system, samt mikrocontrollere og enkeltkort computere | [Et dybere dyk i IoT](./1-getting-started/lessons/2-deeper-dive/README.md) |
| 03 | [Kom godt i gang](./1-getting-started/README.md) | Interagér med den fysiske verden med sensorer og aktuatorer | Lær om sensorer til at indsamle data fra den fysiske verden og aktuatorer til at sende feedback, mens du bygger en natlampe | [Interagér med den fysiske verden med sensorer og aktuatorer](./1-getting-started/lessons/3-sensors-and-actuators/README.md) |
| 04 | [Kom godt i gang](./1-getting-started/README.md) | Forbind din enhed til internettet | Lær om, hvordan man forbinder en IoT-enhed til internettet for at sende og modtage beskeder ved at forbinde din natlampe til en MQTT-broker | [Forbind din enhed til internettet](./1-getting-started/lessons/4-connect-internet/README.md) |
| 05 | [Farm](./2-farm/README.md) | Forudsige plantevækst | Lær hvordan man forudsiger plantevækst ved hjælp af temperaturdata indsamlet af en IoT-enhed | [Forudsige plantevækst](./2-farm/lessons/1-predict-plant-growth/README.md) |
| 06 | [Farm](./2-farm/README.md) | Registrer jordfugtighed | Lær hvordan man registrerer jordfugtighed og kalibrerer en jordfugtighedssensor | [Registrer jordfugtighed](./2-farm/lessons/2-detect-soil-moisture/README.md) |
| 07 | [Farm](./2-farm/README.md) | Automatiseret vanding af planter | Lær hvordan man automatiserer og tidsindstiller vanding ved hjælp af et relæ og MQTT | [Automatiseret vanding af planter](./2-farm/lessons/3-automated-plant-watering/README.md) |
| 08 | [Farm](./2-farm/README.md) | Migrer din plante til skyen | Lær om skyen og cloud-hostede IoT-tjenester og hvordan du forbinder din plante til en af disse i stedet for en offentlig MQTT-broker | [Migrer din plante til skyen](./2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md) |
| 09 | [Farm](./2-farm/README.md) | Migrer din applikationslogik til skyen | Lær hvordan du kan skrive applikationslogik i skyen, der reagerer på IoT-beskeder | [Migrer din applikationslogik til skyen](./2-farm/lessons/5-migrate-application-to-the-cloud/README.md) |
| 10 | [Farm](./2-farm/README.md) | Hold din plante sikker | Lær om sikkerhed i IoT og hvordan du holder din plante sikker med nøgler og certifikater | [Hold din plante sikker](./2-farm/lessons/6-keep-your-plant-secure/README.md) |
| 11 | [Transport](./3-transport/README.md) | Lokationssporing | Lær om GPS-lokationssporing for IoT-enheder | [Lokationssporing](./3-transport/lessons/1-location-tracking/README.md) |
| 12 | [Transport](./3-transport/README.md) | Gem lokationsdata | Lær hvordan man gemmer IoT-data til senere visualisering eller analyse | [Gem lokationsdata](./3-transport/lessons/2-store-location-data/README.md) |
| 13 | [Transport](./3-transport/README.md) | Visualiser lokationsdata | Lær om visualisering af lokationsdata på et kort, og hvordan kort repræsenterer den rigtige 3D-verden i 2 dimensioner | [Visualiser lokationsdata](./3-transport/lessons/3-visualize-location-data/README.md) |
| 14 | [Transport](./3-transport/README.md) | Geofences | Lær om geofences, og hvordan de kan bruges til at advare, når køretøjer i forsyningskæden er tæt på deres destination | [Geofences](./3-transport/lessons/4-geofences/README.md) |
| 15 | [Manufacturing](./4-manufacturing/README.md) | Træn en frugtkvalitetsdetektor | Lær om at træne en billedklassificerer i skyen til at detektere frugtkvalitet | [Træn en frugtkvalitetsdetektor](./4-manufacturing/lessons/1-train-fruit-detector/README.md) |
| 16 | [Manufacturing](./4-manufacturing/README.md) | Kontroller frugtkvalitet fra en IoT-enhed | Lær om brugen af din frugtkvalitetsdetektor fra en IoT-enhed | [Kontroller frugtkvalitet fra en IoT-enhed](./4-manufacturing/lessons/2-check-fruit-from-device/README.md) |
| 17 | [Manufacturing](./4-manufacturing/README.md) | Kør din frugtdetektor på edge-enheden | Lær om at køre din frugtdetektor på en IoT-enhed ved edge | [Kør din frugtdetektor på edge-enheden](./4-manufacturing/lessons/3-run-fruit-detector-edge/README.md) |
| 18 | [Manufacturing](./4-manufacturing/README.md) | Udløs frugtkvalitetsdetektion fra en sensor | Lær om at udløse frugtkvalitetsdetektion fra en sensor | [Udløs frugtkvalitetsdetektion fra en sensor](./4-manufacturing/lessons/4-trigger-fruit-detector/README.md) |
| 19 | [Retail](./5-retail/README.md) | Træn en lagerdetektor | Lær hvordan du bruger objektdetektion til at træne en lagerdetektor til at tælle lager i en butik | [Træn en lagerdetektor](./5-retail/lessons/1-train-stock-detector/README.md) |
| 20 | [Retail](./5-retail/README.md) | Tjek lagerstatus fra en IoT-enhed | Lær hvordan du tjekker lagerstatus fra en IoT-enhed ved hjælp af en objektdetekteringsmodel | [Tjek lagerstatus fra en IoT-enhed](./5-retail/lessons/2-check-stock-device/README.md) |
| 21 | [Consumer](./6-consumer/README.md) | Genkend tale med en IoT-enhed | Lær hvordan du genkender tale fra en IoT-enhed for at bygge en smart timer | [Genkend tale med en IoT-enhed](./6-consumer/lessons/1-speech-recognition/README.md) |
| 22 | [Consumer](./6-consumer/README.md) | Forstå sprog | Lær hvordan man forstår sætninger talt til en IoT-enhed | [Forstå sprog](./6-consumer/lessons/2-language-understanding/README.md) |
| 23 | [Consumer](./6-consumer/README.md) | Indstil en timer og giv mundtlig feedback | Lær hvordan man indstiller en timer på en IoT-enhed og giver mundtlig feedback om, hvornår timeren starter og slutter | [Indstil en timer og giv mundtlig feedback](./6-consumer/lessons/3-spoken-feedback/README.md) |
| 24 | [Consumer](./6-consumer/README.md) | Understøt flere sprog | Lær hvordan man støtter flere sprog, både til at blive talt til og til svar fra din smarte timer | [Understøt flere sprog](./6-consumer/lessons/4-multiple-language-support/README.md) |
## Offline adgang
Du kan køre denne dokumentation offline ved at bruge [Docsify](https://docsify.js.org/#/). Fork dette repo, [installer Docsify](https://docsify.js.org/#/quickstart) på din lokale maskine, og kør derefter i roden af denne repo `docsify serve`. Hjemmesiden vil blive serveret på port 3000 på din localhost: `localhost:3000`.
Du kan køre denne dokumentation offline ved at bruge [Docsify](https://docsify.js.org/#/). Fork dette repo, [installer Docsify](https://docsify.js.org/#/quickstart) på din lokale maskine, og skriv derefter i rodmappen i dette repo `docsify serve`. Hjemmesiden vil blive serveret på port 3000 på din localhost: `localhost:3000`.
## Quiz
Tak til fællesskabet for at hoste det interaktive quiz, som tester din viden om hvert kapitel. Du kan teste din viden [her](https://ff-quizzes.netlify.app/en/)
Tak til community for at hoste den interaktive quiz, som tester din viden om hvert kapitel. Du kan teste din viden [her](https://ff-quizzes.netlify.app/en/)
### PDF
Du kan generere en PDF af dette indhold til offline brug, hvis nødvendigt. For at gøre dette, sørg for at have [npm installeret](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) og kør følgende kommandoer i roden af denne repo:
Du kan generere en PDF af dette indhold til offline adgang, hvis nødvendigt. For at gøre dette skal du sikre dig, at du har [npm installeret](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) og køre følgende kommandoer i rodmappen i dette repo:
```sh
npm i
@ -154,59 +164,60 @@ npm run convert
### Slides
Der er diaspræsentationer til nogle af lektionerne i [slides](../../slides) mappen.
Der findes slide-decks for nogle af lektionerne i [slides](../../slides) mappen.
## Andre pensum
Vores team producerer andre pensum! Tjek:
## Andre læseplaner
Vores team producerer andre læseplaner! Tjek:
<!-- CO-OP TRANSLATOR OTHER COURSES START -->
### LangChain
[](https://aka.ms/langchain4j-for-beginners)
[](https://aka.ms/langchainjs-for-beginners?WT.mc_id=m365-94501-dwahlin)
[](https://github.com/microsoft/langchain-for-beginners?WT.mc_id=m365-94501-dwahlin)
---
### Azure / Edge / MCP / Agenter
[](https://github.com/microsoft/AZD-for-beginners?WT.mc_id=academic-105485-koreyst)
[](https://github.com/microsoft/edgeai-for-beginners?WT.mc_id=academic-105485-koreyst)
[](https://github.com/microsoft/mcp-for-beginners?WT.mc_id=academic-105485-koreyst)
[](https://github.com/microsoft/ai-agents-for-beginners?WT.mc_id=academic-105485-koreyst)
[](https://github.com/microsoft/ai-agents-for-beginners?WT.mc_id=academic-105485-koreyst)
---
### Generativ AI-serie
[](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst)
[-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst)
[-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst)
[-E879F9?style=for-the-badge&labelColor=E5E7EB&color=E879F9)](https://github.com/microsoft/generative-ai-with-javascript?WT.mc_id=academic-105485-koreyst)
### Generativ AI Serie
[](https://github.com/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst)
[-9333EA?style=for-the-badge&labelColor=E5E7EB&color=9333EA)](https://github.com/microsoft/Generative-AI-for-beginners-dotnet?WT.mc_id=academic-105485-koreyst)
[-C084FC?style=for-the-badge&labelColor=E5E7EB&color=C084FC)](https://github.com/microsoft/generative-ai-for-beginners-java?WT.mc_id=academic-105485-koreyst)
[-E879F9?style=for-the-badge&labelColor=E5E7EB&color=E879F9)](https://github.com/microsoft/generative-ai-with-javascript?WT.mc_id=academic-105485-koreyst)
---
### Kerneundervisning
[](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst)
[](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst)
[](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst)
[](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung)
[](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst)
[](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst)
[](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst)
### Kernelæring
[](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst)
[](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst)
[](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst)
[](https://github.com/microsoft/Security-101?WT.mc_id=academic-96948-sayoung)
[](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst)
[](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst)
[](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst)
---
### Copilot-serie
[](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst)
### Copilot Serie
[](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst)
[](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers?WT.mc_id=academic-105485-koreyst)
Du kan finde alle henvisninger til billederne brugt i dette pensum, hvor det er nødvendigt, i [Henvisninger](./attributions.md).
Du kan finde alle henvisninger for billederne brugt i denne læreplan, hvor det er nødvendigt, i [Attributions](./attributions.md).
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**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, bedes du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det oprindelige dokument på dets modersmål 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 opstår som følge af brugen af denne oversættelse.
**Ansvarsfraskrivelse**:
Dette dokument er blevet oversat ved brug 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 skal anses for at være den autoritative kilde. For kritiske oplysninger anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.
@ -26,7 +26,7 @@ Seeed Studios har venligst gjort al hardware tilgængelig som letkøbte kits:
**[IoT for begyndere med Seeed og Microsoft - Raspberry Pi 4 Starter Kit](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Raspberry-Pi-Starter-Kit-p-5004.html)**
[](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Raspberry-Pi-Starter-Kit-p-5004.html)
[](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Raspberry-Pi-Starter-Kit-p-5004.html)
Sovellus on merkitty *Disconnected*-tilaan, ja oikean yläkulman LED on sammutettu.
@ -224,7 +224,7 @@ Toisena 'Hello World' -vaiheena käynnistät CounterFit-sovelluksen ja yhdistät
1. Aja `app.py`-tiedosto uudessa terminaalissa kuten aiemmin. CounterFitin tila muuttuu **Connected**-tilaan ja LED syttyy.


> 💁 Löydät tämän koodin [code/virtual-device](../../../../../1-getting-started/lessons/1-introduction-to-iot/code/virtual-device) -kansiosta.
> Sketchnote: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -38,7 +38,7 @@ IoT:n **laite**-osa viittaa laitteeseen, joka voi olla vuorovaikutuksessa fyysis
Nämä laitteet ovat vuorovaikutuksessa fyysisen maailman kanssa joko käyttämällä antureita ympäristönsä tietojen keräämiseen tai ohjaamalla ulostuloja tai toimilaitteita fyysisten muutosten tekemiseksi. Tyypillinen esimerkki on älykäs termostaatti – laite, jossa on lämpötila-anturi, tapa asettaa haluttu lämpötila, kuten säädin tai kosketusnäyttö, ja yhteys lämmitys- tai jäähdytysjärjestelmään, joka voidaan kytkeä päälle, kun havaittu lämpötila on halutun alueen ulkopuolella. Lämpötila-anturi havaitsee, että huone on liian kylmä, ja toimilaite kytkee lämmityksen päälle.


IoT-laitteina voi toimia valtava määrä erilaisia laitteita, yksinkertaisista antureista yleiskäyttöisiin laitteisiin, jopa älypuhelimeesi! Älypuhelin voi käyttää antureita ympäristönsä havaitsemiseen ja toimilaitteita vuorovaikutukseen maailman kanssa – esimerkiksi GPS-anturia sijaintisi havaitsemiseen ja kaiutinta navigointiohjeiden antamiseen määränpäähän.
@ -54,7 +54,7 @@ Laitteet eivät myöskään aina yhdistä suoraan Internetiin WiFi- tai langalli
Esimerkkinä älykkäästä termostaatista, termostaatti yhdistyy kodin WiFi-verkon kautta pilvipalveluun. Se lähettää lämpötilatiedot tähän pilvipalveluun, josta ne tallennetaan jonkinlaiseen tietokantaan, jolloin kodinomistaja voi tarkistaa nykyiset ja aiemmat lämpötilat puhelinsovelluksella. Toinen pilvipalvelu tietää, mikä lämpötila kodinomistajaa miellyttää, ja lähettää viestejä IoT-laitteelle pilvipalvelun kautta kertoakseen lämmitysjärjestelmälle, milloin se kytketään päälle tai pois päältä.


Älykkäämpi versio voisi käyttää pilvessä olevaa tekoälyä ja tietoja muista IoT-laitteisiin liitetyistä antureista, kuten tilan käyttöä havaitsevista antureista, sekä tietoja, kuten säätietoja ja jopa kalenteriasi, tehdäkseen päätöksiä lämpötilan asettamisesta älykkäästi. Esimerkiksi se voisi kytkeä lämmityksen pois päältä, jos kalenterisi mukaan olet lomalla, tai säätää lämmitystä huonekohtaisesti sen mukaan, mitä huoneita käytät, oppien datasta ajan myötä tarkemmaksi.
@ -94,7 +94,7 @@ Mitä nopeampi kellosykli, sitä enemmän käskyjä voidaan käsitellä sekunnis
> 💁 Suorittimet suorittavat ohjelmia käyttäen [fetch-decode-execute-sykliä](https://wikipedia.org/wiki/Instruction_cycle). Jokaisella kellotikillä suoritin hakee seuraavan käskyn muistista, dekoodaa sen ja suorittaa sen, esimerkiksi käyttämällä aritmeettis-loogista yksikköä (ALU) kahden luvun yhteenlaskuun. Jotkut suoritukset vievät useita tikkejä, joten seuraava sykli alkaa seuraavalla tikillä, kun käsky on suoritettu.


Mikrokontrollereiden kellonopeudet ovat paljon alhaisempia kuin pöytätietokoneiden, kannettavien tietokoneiden tai useimpien älypuhelimien. Esimerkiksi Wio Terminalin suoritin toimii 120 MHz:n nopeudella eli 120 000 000 sykliä sekunnissa.
@ -182,7 +182,7 @@ Arduino-kortit ohjelmoidaan C- tai C++-kielellä. C/C++:n käyttö mahdollistaa
Kirjoittaisit alustuslogiikkasi `setup`-funktioon, kuten WiFi-yhteyden muodostamisen ja pilvipalveluihin yhdistämisen tai pinnejä syötölle ja lähdölle alustettaessa. `loop`-funktioon sisältyisi prosessointikoodi, kuten sensorin lukeminen ja arvon lähettäminen pilveen. Lisäisit yleensä viiveen jokaiseen silmukkaan, esimerkiksi jos haluat sensoridatan lähetettävän vain 10 sekunnin välein, lisäisit 10 sekunnin viiveen silmukan loppuun, jotta mikro-ohjain voi nukkua, säästää virtaa ja suorittaa silmukan uudelleen tarvittaessa 10 sekunnin kuluttua.


✅ Tämä ohjelma-arkkitehtuuri tunnetaan nimellä *tapahtumasilmukka* tai *viestisilmukka*. Monet sovellukset käyttävät tätä taustalla, ja se on standardi useimmille työpöytäsovelluksille, jotka toimivat käyttöjärjestelmissä kuten Windows, macOS tai Linux. `loop` kuuntelee viestejä käyttöliittymäkomponenteilta, kuten painikkeilta, tai laitteilta, kuten näppäimistöltä, ja reagoi niihin. Voit lukea lisää tästä [artikkelista tapahtumasilmukasta](https://wikipedia.org/wiki/Event_loop).
> Sketchnote: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -92,7 +92,7 @@ Digitaaliset anturit, kuten analogiset anturit, havaitsevat ympäröivän maailm
Yksinkertaisin digitaalinen anturi on painike tai kytkin. Tämä on anturi, jolla on kaksi tilaa: päällä tai pois päältä.


IoT-laitteiden pinnit, kuten GPIO-pinnit, voivat mitata tämän signaalin suoraan 0:na tai 1:nä. Jos lähetetty jännite on sama kuin palautettu jännite, luettu arvo on 1, muuten luettu arvo on 0. Signaalia ei tarvitse muuntaa, sillä se voi olla vain 1 tai 0.
@ -125,7 +125,7 @@ Joidenkin yleisten toimilaitteiden esimerkkejä:
Seuraa alla olevia ohjeita lisätäksesi toimilaitteen IoT-laitteeseesi, jota ohjataan anturilla, rakentaaksesi IoT-yövalon. Se kerää valon määrän valoanturista ja käyttää toimilaitetta, kuten LED-valoa, tuottamaan valoa, kun havaittu valon määrä on liian alhainen.


@ -140,7 +140,7 @@ Kuten anturit, toimilaitteet ovat joko analogisia tai digitaalisia.
Analogiset toimilaitteet ottavat analogisen signaalin ja muuntavat sen jonkinlaiseksi vuorovaikutukseksi, jossa vuorovaikutus muuttuu syötetyn jännitteen mukaan.
Yksi esimerkki on himmennettävä valo, kuten ne, joita saatat käyttää kotonasi. Valon kirkkaus määräytyy syötetyn jännitteen mukaan.


Kuten antureiden kanssa, varsinainen IoT-laite toimii digitaalisilla signaaleilla, ei analogisilla. Tämä tarkoittaa, että analogisen signaalin lähettämiseksi IoT-laitteessa täytyy olla digitaalista analogiseksi muuntava laite (DAC), joko suoraan IoT-laitteessa tai liitäntälevyssä. Tämä muuntaa IoT-laitteen 0:t ja 1:t analogiseksi jännitteeksi, jota toimilaite voi käyttää.
@ -187,7 +187,7 @@ Digitaaliset toimilaitteet, kuten digitaaliset anturit, ovat joko kahdessa tilas
Yksi yksinkertainen digitaalinen toimilaite on LED. Kun laite lähettää digitaalisen signaalin 1, lähetetään korkea jännite, joka sytyttää LEDin. Kun lähetetään digitaalinen signaali 0, jännite laskee 0V:iin ja LED sammuu.


✅ Mitä muita yksinkertaisia kaksitilaisia toimilaitteita keksit? Yksi esimerkki on solenoidi, joka on sähkömagneetti, jota voidaan aktivoida tekemään asioita, kuten siirtämään oven salpaa lukitsemalla/avaamalla oven.
1. Valitse suosikkisi LED-valo ja aseta sen jalat LED-moduulin kahteen reikään.
@ -40,7 +40,7 @@ Liitä LED.
1. Kun Raspberry Pi on sammutettu, liitä Grove-kaapelin toinen pää Grove Base -hatun digitaaliseen liittimeen, joka on merkitty **D5**. Tämä liitin on toinen vasemmalta GPIO-pinnien vieressä olevassa liitinrivissä.


1. Työnnä Grove-kaapelin toinen pää valosensorimoduulin liittimeen. Se menee sisään vain yhdellä tavalla.
1. Kun Raspberry Pi on sammutettu, liitä Grove-kaapelin toinen pää Grove Base -hatun analogiseen liittimeen, joka on merkitty **A0**. Tämä liitin on toinen oikealta GPIO-pinnien vieressä olevassa liitinrivissä.
> Sketchnote: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -47,7 +47,7 @@ MQTT on suosituin viestintäprotokolla IoT-laitteille, ja se käsitellään täs
MQTT:ssä on yksi välittäjä ja useita asiakkaita. Kaikki asiakkaat yhdistyvät välittäjään, ja välittäjä ohjaa viestit oikeille asiakkaille. Viestit ohjataan nimettyjen aiheiden avulla, eikä niitä lähetetä suoraan yksittäiselle asiakkaalle. Asiakas voi julkaista aiheeseen, ja kaikki asiakkaat, jotka tilaavat kyseisen aiheen, saavat viestin.


✅ Tee tutkimusta. Jos sinulla on paljon IoT-laitteita, miten voit varmistaa, että MQTT-välittäjäsi pystyy käsittelemään kaikki viestit?
@ -69,7 +69,7 @@ Sen sijaan, että käsittelisit MQTT-välittäjän asettamisen monimutkaisuuksia
> 💁 Tämä testivälittäjä on julkinen ja ei-suojattu. Kuka tahansa voi kuunnella, mitä julkaiset, joten sitä ei pitäisi käyttää yksityistä dataa sisältävien viestien kanssa.


Seuraa alla olevaa ohjetta yhdistääksesi laitteesi MQTT-välittäjään:
@ -350,7 +350,7 @@ Koneille data kannattaa ehkä säilyttää, erityisesti jos sitä käytetään t
IoT-laitteiden suunnittelijoiden tulisi myös harkita, voiko IoT-laite toimia Internet-katkoksen tai sijainnin aiheuttaman signaalin menetyksen aikana. Älykäs termostaatti pitäisi pystyä tekemään joitakin rajoitettuja päätöksiä lämmityksen ohjaamiseksi, jos se ei voi lähettää telemetriaa pilveen katkoksen vuoksi.
[](https://twitter.com/internetofshit/status/1315736960082808832)
[](https://twitter.com/internetofshit/status/1315736960082808832)
MQTT:n käsitelläkseen yhteyden katkeamista laitteen ja palvelinkoodin täytyy huolehtia viestien toimituksesta, jos se on tarpeen, esimerkiksi vaatimalla, että kaikki lähetetyt viestit saavat vastauksen lisäviesteillä vastausaiheessa, ja jos eivät, ne jonotetaan manuaalisesti toistettavaksi myöhemmin.
@ -358,7 +358,7 @@ MQTT:n käsitelläkseen yhteyden katkeamista laitteen ja palvelinkoodin täytyy
Komennot ovat viestejä, jotka pilvi lähettää laitteelle, ohjeistaen sitä tekemään jotain. Useimmiten tämä tarkoittaa jonkinlaista ulostuloa aktuaattorin kautta, mutta se voi olla ohje laitteelle itselleen, kuten uudelleenkäynnistys tai lisätelemetrian kerääminen ja palauttaminen vastauksena komentoon.


Termostaatti voisi vastaanottaa pilvestä komennon kytkeä lämmitys päälle. Kaikkien antureiden telemetriatietojen perusteella pilvipalvelu on päättänyt, että lämmitys pitäisi olla päällä, joten se lähettää asiaankuuluvan komennon.


> Sketchnote: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -90,7 +90,7 @@ Kasvupäivien asteet, eli GDD, lasketaan päivittäin päivän keskilämpötilan
Täydellinen GDD-kaava on hieman monimutkainen, mutta yksinkertaistettu yhtälö on usein hyvä arvio:


* **GDD** - tämä on kasvupäivien asteiden määrä
* **T max** - tämä on päivän maksimilämpötila Celsius-asteina
@ -118,7 +118,7 @@ Kun nämä luvut syötetään laskentaan:
Tämä antaa laskennan:


Maissi sai 4 GDD:tä sinä päivänä. Oletetaan, että maissilajike tarvitsee kypsyäkseen 800 GDD:tä, jolloin se tarvitsee vielä 796 GDD:tä saavuttaakseen kypsyyden.
@ -239,7 +239,7 @@ Manuaaliset vaiheet tähän ovat:
Esimerkiksi, jos päivän korkein lämpötila on 25°C ja matalin 12°C:


@ -33,7 +33,7 @@ Kun sinulla on lämpötiladataa, voit käyttää tämän repositorion Jupyter No
Jupyter käynnistyy ja avaa notebookin selaimessasi. Käy läpi notebookin ohjeet visualisoidaksesi mitatut lämpötilat ja laskeaksesi kasvukauden astepäivät (GDD).
1. Työnnä Grove-kaapelin toinen pää kosteus- ja lämpötila-anturin liittimeen. Se menee sisään vain yhdellä tavalla.
1. Kun Raspberry Pi on sammutettu, liitä Grove-kaapelin toinen pää digitaaliseen liittimeen, joka on merkitty **D5** Grove Base hatissa, joka on kiinnitetty Pi:hin. Tämä liitin on toinen vasemmalta rivissä, joka on GPIO-pinnien vieressä.
@ -13,7 +13,7 @@ I²C-väylä koostuu kahdesta pääjohtimesta sekä kahdesta virtajohdosta:
| VCC | Jännite yhteiskerääjä | Laitteiden virtalähde. Tämä on kytketty SDA- ja SCL-johtimiin, jotka saavat virtansa vetovastuksen kautta, joka kytkee signaalin pois päältä, kun mikään laite ei ole ohjaaja. |
| GND | Maa | Tarjoaa yhteisen maadoituksen sähköpiirille. |


Datan lähettämiseksi yksi laite antaa aloitusehdon osoittaakseen, että se on valmis lähettämään dataa. Se toimii sitten ohjaajana. Ohjaaja lähettää sen laitteen osoitteen, jonka kanssa se haluaa kommunikoida, sekä tiedon siitä, haluaako se lukea vai kirjoittaa dataa. Kun data on lähetetty, ohjaaja lähettää lopetusehdon osoittaakseen, että se on valmis. Tämän jälkeen toinen laite voi ryhtyä ohjaajaksi ja lähettää tai vastaanottaa dataa.
> Sketchnote: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -32,7 +32,7 @@ IoT-laitteet käyttävät matalaa jännitettä. Vaikka tämä riittää antureil
Ratkaisuna on kytkeä pumppu ulkoiseen virtalähteeseen ja käyttää toimilaitetta pumpun käynnistämiseen, aivan kuten valon kytkemisessä päälle. Sormesi tarvitsee vain pienen määrän energiaa kytkimen kääntämiseen, mikä yhdistää valon kotitaloussähköön, joka toimii 110v/240v jännitteellä.


> 🎓 [Kotitaloussähkö](https://wikipedia.org/wiki/Mains_electricity) viittaa sähköön, joka toimitetaan koteihin ja yrityksiin kansallisen infrastruktuurin kautta monissa maailman osissa.
@ -72,7 +72,7 @@ Kun vipu liikkuu, voit yleensä kuulla sen osuvan sähkömagneettiin selkeällä
Sähkömagneetti ei tarvitse paljon virtaa aktivoituakseen ja vetääkseen vivun, ja sitä voidaan ohjata IoT-kehitysalustan 3.3V tai 5V ulostulolla. Ulostulopiiri voi kantaa paljon enemmän virtaa, riippuen releestä, mukaan lukien kotitaloussähkö tai jopa korkeammat tehot teollisuuskäyttöön. Näin IoT-kehitysalusta voi ohjata kastelujärjestelmää, pienestä pumpusta yksittäiselle kasville aina massiiviseen teollisuusjärjestelmään koko kaupalliselle tilalle.


Yllä olevassa kuvassa näkyy Grove-rele. Ohjauspiiri yhdistetään IoT-laitteeseen ja kytkee releen päälle tai pois päältä 3.3V tai 5V avulla. Ulostulopiirissä on kaksi liitintä, joista kumpi tahansa voi olla virtalähde tai maa. Ulostulopiiri voi käsitellä jopa 250V ja 10A, mikä riittää monille kotitaloussähköllä toimiville laitteille. Saatavilla on myös releitä, jotka kestävät vielä suurempia tehoja.
1. Työnnä Grove-kaapelin toinen pää releen liittimeen. Se menee sisään vain yhdellä tavalla.
1. Kun Raspberry Pi on sammutettu, liitä Grove-kaapelin toinen pää Grove Base Hatin digitaaliseen liittimeen, joka on merkitty **D5**. Tämä liitin on toinen vasemmalta GPIO-pinnien vieressä olevassa liitinrivissä. Jätä maankosteusanturi liitetyksi **A0**-liittimeen.


1. Työnnä maankosteusanturi maahan, jos se ei ole jo siellä edellisen oppitunnin jäljiltä.
> Sketchnote: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -46,8 +46,8 @@ Tämä oli usein erittäin kallista, vaati laajaa osaamista ja oli hidasta muutt
Pilveä kutsutaan usein vitsikkäästi "jonkun toisen tietokoneeksi". Alkuperäinen idea oli yksinkertainen – tietokoneiden ostamisen sijaan vuokrataan jonkun toisen tietokone. Pilvipalveluntarjoaja hallinnoi valtavia datakeskuksia ja vastaa kaikesta: laitteiston hankinnasta ja asennuksesta, sähkön ja jäähdytyksen hallinnasta, verkkoyhteyksistä, rakennusten turvallisuudesta sekä laitteiston ja ohjelmistojen päivityksistä. Asiakkaana vuokraat tarvitsemasi tietokoneet, lisäät kapasiteettia kysynnän kasvaessa ja vähennät sitä kysynnän laskiessa. Näitä pilvidatakeskuksia on ympäri maailmaa.


Nämä datakeskukset voivat olla useiden neliökilometrien kokoisia. Yllä olevat kuvat on otettu muutama vuosi sitten Microsoftin pilvidatakeskuksesta, ja ne näyttävät keskuksen alkuperäisen koon sekä suunnitellun laajennuksen. Laajennusta varten raivattu alue on yli 5 neliökilometriä.
@ -108,11 +108,11 @@ Pilven IoT-palvelut ratkaisevat nämä ongelmat. Niitä ylläpitävät suuret pi
IoT-laitteet yhdistävät pilvipalveluun joko laite-SDK:n (kirjasto, joka tarjoaa koodia palvelun ominaisuuksien hyödyntämiseen) avulla tai suoraan viestintäprotokollan, kuten MQTT:n tai HTTP:n, kautta. Laite-SDK on yleensä helpoin tapa, koska se hoitaa kaiken puolestasi, kuten tietää, mitä aiheita julkaista tai tilata, ja miten käsitellä turvallisuutta.


Laitteesi kommunikoi sitten sovelluksesi muiden osien kanssa tämän palvelun kautta – samalla tavalla kuin lähetit telemetriatietoja ja vastaanotit komentoja MQTT:n kautta. Tämä tapahtuu yleensä palvelu-SDK:n tai vastaavan kirjaston avulla. Viestit tulevat laitteeltasi palveluun, jossa sovelluksesi muut osat voivat lukea ne, ja viestit voidaan lähettää takaisin laitteellesi.


Nämä palvelut toteuttavat turvallisuuden tietämällä kaikista laitteista, jotka voivat yhdistää ja lähettää tietoja, joko rekisteröimällä laitteet etukäteen palveluun tai antamalla laitteille salaisia avaimia tai varmenteita, joita ne voivat käyttää rekisteröityessään palveluun ensimmäistä kertaa. Tuntemattomat laitteet eivät voi yhdistää; jos ne yrittävät, palvelu hylkää yhteyden ja jättää niiden lähettämät viestit huomiotta.
@ -124,7 +124,7 @@ Sovelluksesi muut osat voivat yhdistää IoT-palveluun ja saada tietoa kaikista
Nyt kun sinulla on Azure-tilaus, voit rekisteröityä IoT-palveluun. Microsoftin IoT-palvelu tunnetaan nimellä Azure IoT Hub.
> Luonnoskuva: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -28,7 +28,7 @@ Tässä oppitunnissa käsitellään:
Serveritön, tai serveritön laskenta, tarkoittaa pienten koodilohkojen luomista, jotka suoritetaan pilvessä vastauksena erilaisiin tapahtumiin. Kun tapahtuma tapahtuu, koodisi suoritetaan ja sille välitetään tietoja tapahtumasta. Näitä tapahtumia voi tulla monista eri lähteistä, kuten verkkopyynnöistä, jonoon lisätyistä viesteistä, tietokannan muutoksista tai IoT-laitteiden lähettämistä viesteistä IoT-palveluun.


> 💁 Jos olet käyttänyt tietokantatriggereitä aiemmin, voit ajatella tätä samalla tavalla: koodi käynnistyy tapahtumasta, kuten rivin lisäämisestä.
@ -54,7 +54,7 @@ IoT-kehittäjänä serveritön malli on ihanteellinen. Voit kirjoittaa funktion,
Microsoftin serveritön laskentapalvelu tunnetaan nimellä Azure Functions.
> Luonnoskuva: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -52,11 +52,11 @@ Nämä ovat todellisia tilanteita, joita tapahtuu jatkuvasti. Joitakin esimerkke
Kun laite yhdistää IoT-palveluun, se käyttää tunnistetta itsensä tunnistamiseen. Ongelma on, että tämä tunniste voidaan kopioida – hakkeri voisi asettaa haitallisen laitteen käyttämään samaa tunnistetta kuin oikea laite, mutta lähettämään vääriä tietoja.


Ratkaisu tähän on muuntaa lähetettävät tiedot salattuun muotoon käyttämällä arvoa, joka tunnetaan vain laitteelle ja pilvelle. Tätä prosessia kutsutaan *salaamiseksi*, ja arvoa, jota käytetään tietojen salaamiseen, kutsutaan *salausavaimeksi*.


Pilvipalvelu voi sitten muuntaa tiedot takaisin luettavaan muotoon prosessilla, jota kutsutaan *purkamiseksi*, käyttäen joko samaa salausavainta tai *purkuavainta*. Jos salattua viestiä ei voida purkaa avaimella, laite on hakkeroitu ja viesti hylätään.
> Luonnoskuva: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -63,13 +63,13 @@ Maapallo on pallo – kolmiulotteinen ympyrä. Tämän vuoksi pisteet määritel
> 💁 Kukaan ei oikeastaan tiedä alkuperäistä syytä siihen, miksi ympyrät jaetaan 360 asteeseen. [Wikipedia-sivu asteista (kulma)](https://wikipedia.org/wiki/Degree_(angle)) käsittelee joitakin mahdollisia syitä.


Leveysaste mitataan linjoilla, jotka kiertävät maapallon ja kulkevat rinnakkain päiväntasaajan kanssa, jakaen pohjoisen ja eteläisen pallonpuoliskon 90° kumpaankin. Päiväntasaaja on 0°, pohjoisnapa on 90°, joka tunnetaan myös nimellä 90° pohjoista, ja etelänapa on -90°, eli 90° etelää.
Pituusaste mitataan astemääränä itään ja länteen. Pituusasteen 0° alkuperä, *päämeridiaani*, määriteltiin vuonna 1884 linjaksi, joka kulkee pohjoisnavalta etelänavalle ja kulkee [Britannian kuninkaallisen observatorion Greenwichissä, Englannissa](https://wikipedia.org/wiki/Royal_Observatory,_Greenwich).
@ -112,7 +112,7 @@ GPS-järjestelmät toimivat siten, että useat satelliitit lähettävät signaal
> 💁 GPS-anturit tarvitsevat antenneja havaitakseen radiotaajuuksia. Kuorma-autoihin ja autoihin sisäänrakennettujen GPS-järjestelmien antennit on sijoitettu hyvän signaalin saamiseksi, yleensä tuulilasiin tai katolle. Jos käytät erillistä GPS-järjestelmää, kuten älypuhelinta tai IoT-laitetta, sinun on varmistettava, että GPS-järjestelmään tai puhelimeen sisäänrakennettu antenni on selkeästi näkyvissä taivaalle, esimerkiksi tuulilasilla.


GPS-satelliitit kiertävät maapalloa, eivät ole kiinteässä pisteessä anturin yläpuolella, joten sijaintitieto sisältää korkeuden merenpinnan yläpuolella sekä leveys- ja pituusasteen.
1. Työnnä Grove-kaapelin toinen pää GPS-anturin liittimeen. Se menee sisään vain yhdellä tavalla.
1. Kun Raspberry Pi on sammutettu, yhdistä Grove-kaapelin toinen pää UART-liittimeen, joka on merkitty **UART** Grove Base -hatissa, joka on kiinnitetty Pi:hin. Tämä liitin sijaitsee keskimmäisellä rivillä, SD-korttipaikan puolella, USB-porttien ja Ethernet-liittimen vastakkaisella puolella.


1. Aseta GPS-anturi niin, että siihen kiinnitetty antenni on näkyvissä taivaalle - mieluiten avoimen ikkunan vieressä tai ulkona. On helpompi saada selkeämpi signaali, kun antennin edessä ei ole esteitä.
* Aseta **Source** arvoksi `Lat/Lon` ja määritä tarkka leveyspiiri, pituuspiiri ja satelliittien määrä, joita käytetään GPS-paikannukseen. Tämä arvo lähetetään vain kerran, joten valitse **Repeat**-ruutu, jotta data toistuu joka sekunti.


* Aseta **Source** arvoksi `NMEA` ja lisää NMEA-lauseita tekstikenttään. Kaikki nämä arvot lähetetään, ja uuden GGA (paikannus) -lauseen lukemisen välillä on 1 sekunnin viive.


Voit käyttää työkaluja, kuten [nmeagen.org](https://www.nmeagen.org), näiden lauseiden luomiseen piirtämällä kartalle. Nämä arvot lähetetään vain kerran, joten valitse **Repeat**-ruutu, jotta data toistuu sekunnin kuluttua siitä, kun kaikki on lähetetty.
* Aseta **Source** arvoksi GPX-tiedosto ja lataa GPX-tiedosto, jossa on reittisijainteja. Voit ladata GPX-tiedostoja useilta suosituilla kartta- ja retkeilysivustoilta, kuten [AllTrails](https://www.alltrails.com/). Nämä tiedostot sisältävät useita GPS-sijainteja reittinä, ja GPS-anturi palauttaa jokaisen uuden sijainnin 1 sekunnin välein.


Nämä arvot lähetetään vain kerran, joten valitse **Repeat**-ruutu, jotta data toistuu sekunnin kuluttua siitä, kun kaikki on lähetetty.
NoSQL-tietokannoilla ei ole ennalta määriteltyä skeemaa, joka rajoittaisi datan tallennustapaa. Sen sijaan voit lisätä mitä tahansa strukturoimatonta dataa, yleensä JSON-dokumentteina. Nämä dokumentit voidaan järjestää kansioihin, kuten tiedostot tietokoneellasi. Jokaisella dokumentilla voi olla eri kenttiä kuin toisilla dokumenteilla – esimerkiksi, jos tallennat IoT-dataa maatilan ajoneuvoista, joillakin dokumenteilla voi olla kiihtyvyys- ja nopeustietokenttiä, kun taas toisilla voi olla perävaunun lämpötilatietokenttiä. Jos lisäisit uuden kuorma-autotyypin, kuten sellaisen, jossa on sisäänrakennetut vaa'at kuorman painon seuraamiseen, IoT-laite voisi lisätä tämän uuden kentän, ja se voitaisiin tallentaa ilman muutoksia tietokantaan.
@ -89,7 +89,7 @@ Tässä oppitunnissa käytät NoSQL-tallennusta IoT-datan tallentamiseen.
Edellisessä oppitunnissa tallensit GPS-tietoja GPS-anturista, joka oli yhdistetty IoT-laitteeseesi. Jotta nämä IoT-tiedot voidaan tallentaa pilveen, ne täytyy lähettää IoT-palveluun. Käytät jälleen Azure IoT Hubia, samaa IoT-pilvipalvelua, jota käytit edellisessä projektissa.
@ -171,7 +171,7 @@ Kylmä polku -data tallennetaan datavarastoihin – tietokantoihin, jotka on suu
Kun data virtaa IoT Hubiin, voit kirjoittaa palvelimetonta koodia kuuntelemaan tapahtumia, jotka julkaistaan Event-Hub-yhteensopivaan päätepisteeseen. Tämä on lämmin polku – tämä data tallennetaan ja sitä käytetään seuraavassa oppitunnissa matkan raportointiin.


### Tehtävä – käsittele GPS-tapahtumia palvelimettomalla koodilla
@ -193,7 +193,7 @@ Kun data virtaa IoT Hubiin, voit kirjoittaa palvelimetonta koodia kuuntelemaan t
Azure Storage -tilit ovat yleiskäyttöinen tallennuspalvelu, joka voi tallentaa dataa monin eri tavoin. Voit tallentaa dataa blobina, jonoissa, taulukoissa tai tiedostoina, ja kaikki nämä samanaikaisesti.
> Sketchnote: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -64,11 +64,11 @@ Yksinkertainen esimerkki: maatilaprojektissa tallensit maaperän kosteustietoja.
Ihmisen on vaikea ymmärtää tällaista dataa. Se on pelkkä numeroseinä ilman merkitystä. Ensimmäinen askel datan visualisoinnissa voisi olla sen piirtäminen viivakaavioon:


Tätä voidaan parantaa lisäämällä viiva, joka osoittaa, milloin automaattinen kastelujärjestelmä käynnistyi kosteusarvolla 450:


Tämä kaavio näyttää nopeasti paitsi maaperän kosteustasot myös kohdat, joissa kastelujärjestelmä käynnistyi.
@ -84,7 +84,7 @@ Kun työskentelet GPS-datan kanssa, selkein tapa visualisoida dataa on piirtää
Karttojen kanssa työskentely on mielenkiintoista, ja valittavana on monia vaihtoehtoja, kuten Bing Maps, Leaflet, Open Street Maps ja Google Maps. Tässä oppitunnissa opit [Azure Maps](https://azure.microsoft.com/services/azure-maps/?WT.mc_id=academic-17441-jabenn) -palvelusta ja siitä, kuinka se voi näyttää GPS-datasi.
Azure Maps on "kokoelma paikkatietopalveluita ja SDK:ita, jotka käyttävät ajankohtaista karttatietoa tarjotakseen maantieteellistä kontekstia verkkosovelluksille ja mobiilisovelluksille." Kehittäjille tarjotaan työkaluja luoda kauniita, interaktiivisia karttoja, jotka voivat esimerkiksi tarjota suositeltuja liikennereittejä, tietoa liikenneonnettomuuksista, sisätilanavigointia, hakutoimintoja, korkeustietoja, säätietopalveluita ja paljon muuta.
@ -185,7 +185,7 @@ Seuraava askel on näyttää kartta verkkosivulla. Käytämme vain yhtä `html`-
Jos avaat `index.html`-sivusi verkkoselaimessa, sinun pitäisi nähdä kartta, joka on keskitetty Seattlen alueelle.


✅ Kokeile zoomaus- ja keskitysparametreja muuttaaksesi kartan näkymää. Voit lisätä eri koordinaatit, jotka vastaavat datasi leveys- ja pituusasteita, keskittääksesi kartan uudelleen.
@ -318,7 +318,7 @@ Kun teet kutsun tallennustilaasi hakeaksesi dataa, saatat yllättyä, jos selaim
1. Lataa HTML-sivu selaimeesi. Se lataa kartan, hakee kaikki GPS-datat tallennustilasta ja piirtää ne kartalle.


> 💁 Löydät tämän koodin [code](../../../../../3-transport/lessons/3-visualize-location-data/code)-kansiosta.
> Sketchnote: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -35,7 +35,7 @@ Tässä oppitunnissa käsitellään:
Geoaidat ovat virtuaalisia rajoja todellisille maantieteellisille alueille. Geoaidat voivat olla ympyröitä, jotka määritellään pisteenä ja säteenä (esimerkiksi 100 m leveä ympyrä rakennuksen ympärillä), tai monikulmioita, jotka kattavat alueen, kuten koulun alueen, kaupungin rajat tai yliopiston tai toimiston kampuksen.


> 💁 Olet ehkä jo käyttänyt geoaidoja tietämättäsi. Jos olet asettanut muistutuksen iOS-muistutussovelluksessa tai Google Keepissä sijainnin perusteella, olet käyttänyt geoaitaa. Nämä sovellukset luovat geoaidan annetun sijainnin perusteella ja ilmoittavat sinulle, kun puhelimesi saapuu geoaidan sisälle.
@ -212,7 +212,7 @@ On tärkeää tietää etäisyys geoaidan reunaan ja yhdistää tämä tieto mui
Esimerkiksi, kuvittele GPS-lukemia, jotka osoittavat ajoneuvon ajavan tietä pitkin, joka kulkee geoaidan vieressä. Jos yksi GPS-arvo on epätarkka ja sijoittaa ajoneuvon geoaidan sisälle, vaikka sinne ei ole ajoneuvoyhteyttä, se voidaan jättää huomiotta.


Yllä olevassa kuvassa on geofence Microsoftin kampuksen osan päällä. Punainen viiva näyttää rekan ajavan pitkin 520-tietä, ja ympyrät osoittavat GPS-lukemat. Suurin osa näistä lukemista on tarkkoja ja sijaitsee 520-tien varrella, mutta yksi epätarkka lukema on geofencen sisällä. Tämä lukema ei voi olla oikea – ei ole teitä, joiden kautta rekka voisi yhtäkkiä poiketa 520-tieltä kampukselle ja palata sitten takaisin 520-tielle. Geofencen tarkistava koodi tarvitsee ottaa huomioon aiemmat lukemat ennen kuin se toimii geofencen testitulosten perusteella.
✅ Mitä lisätietoja tarvitsisit tarkistaaksesi, voiko GPS-lukema olla oikea?
@ -284,7 +284,7 @@ Kuten muistat aiemmista oppitunneista, IoT Hub mahdollistaa tapahtumien uudellee
Vastaus on, että se ei tiedä! Sen sijaan voit määritellä useita erillisiä yhteyksiä tapahtumien lukemiseen, ja jokainen niistä voi hallita lukemattomien viestien uudelleen toistoa. Näitä kutsutaan *kuluttajaryhmiksi*. Kun yhdistät päätepisteeseen, voit määrittää, mihin kuluttajaryhmään haluat yhdistää. Sovelluksesi jokainen komponentti yhdistyy eri kuluttajaryhmään.


Teoriassa jopa 5 sovellusta voi yhdistyä jokaiseen kuluttajaryhmään, ja ne kaikki vastaanottavat viestejä niiden saapuessa. Paras käytäntö on, että vain yksi sovellus käyttää kutakin kuluttajaryhmää välttääkseen viestien kaksoiskäsittelyn ja varmistaakseen, että kaikki jonossa olevat viestit käsitellään oikein uudelleenkäynnistyksen yhteydessä. Esimerkiksi, jos käynnistäisit Functions-sovelluksesi paikallisesti sekä pilvessä, ne molemmat käsittelisivät viestejä, mikä johtaisi kaksoiskopioihin tallennustilin blob-tallennuksessa.
> Sketchnote: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -38,7 +38,7 @@ Kaikki sadot eivät kypsy tasaisesti. Esimerkiksi tomaateissa voi olla vielä vi
Automaattisen sadonkorjuun nousu siirsi tuottelajittelun sadonkorjuusta tehtaaseen. Ruoka kulki pitkillä kuljetushihnoilla, joissa tiimit poimivat tuotteita ja poistivat kaiken, mikä ei täyttänyt vaadittua laatustandardia. Sadonkorjuu oli halvempaa koneiden ansiosta, mutta ruoan manuaalinen lajittelu oli edelleen kallista.


Seuraava kehitysaskel oli käyttää koneita lajitteluun, joko sadonkorjuukoneeseen sisäänrakennettuna tai käsittelylaitoksissa. Näiden koneiden ensimmäinen sukupolvi käytti optisia sensoreita värien havaitsemiseen, ohjaten toimilaitteita työntämään vihreät tomaatit jäteastiaan vipujen tai ilmapuhallusten avulla, jättäen punaiset tomaatit jatkamaan kuljetushihnoilla.
@ -62,7 +62,7 @@ Esimerkiksi voisit antaa mallille miljoonia kuvia raaoista banaaneista syötteen
ML-mallit eivät anna binäärivastausta, vaan todennäköisyyksiä. Esimerkiksi malli voi saada kuvan banaanista ja ennustaa `kypsä` 99,7% ja `raaka` 0,3%. Koodisi valitsisi parhaan ennustuksen ja päättäisi, että banaani on kypsä.
@ -90,7 +90,7 @@ On olemassa laaja valikoima työkaluja, jotka voivat auttaa sinua tässä, mukaa
Custom Vision on pilvipohjainen työkalu kuvien luokittelijoiden kouluttamiseen. Sen avulla voit kouluttaa luokittelijan käyttämällä vain pientä määrää kuvia. Voit ladata kuvia verkkosivuston, verkkosovellusrajapinnan tai SDK:n kautta, antaen jokaiselle kuvalle *tunnisteen*, joka sisältää kuvan luokituksen. Sen jälkeen voit kouluttaa mallin ja testata sen suorituskykyä. Kun olet tyytyväinen malliin, voit julkaista sen versioita, joita voidaan käyttää verkkosovellusrajapinnan tai SDK:n kautta.
> 💁 Voit kouluttaa Custom Vision -mallin vain 5 kuvalla per luokitus, mutta enemmän on parempi. Saat parempia tuloksia vähintään 30 kuvalla.
@ -146,7 +146,7 @@ Custom Visionin käyttämiseksi sinun täytyy ensin luoda kaksi Cognitive Servic
Kun luot projektisi, varmista, että käytät aiemmin luomaasi `fruit-quality-detector-training` -resurssia. Käytä *Classification*-projektityyppiä, *Multiclass*-luokittelutyyppiä ja *Food*-toimialaa.


✅ Käytä aikaa tutustuaksesi Custom Vision -käyttöliittymään kuvien luokittelijallesi.
@ -164,7 +164,7 @@ Kuvien luokittimet toimivat hyvin matalalla resoluutiolla. Esimerkiksi Custom Vi
* Käytä 2 kypsää banaania ja ota kuvia kummastakin eri kulmista, vähintään 7 kuvaa (5 koulutukseen, 2 testaukseen), mutta mieluiten enemmän.


* Toista sama prosessi käyttäen 2 raakaa banaania.
@ -174,7 +174,7 @@ Kuvien luokittimet toimivat hyvin matalalla resoluutiolla. Esimerkiksi Custom Vi
1. Seuraa [Microsoft-dokumentaation luokittimen nopean aloituksen osion kuvat lataaminen ja tunnistaminen](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/getting-started-build-a-classifier?WT.mc_id=academic-17441-jabenn#upload-and-tag-images) ohjeita ladataksesi koulutuskuvasi. Tunnista kypsät hedelmät `ripe`-tunnisteella ja raa'at hedelmät `unripe`-tunnisteella.


1. Seuraa [Microsoft-dokumentaation luokittimen nopean aloituksen osion luokittimen kouluttaminen](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/getting-started-build-a-classifier?WT.mc_id=academic-17441-jabenn#train-the-classifier) ohjeita kouluttaaksesi kuvien luokittimen ladatuilla kuvillasi.
@ -192,7 +192,7 @@ Kun luokitin on koulutettu, voit testata sitä antamalla sille uuden kuvan luoki
1. Seuraa [Microsoft-dokumentaation testaa mallisi -osio](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/test-your-model?WT.mc_id=academic-17441-jabenn#test-your-model) ohjeita testataksesi kuvien luokitinta. Käytä aiemmin luotuja testauskuvia, älä mitään koulutuksessa käytettyjä kuvia.
> Luonnoskuva: [Nitya Narasimhan](https://github.com/nitya). Klikkaa kuvaa nähdäksesi suuremman version.
@ -26,7 +26,7 @@ Tässä oppitunnissa käsitellään:
Kameran sensorit, kuten nimi kertoo, ovat kameroita, jotka voit liittää IoT-laitteeseesi. Ne voivat ottaa still-kuvia tai tallentaa videota. Jotkut sensorit palauttavat raakakuvaa, kun taas toiset pakkaavat kuvan esimerkiksi JPEG- tai PNG-tiedostoksi. Yleensä IoT-laitteiden kanssa käytettävät kamerat ovat paljon pienempiä ja matalamman resoluution kuin mihin olet tottunut, mutta saatavilla on myös korkearesoluutioisia kameroita, jotka kilpailevat huippupuhelimien kanssa. Voit hankkia vaihdettavia linssejä, usean kameran kokoonpanoja, infrapunalämpökameroita tai UV-kameroita.


Useimmat kameran sensorit käyttävät kuvakennoja, joissa jokainen pikseli on valodiodi. Linssi tarkentaa kuvan kuvakennolle, ja tuhannet tai miljoonat valodiodit havaitsevat niihin osuvan valon ja tallentavat sen pikselidatana.
@ -74,7 +74,7 @@ Iteroinnit julkaistaan Custom Vision -portaalista.
1. *Julkaise malli* -valintaikkunassa aseta *Ennusteresurssi*`fruit-quality-detector-prediction`-resurssiksi, jonka loit edellisessä oppitunnissa. Jätä nimi `Iteration2`:ksi ja valitse **Julkaise**-painike.
@ -88,7 +88,7 @@ Iteroinnit julkaistaan Custom Vision -portaalista.
Kopioi myös *Ennusteavain*-arvo. Tämä on turvallinen avain, joka täytyy välittää, kun kutsut mallia. Vain sovellukset, jotka välittävät tämän avaimen, voivat käyttää mallia, muut sovellukset hylätään.


✅ Kun uusi iterointi julkaistaan, sillä on eri nimi. Miten luulet, että IoT-laitteessa vaihdetaan käytettävä iterointi?
@ -109,7 +109,7 @@ Saatat huomata, että kameran avulla IoT-laitteella otettujen kuvien tulokset ei
Parhaiden tulosten saavuttamiseksi kuvien luokittelijassa haluat kouluttaa mallin kuvilla, jotka ovat mahdollisimman samanlaisia kuin ennusteisiin käytetyt kuvat. Jos esimerkiksi käytit puhelimen kameraa koulutuskuvien ottamiseen, kuvan laatu, terävyys ja värit eroavat IoT-laitteeseen liitetyn kameran kuvista.


Yllä olevassa kuvassa vasemmanpuoleinen banaanikuva otettiin Raspberry Pi -kameralla, oikeanpuoleinen kuva otettiin samasta banaanista samassa paikassa iPhonella. Kuvien laadussa on selkeä ero – iPhonen kuva on terävämpi, värikkäämpi ja kontrastikkaampi.
@ -16,7 +16,7 @@ Kamera voidaan liittää Raspberry Pi:hin nauhakaapelilla.
### Tehtävä - liitä kamera


1. Sammuta Pi.
@ -24,17 +24,17 @@ Kamera voidaan liittää Raspberry Pi:hin nauhakaapelilla.
Voit katsoa animaation, joka näyttää, miten klipsi avataan ja kaapeli asetetaan, [Raspberry Pi:n Getting Started with the Camera module -dokumentaatiosta](https://projects.raspberrypi.org/en/projects/getting-started-with-picamera/2).


1. Poista Grove Base Hat Pi:stä.
1. Vie nauhakaapeli Grove Base Hatin kameran aukon läpi. Varmista, että kaapelin sininen puoli on kohti analogisia portteja, jotka on merkitty **A0**, **A1** jne.


1. Aseta nauhakaapeli Pi:n kameraliitäntään. Vedä jälleen mustaa muoviklipsiä ylös, aseta kaapeli ja työnnä klipsi takaisin paikalleen. Kaapelin sininen puoli tulisi olla kohti USB- ja Ethernet-portteja.


1. Kiinnitä Grove Base Hat takaisin paikalleen.
@ -101,7 +101,7 @@ Ohjelmoi laite.
Rivi `camera.rotation = 0` asettaa kuvan kierron. Nauhakaapeli tulee kameran alapuolelta, mutta jos kamera on käännetty helpottamaan kohteen suuntaamista, voit muuttaa tätä riviä kierron asteiden mukaan.
> 💁 Löydät tämän koodin [code-classify/pi](../../../../../4-manufacturing/lessons/2-check-fruit-from-device/code-classify/pi) tai [code-classify/virtual-iot-device](../../../../../4-manufacturing/lessons/2-check-fruit-from-device/code-classify/virtual-iot-device) -kansiosta.
Some files were not shown because too many files have changed in this diff
Show More