eXma » Diskutieren » Computer und Technik
Startseite - Veranstaltungen - Mitglieder - Suche
Vollständige Version anzeigen: [erledigt] Arduino + EthernetShield ...
Socres
Irgendwer mit Arduino Erfahrung hier rum am geistern?

Ich versuche meinen Temperaturfühler (Dallas ds1820) mit meinem EthernetShield zur verbrüdern. Dazu hab ich mir aus den Examples für Webserver und die OneWire Bibliothek einen Sketch zusammengeklickt. Die getTemp() Funktion ist letztendlich der loop aus dem OneWire Beispiel und der Rest ist das Webserver Beispiel.

Der Funktionsaufruf funktioniert scheinbar denn auf der Seriellen Konsole ist alles ok. Dennoch bekomme ich im Browser nichts angezeigt. Lasse ich den getTemp() Aufruf weg gehts. Komischerweise funktioniert Serial.print() nach dem Aufruf auch noch aus dem Mainloop.

Sketch:
CODE
/*
 Web Server

A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.

Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)

created 18 Dec 2009
by David A. Mellis
modified 4 Sep 2010
by Tom Igoe

*/

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


#include <OneWire.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);

OneWire ds(10);

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

void setup()
{
 // start the Ethernet connection and the server:
 Ethernet.begin(mac, ip);
 server.begin();
 Serial.begin(9600);
}

void loop()
{
       
 
 // listen for incoming clients
 
 EthernetClient client = server.available();
 if (client) {
   

   float temp = getTemp();
   Serial.print("Server got Temp: ");
   Serial.println(temp);

   
   // an http request ends with a blank line
   boolean currentLineIsBlank = true;
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
       // 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();

         // output the value of each analog input pin
         for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
           client.print("analog input ");
           client.print(analogChannel);
           
           
           client.print(" is ");
           client.print(analogRead(analogChannel));
           client.println("<br />");
         }
         client.println("Temperatur:");
         client.println(temp);
         client.println("</br>");
         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();
 }
}

float getTemp() {
 Serial.println("SUBROUTINE getTemp() STARTED!");
 byte i;
 byte present = 0;
 byte type_s;
 byte data[12];
 byte addr[8];
 float celsius, fahrenheit;
 
 if ( !ds.search(addr)) {
   Serial.println("No more addresses.");
   Serial.println();
   
   ds.reset_search();
   delay(250);
   return 0;
 }
 
 Serial.print("ROM =");
 for( i = 0; i < 8; i++) {
   Serial.write(' ');
   Serial.print(addr[i], HEX);
 }

 if (OneWire::crc8(addr, 7) != addr[7]) {
     Serial.println("CRC is not valid!");
     return 0;
 }
 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 0
   ;
 }

 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[i] = ds.read();
   Serial.print(data[i], 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, ");
 Serial.print(fahrenheit);
 Serial.println(" Fahrenheit");
 Serial.print("getTemp() returns: ");
 Serial.println(celsius);
 return celsius;
}


Serial:
CODE
SUBROUTINE getTemp() STARTED!
ROM = 10 F9 94 16 2 8 0 BF
 Chip = DS18S20
 Data = 1 30 0 4B 46 FF FF D 10 29  CRC=29
 Temperature = 23.94 Celsius, 75.09 Fahrenheit
getTemp() returns: 23.94
Server got Temp: 23.94


irgendwas simples muss ich doch übersehen? Weiß jemand rat?
Socres
lol, es war wirklich zu einfach. pin 10 wird vom ethernet shield mitbenutzt und die temperaturabfrage würfelt natürlich die daten durcheinander...

also erledigt.