GET /favicon.ico HTTP/1.1

Buongiorno! Ho letto un po' in giro il significato di questa linea. Qualcuno se la prende con Chrome che "non rilascia la chiamata" :thinking: Qualcuno sa spiegarmi il significato? (board Arduino 2560 con shield ethernet) Grazie in anticipo.

favicon.ico è il file che contiene l'icona mostrata da browser alla sinistra del nome della pagina richiesta al web server e che viene richiesta in automatico dal broswser.
image

Di solito l'assenza di tale file non comporta alcun problema.

Per il browser (client) no, ma il server deve poter gestire (anche nel senso di rifiutare esplicitamente) tale richiesta.

Grazie!!! Questa linea la vedo su monitor seriale. Negli sketch c'è un "comando" oppure al contrario è il browser che interroga la scheda? Non è eliminabile?

Basta una risposta del tipo 404 (page not found) per tutte le richieste che il webserver non può gestire (compreso quindi l'assenza del favicon.ico)

Di solito negli esempi di partenza c'è sempre.

No per quanto ne so.

Comunque se metti lo sketch completo è meglio.

Buongiorno, ecco lo sketch. In qusto sketch compaiono 2 linee: una in assembler e l'altra penso sia C. Il motivo è che uno dei due 2560, o quantomeno la shield ethernet, dopo una notte senza alimentazione, quando gliela ridò è bloccata. Devo quindi premere fisicamente il tasto di reset e si mette a funzionare correttamente. Ho pensato quindi di inserire, all'interno del codice, un reset software. Nulla di fatto resta bloccata. Il codice è minimale, quindi senza tutta la parte di letture etc. Rispetto agli esempi classici ho lasciato qualche riga in html che ho aggiunto. Ovviamente, sempre grazie.

__asm__ (" jmp 0 ");//assembler
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xF6, 0xE6 };//w5100 keyestudio Note: its MAC address is random. You can set MAC address in the code.byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 24);
EthernetServer server(80);
//void(* resetFunc) (void) = 0;
void setup() {
  Serial.begin(9600);
  //
  while (!Serial) {
    ;
  }
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  delay (5000);
}
void loop() {
  EthernetClient client = server.available();
 // char c = client.read(); if (c ==!'\n'){resetFunc();}
  
  if (client) {
    Serial.println("new client");

    String currentLine = "";
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        Serial.write(c);
        if (c == '\n')
        {
          
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Refresh: 60");
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<meta name= viewport content= width=device-width>");
            client.println("<body bgcolor=black>");
            client.println("<font color=green>");
            client.println("<br/>");
            client.println("<span style= font-size:12px> TEST ETHERNET</span>");
            //client.println("<span style= font-size: 12px > reload page every 60 seconds </span>");
            client.println("<br/>");
            client.println(Ethernet.localIP());
            client.println("<br/>");
            client.println("mac [] 0xDE, 0xAD, 0xBE, 0xEF, 0xF6, 0xE6");
            client.println("<br/>");
            client.println("server: 80");
            client.println("<meta http-equiv=refresh>");
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
      }
    }
    client.stop();
    Serial.println("client disconnected");
  }
}

Cotestatnt + Claudio_FF
A questo punto del progetto mi manca solo una cosa. Difficile? Per le mie conoscenze molto.
Vorrei inviare il contenuto delle variabili da qualche parte in modo da poterle visualizzare ovunque nel mondo. Ho letto decine e decine di pagine. Da quello che risulta più evidente e ridondante è che serve una pagina in php lato server + le richieste GET da Arduino. Qualcuno dice che serve perforza un DB, qulcun'altro che bisogna scrivere nella cartella public. Io ho un sito e me lo scrivo da solo con l'aiuto di un software. Ho un DB SQL. I servizi sono appoggiati su Aruba. Ho anche un piano a pagamento con Arduino IOT... Come complicare la vita alla gente. Quello che il compilatore passa, il compilatore online di questo servizio trova errori. Sostanzialmente il codice va scritto in modo diverso...
Io sono convinto che si tatta di poche cose e banali, ma come sempre serve un minimo di conoscenza. PS. Non so che età avete e se la vita vi abbia dato l'opportunità di studiare informatica. Quando iniziai le superiori informatica era un corso sperimentale... Poi, il VIC20, il Commodore 64, e la piacevolezza di un modem a 56K.
Vi allego il codice finale.
Sono collegati 3 DS18B20
1 DHT11
Un ingresso che controlla la tensione (in questo caso di alimentazione)
Tramite click da pagina web posso attivare e disattivare un relay
C'è un feedback fisico che controlla se il relay ha ricevuto il comando
Posso caricare delle mappe che indicano la posizione di dove sono posizionati i sensori
Posso far scrivere in automatico su excell le letture delle variabili.

#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
#define DHTPIN A1
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
//
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);
//
unsigned long currentTime;
//
int row_excel = 0;
float hum;
float temp;
float fah;
float TempCByIndex0;
float TempCByIndex1;
float TempCByIndex2;
const float tensioneDiRiferimento = 5.0;
float R1 = 100000.0;
float R2 = 100000.0;
float volt_adc = 0.0;
float volt_mis = 0.0;
int inPin = 12;//controllo attivazione relay1
int valAttivazione = 0;

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//w5100 keyestudio Note: its MAC address is random. You can set MAC address in the code.byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 21);
EthernetServer server(80);

void setup() {
  Serial.begin(9600);
  //----------
  Serial.println("CLEARDATA"); // clear excel sheet
  Serial.println("LABEL,Time,Hum,Temp C,Temp F,TempDS1,TempDS2,TempDS3,Voltage,Current Time,Client IP,Attivazione,Num Rows");
  //----------
  dht.begin();//DHT
  sensors.begin();//DS
  pinMode(3, OUTPUT);//relay
  pinMode(inPin, INPUT);
  //
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
  //
  while (!Serial) {
    ;
  }
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}
void loop() {

  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    String currentLine = "";
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        Serial.write(c);
        if (c == '\n')
        {
          if (currentLine.length() == 0) {

            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Refresh: 60");
            client.println();

            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<meta name= viewport content= width=device-width>");
            client.println("<body bgcolor=black>");
            client.println("<font color=green>");
            client.println("<br/>");
            client.println("<span style= font-size:14px> ETHERNET Bravo 1 ONLINE</span>");
            client.println("<br/>");
            client.println("<span style= font-size: 12px > reload page every 60 seconds </span>");
            client.println("<br/>");
            client.println ("<p> </p>");
            client.println("<br/>");
            client.println("<font color=white>");
            client.println("<body link=green>");
            client.println("<body vlink=green>");
            client.print("Command ON <a href=\"/H1\"> press here</a> Relay 1<br>");
            client.print("Command OFF <a href=\"/L1\"> press here</a> Relay 1<br>");
            
            //controllo attivazione
            valAttivazione = digitalRead(inPin);
            client.println("<span style= font-size: 14px > status activation: </span>");
            client.print(valAttivazione);
            client.println("<br/>");
            client.println("<br/>");
            //
            hum = dht.readHumidity();
            temp = dht.readTemperature();
            fah = dht.readTemperature(true);
            float heat_index = dht.computeHeatIndex(fah, hum);
            float heat_indexC = dht.convertFtoC(heat_index);
            client.println("<br/>");
            Serial.println("answer from Bravo 1 ETH");
            client.println("<body bgcolor=black>");
            client.println("<font color=white>");
            Serial.print("Temp: ");
            Serial.print(temp);
            Serial.println("C ");
            Serial.print("F: ");
            Serial.println(fah);
            Serial.print("UR % : ");
            Serial.println(hum);
            Serial.print("Heat index: ");
            Serial.print(heat_indexC);
            Serial.println("C ");
            Serial.print("Heat index: ");
            Serial.print(heat_index);
            Serial.println("F ");
            client.println("<span style= font-size: 14px > answer from Bravo 1 ETH </span>");
            client.println("<br/>");
            client.println("<span style= font-size: 14px > UR % : </span>");
            client.print(hum);
            client.println("<br/>");
            client.println("<span style = font - size: 14px > temp C: </span>");
            client.print(temp);
            client.println("<br/>");
            client.println("<span style= font-size: 14px > temp F: </span>");
            client.print(fah);
            client.println("<br/>");

            sensors.requestTemperatures();
            Serial.print("temp DS1 ");
            Serial.print(sensors.getTempCByIndex(0));
            Serial.println("C");

            client.println("<span style= font-size: 14px > temp DS1: </span>");
            client.print(sensors.getTempCByIndex(0));
            client.println("<br/>");

            Serial.print("temp DS2 ");
            Serial.print(sensors.getTempCByIndex(1));
            Serial.println("C");

            client.println("<span style= font-size: 14px > temp DS2: </span>");
            client.print(sensors.getTempCByIndex(1));
            client.println("<br/>");

            Serial.print("temp DS3 ");
            Serial.print(sensors.getTempCByIndex(2));
            Serial.println("C");

            client.println("<span style= font- size: 14px > temp DS3: </span>");
            client.print(sensors.getTempCByIndex(2));
            client.println("<br/>");

            //analogRead(A3);
            int valoreLetto = analogRead(A3);
            volt_adc = (valoreLetto / 1023.0) * tensioneDiRiferimento;
            volt_mis = volt_adc * (R1 + R2) / R2;
            Serial.print("tensione: ");
            Serial.print(volt_mis);
            Serial.println(" Vdc");
            client.println("<span style= font-size: 14px > Supply power: </span>");
            client.println(volt_mis);
            client.println("<span style= font-size: 14px > Vdc </span>");

            //time
            currentTime = millis();
            client.println("<br/>");
            client.println("<span style= font-size: 14px > Time: </span>");
            currentTime = (currentTime / 1000) / 60;
            client.println(currentTime);
            client.println("<span style= font-size: 14px > minutes </span>");
            client.println();
            Serial.print("Time: ");
            Serial.print(currentTime);
            Serial.println(" minutes ");
            Serial.print("Local IP: ");
            Serial.println(Ethernet.localIP());
            client.println("<br/>");
            client.print("Local IP: ");
            client.println(Ethernet.localIP());

            //allarm
            client.println("<br/>");
            client.println("<br/>");
            client.println("<font color=yellow>");
            client.println("--- ALLARM---");
            client.println("<br/>");
            if (hum > 65) {
              client.println("<br/>");
              client.println("<font color=red>");
              client.print("ALLARM UR");
              client.println("<br/>");
              digitalWrite(4, HIGH);
            }
            else {
              client.println("<br/>");
              client.println("<font color=green>");
              client.print("UR STATUS OK");
              client.println("<br/>");
              digitalWrite(4, LOW);
            }

            if (temp > 35) {
              client.println("<br/>");
              client.println("<font color=red>");
              client.print("ALLARM TEMP");
              client.println("<br/>");
              digitalWrite(5, HIGH);
            }
            else {
              client.println("<br/>");
              client.println("<font color=green>");
              client.print("TEMP STATUS OK");
              client.println("<br/>");
              digitalWrite(5, LOW);
            }

            if (sensors.getTempCByIndex(0) > 35) {
              client.println("<br/>");
              client.println("<font color=red>");
              client.print("ALLARM DS1");
              client.println("<br/>");
              digitalWrite(6, HIGH);
            }
            else {
              client.println("<br/>");
              client.println("<font color=green>");
              client.print("DS1 STATUS OK");
              client.println("<br/>");
              digitalWrite(6, LOW);
            }

            if (sensors.getTempCByIndex(1) > 35) {
              client.println("<br/>");
              client.println("<font color=red>");
              client.print("ALLARM DS2");
              client.println("<br/>");
              digitalWrite(7, HIGH);
            }
            else {
              client.println("<br/>");
              client.println("<font color=green>");
              client.print("DS STATUS OK");
              client.println("<br/>");
              digitalWrite(7, LOW);
            }

            if (sensors.getTempCByIndex(2) > 35) {
              client.println("<br/>");
              client.println("<font color=red>");
              client.print("ALLARM DS3");
              client.println("<br/>");
              digitalWrite(8, HIGH);
            }
            else {
              client.println("<br/>");
              client.println("<font color=green>");
              client.print("DS STATUS OK");
              client.println("<br/>");
              digitalWrite(8, LOW);
            }
            if (volt_mis < 4.8) {
              client.println("<br/>");
              client.println("<font color=red>");
              client.print("ALLARM SUPPLY POWER");
              client.println("<br/>");
              digitalWrite(9, HIGH);
            }
            else {
              client.println("<br/>");
              client.println("<font color=green>");
              client.print("SUPPLY POWER STATUS OK");
              client.println("<br/>");
              digitalWrite(9, LOW);
            }

            client.println("<br/>");
            client.println("<br/>");
            client.println("<font color=orange>");
            client.println("<span style= font-size: 10px > by Lonelybit M.C.</span>");
            client.println("<img src= https://www.xxxxxxx.it/intersideraversor/intersideraversorweb.jpg alt= Image height=60 width=140>");
            //
            client.println("<br/>");
            client.println("<br/>");
            client.println("<font color=white>");
            client.print("PLANT LOCATION");
            client.println("<br/>");
            client.println("<br/>");
            client.println("<img src= https://www.xxxxxx.it/intersideraversor/schema.jpg alt= Image height=400 width=600>");
            //
            Serial.println("-----------------");
            //--------------
            excell();
            //--------------
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
        if (currentLine.endsWith("GET /H1")) {
          digitalWrite(3, HIGH);
        }
        if (currentLine.endsWith("GET /L1")) {
          digitalWrite(3, LOW);
        }
      }
    }
    client.stop();
    Serial.println(" client disconnected");
  }
}
void printEthernetStatus() {
  // print your board's IP address:
  Serial.println(Ethernet.localIP());
  Serial.print("IP Address: ");
  Serial.println(ip);

  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
}

