Nicht viele Menschen sind in der Lage, nach Belieben zu programmieren. Das gilt vor allem, wenn es nicht zu ihrem Beruf gehört. Es ist jedoch nicht mehr notwendig, überhaupt programmieren zu können.
Ich gehöre auch zu den Menschen, die keinen Programmiercode auf einem völlig leeren Blatt Papier schreiben können. Bisher konnte ich nichts dagegen tun, aber mit ChatGPT kann ich jetzt Fehler und Fragen in meinem Code untersuchen.
ChatGPT, das seit 2022 für jedermann zugänglich ist, hat sich seit seiner Einführung erheblich weiterentwickelt. Die Möglichkeit, Fragen zu stellen, ist wichtig, da sie in Form von Fragen und Antworten genutzt wird. Es gibt immer noch Fragen, die überprüft werden müssen, z. B. ob die gegebenen Antworten korrekt sind und ob es zu Rechtsverletzungen kommt.
Dieses Mal habe ich versucht, ein Modul, das die Temperatur mit i2c verwalten kann, an einen industriellen Raspberry Pi „PL-R4“ anzuschließen, um es einfach zu programmieren. Nein, ich habe versucht, es mit ChatGPT zu verbinden.
Im Folgenden wird Schritt für Schritt beschrieben, wie ein gewünschtes Programm aus einem völlig leeren Blatt Papier erstellt werden kann.
Python-Programme
Das Python-Programm, das wir dieses Mal verwendet haben, ist mit dem Raspberry Pi kompatibel und kann sofort verwendet werden, ohne dass Sie eine vorherige Umgebung benötigen.
Im Vergleich zu anderen Programmen ist Python eines der am leichtesten zu verstehenden. Ich empfehle Python als gutes erstes Lernwerkzeug.
Wir haben uns einen industriellen Raspberry Pi mit Raspberry Pi Compute Module 4 ausgeliehen.

Die Umwelt dieser Zeit
- PL-R4 BASIC IP20 (OPT-Anschluss i2c-Spezifikation)
- Raspberry Pi OS 32bit Bullseye
- Python-Programme
- Temperatur-/Luftfeuchtigkeitssensor (SHT30)
Lassen Sie mich ein wenig vorausschicken.
Ich kenne einige grundlegende Programmierkenntnisse. Das heißt nicht, dass ich überhaupt nichts weiß.
Trotzdem kann ich diesen Code nicht von Grund auf neu schreiben.
Wenn Sie über irgendwelche Kenntnisse verfügen, wäre es hilfreich, den von Ihnen beantworteten Code zu ändern.
Selbst wenn Sie nur wenig über den Inhalt des Codes wissen, können Sie natürlich Fragen stellen, um die merkwürdigen Teile (Fehler usw.) zu identifizieren, und man wird Ihnen sagen können, wie Sie den Code verbessern und was Sie überprüfen sollten.
Wenn er nicht zu kompliziert ist, funktioniert der Code recht gut, indem er Fehler in den Ausführungsergebnissen ausmerzt.
Wir haben es durch Versuch und Irrtum versucht.
Das Endziel dieses Projekts
Wir entscheiden grob, was wir mit dem Endprodukt erreichen wollen, denn wir können mit der Programmierung machen, was wir wollen.
Da wir einen Temperatur-/Luftfeuchtigkeitssensor verwenden, möchten wir, dass er Temperatur und Luftfeuchtigkeit in Echtzeit erfasst und diese Werte speichern kann.
Außerdem sollte die Anzeige in einem Webbrowser, vorzugsweise in einem Diagramm, dargestellt werden können.
- Erfasste Werte speichern
- Anzeige in der Webansicht
- Graph Display
Das Ziel ist es, ungefähr diese drei Funktionen zu implementieren.
Erste Frage.
Lassen Sie uns also mit der ersten Frage beginnen. Ich habe die folgende Frage gestellt.
„Bitte schreiben Sie ein Python-Programm, um den SHT30 mit dem Raspberry Pi zu verbinden und die Temperatur zu messen.“
Was denken Sie dann? Die erforderlichen Elemente, das Verdrahtungsbeispiel und das Python-Programm wurden angezeigt.

Je nach Art der Frage ist die Antwort eher sehr allgemein gehalten. Bei dieser Frage habe ich den Eindruck, dass es keine größeren Fehler gibt.
Was mich mehr überrascht hat als die Codeausgabe, war, dass sogar diese notwendigen Elemente und Verdrahtungsbeispiele angezeigt wurden.
Ich erinnere mich, dass ChatGPT bei seinem ersten Erscheinen nicht so freundlich war.
Dies ist wahrscheinlich das Ergebnis des Lernens als KI, wie z.B. die Inhalte vieler Websites.
Vielleicht werden sie mit genau den gleichen Informationen veröffentlicht.
Ich bin überrascht, dass es einfacher zu lesen ist als bei seinem ersten Erscheinen, da es Symbole, Listen und Tabellen verwendet.
I2C freigeben
In der ChatGPT-Antwort heißt es außerdem zu Beginn, dass I2C aktiviert sein muss.
Da der SHT30 über I2C-Kommunikation angeschlossen ist, muss I2C zunächst aktiviert werden.
um zu prüfen, ob er aktiviert ist oder nicht.
raspi-config nonint get_i2c
1
Wenn der Rückgabewert 0 ist, ist er gültig, und wenn er 1 ist, bleibt er ungültig. Anfänglich ist er deaktiviert (1).
Aktivieren Sie I2C und starten Sie neu, indem Sie dem Menü raspi-config folgen.
sudo raspi-config
Oder aktivieren Sie und starten Sie neu mit dem folgenden Befehl
sudo raspi-config nonint do_i2c 0
Sobald das SHT30 physisch mit dem Raspberry Pi verbunden ist, überprüfen Sie, ob es richtig erkannt wird.
Verwenden Sie den Befehl ls, um den Port des Geräts zu untersuchen.
ls /dev*i2c*
/dev/i2c-0 /dev/i2c-1
Prüfen Sie dies mit dem Befehl i2cdetect.
sudo i2cdetect -y 0(今回は0)
*Auf diesem Testrechner ist /dev*i2c*mit 0 angegeben, weil es zwei s gibt, /dev/i2c-0 und /dev/i2c-1. Normalerweise ist es 1.
Wie Sie sehen können, werden die Adressen 44, 60 und 68 (UU) angezeigt.
i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: 60 -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Standardmäßig (Standard) lautet die I2C-Adresse 0x44, also ist es diesmal Standard. Die Adresse wurde im Programmcode verwendet, wenn sie also anders ist, müssen Sie den entsprechenden Teil im späteren Code ändern.
Ursprünglich wäre es in Ordnung, wenn nur Adresse 44 angezeigt würde, aber es wird auch etwas an den Adressen 60 und 68 angezeigt.
Sie können dies auch bei ChatGPT nachfragen und man wird es Ihnen sagen.
Es handelt sich um ein spezielles Testgerät, so dass Sie es ignorieren können. 60 wird auch von einem anderen Gerät verwendet, und die UU-Anzeige zeigt UU an, wenn es bereits verwendet oder reserviert ist.
Jedenfalls habe ich herausgefunden, dass die I2C-Adresse 44 war und er erkannt wurde.
Python-Programmcode aus der ersten Frage
Der Python-Programmcode, der von ChatGPT in der ersten Frage generiert wurde, ergab die folgende Ausgabe
import time
from smbus2 import SMBus
# I2C address of SHT30 (0x44 or 0x45)
SHT30_ADDR = 0x44
# Command for high repeatability measurement, no clock stretching
MEASUREMENT_CMD = [0x2C, 0x06]
def read_sht30(bus):
# Send measurement command
bus.write_i2c_block_data(SHT30_ADDR, MEASUREMENT_CMD[0], [MEASUREMENT_CMD[1]])
time.sleep(0.5) # Wait for measurement
# Read 6 bytes of data (temperature 2 + CRC1, humidity 2 + CRC1)
data = bus.read_i2c_block_data(SHT30_ADDR, 0x00, 6)
# Calculate temperature
temp_raw = data[0] << 8 | data[1]
temperature = -45 + (175 * temp_raw / 65535.0)
# Calculate humidity (as a bonus)
humid_raw = data[3] << 8 | data[4]
humidity = 100 * humid_raw / 65535.0
return temperature, humidity
if __name__ == "__main__":
with SMBus(1) as bus:
while True:
temperature, humidity = read_sht30(bus)
print(f"Temperature: {temperature:.2f}°C, Humidity: {humidity:.2f}%")
time.sleep(2)
Ich habe in gewissem Umfang mit Python gearbeitet, um die Raspberry Pi-Website zu betreiben. Als Bastler habe ich ein grundlegendes Verständnis der alten Grundlagen, daher bin ich nicht amüsiert, wenn ich mir den Code ansehe. Wenn Sie neu in Python sind, ist es normal, dass Sie nicht verstehen, was es bedeutet.
Ohne es zu wissen, lassen wir es trotzdem einmal laufen.
Ich lasse es so laufen, wie es ist.
Ich habe den Code als sensor.pyDatei gespeichert und ihn über den Befehl ausgeführt.
Es ist plötzlich ein Fehler!
sudo python3 sensor.py
Traceback (most recent call last):
File "/home/pi/test/sensor.py", line 2, in <module>
from smbus2 import SMBus
Anscheinend war der Fehler, dass das Modul smbus2 fehlte und nicht importiert werden konnte.
Oh, ich vergaß. Ich hatte es noch nicht installiert.
Es ist smbus2, das in den Voraussetzungen erwähnt wurde.
Installieren Sie smbus2-0.5.0 mit pip.
sudo pip3 install smbus2
Ich werde es noch einmal ausführen.
Hoppla, kein E/A-Fehler mehr.
sudo python3 sensor.py
Traceback (most recent call last):
File "/home/pi/test/sensor.py", line 31, in <module>
temperature, humidity = read_sht30(bus)
File "/home/pi/test/sensor.py", line 12, in read_sht30
bus.write_i2c_block_data(SHT30_ADDR, MEASUREMENT_CMD[0], [MEASUREMENT_CMD[1]])
File "/usr/local/lib/python3.9/dist-packages/smbus2/smbus2.py", line 645, in write_i2c_block_data
ioctl(self.fd, I2C_SMBUS, msg)
OSError: [Errno 121] Remote I/O error
Ich bin plötzlich darüber gestolpert. Was ist los?
Ich werde ChatGPT erneut bitten, das Problem zu beheben.
Eine Korrektur beantragen
Diejenigen, die programmieren können, wissen das vielleicht schon.
Tatsächlich verwendete der Testrechner /dev/i2c-0 anstelle des gebräuchlicheren /dev/i2c-1, weshalb die Lesebezeichnung im Code falsch war.
Was ChatGPT betrifft, so habe ich den Code vorgeschlagen, weil ich von einem generischen /dev/i2c-1 ausgegangen bin.
Wir hätten also einfach den allgemeinen SMBus(1) durch SMBus(0) ersetzen können.
Da dieses Testgerät ein wenig speziell ist, sollte SMBus(1) für die meisten Raspberry Pi ausreichen.
with SMBus(0) as bus: # ← Use bus number 0 here
Wie ich die Frage gestellt habe, um von dieser Änderung zu erfahren, habe ich den Fehler einfach kopiert und eingefügt und abgeschickt.

Unter den vielen vorgeschlagenen Prüfpunkten dachte ich, dass ich mit den Ergebnissen des Befehls i2cdetect vielleicht eine Lösung finden könnte. Also habe ich als nächstes das Ergebnis von i2cdetect kopiert und eingefügt und etwas wie „Die Ausgabe von i2cdetect lautet wie folgt. Was ist der Fehler?

Er erklärte dann den Inhalt im Detail und fand auch einen wichtigen Punkt, nämlich 0 und 1 Fehler.
Danke! Ich habe die Ausgabe von i2cdetect überprüft und einige wichtige Punkte gefunden!
Der neu geänderte Code ist nicht mehr auskommentiert, was zuvor als Extra angegeben war.
Stattdessen wurde höflich darauf hingewiesen, dass es sich um # ← ここを 0 にする handelt. Wir danken Ihnen.
import time
from smbus2 import SMBus
SHT30_ADDR = 0x44 # Address detected by i2cdetect
MEASUREMENT_CMD = [0x2C, 0x06]
def read_sht30(bus):
# Send measurement command
bus.write_i2c_block_data(SHT30_ADDR, MEASUREMENT_CMD[0], [MEASUREMENT_CMD[1]])
time.sleep(0.5) # Wait for measurement
# Read data
data = bus.read_i2c_block_data(SHT30_ADDR, 0x00, 6)
temp_raw = data[0] << 8 | data[1]
temperature = -45 + (175 * temp_raw / 65535.0)
humid_raw = data[3] << 8 | data[4]
humidity = 100 * humid_raw / 65535.0
return temperature, humidity
if __name__ == "__main__":
with SMBus(0) as bus: # ← Use bus number 0 here
while True:
try:
temperature, humidity = read_sht30(bus)
print(f"Temperature: {temperature:.2f}°C, Humidity: {humidity:.2f}%")
except Exception as e:
print("Error:", e)
time.sleep(2)
Ändern Sie senseor.py und führen Sie es erneut aus.
Diesmal wurde es ohne Fehler ausgeführt.
Ausgabeergebnisse:
sudo python3 sensor.py
Temperature: 22.65°C, Humidity: 63.77%
Temperature: 22.65°C, Humidity: 63.81%
Temperature: 22.66°C, Humidity: 63.79%
Temperature: 22.64°C, Humidity: 63.80%
Temperature: 22.65°C, Humidity: 63.77%
Temperature: 22.64°C, Humidity: 63.78%
Die Temperatur und Luftfeuchtigkeit wurden wiederholt auf dem Konsolenbildschirm (Terminal) angezeigt. Das ist gut.
Es gibt keinen Code zum Beenden, also drücken Sie Strg + C, um den Abbruch zu erzwingen.
Weitere Anpassungen (Datenspeicherung)
Unserem erklärten Ziel entsprechend möchten wir zunächst die Möglichkeit hinzufügen, Werte zu speichern.
Das Speichern eines einzelnen Bisses kann so einfach sein wie die Ausgabe in Textform, oder es kann in einer Datenbank gespeichert werden.
Es wäre bequemer, die Daten in einer Datenbank zu speichern, um sie später wieder abrufen zu können, als nur Text auszugeben.
Es kann sinnvoll sein, auch den Datenbanktyp anzugeben, also verwenden wir diesmal SQLite, das nur eine Datei benötigt.

Verwenden Sie SQLite als Datenbank.
Wie beabsichtigt, geben sie den Code mit der zusätzlichen Möglichkeit aus, ihn unter den folgenden Bedingungen in der Datenbank zu speichern.
- Aufzeichnung der gemessenen „Zeit“, „Temperatur“ und „Luftfeuchtigkeit“ in SQLite
- Automatische Erstellung von Tabellen beim Start, wenn sie noch nicht vorhanden sind
- Abruf, Speicherung und Ausgabe auf der Konsole alle 2 Sekunden
Erstellter Python-Programmcode: (zum Vergrößern klicken)
import time
import sqlite3
from smbus2 import SMBus
from datetime import datetime
# I2C bus number (use bus 0)
I2C_BUS = 0
SHT30_ADDR = 0x44
MEASUREMENT_CMD = [0x2C, 0x06]
DB_PATH = 'sensor_data.db'
def init_db():
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS measurements (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT,
temperature REAL,
humidity REAL
)
''')
conn.commit()
conn.close()
def save_to_db(timestamp, temperature, humidity):
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute('''
INSERT INTO measurements (timestamp, temperature, humidity)
VALUES (?, ?, ?)
''', (timestamp, temperature, humidity))
conn.commit()
conn.close()
def read_sht30(bus):
bus.write_i2c_block_data(SHT30_ADDR, MEASUREMENT_CMD[0], [MEASUREMENT_CMD[1]])
time.sleep(0.5)
data = bus.read_i2c_block_data(SHT30_ADDR, 0x00, 6)
temp_raw = data[0] << 8 | data[1]
temperature = -45 + (175 * temp_raw / 65535.0)
humid_raw = data[3] << 8 | data[4]
humidity = 100 * humid_raw / 65535.0
return temperature, humidity
def main():
init_db()
with SMBus(I2C_BUS) as bus:
while True:
try:
temperature, humidity = read_sht30(bus)
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
save_to_db(timestamp, temperature, humidity)
print(f"[{timestamp}] Temperature: {temperature:.2f}°C, Humidity: {humidity:.2f}%")
time.sleep(2)
except Exception as e:
print("Error:", e)
time.sleep(5)
if __name__ == "__main__":
main()
Ich werde versuchen, es einmal so auszuführen, wie es ist, unabhängig von einer Prüfung seines Inhalts.
Ich habe es als neues sensor_data.py gespeichert.
Ausgabeergebnisse:
sudo python3 sensor_data.py
[2025-04-11 12:37:54] Temperature: 22.78°C, Humidity: 64.27%
[2025-04-11 12:37:57] Temperature: 22.79°C, Humidity: 64.34%
[2025-04-11 12:37:59] Temperature: 22.79°C, Humidity: 64.30%
[2025-04-11 12:38:02] Temperature: 22.76°C, Humidity: 64.31%
[2025-04-11 12:38:04] Temperature: 22.78°C, Humidity: 64.28%
[2025-04-11 12:38:07] Temperature: 22.79°C, Humidity: 64.30%
[2025-04-11 12:38:09] Temperature: 22.78°C, Humidity: 64.32%
Der resultierende Wert ist derselbe wie zuvor, aber dieses Mal mit einem Zeitstempel.
Lassen Sie uns nun überprüfen, ob es richtig in der Datenbank gespeichert ist.
Die Anwendung „DB Browser für SQLite“ ist genau richtig, also installieren wir eine neue und werfen einen Blick darauf.
sudo apt update
sudo apt install sqlitebrowser
Eine Datei namens sensor_data.db wird erstellt und geladen.

Auf der Registerkarte Daten durchsuchen können Sie sehen, dass die Daten ordnungsgemäß gespeichert sind. In diesem Fall handelt es sich um 10 Elemente.
Jetzt können Sie die Werte jederzeit abrufen.
Weitere Anpassungen (Webansicht)
Der nächste Schritt ist das Hinzufügen von Funktionen, damit es in einem Webbrowser angezeigt werden kann.
Da Sie gerade vorgeschlagen haben, Flask zu verwenden, werde ich Sie bitten, dies so zu tun, wie es ist.
Flask ist ein sogenanntes Framework. Es muss zuerst installiert werden.
Eigentlich war Flask bereits installiert. Allerdings handelt es sich um eine Version der Serie 1.0, die nicht auf die Serie 2.0 oder 3.0 aufgerüstet werden kann. Obwohl sie nicht auf dem neuesten Stand ist, werden wir dieses Mal so weitermachen wie bisher.
Wenn Sie es installieren möchten, ist es immer noch der Befehl pip3 install.
flask --version
Python 3.9.2
Flask 1.1.2
Werkzeug 1.0.1
Offenbar müssen wir eine neue py-Datei erstellen.
- sensor.py → Temperatur und Luftfeuchtigkeit ermitteln und speichern (früherer Datenerfassungscode)
- webapp.py → Flask-App
Erstellen Sie eine neue webapp.py.
▼webapp.py: (zum Erweitern klicken)
from flask import Flask, render_template_string
import sqlite3
DB_PATH = 'sensor_data.db'
app = Flask(__name__)
HTML_TEMPLATE = '''
<!doctype html>
<html>
<head>
<title>Temperature and Humidity Log</title>
<meta charset="utf-8">
<style>
body { font-family: sans-serif; padding: 2rem; background-color: #f9f9f9; }
table { border-collapse: collapse; width: 100%; max-width: 800px; }
th, td { border: 1px solid #ccc; padding: 8px; text-align: center; }
th { background-color: #eee; }
</style>
</head>
<body>
<h1>Temperature and Humidity Log (Latest 50 Records)</h1>
<table>
<tr>
<th>ID</th>
<th>Timestamp</th>
<th>Temperature (°C)</th>
<th>Humidity (%)</th>
</tr>
{% for row in data %}
<tr>
<td>{{ row[0] }}</td>
<td>{{ row[1] }}</td>
<td>{{ row[2]|round(2) }}</td>
<td>{{ row[3]|round(2) }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
'''
@app.route('/')
def index():
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute('''
SELECT id, timestamp, temperature, humidity
FROM measurements
ORDER BY id DESC
LIMIT 50
''')
data = cursor.fetchall()
conn.close()
return render_template_string(HTML_TEMPLATE, data=data)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Ich habe es sofort so ausgeführt, wie es ist.
python3 webapp.py
* Serving Flask app "webapp" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Wenn der Text, den Sie sehen, in der Konsole erscheint, können Sie ihn durch Eingabe von localhost:5000/in Ihrem Webbrowser anzeigen.
Sie können ihn auch von einem anderen Rechner oder Ihrem Telefon aus anzeigen, indem Sie die IP-Adresse des Raspberry Pi angeben. (z.B. http://192.168.0.10:5000/)

*Da dies eine vereinfachte Version ist, handelt es sich nur um eine Testverwendung der lokalen Umgebung.
Dieser Code führte nicht zu einem Fehler und musste nicht geändert werden.
Grafikanzeige am Ende hinzufügen
Wenn Sie schließlich über die Grafikanzeige verfügen, haben Sie die Funktionalität hinzugefügt, die Sie für dieses Projekt anvisiert haben.
Ich habe PLOTLY verwendet.
plotly ist eine Open-Source-Bibliothek, die die Erstellung von Graphen ermöglicht.
Installieren Sie zunächst Plotly:
pip3 install plotly
Ändern Sie webapp.py mit dem geänderten Code.
▼ Code (zum Erweitern klicken)
from flask import Flask, render_template_string
import sqlite3
import plotly.graph_objs as go
import plotly.offline as pyo
from datetime import datetime
DB_PATH = 'sensor_data.db'
app = Flask(__name__)
@app.route('/')
def index():
# Retrieve data
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute('''
SELECT timestamp, temperature, humidity
FROM measurements
ORDER BY id DESC
LIMIT 100
''')
rows = cursor.fetchall()
conn.close()
# Reverse to chronological order (oldest first)
rows.reverse()
timestamps = [row[0] for row in rows]
temperatures = [row[1] for row in rows]
humidities = [row[2] for row in rows]
# Create Plotly graph
temp_trace = go.Scatter(x=timestamps, y=temperatures, mode='lines+markers', name='Temperature (°C)')
hum_trace = go.Scatter(x=timestamps, y=humidities, mode='lines+markers', name='Humidity (%)')
layout = go.Layout(title='Temperature and Humidity Trends',
xaxis=dict(title='Time'),
yaxis=dict(title='Value'),
template='plotly_white')
fig = go.Figure(data=[temp_trace, hum_trace], layout=layout)
graph_html = pyo.plot(fig, output_type='div', include_plotlyjs='cdn')
# HTML template
html = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Temperature and Humidity Graph</title>
<style>
body { font-family: sans-serif; padding: 2rem; background-color: #f9f9f9; }
h1 { margin-bottom: 1rem; }
</style>
</head>
<body>
<h1>Temperature and Humidity Trend (Latest 100 Records)</h1>
{{ graph|safe }}
</body>
</html>
'''
return render_template_string(html, graph=graph_html)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Wenn ich es ausführe, wird Plotly aus irgendeinem Grund nicht geladen und angezeigt. Es wird nur der Titel der Kopfzeile angezeigt und der Rest ist leer.

Sobald Sie den cdn des Plots explizit angeben, können Sie ihn durch das von Ihnen angegebene Muster ersetzen.
Fügen Sie
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>mit render_template_string() manuell in die HTML-Ausgabe ein.
▼ Geänderte webapp.py mit Plotly-Bezeichnung: (zum Erweitern klicken)
from flask import Flask, render_template_string
import sqlite3
import plotly.graph_objs as go
from plotly.utils import PlotlyJSONEncoder
import json
DB_PATH = 'sensor_data.db'
app = Flask(__name__)
@app.route('/')
def index():
# Fetch data
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute('''
SELECT timestamp, temperature, humidity
FROM measurements
ORDER BY id DESC
LIMIT 100
''')
rows = cursor.fetchall()
conn.close()
if not rows:
return "No data available"
# Sort in ascending order (oldest first)
rows.reverse()
timestamps = [row[0] for row in rows]
temperatures = [row[1] for row in rows]
humidities = [row[2] for row in rows]
# Create graph
fig = go.Figure()
fig.add_trace(go.Scatter(x=timestamps, y=temperatures, mode='lines+markers', name='Temperature (°C)'))
fig.add_trace(go.Scatter(x=timestamps, y=humidities, mode='lines+markers', name='Humidity (%)'))
fig.update_layout(title='Temperature and Humidity Trend',
xaxis_title='Time',
yaxis_title='Value',
template='plotly_white')
# Convert to JSON
graphJSON = json.dumps(fig, cls=PlotlyJSONEncoder)
# HTML template
html = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Temperature and Humidity Graph</title>
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
</head>
<body>
<h1>Temperature and Humidity Trend (Latest 100 Records)</h1>
<div id="graph"></div>
<script>
var figure = {{ graphJSON | safe }};
Plotly.newPlot('graph', figure.data, figure.layout);
</script>
</body>
</html>
'''
return render_template_string(html, graphJSON=graphJSON)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Das Diagramm wird immer noch nicht angezeigt.
Ich habe die Fehlerergebnisse von der Webbrowser-Seite kopiert und eingefügt und nachgefragt.

Ich bin mit dem Internet verbunden, kann mich aber nicht mit dem explizit angegebenen plotly cdn verbinden.
Jetzt haben wir uns entschieden, eine lokale js-Datei anzugeben.
Rewrite zur Angabe einer lokal heruntergeladenen js-Datei.
Herunterladen per PC: https://cdn.plot.ly/plotly-latest.min.js
Kopieren Sie mit dem Befehl SCP auf den Raspberry Pi:
scp plotly-latest.min.js pi@raspberrypi.local:/home/pi/yourapp/static/
Verschieben Sie plotly-latest.min.js in den neu erstellten Ordner /static.
test/
├── webapp.py
├── sensor.py
├── sensor_data.py
└── static/
└── plotly-latest.min.js
Schließlich haben wir den HTML-Speicherort in der geänderten webapp.py auf den lokalen Pfad geändert.
Änderungen an der HTML-Vorlage:
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script> <!-- Remove this line -->
↓
<script src="/static/plotly-latest.min.js"></script> <!-- Change to use local JS file from /static folder -->
Jetzt kann es erfolgreich angezeigt werden.

Das Diagramm befindet sich bei einer stabilen Innentemperatur, so dass der Wert der zu erfassenden Daten fast unverändert ist. Als Diagramm ist es nicht sehr aussagekräftig.
Trotzdem haben wir es geschafft, dass die Grafikanzeige funktioniert.
Von hier aus können Sie weitere kleine Änderungen vornehmen oder durch Ausprobieren eine ganz andere Funktion ausprobieren.
Da wir nun unser Ziel erreicht haben, werden wir den Test an dieser Stelle beenden.
Dies ist für die Verwendung in einer Produktionsumgebung nicht ausreichend.
Dies ist notwendig, da es keine weitergehende Fehlerbehandlung als diese gibt.
Da ich selbst kein Programmierer bin, ist die Vielzahl der Funktionen etwas überwältigend. Ich denke jedoch, dass der Code nicht nur für den privaten Gebrauch, sondern auch für eine Testumgebung geeignet ist.
Ich muss in der Lage sein, Fragen zu stellen.
Die Verwendung von ChatGPT erfordert immer noch die Fähigkeit, Fragen zu stellen. Das Stellen allgemeiner Fragen führt oft zu Verallgemeinerungen, die wichtige Details auslassen und sich nicht wie genaue Antworten anfühlen. Es ist besser, wenn Sie Ihre Annahmen einmal darlegen.
Wenn wir die verwendete Hardware auf den industriellen Raspberry Pi oder das ComputeModule 4 beschränken, wie wir es dieses Mal getan haben, könnten wir uns vorstellen, dass dies ein Problem sein könnte, also haben wir es nicht gewagt, es anzugeben. Der Grund dafür ist, dass die Umgebung besonders ist.
Selbst wenn Sie den Fehlerinhalt, der nicht im japanischen Text enthalten ist, kopieren und einfügen, wird er auf verbesserungswürdige Bereiche hinweisen.
Selbst wenn er wie vorgeschlagen umgesetzt wird, enthält eine qualifizierte Antwort nur eine verbale Erklärung, „was nicht getan werden kann“.
Ausgehend von der ersten Frage „Schreiben Sie ein Python-Programm, um den SHT30 mit dem Raspberry Pi zu verbinden und die Temperatur zu messen“, dauerte es etwa fünf Fragen, bis ein Python-Programmcode erstellt war, der die gewünschte Funktionalität im Allgemeinen implementierte.
Ehrlich gesagt, selbst wenn Sie den Code nicht verstehen, kann es sich um einen brauchbaren Programmcode handeln, da der Fehler oft durch Befolgen der Anweisungen behoben werden kann.
Ich denke, es eignet sich auch für das Selbststudium des Programmierens, denn indem ich Fragen zu Teilen des Codes, die ich nicht verstehe, erneut stelle, kann ich mein eigenes Verständnis des Codes vertiefen.
Es wäre näher an dem Gefühl, das Problem genau zu kennen, als das Internet zu durchsuchen, um herauszufinden, was es ist.
Ich kann die Programmierung in ChatGPT verwenden, allerdings nur von Fall zu Fall.
Funktion teilen
Ich werde den Vorgang in diesem Artikel mit der ChatGPT-Freigabefunktion verlinken.
Es gab auch einige Details und Ergänzungen, die ich in dem Artikel ausgelassen habe, weil ich in den Einstellungen Vorschläge aktiviert habe. Bitte lesen Sie ihn, wenn Sie möchten.
Raspberry Pi SHT30 Temperaturmessung
https://chatgpt.com/share/67f8a391-e8f0-8008-980d-f9a517819172
*Ich kann einen Link zu der Seite ohne ein bestimmtes Verfallsdatum einrichten. Wenn ich jedoch die Unterhaltung lösche, kann der Link nicht mehr angezeigt werden. Bitte verstehen Sie dies im Voraus.
Referenzlinks:
smbus2: https://pypi.org/project/smbus2/
plotly: https://github.com/plotly/plotly.js
DB Browser für SQLite: https://github.com/ sqlitebrowser/sqlitebrowser
ChatGPT Shared Links FAQ: https://help.openai.com/en/articles/7925741-chatgpt-shared-links-faq
Artikel beigetragen von Raspida
Raspberry Pi-Informationsseite, die auch von Nicht-Ingenieuren genutzt werden kann raspida.com eine Raspberry Pi-Informationsseite, die auch für Nicht-Ingenieure interessant ist und mit der sie umgehen können. Er schreibt auch technische Blogartikel auf der PiLink-Website über den Raspberry Pi für den industriellen Einsatz.

