ChatGPT – Mit KI zum Programmiererfolg - AZ-Delivery

Der folgende Beitrag wurde uns von unserem Gastautoren Niklas Heinzel zur Verfügung gestellt:

ChatGPT ist aktuell in Allermunde. Doch was ist ChatGPT eigentlich und wofür ist es gut? In diesem Artikel werden wir daher klären, inwiefern ChatGPT die proklamierte KI-Revolution sein könnte oder ob es nicht mehr als ein Alexa auf Steroiden ist.

Was ist ChatGPT?

ChatGPT ist ein leistungsstarker Sprachgenerator, der von OpenAI entwickelt wurde, einem von Microsoft geförderten Startup. Es basiert auf einem Transformer-Modell, das mit großen Mengen an Textdaten trainiert wurde. Dies ermöglicht es ihm, menschenähnliche Antworten auf Fragen und Anforderungen zu generieren.

Eines der wichtigsten Anwendungsgebiete von ChatGPT, ist die Erstellung von natürlicher Sprachverarbeitung (Natural Language Processing, NLP), für Chatbots und virtuelle Assistenten. Es kann auch verwendet werden, um automatisch generierte Texte, wie zum Beispiel Blog-Einträge oder Nachrichtenartikel, zu erstellen.

Ein weiteres interessantes Anwendungsgebiet ist die Textzusammenfassung, da ChatGPT einen Text lesen und eine Zusammenfassung erstellen, als auch Fragen beantworten kann und sogar eine Unterhaltung führt.

Gerade in unserer Maker-Scene ist ChatGPT möglicherweise eine große Hilfe, da mit dessen Hilfe sich ganz einfach Programmier-Codes erstellen und transformieren lassen. Um die Möglichkeiten der KI auszutesten, werden wir uns nachfolgend damit beschäftigen, inwiefern ChatGPT für DIY-Projekte o.ä. wertvoll sein kann.

Wie funktioniert ChatGPT?

ChatGPT funktioniert durch die Verwendung von neuronalen Netzen, insbesondere dem Transformer-Modell. Das Transformer-Modell besteht aus mehreren Schichten von Neuronen (folgt dem Vorbild neuronaler Netze im menschlichen Gehirn), die miteinander verbunden sind und so in der Lage sind, große Mengen an Textdaten zu lernen.

Das Modell wird durch das Eingeben einer Eingabeaufforderung und einer vorherigen Frage trainiert. Nach der Analyse des Kontexts generiert es eine Antwort basierend auf dem, was es gelernt hat.

Eine wichtige Komponente von ChatGPT ist die Verwendung von sogenannten "Attention-Mechanismen". Diese ermöglichen es dem Modell, bestimmte Teile der Eingabe zu berücksichtigen und zu ignorieren, um die Antwort zu generieren.

ChatGPT verwendet auch mehrere Schichten von Neuronen, um die Eingabe zu verarbeiten. Jede Schicht wird verwendet, um verschiedene Aspekte der Eingabe zu analysieren, wie z.B. die semantische Bedeutung der Wörter, die grammatischen Strukturen und die Zusammenhänge zwischen Wörtern.

Nach dem Training wird das Modell in der Lage sein, eine Antwort auf eine Eingabeaufforderung zu generieren, indem es den Kontext analysiert und die am besten passende Antwort, basierend auf dem gelernten Muster auswählt.

ChatGPT-Abwägung und Disclaimer

Eine der großen Stärken von ChatGPT ist seine Fähigkeit, auf vorherige Eingaben zu reagieren und eine Unterhaltung zu führen, was es von anderen generativen Modellen unterscheidet. Es kann auch verwendet werden, um Schreibfehler zu korrigieren und fehlende Informationen in einem Text hinzuzufügen.

