Pages: [1]   Go Down
Author Topic: Ethernet shield web server Dallas 18b20 (Résolu)  (Read 555 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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();}
    }}}
« Last Edit: November 15, 2012, 01:07:11 am by olipopotam » Logged

Offline Offline
Faraday Member
**
Karma: 33
Posts: 4975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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 #
« Last Edit: November 14, 2012, 08:16:33 am by Jean-François » Logged

Pages: [1]   Go Up
Jump to: