Block 2 - Binäre Zahlen und Boolsche Algebra

In diesem Abschnitt lernen Sie binäre, oktale und hexadezimale Zahlen, sowie verschiedene Variablentypen kennen. Nach diesem Abschnitt wissen Sie wie man in verschiedenen Zahlensystemen rechnet.

Einführung in die binären Zahlen

Übungsaufgaben

1.) Dezimal zu Binär

Konvertieren Sie die dezimalen Zahlen in das binäre Format.

  • 15

  • 3

  • 14

2.) Binär zu Dezimal

Konvertieren Sie die binären Zahlen in das dezimale Format.

Hinweis "0b" kennzeichnet, dass die Zahl binär ist. Die zu konvertierende Zahl beginnt erst nach dem b.

  • 0b100

  • 0b000

  • 0b110

  • 0b101

  • Ob101

  • Ob1010

Jetzt sollten Sie auch diesen Witz verstehen:

Bits und Bytes

Nun wollen wir uns anschauen, wie der Computer Zahlen speichert.

Übungsaufgaben

1.) Minimal

Was ist die kleinste Informationseinheit im Computer?

a) byte

b) bit

c) kilobyte

d) baud

2.) Kilo

Wieviele Kilobytes stecken in einem Gigabyte?

3.) Bytegröße

Aus wie vielen Bits besteht ein Byte?

4.) 2 Bytes

Aus wievielen Bits bestehen zwei Bytes?

5.) kB

Wie viele Bytes stecken in einem Kilobyte?

6.) Megabyte

a) Wie viele Bytes stecken in einem Megabyte?

b) Eine Datei hat 100 Megabyte. Wieviele Kilobit sind das?

c) Ein Speicherchip hat eine Kapazität von 16 Gigabit. Wieviel Megabyte sind das?

Fließkommazahlen

Im Folgenden lernen Sie, wie rationale Zahlen im Computer gespeichert werden.

Übungsaufgaben

1.) Vorzeichen

Welchen Wert muss das Vorzeichen-Bit im Fließkommaformat haben, um eine positive Zahl zu haben?

2.) Recherche

Finden Sie raus, wie Fließkommazahlen auf dem Arduino heißen.

3.) Pi mal Daumen

Ist das Rechnen mit der Konstante PI im Rechner genau?

4.) Wahr oder falsch

Geben Sie für jede Aussage an, ob sie wahr oder falsch ist.

a) Die Anzahl Bits, die für Mantisse und Exponent verwendet werden, ist variabel und abhängig davon, wie groß die darzustellende Zahl ist.

b) Bei der binären Darstellung der Zahlen 123,456 und -123,456 sind die Mantissen und Exponenten jeweils gleich.Lückentext:Dieser Teil ist nur für Sie sichtbar, da Sie die Rolle Editor besitzen.

Variablentypen

Im folgenden Video erhalten Sie einen kleinen Überblick über verschieden Variablentypen im Arduino.

Übungsaufgaben

1.) Maximum

Welche ist die jeweils größte Dezimalzahl, die man in einer Variable vom Typ unsigned char, integer und char speichern kann? Nehmen Sie an, dass wir einen Arduino Uno vor uns haben.

2.) Minimum

Welche ist die jeweils kleinste Dezimalzahl, die man in einer Variable vom Typ unsigned char, integer und char speichern kann? Nehmen Sie an, dass wir einen Arduino Uno vor uns haben.

3.) Typen

Berechnen Sie das Ergebnis. Beachten Sie dabei den Variablentyp. Ein vorgestelltes (TYPE) gibt den zurückgegebenen Datentyp an.

int a = 4;
float b = 2.6;

float ergebnis;
  • ergebnis = (int) (a + b);

  • ergebnis = a + b;

  • ergebnis = (int) (a - b);

  • ergebnis = a - b;

  • ergebnis = a - (int) b;

4.) Mögliche Werte

a) Wie viele mögliche Werte kann eine char-Variable darstellen?

b) Wie viele mögliche Werte kann eine unsigned int-Variable darstellen? Nehmen Sie für beide Fragen an, dass ein Arduino Uno verwendet wird.

Overflow Problem

Was passiert, wenn die Zahlen zu gross werden?

Übungsaufgaben

1.) Overflow

