WebServer e DS18B20

Ciao ragazzi, vorrei provare a fare un semplicissimo webserver che “pubblica” la temperatura della sonda DS18B20. Googolando ho trovato vari codici, ma non uno semplice, ed essendo alle prime armi ho fatto io dei tentativi. Prima ho preso il semplice sketch che stampa a seriale i valori letti dalla sonda, usando OneWire e Dallas come librerie. Funziona, allora avendo anche un TFT da 3.2" ho provato a scriverli sul TFT e funziona pure li. Poi provo la scheda Ethernet come WebServer, funziona con il classico sketch che scrive sul browser i valori dei pins analogici, e funziona. A questo punto provo a sostituire il ciclo For per scrivere i valori dei pins con poche righe che mi scrivano i valori della sonda, niente, non va! La temperatura della sonda da -127° (con lo sketch del TFT funziona e io carico solo non modifico pins) ed in più la maggior parte delle volte la risposta del browser è nulla. Dove sbaglio? Vi posto ovviamente il codice :

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,105);
#define ONE_WIRE_BUS 53
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float celsius;
char _buffer0[10];
String temperaturaLetta0;


EthernetServer server(80);
void leggiDS18B20()
{
  sensors.requestTemperatures();
  celsius = (sensors.getTempCByIndex(0));
  Serial.print("Requesting temperatures...");
  Serial.println(celsius);
  Serial.println(" Celsius, ");
  temperaturaLetta0 = dtostrf(celsius, 6, 1, _buffer0);
  delay(1000);
}
void setup() {
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo \n");
  sensors.begin(); 
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  delay(750);
}
void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    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>");
          // output the value of each analog input pin
          client.print("TEMPERATURA   ");
          leggiDS18B20();
          Serial.println(temperaturaLetta0+"kghdfkjlghdflkjghkdfgd");
          client.print(  temperaturaLetta0 );
          client.print(" C° ");
          client.println("
"); 
          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 disconnected");
  }
}

Potrebbe essere un problema con chiamate a librerie che si sovrappongono? O forse la SPI che proprio non c’entra?

#define ONE_WIRE_BUS 53

il 53 è usato anche dalla ethernet, prova a cambiare il pin della ONEWIRE

Il 53 usato dalla Ethernet? Non sapevo, sei sicuro? Sul Arduino mega 2650?

ricky1966:
Il 53 usato dalla Ethernet? Non sapevo, sei sicuro? Sul Arduino mega 2650?

mmmm non saprei :slight_smile: , ma dovresti saperlo tu che la usi, leggendo prima la documentazione

Arduino communicates with both the W5100 and SD card using the SPI bus (through the ICSP header). This is on digital pins 10, 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used to select the W5100 and pin 4 for the SD card. These pins cannot be used for general I/O. On the Mega, the hardware SS pin, 53, is not used to select either the W5100 or the SD card, but it must be kept as an output or the SPI interface won't work.

Note that because the W5100 and SD card share the SPI bus, only one can be active at a time. If you are using both peripherals in your program, this should be taken care of by the corresponding libraries. If you're not using one of the peripherals in your program, however, you'll need to explicitly deselect it. To do this with the SD card, set pin 4 as an output and write a high to it. For the W5100, set digital pin 10 as a high output.

fonte http://arduino.cc/en/Main/ArduinoEthernetShield
e qui Arduino - SPI tabella Connection
4-10-11-12-13-50-51-52-53 sono i pin da evitare se si usa shield eth e SD

se vogliamo andare oltre nelle ricerche ci vuole un attimo
Scriviamo su google "arduino ethernet DS18B20"

https://support.exosite.com/hc/en-us/articles/200095738-Arduino-Basic-Temperature-Monitor

..................

Imparate a usare google :wink:

Ok, del 53 non avevo letto (non sul sito ma in altre pagine) metterò un'altro o il 2 o il 54...

il 54 è un GND .... c'è scritto sulla scheda senza leggere la documentazione :slight_smile: (gli ultimi 2 pin in fondo)

Ti avevo risposto dalla macchina senza avere Arduino sotto mano, andrò di pin 2....

Quella ricerca google l'avevo già fatta, ma per via del pin 53 non funzionava nessun esempio. Cmq ho sistemato al pin 2 ora devo vedere bene se da 50 al 52 ho sistemato il TFT perché a sto punto devo cambiare i pins. Fin'ora ho sempre provato le cose separate. Domanda ultima, visto che A0...A15 posso usarli da digitali, un servo e un doppio relays dovrei poterli collegare.... Non dovrebbero esserci controindicazioni? !?

No. Direi che non ci sono controindicazioni purché usi apposite interfacce di potenza
Ciao

Comunque grazie, ho rifatto i conti dei cablaggi, il pin 2 per la sonda il 6 e il 7 per i relay e 8 per il servo. Confermami un'ultima cosa, vorrei alimentare tutto, TFT che ha sia 3.3 che 5 volts, il servo a 5V, la sonda a 5V e i relay a 5V, con un alimentatore esterno senza passare per la scheda, che alimenterò anch'essa esternamente. Userei un'alimentatore ATX, che già possiedo, ho letto che comunque sarebbr meglio mettere un GND collegato tra ATX e Arduino, corretto?

si i gnd vanno messi in comune altrimenti non avresti una differenza di potenziale sulla base del transistor che è alimentato da quello esterno.

uno schema tipo questo

Grazie, ora farò una alimentatore 3.3, 5 e 12 Volts, prendendo l'ATX che dovrebbe essere ben stabilizzato. Grazie ancora.