ESP32 Flowmeter - RS485 Modbus


Wie im ersten Artikel dieser Serie beschrieben, war mein erstes Ziel einen TUF-2000M Ultrasonic Flow Meter über einen ESP32 auszulesen. Dazu habe ich im Internet ein Beispiel zu einem ESP8266 gefunden: Reading a TUF-2000M Ultrasonic Flow Meter with an Arduino or ESP8266 und https://forum.arduino.cc/t/comunicacion-rs485/698786/2. Das Setup des TUF-2000M habe ich in folgendem Artikel beschrieben:  Erfahrungsbericht: Ultraschall Durchflussmesser TUF-2000M. Um den TUF-2000M mittels RS485 auslesen zu können, muss dieser fürs erste über den RS485 Umwandler mit dem ESP32 verbunden werden:

Hardware verbinden

RS485 und ESP32

RS485 zu TTL 5V Umwandler mit MAX13487 Chip für Raspberry Pi Arduino und andere MCU:

Das mitgelieferte Kabel kann am ESP32 wie folgt verbunden werden:

TUF-2000M verbinden

Nachdem wir alles angeschlossen haben, können wir uns um die Software kümmern:

Arduino

Als Vorbereitung werden für den Sketch die Pakete in Arduion benötigt: ModbusMaster und EspSoftwareSerial:

Modbus-Master

Software Serial

Error 226

Beim ersten Versuch habe ich aus Unwissenheit die beiden PINs RX und TX für die Kommunikation zum RS485-Board verwendet, was in einem Fehler 226 geendet hat. Das Display hat dabei die Ausgabe des Serial-Monitor auf den TUF-2000M gespiegelt: Menü 49, siehe: Serial Port Traffic

...
RX_PIN RX
TX-PIN TX
...

Nachdem ich das RS485-Board mit den PINS 16 und 17 des ESP32 verbunden habe, war es mir möglich den Flowmeter auszulesen:

...
RX_PIN 17
RX_PIN 16 
...

WLAN, MQTT und Flow

Kombiniert mit ESP32 WiFi und ESP32 MQTT - Daten senden, konnte ich mit folgendem Sketch den aktuellen Wert zum MQTT-Broker und somit in HomeAssistant schreiben:

[+]
#include <WiFi.h>
#include <PubSubClient.h>
#include <SoftwareSerial.h>
#include <ModbusMaster.h>

#define RX_PIN 17 // connect to converter's RX wire
#define TX_PIN 16 // connect to converter's TX wire
#define MODBUS_DEVICE_ID 1
SoftwareSerial swSerial(RX_PIN, TX_PIN);
ModbusMaster sensor;

const char* ssid = "home";
const char* password = "xxx";
const char* mqttServer = "192.168.1.5";
const int mqttPort = 1883;
const char* mqttUser = "mqtt";
const char* mqttPassword = "xxx";

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(9600);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(5000);
    Serial.println("Connecting to WiFi..");
  }
  
  Serial.println("Connected to the WiFi network");
  
  swSerial.begin(9600);
  sensor.begin(MODBUS_DEVICE_ID, swSerial);
    
  client.setServer(mqttServer, mqttPort);
  
  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");    
    if (client.connect("ESP32Client", mqttUser, mqttPassword )) {    
      Serial.println("connected");    
    } else {    
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(10000);
    }
  }
}

void loop() {
  client.loop();
  readFlow();
  delay(3000);
  if (!client.connected()) {
    delay(60000);
    if (!client.connected()) {
      ESP.restart();
    }    
  }
}

void readFlow() {
  uint8_t result;
  uint16_t buf[2];
  float flow;
  result = sensor.readHoldingRegisters(1, 2);
  if (result == sensor.ku8MBSuccess)
  {
    buf[1] = sensor.getResponseBuffer(0);
    buf[0] = sensor.getResponseBuffer(1);
    memcpy(&flow, &buf, sizeof(float));
    client.publish("flowmeter/flow",  String(flow).c_str());
  }
}

Zur Einbindung in Home-Assistant, siehe: Home-Assistant MQTT

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!


Top-Artikel in diesem Bereich

DS18B20 Temperatursensoren ESP32, MQTT und WiFi - HowTo

DS18B20 Temperatursensoren ESP32, MQTT und WiFi - HowTo

erstellt: 14.02.2022 von Bernhard

Zusätzlich zur Anbindung eines Durchflussmessers über RS485 habe ich 5-Stück DS18B20-Temperatursensoren an den ESP32 angesteckt, damit deren Werte auch über MQTT an HomeAssistant übertragen werden. ... weiterlesen

ESP32 WiFi Beispiel

ESP32 WiFi Beispiel

erstellt: 20.01.2022 von Bernhard

Als Vorbereitung für den Upload von Sketches an einen Microcontroller habe ich die ESP32-Boardinfromationen und einen USB to UART Bridge Treiber installiert, siehe: Vorbereitungen für das Programmieren eines ESP32. ... weiterlesen

ESP32 MQTT - Daten senden

ESP32 MQTT - Daten senden

erstellt: 24.01.2022 von Bernhard

Um Daten von einem ESP32 empfangen zu können, habe ich einen MQTT-Broker als Docker-Container vorbereitet. Der Container kann mittels Integration in Home-Assistant eingebunden werden und somit die Daten vom ESP32 über MQTT an Home-Assistant weiterleiten. Seitens ESP32 habe ich das Senden mit folgendem Sketch getestet und später die relevanten Teile in einen weiteren Sketch integriert. ... weiterlesen


Fragen / Kommentare