[Gelöst]Temperatur auf Website anzeigen

Hallo allerseits,
ich als Anfänger, habe nochmal eine Verständnis Frage.
Also, ich versuche einen DS18B20 Temperaturfühler auszulesen (was mit Serial-Monitor auch klappt) und auf eine Webseite die Temperatur anzuzeigen.

Aber irgendwie verstehe ich da was nicht. Vieleicht kann sich jemand den Code anschauen und mir sagen wo der Fehler liegt.
Die Fehlermeldung beim Kompilieren ist folgende:

DS18B20_SUPER.cpp: In function 'void loop()':
DS18B20_SUPER:73: error: 'getTemperatur' was not declared in this scope
DS18B20_SUPER:73: error: expected `;' before ')' token
DS18B20_SUPER:79: error: a function-definition is not allowed here before '{' token

Also ich habe vorher beide Sketche einzeln getestet, den zum Auslesen des DS18B20 und den Ethernet.
Und beim zusammen fügen, verseteh ich wohl was nicht.
Ich würde mich freuen,wenn jemand mir sagen könnte, wo der Fehler liegt und wie man den behebt bzw. warum da eine Fehlermeldung kommt.

Hier der Sketch:

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>

byte mac[] = { 0xDE, 0xAD, 0xED, 0xEF, 0xFE, 0xBE };
byte ip[] = { 192, 168, 178, 216 }; // IP vom Arduino im Netzwerk
byte gateway[] = { 192, 168, 178, 1 };
byte subnet[] = { 255, 255, 255, 0 };

EthernetServer server(80);

float Temperatur;

// Data wire is plugged into pin 6 on the Arduino
#define ONE_WIRE_BUS 6

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
nics.com/Tutorials/arduino-1-wire-address-finder.html

DeviceAddress insideThermometer = { 0x28, 0x03, 0xF6, 0xC2, 0x03, 0x00, 0x00, 0xA7 };

void setup(void){
 // initialize the ethernet device
  Ethernet.begin(mac, ip);//, gateway, subnet);
  // start listening for clients
  server.begin();
  
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(insideThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    //Serial.print(" F: ");
    //Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop(void)
{
  EthernetClient client = server.available();
  if (client) {
    server.print("HTTP/1.0 200 OK\r\nServer: arduino\r\nContent-Type: text/html\r\n\r\n");
    server.print("<HTML><HEAD><TITLE>");
    server.print("Arduino Temperature");
    server.print("</TITLE>");
    server.print("<meta http-equiv='refresh' content='60'>");
    server.print("</HEAD><BODY>");
    server.print(getTemperatur));
    server.print("&deg;C");
    server.print("</BODY></HTML>");    
    delay(10);
    client.stop();//close the connection with the client
  }
float getTemperatur() {
  
  delay(5000);
  Serial.print("Getting temperatures...\n\r");
  sensors.requestTemperatures();
 
  Serial.print("Inside temperature is: ");
  printTemperature(insideThermometer);
  Serial.print("\n\r");
} 
}

Vielen Dank für eure Hilfe

PS: Ich nutze die Arduino 1.0

Hallo Cetax,

versuche es mal mit einer Geschweiften Klammer mehr:

  client.stop();//close the connection with the client
  }
}
float getTemperatur() {

Deshalb wird die Funktion "getTemperature" nicht als solches erkannt und auch die Loop() als fehlerhaft ausgewiesen.

Nicht eine Klammer zuviel, vielmehr ist die Funktion getTemperatur() nur innerhalb von loop() deklariert.
Denn unter der schliessenden Klammer der Funktion ist wieder eine zusätzliche Klammer zuviel.

Einfach die Deklaration der Funktion aus der "umschliessenden" Klammerung von loop() herausbewegen, dann sollte es passen.

Mario.

Und außerdem fehlt 'ne "Klammer zu": statt

server.print(getTemperatur));

so:

server.print (getTemperatur ());

viele Grüße
Andreas

was macht diese Zeile im Code?

nics.com/Tutorials/arduino-1-wire-address-finder.html

die Funktion float getTemperatur() sollte einen Wert zurückgeben, tut sie aber nicht. Return hilft da weiter.

Muss man die Escapes in "HTTP/1.0 200 OK\r\nServer: arduino\r\nContent-Type: text/html\r\n\r\n" nicht ebenfalls escapen?

Das denke ich nicht, aber sollte das "server.print()" nicht ein "client.print()" sein? Denn eigentlich willst Du ja dem Client der sich mit Deinem Server verbunden hat die Daten schicken.

Hallo liebe HELFERLEIN :wink:

Also, ich habe versucht alle Eure Hilfen einzubauen, was auch teilweise geklappt hat.
Ich bekomme jetzt keine Fehlermeldung beim Compilieren, ABER.. :~
Ich sehe auf der Website ein 0.00 °C
Wenn ich den SerialMonitor anmache, sehe ich die Temperatur.
Ich weiß nicht weiter und verstehe nun garnix mehr.
Wieso zeigt es mir auf der Website nicht die Temperatur an ?
Was liest er denn aus ? Bzw. liest er überhaupt was aus ?
Wie gesagt Serial kann ich was sehen. Vieleicht kann nochmal jemand drauf schauen... =(

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
byte mac[] = { 
  0xDE, 0xAD, 0xED, 0xEF, 0xFE, 0xBE };
byte ip[] = { 
  192, 168, 178, 216 }; // IP vom Arduino im Netzwerk
byte gateway[] = { 
  192, 168, 178, 1 };
byte subnet[] = { 
  255, 255, 255, 0 };

EthernetServer server(80);

// Data wire is plugged into pin 6 on the Arduino
#define ONE_WIRE_BUS 6

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

DeviceAddress insideThermometer = { 
  0x28, 0x03, 0xF6, 0xC2, 0x03, 0x00, 0x00, 0xA7 };
float tempinsideThermometer;

void setup(void){
  // initialize the ethernet device
  Ethernet.begin(mac, ip);//, gateway, subnet);
  // start listening for clients
  server.begin();

  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(insideThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } 
  else {
    Serial.print("C: ");
    Serial.print(tempC);
  }
}

void loop(void)
{
  delay(5000);
  Serial.print("Getting temperatures...\n\r");
  sensors.requestTemperatures();

  Serial.print("Inside temperature is: ");
  printTemperature(insideThermometer);
  Serial.print("\n\r");

  EthernetClient client = server.available();
  if (client) {
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println();
    client.println("<html><head>");
    client.println("<meta http-equiv='refresh' content='60'>");
    client.println("<title>Arduino Webserver</title>");
    client.println("</head>");
    client.println("<body>");
    client.println(tempinsideThermometer);
    client.println("&deg;C");
    client.println("</BODY></HTML>");    
    delay(10);
    client.stop();//close the connection with the client
  }
}

Danke Euch für die Hilfe bis jetzt !! THANKS

weil die Variable "tempinsideThermometer" leer bzw. nicht gesetzt ist. Ich hab zumindest beim schnellen durchkucken nix gefunde, wo sie gesetzt wird.

Hi,

Ok, klingt ein bischen Einleuchtend, aber wie kriege ich denn jetzt das richtige da rein?
Wenn ich das richtig verstehe ist der fehler hier:

float tempinsideThermometer;

Aber wie bzw. was schreibe ich denn in die Variable rein, damit er die Temperatur anzeigt ?
Wie gesagt, ich bin mit meinem Anfänger-Latain am Ende...

Dein Code ist auch alles andere als übersichtlich... der Code ist sowas von unübersichtlich, dass es schlimmer nicht geht. Wenn du Methoden erstellst, benutze am besten das EVA-Prinzip (Eingabe-Verarbeitung-Ausgabe) und lass die jeweilige methode dann auch nur diesen Schritt ausführen. Wenn du möchtest bastel ich dir kurz etwas in der richtung

Wäre super,
vieleicht verstehe ich das dann besser.
Sorry für den unübersichtlichen Code, habe versucht 2 funktionierende Sketche zusammen zu packen.. :roll_eyes:

Ok, habs hin bekommen. :wink:

Ich glaube auch verstanden zuhaben was du meinst.
Ich habe jetzt folgendes geändert im Code:

float tempinsideThermometer;
...
void loop(void)
{
  delay(5000);
  Serial.print("Getting temperatures...\n\r");
  sensors.requestTemperatures();
  tempinsideThermometer = sensors.getTempC(insideThermometer);

Mit diesen beiden Zeilen hat es geklappt:

sensors.requestTemperatures();
tempinsideThermometer = sensors.getTempC(insideThermometer);

Ich musste sozusagen, "float tempinsideThermometer;" sagen, wo er seine Temperatur herbekommt (tempinsideThermometer = sensors.getTempC(insideThermometer); )
Oder ist das jetzt falsch?

absolut korrekt. setzen XD

Super Danke für die Hilfe... :grin: