Zisterne Füllstandsanzeige Ultraschall und Temperaturmessung per UDP

Hallo Zusammen,

habe mir ein Skript zusammen gesucht womit ich eine Ultraschallmessung machen möchte und die Temperatur von der Zisterne erfassen will.

Soweit klappt auch die UDP Übertragung und auch die Ultraschallmessung. An der Temperatur hänge ich aber irgendwie fest. Wenn ich nur eine Temperaturabfrage-Skript laufen lasse, funktioniert alles wunderbar und er zeigt mir jede Sekunde die Temperatur an. Wenn ich dies aber in mein Skript einbaue, dann macht er einmal eine Messung und danach zeigt er mir nur noch -1000 an.

Könntet ihr vielleicht mal über das Skript schauen? Euch fällt bestimmt direkt etwas auf...

Habe es sowohl über die DallasTemperatur.h Bibliothek versucht, als auch über eine alternative Temperatur Messung.... :frowning:

Vielen Dank schonmal.

Liebe Grüße,

Steve

#include <UIPEthernet.h>
#include <OneWire.h>
//#include <DallasTemperature.h>


//#define ONE_WIRE_BUS 2 /* Digitalport Pin 2 definieren */

//OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */

//DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */

//Test

int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2

//Temperature chip i/o
OneWire ds(DS18S20_Pin);  // on digital pin 2

//Test



// Network Settings
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 199);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
#define UDP_TX_PACKET_MAX_SIZE 24

// Local UDP port to listen on
unsigned int localPort = 65001;

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

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

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

// Recipient IP
IPAddress RecipientIP(192, 168, 0, 150);

// Recipient UDP Port
unsigned int RecipientPort = 65000;

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup(void)
{
  // start Ethernet und UDP
  delay(5000);
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  Serial.begin(9600);
  Serial.println(Ethernet.localIP());

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

  //sensors.begin();/* Inizialisieren der Dallas Temperature library */

}

void loop(void)
{

  //sensors.requestTemperatures(); // Temp abfragen
  //temp = sensors.getTempCByIndex(0);

  float temp = getTemp();

  // 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.println(distanz);
    Serial.println(temp);
    dtostrf(distanz, 4, 1, chardistanz); //Distanz fuer UDP Versand umwandeln (1 steht fuer Nachkommastellen)
    dtostrf(temp, 4, 1, chartemp); //Temp fuer UDP Versand umwandeln (1 steht fuer Nachkommastellen)
    Udp.beginPacket(RecipientIP, RecipientPort);
    Udp.write("Ultraschall "), Udp.write(chardistanz), Udp.write("Temperatur "), Udp.write(chartemp);
    Udp.endPacket();
  }
  delay(5000); // Wartet x Sekunden bis zur naechsten Messung, z.B. 5000 = 5 Sekunden
}

float getTemp() {
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
    //no more sensors on chain, reset search
    ds.reset_search();
    return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
    Serial.print("Device is not recognized");
    return -1000;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1); // start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);
  ds.write(0xBE); // Read Scratchpad


  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }

  ds.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;

}

Sorry aber so kann man deinen Sketch nicht lesen, auf einem mobilen Gerät schon garnicht.
Setze den bitte richtig formatiert (Strg + T) in der IDE hier und Code-Tags, Schaltfläche </> oben links im Editorfenster und entferne die überflüssigen Leerzeilen.

Dann schau ich mir den auch an.
Dann ist der auch sicher lesbar.

Hi

Setze bitte Deinen SKETCH (nicht Script) in Code-Tags </ > Schaltfläche.

Die ganzen delay() haben welchen Sinn?
Bei 5 Sekunden Pause kann ich mir kaum vorstellen, daß sekündlich irgend etwas gemacht wird.

Was war Deine Alternativ-Temperatur-Mess-Methode?
Davon sehe ich Nichts.

Was erwartest Du, was bekommst Du?

MfG

AAAh ... Deine -1000 sind kein Messwert, sondern Deine selbst eingefügte Fehl-Messungs-Kennzeichnung - Das wäre vll. eine Nennung wert gewesen ...

2.tes AAAh ...
Dein Sketch durchsucht den 1-wire-Bus nach Temperatur-Sensoren.
Durch einen ausgeklügelten Algorithmus findet Der ALLE Sensoren - die Reihenfolge ist dabei aber - äh - mir noch nicht in den Kopf gegangen.
Nun gut - wenn Du KEINEN WEITEREN Sensor mehr findest, bekommst Du Deine -1000.
Und das für Alle Zeit, da Du die Such-Routine nicht zurück setzt.
Suche in der verwendeten Library, welchen Aufruf Du machen musst, um den ERSTEN Sensor zu finden.
(ggf. reicht ein .search(0) )
Äh - nö - bei Dir wird ein
ds.reset_search();
ausgeführt - Das sollte den Algorithmus wieder am Anfang beginnen lassen.

Hallo,

habe es nun anders editiert.

Die delays waren teilweise Tests, ob vielleicht mein Arduino mit den Abfragen überlastet ist.

Mein Beispiel Skretch war sekündlich. Ich muss in meinem normalen Skretch nicht sekündlich wissen, wie Warm/Kalt es ist.

Die Alternative habe ich teilweise auskommentiert, da ich auf dem Gebiet leider noch nicht ganz so fit bin. Wenn ich das Skretch wie hier nun angehangen benutze, funktioniert eine sekündliche Abfrage der Temperatur komischerweise.

Viele grüße

Steve

/* Benötigte Bibliotheken importieren */
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 /* Digitalport Pin 2 definieren */

OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */

DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */

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


sensors.begin();/* Inizialisieren der Dallas Temperature library */


Serial.print("Starte Temperatur abfragen ...");
}

void loop()
{
Serial.println();

sensors.requestTemperatures(); // Temp abfragen

Serial.print(sensors.getTempCByIndex(0) );
Serial.print(" Grad Celsius");
}

postmaster-ino:
Hi

Setze bitte Deinen SKETCH (nicht Script) in Code-Tags </ > Schaltfläche.

Die ganzen delay() haben welchen Sinn?
Bei 5 Sekunden Pause kann ich mir kaum vorstellen, daß sekündlich irgend etwas gemacht wird.

Was war Deine Alternativ-Temperatur-Mess-Methode?
Davon sehe ich Nichts.

Was erwartest Du, was bekommst Du?

MfG

AAAh ... Deine -1000 sind kein Messwert, sondern Deine selbst eingefügte Fehl-Messungs-Kennzeichnung - Das wäre vll. eine Nennung wert gewesen ...

2.tes AAAh ...
Dein Sketch durchsucht den 1-wire-Bus nach Temperatur-Sensoren.
Durch einen ausgeklügelten Algorithmus findet Der ALLE Sensoren - die Reihenfolge ist dabei aber - äh - mir noch nicht in den Kopf gegangen.
Nun gut - wenn Du KEINEN WEITEREN Sensor mehr findest, bekommst Du Deine -1000.
Und das für Alle Zeit, da Du die Such-Routine nicht zurück setzt.
Suche in der verwendeten Library, welchen Aufruf Du machen musst, um den ERSTEN Sensor zu finden.
(ggf. reicht ein .search(0) )
Äh - nö - bei Dir wird ein
ds.reset_search();
ausgeführt - Das sollte den Algorithmus wieder am Anfang beginnen lassen.

Das ist das Skretch ohne meinen Ultraschall und UDP Teil.. Wenn ich das alleine hochlade bekomme ich auch sekündlich meine Temperatur ?! :frowning:

#include <OneWire.h> 

int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2

//Temperature chip i/o
OneWire ds(DS18S20_Pin);  // on digital pin 2

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

void loop(void) {
  float temperature = getTemp();
  Serial.println(temperature);
  
  delay(1000); //just here to slow down the output so it is easier to read
  
}


float getTemp(){
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad

  
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }
  
  ds.reset_search();
  
  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
  
  return TemperatureSum;
  
}

So ist es besser lesbar.

Mein Tipp:
Strukturiere deinen Sketch gleich von Anfang an und verwende Funktionen für die einzelnen Bereiche die der Sketch abarbeitet.

  1. Temperatur messen
  2. Füllstand messen
  3. Anzeige der Daten.

Damit machst du dir vieles einfacher, auch eine spätere Fehlersuche.

Hallo Zusammen,

anbei mein sortierter Code.

Ich glaube ich habe auch nun herausgefunden woran es liegt. Irgendwann bekomme ich jede 5 Sekunden meinen richtigen Temperaturwert angezeigt. Derzeit bekomme ich nur ganz am Anfang meinen richten Wert, danach nur noch -1, welches darauf verweist, dass er keinen Sensor mehr findet. Ich denke, dass er trotzdem immer weiter sucht, und wenn er fertig ist dann irgendwann den richtigen hat. Dies dauert aber eine Weile.

Ich habe auch die Adresse des Sensors, welcher immer daran verbleiben soll. Könnt ihr mir helfen, dieses zu implementieren, sodass er nur noch von dem einen Sensor eine abfrage macht?

byte addr[8] = {0x28, 0xFF, 0xE1, 0x35, 0x73, 0x15, 0x01, 0xD0}

Meine derzeitige Ausgabe per serial.Print:

192.168.0.199
Ultraschall: 32.89 cm - Temperatur: 31.12 C°
Ultraschall: 33.35 cm - Temperatur: -1.00 C°
Ultraschall: 34.26 cm - Temperatur: -1.00 C°
Ultraschall: 34.74 cm - Temperatur: -1.00 C°
Ultraschall: 34.26 cm - Temperatur: -1.00 C°
Ultraschall: 33.35 cm - Temperatur: -1.00 C°
Ultraschall: 32.90 cm - Temperatur: -1.00 C°
Ultraschall: 32.94 cm - Temperatur: -1.00 C°
Ultraschall: 34.26 cm - Temperatur: -1.00 C°
Ultraschall: 33.35 cm - Temperatur: -1.00 C°
Ultraschall: 33.76 cm - Temperatur: -1.00 C°
Ultraschall: 33.33 cm - Temperatur: -1.00 C°
Ultraschall: 34.73 cm - Temperatur: -1.00 C°
Ultraschall: 33.85 cm - Temperatur: -1.00 C°
Ultraschall: 34.28 cm - Temperatur: -1.00 C°
Ultraschall: 34.28 cm - Temperatur: -1.00 C°
Ultraschall: 33.90 cm - Temperatur: -1.00 C°
Ultraschall: 33.83 cm - Temperatur: -1.00 C°
Ultraschall: 34.26 cm - Temperatur: -1.00 C°
Ultraschall: 33.80 cm - Temperatur: -1.00 C°
Ultraschall: 32.92 cm - Temperatur: -1.00 C°
Ultraschall: 33.85 cm - Temperatur: -1.00 C°
Ultraschall: 33.78 cm - Temperatur: -1.00 C°
Ultraschall: 33.78 cm - Temperatur: -1.00 C°
Ultraschall: 34.23 cm - Temperatur: -1.00 C°
Ultraschall: 33.85 cm - Temperatur: -1.00 C°
Ultraschall: 34.73 cm - Temperatur: -1.00 C°
Ultraschall: 33.85 cm - Temperatur: -1.00 C°
Ultraschall: 33.35 cm - Temperatur: -1.00 C°
Ultraschall: 33.83 cm - Temperatur: -1.00 C°
Ultraschall: 34.21 cm - Temperatur: -1.00 C°
Ultraschall: 33.37 cm - Temperatur: -1.00 C°
Ultraschall: 34.67 cm - Temperatur: -1.00 C°
Ultraschall: 32.90 cm - Temperatur: -1.00 C°
Ultraschall: 34.21 cm - Temperatur: -1.00 C°
Ultraschall: 33.35 cm - Temperatur: -1.00 C°
Ultraschall: 33.78 cm - Temperatur: -1.00 C°
Ultraschall: 34.24 cm - Temperatur: -1.00 C°
Ultraschall: 33.88 cm - Temperatur: -1.00 C°
Ultraschall: 32.92 cm - Temperatur: -1.00 C°
#include <UIPEthernet.h>
#include <OneWire.h>

//  byte addr[8] = {0x28, 0xFF, 0xE1, 0x35, 0x73, 0x15, 0x01, 0xD0};

OneWire  ds(2);

// Network Settings
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 199);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
#define UDP_TX_PACKET_MAX_SIZE 24

// Local UDP port to listen on
unsigned int localPort = 65001;

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

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

// Variablen
long dauer;
float distanz, temp;
char chardistance[10];
char chartemp[10];

// Recipient IP
IPAddress RecipientIP(192, 168, 0, 150);

// Recipient UDP Port
unsigned int RecipientPort = 65000;

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup(void)
{
  // start Ethernet und UDP
  delay(1000);
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  Serial.begin(9600);
  Serial.println(Ethernet.localIP());

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

}

void loop(void)
{
  float temp = getTemp();
  float distance = getDistanz();

  dtostrf(temp, 4, 1, chartemp); //Temp fuer UDP Versand umwandeln (1 steht fuer Nachkommastellen)
  dtostrf(distance, 4, 1, chardistance); //Distanz fuer UDP Versand umwandeln (1 steht fuer Nachkommastellen)

  Serial.print("Ultraschall: ");
  Serial.print(distanz);
  Serial.print(" cm - ");
  Serial.print("Temperatur: ");
  Serial.print(temp);
  Serial.println(" C°");
  Udp.beginPacket(RecipientIP, RecipientPort);
  Udp.write("Ultraschall "), Udp.write(chardistance), Udp.write("Temperatur "), Udp.write(chartemp);
  Udp.endPacket();

  delay(5000); // Wartet x Sekunden bis zur naechsten Messung, z.B. 5000 = 5 Sekunden */
}

float getTemp() {
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
//    no more sensors on chain, reset search
    ds.reset_search();
    return -1;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return -2;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
    Serial.print("Device is not recognized");
    return -3;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44); // start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);
  ds.write(0xBE); // Read Scratchpad


  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }

  ds.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;

}

float getDistanz() {
  // 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!");
  }
  return distanz;
}

Vielen lieben Dank!

Gruß

Hi

Ich denke, daß Dir das Array addr[8] in die Suppe spuckt.
Mache Dieses conststatic, dann wird Deine Suche funktionieren.

Im Moment erstellst Du bei jedem Funktionsaufruf ein Array addr[8] - Das ist mit beliebigen Daten gefüllt (beim allerersten Aufruf wohl mit /0en).
Beim 2.ten Aufruf steht 'irgendwas' in dem Array, die Routine finden Nichts und versucht, das Array auf Null zurück zu setzen.
Blöd, am Ende der Funktion ist das Array Geschichte.

Wenn Du eh nur einen Sensor hast, kannst Du auch SkipRom zur Temperatur-Abfrage benutzen - daraufhin reagieren ALLE angeschlossenen Sensoren - wenn's nur Einer ist, kann Der auch die korrekte Temperatur ausgeben.

MfG

Edit
const war totaler Humbug, Da gehört static hin -sowohl in den Satz, wie in den Sketch.
Siehe #17

Hi,

nochmal alles umgebaut und nun mit Dallas Biblio gearbeitet.. der selbe Fehler.. Irgendwas macht mir alles kaputt. Wenn ich nur die Temperatur-Sketche laufen lasse, funktioniert es doch?!

Will mir es offen lassen, vielleicht noch einen Temp-Sensor einzubauen...

Noch kurz zur Info. Nach ca. 5 Minuten werden mir normale Werte dauerhaft gesendet.

Viele Grüße

192.168.0.199
Ultraschall: 33.38 cm - Temperatur: 30.56 C°
Ultraschall: 32.94 cm - Temperatur: -127.00 C°
Ultraschall: 33.90 cm - Temperatur: -127.00 C°
Ultraschall: 33.80 cm - Temperatur: -127.00 C°
Ultraschall: 33.45 cm - Temperatur: -127.00 C°
Ultraschall: 32.99 cm - Temperatur: -127.00 C°
#include <UIPEthernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>

//  byte addr[8] = {0x28, 0xFF, 0xE1, 0x35, 0x73, 0x15, 0x01, 0xD0};

#define ONE_WIRE_BUS 2  //Sensor DS18B20 am digitalen Pin 2

OneWire oneWire(ONE_WIRE_BUS); //

//Übergabe der OnewWire Referenz zum kommunizieren mit dem Sensor.
DallasTemperature sensors(&oneWire);

int sensorCount;

// Network Settings
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 199);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
#define UDP_TX_PACKET_MAX_SIZE 24

// Local UDP port to listen on
unsigned int localPort = 65001;

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

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

// Variablen
long dauer;
float distanz, temp, TemperatureSum;
char chardistance[10];
char chartemp[10];

// Recipient IP
IPAddress RecipientIP(192, 168, 0, 150);

// Recipient UDP Port
unsigned int RecipientPort = 65000;

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup(void)
{
  // start Ethernet und UDP
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  Serial.begin(9600);
  Serial.println(Ethernet.localIP());
  
  sensors.begin(); //Starten der Kommunikation mit dem Sensor
  sensorCount = sensors.getDS18Count(); //Lesen der Anzahl der angeschlossenen Temperatursensoren.
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop(void)
{
  float temp = getTemp();
  float distance = getDistanz();

  dtostrf(temp, 4, 1, chartemp); //Temp fuer UDP Versand umwandeln (1 steht fuer Nachkommastellen)
  dtostrf(distance, 4, 1, chardistance); //Distanz fuer UDP Versand umwandeln (1 steht fuer Nachkommastellen)

  Serial.print("Ultraschall: ");
  Serial.print(distanz);
  Serial.print(" cm - ");
  Serial.print("Temperatur: ");
  Serial.print(temp);
  Serial.println(" C°");
  Udp.beginPacket(RecipientIP, RecipientPort);
  Udp.write("Ultraschall "), Udp.write(chardistance), Udp.write("Temperatur "), Udp.write(chartemp);
  Udp.endPacket();

  delay(5000); // Wartet x Sekunden bis zur naechsten Messung, z.B. 5000 = 5 Sekunden */
}
float getTemp() {
  if(sensorCount ==0){
    Serial.println("Es wurde kein Temperatursensor gefunden!");
    Serial.println("Bitte überprüfe deine Schaltung!");
    }
  //Es können mehr als 1 Temperatursensor am Datenbus angschlossen werden.
  //Anfordern der Temperaturwerte aller angeschlossenen Temperatursensoren.
 
 sensors.requestTemperatures(); 

 //Ausgabe aller Werte der angeschlossenen Temperatursensoren.
 for(int i=0;i<sensorCount;i++){ 
  TemperatureSum = sensors.getTempCByIndex(i);
 }
return TemperatureSum;
}

float getDistanz() {
  // 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!");
  }
  return distanz;
}

Steve1810:
....
Noch kurz zur Info. Nach ca. 5 Minuten werden mir normale Werte dauerhaft gesendet.
....

Und was passiert innerhalb der 5 Minuten ? Die -127 ?

Dann stimmt irgend etwas mit der Hardware nicht.
Einen Pullup-Widerstand hast du drauf ?

HotSystems:
Und was passiert innerhalb der 5 Minuten ? Die -127 ?

Dann stimmt irgend etwas mit der Hardware nicht.
Einen Pullup-Widerstand hast du drauf ?

Genau, - 127. Ja, 47k Ohm wie überall steht. Aber wie gesagt, wenn ich die Sketche nur mit Temperaturabfrage laufen lasse, dann bekomme ich dauerhaft Werte. Habe es seit dem Post vorhin laufen und bekomme Werte. Wenn es halt nicht anders geht, dann lasse ich es halt.. Solange ich nach 5 Minuten meine Werte bekomme.. Dachte es schaut jemand über den Code drüber und es fällt jemand direkt was auf. Vorallem dachte ich, dass es mit dem UDp Paketen senden schwierig wird

Steve1810:
Genau, - 127. Ja, 47k Ohm wie überall steht....

Das könnte dein Problem sein.

Wieso überall steht ?
Da gehören 4k7 Ohm ran, so wie ich es überall sehe.

Meine ich doch, sorry, Komma vergessen...

Steve1810:
Meine ich doch, sorry, Komma vergessen...

Ok....und was ist, wenn du die Übertragung zum ETH raus nimmst.
Da habe ich zu wenig Erfahrung, könnte aber auch der Grund sein.

Ich würde die in eine eigene Funktion einbauen und nur alle ca. 120 sek aufrufen.

HotSystems:
Ok....und was ist, wenn du die Übertragung zum ETH raus nimmst.
Da habe ich zu wenig Erfahrung, könnte aber auch der Grund sein.

Ich würde die in eine eigene Funktion einbauen und nur alle ca. 120 sek aufrufen.

Habe bei folgendes bei void loop gemacht

  • komplett udp kommentiert -> nichts
  • distanz über float distance kommentiert -> nichts
  • dtostrf kommentiert -> nichts.

Wie gesagt, dauert beim Stromausfall halt 5 Minuten bis richtige Werte geliefert werden, aber dann passt es (24 Stunden Test seit gestern).

Komisch ist das ganze aber trotzdem...

Gruß

Steve1810:
Komisch ist das ganze aber trotzdem...

Sehe ich auch so.
Da ich seit einigen Jahren auch mit den DS18B20 arbeite, weiß ich, dass es besser geht.

Aktuell habe ich eine Zirkulationspumpensteuerung mit den Sensoren gebaut. Während der Entwicklungszeit habe ich diese mehrfach an und abgesteckt und beim Anstecken waren die Messdaten sofort (nach ca. 1 Sek) sichtbar, ohne eine weitere Verzögerung.

Somit kann ich mir dein Problem nicht erklären.

HotSystems:
Somit kann ich mir dein Problem nicht erklären.

Ja, vorallem funktioniert das Skretch nur als Temperaturmessung sofort... Verstehe nicht was er macht.. Für mich aber trotzdem ausreichend, das Ding kommt in die Zisterne und läuft immer, da der POE Switch über eine USV angeschlossen ist und der Arduino Strom über ein POE-Netzteil bekommt :slight_smile:

postmaster-ino:
Ich denke, daß Dir das Array addr[8] in die Suppe spuckt.
Mache Dieses const, dann wird Deine Suche funktionieren.

Meinst du static? Das ist etwas ganz anderes als const

Ohne static steht da schon beim ersten Aufruf etwas willkürliches drinn

Hi

Klar meinte ich static ... wie kam ich auf const?
Beim ersten Aufruf kann es Dir nur passieren, daß 'kein weiterer Sensor' gefunden wird - dann gibt's ein Reset und die Adresse beginnt bei Null.
Spätestens in der nächsten Runde findest Du Deinen Sensor.

Theoretisch müsste der Sketch dann alle zwei Durchläufe den Sensor finden und eben alle zwei Durchläufe 'keinen weiteren Sensor'.

Mit lokalem Array steht Da eh immer 'irgendwas' drin und die durch die neue Suche darin gespeicherte neue Adresse geht mit dem Ende der Funktion wieder verloren.

Wieso der Sketch aber die ersten Minuten nicht funktioniert (denke, keinen Sensor findet), danach aber durchgehend (also immer wieder den Sensor findet), ist mir schleierhaft.

MfG