Arduino Nano 33 IoT: Mehrparameter-Wassersensor (EC, pH, Redox) mit BLE & PWA
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino Nano 33 IoT | 1 |
| Microfire LLC Isolierte EC-Sonden-Schnittstelle | 1 |
| Microfire LLC Isolierte ISE-Sonden-Schnittstelle | 2 |
Über dieses Projekt
Was werden wir bauen?
Ein Gerät zur Messung von elektrischer Leitfähigkeit (EC), pH-Wert, Redoxpotenzial (ORP) und Temperatur. Es eignet sich zur Überwachung von Pools oder Hydrokulturen. Die Kommunikation erfolgt über Bluetooth Low Energy (BLE), die Daten werden auf einer Webseite per Web Bluetooth angezeigt. Als besonderes Feature wird die Anwendung als Progressive Web App (PWA) realisiert, die sich wie eine native App installieren lässt.
Alle benötigten Komponenten sind bei ufire.co erhältlich.
Begriffserklärungen
- EC / pH / ORP / Temperatur: Gängige Wasserqualitätsparameter. EC misst in der Hydroponik die Nährstoffkonzentration, pH den Säuregrad, ORP die Desinfektionsfähigkeit des Wassers.
- Bluetooth Low Energy (BLE): Energiesparendes Funkprotokoll für drahtlose Datenübertragung. Das Arduino Nano 33 IoT Board verfügt über WLAN und BLE.
- Web Bluetooth: API in Chrome und Opera, die Webseiten direkten Zugriff auf BLE-Geräte ermöglicht.
- Progressive Web Apps (PWA): Webanwendungen, die sich wie native Apps verhalten – installierbar, offline nutzbar, mit App-Icon. Die Implementierung unterscheidet sich zwischen Android, iOS und Desktop.
Hardware-Aufbau
Wichtiger Hinweis: Die uFire ISE-Sensorboards haben standardmäßig die gleiche I2C-Adresse. Da wir zwei davon verwenden, muss die Adresse eines Boards geändert werden. Für dieses Projekt konfigurieren wir eines der ISE-Boards für ORP-Messung und setzen die Adresse auf 0x3e (Anleitung siehe Herstellerdokumentation).
Anschließend ist der Aufbau dank Qwiic-Verbindersystem einfach: Alle Sensoren werden in Reihe geschaltet. Ein Qwiic-auf-Male-Kabel verbindet den ersten Sensor mit dem Nano 33 IoT. Die farbcodierten Drähte werden wie folgt angeschlossen:
- Schwarz → GND
- Rot → 3,3 V oder 5 V
- Blau → SDA (Pin A4)
- Gelb → SCL (Pin A5)
Der Temperatursensor wird an das EC-Board angeschlossen (andere Boards können ebenfalls Temperatur messen). EC-, pH- und ORP-Sonden werden per BNC-Stecker an die entsprechenden Boards angeschlossen. Ein wasserdichtes Gehäuse wird dringend empfohlen.
Software
Die Software besteht aus zwei Teilen: Firmware auf dem Nano 33 IoT und der Webanwendung.
Datenfluss
- Die Webseite verbindet sich per BLE mit dem Nano.
- Die Webseite sendet Textbefehle zur Abfrage von Messwerten oder Kalibrierung.
- Der Nano empfängt, führt aus und sendet JSON-Antworten zurück.
- Die Webseite aktualisiert die Benutzeroberfläche.
BLE-Services und Characteristics
Ein BLE-Service entspricht einem „Buch“, Characteristics sind die „Seiten“. Unser Gerät definiert einen benutzerdefinierten Service mit zwei Characteristics:
BLEService uFire_Service("4805d2d0-af9f-42c1-b950-eae78304c408");
BLEStringCharacteristic tx_Characteristic("50fa7d80-440a-44d2-967a-ec7731ec736a", BLENotify, 20);
BLEStringCharacteristic rx_Characteristic("50fa7d80-440b-44d2-967b-ec7731ec736b", BLEWrite, 20);
tx_Characteristic(Notify): Sendet Messwerte an die Webseite.rx_Characteristic(Write): Empfängt Befehle von der Webseite.
Initialisierung:
BLE.setLocalName("uFire BLE");
BLE.setAdvertisedService(uFire_Service);
uFire_Service.addCharacteristic(tx_Characteristic);
uFire_Service.addCharacteristic(rx_Characteristic);
BLE.addService(uFire_Service);
rx_Characteristic.setEventHandler(BLEWritten, rxCallback);
BLE.advertise();
rx_Characteristic.setEventHandler(BLEWritten, rxCallback) ruft rxCallback auf, wenn die Webseite Daten sendet. BLE.advertise() macht das Gerät für Verbindungen sichtbar.
Textbasierte Befehle
Die Kommunikation erfolgt über einfache Textbefehle. Die uFire-Bibliotheken unterstützen JSON und MsgPack; dieses Projekt nutzt JSON für bessere Lesbarkeit.
Beispiel:
- Webseite sendet:
ec(anrx_Characteristic) - Nano antwortet:
{"ec":1.24}(antx_Characteristic) - Webseite zeigt den Wert an.
Die Webanwendung
Frontend: Vue.js ohne Build-System, Styling mit Bulma.io. Ordnerstruktur: js/, css/, assets/.
Im <head> wird das PWA-Manifest eingebunden:
<link rel="manifest" href="manifest.json">
JavaScript-Module: app.js (Vue-Setup, UI-State), ble.js (Bluetooth-Logik), ec.js, ph.js, orp.js (sensorspezifische Befehle).
JavaScript und Web Bluetooth
Hinweis: Funktioniert nur in Chrome und Opera.
Die UUIDs aus der Firmware werden in app.js wiederverwendet. In ble.js stecken die Kernfunktionen connect() und disconnect().
Verbindungsaufbau (muss durch Benutzerinteraktion ausgelöst werden):
this.device = await navigator.bluetooth.requestDevice({
filters: [{ namePrefix: "uFire" }],
optionalServices: [this.serviceUuid]
});
Danach werden Service und Characteristics initialisiert, und ein Listener für characteristicvaluechanged registriert:
service = await server.getPrimaryService(this.serviceUuid);
characteristic = await service.getCharacteristic(this.txUuid);
await characteristic.startNotifications();
characteristic.addEventListener("characteristicvaluechanged", this.value_update);
Ein Timer aktualisiert die Anzeige alle 5 Sekunden. value_update() parst eingehende JSON-Daten und aktualisiert die UI.
PWA-Umsetzung
Schritte zur Progressive Web App:
- manifest.json erzeugen (z. B. mit App Manifest Generator). Wichtig: Application Scope (z. B.
/uFire-BLE/), Start URL, Display Mode: standalone. Datei liegt im Webroot nebenindex.html. - Service Worker für Offline-Caching (boilerplate, z. B. Google-Beispiel). Datei:
service-worker.js. - Icons erstellen (z. B. FavIcon Generator).
- In Vue
mounted()den Worker registrieren:mounted: function () { if ('serviceWorker' in navigator) { navigator.serviceWorker.register('service-worker.js'); } } - Mit Lighthouse (Chrome DevTools) prüfen. Bei Erfolg erscheint Installations-Banner.
Code
- GitHub Repository
- Arduino Create: Projektcode verfügbar
Schaltplan
Alle Verbindungen erfolgen über Qwiic-Kabel.
Herstellungsprozess
- Infineon als Advanced Technology Partner von Amazon Web Services benannt
- Raspberry Pi & HDC2010: Kompletter I2C Temperatur- & Feuchtigkeitssensor Setup-Guide
- Sichere Gesichtserkennungs-Tür mit Windows IoT und Raspberry Pi bauen
- Bewegungsgesteuerter AWS IoT Button mit Raspberry Pi, PIR-Sensor und MQTT
- Präzise Temperatur- & Feuchtigkeitsüberwachung mit SHT15 unter Windows 10 IoT Core
- Windows 10 IoT Core auf Raspberry Pi 3 Model B+ installieren – Schritt-für-Schritt
- Raspberry Pi 4 als Webserver nutzen und eigene Website erstellen
- GoPiGo v2 auf Windows 10 IoT Core für Raspberry Pi 3 erweitern
- Azure IoT Schwimmbadsteuerung: Smarte Sensoren & Fernüberwachung
- Wie IoT Web-App-Design und -Entwicklung revolutioniert