Was ist das binäre Ergebnis von 0b11111111 + 0b1 (im Zweierkomplement), wenn wir annehmen, dass wir genau ein Byte zur Verfügung haben?

2.) Byte Addition

Addieren Sie die beiden 8-bit Zahlen im Zweierkomplement und geben Sie das Ergebnis binär und dezimal an: 0b01101101 mit 0b01000010.

3.) Recherche

Recherchieren Sie: Was ist ein Underflow-Problem?

4.) millis()

Warum erfolgt in diesem Code nach ungefähr 33 Sekunden Laufzeit ein Overflow? Die Lösung finden Sie unten auf dieser Seite.

int millis_in_int;

void setup() {
    Serial.begin(9600);
}


void loop() {
    millis_in_int = millis();
    Serial.println( millis_in_int );
}

5.) Addition und Substraktion

a) Die Zahl 167 ist in einer unsigned char-Variable gespeichert. Zu dieser Zahl wird 118 addiert. Welcher Wert steht nach der Addition in der Variable? Geben Sie das Ergebnis binär und dezimal an.

b) Die Zahl 23 ist in einer unsigned char-Variable gespeichert. Von dieser Zahl wird 36 subtrahiert. Welcher Wert steht nach der Subtraktion in der Variable? Geben Sie das Ergebnis binär und dezimal an.

Lösungen

Lösung zu Aufgabe 4.)

millis() gibt die aktuelle Systemlaufzeit in Millisekunden im Typ unsigned long zurück. Auf dem Arduino Uno können so positive Zahlen bis 2^32-1 gespeichert werden. Pro Sekunde schnellt der Rückgabewert von millis() um 1000 an. Wird nun versucht, diese Zahl als Integer zu interpretieren, gelingt dies bis ungefähr Sekunde 32 gut. Aber warum? In einem Integer können positive und negative Zahlen bis 2^15-1 (signed) gespeichert werden. Das entspricht 32767. Nach 32 Sekunden ist der Wert 32767 erreicht. Sobald die Funktion jetzt höhere Werte ausspuckt, wird der Kreis weiter durchlaufen, landet aber auf dem anderen Ende des Zahlenstrahls bei -32768. Von dort aus wächst die Zahl nun wieder bis 0 an.

Boolsche Variable

Nachdem wir uns mit binären Zahlen beschäftigt haben, wird es nun Zeit für einen Datentyp, der theoretisch nur einen Bit benötigt: die Boolsche Variable.

Übungsaufgaben

1.) Alarm

Unten ist eine Wahrheitstabelle einer Alarmanlage gezeigt. Wenn ein Fenster oder eine Tür offen steht und niemand zu Hause ist, dann soll Alarm ausgelöst werden. Sonst nicht. Füllen Sie die Tabelle aus.

2.) Und und Oder oder XOR

Füllen Sie die Wahrheitstabelle korrekt aus.

3.) 7-Segment

Unten Seite sehen Sie eine 7-Segment-Anzeige. Den einzelnen Segmenten sind Buchstaben zugeordnet. Füllen Sie in der gezeigten Wahrheitstabelle die Zeilen so aus, so dass eine 2, 3, 6 und 9 gezeigt werden können. Die einzelnen Segmente sind mit einem logischen und verknüpft.

Nummerierung der LEDs einer 7-Segment-Anzeige:

4.) Drohne

Eine Drohne fliegt entsprechend der in der untenstehenden Wahrheitstabelle angegebenen Bedingungen. Drücken Sie in normaler Sprache aus, wann die Drohne fliegt.

Logische Ausdrücke

Da Sie nun die boolsche Variable kennen und auch die Operationen der boolschen Algebra gelernt haben, zeigen wir Ihnen nun, wie Sie diese auf dem Arduino implementieren.

Übungsaufgaben

1.) Korrigieren

Korrigieren Sie folgenden Code, sodass die LED blinkt. Die Lösung finden Sie am Ende der Seite.

bool var = 0;

void setup {
    pinMode(13, OUTPUT);
    digitalWrite(13, var);
}

void loop() {
    if (var==0) {
        var = 1;
    } else if (var==1) {
        var = 1;
    }
    digitalWrite(13, var);
    delay(1000);
}

2.) !false: it's funny, because it's true

Eine Variable des Typs "Boolean" kann nur die Werte '0' oder '1' annehmen. Mit einem '!' vor dem Variablennamen kann der jeweils andere Wert eingenommen werden. Bsp.: bool_var = !bool_var; speichert immer das Gegenteil des vorherigen Werts ab.

Nutzen Sie den Aufbau aus Aufgabe 1. Die LED soll nun mit einem Knopf-Druck eingeschaltet werden, mit dem nächsten wieder ausgeschaltet.

3.) Logikoperatoren

Geben Sie je das logisch Ergebnis an. Zur Erinnerung: && - > und, | | -> oder, ^ -> xor, ! -> not.

1&&1 =

1&&0 =

1||0 =

1||1 =

(1&&1)||0 =

0^1 =

1^1 =

!0 =

4.) Wahr oder Falsch?

Welchen Wert haben a und b am Ende des Codes?

bool a = false;
bool b = true;

a=b;
b=!b;
a=a&&b;
b=a||b;
a=a^(!b);

Antwort:

a =

b =

5.) Ausführungs-Bedingung

Gegeben ist folgender Codeschnipsel:

if (a>=5 && a < =10) | a >= 20) {
   ...
}

Für welche der folgenden Werten von a wird der Code in den geschweiften Klammern ausgeführt?

a) 6

b) 15

c) 3

d) 22

Lösungen

Lösung Aufgabe 1.)

bool var = 0;

void setup(){
  pinMode(13, OUTPUT);
  digitalWrite(13, var);
}

void loop() {
  if (var==0) {
    var = 1;
  } else if (var==1) {
    var = 0;
  }
  // oder noch schöner, statt der letzten 4 Zeilen: var = !var;
  digitalWrite(13, var);
  delay(1000);
}

Zählen mit dem Button und Debouncing

Video einfügen: "Zählen mit einem Button und Debouncing"

1.) Ergänzen Sie den folgenden Lückentext.

Für die Erkennung, ob sich der Zustand des Buttons von „nicht gedrückt“ auf „gedrückt“ geändert hat, verwendet man eine _________, die den vorigen Zustand des Buttons speichert.

Zum Entfernen des Prellens baut man eine __________ zwischen zwei aufeinanderfolgenden Zustandsabfragen ein.

For-Schleife

Schleifen sind in der Informatik sehr wichtig, durch sie kann man ein Stück Code mehrfach ausführen. Im Folgenden werden wir Ihnen zeigen, wie die For-Schleife funktioniert.

Programmieren mit der For-Schleife

Im Folgenden lernen Sie, wie Sie eine For-Schleife auf dem Arduino implementieren.

Verwendeter Code:

void setup(){
  // put your setup code here, to run once:
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
  // put your main code here, to run repeatedly:
  int i;
  //lang
  for(i=0;i<3;i++){
    digitalWrite(LED_BUILTIN, HIGH);
    delay(3000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
  }
  //kurz
  for(i=0;i<3;i++){
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
  }
  //lang
  for(i=0;i<3;i++){
    digitalWrite(LED_BUILTIN, HIGH);
    delay(3000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
  }
  //pause
  delay(5000);
}

Übungsaufgaben

1.) Lückencode

Die LED blinkt im folgenden Muster (1 Sek an, 1 Sek aus; 2 Sek an, 1 Sek aus; 3 Sek an, 1 Sek aus; 4 Sek an, 1 Sek aus). Verwenden Sie eine for-Schleife und füllen Sie die Lücken [ ].

for ([     ] i=0; i<4; i++) {
     digitalWrite(13, HIGH);
     delay([     ]);
     digitalWrite(13, LOW);
     delay();
[     ]

2.) Blinkschleife

Schreiben Sie eine for-Schleife, die die interne LED 10 mal blinken lässt, dann 4 Sekunden dunkel ist. Achten Sie auf die Lesbarkeit des Codes durch Einrückungen. In der Arduino-IDE hilft die Tastenkombination Strg+T.

In diesem Rhythmus soll Ihre LED blinken:

3.) SOS

Morsen Sie SOS (drei mal kurz, drei mal lang, drei mal kurz) mit drei Schleifen.

In diesem Rhythmus soll Ihre LED blinken:

4.) Zeilenverkürzung

