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.... ![]()
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;
}