Obwohl ChatGPT beeindruckende Leistungen erbringt, ist es wichtig zu beachten, dass es immer noch Fehler machen kann und dass die Qualität seiner Antworten von der Qualität der trainierenden Daten abhängt. Es kann auch Probleme mit der Fairness und der Ethik von automatisch generierten Texten geben, insbesondere wenn sie für gefälschte Nachrichten oder Propaganda verwendet werden.

Umsetzung eines konkreten Projektes mit ChatGPT

Im Folgenden werden wir anhand einiger Projekte (umsetzbar mit jedem Arduino-fähigem Mikrocontroller und der entsprechenden Peripherie), welche nach der Komplexität aufsteigend sortiert sind, uns den Fähigkeiten ChatGPT’s nähern.

Starten wir zunächst erstmal mit einem einfachen Blink-Sketch und dem Auslesen eines SHT30 für den ESP8266:

„Erstelle einen Code für den ESP8266, in dem die interne LED rhythmisch blinkt und der SHT30 ausgelesen wird. Die Temperatur- und Luftfeuchtigkeitswerte sollen auf dem seriellen Monitor ausgegeben werden.“

Ausgabe von ChatGPT (Programmcode):

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SHT31.h>

#define LED 2

Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(115200);

  if (!sht31.begin(0x44)) {
    Serial.println("Couldn't find SHT31");
    while (1);
  }
}

void loop() {
  float temperature = sht31.readTemperature();
  float humidity = sht31.readHumidity();

  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" *C");

  Serial.print("Humidity: ");
  Serial.print(humidity);
  Serial.println(" %");

  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(LED, LOW);
  delay(500);
}

Die von ChatGPT ausgegebene Lösung besteht den Compiler-Test erfolgreich, ist syntaktisch einwandfrei und ist gut leserlich. Dazu kommt, dass der Code funktioniert und den Anforderungen entspricht. Die Messdaten werden wie gewollt auf dem seriellen Monitor ausgegeben und die LED blinkt rhythmisch (siehe Screenshot)

Gehen wir nochmal mit einem Änderungswunsch zu ChatGPT und schauen was die KI daraus machen kann:

„Füge dem Code das Auslesen eines LDRs hinzu, welcher über den integrierten ADC des ESP8266 ausgelesen wird.“

Ausgabe von ChatGPT (Programmcode):

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SHT31.h>

#define LED 2
#define LDR_PIN A0

Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(115200);

  if (!sht31.begin(0x44)) {
    Serial.println("Couldn't find SHT31");
    while (1);
  }
}

void loop() {
  float temperature = sht31.readTemperature();
  float humidity = sht31.readHumidity();

  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" *C");

  Serial.print("Humidity: ");
  Serial.print(humidity);
  Serial.println(" %");

  int ldrValue = analogRead(LDR_PIN);
  Serial.print("LDR Value: ");
  Serial.println(ldrValue);

  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(LED, LOW);
  delay(500);
}

In der von ChatGPT präsentierten Lösung wurde der vorhandene Code, wie gewünscht um das Auslesen eines LDRs (Light Dependent Resistor) erweitert, welches auf dem seriellen Monitor ebenfalls erfolgreich ausgegeben werden konnte.

Nachdem relativ simple Codes möglich waren, bzw. die Editierung derer, sollten wir ChatGPT mit einer höheren Anzahl an anzusteuernden Elementen konfrontieren, die von ihrer Komplexität nicht in jedem Tutorial per Suchmaschine zu finden sind.

„Erstelle einen ESP8266 Code, in dem ein SHT30 Sensor und ein LDR ausgelesen werden. Diese Werte sollen anschließend auf einem 0.91“ großen OLED ausgegeben werden, sowie auf dem seriellen Monitor. Die Befehle sollen dabei in einzelnen Funktionen ausgegliedert werden und im void loop aufgerufen werden.“

Auf diesem Komplexitätslevel schleichen sich langsam kleinere Fehler ein, die auch mit geringen Programmierkenntnissen in C++ behoben werden könnten:

Hierbei wurde von ChatGPT die Adafruit_SHT30.h Bibliothek verwendet, eine bis 2021 existierende Bibliothek, die fortan unter dem Namen Adafruit_SHT31.h geführt wird. Der Wechsel des Namens wurde aufgrund der Erweiterung des Produktportfolios des Herstellers Sensirion vorgenommen.

Die Bibliothek bietet auch unter dem neueren SHT31 eine Abwärtskompatibilität, zeigt aber, welchen entscheidenden Nachteil ChatGPT hat: Die (zum aktuellen Zeitpunkt 02/23) bestehende Limitierung auf Daten vor 2021, ermöglicht es nicht, neuere Erkenntnisse in die KI einfließen zu lassen.

Der zweite Fehler im Programmcode besteht in der Deklaration der Parameter, die für Maße des Displays zuständig sind. Diese müssten bei einem 0.91“ großen OLED (128, 32) lauten.

Trotz dieser kleinen Mankos ist die Leistung der KI beachtlich, da die meiste Zeit des Programmierens für viele darin besteht, vorhandene Code-Schnipsel zu einem Gesamtsystem zu integrieren und Compiler-konform (entsprechend der benötigten Syntax) aufzubereiten. Es sind erhebliche Zeitersparnisse möglich, wenn es nur noch darum geht, den ausgegebenen Code auf Richtigkeit zu überprüfen.

Mit Hilfe der folgenden Eingaben habe ich den Code durch ChatGPT noch etwas verfeinert:

  1. „Erstelle den Code anstatt der Adafruit SHT30 libary mit der Adafruit SHT31 libary.“
  2. „Adaptiere den Code für ein 0.91" großes OLED Display.“
  • „Am Programmende sollen 2 Sekunden vergehen, bis die nächste Messung durchgeführt werden kann. Alle angezeigten Elemente auf dem Display müssen kleiner sein, da diese nicht gänzlich sichtbar sind.“
  1. „Bevor das Programm startet, soll ein Splashscreen auf dem OLED-Display zu sehen sein. Füge dies dem Code hinzu.“

Damit erhalten wir das folgende Ergebnis, welches sich sehen lässt, alleine auch aufgrund der Einhaltung von „syntaktischen Designregeln“, die das Lesen des Codes deutlich erleichtern (Programmcode):

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SHT31.h>
#include <Adafruit_SSD1306.h>

Adafruit_SHT31 sht31 = Adafruit_SHT31();
Adafruit_SSD1306 display(128, 32, &Wire);

void setup() {
  Serial.begin(115200);
  if (! sht31.begin(0x44)) {
    Serial.println("Couldn't find SHT31");
    while (1);
  }

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();
  
  showSplashScreen();
}

void loop() {
  float temperature, humidity;
  int lightLevel;

  getTemperatureHumidity(&temperature, &humidity);
  lightLevel = getLightLevel();

  displayValues(temperature, humidity, lightLevel);
  printValues(temperature, humidity, lightLevel);

  delay(2000);
}

void getTemperatureHumidity(float *temperature, float *humidity) {
  *temperature = sht31.readTemperature();
  *humidity = sht31.readHumidity();
}

int getLightLevel() {
  return analogRead(A0);
}

void displayValues(float temperature, float humidity, int lightLevel) {
  display.clearDisplay();
  display.setTextSize(0.5);
  display.setTextColor(WHITE);

  display.setCursor(0, 0);
  display.println("Temp:");
  display.println(temperature);

  display.setCursor(0, 15);
  display.println("Humidity:");
  display.println(humidity);

  display.setCursor(0, 30);
  display.println("Light Level:");
  display.println(lightLevel);

  display.display();
}

void printValues(float temperature, float humidity, int lightLevel) {
  Serial.println("Temperature: " + String(temperature));
  Serial.println("Humidity: " + String(humidity));
  Serial.println("Light Level: " + String(lightLevel));
}

void showSplashScreen() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);

  display.setCursor(25, 20);
  display.println("SHT31 & LDR");

  display.display();
  delay(2000);
}

Auch das nachträgliche Hinzufügen eines Splashscreens, welcher 2 Sekunden vor dem Start des Programms „SHT31 & LDR“ anzeigt, sind durchaus nennenswerte und positiv hervorzuhebende Funktionen ChatGPT’s. Hierbei ist es aber wichtig, das Hinzufügen auch als solches im HMI (Human Machine Interface) von ChatGPT zu erwähnen, da sonst nur das Angeforderte als Solches ausgegeben wird und die Integrationsleistung ausbleibt.

Eine sehr häufig vorkommende Möglichkeit der Erweiterung des Projektes ist die Verbindung/ der Aufbau eines Webservers auf dem die gesammelten Daten zusätzlich visualisiert werden könnten. Eine einfache Version dessen soll daher mit ChatGPT implementiert werden, um Anreize für Sie, die Leserinnen und Leser zu schaffen.

„Erweitere den Code insofern, als dass die Daten auf einem eigenen Webserver angezeigt werden können.“

Nach einiger Zeit stoppte ChatGPT bei der Ausgabe des Codes, da anscheinend eine Art maximale Länge einer auszugebenen Nachricht erreicht wurde. Hier reicht es einfach mit „Führe den Code weiter.“ zu antworten und schon geht es weiter.

Neben der gleichbleibenden Fehlerquelle der falschen Skalierung des Displays, ist bei der x-ten Iteration auch automatisch die richtige SHT31 Library hinzugefügt worden. Eine erneute Erstellung der Antwort kann auch mithilfe des Buttons „regenerate response“ erreicht werden.

Das Ergebnis der Anfrage kann sich wirklich sehen lassen und schließt unser kleines Projekt mit einer passenden Website ab:

Der finale Code sieht wie folgt aus (Programmcode):

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SHT31.h>
#include <Adafruit_SSD1306.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

Adafruit_SHT31 sht31 = Adafruit_SHT31();
Adafruit_SSD1306 display(128, 32, &Wire);

const char* ssid = "SSID";
const char* password = "PASSWORD";

ESP8266WebServer server(80);

float temperature, humidity;
int lightLevel;

void setup() {
  Serial.begin(115200);
  if (! sht31.begin(0x44)) {
    Serial.println("Couldn't find SHT31");
    while (1);
  }

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();
  
  showSplashScreen();

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  server.on("/", handleRoot);
  server.begin();
  Serial.println("Web server started");

  Serial.println();
  Serial.println("HTTP server started");
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
}

void loop() {
  getTemperatureHumidity(&temperature, &humidity);
  lightLevel = getLightLevel();

  displayValues(temperature, humidity, lightLevel);
  printValues(temperature, humidity, lightLevel);

  server.handleClient();

  delay(2000);
}

void getTemperatureHumidity(float *temperature, float *humidity) {
  *temperature = sht31.readTemperature();
  *humidity = sht31.readHumidity();
}

int getLightLevel() {
  return analogRead(A0);
}

void displayValues(float temperature, float humidity, int lightLevel) {
  display.clearDisplay();

  
  display.setTextSize(0.25);
  display.setTextColor(WHITE);

  display.setCursor(0, 0);
  display.print("Temperature:");
  display.print(temperature);
  display.cp437(true);
  display.write(167);
  display.println("C");

  display.setCursor(0, 12);
  display.print("Humidity:");
  display.print(humidity);
  display.println(" %");

  display.setCursor(0, 23);
  display.print("Light Level:");
  display.println(lightLevel);

  display.display();
}

void printValues(float temperature, float humidity, int lightLevel) {
  Serial.println("Temperature: " + String(temperature));
  Serial.println("Humidity: " + String(humidity));
  Serial.println("Light Level: " + String(lightLevel));
}

