Programmieren des Microcontrollers und Auslesen des Sensors
Jeder Arduino-Code besteht aus den Bestandteilen setup () und loop ().
Das Setup läuft einmal beim Start und Loop immer wieder. Wir halten im Setup zunächst die Baude-Rate fest, die sagt, mit welcher Geschwindigkeit die Daten an den Computer übertragen werden. Am Computer muss dann später die gleiche Baude-Rate eingestellt werden fürs Empfangen der Daten. Mit ".begin", das auf ein Objekt folgt, in unserem Fall die serielle Verbindung, wird die Methode zum Laufen gebracht, die die Verbindung initialisiert und ganz einfach begin heißt. In Klammern kommt das dazugehörige Argument, in unserem Fall eben die Baude-Rate:
void setup()
{
Serial.begin(115200);
}
void loop()
{
}
Für die Kommunikation zwischen Sensor und Microcontroller über eine I²C genannte Schnittstelle braucht es eine Bibliothek, die mit einer einzigen Zeile Code ganz viel Code im Hintergrund in unser Programm holt. Damit der Sensor vom Microcontroller eingestellt werden kann, braucht es eine zweite Bibliothek, die den Sensor ansteuert. Beide einfach über "#include" einladen. Es gibt offensichtlich mehrere Bibliotheken mit dem Namen MS5837.h für den Sensor.Ich benutze hier die von Rob Tillaart "MS5837 v0.3.3.":
#include <MS5837.h>
#include <Wire.h>
void setup()
{
Serial.begin(115200);
}
void loop()
{
}
Alles, worauf sich später bezogen wird, kann noch vor dem Setup()-Teil deklariert werden, so wie eine Art Präambel, in der alles steht, was zu Beginn für alles folgende Gültigkeit hat, so wie z.B den Namen unseres Sensors, oder an welchen Pins die Datenleitung (SDA) und Taktleitung (SCL) angeschlossen werden.
#include <MS5837.h>
#include <Wire.h>
MS5837 sensor;
#define SDA_PIN 4
#define SCL_PIN 5
void setup()
{
Serial.begin(115200);
}
void loop()
{
}
Die Bibliothek "Wire" hat die Funktion "begin()", mit der die Verbindung zu den beiden Leitungen vom Sensor zum Microcontroller eingerichtet werden können und der in den setup()-Bereich kommt, weil es reicht die Verbindung einmal zu initialisieren. Und auch dem Sensor können wir mit dieser Funktion Leben einhauchen. Als Argument muss ich laut Bibliothek von Tillaart eine "1" tippen, weil ich den MS5837-02BA benutze:
#include <MS5837.h>
#include <Wire.h>
MS5837 sensor;
#define SDA_PIN 4
#define SCL_PIN 5
void setup()
{
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
sensor.begin(1);
}
void loop()
{
}
Jetzt wollen wir etwas ja ständig machen, nämlich messen. Die Funktion fürs Auslesen des Sensors lautet ".read()" gehört folglich in den Loop()-Teil.
#include <MS5837.h>
#include <Wire.h>
MS5837 sensor;
#define SDA_PIN 4
#define SCL_PIN 5
1
void setup()
{
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
sensor.begin(1);
}
void loop()
{
sensor.read();
}
Der MS5837 kann neben dem absoluten Druck auch die Temperatur messen. Die Bibliothek hat dafür die Methode ".getTemperature". Der Sensor kann zwei Stellen nach dem Komma angeben, sodass wir die Information "Kommazahl" in einer Variable als float speichern müssen. Damit wir die gelesenen Temperaturdaten auch sehen können, sagen wir dem Objekt "Serial", dass die Variable "temperatur" ausgegeben werden soll mit der Methode ".println". Im Serial Monitor wird dann die Temperatur angezeigt:
#include <MS5837.h>
#include <Wire.h>
MS5837 sensor;
#define SDA_PIN 4
#define SCL_PIN 5
void setup()
{
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
sensor.begin(1);
}
void loop()
{
sensor.read();
float temperatur = sensor.getTemperature();
Serial.println(temperatur);
}
Es empfiehlt sich, mit "delay()" eine zeitliche Verzögerung in den Loop-Bereich einzubauen, damit nicht so viele Messwerte auf einmal erscheinen, z.B eine Messung jede Sekunde:
#include <MS5837.h>
#include <Wire.h>
MS5837 sensor;
#define SDA_PIN 4
#define SCL_PIN 5
void setup()
{
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
sensor.begin(1);
}
void loop()
{
sensor.read();
float temperatur = sensor.getTemperature();
Serial.println(temperatur);
delay(1000);
}
Als nächstes lassen wir den Druck auslesen. Dazu erstellen wir wieder eine Kommazahl-Variable (float druck), die den Inhalt des Objekts "Sensor" enthält, die mit der Methode ".getPressure" ausgelesen werden kann:
#include <MS5837.h>
#include <Wire.h>
MS5837 sensor;
#define SDA_PIN 4
#define SCL_PIN 5
void setup()
{
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
sensor.begin(1);
}
void loop()
{
sensor.read();
float temperatur = sensor.getTemperature();
Serial.print(temperatur);
float druck = sensor.getPressure();
Serial.print(druck);
delay(1000);
}
Wir wissen, dass zu den ausgelesenen Werten die Einheiten °C und mbar gehören, sehen aber gerade nur die blanken Messwerte. Es wäre gut, wenn nach jedem Messwert auch eine Einheit steht. Für den Zeilenumbruch nach einer Ausgabe sorgt der Zusatz ln (line new) bei print:
#include <MS5837.h>
#include <Wire.h>
MS5837 sensor;
#define SDA_PIN 4
#define SCL_PIN 5
void setup()
{
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
sensor.begin(1);
}
void loop()
{
sensor.read();
float temperatur = sensor.getTemperature();
Serial.print(temperatur);
Serial.println(" °C");
float druck = sensor.getPressure();
Serial.print(druck);
Serial.println(" mbar");
delay(1000);
}
ESP32-Webserver mit Visualisierung
Im Folgenden wollen wir den Microcontroller im Access-Point-Modus Webserver nutzen, der über sein eigenes WLAN eine Webseite teilt, die Diagramme mit den Messwerten des MS5837 darstellt, es erlaubt die Messfrequenz zu ändern, eine Aufnahme zu starten und die Daten als CSV zu speichern. Die IP-Adresse soll auf dem OLED des HELTEC erscheinen. Die Anzeige kann ausgehen, sobald sich jemand verbunden hat.
Wir machen aus dem Microcontroller erstmal einen Hotspot, indem wir die "WiFi.h"- und die WebServer-Bibliotheken importieren. Dann definieren wir zwei Variablen, die konstant (const) sind und aus Schriftzeichen (char*) bestehen und den WiFi-Namen (Service Set Identifier, kurz SSID) und das Passwort enthalten.
Dann wieder im setup() die serielle Verbindung mit dem Computer herstellen mit gewünschter Baude-Rate. Mit "Wifi.softAP" starten wir die AccessPoint-Verbindung. In Klammern stehen die Attribute, die diese Methode erwartet, nämlich Name und Passwort. Dann geben wir die IP des ESP32 aus im Seriellen Monitor (meistens ist es 192.168.4.1). Mit server.on schalten wir den Server ein. Server sind Programme oder Computer und bearbeiten Anfragen von anderen Geräten, spucken z.B eine Webseite aus oder durchforsten eine Datenbank.
#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "DEIN_WLAN_NAME";
const char* password = "DEIN_WLAN_PASSWORT"; // Mindestens 8 Zeichen!
WebServer server(80);
void setup() {
Serial.begin(115200);
WiFi.softAP(ssid, password);
Serial.println(WiFi.softAPIP());
server.on("/",
server.begin();
}
void loop() {
server.handleClient();
}
↓
Browser zeigt Messwerte
↓
JavaScript aktualisiert Messwerte
↓
Diagramm