Go Down

Topic: Progetto sonde centrale termica (Read 2015 times) previous topic - next topic

md_corporation

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

md_corporation

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

Code: [Select]
// 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......

gpb01

#17
Sep 15, 2016, 02:17 pm Last Edit: Sep 15, 2016, 02:17 pm by gpb01
Guarda che negli #include NON ci va il ";" alla fine !!!!

Guglielmo
Search is Your friend ... or I am Your enemy !

md_corporation

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:


Code: [Select]
#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:

Code: [Select]
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


gpb01

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
Search is Your friend ... or I am Your enemy !

md_corporation

Ho provato con questo:

Code: [Select]
#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...

gpb01

#21
Sep 15, 2016, 05:20 pm Last Edit: Sep 15, 2016, 05:22 pm by gpb01
Studiati il codice che trovi in QUESTO thread ... e poi adattalo alle tue esigenze ;)

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

Guglielmo
Search is Your friend ... or I am Your enemy !

md_corporation

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

Code: [Select]
//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:

Code: [Select]


//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 :P

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.
Search is Your friend ... or I am Your enemy !

elpapais

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....
www.infoportal.it support at infoportal.it

gpb01

#25
Sep 16, 2016, 10:04 am Last Edit: Sep 16, 2016, 10:05 am by gpb01
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 ;)

Prima di usarla ... va studiata bene :)

Guglielmo
Search is Your friend ... or I am Your enemy !

elpapais

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%

https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/

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.
www.infoportal.it support at infoportal.it

gpb01

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

Guglielmo
Search is Your friend ... or I am Your enemy !

md_corporation

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 ..

gpb01

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

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up