Allora ho preso un ethernet shield, con la web server di esempio ho fatto i test e mi ha dato i risultati sull'ip che ho messo, ovvero quello della scheda. Però non mi fa visualizzare i dati su tutti i computer, ovvero che se si vuole collegare un altro al server, non può, perché? Posso collegarmi solo io...
/*
Web Server
A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.
Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)
created 18 Dec 2009
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
modified 12 Aug 2013
by Soohwan Kim
*/
#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
#if defined(WIZ550io_WITH_MACADDRESS) // Use assigned MAC address of WIZ550io
;
#else
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
#endif
IPAddress ip(169,254,165,109);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// start the Ethernet connection and the server:
#if defined(WIZ550io_WITH_MACADDRESS)
Ethernet.begin(ip);
#else
Ethernet.begin(mac, ip);
#endif
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
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
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
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 disonnected");
}
}
Non si capisce nulla da quello che hai scritto. Com'è configurata la rete a cui connetti Arduino? L'IP che proponi chi te lo ha fornito? , cosa intendi?
Scusami, ho scritto veloce. Allora praticamente ho usato questo scketch, che adesso ho ricambiato per il motivo che spiegherò sotto:
/*
Web Server
A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.
Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)
created 18 Dec 2009
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
modified 12 Aug 2013
by Soohwan Kim
*/
#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
#if defined(WIZ550io_WITH_MACADDRESS) // Use assigned MAC address of WIZ550io
;
#else
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
#endif
IPAddress ip(169,254,196,93);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// start the Ethernet connection and the server:
#if defined(WIZ550io_WITH_MACADDRESS)
Ethernet.begin(ip);
#else
Ethernet.begin(mac, ip);
#endif
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
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
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
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 disonnected");
}
}
Allora praticamente ho questo problema, io riesco a visualizzare dei dati (metto la foto) però praticamente ho messo l'ip quello che ho trovato nella rete, ipv4(altra foto) e poi sono andato nell'indirizzo nel broswer e mi dà quei valori. Il punto che il mio computer non è collegato direttamente al modem, ma ha la scheda wifi che si collega alla rete. Praticamente non riesco a mettere un ip statico e quindi devo utilizzare un ip in "movimento" e quindi questo è già un problema... Praticamente mi dice ogni volta che metto l'ip statico, con l ultima cifra dell ip ovviamente diversa dal gateway, quando carico lo skech e cambio l'ip address dello sketch con quello che ho deciso, mi dice che già in uso quell' ip da qualcos'altro, ma non è in uso da niente! Non so... a parte questo, il problema principale che anche se riesco ad ad avere quell ip, ovvero quel server dove vedo i dati, quest'ultimi li posso vedere solo qui e non su altri computer... Spero di essere stato chiaro.
Sinceramente non riesco ad intuire l'instradamento che si verifica visto il risultato.
Come prima cosa Arduino ha bisogno di un indirizzo proprio statico, quindi vai sul router e riservane uno per lui, dopo di che se devi accedere al server al di fuori della rete dovrai fare il redirect di tutte le richieste in ingresso sulla porta 80 all'ip del router. comunque non ho mai visto un modem che gestisce ip di classe B nella sua subnet.
Non puoi scegliere come IP lo stesso del tuo PC se no avrai problemi di instradamento, il router non saprebbe a chi inviare i pacchetti.
Metterò l'indirizzo statico! In ogni caso come faccio a a fare il redirect in modo tale che il server sia visibile ovunque? Eh comunque mi è sorto un problema... possibile che l'ethernet server di comando occupi 25% di memoria?? Non c'è un modo per eseguirlo dentro la scheda sd dell'ethernet shield magari? Perché praticamente ho un lungo programma per una stazione meteo, che comprende molti valori, però se aggiungo pure l'ethernet lo sketch diventa troppo grande...
Posso provare a togliere la eeprom che intanto la toglierò visto che voglio memorizzare i dati su sd e fare un datalogger, ma mi trovo a corto con lo spazio... come faccio? Ho controllato adesso e solo l'esempio web server occupa addirittura il 52% dello spazio disponibile per lo sketch! Se c'è un modo per ridurre questa quantità, caricarla da qualche altra parte, se no sono fregato...
La libreria Ethernet è molto complessa, non so sinceramente se la gestione del TCP venga fatta all'interno del W5100 o questo offra solo le componenti HW (non ho mai avuto bisogno di approfondire), in ogni caso è un fatto che le librerie di gestione Ethernet offerte da Arduino siano estremamente pesanti, le scelte non sono molte, o cambi scheda, oppure ti adatti, per esempio inserendo le pagine HTML nella SD, ma il codice deve essere scritto nella FLASH!, puoi guadagnare un po di spazio cancellando il bootloader di Arduino, ma cosi facendo avrai bisogno di un programmatore esterno(puo bastare anche un altro Arduino UNO). La libreria EEPROM d'alro canto è una libreria particolarmente leggera, tanto è vero che sarebbe rimpiazzabile con due funzioni da 3 istruzioni circa.
Il redirect lo configuri all'interno del router, nei TD della TP-link per esempio la sezione è chiamata virtual server. Devi praticamente dire a che porta di ingresso corrisponde una porta di uscita su un determinato IP della rete interna.
Grazie per l'aiuto!
Comunque adesso con il virtual server fa su tutti i pc di casa, però io volevo renderlo pubblico a tutti... Come si fa?
Comunque è un problema questa cosa della memoria... Occupa veramente troppo l'ethernet di programma, o vado di mega ma cosa 40 quello originale... oppure non so proprio come fare... perché se devo prendere un altro arduino che mi serve da programmatore a sto punto prendo il mega. Sono nei casini!
Hai una scadenza domani alle 6:00 con penale superiore ai 10000€? In caso contrario si risolve tutto XD
In tanto scrivi lo sketch completo e cerca di ottimizzarlo a livello di memoria.
Se hai creato il virtual server di solito viene abbinata in automatico una regola firewall, in caso contrario devi crearla tu.
Beh no dai xd Comunque proverò a scrivere il programma completo con ethernet shield e tutto quanto e poi lo posto!
In ogni caso ho creato una regola firewall però non fa lo stesso... Ho messo che è visibile a tutti, poi l'ho messa su tutte le porte e per tutti gli ip, però forse devo specificare anche su quale programma? La regola l'ho creata su quelle in entrata, devo farlo anche su quella in uscita?
Stai facendo un po' di confusione, le porte sono la seconda parte di un endpoint, che è una coppia ip/porta. Il tuo Arduino si mette in ascolto sulla porta 80, avrà un suo ip interno alla rete(solitamente di classe C, nel tuo caso stranamente di classe B). La tua rete avrà un indirizzo pubblico, che chiunque puo vedere(quello riportato nel campo IP a sinistra di un tuo post). Quando un client tenta una connessione da un punto remoto alla tua rete avra il suo endpoint (ip1:porta1) verso un endpoint sulla tua rete (ip_pubblico_tuo:porta_per_le_richieste_http_solitamente80). Tu devi dire al tuo router che riceverà tutte le connessioni ad un enpoint con il tuo ip pubblico a chi rigirare la richiesta all'interno della tua sottorete, tu quindi dirai al tuo router, tutte le connessioni TCP sulla porta 80 rigirale all'indirizzo (ip di arduino) sulla porta 80.
Esempio
L'indirizzo pubblico della rete è 1.107.115.1(n lo trattiamo come 1)
L'indirizzo di Arduino 192.168.0.6
L'indirizzo del tuo PC 192.168.0.2
Il tuo router deve sapere come instradare le richieste.
connessione da remoto dal endpoint (12.32.165.9:65) verso (1.107.115.1:80)
Il tuo router di indirizzo 1.107.115.1 riceve la richiesta sulla porta 80. La inoltra a 192.168.0.6 sulla porta 80.
Come vedi alla fine ci sono 3 endpoint di cui uno fittizio. Aprire tutte le porte a caso non fa che creare casino e inoltrare pacchetti in modo errato.
Si però aspetta, forse mi sono spiegato male. Io non ho problemi a visualizzare l'ip su ogni computer o telefono collegato alla mia rete, però vorrei che l'ip fosse visibile a tutti in Italia per esempio, cioè al di fuori della mia rete...
è quello che ti ho spiegato, all'interno della rete non è difficile instradare una richiesta, è al di fuori di essa che bisogna abilitare i virtual server.
Allora scusa, è che mi sa difficile seguirti... Praticamente io ho fatto questo (allego foto) che sarebbe il virtual server che l'ho impostato sull'ip statico dato all'ethernet shield, ci ho messo 192.168.1.22, poi non so perché ma mi ha ridato questo poi (altra foto)...
l'ho messo il virtual server sulla porta 80 TCP e in questo modo posso connettermi a quell'ip con tutti i computer... non ho capito dove devo andare per modificare le altre cose che hai detto e fare in modo di potermi connettermi ovunque al di fuori della mia rete. Scusa ma mi sa complicato
Grazie Guglielmo
Proverò a dare un'occhiata e faccio sapere.
Comunque non centra niente, ma per fare la somma di una serie di dati come quelli del pluviometro, per forza con l'array devo fare? Perché così devo aggiornare ogni 15 minuti se no non ho spazio per le variabili, oppure c'è un modo per salvare gli array nella scheda sd? Praticamente ho bisogno di un metodo per sommare ogni variazione di mm di pioggia rilevati
Niente ho risolto Vi faccio sapere con quella cosa dello shield, sto provando a fare tutto il programma completo e poi lo posto e vi dico quanto occupa...
Bhe ecco intanto lo sketch diciamo completo... nel senso che probabilmente vorrò aggiungere pure di scaricare il file log su internet e poi devo ancora capire come salvare le massime e minime su sd... voi sapete come fare? Ovvero senza creare un file di log, ma semplicemente salvarle al posto della eeprom e leggerle poi, in modo tale che se stacco la corrente rimangono salvate
Poi metterò anche gli estremi annui e mensili ma diciamo che questa è la base di quanto occupa.
La risposta è: 51kb di flash e 2.5kb per le variabili e considerando che probabilmente arriverò anche a 55 e 3kb, significa che ci vuole per forza arduino mega... e non so se prenderlo originale.... voi che dite?
Poi vi volevo chiedere, ma lo sketch e i sensori poi funzioneranno senza problemi sul mega oppure devo adattarlo in qualche modo lo sketch?
P.S. pure il rain rate l'ho inserito ma in realtà devo ancora riuscire a trovare un modo per calcolarlo...