Pages: [1]   Go Down
Author Topic: [Gelöst]Temperatur auf Website anzeigen  (Read 1730 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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:
Code:
#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
« Last Edit: April 13, 2012, 07:20:10 am by Cetax » Logged

*greatz*

 CeTax

www dot blinkmann dot de


Germany
Offline Offline
Full Member
***
Karma: 1
Posts: 130
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Cetax,

versuche es mal mit einer Geschweiften Klammer mehr:
Code:
  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.
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Hannover, Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
server.print(getTemperatur));

so:

Code:
server.print (getTemperatur ());

viele Grüße
Andreas
Logged

http://danimathblog.blogspot.com

#define true '/'/'/'
#define false '-'-'-'

Offline Offline
Full Member
***
Karma: 3
Posts: 138
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

was macht diese Zeile im Code?
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.
Logged

duemilanove / OSX & WIN
Arduino & Teensy: http://bit.ly/13rbdtQ

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged


Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo liebe HELFERLEIN  smiley-wink

Also, ich habe versucht alle Eure Hilfen einzubauen, was auch teilweise geklappt hat.
Ich bekomme jetzt keine Fehlermeldung beim Compilieren, ABER..   smiley-confuse
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...  smiley-cry

Code:
#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*
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

weil die Variable "tempinsideThermometer" leer bzw. nicht gesetzt ist. Ich hab zumindest beim schnellen durchkucken nix gefunde, wo sie gesetzt wird.
Ok, klingt ein bischen Einleuchtend, aber wie kriege ich denn jetzt das richtige da rein?
Wenn ich das richtig verstehe ist der fehler hier:
Code:
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...
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

*greatz*

 CeTax

www dot blinkmann dot de


Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, habs hin bekommen.  smiley-wink

Ich glaube auch verstanden zuhaben was du meinst.
Ich habe jetzt folgendes geändert im Code:
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?
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

absolut korrekt. setzen  smiley-lol
Logged


Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Super Danke für die Hilfe...  smiley-mr-green
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Pages: [1]   Go Up
Jump to: