Progetto sonde centrale termica

Risolto ... era una porta di rete del mio PG che non funziona più -.-

Ho trovato una libreria DallasTemperature che da come ho capito mi serve per poter utilizzare il seguente codice:

// Includiamo la libreria OneWire e la DallasTemperature
#include <OneWire.h>;
#include <DallasTemperature.h>;
 
// Usiamo il PIN 2 per connettere il bus 1-Wire
#define ONE_WIRE_BUS 2
 
// Impostiamo la precisione della conversione a 9-bit
#define TEMPERATURE_PRECISION 9
 
// Impostiamo la libreria per comunicare sul PIN desiderato
OneWire oneWire(ONE_WIRE_BUS);
 
// Passiamo il riferimento del bus 1-Wire alla libreria Dallas
DallasTemperature sensors(&oneWire);
 
// vettore per contenere gli indirizzi delle noste sonde
DeviceAddress Sonda1, Sonda2;
 
void setup(void)
{
  // avvia la seriale
  Serial.begin(9600);
  Serial.println("Lettura Sensori DS18B20 su unico bus 1-Wire");
  // avvia la libreria
  sensors.begin();
  // Localizza i dispositivi sul bus
  Serial.print("Localizza il numero dei dispositivi sul bus...");
  Serial.print("Trovati ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" Dispositivi.");
  // risponde alla richiesta dell'alimentazione passiva
  Serial.print("Alimentazione Passiva: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
 
  // Assegna l'indirizzo delle sonde manualmente se lo si conosce già.
  // Comunque è possibile scoprire l'indirizzo delle sonde utilizzando il 
  // metodo oneWire.search(indirizzo del dispositivo) oppure
  // sensors.getAddress(indirizzo dispositivio, indice)
  Sonda1 = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
  Sonda2 = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };
 
  // Cerca i dispositivi sul bus e assegnazione attraverso l'indice.
  // Questo è il metodo preferibile per identificare gli indirizzi delle
  // sonde sul bus ed assegnarli poi ad un indice e successivamente assegnarli
  // manualmente con l'indirizzo sopra specificato una volta identificato.
  if (!sensors.getAddress(Sonda1, 0)) Serial.println("impossibile trovare l'indirizzo per il dispositivo 0"); 
  if (!sensors.getAddress(Sonda2, 1)) Serial.println("impossibile trovare l'indirizzo per il dispositivo 1"); 
 
  // Visualizza gli indirizzi trovati
  Serial.print("Indirizzo dispositivo 0: ");
  printAddress(Sonda1);
  Serial.println();
 
  Serial.print("Indirizzo dispositivo 1: ");
  printAddress(Sonda2);
  Serial.println();
 
  // imposta la risoluzione per la conversione
  sensors.setResolution(Sonda1, TEMPERATURE_PRECISION);
  sensors.setResolution(Sonda2, TEMPERATURE_PRECISION);
}
 
// Funzione per stampare l'indirizzo delle sonde
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
 
// Funzione per stampare la temperatura
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
}
 
// Funzione per stampare i dati delle sonde
void printData(DeviceAddress deviceAddress)
{
  Serial.print("Indirizzo dispositivo: ");
  printAddress(deviceAddress);
  Serial.print(" ");
  printTemperature(deviceAddress);
  Serial.println();
}
 
/*
 * LOOP
 */
void loop(void)
{ 
  Serial.print("Richiesta Temperature...");
  sensors.requestTemperatures();
  Serial.println("OK");
 
  printData(Sonda1);
  printData(Sonda2);
}

Il problema è che alla compilazione da il seguente errore:

"No sich file or directory

#include <OneWire.h>"

L'errore scompare SOLO se non includo la libreria DallasTemperature......

Guarda che negli #include NON ci va il ";" alla fine !!!!

Guglielmo

Grazie Gpb abbi pazienza sono un a gli inizi con questo linguaggio...

