[IoT] Collegare Arduino Online – ENC28J60

banner

Al giorno d’oggi, come non mai, stiamo assistendo allo sviluppo di una nuova applicazione: Internet delle cose, o semplicemente IoT. In questo articolo vedremo come è semplice, utile ed economico collegare in Internet Arduino tramite un modulo a basso costo ed alcuni esempi d’applicazione: come visitare delle pagine Web tramite esso e salvare le rilevazioni di presenza acquisite tramite un sensore PIR.

IoT: cos'è? Su questo Blog se ne è già parlato ed è possibile trovare tutti gli articoli riguardante questo argomento nella categoria dedicata.

Prima di tutto vedremo il materiale del quale abbiamo bisogno per raggiungere il nostro scopo, come effettuare i collegamenti, le possibili applicazioni, un'operazione di test ed una proposta di applicazione.

Per il nostro esperimento avremo bisogno di:

  1. Arduino Uno;
  2. Board ENC28J60;
  3. Sensore PIR;
  4. Sensore temperatura DS18b20;
  5. Wires.

Naturalmente sarà necessario disporre di un router connesso in Internet ed un cavo Ethernet.

Arduino Uno

Sono quasi sicuro che la maggior parte di voi conoscano Arduino, ma visto che bisogna essere precisi, voglio dedicare giusto qualche riga per dire qualcosa ed indicare alcuni riferimenti utili.
Tramite la scheda Arduino è possibile imparare i principi fondamentali dell'elettronica e della programmazione.
Questa fantastica board fondamentalmente si basa su un circuito stampato che integra un microcontrollore con i pin connessi alle porte I/O, un regolatore di tensione ed un'interfaccia USB che permette la comunicazione con il computer per la programmazione del microcontrollore.
Alla board viene affiancato un ambiente di sviluppo integrato (IDE) disponibile per più sistemi operativi (per Linux, Apple Macintosh e Windows). Il codice utilizzato da Arduino è un inguaggio semplice e intuitivo derivato da C e C++ chiamato Wiring, liberamente scaricabile e modificabile.
Arduino Uno non è l'unica board Arduino esistente, infatti ne esistono molte altre, tutte diverse tra loro e volendo è possibile creare una board Arduino personalizzata in base alle proprie esigenze.
Il primo link che voglio indicare è quello del sito ufficiale Arduino.
Il secondo collegamento invece è quello della sezione Arduino di questo ricchissimo blog.

Board Enc28j60

Questa è una board davvero valida ed alternativa alla shield ufficiale basata sul chip Wiznet W5100 Ethernet Shied.
Il chip Wiznet W5100 montato sulla Ethernet Shield fornisce uno stack di protocolli per gestire sia TCP che UDP, con un buffer interno di 16kb e supporta fino a 4 connessioni simultanee.
Sempre sulla stessa è presente uno slot per micro SD utilizzabile per la gestione dei propri file.
Il suo unico “difetto” è il prezzo che si aggira intorno ai 30 euro.
Utilizzare una board basata sul controller Enc28j60 (datasheet) permette di abbassare notevolmente i costi per i propri pogetti, e a volte è senz’altro possibile rendere il proprio progetto più versatile.
Voglio segnalare un progetto che ritengo essere interessante: A credit card sized Ethernet Arduino.

Sensore PIR

Il sensore PIR è un tipo di sensore che misura i raggi infrarossi emessi nel suo campo visivo ed è, quindi, un sensore capace di stabilire se qualcosa (o qualcuno) è in movimento in una determinata area. Questo perchè è in grado di individuare ciò che ha una temperatura superiore allo 0 assoluto ed emette dell’energia sottoforma di radiazioni luminose.
Davanti al sensore è presente una lente (lente di Fresnel) che scompone l’ambiente in fasci in modo da creare le zone necessarie a percepire la differenza di temperatura generata da un corpo caldo che le attraversa.
Esistono diversi modelli di sensori PIR ma tutti svolgono la stessa funzione: se viene rilevato un movimento, lo stato passa da LOW a HIGH.

Sensore di temperatura DS18B20

Il sensore di temperatura DS18B20 è prodotto dalla Maxim IC (datasheet)
Questo sensore rileva la temperatura in un range di temperatura  fra un minimo di -55°C ed un massimo di +125°C con una precisione di +/-0.5°C.
La pecularietà di questo sensore di temperatura è rappresentata dal fatto che viene identificato da un numero seriale unico di 64-bit memorizzato all'interno di una ROM presente al loro interno. Questa caratteristica permette di poter utilizzare un vasto numero di sensori su di un unico bus di dati,  caratteristica di fondamentale importanza nella maggior parte di progetti di data-logging e di progetti basati sul controllo della temperatura.

