Buonasera a tutti, vorrei realizzare un server web che espone una pagina che aggiorna il valore di un sensore. Siccome ho iniziato da poco, potreste suggermi come fare ? Grazie a tutti in anticipo.
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere solo in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana.
Grazie.
A quanto detto da pert aggiungo ...
... cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (... e, per evitare future possibili discussioni/incomprensioni, prestando sempre molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), dopo di che ... evitata di utilizzare la traduzione automatica fatta dal browser ... ti impedisce di capire la lingua della sezione dove vai a scrivere ![]()
Guglielmo
Ciò premesso, per fare quanto chiedi, ti occorrerà una scheda Arduino con connessione alla tua rete (o via cavo Ethernet o via WiFi), dopo di che ... tra gli esempi dell'IDE ci sono vari programmi che fanno da WEB server ![]()
Guglielmo
P.S.: Ovviamente web server all'interno della tua rete locale ... permettere l'accesso dall'esterno richiede una serie di meccanismi di protezione che difficilmente con Arduino metti in piedi.
Grazie per i suggerimenti, ho acquistato Arduino R4 wifi ed ho provato questo Sketch per iniziare...
/*
WiFi Web Server
A simple web server that shows the value of the analog input pins.
*/
#include "WiFiS3.h"
#include "arduino_secrets.h"
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key index number (needed only for WEP)
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("Please upgrade the firmware");
}
// attempt to connect to WiFi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
server.begin();
// you're connected now, so print out the status:
printWifiStatus();
}
void loop() {
// listen for incoming clients
WiFiClient 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
int randomNumber = random(1, 100); // prova con numero casuale
//int sensorReading = analogRead(analogChannel);
client.print("random number");
client.print(" is ");
client.print(randomNumber);
client.println("<br />");
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 disconnected");
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your board's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
Vorrei assegnare un ip statico al server, poi ho notato che aprendo il browser da due dispositivi diversi il numero random è diverso, forse si genera nel client ? E poi ho tanto da lavorare sulla comunicazione socket e json per leggere da una applicazione mobile esterna
Bruno.
Certo, è normale che sia diverso il numero random: la pagina HTML viene creata in RAM ex-novo per ciascun client connesso e quindi ogni volta hai un nuovo numero casuale.
Visto che parli di Websocket e JSON, do per scontato che tu abbia almeno un po' di background con queste tecnologie web e ti posso dire fin da ora che l'approccio usato in questo esempio è a dir poco "frustrante" se vuoi sviluppare interfacce web dinamiche con Arduino.
Io ti consiglio di sviluppare usando API RESTful lato server e richieste AJAX lato client (o websocket se hai bisogno di prestazioni "realtime").
Purtroppo, mentre c'è una vastità di materiale e librerie per ESP32, per quanto riguarda la Uno R4 Wifi non hai molte opzioni perché la classe WiFiServer implementata nel core Renesas è davvero basilare e si occupa essenzialmente di gestire connessioni dei client e streaming.
Secondo me un buon progetto da cui potresti partire è questa libreria che è indipendente dal layer fisico e quindi può essere usata teoricamente con qualsiasi tipo di connessione (WifI, Ethernet, GSM, LoRA etc etc).
Per quanto riguarda la Uno R4, per ora ti posso dire solo che gli esempi compilano (dopo aver adeguato gli sketch per usare la libreria WiFiS3.h).
Sono in attesa della consegna di una R4 WiFi per la prossima settimana.
Grazie, per il suggerimento della libreria, pur avendo adeguato alla WifiS3, gli sketch compilano ma, purtroppo non funziona e la pagina va in timeout sul mio R4 Wifi.
Domani mi arriva la scheda e faccio qualche prova anche io.
Sto anche lavorando al porting della libreria WebServer.h inclusa nel core ESP32.
Per ora compila senza problemi, ma ovviamente manca la prova sul campo.. se sei interessato ti tengo aggiornato.
Se sei interessato, dai un'occhiata a questo post.
Gli esempi inclusi sono stati tutti testati con successo.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.