...Molto bene son riuscito grazie a Sketch trovati online e modificati qua e la ... a visualizzare la temperatura di UNA sonda collegata ad un canale digitale sia su monitor seriale che su una pagina HTML con il seguente codice:

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

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

//impostazioni di rete:::::::::::::::::::::::::::::::::::::::::::::::::
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 8);
EthernetServer server(80);
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

void setup() {

  delay(1000);
  Serial.begin(9600);

  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.println("Misuro la temperatura con sensore DS18B20");
  Serial.println("continuo la misurazione");
  delay(1000);
  sensors.begin();
}

void loop()
{
  Serial.println();
  sensors.requestTemperatures();
  Serial.print("Temperatura = ");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.println(" gradi C");

  EthernetClient client = server.available();

  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c == '\n' && currentLineIsBlank) {

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 5");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");

          //______visualizzo temperatura______
          client.println(sensors.getTempCByIndex(0));
          client.print(" Gradi");
          //__________________________________

        }
        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");
    Ethernet.maintain();
  }
  //__________________________________________________________________________________________________

}

Ora vorrei capire come identificare l'ipotetica richiesta da remoto per la lettura di una 2° -3° -4° -5° eventuale sonda ...

Ora da browser per connettermi digito semplicemente l'IP ... abbiamo detto in post dietro che per poter distinguere una differente richiesta la stringa da digitare a browser potrebbe essere una cosa simile:

http://192.168.1.8/Sonda_1
http://192.168.1.8/Sonda_2
http://192.168.1.8/Sonda_3
http://192.168.1.8/Sonda_4
http://192.168.1.8/Sonda_5

Nel mio codice lato arduino come identifico queste richieste?

Grazie

Come ti ho detto devi cercare esempi che accendono/spengono più LED ... dove c'è un analisi del testo che si riceve dalla HTTP GET e dove si prendono decisioni in base a ciò che si riceve.

Guglielmo

Ho provato con questo:

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

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

//impostazioni di rete:::::::::::::::::::::::::::::::::::::::::::::::::
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 8);
EthernetServer server(80);
String readString; //<------------------------------------------AGGIUNTO
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

void setup() {

  delay(1000);
  Serial.begin(9600);

  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.println("Misuro la temperatura con sensore DS18B20");
  Serial.println("continuo la misurazione");
  delay(1000);
  sensors.begin();
}

void loop()
{
  Serial.println();
  sensors.requestTemperatures();
  Serial.print("Temperatura = ");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.println(" gradi C");

  EthernetClient client = server.available();

  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
readString.concat(c); //<------------------------------------------AGGIUNTO
        if (c == '\n' && currentLineIsBlank) {

          
           { if (readString.indexOf("/LOL") > 0 ) client.println("INTERROGATIVO"); } //<------------------------------------------AGGIUNTO
          

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 5");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");

          //______visualizzo temperatura______
          client.println(sensors.getTempCByIndex(0));
          client.print(" Gradi");
          //__________________________________

        }
        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");
    Ethernet.maintain();
  }
  //__________________________________________________________________________________________________

}

Ma quando digito da browser 192.168.1.8/LOL

non carica niente...

Studiati il codice che trovi in QUESTO thread ... e poi adattalo alle tue esigenze :wink:

Anche QUI c'è un bell'esempio di "parsing" :slight_smile:

Guglielmo

Dunque... ho analizzato un po il codice del thread che mi hai passato:

//zoomkat 5-24-10
// http://www.arduino.cc/en/Tutorial/TextString for WString.h
#include <WString.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 102 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(84); //server port

String readString = String(100); //string for fetching data from address

///////////////////////
String teststring = String(100);
String finalstring = String(100);
String flag = String(2);
int ind1 = 0;
int ind2 = 0;
int pos = 0;
//////////////////////

void setup(){

//start Ethernet
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();

//enable serial data print 
Serial.begin(9600); }

void loop(){
// Create a client connection
Client client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();

//read char by char HTTP request
if (readString.length() < 100) {

//store characters to string 
readString.append(c); 
} 

//if HTTP request has ended
if (c == '\n') {

///////////////
//Serial.println(readString);
//readString looks like "GET /?-0p1555-1p500t1000 HTTP/1.1"

 if(readString.contains("-")) { //test for servo control sring
 readString.replace('-', '#');
 pos = readString.length(); //capture string length
 //find start of servo command string (#)
 ind1 = readString.indexOf('#');
 //capture front part of command string
 teststring = readString.substring(ind1, pos);
 //locate the end of the command string
 ind2 = teststring.indexOf(' ');
 //capturing the servo command string from readString
 finalstring = readString.substring(ind1, ind2+ind1);
 //print "finalstring" to com port;
 Serial.println(finalstring); //print string with CR
   }
 ////////////////////////
 //GET /?Slidervalue0=1800&Submit=Sub+0 HTTP/1.1
 if(readString.contains("Slidervalue")) {
 ind1 = readString.indexOf('u');
 ind2 = readString.indexOf('&');
 finalstring = readString.substring(ind1+1, ind2);
 finalstring.replace('e', '#');
 finalstring.replace('=', 'p');
 Serial.println(finalstring);
 }
 ///////////////////
 
 //now output HTML data header
 client.println("HTTP/1.1 204 Zoomkat");
 client.println();
 client.println();
 delay(1);
 //stopping client
client.stop();

/////////////////////
//clearing string for next read
readString="";
teststring="";
finalstring="";
 
}}}}}

vediamo se ho capito... la logica che ha usato se non sbaglio è la seguente:

-Creo degli array di stringhe per memorizzare il link digitato da browser
-Lo analizzo per identificarne la richiesta
-In base alla richiesta rispondo con un println differente... o comunque una azione distinta

Ed il codice dovrebbero essere il seguente:

//creo array:
String stringaCompleta = String(100);
String stringaDiFondo = String(100);

//in qualche maniera non ho ben capito come... legge la stringa scritta da browser (dopo aver avviato il server ovviamente..) con questo comando:
if readString.lenght() <100 

//Come se leggesse la lunghezza "lenght" e verifica che sia inferiore a 100 .. ma non capisco se 100 caratteri o cosa ...

//poi sembra legga l'ultimo carattere se non sbaglio con questo codice:
readString.append(c);

//dopo di che con le istruzioni if per interrogare la variabile dove conterrà le diverse richieste nel suo caso sostituisce quello che legge con un altro carattere...
if (readString.contains("-")) {
readString.replace('-';'#');

Non sono proprio certo di aver capito ... o meglio: ho capito che devo scompattare e leggere la dicitura scritta da browser che se non ho afferrato male è scritta nella "c" ... che però contiene più info ... devo cercare di leggere solo la parte finale ... una volta fatto questo il resto è più semplice ...
In VB.Net sarebbe una passeggiata :stuck_out_tongue:

T'ho detto che quello era un ESEMPIO per capire come si fa un "parsing" ... NO che lo devi copiare tale e quale ... anche perché tu NON ricevi il # che lui va a cercare (... a meno che non lo metti tu nella richiesta in una specifica posizione).

Purtroppo c'è da imparare a ricevere, carattere a carattere la richiesta che arriva, riconoscere quando questa è finita, fare il "parsing" per cercare le parole chiavi che si usano (es. Sonda_1, Sonda_2, ecc) e qundi agire di conseguenza.

Guglielmo

P.S.: Sai quale è il problema ... voler fare con un microcontrollore fatto per automazione cose che si fanno molto più semplicemente in ambienti "computer like" ... ad esempio una UNO con uno Yún Shield (... annunciato, ma non ancora disponibile. Ci sono comunque alternative) è molto più adatta. Sullo Yún Shield gira Linux (... ovvio che un po' tocca conoscerlo) e fai tutta la parte WEB, sulla UNO invece gira la parte che controlla gli I/O ed i due mondi colloquiano tra di loro.

gpb01:
P.S.: Sai quale è il problema ... voler fare con un microcontrollore fatto per automazione cose che si fanno molto più semplicemente in ambienti "computer like" ... ad esempio una UNO con uno Yún Shield (... annunciato, ma non ancora disponibile. Ci sono comunque alternative) è molto più adatta. Sullo Yún Shield gira Linux (... ovvio che un po' tocca conoscerlo) e fai tutta la parte WEB, sulla UNO invece gira la parte che controlla gli I/O ed i due mondi colloquiano tra di loro.

Secondo me il problema sono le scarse conoscenze specifiche.
un conto è elettronica analogica e gia conoscerla tutta è un'impresa....
poi c'e' l'elettronica digitale abbastanza semplice se si esclude i microcontrollori ma includerli presuppone anche l'informatica...
quindi programmazione....
poi cosa ci vuole mettere un dispositivo in rete????
basta la scheda di rete? oppure bisogna conoscere anche una piccolissima parte dell'informatica ovvero la parte comunicazioni quindi conoscere i protocolli, i linguggi associati...
Vogliamo solo 4 pagine web? basta poco che ce vo? alla fine con un po di ajax, una manciata di java, quattro codici html....

Non basta conoscere a stento i concetti....
Io so che un aereo ha gli alettoni, il timone di coda, un po di motori che se accellero e tiro la cloche sale in aria sping0 la cloche e decellero e atterro??? mi sa che è più probabile che mi schianti perche' non sono un pilota!!!!!
Studio un pochino e magari conseguo anche il brevetto....

Guglielmo se non erro tu avevi fatto un bellissimo esempio con tinywebserver forse con quello....

elpapais:
Guglielmo se non erro tu avevi fatto un bellissimo esempio con tinywebserver forse con quello....

No, non ero stato io, però, giustamente, magari potrebbe provare proprio con quella libreria ... QUI :wink:

Prima di usarla ... va studiata bene :slight_smile:

Guglielmo

queste 18 lezioni spazzolano al 1% quello che bisognerebbe sapere per portare avanti un progetto di acquisizione dati da sensori e pubblicazone su server web in un arduino mega/due da solo.
Da una serie di nozioni che però appunto sono di base 1%.
Io a suo tempo, ne ricavai utili info pur conoscendo la materia diciamo al 10%

Il server e gli esempi di Ovidio Tinywebserver oppure mytinywebserver (fork di quello di Ovidio) di un italiano ma non ricordo chi.. Sono semplici se si conosce la materia altrimenti leggersi almeno le 16 lezioni e poi le ultime due per sistemare le cose bene.
Cosi com'e' in lezione 16 funziona tutto alla grande quindi con poco sforzo si riesce ad aggiungere quello che manca..

Con tinywebserver io ho fatto una gestione di stufe a pellet con tanto di gauge java per temperatura acqua, caldaia, livello pellet, temperature 8 stanze...
c'e' anche un altro esempio di Carlos mi sembra caldaiaelio.zip nel forum arduino.

C'è anche QUESTO ed in particolare la cartella Webbino, fatto da SukkoPera molto attivo qui nel forum Italiano :slight_smile:

Guglielmo

gpb01:
T'ho detto che quello era un ESEMPIO per capire come si fa un "parsing" ... NO che lo devi copiare tale e quale ... anche perché tu NON ricevi il # che lui va a cercare (... a meno che non lo metti tu nella richiesta in una specifica posizione).

Purtroppo c'è da imparare a ricevere, carattere a carattere la richiesta che arriva, riconoscere quando questa è finita, fare il "parsing" per cercare le parole chiavi che si usano (es. Sonda_1, Sonda_2, ecc) e qundi agire di conseguenza.

Guglielmo

P.S.: Sai quale è il problema ... voler fare con un microcontrollore fatto per automazione cose che si fanno molto più semplicemente in ambienti "computer like" ... ad esempio una UNO con uno Yún Shield (... annunciato, ma non ancora disponibile. Ci sono comunque alternative) è molto più adatta. Sullo Yún Shield gira Linux (... ovvio che un po' tocca conoscerlo) e fai tutta la parte WEB, sulla UNO invece gira la parte che controlla gli I/O ed i due mondi colloquiano tra di loro.

Attenzione: non ho detto che l'ho copiato... stavo semplicemente riflettendo ad alta voce il codice che mi hai consigliato ... tutto li... Ovvio che non mi serve andare a sostituire parti di stringa...

Per quanto riguarda la mia conoscenza del mondo arduino so bene che è veramente ad un livello sotto la base ... sto imparando ...

Voi siete su un'altro pianeta e quindi mi resta difficile spiegarmi in maniera comprensiva nei vostri confronti ma ancor più capire cosa diciate al primo colpo...

Tornando allo scopo del Thread... ora sto cercando di capire come riportare in una variabile la parte di stringa scritta dal client... dopo di che cerco di scomporla leggendo l'ultima parte ..

OK, ma prova anche a guardare le librerie indicate ... magari ti risparmi un sacco di fatica :wink:

Guglielmo

e se non ho capito male questa operazione viene fatta in questo modo:

//definisco la funzione:
String readString = String (100);

//leggo l'intera stringa client
char c = client.read();

//questa dovrebbe essere l'interrogazione della parte di stringa che mi interessa se non sbaglio..
if (readString.lenght() < 100 )

{

//salvo i caratteri nella stringa
readString.append(c);

}

Cosa ne dite?

gpb01:
OK, ma prova anche a guardare le librerie indicate ... magari ti risparmi un sacco di fatica :wink:

Guglielmo

Te parli dell'idea di svilupparlo in ambiente Linux ?

Se intendi questo ... ti dico che preferisco andare avanti per la strada nella quale mi trovo perchè ho già acquistato tutto ... e non mi va di spendere altri soldi gettando nell'immondizia i componenti attuali ..

Non si tratta di buttare niente...
si tratta di guardare metodi alternativi usando librerie sia per visualizzare che ricevere dati....
Non si sta parlando di hardware si sta parlando di programmazione e conoscenze.

Usare string e' concettualmente sbagliato si usano matrici char in modo da poter identificare i caratteri singolarmente anche in funzione alle sequenze d'escape inviate dal protocollo tcpi
la strada che percorri second me è fondamentalmente sbagliata... ma libero di percorrerla.
Io mi fermerei un attimo magari leggendo qualcosa e trovando alcuni esempi (e ce ne sono una valangata)

Buon lavoro

Questo post mi ha illuminato:

pablos:

if(c == readString.indexOf("led1=0")) {

else if(c == readString.indexOf("led1=1")) {
else if(c == readString.indexOf("led2=0")){
else if(c == readString.indexOf("led2=1")){



Queste condizioni non saranno mai vere, stai confrontando c che è un char contenente un solo carattere con una funzione che restituisce 
-1 se la stringa cercata non esiste 
(pos n) se la stringa cercata esiste

leggo un carattere alla volta proveniente dal client


char c = client.read();




appendo ogni carattere c in una var stringa che si chiama readString


readString.concat(c);




se trovo in char c il simbolo "a capo" chiudi la stringa


if (c == '\n'




readString è la stringa che devi analizzare non la variab char c, questa contiene il messaggio completo dove potrai trovare LED1....

Riguarda meglio gli esempi non troverai un controllo sulla variabile C per trovare il messaggio completo e riguarda bene cosa fa la funzione indexOf()
ciao

md_corporation:
Te parli dell'idea di svilupparlo in ambiente Linux ?

NO, se avessi dato un'occhiata ai link che ti abbiamo meso avresti letto che sono WebServer che girano sulla tua configurazione e che sono in grado di gestire più pagine anche depositate su SD.

Guglielmo