Temperatur-Kontrolle Lösung: Unterschied zwischen den Versionen

Aus microbit - Das Schulbuch
Zur Navigation springen Zur Suche springen
Oliver.kastner (Diskussion | Beiträge)
Oliver.kastner (Diskussion | Beiträge)
 
(53 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 8: Zeile 8:
:<li>Die Spannung des micro:bits von 3 Volt wird durch die elektronische Schaltung (Thermistor + Widerstand) und etwas Wartezeit (ca. 5-10 Min.) auf die aktuelle Temperatur eingestellt.</li>
:<li>Die Spannung des micro:bits von 3 Volt wird durch die elektronische Schaltung (Thermistor + Widerstand) und etwas Wartezeit (ca. 5-10 Min.) auf die aktuelle Temperatur eingestellt.</li>
:<li>Dann lesen wir die Spannung an PIN 0 aus und bilden diesen Wert in einer Variable ab.</li>
:<li>Dann lesen wir die Spannung an PIN 0 aus und bilden diesen Wert in einer Variable ab.</li>
:<li>Den Spannungswert der Variablen geben wir zur Kalibrierung bei Drücken des Knopfs B im Display aus.</li>
:<li>Den Spannungswert der Variablen geben wir zur [[Thermometer_kalibrieren|Kalibrierung]] bei Drücken des Knopfs B im Display aus.</li>
:Teil 2 - nach Errechnung der [[Thermometer_kalibrieren |Kalibrierungswerte]]
:Teil 2 - nach Errechnung der [[Thermometer_kalibrieren |Kalibrierungswerte]]
:<li>Die eingelesene Variable muss nur noch in eine Temperatur umgewandelt werden, </li>
:<li>Die eingelesene Variable muss nur noch in eine Temperatur umgewandelt werden, </li>
Zeile 14: Zeile 14:
</ol>
</ol>


==Lösungsschritte==
==Lösungsschritte - Teil 1==
<ol>
<ol>
<li>Wähle unter dem rosa gefärbten Begriff '''Eingabe''' den Block '''wenn Knopf A gedrückt''' und ziehe ihn nach rechts in den Arbeitsbereich. Klicke auf das kleine, nach unten zeigende Pfeilzeichen '''A''' und ändere dies auf '''B'''. Wir wollen den analogen Wert bei Druck auf den Knopf B auslesen und anzeigen. <spoiler text="Schritt 1 - Blöcke"><pre id="pre01">input.onButtonPressed(Button.B, function () {}</pre></spoiler></li>
<li>Wähle unter dem rosa gefärbten Begriff '''Eingabe''' den Block '''wenn Knopf A gedrückt''' und ziehe ihn nach rechts in den Arbeitsbereich. Klicke auf das kleine, nach unten zeigende Pfeilzeichen '''A''' und ändere dies auf '''B'''. Wir wollen den analogen Wert bei Druck auf den Knopf B auslesen und anzeigen. <spoiler text="Schritt 1 - Blöcke"><pre id="pre01">input.onButtonPressed(Button.B, function () {}</pre></spoiler></li>
Zeile 22: Zeile 22:
<li>Klappe die schwarz gefärbte Kategorie '''Fortgeschritten''' auf und ziehe den Block '''analoge Werte von Pin P0''' unter dem dunkelrot gefärbten Begriff '''Pins''' direkt in den '''weißen Bereich&nbsp;0''' des Blocks '''setze TempWert auf 0'''. <spoiler text="Schritt 3 - Blöcke"><pre id="pre03">input.onButtonPressed(Button.B, function () {TempWert = pins.analogReadPin(AnalogPin.P0)}</pre></spoiler></li>
<li>Klappe die schwarz gefärbte Kategorie '''Fortgeschritten''' auf und ziehe den Block '''analoge Werte von Pin P0''' unter dem dunkelrot gefärbten Begriff '''Pins''' direkt in den '''weißen Bereich&nbsp;0''' des Blocks '''setze TempWert auf 0'''. <spoiler text="Schritt 3 - Blöcke"><pre id="pre03">input.onButtonPressed(Button.B, function () {TempWert = pins.analogReadPin(AnalogPin.P0)}</pre></spoiler></li>


<li>Wähle unter dem blau gefärbten Begriff '''Grundlagen''' den Block '''zeige Zahl 0''' und füge diesen Block in die Klammer '''wenn Knopf B gedrückt''' als letzte Zeile hinzu. <spoiler text="Schritt 4 - Blöcke"><pre id="pre04">input.onButtonPressed(Button.B, function () {TempWert = pins.analogReadPin(AnalogPin.P0) basic.showNumber(0)}</pre></spoiler></li>
<li>Wähle unter dem blau gefärbten Begriff '''Grundlagen''' den Block '''zeige Zahl&nbsp;0''' und füge diesen Block in die Klammer '''wenn Knopf B gedrückt''' als letzte Zeile hinzu. <spoiler text="Schritt 4 - Blöcke"><pre id="pre04">input.onButtonPressed(Button.B, function () {TempWert = pins.analogReadPin(AnalogPin.P0) basic.showNumber(0)}</pre></spoiler></li>


<li>Nun werden die beiden Elemente auf die LED-Anzeige gezeichnet. Wähle für das Ei den violetten Baukasten LED und dort den Block "Zeichne x 0 y 0" und ziehe ihn unterhalb der 3 Variablen an die letzte Stelle der Klammer "beim Start". Setzte bei x mit Platzhalter (nach unten zeigende Pfeilzeichen) die Variable eggX und bei y die Variable eggY ein. <br/>
<li>Wähle unter dem rot gefärbten Begriff '''Variablen''' den Block '''TempWert''' und ziehe den Block direkt in den '''weißen Bereich&nbsp;0''' des Blocks '''zeige Zahl &nbsp;0'''. <spoiler text="Schritt 5 - Blöcke"><pre id="pre05">input.onButtonPressed(Button.B, function () {TempWert = pins.analogReadPin(AnalogPin.P0) basic.showNumber(TempWert)}</pre></spoiler></li>
Füge für den Korb noch einmal im violetten Baukasten über LED und dort den Block "Zeichne x 0 y 0" ein. Setzte hier bei x mit Platzhalter die Variable basketX und bei y den Wert für die unterste Zeile, also 4 ein. Etwa so ... <spoiler text="Schritt 2 - Blöcke">[[Datei:03_block_02.PNG|border]]<pre id="pre2">let basketX = 2;let eggX = 2;let eggY = 0;led.plot(eggX, eggY);led.plot(basketX, 4);</pre></spoiler></li>


<li>Zu Beginn der Klammer dauerhaft wird immer eine Zeile weitergeschaltet, da das Ei ja durch die Schwerkraft herunterfällt. Somit muss die Anzeige einmal gelöscht werden bevor die nächste Zeile erscheinen kann.
<li>Wähle unter dem blau gefärbten Begriff '''Grundlagen''' den Block '''pausiere (ms) 100''' und füge diesen Block in die Klammer '''wenn Knopf B gedrückt''' als letzte Zeile hinzu.  Ändere den Wert '''100''' auf '''1000''' ms zur Verbesserung der Anzeige. <spoiler text="Schritt 6 - Blöcke"><pre id="pre06">input.onButtonPressed(Button.B, function () {TempWert = pins.analogReadPin(AnalogPin.P0) basic.showNumber(TempWert) basic.pause(1000)}</pre></spoiler></li>
Dazu wählst du im violett gefärbten Baukasten LED den Block "schalte Pixel x 0 y 0" und ziehst ihn an erster Stelle in die Klammer "dauerhaft" (schalte heißt eigentlich schalte-aus, dies ist eine unglückliche Übersetzung). Ändere x auf eggX und y auf eggY mit Hilfe des roten Baukastens Platzhalter. Füge nun nochmals den Block "schalte Pixel x 0 y 0" ein und ändere x auf basketX und y auf 4. <br/>
 
Nun kann eine Zeile weitergeschaltet werden. Füge über den roten Baukasten "ändere Platzhalter auf 0" ein. Nun benötigen wir einen kleinen Trick um 2 Elemente in den Platz der 0 einzusetzen. Gehe in den violetten Baukasten der Mathematik und hole dir dort den Block "0 + 0" und füge ihn in das Feld 0 ein. Die erste Null erhält den Wert eggY und die zweite änderst du per Tastatur in eine 1. Somit steht dort "ändere Platzhalter auf (eggY + 1)". Nun kann das Ei wieder gezeichnet werden mit LED und "zeichne x 0 y 0". Den Wert x setzte auf eggX und Wert y auf eggY. Schau mal hier ...  
Fertig, dein Messinstrument ist einsatzbereit!<br>
<spoiler text="Schritt 3 - Blöcke">[[Datei:03_block_03.PNG|border]]
Miß nun zwei mindestens 10 &deg; Celsius unterschiedliche Temperaturwerte und schreibe dir jeweils Temperatur &deg; Celsius/ Temperaturwert micro:bit (0-1023) auf.<br>
<pre id="3">
Danach führst du die [[Thermometer_kalibrieren |Errechnung der Kalibrierungswerte wie angegeben durch.]]
basic.forever(function () {
</ol>
     led.unplot(eggX, eggY)
 
     led.unplot(basketX, 4)
==Lösungsschritte - Teil 2==
     eggY = eggY + 1
<ol start=7>
     led.plot(eggX, eggY)
<li>Kopiere dir den Lösungsteil 1 durch rechts Klicken auf die Klammer '''wenn Knopf B gedrückt''' und anschließend '''Duplizieren'''. Klicke auf das kleine, nach unten zeigende Pfeilzeichen '''B''' und ändere dies auf '''A''' damit dein Code nicht schraffiert angezeigt wird und ungültig bleibt.
})
<spoiler text="Schritt 7 - Blöcke">
</pre>
<pre id="pre07">
</spoiler></li>
    input.onButtonPressed(Button.A, function () {
    TempWert = pins.analogReadPin(AnalogPin.P0)
    basic.showNumber(TempWert)
    basic.pause(1000)
})</pre></spoiler></li>
 
<li>Für die Errechnung (Kalkulation) des Temperaturwertes benötigen wir eine neue Variable. Wähle unter dem rot gefärbten Begriff '''Variablen''' den Block '''Erstelle eine Variable...''' auf gib der Variable den Namen '''TempCalc'''. Ändere im Block '''setze TempWert auf analoge Werte von Pin P0''' auf '''TempCalc'''. Klicke dazu auf das kleine, nach unten zeigende Pfeilzeichen '''TempWert''' und ersetze es mit '''TempCalc'''. Erledige diese Änderung auch bei '''zeige Zahl TempWert''' und stelle auf '''TempCalc''' um.
<spoiler text="Schritt 8 - Blöcke">
<pre id="pre08">
    input.onButtonPressed(Button.A, function () {
    TempCalc = pins.analogReadPin(AnalogPin.P0)
    basic.showNumber(TempCalc)
    basic.pause(1000)
})</pre></spoiler></li>
 
<li>Die Umrechnung des Messwertes erfolgt in drei Teilaufgaben. <br>
1. Teilaufgabe: Nullpunktverschiebung. (d)<br>
Der micro:bit misst keinen negativen Strom an seinen Pins, somit muss der Nullpunkt zur Messung von negativen Temperaturen nach unten (-) verschoben werden. <br/> Aus der Umrechnung der Kalibrierungswerte ergibt dies '''d = 199.65'''. Dieser Wert wird nun vom gemessenen analogen Spannungswert von Pin P0 abgezogen und schon kann der micro:bit auch Minusgrade messen.<br>
Wähle dazu unter dem violett gefärbten Begriff '''Mathematik''' die Subtraktion '''0 - 0''' und ziehe sie in den Platz bei Knopf A bei '''analoge Werte von Pin P0''' hinein. Dadurch rutscht '''analoge Werte von Pin P0''' wieder heraus und wird schraffiert daneben angezeigt. Keine Sorge, wir reparieren das im nächsten Schritt gleich wieder.
<spoiler text="Schritt 9 - Blöcke">
<pre id="pre09">
    input.onButtonPressed(Button.A, function () {
    TempCalc = 0 - 0
    basic.showNumber(TempCalc)
    basic.pause(1000)
})</pre></spoiler></li>
 
<li>Ziehe den schraffiert angezeigten Block '''analoge Werte von Pin P0''' in den ersten weißen Bereich '''0''' wieder hinein und tippe mit der Tastatur in den zweiten weißen Bereich '''0''' den errechneten Wert '''d = 199.65''' ein. <br>Damit ist die 1. Teilaufgabe erledigt und sieht etwa so aus.
<spoiler text="Schritt 10 - Blöcke">
<pre id="pre10">
    input.onButtonPressed(Button.A, function () {
    TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
    basic.showNumber(TempCalc)
    basic.pause(1000)
})</pre></spoiler></li>
 
<li>2. Teilaufgabe: Umrechnung und auf eine Kommastelle runden. <br>
Die Umrechnung erfolgt durch Division des TempCalc-Wertes mit dem errechneten Steigungswert der Geraden '''k = 13.066'''. Dazu wähle den Block '''setze TempCalc auf 0''' aus dem Bereich der '''Varaiblen''' und platziere ihn direkt in die zweite Zeile unter '''setze TempCalc auf analoge Werte von Pin P0 - 199.65'''.
<spoiler text="Schritt 11 - Blöcke">
<pre id="pre11">
    input.onButtonPressed(Button.A, function () {
    TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
    TempCalc = 0
    basic.showNumber(TempCalc)
    basic.pause(1000)
})</pre></spoiler></li>
 
<li>Bring den Divisionsblock aus dem Bereich Mathematik in den weißen Bereich '''0''' und füge die Variable '''TempCalc''' und die Zahl 1.3066 durch eintippen in das Feld der Division ein. Warum hier die Steigung um eine Kommastelle nach rechts verschoben wurde, wird im nächsten Schritt erklärt.
<spoiler text="Schritt 12 - Blöcke">
<pre id="pre12">
    input.onButtonPressed(Button.A, function () {
    TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
    TempCalc = TempCalc / 13.066
    basic.showNumber(TempCalc)
    basic.pause(1000)
})</pre></spoiler></li>
 
<li>Der micro:bit kann runden, aber nur auf ganze Zahlen! Daher müssen wir zuerst den zu rundenden Wert um eine Stelle weiter nach links verschieben, d.h. '''x 10'''. Dazu verkleinern wir den Divisor d.h. aus '''13.066''' wird NEU '''1.3066'''. ACHTUNG! Das müssen wir später wieder rückgängig machen! Füge aus dem Bereich '''Mathematik''' die Berechnung '''runden 0''' an die Stelle wo '''TempCalc / 1.3066''' in der zweiten Zeile der Klammer '''wenn Knopf A gedrückt''' steht ein. Dadurch rutscht '''TempCalc / 1.3066''' wieder heraus und wird schraffiert daneben angezeigt. Keine Sorge, wir reparieren das im nächsten Schritt gleich wieder.
<spoiler text="Schritt 13 - Blöcke">
<pre id="pre13">
    input.onButtonPressed(Button.A, function () {
    TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
    TempCalc = Math.round(0)
    basic.showNumber(TempCalc)
    basic.pause(1000)
})</pre></spoiler></li>
 
<li>Ziehe den schraffiert angezeigten Block '''TempCalc / 1.3066''' in den weißen Bereich von '''runden 0''' wieder hinein.  <br>Damit ist die 2. Teilaufgabe erledigt und sieht etwa so aus.
<spoiler text="Schritt 14 - Blöcke">
<pre id="pre14">
    input.onButtonPressed(Button.A, function () {
    TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
    TempCalc = Math.round(TempCalc / 1.3066)
    basic.showNumber(TempCalc)
    basic.pause(1000)
})</pre></spoiler></li>
 
<li>3. Teilaufgabe: Verschiebung um eine Kommastelle zurück nach rechts &mdash; Abschluss des Rundens auf eine Nachkommastelle.<br>
Der Wert von '''TempCalc''' wird nun durch einfache Division um eine Dezimalstelle nach rechts verschoben, d.h. '''/ 10'''. Dazu wähle den Block '''setze TempCalc auf 0''' aus dem Bereich der '''Varaiblen''' und platziere ihn direkt in die dritte Zeile unter '''setze TempCalc auf runden(TempCalc /1.3066)'''.
<spoiler text="Schritt 15 - Blöcke">
<pre id="pre15">
    input.onButtonPressed(Button.A, function () {
     TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
     TempCalc = Math.round(TempCalc / 1.3066)
     TempCalc = 0
    basic.showNumber(TempCalc)
     basic.pause(1000)
})</pre></spoiler></li>


<li>Für die Steuerung des Korbs wird nun der Beschleunigungssensor ausgelesen und in einem Platzhalter zwischengespeichert. Füge den roten Block "ändere Platzhalter auf 0" ein und ändere Platzhalter in accX. In den Platz der 0 füge den rosa Block der Eingabe [[Datei:Iconmonstr-arrow-20re-120.png|20px]] "Beschleunigung (mg) x" hinzu. <br/>
<li>Bring den Divisionsblock aus dem Bereich Mathematik in den weißen Bereich '''0''' und füge die Variable '''TempCalc''' und die Zahl 10 durch eintippen in das Feld der Division ein. Damit wird '''TempCalc''' um eine Dezimalstelle nach rechts verschoben und wir erhalten das Ergebnis der Umrechnung mit genau einer Nachkommastelle. So brauchst du nicht endlos warten, falls ein Temperaturwert von z.B.'''19.99346934924423299239''' durch die kleine Anzeige des micro:bits scrollt.<br>Damit ist die 3. Teilaufgabe erledigt und die Umrechnung komplett. Das Ergebnis sieht etwa so aus.
Beginne wieder mit dem roten Block "ändere Platzhalter auf 0" und ändere Platzhalter in basketX. Die Mittelstellung der Position des Korbs befindet sich bei 2, die durch den Beschleunigungssensor <b>verändert</b> werden soll. Dazu wird im nächsten Schritt eine Berechnung erstellt, die die gemessene Beschleunigung der X-Achse <b>durch 200 teilt</b> um verwertbare Ergebnisse für die Korbposition zu erhalten (accX ÷ 200). <br/>
<spoiler text="Schritt 16 - Blöcke">
<b>Berechnung:</b> basketX = 2 + minimal(2, maximal(-2, accX ÷ 200)) <spoiler text="Berechnungsdetails">
<pre id="pre16">
Die Funktionen minimal und maximal geben den jeweils geforderten Wert der dahinter in Klammer stehenden Zahlenreihe aus.<br/>
    input.onButtonPressed(Button.A, function () {
z.B. minimal(1 ,5, 7, -2) [[Datei:Iconmonstr-arrow-20re-120.png|20px]] -2<br/>
     TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
od. maximal(1, 5, 7, -2) [[Datei:Iconmonstr-arrow-20re-120.png|20px]] 7<br/>
     TempCalc = Math.round(TempCalc / 1.3066)
<br/>
     TempCalc = TempCalc / 10
accX kann Werte von ± 1024 darstellen, d.h. bei maximaler Neigung links -1024 und rechts +1024.<br/>
     basic.showNumber(TempCalc)
D.h. bei maximal(-2, accX ÷ 200) wird der Maximalausschlag nach links (-1024 ÷ 200 ≈ -5) nivelliert und auf maximal -2 festgelegt. <br/>
     basic.pause(1000)
Gleiches gilt für den Maximalausschlag nach rechts (1024 ÷ 200 ≈ 5) der mit minimal(2, ≈5) auf minimal 2 nivelliert wird.<br/>
})</pre></spoiler></li>
</spoiler>
Somit erreicht man eine Verschiebung des Korbs um nicht mehr als 2 Positionen nach links (0) oder rechts (4) von der Mittelposition (2) ausgehend.<br/>
Füge dazu den violetten Block "0 + 0" ein, in die zweite 0 füge den erweiterten Mathematik Block (…More) "minimal von 0 und 0" und in dessen zweite 0 den erweiterten Mathematik Block (…More) "maximal von 0 und 0" ein. <br/>Dies sieht so aus. <spoiler text="Blöcke">[[Datei:03_block_04a.PNG|border]]
<pre id=4a">
basketX = 2 + Math.min(2, Math.max(-2, 0))
</pre>
</spoiler>
In die allerletzte 0 von "maximal von 0 und 0" ziehe den violetten Mathematik Block "0 ÷ 0". Ersetzte dort die erste 0 durch Platzhalter accX und die zweite 0 durch 200 mit der Tastatur. <br/>Der Block sieht nun wie folgt aus.<spoiler text="Blöcke">[[Datei:03_block_04b.PNG|border]]
<pre id=4b">
basketX = 0 + Math.min(0, Math.max(0, Math.idiv(accX, 200)))
</pre></spoiler>
Nun werden die restlichen Teile der Berechnung für den Maximalausschlag der Steuerung (-2 / + 2) wie oben erklärt eingesetzt.
<spoiler text="Blöcke">[[Datei:03_block_04c.PNG|border]]
<pre id=4c">
basketX = 2 + Math.min(2, Math.max(-2, Math.idiv(accX, 200)))
</pre></spoiler>
Abschließend für Schritt 4 soll der nun seiner Position entsprechend <b>positionierte Korb wieder gezeichnet</b> werden mit LED und "Zeichne x 0 y 0". Den Wert x setzte auf basketX und Wert y auf 4.  
<br/><spoiler text="Schritt 4 - Alle Blöcke">[[Datei:03_block_04.PNG|border]]
<pre id="4d">
basic.forever(function () {
     led.unplot(eggX, eggY)
     led.unplot(basketX, 4)
    eggY = eggY + 1
    led.plot(eggX, eggY)
     accX = input.acceleration(Dimension.X)
     basketX = 2 + Math.min(2, Math.max(-2, Math.idiv(accX, 200)))
     led.plot(basketX, 4)
})
</pre>
</spoiler></li>


<li>Zu guter Letzt soll überprüft werden, ob das Ei durch die letzte Zeile unten durchfallen würde (wenn eggY > 4) und ein neues Ei wieder von oben erscheinen soll (ändere eggY auf -1). Allerdings soll hier die Position nicht mittig (2) starten, sondern per Zufall weiter links oder rechts – sonst wäre das Spiel ja zu einfach (ändere eggX auf pick random 0 to 4). <br/>
<li>Zum besseren Verständnis der Anzeige des Temperaturwertes kannst du noch den Block '''zeige LEDs''' aus dem Bereich '''Grundlagen''' einfügen und '''&deg; C''' im Display erscheinen lassen gefolgt von einer kurzen Pause. Hol dir die zwei Blöcke und füge sie direkt nach der dritten Zeile '''setze TempCalc...''' ein. Der fertige Code sieht dann etwa so aus.
Beginne mit einem dunkelgrünen Logik-Block "wenn wahr dann" und setzte die Logik "0 = 0" in den Bereich von wahr. In die linke 0 kommt eggY in die rechte "4" und das "=" wird in ein ">" umgewandelt.<br/>
<spoiler text="Schritt 17 - Blöcke">
Danach füge zwei Mal den Block "ändere Platzhalter auf 0" ein.
<pre id="pre17">
Beim ersten Block wird eggY auf "-1" geändert und beim zweiten eggX auf "wähle eine zufällige Zahle zwischen 0 und 4". Dies findest du unter dem Bereich Mathematik.<br/>
    input.onButtonPressed(Button.A, function () {
Da das Ei nun wie eine Rakete von oben herunter saust und wir keine Zeit bekommen den Korb zu verschieben wird als allerletzter Block eine Pause "pausiere (ms) 300" unterhalb der dunkelgrünen Klammer wenn wahr dann eingefügt. Somit bleibt uns genügend Zeit zu reagieren. <spoiler text="Schritt 5 - Blöcke">[[Datei:03_block_05.PNG|border]]
     TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
<pre id="5">
     TempCalc = Math.round(TempCalc / 1.3066)
basic.forever(function () {
     TempCalc = TempCalc / 10
     led.unplot(eggX, eggY)
     basic.showLeds(`
     led.unplot(basketX, 4)
        # . . # #
     eggY = eggY + 1
        . . # . .
     led.plot(eggX, eggY)
        . . # . .
    accX = input.acceleration(Dimension.X)
        . . # . .
    basketX = 2 + Math.min(2, Math.max(-2, 0))
         . . . # #
    led.plot(basketX, 4)
         `)
    if (eggY > 4) {
         eggY = -1
         eggX = randint(0, 4)
    }
     basic.pause(300)
     basic.pause(300)
})
    basic.showNumber(TempCalc)
</pre>
    basic.pause(1000)
</spoiler></li>
})</pre></spoiler></li>


Großartig, du hast es geschafft. Gratuliere!
Großartig, du hast es geschafft. Gratuliere!
</ol>
</ol>
==Flussdiagramm==
TO DO


==Lösung==
==Lösung==
Eine vollständige Lösung kannst du hier vergleichen. <spoiler text="Lösung">[[Datei:03_fangdasei_all.png|border|Lösung]]
Eine vollständige Lösung kannst du hier vergleichen. <spoiler text="Lösung">
<pre id="6">
<pre id="pre99">
let accX = 0
let TempCalc = 0
let basketX = 2
let TempWert = 0
let eggX = 2
input.onButtonPressed(Button.A, function () {
let eggY = 0
     TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
led.plot(eggX, eggY)
     TempCalc = Math.round(TempCalc / 1.3066)
led.plot(basketX, 4)
     TempCalc = TempCalc / 10
basic.forever(function () {
     basic.showLeds(`
     led.unplot(eggX, eggY)
        # . . # #
     led.unplot(basketX, 4)
        . . # . .
     eggY = eggY + 1
        . . # . .
     led.plot(eggX, eggY)
        . . # . .
    accX = input.acceleration(Dimension.X)
         . . . # #
    basketX = 2 + Math.min(2, Math.max(-2, 0))
         `)
    led.plot(basketX, 4)
    if (eggY > 4) {
         eggY = -1
         eggX = randint(0, 4)
    }
     basic.pause(300)
     basic.pause(300)
    basic.showNumber(TempCalc)
    basic.pause(1000)
})
input.onButtonPressed(Button.B, function () {
    TempWert = pins.analogReadPin(AnalogPin.P0)
    basic.showNumber(TempWert)
    basic.pause(1000)
})
})
</pre>
</pre>
</spoiler>
</spoiler>


[[Fang_das_Ei|Zurück zur Aufgabe]]
[[Temperatur-Kontrolle|zurück zur Aufgabe]]
 
<htmlet>makecode_embed</htmlet>
<htmlet>makecode_embed</htmlet>

Aktuelle Version vom 18. Februar 2022, 17:43 Uhr

Schritt für Schritt

Öffne den micro:bit Block-Editor, um ein Programm für den BBC micro:bit zu schreiben: https://makecode.microbit.org/

Grundgerüst der Lösung

    Teil 1 - vor Messung von zwei Temperaturwerten und Errechnung der Kalibrierungswerte
  1. Durch Auslesen des analogen Spannungswertes eines Pins kann der micro:bit als Messgerät verwendet werden.
  2. Die Spannung des micro:bits von 3 Volt wird durch die elektronische Schaltung (Thermistor + Widerstand) und etwas Wartezeit (ca. 5-10 Min.) auf die aktuelle Temperatur eingestellt.
  3. Dann lesen wir die Spannung an PIN 0 aus und bilden diesen Wert in einer Variable ab.
  4. Den Spannungswert der Variablen geben wir zur Kalibrierung bei Drücken des Knopfs B im Display aus.
  5. Teil 2 - nach Errechnung der Kalibrierungswerte
  6. Die eingelesene Variable muss nur noch in eine Temperatur umgewandelt werden,
  7. Der umgerechnete Wert wird durch Drücken des Knopfs A im Display angezeigt.
  8. Lösungsschritte - Teil 1

    1. Wähle unter dem rosa gefärbten Begriff Eingabe den Block wenn Knopf A gedrückt und ziehe ihn nach rechts in den Arbeitsbereich. Klicke auf das kleine, nach unten zeigende Pfeilzeichen A und ändere dies auf B. Wir wollen den analogen Wert bei Druck auf den Knopf B auslesen und anzeigen. <spoiler text="Schritt 1 - Blöcke">
      input.onButtonPressed(Button.B, function () {}
      </spoiler>
    2. Wähle unter dem rot gefärbten Begriff Variablen den Block Erstelle eine Variable... auf gib der Variable den Namen TempWert. Ziehe den Block setze TempWert auf 0 nach rechts in den Arbeitsbereich direkt in den Block wenn Knopf B gedrückt. <spoiler text="Schritt 2 - Blöcke">
      input.onButtonPressed(Button.B, function () {TempWert = 0}
      </spoiler>
    3. Klappe die schwarz gefärbte Kategorie Fortgeschritten auf und ziehe den Block analoge Werte von Pin P0 unter dem dunkelrot gefärbten Begriff Pins direkt in den weißen Bereich 0 des Blocks setze TempWert auf 0. <spoiler text="Schritt 3 - Blöcke">
      input.onButtonPressed(Button.B, function () {TempWert = pins.analogReadPin(AnalogPin.P0)}
      </spoiler>
    4. Wähle unter dem blau gefärbten Begriff Grundlagen den Block zeige Zahl 0 und füge diesen Block in die Klammer wenn Knopf B gedrückt als letzte Zeile hinzu. <spoiler text="Schritt 4 - Blöcke">
      input.onButtonPressed(Button.B, function () {TempWert = pins.analogReadPin(AnalogPin.P0) basic.showNumber(0)}
      </spoiler>
    5. Wähle unter dem rot gefärbten Begriff Variablen den Block TempWert und ziehe den Block direkt in den weißen Bereich 0 des Blocks zeige Zahl  0. <spoiler text="Schritt 5 - Blöcke">
      input.onButtonPressed(Button.B, function () {TempWert = pins.analogReadPin(AnalogPin.P0) basic.showNumber(TempWert)}
      </spoiler>
    6. Wähle unter dem blau gefärbten Begriff Grundlagen den Block pausiere (ms) 100 und füge diesen Block in die Klammer wenn Knopf B gedrückt als letzte Zeile hinzu. Ändere den Wert 100 auf 1000 ms zur Verbesserung der Anzeige. <spoiler text="Schritt 6 - Blöcke">
      input.onButtonPressed(Button.B, function () {TempWert = pins.analogReadPin(AnalogPin.P0) basic.showNumber(TempWert) basic.pause(1000)}
      </spoiler>
    7. Fertig, dein Messinstrument ist einsatzbereit!
      Miß nun zwei mindestens 10 ° Celsius unterschiedliche Temperaturwerte und schreibe dir jeweils Temperatur ° Celsius/ Temperaturwert micro:bit (0-1023) auf.
      Danach führst du die Errechnung der Kalibrierungswerte wie angegeben durch.

    Lösungsschritte - Teil 2

    1. Kopiere dir den Lösungsteil 1 durch rechts Klicken auf die Klammer wenn Knopf B gedrückt und anschließend Duplizieren. Klicke auf das kleine, nach unten zeigende Pfeilzeichen B und ändere dies auf A damit dein Code nicht schraffiert angezeigt wird und ungültig bleibt. <spoiler text="Schritt 7 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempWert = pins.analogReadPin(AnalogPin.P0)
          basic.showNumber(TempWert)
          basic.pause(1000)
      })
      </spoiler>
    2. Für die Errechnung (Kalkulation) des Temperaturwertes benötigen wir eine neue Variable. Wähle unter dem rot gefärbten Begriff Variablen den Block Erstelle eine Variable... auf gib der Variable den Namen TempCalc. Ändere im Block setze TempWert auf analoge Werte von Pin P0 auf TempCalc. Klicke dazu auf das kleine, nach unten zeigende Pfeilzeichen TempWert und ersetze es mit TempCalc. Erledige diese Änderung auch bei zeige Zahl TempWert und stelle auf TempCalc um. <spoiler text="Schritt 8 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempCalc = pins.analogReadPin(AnalogPin.P0)
          basic.showNumber(TempCalc)
          basic.pause(1000)
      })
      </spoiler>
    3. Die Umrechnung des Messwertes erfolgt in drei Teilaufgaben.
      1. Teilaufgabe: Nullpunktverschiebung. (d)
      Der micro:bit misst keinen negativen Strom an seinen Pins, somit muss der Nullpunkt zur Messung von negativen Temperaturen nach unten (-) verschoben werden.
      Aus der Umrechnung der Kalibrierungswerte ergibt dies d = 199.65. Dieser Wert wird nun vom gemessenen analogen Spannungswert von Pin P0 abgezogen und schon kann der micro:bit auch Minusgrade messen.
      Wähle dazu unter dem violett gefärbten Begriff Mathematik die Subtraktion 0 - 0 und ziehe sie in den Platz bei Knopf A bei analoge Werte von Pin P0 hinein. Dadurch rutscht analoge Werte von Pin P0 wieder heraus und wird schraffiert daneben angezeigt. Keine Sorge, wir reparieren das im nächsten Schritt gleich wieder. <spoiler text="Schritt 9 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempCalc = 0 - 0
          basic.showNumber(TempCalc)
          basic.pause(1000)
      })
      </spoiler>
    4. Ziehe den schraffiert angezeigten Block analoge Werte von Pin P0 in den ersten weißen Bereich 0 wieder hinein und tippe mit der Tastatur in den zweiten weißen Bereich 0 den errechneten Wert d = 199.65 ein.
      Damit ist die 1. Teilaufgabe erledigt und sieht etwa so aus. <spoiler text="Schritt 10 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
          basic.showNumber(TempCalc)
          basic.pause(1000)
      })
      </spoiler>
    5. 2. Teilaufgabe: Umrechnung und auf eine Kommastelle runden.
      Die Umrechnung erfolgt durch Division des TempCalc-Wertes mit dem errechneten Steigungswert der Geraden k = 13.066. Dazu wähle den Block setze TempCalc auf 0 aus dem Bereich der Varaiblen und platziere ihn direkt in die zweite Zeile unter setze TempCalc auf analoge Werte von Pin P0 - 199.65. <spoiler text="Schritt 11 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
          TempCalc = 0
          basic.showNumber(TempCalc)
          basic.pause(1000)
      })
      </spoiler>
    6. Bring den Divisionsblock aus dem Bereich Mathematik in den weißen Bereich 0 und füge die Variable TempCalc und die Zahl 1.3066 durch eintippen in das Feld der Division ein. Warum hier die Steigung um eine Kommastelle nach rechts verschoben wurde, wird im nächsten Schritt erklärt. <spoiler text="Schritt 12 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
          TempCalc = TempCalc / 13.066
          basic.showNumber(TempCalc)
          basic.pause(1000)
      })
      </spoiler>
    7. Der micro:bit kann runden, aber nur auf ganze Zahlen! Daher müssen wir zuerst den zu rundenden Wert um eine Stelle weiter nach links verschieben, d.h. x 10. Dazu verkleinern wir den Divisor d.h. aus 13.066 wird NEU 1.3066. ACHTUNG! Das müssen wir später wieder rückgängig machen! Füge aus dem Bereich Mathematik die Berechnung runden 0 an die Stelle wo TempCalc / 1.3066 in der zweiten Zeile der Klammer wenn Knopf A gedrückt steht ein. Dadurch rutscht TempCalc / 1.3066 wieder heraus und wird schraffiert daneben angezeigt. Keine Sorge, wir reparieren das im nächsten Schritt gleich wieder. <spoiler text="Schritt 13 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
          TempCalc = Math.round(0)
          basic.showNumber(TempCalc)
          basic.pause(1000)
      })
      </spoiler>
    8. Ziehe den schraffiert angezeigten Block TempCalc / 1.3066 in den weißen Bereich von runden 0 wieder hinein.
      Damit ist die 2. Teilaufgabe erledigt und sieht etwa so aus. <spoiler text="Schritt 14 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
          TempCalc = Math.round(TempCalc / 1.3066)
          basic.showNumber(TempCalc)
          basic.pause(1000)
      })
      </spoiler>
    9. 3. Teilaufgabe: Verschiebung um eine Kommastelle zurück nach rechts — Abschluss des Rundens auf eine Nachkommastelle.
      Der Wert von TempCalc wird nun durch einfache Division um eine Dezimalstelle nach rechts verschoben, d.h. / 10. Dazu wähle den Block setze TempCalc auf 0 aus dem Bereich der Varaiblen und platziere ihn direkt in die dritte Zeile unter setze TempCalc auf runden(TempCalc /1.3066). <spoiler text="Schritt 15 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
          TempCalc = Math.round(TempCalc / 1.3066)
          TempCalc = 0
          basic.showNumber(TempCalc)
          basic.pause(1000)
      })
      </spoiler>
    10. Bring den Divisionsblock aus dem Bereich Mathematik in den weißen Bereich 0 und füge die Variable TempCalc und die Zahl 10 durch eintippen in das Feld der Division ein. Damit wird TempCalc um eine Dezimalstelle nach rechts verschoben und wir erhalten das Ergebnis der Umrechnung mit genau einer Nachkommastelle. So brauchst du nicht endlos warten, falls ein Temperaturwert von z.B.19.99346934924423299239 durch die kleine Anzeige des micro:bits scrollt.
      Damit ist die 3. Teilaufgabe erledigt und die Umrechnung komplett. Das Ergebnis sieht etwa so aus. <spoiler text="Schritt 16 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
          TempCalc = Math.round(TempCalc / 1.3066)
          TempCalc = TempCalc / 10
          basic.showNumber(TempCalc)
          basic.pause(1000)
      })
      </spoiler>
    11. Zum besseren Verständnis der Anzeige des Temperaturwertes kannst du noch den Block zeige LEDs aus dem Bereich Grundlagen einfügen und ° C im Display erscheinen lassen gefolgt von einer kurzen Pause. Hol dir die zwei Blöcke und füge sie direkt nach der dritten Zeile setze TempCalc... ein. Der fertige Code sieht dann etwa so aus. <spoiler text="Schritt 17 - Blöcke">
          input.onButtonPressed(Button.A, function () {
          TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
          TempCalc = Math.round(TempCalc / 1.3066)
          TempCalc = TempCalc / 10
          basic.showLeds(`
              # . . # #
              . . # . .
              . . # . .
              . . # . .
              . . . # #
              `)
          basic.pause(300)
          basic.showNumber(TempCalc)
          basic.pause(1000)
      })
      </spoiler>
    12. Großartig, du hast es geschafft. Gratuliere!

    Lösung

    Eine vollständige Lösung kannst du hier vergleichen. <spoiler text="Lösung">

    let TempCalc = 0
    let TempWert = 0
    input.onButtonPressed(Button.A, function () {
        TempCalc = pins.analogReadPin(AnalogPin.P0) - 199.65
        TempCalc = Math.round(TempCalc / 1.3066)
        TempCalc = TempCalc / 10
        basic.showLeds(`
            # . . # #
            . . # . .
            . . # . .
            . . # . .
            . . . # #
            `)
        basic.pause(300)
        basic.showNumber(TempCalc)
        basic.pause(1000)
    })
    input.onButtonPressed(Button.B, function () {
        TempWert = pins.analogReadPin(AnalogPin.P0)
        basic.showNumber(TempWert)
        basic.pause(1000)
    })
    

    </spoiler>

    zurück zur Aufgabe