Go Down

Topic: Ethernet shield web server Dallas 18b20 (Résolu) (Read 636 times) previous topic - next topic

olipopotam

Nov 11, 2012, 09:32 pm Last Edit: Nov 15, 2012, 07:07 am by olipopotam Reason: 1
Bonjour,

Je me creuse les méninges depuis ce matin mais je bloque.

J'ai une diecemilla avec une ethernet shield et un réseau de plusieurs dallas ds18b20 et je voudrais faire un serveur web qui me donne l'adresse HEX avec la température correspondante.

En Sérial.print pas de problème mais je coince avec le serveur web. Je pense que mon code est bon mais je coince sur la taille et j'ai beau chercher impossible de réduire.

Quelqu'un aurait une idée pour réduire mon code ?
Etendre la mémoire (avec une sd ? sais pas si c'est possible ???)
Ou bien une autre idée tout court.

Merci, bien à vous.

Code: [Select]

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



byte allAddress [20][8];
OneWire oneWire(10);
DallasTemperature sensors(&oneWire);


byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x28, 0xD8 };
byte ip[] = { 192,168,11, 101 };
EthernetServer server(80);

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

void loop()
{
 EthernetClient client = server.available();
 if (client) {
   boolean currentLineIsBlank = true;
   while (client.connected()) {
     if (client.available()) {
           
       
       byte j=0;                                        
 while ((j < 20) && (oneWire.search(allAddress[j]))) {        
   sensors.setResolution(allAddress[j], 10);
   sensors.requestTemperatures();
   byte i;
   for( i=0; i < 8; i++) {                        
     client.print("0x");
     if (allAddress[j][i] < 16) {
       client.print('0');                      
     }
     client.print(allAddress[j][i], HEX);                
     if (i < 7) {
       client.print(", ");
     }
   }
   client.print(" : ");
   float tempC = sensors.getTempC(allAddress[j]);          
 if (tempC == -127.00) {
   client.print("Error getting temperature");
 } else {
   client.print(tempC);                        
   client.print(" C ");
   }
   j++;
   client.print("\n\r");
 }
 delay(4000);
   
       
       
        client.stop();}
   }}}

Artouste


Bonjour,

Je me creuse les méninges depuis ce matin mais je bloque.

J'ai une diecemilla avec une ethernet shield et un réseau de plusieurs dallas ds18b20 et je voudrais faire un serveur web qui me donne l'adresse HEX avec la température correspondante.

En Sérial.print pas de problème mais je coince avec le serveur web. Je pense que mon code est bon mais je coince sur la taille et j'ai beau chercher impossible de réduire.

Quelqu'un aurait une idée pour réduire mon code ?
Etendre la mémoire (avec une sd ? sais pas si c'est possible ???)
Ou bien une autre idée tout court.
...

bonsoir
je n'ai pas bien compris le probleme
le code généré est trop important pour le diecemilla ?

olipopotam

#2
Nov 14, 2012, 02:12 pm Last Edit: Nov 14, 2012, 02:16 pm by Jean-François Reason: 1
Bonjour,

Pour ceux que ca intéresse voici la solution :

J'ai retiré la librairie DallasTemperature.h et fait l'import "à la main"
L'autre soucis venait de la sortie 10 qui est utilisée aussi par l'ethernet shield.
Voici le code complet.

Il me permet sur l'adresse 192.168.11.101 d'avoir une page web qui me donne la liste des puce ds18b20 avec leur id et la temperature.
Je récupère avec mon serveur php pour y faire un peu de domotique.

Bien à vous :

Code: [Select]
#include <OneWire.h>
#include <SPI.h>
#include <Ethernet.h>

OneWire ds(7);
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x28, 0xD8 };
IPAddress ip(192,168,11, 101);
EthernetServer server(80);

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

void loop(void)
{
 byte i;
 byte present = 0;
 byte data[12];
 byte addr[8];
 int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;


   EthernetClient client = server.available();
 if (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("Connnection: close");
         client.println();
         client.println("<!DOCTYPE HTML>");
         client.println("<html>");
                   // add a meta refresh tag, so the browser pulls again every 5 seconds:
         client.println("<meta http-equiv=\"refresh\" content=\"5\">");
         client.print("Dallas OneWire: </br>");
         
         
         
 while ( ds.search(addr))
 {
     
   for( i = 0; i < 8; i++)
   {
     client.print(addr[i], HEX);
     client.print(" ");
   }
   ds.write(0x44,1);    
   delay(1000);  
   present = ds.reset();
   ds.select(addr);    
   ds.write(0xBE);
   for ( i = 0; i < 9; i++)
   {    
     data[i] = ds.read();
   }
   LowByte = data[0];
   HighByte = data[1];
   TReading = (HighByte << 8) + LowByte;
   SignBit = TReading & 0x8000;
   if (SignBit)
   {
     TReading = (TReading ^ 0xffff) + 1;
   }
   Tc_100 = (6 * TReading) + TReading / 4;    
   Whole = Tc_100 / 100;  
   Fract = Tc_100 % 100;
   if (SignBit)
   {
      client.print("-");
   }
   client.print(Whole);
   client.print(".");
   if (Fract < 10)
   {
      client.print("0");
   }
   client.print(Fract);

   client.print("</br>");
 }
 client.println("No more address</br>");
 delay(10000);
 client.println("</html>");
 break;
 }
 if (c == '\n')
 {
    currentLineIsBlank = true;
 }
 else if (c != '\r')
 {
    currentLineIsBlank = false;
 }
}
}
delay(1);
client.stop();
Serial.println("client disonnected");
}
}


Edit de Jean-François :  merci de mettre le code entre les bonnes balises, avec le bouton #

Go Up