diff --git a/grulait-solutions-fs2023-main-w03-exercise-dc-motor/w03-exercise-dc-motor/src/main.cpp b/grulait-solutions-fs2023-main-w03-exercise-dc-motor/w03-exercise-dc-motor/src/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f04749a69e19f1a3d0010f004c6b88d76cbf5aa1
--- /dev/null
+++ b/grulait-solutions-fs2023-main-w03-exercise-dc-motor/w03-exercise-dc-motor/src/main.cpp
@@ -0,0 +1,134 @@
+#include <Arduino.h>
+
+static int en1 = 9; // Enable Pin 1 des L293D
+static int in1 = 7; // Input Pin 1 des L293D
+static int in2 = 6; // Input pin 2 des L293D
+
+static int button = 4;
+static int potentiometer = A0;
+
+// 0.0 = DC-Motor steht, 5.0 = DC-Motor dreht mit voller Drehzahl 
+float sollSpeed = 0.0;      
+//true = Uhrzeigersinn, false = Gegenuhrzeigersinn 
+bool sollDirection = true; 
+
+// Diese Funktion sendet das Geschwindigkeitssignal an den L293D.
+// TODO: **OPTIONAL** 
+// Passe die Funktion setSpeed so an, dass die Geschwindigkeit 
+// des DC-Motors schrittweise erhöht, resp. verringert wird.
+void setSpeed(float speed)
+{
+  // Map the potentiometer(value between 0 and 5V) to speed from 0 to 255
+  int pwmOutput = (int)(speed * 255.0/5.0);
+  // Send PWM signal to L298N Enable pin
+  analogWrite(en1, pwmOutput);                             
+}
+
+// TODO: Erstelle die Funktion "setDirection".
+// Die Aufgabe dieser Funktion soll es sein, die Drehrichtung des 
+// DC-Motors der Ist-Drehrichtung (istDirection) anzupassen.
+// Dazu müssen mit digitalWrite() 
+// (https://www.arduino.cc/reference/de/language/functions/digital-io/digitalwrite/) 
+// die richtigen Werte auf die Pins in1 und in2 des H-Brücken-Chips L293D 
+// (https://www.ti.com/lit/ds/symlink/l293.pdf) geschrieben werden.
+// Input der Funktion: Ist-Drehrichtung als Boolean
+// Rückgabe der Funktion: nichts
+void setDirection(bool istDirection) {
+  if (istDirection) {
+    digitalWrite(in1, HIGH);
+    digitalWrite(in2, LOW);
+  } else {
+    digitalWrite(in1, LOW);
+    digitalWrite(in2, HIGH);
+  }
+}
+
+
+// TODO: Erstelle die Funktion "getIstSpeed".
+// Die Aufgabe dieser Funktion ist es, die am Potentiometer eingestellte 
+// Geschwindigkeit als Wert zwischen 0 und 5 zurückzugeben.
+// Dazu muss das analoge Signal des Potentiometer mit analogRead() 
+// (https://www.arduino.cc/reference/de/language/functions/analog-io/analogread/) 
+// eingelesen werden. Das analoge Signal des Potentiometer liegt im Bereich 
+// zwischen 0 und 1023. Für die Weiterverarbeitung des Signals ist es notwendig, 
+// dass die Funktion aber nur einen Bereich von 0.0 bis 5.0 zurückgibt. 
+// Wird vom Potentiometer also das analoge Signal 1023 ausgelesen, muss die 
+// Funktion den Wert 5.00 zurückgeben, bei 341 den Wert 1.67, usw.
+// Input der Funktion: nichts
+// Rückgabe der Funktion: Ist-Geschwindigkeit im Bereich von 0.00 bis 5.00 als 
+// Float auf zwei Nachkommastellen genasu.
+
+// Diese Funktion gibt die Ist-Drehrichtung zurück. 
+// true = Uhrzeigersinn, false = Gegenuhrzeigersinn
+float getIstSpeed() {
+  int analogValue = analogRead(potentiometerPin);
+  float voltage = analogValue * (5.0 / 1023.0);
+  float speed = voltage;
+  speed = speed < 0.0 ? 0.0 : speed;
+  speed = speed > 5.0 ? 5.0 : speed;
+  return speed;
+}
+
+bool getIstDirection()
+{
+  return digitalRead(button);
+}
+
+// Diese Funktion erstellt eine neue Soll-Geschwindigkeit und Soll-Drehrichtung 
+// und gibt diese über den Serial Monitor aus.
+void setNewTask()
+{
+  sollSpeed = 5 / 12.0 * (random(0, 1200) / 100);
+  sollDirection = random(100) > 50;
+
+  Serial.print("Soll-Geschwindigkeit: ");
+  Serial.println(sollSpeed);
+  Serial.print("Soll-Drehrichtung: ");
+  if (sollDirection)
+  {
+    Serial.println("Uhrzeigersinn");
+  }
+  else
+  {
+    Serial.println("Gegenuhrzeigersinn");
+  }
+}
+
+// Diese Funktion rundet die mitgegebene Floating-Zahl auf eine Nachkommastelle 
+// und gibt diese ebenfalls als Float zurück.
+float roundFloat(float floatingNumber)
+{
+  return (long)(floatingNumber * 10L) / 10.0;
+}
+
+// Diese Funktion wird vom Arduino beim Start als erstes ausgeführt.
+void setup()
+{
+  Serial.begin(9600);
+  pinMode(en1, OUTPUT);
+  pinMode(in1, OUTPUT);
+  pinMode(in2, OUTPUT);
+  pinMode(button, INPUT);
+  pinMode(potentiometer, INPUT);
+  setNewTask();
+}
+
+// Nach der setup()-Funktion ruft das Arduino die loop()-Funktion auf. 
+// Diese Funktion ist eine Endlosschleife, die nach jedem Durchlauf 
+// erneut aufgerufen wird.
+void loop()
+{
+
+  // TODO: Auslesen der Ist-Geschwindigkeit und Ist-Richtung.
+  // Die erhaltene Werte sollen dann an setSpeed und setDirection weitergegeben werden.
+
+  // TODO: Überprüfen ob die Soll-Bedingungen mit den Ist-Bedingungen übereinstimmen.
+  // Bei jedem Durchlauf der Loop-Funktion soll überprüft werden ob die aktuellen 
+  // Ist-Werten den geforderten Soll-Werten entsprechen. Um bei der Geschwindigkeit 
+  // kleine Abweichungen zu erlauben, können die Geschwindigkeits-Werte vor dem 
+  // Vergleich mit der Funktion roundFloat() einzel gerundet werden.
+  // Stimmen die Drehrichtungen sowie die Geschwindigkeiten überein, soll dies mittels 
+  // mySerial.println() 
+  // (https://www.arduino.cc/reference/de/language/functions/communication/serial/println/)
+  // über den Serial Monitor ausgegeben werden und einen neuen Task erstellt werden.
+}