Für die Temperaturmessung mit einem DS18B20 Sensor und einem XIAO nRF52840 mit XIAO Expansions Board habe ich ChatGPT um Unterstützung beim Programmieren gebeten.
ChatGPT Prompt:
Erstelle ein Arduino Programm für einen DS18B20 an einem Seeedstudio XIAO nRF52840 und zeige die gemessene Temperatur auf einem OLED an.
ChatGPT Antwort:
Hier ist ein Arduino-Sketch, der die Temperatur von einem DS18B20-Sensor misst und auf einem OLED-Display mit dem Seeedstudio XIAO nRF52840 ausgibt. Dieser Code verwendet die Libraries OneWire und DallasTemperature für den Temperatursensor sowie Adafruit SSD1306 für das OLED-Display.
Voraussetzungen
- Installiere die Libraries:
- OneWire und DallasTemperature (über den Bibliotheks-Manager in der Arduino-IDE).
- Adafruit SSD1306 und Adafruit GFX (ebenfalls über den Bibliotheks-Manager).
- Schließe den DS18B20-Sensor und das OLED korrekt an das Seeedstudio XIAO nRF52840 an:
- DS18B20:
- Datenleitung an einen digitalen Pin (z. B. D2).
- Widerstand von 4,7 kOhm zwischen Datenleitung und VCC.
- OLED:
- Verbinde SDA und SCL mit den entsprechenden Pins auf dem Board.
- DS18B20:
Code
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Pin-Konfiguration
#define ONE_WIRE_BUS 2 // DS18B20 Datenleitung an Pin D2
#define SCREEN_WIDTH 128 // OLED Breite
#define SCREEN_HEIGHT 64 // OLED Höhe
#define OLED_RESET -1 // Kein Reset-Pin benötigt
#define OLED_I2C_ADDR 0x3C // I2C-Adresse des OLED-Displays
// Objekte für DS18B20 und OLED
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
// Serieller Monitor
Serial.begin(9600);
// OLED initialisieren
if (!display.begin(SSD1306_I2C_ADDRESS, OLED_I2C_ADDR)) {
Serial.println(F("OLED-Initialisierung fehlgeschlagen!"));
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Start DS18B20 Test"));
display.display();
// DS18B20 initialisieren
sensors.begin();
delay(1000);
}
void loop() {
// Temperatur messen
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
// Temperatur auf dem seriellen Monitor ausgeben
Serial.print(F("Temperatur: "));
Serial.print(temperatureC);
Serial.println(F(" °C"));
// OLED aktualisieren
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 0);
display.println(F("Temp:"));
display.setCursor(0, 20);
display.setTextSize(3);
display.print(temperatureC, 1);
display.print(F(" C"));
display.display();
// Kurze Pause
delay(1000);
}
Verkabelung
- DS18B20:
- VCC -> 3.3V (oder 5V)
- GND -> GND
- Daten -> D2 (ONE_WIRE_BUS)
- 4,7 kOhm Widerstand zwischen Daten und VCC
- OLED:
- SDA -> SDA-Pin (standardmäßig D6 beim XIAO nRF52840)
- SCL -> SCL-Pin (standardmäßig D7 beim XIAO nRF52840)
- VCC -> 3.3V
- GND -> GND
Hinweis
Falls der DS18B20 mehrere Sensoren unterstützt (z. B. durch Daisy-Chaining), kann man die individuelle Adresse jedes Sensors abfragen und verwenden. Der obige Code liest jedoch nur den ersten angeschlossenen Sensor aus.
Verwendete Hardware
Im Bild ist das XIAO Expansions Board mit aufgestecktem XIAO nRF52840 Controller zu sehen. Nach außen stehen eine I2C- und eine UART-Schnittstelle sowie eine digitale I/O (D0) zur Verfügung. Für den hier eingesetzten DS18B20 wird die digitale I/O verwendet. Die Erweiterungen über das I2C- und UART-Interface werden hier nicht betrachtet.

Angepasste Softwareanwendung
Der von ChatGPT vorgeschlagene Code bedarf einiger Anpassungen, die im folgenden Listing fett markiert sind.
Zum Anschluss des DS18B20 wird hier Pin D0 verwendet. Die serielle Schnittstelle wird auf 115200 Baud eingestellt, was allerdings nicht zwingend ist. Die Anweisung zur Initialisierung des OLED von ChatGPT ist nicht korrekt und muss entsprechend angepasst werden. Die Ausgabe auf dem OLED wird auch leicht modifiziert, was aber eine Geschmacksfrage und optional ist.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Pin-Konfiguration
#define ONE_WIRE_BUS 0 // DS18B20 Datenleitung an Pin D0
#define SCREEN_WIDTH 128 // OLED Breite
#define SCREEN_HEIGHT 64 // OLED Höhe
#define OLED_RESET -1 // Kein Reset-Pin benötigt
#define OLED_I2C_ADDR 0x3C // I2C-Adresse des OLED-Displays
// Objekte für DS18B20 und OLED
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup()
{
// Serieller Monitor
Serial.begin(115200);
// OLED initialisieren
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDR)) {
Serial.println(F("OLED-Initialisierung fehlgeschlagen!"));
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Start DS18B20 Test"));
display.display();
// DS18B20 initialisieren
sensors.begin();
delay(1000);
}
void loop()
{
// Temperatur messen
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
// Temperatur auf dem seriellen Monitor ausgeben
Serial.print(F("Temperatur: "));
Serial.print(temperatureC);
Serial.println(F(" °C"));
// OLED aktualisieren
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 0);
display.println(F("Temperatur"));
display.setCursor(0, 30);
display.setTextSize(3);
display.print(temperatureC, 1);
display.print(F(" C"));
display.display();
// Kurze Pause
delay(1000);
}
Anhand einer einfachen Aufgabenstellung wollte ich zeigen, wie ChatGPT bei der Programmierung helfen kann. Es sollte nicht erwartet werden, dass ein von ChatGPT vorgeschlagenes Programm fehlerfrei ist resp. kein Optimierungspotential aufweist.
Innerhalb kurzer Zeit steht allerdings ein Programmgerüst für das Debugging und die Optimierung zur Verfügung, wodurch die Zeit für die Programmierung deutlich reduziert werden kann.
Nutzen Sie KI zur Unterstützung bei der Programmierung? Ich bin an Ihren Erfahrungen interessiert.
2024-12-04/CK