Go Down

Topic: [gelöst] Temperatur Logger, mit DS18B20 (Read 7863 times) previous topic - next topic

mkl0815

Keine Panik, das wird schon. Immer schön einen Schritt nach dem anderen.
Als erstes kannst Du ja das PHP Script auf dem NAS entwickeln. Das es macht was es soll, kannst Du ja erstmal mit einem Browser testen. Wenn das klappt, ist dann der Arduino dran mit senden.
Das zunächst nur mit festen Daten und wenn das dann klappt, kommen die gemessenen Werte dran.
Und wenn es Fragen gibt, dann sind wir hier ja auch noch da.

Cetax

#31
Apr 20, 2012, 11:15 pm Last Edit: Apr 20, 2012, 11:30 pm by Cetax Reason: 1
Hi,
ich habe es genau andersrum gemacht  :smiley-red:
Ich habe mich am Arduino versucht, also er liest die Temperatur und gibt sie Serial aus.
Hier der funktionierende Sketch bis jetzt:
Code: [Select]
/*
 Web client
 This sketch connects to my Diskstation 192.168.178.111
 and send the Themperature from DS18B20 at DigiPin 6 to it

 created 20 April 2012
*/

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 6          // DS18B20 an Pin 6 angeschlossen

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Fuehler1 = { 0x28, 0x65, 0x35, 0xC3, 0x03, 0x00, 0x00, 0x35 };  //Adressen der Sensoren manuell eingeben

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0xEE, 0xF3 }; // Mac-Adresse Arduino Ethernet
byte ip[] = {192,168,178,230}; // IP-Adresse Arduino Ethernet
byte gateway[] = {192,168,178,1}; // Gateway (Fritzbox)
byte subnet[] = {255,255,255,0};
IPAddress server(192,168,178,111); // Diskstation DS111
char host[] = "192.168.178.111\n";

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

char url[]  = "/senddata.php"; // Pfad zur PHP-Datei eingeben
char c;

int Sensor = 6;            // DS18B20 an DigitalPin 6
int ledPIN = 5;           // Power LED DigitalPin5
float temp1 = 0;         // Variable für Temperatur
         

void setup()
{
 Serial.begin(9600);  
 sensors.begin();
 sensors.setResolution(Fuehler1, 9);
 
 pinMode(ledPIN, OUTPUT);
 Ethernet.begin(mac, ip, gateway, subnet);       // starte Ethernet
// delay(1000);                                    // warten auf Ethernet
// Serial.println("verbinde...");                  // Ausgabe(n) auf serieller Konsole
// if (client.connect(server, 80))                  // wenn Verbindungsversuch erfolgreich ...
// {
// Serial.println("verbunden");                  // Ausgabe(n) auf serieller Konsole
// client.print("GET /senddata.php?Fuehler1=");     // schicke Temperatur zum Server
// client.print(temp1);
// client.print(" HTTP/1.0\n");
//  client.println("Host: 192.168.178.111\n");
//  client.println();                             // schicke Leerzeile (beende Anfrage)
// }
// else                                             // sonst, wenn Verbindung fehlgeschlagen, ...
// {
//  Serial.println("Verbindung fehlgeschlagen"); // Fehlermeldung auf Konsole
// }
//  if (client.available())
// {
//   char c = client.read();
//   Serial.print(c);
// }
// delay(899000);
// client.stop();
// client.flush();
}

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()
{
 
   Sensor_lesen();
   //Daten_senden();
   delay(10000);
}

void Sensor_lesen()
{
 sensors.requestTemperatures();
 //float temp1 = sensors.getTempC(Fuehler1);
 Serial.print("Temperatur: ");
 printTemperature(Fuehler1);
 Serial.print("C");
 Serial.print("\n\r");
}

/*void Daten_senden()
{
   Serial.print("Verbunden...sende Daten...");
   client.print("GET ");
   client.print(url);
   client.print("?Fuehler1=");
   client.print(temp1);
   client.println(" HTTP/1.1");
   client.println();
   Serial.println("fertig!");
 }
 */

Alles andere habe ich erstmal auskommentiert, da ich nicht weiß, was ich in die PHP-Datei schreiben soll.
Ich habe zwar schon mal was mit PHP gemacht, aber noch nie irgendwas von einem anderen Rechner abgefragt oderso. Da hab ich null Ahnung (Aber davon ganz viel  :smiley-mr-green:)
Code: [Select]

<?php
$_GET
["Fuehler1"]; // Temperatur von Fuehler 1
$dateiname "log.txt"// Name der Log-Datei
// Datei öffnen, wenn nicht vorhanden dann wird die Datei erstellt.
$handler fOpen($dateiname "a+");
// Dateiinhalt in die Datei schreiben
fWrite($handler $GET); // <-- Ist das richtig ?
fClose($handler); // Datei schließen
?>


Is ne Idee, keine Ahnung ob das richtig ist  :(
Wird die Temperatur denn so übergeben? GET sollte doch richtig sein, oder?
*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

Der PHP Code ist schon mal ein Anfang. Zwei Dinge würde ich ändern:
Code: [Select]

<?php
$data 
$_GET["Fuehler1"]; // Temperatur von Fuehler 1 nach $data; nicht zwingend notwendig, aber übersichtlicher.
$dateiname "log.txt"// Name der Log-Datei (ggf. "/volume1/.../log.txt
// Datei öffnen, wenn nicht vorhanden dann wird die Datei erstellt.
$handler fopen($dateiname "a+");
if(
$handler) {
    
// Dateiinhalt in die Datei schreiben
    
fputs($handler time().";$data\n"); // Unix-Timestamp; $data + Zeilenumbruch schreiben
    
fclose($handler); // Datei schließen
}
?>


Damit sollte es erstmal klappen. Beim Dateinamen musst Du evtl. noch einen passenden Pfadmit angeben. Kommt drauf an, wo der Webserver auf Deinem NAS schreiben darf.
Idealerweise schreibst Du die Daten in ein Verzeichnis, das vom NAS exportiert wird, dann kannst Du direkt auf die Datei von Deinem PC aus zugreifen.
Mario.

Cetax

Hallo Mario,
erstmal VIELEN DANK für die tolle Hilfe!!! :D
Es funktioniert !!!  XD

Der Arduino sende die Temperatur an meine Diskstaion und die speichert die Temperatur mit dem Datum und Uhrzeit. Klasse. Jetzt mache ich noch ein bischen feintuning...  ;)

Ich werde den Sketch noch Kommentieren und dann hier Posten.
Bei bedarf kann ich den auch jetzt schon Posten...

Also, vielen Dank an Mario aka mkl0815 und thewknd.
*greatz*

 CeTax

www dot blinkmann dot de

Cetax

#34
Apr 22, 2012, 01:23 pm Last Edit: Apr 22, 2012, 01:30 pm by Cetax Reason: 1
Hallo,
so habe mal versucht den Sketch zu Kommentieren,
ich hoffe das ist OK so und verständlich.  :)

Die Idee war folgende:
DS18B20 --> Arduino Ethernet -->LAN-Kabel --> WebServer

Soll heißen, der Arduino misst die Temperatur und schickt sie zum Webserver,
der speichert die Temperatur mittels PHP-Script in einer Text-Datei (z.b. Log.txt) ab.
Und kann dann weiter verarbeitet werden, z.b. für Visuelle Dartsellungen usw.

Ich möchte an dieser stelle nochmal ein Dankeschön sagen, für die tolle Unterstützung hier im Forum !

Hier der Sketch:
http://www.file-upload.net/download-4292336/Temperatur_WebClient.ino.html
*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

#35
Apr 22, 2012, 05:25 pm Last Edit: Apr 22, 2012, 05:33 pm by mkl0815 Reason: 1
Ich habe mir den fertigen Sketch mal angesehen und mir fallen dabei eingige Dinge auf.

1) Du verwendest zwei Funktionden Sensor_lesen() und Daten_senden(), das finde ich gut, weil es das Programm übersichtlich macht. Aber warum liest Du im Daten_senden() den Sensor nochmal aus? Damit schickst Du an den Webserver ggf. eine andere Temperatur, als Du über Sensor_lesen() über die serielle Schnittstelle ausgegeben hast.

2). Daten_senden() verschickt die Daten an den Webserver. Im loop() gibt es aber nochmal Code der sich mit dem Webserver verbindet. Der allerdings nichts weiter macht  als ein Zeichen aus der Verbindung zu lesen und dann 30 Sekunden bei offener Verbidung zu warten. Das ist nicht nur sinnlos, sondern auch "gemein" gegenüber dem Webserver, da Du eine offene Verbdindung blockierst. In Deinem Fall ist das wurscht, aber kein guter Stil. Stell Dir vor Du baust damit einen öffentlichen Webservice, wo alle Arduinouser dieser Welt Ihre Daten hinloggen dürfen. Und alle würden ihre Verbindung unnötigerweise 30 Sekunden offen halten, dann hast Du einen selbst gebauten Denial of Service Angriff.

3) Auch die Funktion printTemperature() liest den Sensor nochmal aus. Damit ist das die dritte Stelle im Code, die das macht. Hier würde ich viel mehr aufräumen.

- Eine Funktion die den Sensor ausliest und die globale Variable temp1 setzt. Gleichzeitig kannst Du eine globale Variable "boolean messenOK" einführen, die von Sensor_lesen() immer gesetzt wird. TRUE wenn das Messen erfolgreich war, und FALSE wenn nicht.

- printTemperature() gibt den Wert der in temp1 steht nach Serial aus, aber ohne selbst zu messen. Ist "messenOK" gleich FALSE wird eine Fehlermeldung ausgegeben. Gleichzeitig kannst Du z.B. noch eine rote LED einschalten, die dann den Fehler signalisiert.

- Daten_senden() schreibt die Daten an den Webserver, aber auch wieder ohne selbst zu messen. Auch hier kannst Du z.b. den Fehler mit an den Webserver melden.

Beim Schreiben auf den Webserver kannst Du Dir folgenden Code sparen:

Code: [Select]

 if (client.available())
{
  char c = client.read();
  Serial.print(c);
}

Außer Du willst tatsächlich etwas vom Webserver lesen.

In Daten_senden() würde ich auch noch ein client.close() einbauen, das ist besserer Stil (siehe oben - offene Verbindungen).

Ansonsten ist es doch eine runde Lösung geworden.
Mario.

Cetax

Hallo Mario,
oh ok, werde ich mir mal alles anschauen.
Ich denke aber, das ich da vieleicht nochmal deine Hilfe in anspruch nehemen muss...  :smiley-roll:

*greatz*

 CeTax

www dot blinkmann dot de

Go Up