void showSplashScreen() {
  display.clearDisplay();
    display.setTextSize(2);
  display.setCursor(20, 20);
  display.println("SHT31 & LDR");
  display.setTextSize(1);
  display.setCursor(20, 40);
  display.println("Data Display");
  display.display();
  delay(2000);
}

void handleRoot() {
  String html = "<html><body>";
  html += "<h1>Temperature: " + String(temperature) + " &#8451;</h1>";
  html += "<h1>Humidity: " + String(humidity) + " %</h1>";
  html += "<h1>Light Level: " + String(lightLevel) + "</h1>";
  html += "</body></html>";
  server.send(200, "text/html", html);
}

Weitere Funktionen

Mit ChatGPT sind fast unendlich viele Dinge möglich. Die hier gezeigten Anwendungen sind nur ein sehr kleiner Ausschnitt dessen, was alles mithilfe von künstlicher Intelligenz möglich ist.

In unserem Kontext sind z.B. aber auch Nachfragen zum erstellten Code möglich, wie der Frage „Unter welcher Adresse kann ich den Webserver aufrufen?“. Hier wird kontextgenau eine Lösung geschildert und die Funktion beschrieben.

Fazit – Was kann ChatGPT und wie hilft es uns?

OpenAI's ChatGPT ist ein stark trainiertes Sprachmodell, dass in der Lage ist, menschenähnliche Texte/Codes/Tabellen etc. zu generieren und Fragen zu beantworten. Es kann eine Vielzahl von Themen abdecken, darunter Programmierung, Technologie, Wissenschaft, Kunst und vieles mehr.

Allerdings kann ChatGPT nicht alles, was ein menschlicher Programmierer kann und es ist auch an seine Kenntnisse aus den Datensätzen gebunden. Es ist nicht in der Lage, kreativ zu denken und neue Konzepte auf eigene Faust zu entwickeln. Es kann auch Fehler machen und nicht alle Anfragen exakt beantworten, da es nur auf den Daten trainiert wurde, die es während seiner Entwicklung gesehen hat.

Trotzdem kann ChatGPT ein nützliches Werkzeug für Elektronik-Maker sein, indem es schnell Code-Snippets generiert und Anleitungen bereitstellt, um bestimmte Projekte umzusetzen. Es kann auch Zeit und Ressourcen sparen, indem es schnell Antworten auf Fragen bereitstellt, ohne dass man stundenlang im Internet suchen muss.

Insgesamt kann ChatGPT eine große Unterstützung für Elektronik-Maker sein, solange sie sich darüber im Klaren sind, dass es nicht perfekt ist und dass die erzeugten Resultate immer noch sorgfältig überprüft werden müssen, bevor Sie sie in ihren Projekten verwenden.

Ich hoffe, dass ich mit diesem Artikel auf die Chancen & Risiken von ChatGPT oder anderen noch kommenden KI-basierten Lösungen hinweisen konnte und daher zu einer abwägenden Debatte im Zuge der vielfältigen Möglichkeiten dieser Lösungen beitragen konnte. Technologie muss nicht immer die „All-in-One-Lösung“ sein, sie wird auch nicht von einem Tag auf den anderen Menschen ersetzen, vielmehr kann sie uns zunehmend unterstützen und den Menschen als kreativen Geist in den Mittelpunkt setzen.

Niklas Heinzel

Esp-8266Projekte für anfängerSensoren

6 Kommentare

Andreas Wolter

Andreas Wolter

@Kai: ChatGPT kann online bei openai.com entweder als kostenlose oder kostenpflichtige Variante genutzt werden.
Ich ergänze den Link im Artikel. Danke für den Hinweis.

Grüße,
Andreas Wolter
AZ-Delivery Blog

Kai

Kai

Toller Artikel!!!
Ich würde dies gerne selbst ausprobieren.
Wo finde ich den von Ihnen verwendeten ChatGPT?

Hannes Ronzmeier

Hannes Ronzmeier

