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....
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.
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 ..
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);
}
gpb01:
OK, ma prova anche a guardare le librerie indicate ... magari ti risparmi un sacco di fatica
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)
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.
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....
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;
}