Progetto sonde centrale termica

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

una cosa del genere ti andrebbe bene?

oppure con un paio di questi?

elpapais:
una cosa del genere ti andrebbe bene?

oppure con un paio di questi?

Gli ultimi indicatori che hai postato sono identici a gli indicatori che uso in Konnex domotica... uguali uguali...

A me a dire il vero basta esclusivamente il valore puro in una pagina pulita .... FINE...
tutta la grafica dietro la costruisco con il cervello Homelynk schneider dove ho la possibilità di creare dei riquadri dove linko alle suddette pagine dove mi ritrovo le temperatura che arduino rileva....

quindi una cosa come la pagina solo con i valori andrebbe bene?

esattamente ... ma il valore di 1 sola sonda...

Es:

192.168.1.8/sonda1
visualizza pagina con solo il valore di sonda1

192.168.1.8/sonda2
visualizza pagina con solo il valore di sonda2

ecc...

Ora son riuscito con:

char c = client.read();

if (readString.lenght() < 100) {
readString += c;
}

Serial.print(c);

Vedo a seriale tutte le info ... comprese le istruzioni dopo l'indirizzo IP digitare a url... viene chiamato "referer"....
Quindi credo che andando a cercare la riga dove comincia con "referer" posso ricavare la stringa scritta ad url...

/*--------------------------------------------------------------
  Program:      eth_websrv_SD_Ajax_gauge

  Description:  Arduino web server web page displays Arduino
                analog value on a dial gauge.
                The web page is stored on the SD card.
                Ajax is used to update the analog value on the
                web page.
  
  Hardware:     Arduino Uno and official Arduino Ethernet
                shield. Should work with other Arduinos and
                compatible Ethernet shields.
                2Gb micro SD card formatted FAT16.
                Potentiometer interfaced to A2 analog input.
                
  Software:     Developed using Arduino 1.0.5 software
                Should be compatible with Arduino 1.0 +
                SD card contains web page called index.htm
  
  References:   - WebServer example by David A. Mellis and 
                  modified by Tom Igoe
                - SD card examples by David A. Mellis and
                  Tom Igoe
                - Ethernet library documentation:
                  http://arduino.cc/en/Reference/Ethernet
                - SD Card library documentation:
                  http://arduino.cc/en/Reference/SD
                - Gauge from:
                  https://github.com/Mikhus/canv-gauge

  Date:         27 March 2013
  Modified:     19 June 2013
 
  Author:       W.A. Smith, http://startingelectronics.org
--------------------------------------------------------------*/

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   50

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 20); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80
File webFile;               // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer

void setup()
{
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);

    Serial.begin(9600);       // for debugging
    
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Found index.htm file.");
    
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // buffer first part of HTTP request in HTTP_req array (string)
                // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // save HTTP request character
                    req_index++;
                }
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    // remainder of header follows below, depending on if
                    // web page or XML page is requested
                    // Ajax request - send XML file
                    if (StrContains(HTTP_req, "ajax_inputs")) {
                        // send rest of HTTP header
                        client.println("Content-Type: text/xml");
                        client.println("Connection: keep-alive");
                        client.println();
                        // send XML file containing input states
                        XML_response(client);
                    }
                    else {  // web page request
                        // send rest of HTTP header
                        client.println("Content-Type: text/html");
                        client.println("Connection: keep-alive");
                        client.println();
                        // send web page
                        webFile = SD.open("index.htm");        // open web page file
                        if (webFile) {
                            while(webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }
                    }
                    // display received HTTP request on serial port
                    Serial.print(HTTP_req);
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

// send the XML file containing analog value
void XML_response(EthernetClient cl)
{
    int analog_val;
    
    cl.print("<?xml version = \"1.0\" ?>");
    cl.print("<inputs>");
    // read analog pin A2
    analog_val = analogRead(2);
    cl.print("<analog>");
    cl.print(analog_val);
    cl.print("</analog>");
    cl.print("</inputs>");
}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}

Tratto da:

della serie 15 post fa...

..... ti ringraziono mi ci vorrà un pò a capirlo ... ma se dici che è quello che fa per me ... vedo di concentrarmi :)....

Ci sono molte istruzioni inerenti alla scrittura su SD che a me non serve ... tribolo un pò a centrare il codice che mi serve ... ma ce la farò :stuck_out_tongue:

md_corporation:
..... ti ringraziono mi ci vorrà un pò a capirlo ... ma se dici che è quello che fa per me ... vedo di concentrarmi :)....

Ci sono molte istruzioni inerenti alla scrittura su SD che a me non serve ... tribolo un pò a centrare il codice che mi serve ... ma ce la farò :stuck_out_tongue:

quello che fa per te è studiare un po di piu e magari dar piu considerazione a chi ti da aiuto... ribadisco che ho postato quello 17 post fa...

Fatto:

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

#define ONE_WIRE_BUS_1 2
#define ONE_WIRE_BUS_2 3
#define ONE_WIRE_BUS_3 4
#define ONE_WIRE_BUS_4 5
#define ONE_WIRE_BUS_5 6

OneWire oneWire_1(ONE_WIRE_BUS_1);
OneWire oneWire_2(ONE_WIRE_BUS_2);
OneWire oneWire_3(ONE_WIRE_BUS_3);
OneWire oneWire_4(ONE_WIRE_BUS_4);
OneWire oneWire_5(ONE_WIRE_BUS_5);

DallasTemperature sensor_sonda_1(&oneWire_1);
DallasTemperature sensor_sonda_2(&oneWire_2);
DallasTemperature sensor_sonda_3(&oneWire_3);
DallasTemperature sensor_sonda_4(&oneWire_4);
DallasTemperature sensor_sonda_5(&oneWire_5);

//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);
  sensor_sonda_1.begin();
  sensor_sonda_2.begin();
  sensor_sonda_3.begin();
  sensor_sonda_4.begin();
  sensor_sonda_5.begin();
}

void loop()
{

  Serial.println();

  //richiedo temperature_________________
  sensor_sonda_1.requestTemperatures();
  sensor_sonda_2.requestTemperatures();
  sensor_sonda_3.requestTemperatures();
  sensor_sonda_4.requestTemperatures();
  sensor_sonda_5.requestTemperatures();

  //scrivo temperatura sonda 1 seriale___
  Serial.print("Temperatura = ");
  Serial.print(sensor_sonda_1.getTempCByIndex(0));
  Serial.println(" gradi C");

  //scrivo temperatura sonda 2 seriale___
  Serial.print("Temperatura = ");
  Serial.print(sensor_sonda_2.getTempCByIndex(0));
  Serial.println(" gradi C");

  //scrivo temperatura sonda 3 seriale___
  Serial.print("Temperatura = ");
  Serial.print(sensor_sonda_3.getTempCByIndex(0));
  Serial.println(" gradi C");

  //scrivo temperatura sonda 4 seriale___
  Serial.print("Temperatura = ");
  Serial.print(sensor_sonda_4.getTempCByIndex(0));
  Serial.println(" gradi C");

  //scrivo temperatura sonda 5 seriale___
  Serial.print("Temperatura = ");
  Serial.print(sensor_sonda_5.getTempCByIndex(0));
  Serial.println(" gradi C");

  EthernetClient client = server.available();

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

        if (postText.length() < 10) {
          postText += c;
        }

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

          //creo la pagina WEB_______________________
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close"); // Dopo la risposta la connessione si interrompe
          client.println("Refresh: 5");
          client.println();
          client.println("<meta charset=UTF-8>"); // serve per inserire i caretteri speciali
          client.println("<!DOCTYPE HTML>");
          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;
        }
      }
    }

    //in base alla richiesta da URL rispondo con la sonda associata_______________

    if (postText.indexOf("1") > 0) {
      client.println(sensor_sonda_1.getTempCByIndex(0));
      client.print(" Gradi");
    }

    if (postText.indexOf("2") > 0) {
      client.println(sensor_sonda_2.getTempCByIndex(0));
      client.print(" Gradi");
    }

    if (postText.indexOf("3") > 0) {
      client.println(sensor_sonda_3.getTempCByIndex(0));
      client.print(" Gradi");
    }

    if (postText.indexOf("4") > 0) {
      client.println(sensor_sonda_4.getTempCByIndex(0));
      client.print(" Gradi");
    }

    if (postText.indexOf("5") > 0) {
      client.println(sensor_sonda_5.getTempCByIndex(0));
      client.print(" Gradi");
    }

    client.stop();
    Serial.println("client disconnected");
    Ethernet.maintain();
  }

}