Smart Home by Emanuele Signoretta

Il mio progetto consiste in un apparato che raccoglie dati di varia natura dall’ambiente circostante. Queste informazioni vengono poi inserite su una pagina Web e sono quindi accessibili a qualsiasi dispositivo dotato di una connessione Internet.

Le componenti che ho utilizzato sono le seguenti:

  • Fishino Uno;
  • sensori digitali di temperatura (Dallas ds18b20);
  • sensore pir, per rilevare i movimenti;
  • sensore pioggia;
  • sensore digitale di umidità (DHT 11);
  • sensore di contatto reed(per le finestre);
  • magnete per il sensore;
  • led (di diversi colori);
  • resistenza da 4.7 KΩ;
  • breadboard ;
  • jumpers.

Ho posizionato tutti i sensori e i led sulla breadboard ed effettuato i collegamenti con i jumpers rigidi in modo da non fare confusione sulla breadboard.

Jpeg

Per i sensori di temperatura ho dovuto prestare particolare attenzione nella fase di assemblaggio perché essi comunicano grazie al protocollo 1-Wire: quest’ultimo consente di collegare più sensori sullo stesso pin di Fishino. Tra i pin del polo positivo e del segnale bisogna aggiungere la resistenza di pull-up. Per quanto riguarda le finestre, sulla pagina web risulta la voce al plurale anche se c’è solo un sensore: non vi è alcun problema poiché eventuali altri sensori verrebbero collegati in serie formando una corona, e quest’ultima potrebbe monitorare tutte le finestre del perimetro della casa. Ho successivamente collegato tutti i sensori ed attuatori alla board Fishino (la piedinatura è disponibile nello sketch) e iniziato la stesura del programma.

Jpeg

Il programma è piuttosto semplice, ma molto efficace: in pratica Fishino raccoglie tutti i dati dai sensori e tramite la shield wireless li invia in rete.

Lo Sketch su Fischino

#include <DallasTemperature.h>
#include <OneWire.h>
#include "DHT.h"
#include <SPI.h>

#include <Fishino.h>
#define pin_onewire 6

OneWire oneWire(pin_onewire);
DallasTemperature sensors(&oneWire);



double tempin;
double tempout;
double soggiorno;
boolean rain;
#define DHTPIN 3 

#define MY_SSID	"NETGEAR22"
#define MY_PASS	"redonion730"
#define IPADDR	192, 168, 0, 101


#ifdef IPADDR
IPAddress ip(IPADDR);
#endif

String readString;
int out1 = 14;
int out2 = 15;
int out3 = 16;

int reed = 2;
int pioggia = 4; 
int pir = 5;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

FishinoServer server(80);
void setup()
{
pinMode(pioggia,INPUT);
pinMode(pir, INPUT);
pinMode(reed, INPUT);
pinMode(out1, OUTPUT);
pinMode(out2, OUTPUT);
pinMode(out3, OUTPUT);


sensors.begin();
sensors.setWaitForConversion(false); 
sensors.setResolution(12); 
sensors.requestTemperatures();
dht.begin();	
	
	
	Serial.begin(115200);

	// initialize SPI:
	SPI.begin();
	SPI.setClockDivider(SPI_CLOCK_DIV2);
Fishino.reset();
Fishino.setPhyMode(PHY_MODE_11B);
#ifdef STANDALONE_MODE
Fishino.setMode(STATION_MODE);
Fishino.softApStartDHCPServer();
#else
Fishino.setMode(STATION_MODE);
Fishino.begin(F(MY_SSID), F(MY_PASS));
#ifdef IPADDR
Fishino.config(ip);
#else
Fishino.staStartDHCP();
#endif
#endif
server.begin();}

void loop()
{
	
sensors.requestTemperatures();
tempin = sensors.getTempCByIndex(0);
tempout = sensors.getTempCByIndex(1);
soggiorno = sensors.getTempCByIndex(2);

FishinoClient client = server.available();
if (client) {
while (client.connected()) {   
if (client.available()) {
char c = client.read();
if (readString.length() < 100) {
readString += c;}
if (c == '\n'){
Serial.println(readString); 
client.println("HTTP/1.1 200 OK"); 
client.println("Content-Type: text/html");
client.println("Refresh: 5");
client.println();     
client.println("<HTML>");
client.println("<HEAD>");
client.println("<meta name='theme-color' content='  red'>");
client.println("<link rel='stylesheet' type='text/css' href='http://arduinosmarthome.altervista.org/arduino.css' />");

client.println( "<meta charset=\"utf-8\"><meta name=\"apple-mobile-web-app-capable\" content=\"yes\" /><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"><meta name=\"viewport\" content=\"width=device-width, user-scalable=no\">");
client.println("<TITLE>SmartHome</TITLE>");
client.println("</HEAD>");
client.println("<BODY>");
client.println("<hr />");
client.println("<br />");  
client.print("<center>");
client.print("<font color='teal'>");
client.print("<h1>Smart Home</h1>"); 
client.print("</font>");   
client.print("<h2>Temperatura interna: "); 
client.print(tempin);
client.print(" C <h2/>");
client.print("</h2>");
client.print("<h2>Temperatura esterna: "); 
client.print(tempout);
client.print(" C <h2/>");
client.print("<h2>Temperatura soggiorno: "); 
client.print(soggiorno);
client.print(" C <h2/>");
client.print("</h2>");

client.print("<h2>Finestre: ");
if (digitalRead(reed)==HIGH){
client.print("Chiuse<h2/>");}
else{client.print("Aperte<h2/>");
}

client.print("<h2>Movimenti: ");
if(digitalRead(pir)==HIGH){
client.print("Si<h2/>");}
else{
client.print("No<h2/>");}
client.print("<h2>Pioggia: "); 
rain = digitalRead(pioggia);
if(rain==true){
client.print("No </h2>");}
if(rain==false){
client.print("Si </h2>");}
client.print("<h2>Umidita': ");
client.print(dht.readHumidity());
client.print("% </h2>");
client.println("<a href=\"/?1on\"\">Led 1 ON</a>");
client.println("<a href=\"/?1off\"\">Led 1 OFF</a><br />");   
client.println("<br />"); 
client.print("<br>");    
client.println("<a href=\"/?button2on\"\">Led 2 ON</a>");
client.println("<a href=\"/?button2off\"\">Led 2 OFF</a><br />");    
client.println("<br />");
client.print("<br>");         
client.println("<a href=\"/?button3on\"\">Led 3 ON</a>");
client.println("<a href=\"/?button3off\"\">Led 3 OFF</a><br />");            
client.println("<br />"); 
client.print("</center> </BODY> </html>");

break;}}}
delay(250);
client.stop();

if (readString.indexOf("?1on") >0){
digitalWrite(out1, HIGH);}
if (readString.indexOf("?1off") >0){
digitalWrite(out1, LOW);}
if (readString.indexOf("?button2on") >0){
digitalWrite(out2, HIGH);}
if (readString.indexOf("?button2off") >0){
digitalWrite(out2, LOW);}
if (readString.indexOf("?button3on") >0){
digitalWrite(out3, HIGH);}
if (readString.indexOf("?button3off") >0){
digitalWrite(out3, LOW);}               


readString="";
        
        
      }
    }

Per rendere molto più agevole la lettura dei dati ho fatto in modo che la pagina si adatti allo schermo del device mobile che la visualizza e che, visualizzando la pagina su Google Chrome su un device Android, l’intera barra degli indirizzi assuma un unico colore.

Screenshot_2016-03-30-21-54-35

Nel mio caso, ho utilizzato il rosso, ma ovviamente vi sono numerose altre alternative: basta usare un numero esadecimale per indicare il colore. Da qualsiasi device sono inoltre comandabili tre led(o relè) con tutti i comandi per ciascun output nella stessa pagina. Ho fatto anche in modo che venisse caricata una pagina .css da internet (www.arduinosmarthome.altervista.org/arduino.css ) cosicché i pulsanti che gestiscono il controllo dei led possano assumere un aspetto o un colore differente a seconda dei gusti di ciascuno.

CSS utilizzato nel mio esempio

body{
margin:60px 0px; padding:0px;
text-align:center;
}
h1
{
text-align: center;
font-family:Arial, "Trebuchet MS", Helvetica, sans-serif;
}
h2
{
text-align: center;
font-family:Arial, "Trebuchet MS", Helvetica, sans-serif;
}
a
{
text-decoration:none;
width:75px;
height:50px;
border-color:black;
border-top:2px solid;
border-bottom:2px solid;
border-right:2px solid;
border-left:2px solid;
border-radius:10px 10px 10px;
-o-border-radius:10px 10px 10px;
-webkit-border-radius:10px 10px 10px;
font-family:"Trebuchet MS",Arial, Helvetica, sans-serif;
-moz-border-radius:10px 10px 10px;
background-color:#0099cd;
padding:8px;
text-align:center;
}
a:link {color: white;}      
a:visited {color: white;} 
a:hover {color: white;} 
a:active {color: white;}

Un problema che si può riscontrare è il mancato caricamento della pagina: ciò è dovuto alla memoria Ram satura. Può inoltre verificarsi il caricamento simultaneo di più pagine, ossia la ripetizione di un contenuto (ad esempio un messaggio) all’interno di una stessa pagina web

 

11 Commenti

    • Si, infatti sto incrementando delle funzioni e sto creando un'app specifica per questo progetto. Grazie????
      • Le ottime intenzioni solleticano: spero si concretizzino presto. Credo che molti le aspettino con interesse. Buon lavoro.
  1. Molto Bello, una piccola domanda per capirci meglio io.. E' possibile integrare il file css nello sketch senza utilizzare file esterni? Come si potrebbe fare?
  2. salve, bel progetto. io sto cercando di creare una stazione meteo, che sia visualizzabile anche da remoto.. quindi mi chiedevo, se il suo progetto, è utilizzabile anche da lontano dalla propria rete domestica, o semplicemente dalla rete mobile.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Main Menu