void excell() {
  row_excel++; // row number + 1
  Serial.print("DATA,TIME,");
  //("LABEL,time,Hum,Temp C,Temp F,TempDS1,TempDS2,TempDS3,Voltage,Current Time,Client IP, Num Rows");
  Serial.print(hum);
  Serial.print(",");
  Serial.print(temp);
  Serial.print(",");
  Serial.print(fah);
  Serial.print(",");
  Serial.print (sensors.getTempCByIndex(0));
  Serial.print(",");
  Serial.print (sensors.getTempCByIndex(1));
  Serial.print(",");
  Serial.print (sensors.getTempCByIndex(2));
  Serial.print(",");
  Serial.print(volt_mis);
  Serial.print(",");
  Serial.print(currentTime);
  Serial.print(",");
  Serial.print(Ethernet.localIP());
  Serial.print(",");
  Serial.print(valAttivazione);
  Serial.print(",");
  Serial.println(row_excel);
}

il DHT legge in questo modo:
hum = dht.readHumidity();
temp = dht.readTemperature();

il DS18 (ne ho collegati 3 quindi sono indicizzati)
sensors.requestTemperatures();
Serial.print(sensors.getTempCByIndex(0));

Il tuo webserver di fatto non fa alcun distinguo sul contenuto della richiesta che arriva dal client e risponde sempre con la stessa pagina "costruita" a runtime.
Io non sono un grande fan di questo approccio, ma del resto è il più utilizzato in esempi e tutorial quindi capisco il perché tu lo abbia implementato cosi.

Ad ogni modo, l'assenza del file favicon.ino non dovrebbe comportare alcun problema proprio perché comunque vada tu rispondi qualcosa al browser (anche se non è quello che si aspetta).

Per quanto riguarda la seconda parte della richiesta, ovvero di mettere i dati online, la soluzione più "semplice" da implementare nel tuo caso secondo me, è sicuramente quella dello script PHP ospitato sul tuo spazio web che si connette al database mySQL di Aruba (che è tra l'altro l'unico modo per connettersi al DB in quanto Aruba non consente connessioni al DB dall'esterno)

Il fatto che Aruba non consenta connessioni dall'esterno non so se sia un limite o una protezione. Di fatto posso noleggiare, se servisse, un altro db. Ho trovato questo. In basso a sinistra si può scaricare il PDF che contiene "spiegazioni". https://www.maurodeberardis.it/index.php?option=com_content&view=article&id=93:rete-di-stazioni-remote-arduino&catid=12&Itemid=328

Si, come dicevo è il classico approccio con lo script PHP che riceve i dati con una richiesta GET proveniente dall'Arduino e si occupa di inserirli nel database.

Dovrebbe funzionare senza problemi anche nel tuo caso con Aruba, ma ovviamente dovrai adeguare sia lo sketch Arduino costruendo la richiesta GET con tutti i parametri che vuoi memorizzare nel DB e sia lo script PHP per gestirli ed eventualmente anche quello che mostra il risultato in tabella.

Ovviamente va contestualizzato... Quella tabella DBcreata in un linguaggio a me sconosciuto dove va messa?

Si tratta di una query SQL e va eseguita nel tuo database.

Non conosco nel dettaglio Aruba, ma praticamente tutti i servizi di hosting mettono a disposizione dei tool per interagire sia con lo spazio disponibile che con il database associato.
Nella dashboard del tuo sito web dovresti un link per l'accesso a questi strumenti.
Nella maggioranza dei casi si tratta di phpMyAdmin.
Questo è un sito demo con cui puoi fare qualche test.

Per eseguire la query dell'esempio di cui hai messo il link, basta andare nella tab SQL e fare copia/incolla e poi premere esegui.

Occhio che la query è divisa in 2 parti che secondo me ti conviene fare separatamente: la prima per la creazione del database CREATE DATABASE stazioni; e la seconda per la creazione della tabella.
Il database Aruba potrebbe non consentirti l'esecuzione della prima perché spesso è concesso la creazione di un unico database associato al sito web.

La pagina che mi hai linkato è esattamente il db che ho io. La creazione del db l'ho già fatta... Ci provo. Grazie

Ciao, mi manca questo pezzo... In pratica Sql.


1 come vedi la seriale stampa; ho lasciato l'ingresso flottante così cambia da solo il valore della variabile. 2 La pagina caricata sul mio sito risponde. 3 Io penso che il codice PHP sia quello scritto in "Visualizzo come codice PHP" che vedi nel SQL. Se così fosse è una semplicissima riga. Dove la metto? Mi rispondo da solo: nel codice caricato nella mia pagina?! Dove?

<!DOCTYPE html>
<html>
<head><title>Rete di stazioni di monitoraggio Arduino</title></head>
<style>
td,th{border:1px solid #aaaaaa;text-align:center}
</style>
<script language="JavaScript">
function valida()
{
dr=document.form1.data_ril.value;
if(dr=="")
{
alert("Inserire la data");
return false;
}
}
</script>
<body>
<?php
if(!isset($_GET["submit"]))
{ ?>
<form name="form1" onsubmit="return valida()" >
<h2>Rete di stazioni di monitoraggio Arduino</h2>
<label>Data di rilevamento</label><br/>
<input type="date" id="data_ril" name="data_ril">
<br/><br/><label>Stazioni di monitoraggio</label>
<ul>
<li><input type="radio" name="stazioni" value="T" checked>
Tutte le stazioni</li>
<li><input type="radio" name="stazioni" value="1">
Stazione 1 - Viale Europa Teramo</li>
<li><input type="radio" name="stazioni" value="2">
Stazione 2 - Piazza Dante Teramo</li>
</ul><br/>
<input type="submit" name="submit" value="Display dati">
<input type="reset" value="Reset">
</form>
<?php
}
else
{
$data_ril= $_GET['data_ril'];
$stazioni=$_GET['stazioni'];
$aa=substr($data_ril,0,4);
$mm=substr($data_ril,5,2);
$gg=substr($data_ril,8,2);
$data=$gg."/".$mm."/".$aa;
$aa=(int)$aa; $mm=(int)$mm; $gg=(int)$gg;
$titolo="Data rilevamento: ".$data." - " ;
switch($stazioni)
{
case "T":
$filtrostazioni=" stazione>0 ";
$titolo.="Tutte le stazioni";
break;
case "1":
$filtrostazioni=" stazione=1 ";
$titolo.="Stazione 1";
break;
case "2":
$filtrostazioni=" stazione=2 ";
$titolo.="Stazione 2";
break;
default:
}
echo"<h2>Rete di stazioni di monitoraggio Arduino</h2>";
echo"<h2>$titolo</h2>";
$conn=mysqli_connect("myhost","myusername","mypassword","stazioni");
/* $conn=mysqli_connect("localhost","root","mypassword","stazioni");
se utilizzo un Server locale*/
$s="Select * from misure where
Year(dataora)=$aa And Month(dataora)=$mm And Day(dataora)=$gg
And $filtrostazioni
order by dataora Asc";
$q=mysqli_query($conn,$s);
$nr=mysqli_num_rows($q);
if ($nr==0)
{
echo "<br><br>Nessun dato trovato<br/<br/>";
}
else
{
echo "<table width=30%>";
echo "<tr><th>Nr</th><th>Stazione</th>
<th>Time misura</th><th>Luminosita'</th>
</tr>";
$k=0;
while($r=mysqli_fetch_array($q))
{
$k++;
$timemisura=substr($r[2],11,8);
echo "<tr><td>$k</td>
<td>$r[1]</td><td>$timemisura</td>
<td>$r[3]</td></tr>";
}
echo"</table>";
}
mysqli_close($conn);
echo"<br/><br/><a href='displaydati.php'>Scegli un'altra data</a>";
}
?>
</body>
</html>



This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.