Lassen Sie die interne LED im sich wiederholenden Rhythmus 1s an, 1s aus, 2s an, 1s aus, 1s an, 1s aus, 2s an, 1s aus, 5s aus, blinken. Welchen Teil können Sie geschickt durch eine for-Schleife verkürzen?

In diesem Rhythmus soll Ihre LED blinken:

5.) Quadratzahlen

Schreiben Sie ein Programm, das mit Hilfe einer for-Schleife die Quadratzahlen von 1 bis 100 ausgibt. Schreiben Sie Ihren Code in den setup()-Abschnitt und lassen Sie loop() leer.

Programme lesen

Video einfügen: "Code lesen"

Übungsaufgaben

1.) Code verstehen

Gegeben ist der untenstehende Code. Nehmen Sie zum Verständnis des Codes an, dass am Arduino an den Pins 2, 3 und 4 jeweils eine LED angeschlossen ist.

int led=4;
void setup() {
     for (int x = 2; x <=4 ; x++) {
          pinMode(x, OUTPUT);
     }
}

void loop() {
  digital_write(led, LOW);
  led++;
  if (led > 4) {
    led = 2;
  }
  digital_write(led, HIGH);
  delay(1000);
}

a) In welcher Zeile/welchen Zeilen werden Variablen initialisiert?

b) Was macht der Code in setup()?

  1. Einen Reset des Arduino auslösen

  2. Die LED-Pins auf Ausgabe schalten

  3. Die LED-Pins auf Eingabe schalten

c) Was macht der Code in loop()?

  1. Die Leuchtdioden leuchten nacheinander in folgender Reihenfolge auf: 2, 3, 4, 2, 3, ...

  2. Die Leuchtdioden leuchten nacheinander in folgender Reihenfolge auf: 4, 3, 2, 4, 3, ...

  3. Die drei Leuchtdioden gehen gleichzeitig an, aus, an, aus, ...

Zusatz: LCD

Übungsaufgaben

1.) Hallo LCD!

Verbinden Sie den Arduino mit Ihrem LCD und testen Sie die Verbindung, indem Sie ein Beispielprogramm laufen lassen. Werden alle Zeichen korrekt angezeigt? Ändern Sie das Programm so ab, dass die Namen der Mitglieder Ihrer Hackathongruppe angezeigt werden.

2.) Lückentext

Das LCD wird über die I²C-_______ mit dem Arduino verbunden. Zur Vereinfachung der Programmierung des LCD verwendet man eine _______.

Fortgeschrittene Aufgabe

Bauen Sie ein Blinklicht, das ein Muster erzeugt wie unten angegeben. Bringen Sie hierzu z.B. 5 LEDs nebeneinander auf dem Breadboard an, vergessen Sie die Vorwiderstände nicht. Die LEDs sollen nun so angesteuert werden, dass für 200ms die LED ganz links leuchtet, die anderen LEDs sind aus. Danach wird die LED rechts daneben zugeschaltet usw. Wenn alle LEDs leuchten, wird im nächsten Schritt die LED ganz rechts ausgeschaltet, danach auch die links daneben usw. bis nur noch die LED ganz links eingeschaltet ist. Danach beginnt die Folge von neuem. Die folgende Tabelle zeigt die einzelnen Schritte des Musters.

1 bedeutet eingeschaltet, 0 bedeutet ausgeschaltet:

10000 11000 11100 11110 11111 11110 11100 11000 10000

Erweitern Sie nun den Aufbau so, dass passend zum Blinklicht ein Ton erzeugt wird, dessen Höhe mit der Anzahl der eingeschalteten LEDs ansteigt. Verwenden Sie zur Ausgabe des Tons den Lautsprecher, den Sie über einen Vorwiderstand von mindestens 100 Ohm an einen digitalen Ausgangspin anschließen. Der Arduino-Befehl zur Ausgabe eines Tons lautet: tone(pin,freq). Hierbei ist pin die Nummer des Pins, an dem der Lautsprecher angeschlossen ist, und freq die Frequenz in Hertz. Setzen Sie eine Frequenz von 200 Hertz, wenn genau eine LED eingeschaltet ist, und erhöhen Sie die Frequenz für jede weitere eingeschaltete LED um jeweils 200 Hertz.

Last updated