Il protocollo di comunicazione utilizzato da questo sensore è lo Unique 1-Wire che richiede l'utilizzo di un unico pin per la comunicazione. Inoltre, non necessita di componenti esterni per funzionare. Le sue caratteristiche sono le seguenti:

  • Alimentazione: da 3.0V a 5.5V
  • Calibrato direttamente in ° Celsius (Centigradi)
  • Range di temperature misurabili: da -55°C a +125°C (da -67°F a 257°F)
  • Accuratezza: ±0.5°C (nel range -10°C / 85°C)
  • Risoluzione del sensore: da 9-bit a 12-bit (impostabile dall'utente)
  • Tempo di conversione di temperature in 12-bit word: 750ms
  • Ogni sensore ha un indirizzo univoco a 64-bit memorizzato in una ROM interna
  • Settaggi di allarme (non-volatili) definiti dall'utente
  • Temperature Alarm Condition

Per eseguire i test che proporrò in seguito, bisogna seguire questo schema per effettuare il collegamento tra i componenti:

Siamo pronti per effettuare il primo test, ma prima parliamo della libreria che verrà usata: EtherCard.
Per utilizzare il controller ENC28J60 esistono diverse librerie, ma quella che ritengo essere più completa e comoda da usare è proprio questa.
Il primo passo da fare naturalmente è quello di scaricare l’ultima versione della libreria ed importarla nell’IDE.
E’ possibile scaricarla quì.
Dopo avere scompattato l’archivio RAR, possiamo importarla nell’IDE cliccando su Sketch=>Importa libreria=> Add library.

L’esempio che sto per presentare è possibile trovarlo tra quelli della libreria denominato come webClient.

Ecco il codice quì di seguito:

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;

const char website[] PROGMEM = "www.google.com";

// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Serial.println(">>>");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println("...");
}

void setup () {
  Serial.begin(57600);
  Serial.println("\n[webClient]");

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println( "Failed to access Ethernet controller");
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");

  ether.printIp("IP: ", ether.myip);
  ether.printIp("GW: ", ether.gwip);
  ether.printIp("DNS: ", ether.dnsip);

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
    
  ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
 
  if (millis() > timer) {
    timer = millis() + 5000;
    Serial.println();
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback);
  }
}

Adesso vedremo come è possibile registrare le rilevazioni acquisite tramite il sensore di movimento.
Anche stavolta utilizzeremo un codice simile a quello precedente, l’unica differenza riguarda l’URL che viene visitato.
Infatti tramite la funzione GET saremo capaci di inviare il messaggio di allerta ad un nostro sito web dove sarà presente una pagina PHP che ha lo scopo di salvare le rievazioni e l’ora su un database MySQL.

Ecco il codice da caricare su Arduino:

In precedenza ho parlato di una pagina PHP da creare sul proprio sito per salvare i dati ricevuti, ma in realtà sono due: una servirà per ricevere e salvare le rilevazioni, mentre la seconda servirà per visualizzare le rilevazioni.
La pagina ricevi.php dovrà contenere il seguente codice:

code

La pagina visualizza.php questo altro:

<?php
// effettuo la connessione al mysql
$host = "host";
$database = "database";
$password = "password";
$link = mysql_connect($host, $database, $password);
if (!$link) {
   die('non connesso : ' . mysql_error());
}

// effettuo la connessione al database mysql
$db_selected = mysql_select_db('name_database', $link);
if (!$db_selected) {
   die ('Non &egrave; possibile connettersi al database : ' . mysql_error());
}
?>
<p align="center">
<table border="1" width="600" bgcolor="orange">
<tr>
<td>Data:</td><td>Stato:</td>
</tr>

<?php
$query = mysql_query("SELECT * FROM dati");
while($row = mysql_fetch_array($query)){
 $data = $row['data'];
 $data = $row['stato'];

echo "<tr><td>$data</td><td>$stato</td></tr>";
}
?>

Siamo giunti alla fine ed è il momento di fare alcune considerazioni.
Come è stato possibile vedere in questo articolo, è possibile realizzare un sistema IOT funzionante davvero con poco, l’unico limite è la propria fantasia.
Spero che questo articolo riesca a spronare chiunque abbia pensato di realizzare il proprio progetto
 IoT.

8 Comments

  1. Antonello Antonello 16 giugno 2014
  2. robertocoriglione 28 giugno 2014
  3. IvanScordato Ivan Scordato 28 giugno 2014
  4. IvanScordato Ivan Scordato 28 giugno 2014
  5. IvanScordato Ivan Scordato 28 giugno 2014
  6. Dario.Sciortino 9 giugno 2014
  7. Matteo B 13 giugno 2014
  8. Emanuele Tinari 12 novembre 2014

Leave a Reply