Hallo.
Also Programmiererfolg würde ich das jetzt nicht unbedingt nennen. Meiner Meinung nach, sollte man ChatGPT nicht als Google Ersatz verwenden, denn genau das passiert hier- Codeabschnitte werden meist von Github und Co hergneommen und aggregiert. ChatGPT kann nützlich sein um Dummy Daten zu generieren oder konkrete Fragen “Wie schließe ich I2C an” doch für konkrete Aufgaben ist derzeit noch zu instabil.
Viele Grüße

Andreas Wolter

Andreas Wolter

@Martin: ich gebe Ihnen Recht. Für jemanden, der mit dem Programmieren gerade erst beginnt, kann ChatGPT etwas hinderlich sein und die Lernkurve stark abflachen lassen. Ich habe es selbst auch ausprobiert. Zuerst einfache kleine Arduino Sketches. Theoretisch werden dann nur die Beispielsketches dargestellt. Am Beispiel Blink habe ich das gesehen. Es ist 1:1 der Code aus dem Beispiel. Ich nutze ein optimiertes Blink mit einer boolschen Variable, statt des redundanten Codes. Ich habe ChatGPT gebeten, es zu optimieren. Es hat nicht direkt gewusst wie. Ich habe dann nur den Hinweis mit dieser Variablen gegeben und schon kam der Quellcode raus, den ich auch nutze. Das könnte ein Anfänger noch nicht unbedingt wissen. Wenn man ChatGPT die richtigen Fragen stellt, kann das gehen. Es fehlt aber jemand, der auf die Fehler achtet, die daraus entstehen.

Als zweiten Test habe ich mit Visual Studio ein Windows Tool mit grafischer Nutzeroberfläche damit programmieren wollen. Ich habe das gewählt, da ich das noch nie vorher gemacht hatte. Es hat sehr viele Anläufe gebraucht und am Ende musste ich es eigentlich selbst umsetzen. Beim Einstieg hat es mir geholfen. Später bei der Erweiterung des Programms hat es ständig den Kontext verloren. Es sollte Teile verändern. Der Code passte dann aber nicht mehr zum vorherigen gesamten Quelltext. Obwohl ChatGPT Kontext beachten sollte. Am Ende habe ich es fertiggestellt. ChatGPT habe ich dann nur noch verwendet, wenn ich Hinweise brauchte. Ich kenne die .NET Bibliotheken nicht. Dabei hat es mir geholfen.

Mein eigenes Fazit ist: wenn man ChatGPT alles machen lassen würde, würde man selbst nicht mehr überlegen, wie man sein Problem löst und wenn das Programm zu komplex wird, blickt man nicht mehr durch. Ähnlich wie in der Uni bei den Gruppenaufgaben. Wenn ein anderes Gruppenmitglied den Code geschrieben hat, kannte man ihn nicht, musste ihn trotzdem erklären können. Daran hat es mich erinnert.

Grüße,
Andreas Wolter
AZ-Delivery Blog

Frank

Frank

Hallo & ein sehr großes Lob für diesen Artikel! Er zeigt, für was man wie (Chat-)KI verwennden kann, ohne einfach andere Artikel und “KI-Gewäsch” abzuschreiben … bitte gerne mehr von solcher KI, Danke im Voraus! !!

Martin

Martin

Ich würde trotzdem dazu raten, sich mit dem Programmieren von Microcode auseinanderzusetzen und nicht einfach ChatGPT alles schreiben zu lassen. Der ausgegeben Code kann teilweise fatale Fehler aufweisen und muss immer noch einen Reviewprozess durchlaufen. Das Lernen von Konzepten wie CI/CD, oder auch Cleancode sollte nicht vernachlässigt werden. Für Einsteiger in die Programmierung sehe ich den Gebrauch von ChatGPT als kritisch an, weil hierdurch der Lernprozess eingeschränkt werden kann. Für Entwickler mit mehr Erfahrung jedoch sehe ich ChatGPT ebenfalls als ein sehr nützliches Hilfsmittel.

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery