<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ethernet Shield Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/ethernet-shield/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/ethernet-shield/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Sun, 13 Nov 2022 10:22:09 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://logicaprogrammabile.it/wp-content/uploads/2017/11/cropped-logicaprogrammabile-logo-02-32x32.png</url>
	<title>Ethernet Shield Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/ethernet-shield/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Arduino MKR Zero e WIZ850io</title>
		<link>https://logicaprogrammabile.it/arduino-mkr-zero-wiz850io/</link>
					<comments>https://logicaprogrammabile.it/arduino-mkr-zero-wiz850io/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Sun, 13 Nov 2022 09:51:59 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Ethernet Shield]]></category>
		<category><![CDATA[IOT]]></category>
		<category><![CDATA[w5500]]></category>
		<category><![CDATA[wiz850]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=6782</guid>

					<description><![CDATA[<p>Collegare una scheda ethernet WIZ850 ad Arduino MKR Arduino dispone di diverse shield che permettono di collegarci a una rete lan cablata come ad esempio la MKR ETH. Esistono sul mercato altri dispositivi che svolgono la stessa funzione con costi contenuti e form factor molto...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-mkr-zero-wiz850io/">Arduino MKR Zero e WIZ850io</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Collegare una scheda ethernet WIZ850 ad Arduino MKR</h1>
<p>Arduino dispone di diverse shield che permettono di collegarci a una rete lan cablata come ad esempio la <a href="https://amzn.to/3hCuwl6">MKR ETH</a>. Esistono sul mercato altri dispositivi che svolgono la stessa funzione con costi contenuti e form factor molto piccoli. Uno di questi e la scheda WIZ850io prodotta da <a href="https://amzn.to/3O1DLHt">WIZnet</a>, dotata di chip wiznet w5500 lo stesso utilizzato per la MKR ETH.</p>
<p>Questa scheda ha una dimensione del pcb di 25mm X 23mm e un costo di circa 20 euro. Di seguito la pin function della scheda:</p>
<figure id="attachment_6785" aria-describedby="caption-attachment-6785" style="width: 447px" class="wp-caption aligncenter"><img fetchpriority="high" decoding="async" class="wp-image-6785 size-full" src="https://logicaprogrammabile.it/wp-content/uploads/2022/11/wiz850io.png" alt="wiz850 form factor and pinfunction" width="447" height="320" srcset="https://logicaprogrammabile.it/wp-content/uploads/2022/11/wiz850io.png 447w, https://logicaprogrammabile.it/wp-content/uploads/2022/11/wiz850io-300x215.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2022/11/wiz850io-150x107.png 150w" sizes="(max-width: 447px) 100vw, 447px" /><figcaption id="caption-attachment-6785" class="wp-caption-text">wiz850io pins function</figcaption></figure>
<p>Come possiamo vedere l&#8217;alimentazione della scheda richiede una tensione di 3.3V, è quindi consigliato utilizzare schede con tensione di funzionano di 3.3v, questo per avere i livelli logici con questa tensione. Il bus di comunicazione è affidato all&#8217;interfaccia SPI. La figura seguente mostra i collegamenti tra una Arduino MKR Zero e la scheda WIZ850io:</p>
<p><img decoding="async" class="aligncenter size-full wp-image-6788" src="https://logicaprogrammabile.it/wp-content/uploads/2022/11/MKR_Zero_wiz850io.png" alt="MKR Zero connect to WIX850io" width="731" height="358" srcset="https://logicaprogrammabile.it/wp-content/uploads/2022/11/MKR_Zero_wiz850io.png 731w, https://logicaprogrammabile.it/wp-content/uploads/2022/11/MKR_Zero_wiz850io-300x147.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2022/11/MKR_Zero_wiz850io-150x73.png 150w, https://logicaprogrammabile.it/wp-content/uploads/2022/11/MKR_Zero_wiz850io-585x286.png 585w" sizes="(max-width: 731px) 100vw, 731px" /></p>
<p>in dettaglio i collegamenti descritti nella tabella seguente:</p>
<table align="center">
<tbody>
<tr>
<th>Pin Arduino</th>
<th>Pin WIZ850io</th>
</tr>
<tr>
<td>VCC</td>
<td>3.3V</td>
</tr>
<tr>
<td>GND</td>
<td>GND</td>
</tr>
<tr>
<td>Reset</td>
<td>RSTn</td>
</tr>
<tr>
<td>MISO (10)</td>
<td>MISO</td>
</tr>
<tr>
<td>SCK (9)</td>
<td>SCLK</td>
</tr>
<tr>
<td>MOSI (8)</td>
<td>MOSI</td>
</tr>
<tr>
<td>SS (7)</td>
<td>SCNn</td>
</tr>
</tbody>
</table>
<p>Per verificare se tutti i collegamenti sono stati eseguiti correttamente possiamo utilizzare il codice seguente (esempio linkstatus della libreria Arduino ethernet):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp">#include &lt;SPI.h&gt;
#include &lt;Ethernet.h&gt;

void setup() {
  //inizializzo la wiz850io
  //il pin chip select è stato collegato al pin 7
  //della scheda arduino. se lo collegate in un altro pin dovete
  //modificare il numero del pin all'interno del metodo init()
  Ethernet.init(7);
  
  //inizializzazione seriale
  Serial.begin(9600);
}

void loop() {
  //verifico se il cavo lan è collegato e se esiste un link
  //con una periferica ethernet
  auto link = Ethernet.linkStatus();
  Serial.print("Link status: ");
  switch (link) {
    case Unknown:
      Serial.println("Unknown");
      break;
    case LinkON:
      Serial.println("ON");
      break;
    case LinkOFF:
      Serial.println("OFF");
      break;
  }
  delay(1000);
}</pre>
<p>Questa scheda permette di implementare una interfaccia di rete cablata in tutte le schede Arduino dotate di porta SPI.</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-mkr-zero-wiz850io/">Arduino MKR Zero e WIZ850io</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-mkr-zero-wiz850io/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Datalogger con Raspberry SQLite e Arduino</title>
		<link>https://logicaprogrammabile.it/datalogger-remoto-raspberry-sqlite-arduino/</link>
					<comments>https://logicaprogrammabile.it/datalogger-remoto-raspberry-sqlite-arduino/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Sun, 28 Aug 2022 06:00:30 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Tutorial Raspberry PI]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DataLogger]]></category>
		<category><![CDATA[dht11]]></category>
		<category><![CDATA[Ethernet Shield]]></category>
		<category><![CDATA[raspberry]]></category>
		<category><![CDATA[Sqlite]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=6691</guid>

					<description><![CDATA[<p>Costruire un datalogger remoto con Raspberry e Arduino Codice Python sul Raspberry SQLite Codice sull&#8217;Arduino MKR Zero Il progetto che ho realizzato riguarda il monitoraggio di temperatura e umidità all&#8217;interno di un locale tecnico. I dati rilevati da un sensore DHT22 vengono acquisti da una...</p>
<p>The post <a href="https://logicaprogrammabile.it/datalogger-remoto-raspberry-sqlite-arduino/">Datalogger con Raspberry SQLite e Arduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Costruire un datalogger remoto con Raspberry e Arduino</h1>
<ul>
<li><a href="#Raspberry_Sqlite">Codice Python sul Raspberry SQLite</a></li>
<li><a href="#Arduino_MKR_Zero">Codice sull&#8217;Arduino MKR Zero</a></li>
</ul>
<p>Il progetto che ho realizzato riguarda il monitoraggio di temperatura e umidità all&#8217;interno di un locale tecnico. I dati rilevati da un <a href="https://amzn.to/3q5qLpr" target="_blank" rel="noopener">sensore DHT22</a> vengono acquisti da una <a href="https://amzn.to/3cpgcu0" target="_blank" rel="noopener">Arduino MKR Zero</a> e tramite una <a href="https://amzn.to/3ArbPGB" target="_blank" rel="noopener">shield MKR ETH</a> inviati a un computer <a href="https://amzn.to/3R8XhSU" target="_blank" rel="noopener">Raspberry PI 4</a> che dopo averli acquisiti li memorizza all&#8217;interno di una tabella <a href="https://sqlite.org/index.html" target="_blank" rel="noopener">SQLite</a>.</p>
<p>Il protocollo utilizzato per l&#8217;invio dei dati si basa su UDP come abbiamo <a href="https://logicaprogrammabile.it/comunicazione-python-udp-computer-raspberry/" target="_blank" rel="noopener">visto in questo articolo</a>.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-6740" src="https://logicaprogrammabile.it/wp-content/uploads/2022/08/Ardu_Raspi.png" alt="Arduino Raspberry sqlite" width="458" height="451" srcset="https://logicaprogrammabile.it/wp-content/uploads/2022/08/Ardu_Raspi.png 458w, https://logicaprogrammabile.it/wp-content/uploads/2022/08/Ardu_Raspi-300x295.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2022/08/Ardu_Raspi-150x148.png 150w, https://logicaprogrammabile.it/wp-content/uploads/2022/08/Ardu_Raspi-80x80.png 80w" sizes="(max-width: 458px) 100vw, 458px" /></p>
<p>I dati sarebbero potuti essere memorizzati in un semplice file di testo ma ho preferito usare un database in modo tale da estrarli in modo rapido utilizzando semplici query. Il database contiene per ora una tabella contenente i seguenti campi:</p>
<table align="center">
<tbody>
<tr>
<th>Nome Campo</th>
<th>Tipo Campo</th>
</tr>
<tr>
<td>ID</td>
<td>
<div>
<div>INTEGER PRIMARY KEY AUTOINCREMENT</div>
</div>
</td>
</tr>
<tr>
<td>Data</td>
<td>
<div>
<div>TIMESTAMP DEFAULT CURRENT_TIMESTAMP</div>
</div>
</td>
</tr>
<tr>
<td>
<div>
<div>Temperatura</div>
</div>
</td>
<td>
<div>
<div>VARCHAR(50) NOT NULL</div>
</div>
</td>
</tr>
<tr>
<td>
<div>
<div>Umidita</div>
</div>
</td>
<td>
<div>
<div>VARCHAR(50) NOT NULL</div>
</div>
</td>
</tr>
</tbody>
</table>
<p id="Raspberry_Sqlite">Il codice seguente gira sul Raspberry Pi 4; ho inserito diversi commenti che spiegano le varie istruzioni contenute nel programma:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import sqlite3
import socket
import threading
import time

#IP computer locale
UDP_IP_ADDR = "192.168.178.50"
#Porta computer locale
UDP_PORT_NUMBER = 20002

ip_port_Data = (UDP_IP_ADDR, UDP_PORT_NUMBER)
   
def client_Receive_Data():
    print("Avvio THREAD Receive Data...")
    serversocket1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    serversocket1.bind(("192.168.178.30", 20001))
    msgToSend = str.encode("DB_OK")
    
    #crea connessione al database
    connection = sqlite3.connect('lopro.db')
    cursor = connection.cursor()
        
    try:            
        while True:            
            data, address = serversocket1.recvfrom(1024)
            strData = bytes.decode(data).split(":")
         
            sql = """ INSERT INTO tbl_log(Temperatura, Umidita) VALUES ('{}', '{}');""".format(strData[0], strData[1])
            
            print(sql)
            
            cursor.execute(sql)
            connection.commit()

            #invia al device una risposta
            serversocket1.sendto(msgToSend, ip_port_Data)
            time.sleep(1)
    except:
        print("errore")
        msgToSend = str.encode("ERRORE")
        serversocket1.sendto(msgToSend, ip_port_Data)
        connection.close()

def crea_tabella():
    #una volta creata la tabella possiamo evitare di chiamare
    #questa funzione ad ogni esecuzione del programma
    #crea connessione al database
    connection = sqlite3.connect('lopro.db')
    cursor = connection.cursor()
 
    #Se esiste la tabella cancellala
    #cursor.execute("DROP TABLE IF EXISTS tbl_log")
 
    # Crea la tabella se non esiste
    table = """ CREATE TABLE IF NOT EXISTS tbl_log (
            ID INTEGER PRIMARY KEY AUTOINCREMENT,
            Data TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            Temperatura VARCHAR(50) NOT NULL,
            Umidita VARCHAR(50) NOT NULL      
        ); """
 
    cursor.execute(table)
    cursor.close()
    connection.close()

 
def list_rows():
    print("list rows..")
    #crea connessione al database
    connection = sqlite3.connect('lopro.db')

    sql = """ SELECT * FROM tbl_log;"""

    cursor = connection.cursor()
    cursor.execute(sql)
    rows = cursor.fetchall()

    for row in rows:
        print(row)

    # Close the connection
    connection.close()

if __name__=="__main__":
    #Rimuovere il commento per creare la tabella
    #crea_tabella()
    #list_rows()
    #Avvio un thred
    print("Start program")
    t1 = threading.Thread(target=client_Receive_Data)
    t1.start()</pre>
<p id="Arduino_MKR_Zero">Questo è invece il codice che gira sulla Arduino MKR Zero; ho inserito diversi commenti che spiegano le varie istruzioni contenute nel programma:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp">#include &lt;SPI.h&gt;
#include &lt;Ethernet.h&gt;
#include &lt;EthernetUdp.h&gt;
#include &lt;DHT.h&gt;

#define DHTPIN 6
#define DHTTYPE DHT22

// creo un MAC address e un IP address per la scheda Arduino
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 178, 50);

//creo un ip address per il raspberry
IPAddress ip_remote(192, 168, 178, 30);
//creo una porta per la scheda Arduino
unsigned int localPort = 20002; 

//creo degli array di char per la ricezione e l'invio dei
//dati via udp
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
char chrBuffer[11];

//altre variabili 
String strTempUmid = "";
byte ciclo = 0;

// Creo degli oggetti per l'utilizzo di udp e del 
//sensore dht
EthernetUDP Udp;
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  //inizializzo lo shield mkr eth
  Ethernet.init(5);

  //inizializzo la scheda di rete
  Ethernet.begin(mac, ip);

  //inizializzo la seriale
  Serial.begin(9600);
  
  // verifico la ethernet shield
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("MKR ETH non presente o configurata in modo errato!");
    while (true) {
      delay(1);
    }
  }

  //inizializzo l'oggetto udp
  Udp.begin(localPort);
  //inizializzo l'oggetto dht
  dht.begin();
}

void loop() {

  //verifico presenza pacchetti udp in arrivo
  int packetSize = Udp.parsePacket();
  
  //se coi sono pacchetti
  if (packetSize) {
    //Serial.println(packetSize);
    //leggo i pacchetti e gli inserisco nell'array di char
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    //printo i dati ricevuti
    Serial.println(packetBuffer);
  }

  //leggo umidità e temperatura dal sensore dht
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  //creo una stringa del tipo temp:umid
  strTempUmid = "";
  strTempUmid.concat(t);
  strTempUmid.concat(":");
  strTempUmid.concat(h);
  //printo la stringa sul ser mon
  Serial.println(strTempUmid);
  //converto la stringa in un array di char
  strTempUmid.toCharArray(chrBuffer, strTempUmid.length());

  //inizializzo la connessione con ip e porta del Raspberry
  Udp.beginPacket(ip_remote, 20001);
  //Scrivo i dati nel buffer
  Udp.write(chrBuffer);
  //invio i dati
  Udp.endPacket();

  //attendo un minuto prima del prossimo invio
  for (ciclo = 0; ciclo &lt; 60; ciclo++)
    delay(1000);

}</pre>
<p>Ogni minuto viene inviata una unica stringa contenente i dati di temperatura e umidita che il codice python provvederà a separate in due dati distinti per essere caricati sul database.</p>
<h2>Memorizzare solo le variazioni significative su Raspberry SQLite</h2>
<p>Possiamo ottimizzare lo spazio sulla tabella (e di conseguenza sul filesystem del Raspberry) memorizzando solo i dati che hanno una variazione significativa. In questo modo il monitoraggio rimane costante perché comunque l&#8217;Arduino legge e invia i dati ogni minuto ma posso risparmiare spazio sul database salvando solo le variazioni significative. Sulla tabella memorizzo anche il timestamp e quindi posso ricostruire l&#8217;andamento di temperatura e umidità interpolando i dati.</p>
<p>Il codice seguente mostra la modifica alla funzione client_Receive_Data() in modo tale da memorizzare solo i dati che hanno una variazione di 0.5 rispetto ai dati della lettura precedente rilevata dalla scheda Arduino:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def client_Receive_Data():
    print("Avvio THREAD Receive Data...")
    serversocket1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    serversocket1.bind(("192.168.178.30", 20001))
        
    # crea connessione al database
    connection = sqlite3.connect('lopro.db')
    cursor = connection.cursor()
    #creo due variabili per memorizzare i dati delle 
    #letture di temp e umid
    temp_prec = 0
    umid_prec = 0
    
    try:
        while True:
            data, address = serversocket1.recvfrom(1024)
            strData = bytes.decode(data).split(":")

            #verifico se i dati appena letti differiscono di 0.5 dai valori della lettuare precedente
            if (abs(temp_prec - float(strData[0])) &gt; 0.5) or (abs(umid_prec - float(strData[1])) &gt; 0.5) :
                print("Variazione di Temp e Hum")  
                sql = """ INSERT INTO tbl_log(Temperatura, Umidita) VALUES ('{}', '{}');""".format(strData[0], strData[1])

                #memorizzo i dati per poterli confrontare con quelli
                #che arrivano dalla scheda arduino
                temp_prec = float(strData[0])
                umid_prec = float(strData[1])
                #visualizzo la stringa sql
                print(sql)
                #eseguo la stringa sql insert avviando una transazione
                cursor.execute(sql)
                #confermo la transazione
                connection.commit()
                
                # invia al device una risposta
                msgToSend = str.encode("DB_OK")
                serversocket1.sendto(msgToSend, ip_port_Data)
            else:
                print("Nessuna variazione di Temp e Hum")  
                # invia al device una risposta
                msgToSend = str.encode("DB_NOK")
                serversocket1.sendto(msgToSend, ip_port_Data)
            
            time.sleep(1)
    except:
        print("errore")
        msgToSend = str.encode("ERRORE")
        serversocket1.sendto(msgToSend, ip_port_Data)
        connection.close()</pre>
<p>L&#8217;utilizzo congiunto di Raspberry e Arduino ci permette di realizzare progetti che superano i limiti dati dalle singole schede.</p>
<p>&nbsp;</p>
<p>The post <a href="https://logicaprogrammabile.it/datalogger-remoto-raspberry-sqlite-arduino/">Datalogger con Raspberry SQLite e Arduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/datalogger-remoto-raspberry-sqlite-arduino/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Utilizzare la libreria Webduino</title>
		<link>https://logicaprogrammabile.it/utilizzare-la-libreria-webduino/</link>
					<comments>https://logicaprogrammabile.it/utilizzare-la-libreria-webduino/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 16 May 2012 13:29:19 +0000</pubDate>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Arduino Webserver]]></category>
		<category><![CDATA[Ethernet Shield]]></category>
		<category><![CDATA[webduino]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2769</guid>

					<description><![CDATA[<p>Primi passi nell&#8217;uso della libreria Webduino Esistono diverse librerie che tendono a risolvere o a migliorare alcune classi base implementate in Arduino 1.0. Webduino è sicuramente una di queste, il nome è un chiaro riferimento al mondo ethernet/web e le sue principali funzioni sono elencate...</p>
<p>The post <a href="https://logicaprogrammabile.it/utilizzare-la-libreria-webduino/">Utilizzare la libreria Webduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Primi passi nell&#8217;uso della libreria Webduino</h3>
<p>Esistono diverse librerie che tendono a risolvere o a migliorare alcune classi base implementate in <strong>Arduino 1.0</strong>. <strong>Webduino</strong> è sicuramente una di queste, il nome è un chiaro riferimento al mondo ethernet/web e le sue principali funzioni sono elencate di seguito:</p>
<ul>
<li>elaborazione dei parametri racchiusi in un URL</li>
<li>elaborazione dei metodi HTTP come GET, POST, PUT, HEAD, DELETE e PATCH</li>
<li>gestione dei FORM</li>
<li>Gestione di Immagini</li>
<li>interfaccia JSON/REST</li>
<li>autenticazione BASE64</li>
</ul>
<p>Attualmente, la versione disponibile è la 1.7  prelevabile direttamente da <strong>Github</strong> seguendo questo indirizzo <a href="https://github.com/sirleech/Webduino" target="_blank">https://github.com/sirleech/Webduino</a></p>
<p><span id="more-2769"></span></p>
<p>Una volta scaricato il file zip possiamo scompattarlo posizionandolo all&#8217;interno della cartella <strong>libraries</strong> cercando di non modificare la struttura interna della cartella<strong><br />
</strong></p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2012/05/webduinolib.png"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2778" title="webduinolib" src="https://logicaprogrammabile.it/wp-content/uploads/2012/05/webduinolib-300x229.png" alt="Libreria webduino" width="300" height="229" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/05/webduinolib-300x229.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2012/05/webduinolib.png 421w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Per eseguire il codice ho usato l&#8217;<strong>Arduino Ethernet</strong>, ma è possibile utilizzare benissimo la <strong>Arduino UNO</strong> con lo shield ethernet.</p>
<p>Passiamo direttamente alla pratica creando un nuovo sketch ed inserendo, per prima, le seguenti librerie</p>
<p>[c]<br />
#include &lt;Ethernet.h&gt;<br />
#include &lt;SPI.h&gt;<br />
#include &lt;WebServer.h&gt; //libreria webduino<br />
[/c]</p>
<p>e subito di seguito le variabili e gli oggetti necessari al corretto funzionamento del modulo ethernet e della libreria <strong>Webduino</strong>:</p>
<p>[c]<br />
//variabili statiche per il mac address e l&#8217;ip address<br />
static byte mac_Add[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };<br />
//cambiare l&#8217;ip in funzione della propria rete<br />
static byte ip_Add[] = { 192, 168, 1, 220 };<br />
//creazione oggetto Webduino<br />
WebServer webserver(&quot;&quot;, 80);<br />
[/c]</p>
<p>Il mac address e l&#8217;ip address sono definiti come per la libreria nativa Ethernet. L&#8217;oggetto webserver invece è relativo alla libreria Webduino ed accetta due parametri, il primo, che in questo caso è vuoto, permette di specificare un percorso (URL), mentre il secondo rappresenta la porta in cui il server rimarrà in ascolto.<br />
Ad esempio potremmo avere :</p>
<p>[c]<br />
//il web server risponde sulla porta 80 e richiama la root page /<br />
WebServer webserver(&quot;&quot;, 80);<br />
//il web server risponde sulla porta 80 e richiama la pagina digital.html<br />
WebServer webserver(&quot;digital.html&quot;, 80);<br />
//il web server risponde sulla porta 80 e richiama la pagina analog.html<br />
WebServer webserver(&quot;analog.html&quot;, 80);<br />
//il web server risponde sulla porta 8085 e richiama la root page predefinita<br />
WebServer webserver(&quot;/test&quot;, 8085);<br />
[/c]</p>
<p>qui devo fare una precisazione. le pagine specificare non sono in effetti come le conosciamo (codice html) ma sono dei riferimenti, delle stringhe, che richiamano funzioni contenenti codice html. Vedremo meglio negli esempi successivi cosa intendo.</p>
<p>Nel blocco <strong>setup</strong> inseriamo il codice per inizializzare gli oggetti dichiarati precedentemente e, con alcune istruzioni aggiuntive, permettiamo di elaborare le richieste provenienti dal browser</p>
<p>[c]<br />
void setup()<br />
{<br />
  //inizializzo l&#8217;ethernet shield con il mac e il address<br />
  Ethernet.begin(mac_Add, ip_Add);</p>
<p>  //definisci l&#8217;azione di default che verrà eseguita quando l&#8217;utente<br />
  //naviga nella root del sito (192.168.1.220/)<br />
  webserver.setDefaultCommand(&amp;Start);</p>
<p>  //avvia il web server<br />
  webserver.begin();</p>
<p>}<br />
[/c]</p>
<p>il metodo <strong>setDefaultCommand</strong> permette di eseguire la funzione <strong>Start</strong> (inserita come parametro) in modo da elaborare la richiesta del browser.</p>
<p>All&#8217;interno del blocco <strong>loop</strong> bisogna inserire l&#8217;istruzione che &#8216;si accorge&#8217; delle richieste del client e ne gestisce i relativi processi:</p>
<p>[c]<br />
void loop()<br />
{<br />
  //elabora costantemente tutte le richieste provenienti dal browser<br />
  webserver.processConnection();<br />
}<br />
[/c]</p>
<p>Per completare il codice, ed eseguire quindi un test operativo, scriviamo le istruzioni che compongono la funzione <strong>Start</strong>, che in questo esempio verrà eseguita come operazione di default quando un utente si collega al webserver semplicemente digitando nel browser l&#8217;indirizzo ip dell&#8217;Arduino.</p>
<p>[c]<br />
//funzione Start<br />
void Start(WebServer &amp;server, WebServer::ConnectionType type, char *, bool)<br />
{<br />
  //restituisce al browser l&#8217;intestazione http 200 OK<br />
  server.httpSuccess();</p>
<p>  //gestisco il tipo di richiesta HEAD<br />
  if (type != WebServer::HEAD)<br />
  {<br />
    //Memorizzo nella memoria programma la stringa html e gli assegno il nome strMsg<br />
    P(strMsg) = &quot;&lt;h1&gt;Logicaprogrammabile&lt;/h1&gt;&quot;;</p>
<p>    //recupero dalla memoria programma la stringa contrassegnata con il nome strMsg<br />
    //e la invio come output al browser<br />
    server.printP(strMsg);<br />
  }<br />
}<br />
[/c]</p>
<p>Il codice completo permette di eseguire, caricandolo nell&#8217;Arduino ethernet, il test della libreria</p>
<p>[c]<br />
#include &lt;Ethernet.h&gt;<br />
#include &lt;SPI.h&gt;<br />
#include &lt;WebServer.h&gt; //libreria webduino&lt;/code&gt;</p>
<p>//variabili statiche per il mac address e l&#8217;ip address<br />
static byte mac_Add[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };<br />
//cambiare l&#8217;ip in funzione della propria rete<br />
static byte ip_Add[] = { 192, 168, 1, 220 };<br />
//creazione oggetto Webduino<br />
WebServer webserver(&quot;&quot;, 80);</p>
<p>//funzione Start<br />
void Start(WebServer &amp;server, WebServer::ConnectionType type, char *, bool)<br />
{<br />
  //restituisce al browser l&#8217;intestazione http 200 OK<br />
  server.httpSuccess();</p>
<p>  //gestisco il tipo di richiesta HEAD<br />
  if (type != WebServer::HEAD)<br />
  {<br />
    //Memorizzo nella memoria programma la stringa html e gli assegno il nome strMsg<br />
    P(strMsg) = &quot;&lt;h1&gt;Logicaprogrammabile&lt;/h1&gt;&quot;;</p>
<p>    //recupero dalla memoria programma la stringa contrassegnata con il nome strMsg<br />
    //e la invio come output al browser<br />
    server.printP(strMsg);<br />
  }<br />
}</p>
<p>void setup()<br />
{<br />
  //inizializzo l&#8217;ethernet shield con il mac e il address<br />
  Ethernet.begin(mac_Add, ip_Add);</p>
<p>  //definisci l&#8217;azione di default che verrà eseguita quando l&#8217;utente<br />
  //naviga nella root del sito<br />
  webserver.setDefaultCommand(&amp;Start);</p>
<p>  //avvia il web server<br />
  webserver.begin();</p>
<p>}</p>
<p>void loop()<br />
{<br />
  //elabora costantemente tutte le richieste provenienti dal browser<br />
  webserver.processConnection();<br />
}<br />
[/c]</p>
<p>Tramite il nostro browser preferito digitiamo l&#8217;indirizzo ip dell&#8217;Arduino; dovremmo visualizzare qualcosa del genere</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2012/05/TestPage.png"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2793" title="TestPage" src="https://logicaprogrammabile.it/wp-content/uploads/2012/05/TestPage-300x145.png" alt="Test Webduino library" width="300" height="145" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/05/TestPage-300x145.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2012/05/TestPage.png 355w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Fatte diverse prove, modificando il codice, e leggendo i commenti per capire i vari passi da eseguire per iniziare ad usare la libreria Webduino. Nei prossimi articoli inseriremo alcune funzioni aggiuntive.</p>
<p>The post <a href="https://logicaprogrammabile.it/utilizzare-la-libreria-webduino/">Utilizzare la libreria Webduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/utilizzare-la-libreria-webduino/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Arduino Ethernet Shield controllo remoto via web con http</title>
		<link>https://logicaprogrammabile.it/arduino-ethernet-shield-controllo-remoto-via-web-con-http/</link>
					<comments>https://logicaprogrammabile.it/arduino-ethernet-shield-controllo-remoto-via-web-con-http/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 31 Aug 2011 14:39:46 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Controllo remoto]]></category>
		<category><![CDATA[Ethernet Shield]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[Web Server]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=1883</guid>

					<description><![CDATA[<p>Come realizzare un controllo remoto con Arduino basato su http Il mondo è sempre più connesso, non solo le persone sono presenti su internet ma anche gli oggetti, tramite semplici circuiti, possono collegarsi alla rete, condividendo dati ed interagendo con l&#8217;ambiente, acquisendo grandezze fisiche (tramite...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-ethernet-shield-controllo-remoto-via-web-con-http/">Arduino Ethernet Shield controllo remoto via web con http</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">Come realizzare un controllo remoto con Arduino basato su http </h1>


<p>Il mondo è sempre più connesso, non solo le persone sono presenti su internet ma anche gli oggetti, tramite semplici circuiti, possono collegarsi alla rete, condividendo dati ed interagendo con l&#8217;ambiente, acquisendo grandezze fisiche (tramite sensori) o pilotando carichi utilizzando degli attuatori.</p>
<p>Controllare da remoto uno di questi dispositivi è una operazione affascinante sia per l&#8217;utilità di questa tecnica sia, perché no, far stupire i nostri amici accendendo una luce di casa tramite web!</p>
<p>Per chi è alle prime esperienze con <strong>Arduino</strong>, potrebbe pensare che la realizzazione di questo circuito possa essere complicato e costoso.</p>
<p>Fortunatamente il materiale necessario si riduce a una board <strong>Arduino UNO</strong> e all&#8217;Ethernet shield, più qualche componente esterno.</p>
<p>In questo articolo preferisco fare un piccolo accenno nel descrivere il funzionamento del sistema all&#8217;interno della rete lan.</p>
<p>Per il controllo remoto, bisogna eseguire alcune configurazioni aggiuntive che vedremmo successivamente.<br />Lo schema illustra il funzionamento del progetto:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1891 size-full" title="EthernetShield" src="https://logicaprogrammabile.it/wp-content/uploads/2011/08/EthernetShield.gif" alt="Controllo Remoto con Ethernet Shield ed Arduino UNO " width="390" height="525" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/08/EthernetShield.gif 390w, https://logicaprogrammabile.it/wp-content/uploads/2011/08/EthernetShield-222x300.gif 222w" sizes="auto, (max-width: 390px) 100vw, 390px" /></p>
<p><span id="more-1883"></span>I pc della rete e l&#8217;<strong>Arduino UNO</strong> (con ethernet shield) sono collegati tra loro tramite uno switch.</p>
<p>Il pc eseguirà, usando un browser, delle richieste http, per recuperare, ad esempio, il valore di una tensione applicata su un pin analogico, oppure accendere o spegnere un led, applicato su un pin digitale in uscita.</p>
<p>Colleghiamo la shield ethernet al nostro <strong>Arduino UNO</strong>, inseriamo un cavo lan dritto, (che dal connettore rg45 dello shield si collega ad una porta qualsiasi dello switch), inseriamo il cavo USB (che dall&#8217;Arduino UNO si collega alla porta del pc) e diamo alimentazione a tutto il sistema.</p>
<p>Apriamo l&#8217;IDE di Arduino e scriviamo questo codice:</p>
<pre class="lang:arduino decode:true">//Librerie impiegate per il progetto
#include &lt;SPI.h&gt;
#include &lt;Ethernet.h&gt;

//Creao un array di byte per specificare il mac address
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//creo un array di byte per specificare l'indirizzo ip
byte ip[] = {10, 192, 1, 251};

//creo una variabile char per memorizzare i byte letti dal client
char Data_RX;

//creao un oggetto server che rimane in ascolto sulla porta
//specificata
Server ArduinoServer(80);

void setup()
{
  //inizializza lo shield con il mac e l'ip
  Ethernet.begin(mac, ip);
  //inizializza l'oggetto server
  ArduinoServer.begin();
}

void loop()
{
  //fai qualcosa!
  delay(10);
}</pre>
<p>I commenti nel codice spiegano a grandi linee il funzionamento dello stesso. Dopo aver inserito le due librerie che permettono di interfacciarsi all&#8217;ethernet shield, definiamo due array di byte, uno che contiene l&#8217;indirizzo fisico della scheda di rete (MAC address) e l&#8217;altro che contiene <a href="http://it.wikipedia.org/wiki/Indirizzo_ip" target="_blank" rel="noopener">l&#8217;indirizzo ip</a>.</p>
<p>Successivamente ho creato un oggetto Server che permette di rimanere in ascolto sulla porta specificata, in questo caso la porta 80, proprio quella utilizzata dal protocollo http.</p>
<p>La variabile Data_RX verrà impiegata successivamente per memorizzare i byte provenienti dal client.</p>
<p>Dentro il blocco<strong> setup()</strong> ci sono due importanti funzioni, la prima (<strong>Ethernet.begin(mac, ip);</strong>) serve per inizializzare il chip <strong>WIZnet</strong> con l&#8217;indirizzo<strong> mac</strong> e l&#8217;indirizzo <strong>IP</strong>, la seconda (<strong>ArduinoServer.begin();</strong>) avvia il server e lo mette in ascolto sulla porta 80 per le avvenutali richieste dei client.</p>
<p>Nel blocco <strong>loop()</strong> ho inserito un ritardo di 10ms, per il momento non eseguiamo altro.</p>
<p>Questo codice è utile per verificare, tramite un semplice <strong>ping</strong>, se l&#8217;ethernet shield è correttamente configurata e se risponde alle interrogazioni dei client.</p>
<p>Apriamo una finestra dei prompt dei comandi (Start-&gt;Esegui-&gt;cmd.exe)</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1898 size-full" title="Prompt dei comandi" src="https://logicaprogrammabile.it/wp-content/uploads/2011/08/cmd.jpg" alt="Arduino prompt dei comandi" width="412" height="223" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/08/cmd.jpg 412w, https://logicaprogrammabile.it/wp-content/uploads/2011/08/cmd-300x162.jpg 300w" sizes="auto, (max-width: 412px) 100vw, 412px" /></p>
<p>Digitiamo il comando <strong>ping</strong> seguito dall&#8217;indirizzo <strong>ip</strong> che abbiamo specificato nel codice dello skecth, nel mio caso:</p>
<p style="text-align: center;"><strong>ping 10.192.1.251</strong></p>
<p>se i collegamenti sono corretti, e il codice viene caricato senza intoppi, otterremo la risposta della scheda come illustrato di seguito:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1901 size-full" title="Test Ping" src="https://logicaprogrammabile.it/wp-content/uploads/2011/08/ping.jpg" alt="Arduino ethernet shield test ping" width="668" height="337" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/08/ping.jpg 668w, https://logicaprogrammabile.it/wp-content/uploads/2011/08/ping-300x151.jpg 300w" sizes="auto, (max-width: 668px) 100vw, 668px" /></p>
<p>Questo semplice test ci permette di escludere problemi di alimentazione della board o errori doviti al cavo di collegamento.</p>
<h5>Informazioni base su come configurare l&#8217;indirizzo ip</h5>
<p>Certamente tutti voi sapete come configurare un indirizzo ip nella rete, ma penso sia necessario, per chi è alle prime armi, scrivere una piccola nota.<br />L&#8217;indirizzo ip identifica univocamente un dispositivo nella rete, probabilmente se utilizzate un router, questo assegnerà in modo automatico un indirizzo ad ogni dispositivo collegato (<a href="http://it.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol" target="_blank" rel="noopener">DHCP</a>).</p>
<p>Per eseguire questi esperimenti dobbiamo disattivare il DHCP (sebbene sia possibile sfruttare questa funzione con Arduino ritengo, per semplicità, di non impiegarla) ed assegnare un indirizzo ip statico univoco ad ogni dispositivo della vostra rete.<br />Per fare ciò dovete andare nelle impostazioni del router e disattivare DHCP, poi per ogni pc della vostra rete, assegnate un indirizzo ip utilizzando le impostazioni della connessione di rete, tramite il pannello di controllo. Potete seguire questo link che mostra un video su come eseguire questa operazione</p>
<p style="text-align: center;">http://www.webip.info/cambiare_ip_windows_xp.php</p>
<p style="text-align: left;">Questo tutorial, invece, è per chi possiede Windows 7</p>
<p style="text-align: center;"><blockquote class="wp-embedded-content" data-secret="mbdeJAXRNN"><a href="https://www.elettroaffari.it/windows/windows-7/4541/come-impostare-indirizzo-ip-statico-windows-7/">Come Impostare un Indirizzo IP Statico su Windows</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;Come Impostare un Indirizzo IP Statico su Windows&#8221; &#8212; ElettroAffari.it" src="https://www.elettroaffari.it/windows/windows-7/4541/come-impostare-indirizzo-ip-statico-windows-7/embed/#?secret=VwI2n6DzZl#?secret=mbdeJAXRNN" data-secret="mbdeJAXRNN" width="500" height="282" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
<p style="text-align: left;">Ad esempio potremmo impostare il nostro pc con l&#8217;indirizzo 192.168.1.10 e la nostra Ethernet Shield con indirizzo 192.168.1.20</p>
<h4>Come rispondere ai client</h4>
<p>Una volta definiti gli indirizzi ip dei dispositivi della rete, possiamo iniziare a scrivere il codice che effettivamente risponde alle richieste dei client.<br />All&#8217;interno del blocco <strong>loop()</strong> bisogna creare un oggetto dalla classe Client, necessario ad ascoltare (listening) le richieste dei client.</p>
<p><br />L&#8217;idea di base è che il server aspetta la connessione di un client, controlla se ci sono dati da leggere e di conseguenza crea un oggetto Client.</p>
<pre class="lang:arduino decode:true">//Ascolto le richieste dei client controllo se ci sono dati da leggere
//e creo un oggetto relativo a client che sta interrogando l'Ethernet shield
Client pc_client = ArduinoServer.available();</pre>
<p>La funzione <strong>ArduinoServer.available()</strong> non è bloccante quindi viene eseguita ciclicamente all&#8217;interno del blocco <strong>loop()</strong>, di conseguenza il valore restituito dalla funzione in mancanza di una richiesta <strong>client</strong> è <strong>false</strong>.</p>
<p>E&#8217; necessario quindi controllare se l&#8217;oggetto pc_client istanziato sia diverso da <strong>false</strong> prima di poter instaurare la connessione.</p>
<pre class="lang:arduino decode:true">//Ascolto le richieste dei client controllo se ci sono dati da leggere
//e creo un oggetto relativo a client che sta interrogando l'Ethernet shield
Client pc_client = ArduinoServer.available();

//controllo se pc_client è true
if (pc_client != false)
{
  //se pc_client è true continuo ad utilizzarlo...
}</pre>
<p>All&#8217;interno del blocco <strong>if</strong> utilizzo un ciclo <strong>while</strong> per eseguire il codice necessario a scambiare dati tra client e server fintanto che la connessione con il client è attiva</p>
<pre class="lang:arduino decode:true">//Ascolto le richieste dei client controllo se ci sono dati da leggere
//e creo un oggetto relativo a client che sta interrogando l'Ethernet shield
Client pc_client = ArduinoServer.available();

//controllo se pc_client è diverso da false
if (pc_client != false)
{
  //controllo se il client è connesso
  while (pc_client.connected())
  {
    //eseguo questo codice fintanto che il client è connesso...
  }
}</pre>
<p>Riassumendo, quando la connessione è stabilita, <strong>Arduino</strong> esegue il codice all&#8217;interno del blocco <strong>while</strong>, questa è la parte più interessante perchè possiamo leggere e scrivere dati attraverso il protocollo di comunicazione http.</p>
<p>Continuiamo controllando se effettivamente ci sono byte da leggere impiegando la funzione <strong>read()</strong> dell&#8217;oggetto pc_client:</p>
<pre class="lang:arduino decode:true">//Ascolto le richieste dei client controllo se ci sono dati da leggere
//e creo un oggetto relativo a client che sta interrogando l'Ethernet shield
Client pc_client = ArduinoServer.available();

//controllo se pc_client è true
if (pc_client != false)
{
  //controllo continuamente che il client sia connesso
  while (pc_client.connected())
  {
    //Controllo se ci sono byte disponibili per la lettura
    if (pc_client.available())
    {
      //leggo i byte disponibili
      //provenienti dal client
      Data_RX = pc_client.read();
    }
  }
}</pre>
<p> </p>
<p>Ora eseguiamo un semplice test per verificare che il codice sin qui scritto funzioni.</p>
<p>Per avere un riscontro utilizziamo la classe<strong> Serial</strong> per inviare informazioni di debug tramite <strong>Serial Monitor</strong>. Inizializziamo, tramite <strong>Serial.Begin(9600)</strong>, la porta seriale nel blocco <strong>setup()</strong>.</p>
<p>Adesso posso controllare il contenuto della variabile <strong>Data_RX</strong> inviandoli al Serial Monitor.</p>
<pre class="lang:arduino decode:true">//Ascolto le richieste dei client controllo se ci sono dati da leggere
//e creo un oggetto relativo a client che sta interrogando l'Ethernet shield
Client pc_client = ArduinoServer.available();

//controllo se pc_client è true
if (pc_client != false)
{
  //controllo continuamente che il client sia connesso
  while (pc_client.connected())
  {
    //Controllo se ci sono byte disponibili per la lettura
    if (pc_client.available())
    {
      //leggo i byte disponibili
      //provenienti dal client
      Data_RX = pc_client.read();

      //invio i dati letti al Serial Monitor
      Serial.write(Data_RX);
    }
  }
}</pre>
<p> </p>
<p>Apriamo <strong>Serial Monitor</strong> con il relativo pulsante</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1912 size-full" title="SerialMonitor" src="https://logicaprogrammabile.it/wp-content/uploads/2011/08/SerialMonitor.jpg" alt="Serial Monitor" width="338" height="289" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/08/SerialMonitor.jpg 338w, https://logicaprogrammabile.it/wp-content/uploads/2011/08/SerialMonitor-300x256.jpg 300w" sizes="auto, (max-width: 338px) 100vw, 338px" /></p>
<p>Avviamo il nostro browser preferito, su un pc nella rete dove è collegato l&#8217;Arduino con Ethernet shield, e nella barra degli indirizzi digitiamo l&#8217;ip assegnato via codice all&#8217;ethernet shield.</p>
<p>Il browser eseguirà una richiesta <strong>GET</strong> che sarà elaborata dall&#8217;Arduino e visualizzata sul serial monitor.</p>
<p>Ecco il risultato:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1914 size-full" title="indirizzoIP" src="https://logicaprogrammabile.it/wp-content/uploads/2011/08/indirizzoIP.jpg" alt="Inserire indirizzo ip arduino" width="246" height="123" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1913 size-full" title="rispostaGET" src="https://logicaprogrammabile.it/wp-content/uploads/2011/08/rispostaGET.jpg" alt="Dati inviati dal browser all'arduino" width="347" height="231" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/08/rispostaGET.jpg 347w, https://logicaprogrammabile.it/wp-content/uploads/2011/08/rispostaGET-300x199.jpg 300w" sizes="auto, (max-width: 347px) 100vw, 347px" /></p>
<p>Anche in questo caso questo semplice test ci da la conferma che il codice appena scritto funziona egregiamente.</p>
<p>Continuiamo ad aggiungere il codice di risposta che l&#8217;Arduino invierà al browser che ha effettuato la richiesta GET</p>
<pre class="lang:arduino decode:true">//Ascolto le richieste dei client controllo se ci sono dati da leggere
//e creo un oggetto relativo a client che sta interrogando l'Ethernet shield
Client pc_client = ArduinoServer.available();

//controllo se pc_client è true
if (pc_client)
{
  //controllo continuamente che il client sia connesso
  while (pc_client.connected())
  {
    //Controllo se ci sono byte disponibili per la lettura
    if (pc_client.available())
    {
      //leggo i byte disponibili
      //provenienti dal client
      Data_RX = pc_client.read();

      //Attendo che tutti i byte siano letti
      //quando Data_RX contiene il carattere
      //di nuova line capisco tutti i byte sono
      //stati letti
      if (Data_RX == '\n')
      {
        //Invio la risposta al client
        //invio lo status code
        pc_client.println("HTTP/1.1 200 OK");
        //imposto il data type
        pc_client.println("Content-Type: text/html");
        pc_client.println();
        //invio codice html
        pc_client.print("&lt;html&gt;&lt;body&gt;&lt;h1&gt;");
        pc_client.print("Hello world Arduino Web Server&lt;/h1&gt;&lt;/body&gt;   &lt;/html&gt;");
        //aspetto 1 ms affinche la risposta giunga al browser del client
        delay(1);
        //esco dal ciclo while una volta completato l'invio della risposta
        break;
      }
    }
  }
  //chiudo la connessione
  pc_client.stop();
}</pre>
<p> </p>
<p>Verifico il valore di ogni byte letto, tramite l&#8217;istruzione <strong>if</strong>, fino a quando non ricevo un carattere di nuova linea <strong>\n</strong> (<strong>ox0A</strong> in esadecimale). Quando si verifica questa condizione la richiesta del client è stata letta completamente e quindi possiamo iniziare ad inviare la nostra risposta tramite la funzione <strong>println()</strong> dell&#8217;oggetto <strong>pc_client</strong>.</p>
<p>La prima stringa da inviare riguarda lo <strong>status code</strong> del protocollo http, composta dalla versione del protocollo http(<strong>HTTP/1.1</strong>) e dal codice <strong>200 OK</strong> che specifica al client la corretta elaborazione dei dati.<br />La seconda stringa specifica il tipo di dati (http Content types) che stiamo inviando al client con il protocollo http.<br />Queste due stringhe costituiscono l&#8217;header della risposta http.</p>
<p>A questo punto inviamo la stringa con il codice html che compone la pagina che verrà inviata al browser sul client. Terminata anche questa operazione non ci resta che uscire dal blocco <strong>while</strong> con l&#8217;istruzione <strong>break</strong>, e terminare la chiusura della connessione con la funzione<strong> stop()</strong> per predisporci ad elaborare ulteriori richieste.</p>
<p>Nel prossimo articolo vedremmo come sfruttare gli ingressi analogici per acquisire dei segnali e i pin digitali per attivare dei led.</p>
<p> </p><p>The post <a href="https://logicaprogrammabile.it/arduino-ethernet-shield-controllo-remoto-via-web-con-http/">Arduino Ethernet Shield controllo remoto via web con http</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-ethernet-shield-controllo-remoto-via-web-con-http/feed/</wfw:commentRss>
			<slash:comments>23</slash:comments>
		
		
			</item>
	</channel>
</rss>
