Temps über Lan anzeigen lassen

Halli hallo,

ein Neuling braucht Hilfe. Nämlich ich.
Seit längeren benutze ich einen Arduino Uno und DS18b20 Tempsensoren zum auslesen meiner Temps der Heizung.
Ich habe bis jetzt einen Rechner im Keller laufen lassen und über seriellmonitor ausgelesen.
Jetzt muss der Rechner aber weg und ich möchte das die Temps über das Ethernetshield in mein Netzwerk übertragen werden.
So, nun das Problem: ich hab keine Ahnung.
Im Moment benutze ich diesen Code zum auslesen über seriell:
Gibts da was einfaches? Was wo jeder hinkriegt? Ich auch?
Habt schonmal Dank.

iselein

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire ds(10); // onpin 10

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

void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;

if ( !ds.search(addr)) {
Serial.println(“No more addresses.”);
Serial.println();
ds.reset_search();
delay(250);
return;
}

Serial.print(“ROM =”);
for( i = 0; i < 8; i++) {
Serial.write(’ ');
Serial.print(addr*, HEX);*

  • }*

  • if (OneWire::crc8(addr, 7) != addr[7]) {*

  • Serial.println(“CRC is not valid!”);*

  • return;*

  • }*

  • Serial.println();*

  • // the first ROM byte indicates which chip*

  • switch (addr[0]) {*

  • case 0x10:*

  • Serial.println(" Chip = DS18S20"); // or old DS1820*

  • type_s = 1;*

  • break;*

  • case 0x28:*

  • Serial.println(" Chip = DS18B20");*

  • type_s = 0;*

  • break;*

  • case 0x22:*

  • Serial.println(" Chip = DS1822");*

  • type_s = 0;*

  • break;*

  • default:*

  • Serial.println(“Device is not a DS18x20 family device.”);*

  • return;*

  • }*

  • ds.reset();*

  • ds.select(addr);*

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

  • delay(1000); // maybe 750ms is enough, maybe not*

  • // we might do a ds.depower() here, but the reset will take care of it.*

  • present = ds.reset();*

  • ds.select(addr); *

  • ds.write(0xBE); // Read Scratchpad*

  • Serial.print(" Data = ");*

  • Serial.print(present,HEX);*

  • Serial.print(" ");*

  • for ( i = 0; i < 9; i++) { // we need 9 bytes*
    _ data = ds.read();_
    _ Serial.print(data*, HEX);
    Serial.print(" “);
    }
    Serial.print(” CRC=");
    Serial.print(OneWire::crc8(data, 8), HEX);
    Serial.println();
    // convert the data to actual temperature*
    * unsigned int raw = (data[1] << 8) | data[0];_
    if (type_s) {
    _ raw = raw << 3; // 9 bit resolution default*
    * if (data[7] == 0x10) {
    // count remain gives full 12 bit resolution*
    * raw = (raw & 0xFFF0) + 12 - data[6];
    }
    } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms*
    * else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms*
    * else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms*
    * // default is 12 bit resolution, 750 ms conversion time*
    * }
    celsius = (float)raw / 16.0;
    fahrenheit = celsius * 1.8 + 32.0;
    Serial.print(" Temperature = “);
    Serial.print(celsius);
    Serial.print(” Celsius, ");
    }*_

Hi,
Ich würde erstmal die Lib DallasTemperature.h in Verbindung mit der onewire auch wirklich nutzen.

// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

Etwa so:

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2

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

Den Rest kannst du dir aus den Examples von DallasTemperature rauslesen.

Zu deiner Kernfrage:
Mit dem Ethernetshield ist es möglich einen kleinen Webserver zu bauen der dir die Temperaturen anzeigt.

Die Ethernet Lib nimmt dir zwar vieles ab, aber du must bereit sein dich mit HTML zu befassen.
Und auch was die Browser so als Antwort erwarten wenn diese eine Anfrage an den Server (Arduino) stellen.
Es gibt auch hier etliche Beispielecodes, wie so etwas ausschauen sollte.

Von der Hardwareseite aus gesehen, wird der Ram des UNO schnell aufgebraucht sein.
Denn die komplette Website ist im Normalfall dort gespeichert.
Es gibt zwar Tricks das Meiste davon im Flash zu speichern oder auch auf der SD Karte, hat aber auch Nachteile.

Ob das ganze einfach ist ? , das ist relativ. bzw ich überlasse die Antwort dir.
Je nach dem ob du bereit bist dich in das Projekt reinzuhängen - ein “Selbstläufer” wird es nicht werden.

Es sei denn es kommt einer der dir einen fertigen Code prä­sen­tie­rt :wink: ich kenn da einen hier :zipper_mouth_face:

Grüße Rudi

Hi

also um einen oder mehrere Werte über eine Webseite vom Aduino anzuzeigen braucht es nicht viel. Es sei denn, man will noch dynamisch filtern etc.

Einfachster html code zum anzeigen eines Wertes:

Wert=xyz

Wenn es mehr html code werden sollte, dann speichert man diesen am besten im ROM mit Platzhaltern für variable Daten:

Wert=%i

und gibt das dann mit printf aus.

Ich meine die Ethernet-Lib kommt auch mit einem einfachen Beispiel für einen Webserver. Viel mehr braucht es dann nicht.

~josef

Hoi,
wäre Bluetooth eine Alternative ?
Das ist billig und schnell machbar.

Alsoooooooooo,

danke erstmal für eure Mühe.
Da ich ja echt keine Ahnung habe und ich nur die Beispielcodes nehmen kann hab ich mal den Webserver getestet.
Da werden die analogen Pins dann angezeigt. Kann mann da nicht den Code von den Tempsensoren reinpacken?
Ich würds ja machen wenn ich ne Ahnung hätte, aber leider bin ich nur Handwerker.
Die mit dem Hirn, die seit ihr. lol.
Ich will ja nur meinen Rechner vom Keller weghaben. Stromkosten sind ja auch nicht unerheblich.
Müsste aber über Netzwerk LAN sein, da ich 3 Stockwerke überbrücken will.
Falls es nicht geht, hab ich halt Pech gehabt.
Danke an alle schonmal

Da ich ja echt keine Ahnung habe und ich nur die Beispielcodes nehmen kann hab ich mal den Webserver getestet.
Da werden die analogen Pins dann angezeigt. Kann mann da nicht den Code von den Tempsensoren reinpacken?

Stimmt, ich habe mal versucht dem Webserver Beispielcode zu verändern.
Ist normalerweise nicht so mein Ding, da ich auch noch in der Lernphase bin und zudem den Code nicht testen kann.

Ip Adresse must du anpassen und const int MaxSensors=1; auch.
Gezählt wird ab der 0. MaxSensors=1 heißt also das du zwei Sensoren hast.

Teste mal, wie gesagt der Code kann Spuren von Fehlern enthalten, also nicht “hauen” wenn es nicht gleich funktioniert :wink:

dswebserver.ino (3.13 KB)

Also IP Adresse hab ich geändert.
Code auf Arduino drauf, nix geht.
Seriell Monitor zeigt mir auch nichts an.
Irgend ein kleiner Fehler?
Meistens sitzt der Fehler vor dem Monitor.............verdammt, da sitz ja ich.

Hast du den orginal Webserver Beispielcode mit Seriell Monitor Ausgaben und Zugriff via Browser zum Laufen gebracht ?
Ich habe den heute quasi 1:1 in den Test Sketch mit kleinen Änderungen kopiert.

Damit du am Seriell Monitor was sehen kannst must du mit dem Browser auf den Arduino gehen.

Ps:
Wie schon gesagt, es kann schon sein das ich einen Fehler eingebaut habe.
Mit dem Browser solltest du aber auf den Arduino kommen, kommt aber auch wieder drauf an wie dein Lan auschaut.
Mit DHCP oder ohne ?
Versuche erstmal den Orginal Webserver Beispielcode zum Laufen zu bekommen.

Also der Original Webserver Code läuft.
Wenn ich dann im Browser die IP eingebe die im Code steht,
sehe ich die analogen Pins.
Mein LAN schaut folgendermaßen aus:

Arduino 192.168.1.177
über
Fritzbox 192.168.1.254
auf
PC 192.168.1.3

Subnetz 255.255.255.0

DHCP ist auf der Fritzbox aktiviert, hat aber denk ich nix zu sagen,
da meine ganzen Endgeräte feste IP`s haben.

Und bei meinem Code mit Anpassung der Ip geht nichts ? - keine Anzeige im Browser und keine Serial Ausgabe.

Muss aber jetzt weg - sorry.
Bleibe aber dran - morgen gehts weiter.

Ps:
Wenn ich die Hardware vor mir habe bekomme ich es meist auf die Reihe.
Ich bin eben kein jurs beim dem die Sourcecodes out of the box laufen :blush:

http://dhmaster.no-ip.biz/
Soll es so etwas in dieser Richtung sein?
Den Code dazu habe ich früher mal gepostet. Ist ja schon über zwei Jahre her.
Muss ich mal nach schauen.

Hier:
http://forum.arduino.cc/index.php?topic=30539.0

Gruß
Der Dani

Hi,
Das hier sollte laufen, ich habe zumindest die HTML-Ausgabe getestet.
Ob die Sensoren was anzeigen musst du testen, ich habe keine DS18b20 an meinem Board dran.
So aus der Hüfte geschossen laufen meine Codes meist nie, da ich oft Fehler einbaue weil mir die Erfahrung einfach fehlt.
Daher mache ich sowas ganz gerne, um etwas Routine zu bekommen.

Ist halt eine ganz simple HTML Seite.

Wenn volvodani was schickes mit google charts hat, dann nimm das. :slight_smile:
Mit den google charts kann man viel machen, meine Wetterstation arbeitet auch damit

Also guten Rutsch und frohes neues Jahr.

dswebserver.ino (3.27 KB)

Wenn ich den neuen Sketch mit arduino 1.0.5 öffne kommt gar kein Code?
Hoffentlich bin nicht ich schuld dran...........
Immer bin ich schuld, sagt meine Frau jedenfalls

Also, wenn Du die neue IDE 1.5.4 benutzt erscheint dies:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <Ethernet.h>
#define ONE_WIRE_BUS 10

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192,168,1,177};

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);





const int MaxSensors=1;
float temp[MaxSensors]; 
unsigned long start=0;  


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

void setup()
{
 
  
  
Serial.begin(9600);  
sensors.begin();
sensors.setWaitForConversion(false); 
Ethernet.begin(mac, ip);
server.begin();  
 
 
 
  
}  


void read_sensors()
{
  
 unsigned long Millis = millis(); 
if  (Millis - start > 1000) { //jede Sekunde anstoßen
             start = Millis;                              
               sensors.setWaitForConversion(false);  // makes it async
                sensors.requestTemperatures();
} 
            
  
 if  (sensors.getCheckForConversion())     
                {
          for (byte index=0;index<=MaxSensors;index++) 
                   {
                    temp[index]=sensors.getTempCByIndex(index); 
                   }
 
               }  
  
 
}  

void showsensors(EthernetClient cl)
{
for (int sensor = 0; sensor <= MaxSensors; sensor++) {
             cl.print("Temparatur Sensor ");
            cl.print(sensor);
            cl.print(" is ");
            cl.print(temp[sensor]);
            cl.println("
");       
          }  
  
  
  
}  


void showhtml()
{
 // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
	  client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<body>");
          // output the value of each analog input pin
          showsensors(client);
          client.println("</body>");
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }  
  
  
  
  
}  

void loop()
{
read_sensors();
showhtml();
                                     
                                      
}

So, und jetzt will ich dieses Jahr nix mehr von Dir hören :wink:

Einen schönen guten Morgen und ein frohes, gesundes und erfolgreiches neues Jahr wünsch ich euch.
Ich hoffe ihr seid gut und gesund im neuen angekommen.
Also Sketch getestet. Keine Serielle Ausgabe, keine Webserver Ausgabe.
Meine Verkabelung passt alles. Mit Code vom Webserverbeispiel und
Tempsensoren über seriell gehen auch.
Nur der neue Sketch funzt noch nicht so ganz.

Mach mal zum Testen das;

void loop()
{
// read_sensors();
showhtml();                                
                                      
}

Dann sollte die Website kommen.
vermute das read_sensors() die loop blockiert. :~
Im Gegensatz zum Temp Beipielcode verwende ich die DallasTemperature.h.
Ich habe als 433 mhz Datensender einen UNO mit diesen DS Sensoren und DallasTemperature und der Code den du jetzt hast in diesem Teil fast der gleiche. Dort funktioniert dies einwandfrei.

Einen Verdacht habe ich, denn bei meinem UNO Daten Sender Projekt verwende ich zum Timeing nicht die millis() Funktion.
Weil ich dort noch einige Andere Dinge mache nehme ich Timer2 auch zum Sekunden Timeing von sensors.requestTemperatures();
Wenn nun DallasTemperature.h auch den Timer0 benutzt wie millis() lässt sich das erklären.

Muß noch nachsehen ob das wirklich so ist, wenn das wirklich so ist schicke ich dir den Code ohne Nutzung von millis()

Ok, ich habe im Anhang den Code mit Timer2 - sollte jetzt laufen.
Die Led im UNO sollte im Sekundentakt blinken.

Nachtrag:
Ich habe festgestellt, daß es einen enormen Unterschied macht, ob man Code mit oder ohne Testumgebung schreibt.
Selbst wenn es jetzt funktioniert lasse ich es vorerst sein.
Schuster bleib bei deinen Leisten :blush:

dswebserver.ino (3.84 KB)