Füllstandsmessung, Temperatur, Bodenfeuchte, Durchfluss - Königslösung gesucht!

Hallo zusammen,

um die Frage vorab zu beantworten: Ja, ich habe gegoogelt. Aber leider bisher noch nicht die Königslösung gefunden.

Ich habe einen Arduiono, der im Gartenhaus folgende Werte abgreifen soll:

Die Daten sollen an einen Loxone-Miniserver geliefert werden. Ultraschall und NTC funktionieren schon, allerdings bisher nur einzeln.

Nun ist die Frage: Was ist die Königslösung?

Ich habe mich ein Weilchen mit der Möglichkeit beschäftigt, dass Ganze per 1-Wire zu lösen (siehe hier: Arduino 1-Wire UDP gateway for Loxone and others - YouTube). Wenn ich es richtig sehe, wird das nicht funktionieren, da die Sensoren nicht 1-Wire-fähig sind.

Kennt jemand einen Sketch, der zumindest einen Teil dieser Anforderungen abdeckt? Dürfte ja eigentlich nichts Ungewöhnliches sein.

Freue mich über Ideen.

Hallo,

wenn du bitte aus den URL einen Hyperlink machst, dann kann man das auch am mobilen Gerät öffnen und du hast mehr helfende User.

P.S. Eine Königslösung wird es wohl nicht geben.

Jetzt mit Hyperlinks:

Hallo zusammen,

um die Frage vorab zu beantworten: Ja, ich habe gegoogelt. Aber leider bisher noch nicht die Königslösung gefunden.

Ich habe einen Arduiono, der im Gartenhaus folgende Werte abgreifen soll:

  • Füllstand der Zisterne via Ultraschall Siehe hier

  • Bodentemperatur via NTC-Temperaturfühler Siehe hier

  • Bodenfeuchtigkeit via kapazitivem Feuchtigkeitsmesser Siehe hier

  • Wasserverbrauch via Durchflusssensor Siehe hier

Die Daten sollen an einen Loxone-Miniserver geliefert werden. Ultraschall und NTC funktionieren schon, allerdings bisher nur einzeln.

Nun ist die Frage: Was ist die Königslösung?

Ich habe mich ein Weilchen mit der Möglichkeit beschäftigt, dass Ganze per 1-Wire zu lösen (siehe hier). Wenn ich es richtig sehe, wird das nicht funktionieren, da die Sensoren nicht 1-Wire-fähig sind.

Kennt jemand einen Sketch, der zumindest einen Teil dieser Anforderungen abdeckt? Dürfte ja eigentlich nichts Ungewöhnliches sein.

Freue mich über Ideen.

Die Königslösung ist doch einfach: beauftrage Deinen Kanzler damit, einen oder mehrere Untertanen zu finden, die das für Dich erledigen. Gibt's hier unter Gigs und Collaborations :-]

Der entsprechende Sketch ist in der Tat nichts Ungewöhnliches, einfach die richtige Mischung aus den Beispielen zu den einzelnen Sensoren. Wie kann/soll der Server angebunden werden?

Koenig223:

Freue mich über Ideen.

Ok, wie schon geschrieben wurde, ist das alles nicht so kompliziert.

Für die meisten Komponenten gibt es Libraries, in denen es Beispiele gibt, die du verwenden kannst.

Wenn du schon etwas lauffertiges hast, solltest du das zeigen und eine Beschreibung dazu, was geht und was nicht.

Den Sketch bitte in Code-Tags setzen.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar, auch mobile Geräte.

Hallo Dieter,

Folgende Sketche funktionieren schon:

Ultraschall-Sensor:

// benoetigte Bibliotheken
#include <Ethernet.h>
#include <EthernetUdp.h>

// Netzwerk Einstellungen
//MAC-Adresse bitte anpassen
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEB };
// UDP Port zum Datenempfang Lox MS -> Arduino
unsigned int ARDUPORT = xxxx;

// IP Lox MS
IPAddress MSIP(192, xxx, xxx, xxx);
// UDP Port zum Datenversand Arduino -> Lox MS
unsigned int MSPORT = xxxx;

// Daten-Buffer
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];

// EthernetUDP Instanz um UDP zu senden/empfangen
EthernetUDP Udp;

// Pin fure HC SR04 festlegen
#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin

// Konstanten
int maxReichweite = 300; // Maximum Reichweite der Messung
int minReichweite = 0; // Minimum Recihweite der Messung

// Variablen
long dauer;
float distanz;
char chardistanz[10];

void setup() {
  Serial.begin(9600);

  if (!Ethernet.begin(mac)) Serial.println("DHCP fehlgeschlagen");
  else {

    Serial.println ("Netzwerkdaten");
    Serial.println ("---------------");
    Serial.print("Arduino MAC: ");
    Serial.print(mac[0], HEX);
    Serial.print(":");
    Serial.print(mac[1], HEX);
    Serial.print(":");
    Serial.print(mac[2], HEX);
    Serial.print(":");
    Serial.print(mac[3], HEX);
    Serial.print(":");
    Serial.print(mac[4], HEX);
    Serial.print(":");
    Serial.println(mac[5], HEX);
    Serial.print("Arduino IP: ");
    Serial.println(Ethernet.localIP());
    Serial.print("Arduino UDP Port: ");
    Serial.println(ARDUPORT);
    Serial.println ("---------------");
    Serial.print ("Miniserver IP: ");
    Serial.println(MSIP);
    Serial.print("Miniserver UDP Port: ");
    Serial.println(MSPORT);
    Serial.println ("---------------");
  }

  Udp.begin(ARDUPORT); // Start UDP

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

}

void loop() {
  // Distanz lesen
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  dauer = pulseIn(echoPin, HIGH);

  //Distanz in cm umrechnen
  distanz = dauer / 58.2;

  // min max auswerten, wenn in der Range wird gesendet
  if (distanz >= maxReichweite || distanz <= minReichweite) {
    Serial.println("Messung fehlerhaft!");
  }
  else {
    Serial.print(distanz), Serial.println(" cm");
    dtostrf(distanz, 4, 0, chardistanz); //Distanz fuer UDP Versand umwandeln (1 steht fue  r Nachkommastellen)
    sendUDP(chardistanz); //Messung an MS senden
  }
  delay(5000); // Wartet x Sekunden bis zur naechsten Messung, z.B. 5000 = 5 Sekunden
}

//UDP-Befehl senden
void sendUDP(String text)
{
  Udp.beginPacket(MSIP, MSPORT);
  Udp.print(text);
  Udp.endPacket();
  delay(10);
}

NTC-Temperaturfühler

//Thermometer with thermistor

/*thermistor parameters:
 * RT0: 10 000 Ω
 * B: 3977 K +- 0.75%
 * T0:  25 C
 * +- 5%
 */

//These values are in the datasheet
#define RT0 10000   // Ω
#define B 3977      // K
//--------------------------------------


#define VCC 5    //Supply voltage
#define R 10000  //R=10KΩ

//Variables
float RT, VR, ln, TX, T0, VRT;

void setup() {
  Serial.begin(9600);
  T0 = 25 + 273.15;                 //Temperature T0 from datasheet, conversion from Celsius to kelvin
}

void loop() {
  VRT = analogRead(A0);              //Acquisition analog value of VRT
  VRT = (5.00 / 1023.00) * VRT;      //Conversion to voltage
  VR = VCC - VRT;
  RT = VRT / (VR / R);               //Resistance of RT

  ln = log(RT / RT0);
  TX = (1 / ((ln / B) + (1 / T0))); //Temperature from thermistor

  TX = TX - 273.15;                 //Conversion to Celsius

  Serial.print("Temperature:");
  Serial.print("\t");
  Serial.print(TX);
  Serial.print("C\t\t");
  Serial.print(TX + 273.15);        //Conversion to Kelvin
  Serial.print("K\t\t");
  Serial.print((TX * 1.8) + 32);    //Conversion to Fahrenheit
  Serial.println("F");
  delay(500);

}

Die Auslieferung soll übrigens an eine UDP-Schnittstelle vom Loxone-Miniserver erfolgen. Dort kann auch die Umrechnung der Daten in Werte oder Statistiken erfolgen.

Danke!

Koenig223:
Folgende Sketche funktionieren schon:

Na, dass ist doch schon die halbe Miete. :wink:

Die musst du jetzt zusammen bringen.

Es darf nur eine Loop und ein Setup vorhanden sein.
Und bei den Variablen keine doppelten.

Am besten eine der Loop als Funktion einfügen und aus der anderen Loop aufrufen.

Beispiel:

//Varaiable definitionen

void setup() {
  // Beide Setups hier einsetzen
  // keine doppelten Anweisungen einfügen, sondern Namen anpassen

}

// Deine Loop
void loop() {

  //Hieraus die Funktion (2. Loop) aufrufen

  startFunktion() {

    //Hier sind die Anweisungen aus deiner 2. Loop

  }
}

Vielen Dank, Dieter! Ist ja gar nicht so kompliziert. Aber die ersten Schritte sind ja bekanntlich die schwersten.

Moin,

Ich hab hier einen Königsweg für dich:
Nimm als Hardware einen nodeMCU und als Software ESPEasy. Dann hast du alles fertig, kannst es per Webinterface konfigurieren und per WLAN überall dran anschließen.

Lieben Gruß,
Chris

Danke für den Tipp: Klingt auch interessant. Da habe ich doch glatt mal 3 Euro in so ein Ding bei Wish investiert :wink: