Φτιάχνοντας ένα Έξυπνο Σπίτι, και έλεγχος από το Android

Φτιάχνοντας ένα Έξυπνο Σπίτι

source: http://www.greeceandroid.gr/

Πώς θα σας φαινόταν η ιδέα ενός έξυπνου σπιτιού, το οποίο θα ελέγχετε από την Android συσκευή σας?

Εμάς η ιδέα αυτή μας άρεσε, οπότε σκεφτήκαμε να την υλοποιήσουμε, και να σας την παρουσιάσουμε με αναλυτικές οδηγίες.

Τι ακριβώς θα μπορώ να κάνω?

Στην ουσία θα μπορείτε να χειριστείτε τα πάντα από το Android κινητό/τάμπλετ σας! Από τον φωτισμό και την μουσική, μέχρι την .. καφετιέρα!

Επίσης θα μπορείτε να έχετε ανά πάσα στιγμή εικόνα του τι γίνεται στο σπίτι σας, καθώς και να ορίσετε ενέργειες που θα γίνονται αυτόματα, για παράδειγμα:

Αν η θερμοκρασία ανέβει πάνω από 50 βαθμούς Κελσίου, να ενεργοποιηθεί το σύστημα πυρόσβεσης κτλ.

Ο μόνος περιορισμός στο τι μπορείτε να κάνετε είναι ο χρόνος και τα χρήματα που θέλετε να διαθέσετε στο project.

  • android-smart-home

Τι θα χρειαστούμε?

Δεν υπάρχει “ασφαλής” απάντηση, καθότι “περιοριζόμαστε” μόνο από τις απαιτήσεις μας, και το τι θέλουμε να φτιάξουμε.

Τα βασικά στο Project είναι το Arduino, η Ethernet Shield(ή WiFi Shield), καθώς και η Android συσκευή μας.

Άλλα πράγματα που θα χρειαστούμε είναι αισθητήρες, καλώδια, switches, αλλά το καλό σε αυτά είναι ότι είναι γενικά φθηνά.

  • equipment-arduino

Τι θα δούμε

Συνοπτικά θα δούμε πώς μπορούμε να χρησιμοποιήσουμε μία σειρά αισθητήρων στο Arduino, πώς θα πάρουμε κάποια ένδειξη, και στην συνέχεια πώς την ένδειξη αυτή την εμφανίζουμε στην Android εφαρμογή που υλοποιήσαμε.

Επίσης θα δω πώς μπορώ να στείλω μία εντολή μέσω της Android εφαρμογής στο Arduino, το οποίο στην συνέχεια θα την εκτελέσει (π.χ. το να ανάψουμε/σβήσουμε τα φώτα)

  • sample-android-arduino-setup-2
  • sample-android-arduino-setup

Για την κατασκευή του “Έξυπνου Σπιτιού”, ένα πολύ σημαντικό τμήμα του project είναι οι αισθητήρες οι οποίοι θα “μετράνε” διάφορες παραμέτρους.

Τέτοιες παράμετροι μπορεί να είναι θερμοκρασία, ένταση ήχου, φωτεινότητα, απόσταση κ.α.

Κάποια βασικά μικροηλεκτρονικά, και ο LM35

Ο LM35 είναι ένας αισθητήρας θερμοκρασίας, ο οποίος έχει 3 “πόδια”, ένα Vin, ένα Vout, και ένα Ground.

  • lm-35-sensor

Για Vin (τάση εισόδου) μπορεί να δεχτεί από 4V μέχρι 20V. Η τάση εξόδου (Vout) που μας δίνει εξαρτάται από την θερμοκρασία. Για παράδειγμα τάση εξόδου 0.20V αντιστοιχεί σε 20 βαθμούς Κελσίου.

Σε πρώτη φάση τροφοδοτήσαμε τον LM35 από μία μπαταρία, και πήραμε με βολτόμετρο την τάση εξόδου να είναι 0.27V, το οποίο συνεπάγεται θερμοκρασία 27 βαθμούς Κελσίου.

  • sensor-data-lm35-1
  • sensor-data-lm35-2

Συνδέοντας τον αισθητήρα με το Arduino

Το Arduino είναι η “development board” η οποία θα χρησιμοποιήσουμε, δηλαδή μία “πλακέτα” την οποία μπορούμε να προγραμματίσουμε να κάνει ότι θέλουμε.

Οι δυνατότητες αυτής της πλακέτας γίνεται να επεκταθούν μέσω κάποιων “Shields” τα οποία κουμπώνουν πάνω σ αυτήν. Εμείς στο project θα χρησιμοποιήσουμε και την Ethernet Shield.

  • arduino-ethernet-shield-1
  • arduino-ethernet-shield-2

Για να συνδέσουμε τον αισθητήρα που είδαμε παραπάνω (LM35) στο Arduino θα ακολουθήσουμε την ίδια διαδικασία με πριν, μόνο που τώρα την τάση εισόδου θα την πάρουμε από την πλακέτα, και την τάση εξόδου θα την “στείλουμε” πίσω σ αυτήν.

Δίνουμε λοιπόν 5V στα ακριανά pins του LM35 (μπλε και πράσινο καλώδιο στην φωτογραφία), και παίρνουμε την έξοδο από το μεσαίο pin, την οποία την οδηγούμε στο Analog Input 0 του Arduino.

  • arduino-connect-1
  • arduino-connect-2

Προγραμματίζοντας το Arduino

Πώς όμως θα “διαβάσουμε” την ένδειξη που πήγαμε στο Analog Input 1; Ένα από τα θετικά του Arduino είναι ότι προγραμματίζεται πανεύκολα.

Σε πρώτη φάση ας πάρουμε την ένδειξη του αισθητήρα στο Serial output του υπολογιστή μας. Ο κώδικας που χρησιμοποιήσαμε:

int analogPin = 0;
int readvalue = 0;
float temp = 0;

void setup() {
  Serial.begin(9600); //gia na parw endeixi se serial output
}

void loop() {
  readvalue = analogRead(analogPin); //na diavasoume tin endeixi apo to Pin 0
  temp = (readvalue * 0.49); //metatropi A/D (5*temp*100)/1024
  Serial.print("Temprature: ");
  Serial.print(temp); //emfanisi sto serial output
  Serial.println("C "); 
  delay(1000); 
}
  • temp-sensor-1

Hardware που χρησιμοποιήσαμε

  • Arduino Duemilanove
  • Ethernet Shield
  • LM35
  • Breadboard, Cables

Η Development Board στην οποία βασίζεται to project μας είναι το Arduino. Εμείς χρησιμοποιήσαμε το Duemilanove αλλά μπορείτε να χρησιμοποιήσετε και την πιο πρόσφατη έκδοση της πλακέτας, Arduino UNO.

Σκοπός μας να “στήσουμε έναν Web-Server” στο Arduino, για το οποίο θα χρειαστούμε και την Ethernet Shield.

Ο αισθητήρας που θα χρησιμοποιήσουμε σε πρώτη φάση είναι θερμοκρασίας, και συγκεκριμένα ο LM35 DZ.

Ακόμα θα χρειαστούμε ένα μία Breadboard (μαζί φυσικά με Jumper Wires”).

Μέχρι τώρα έχουμε δει κάποια βασικά πράγματα για το Smart Home που θέλουμε να φτιάξουμε, όπως το πώς να πάρουμε ένδειξη από έναν αισθητήρα στο Arduino.

Πώς όμως μπορούμε να εμφανίσουμε την ένδειξη αυτή στο Smartphone και στο Tablet μας?

Γιατί να στήσω έναν HTTP Server στο Arduino

Ένας “εύκολος” τρόπος να εμφανίσουμε μία ένδειξη, είναι να “σηκώσουμε” έναν http Server στο Arduino με την Ethernet Shield, όπου και θα εμφανίζουμε όσες παραμέτρους θέλουμε.

Οι ενδείξεις αυτές θα είναι προσβάσιμες από οποιοδήποτε κινητό/τάμπλετ στο δίκτυο, μέσω του Browser μας.

Επίσης εκτός από τον Browser, θα είναι πολύ πιο εύκολο να διαβάσουμε τα δεδομένα και μέσω της Android εφαρμογής που θα φτιάξουμε.

“Ανεβάζοντας” τον HTTP Server

Συνδέουμε το Arduino στο router μας με καλώδιο Ethernet, στήνουμε τον WebServer μας, και προγραμματίζουμε το Arduino να δείχνει την ένδειξη από τον αιθητήρα.

Πλέον μπρορούμε να ανοίξουμε οποιονδήποτε browser και να μπούμε στην IP που ορίσαμε στο Arduino για να δούμε την ένδειξη της θερμοκρασίας!

  • server-temp
#include 
#include 

byte mac[] = { 
  0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE};
IPAddress ip(192,168,10,250);

EthernetServer server(80);

void setup() {
  Serial.begin(9600);
   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");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {          
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println(""); //ftiaxnoume to html
          client.println("");           
          client.println("");                    
          int readvalue = analogRead(0);
          int temp;
          temp = (readvalue * 0.49); //metatropi A/D (5*temp*100)/1024    
          client.print(temp);
          client.print("Vathmoi Kelsiou");
          client.println("");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }

    delay(1);
    client.stop();
    Serial.println("client disonnected");
  }
}

Βελτιώσεις στο UI

Ίσως θελήσετε να “βελτιώσετε” την εμφάνιση του output, το οποίο μπορούμε να το κάνουμε πολύ εύκολα με την χρήση του jquery mobile.

Για να το κάνουμε αυτό ορίζουμε τα απαραίτητα libraries στο html το οποίο “φτιάχνεται” στον web server μας. Η διαφορά είναι εμφανής:

  • ui-project-improvements-1
  • ui-project-improvements-2

Προσθήκη Buzzer στο project

Επίσης προσθέτουμε ένα “buzzer” στο project, το οποίο θα μας ειδοποιεί ηχητικά όταν συμβεί κάποια ενέργεια. Στην περίπτωσή μας το βάλαμε να χτυπήσει όταν η θερμοκρασία ξεπερνάει το όριο των 30 βαθμών Κελσίου.

Το Buzzer το συνδέσαμε στο Digial Pin 4 και στο Ground.

  • install-buzzer-1
  • install-buzzer-2

Arduino Code

Τροφοδοσία

Το Arduino τροφοδοτηθείται από την θύρα USB του υπολογιστή μας όση ώρα το προγραμματίζουμε. Η χρήση του όμως (αφού το προγραμματίσουμε) θα πρέπει να είναι ανεξάρτητη από το PC, οπότε την τροφοδοσία του πρέπει να την πραγματοποιήσουμε με διαφορετικό τρόπο.

Η μία επιλογή είναι να χρησιμοποιήσουμε τον κλασσικό αντάπτορα που υπάρχει σχεδόν σε όλα τα κινητά, που από την “πρίζα” μας δίνει USB Female. Εναλλακτικά μπορούμε να χρησιμοποιήσουμε τροφοδοτικό DC 12V, με βύσμα 2.1mm.

Όποια και από τις 2 επιλογές και να διαλέξουμε, θα πρέπει να είναι ικανές να δώσουν ρεύμα τουλάχιστον 500mAh-1A, καθότι στην συνέχεια από το Arduino έχουμε να τροφοδοτήσουμε διάφορα ηλεκτρονικά κυκλώματα.

  • dc-adaptor
  • dc-usb

Δίκτυο

Το Arduino με την Ethernet Shield πρέπει να το συνδέσουμε στο Router του σπιτιού μας με καλώδιο Ethernet. Στην περίπτωση όμως που δεν θέλουμε να κάνουμε κάτι τέτοιο, μπορούμε να χρησιμοποιήσουμε ένα A/P σε Client Mode, ώστε να δώσουμε στο Arduino πρόσβαση στο δίκτυο από “απόσταση”.

Φυσικά πριν συνδέσουμε ασύρματα το A/P σε Client Mode, φροντίζουμε για την ασφάλεια του ασύρματου δικτύου μας, δεν θα θέλαμε ο καθένας να έχει πρόσβαση στο έξυπνο σπίτι μας!

Θεωρούμε καλύτερη (και φθηνότερη) την επιλογή Arduino, Ethernet Shield και Access Point, παρά την χρήση WiFi Shield.

  • arduino-ethernet-ap-2
  • arduino-ethernet-ap

Επίσης προτιμήστε κάποιο A/P με αποσπώμενη κεραία, ώστε να μπορέσετε να το “αναβαθμίσετε” σε περίπτωση που το router σας είναι μακριά από το base-station όπου θα στήσετε το Arduino. (Για παράδειγμα όταν φτιάχνουμε την υλοποίηση για την πόρτα του γκαράζ.)

  • wireless-ap

Το project σε small scale

Αρχικά θα δούμε το project μας σε small scale, δηλαδή σε κλίμακα, πριν πάμε να βάλουμε χέρι στο υψηλής τάσης AC ρεύμα του σπιτιού. Σε πρώτη φάση θα ελέγχουμε κάποια led στην breadboard μας από το Android μας, και στην συνέχεια θα δούμε πώς με κάποια relays θα ελέγχουμε και τον φωτισμό του σπιτιού.

Υψηλή Τάση και Relays

Σε επόμενα tutorials όπου θα πάμε σε full-scale παραδείγματα, θα χρησιμοποιήσουμε κάποια Relays στις πρίζες του σπιτιού και όχι μόνο. Φυσικά ισχύει η προειδοποίηση ότι το AC ρεύμα του δικτύου είναι επικίνδυνο οπότε βεβαιωθείτε ότι ξέρετε τι κάνετε (ή φωνάξτε έναν ηλεκτρολόγο να συνδέσει το Relay).

Η λογική του σχεδίου μας

Η λογική είναι η εξής, οι αισθητήρες παίρνουν δεδομένα τα οποία στέλνουν στο Arduino, το οποίο με την σειρά του τα ανεβάζει μέσω της Ethernet Shield σε έναν HTTP Server.

Στην συνέχεια η Android εφαρμογή διαβάζει τα δεδομένα αυτά από τον HTTP Server, και τα προβάλλει.

  • arduino-ethernet-schematic

Ανάπτυξη Android εφαρμογής

Αφού εγκαταστήσετε τα απαραίτητα προγράμματα στο PC σας, και δείτε λίγο τις λειτουργίες του IDE με το παράδειγμά μας για το Hello World, είστε έτοιμοι να αρχίσετε την ανάπτυξη της εφαρμογής.

Στο νέο project μας (στην πιο απλή μορφή του) αρκεί ένα WebView το οποίο θα διαβάζει το HTML που φτιάξαμε στον Server στο Arduino.

  • java-code

Ενδεικτικά ο κώδικας java που μπορείτε να χρησιμοποιήσετε:

package com.sql.greekapp;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.sql.greekapp.R;

public class GreekNewsActivity extends Activity {
	WebView webview;
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.main);    
        getWindow().setFeatureInt(	Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); 
        
        webview = (WebView) findViewById(R.id.web_engine); 
        webview.setWebViewClient(new HelloWebViewClient());
        webview.getSettings().setJavaScriptEnabled(true); 
        webview.getSettings().setPluginsEnabled(true);  //depriciated
        if (Integer.parseInt(Build.VERSION.SDK) >= Build.VERSION_CODES.FROYO)
        	webview.getSettings().setPluginState(WebSettings.PluginState.ON); 
        webview.getSettings().setAllowFileAccess(true);        
        webview.getSettings().setBuiltInZoomControls(true); //multitouch an ipostirizetai        
        webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        webview.loadUrl("http://192.168.10.250"); //o server tou Arduino
        
        //webview.loadUrl("http://google.com"); //gia debug   
      
       final Activity MyActivity = this;
	   webview.setWebChromeClient(new WebChromeClient() {
       public void onProgressChanged(WebView view, int progress)   
       {
       	//Na svisw tin mpara afou fortwsei to url
       	MyActivity.setTitle("Φόρτωση...");
       	MyActivity.setProgress(progress * 100); //svisimo

       	// Kai na emfanisw to app name
           if(progress == 100)
           	MyActivity.setTitle(R.string.app_name);
         }
       });
   
    }

    //Na krataw ta clicks within the app
    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {        	 
                return false;            
        }    
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
            webview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }    
}

Καθώς και το layout/main.xml για το UI της Android εφαρμογής:

  • main-xml

Και το αποτέλεσμα:

  • android-app

Εναλλακτικές (σωστότερες) υλοποιήσεις (xml/json)

Αντί να “στήσουμε” μία ολόκληρη HTTP σελίδα στον WebServer στο Arduino, και απλά να Linkάρουμε σε αυτόν από την Android εφαρμογή μας, είναι προγραμματιστικά σωστότερο να “φτιάχνουμε” ένα xml στον server μας (ή json), το οποίο θα περιέχει τις μετρήσεις.

Στην συνέχεια θα κάνουμε “parse” το xml αυτό από την Android εφαρμογή.

  • arduino-xml

Κώδικας στο Arduino για να πάρουμε xml output:

#include 
#include 

byte mac[] = { 
  0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE }; //orizoume emeis ti mac theloume, heh!
IPAddress ip(192,168,10,250); //i ip tis siskevis sto diktio, profanws rithmiste analogws

EthernetServer server(80);

void setup() {
  pinMode(4, OUTPUT); // buzzer, exodos
  Serial.begin(9600);
   while (!Serial) {
    ; // serial debug
  }


  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {          
          client.println("HTTP/1.1 200 OK"); // standard http response header
          client.println("Content-Type: text/xml"); //text/xml otan theloume na vgaloume xml output
          client.println("Connection: close");
          client.println();
          client.println(""); //UTF8 giati tha xoume kai ellhnika
          client.println("");
          client.print("");
          //thermokrasia         
          int sensorReading = analogRead(0);
          float temp;
          temp = (sensorReading * 0.488);
          client.print(temp);          
          client.println("");
          client.println("");
            if (temp>30){
                buzz(4, 2000, 4000); // energopoihsh toy buzzer sto pin 4 sta 2000Hz gia 2 sec
                delay(1000); // diakopi gia 1 second
            }

          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

void buzz(int targetPin, long frequency, long length) {
  long delayValue = 1000000/frequency/2;
  long numCycles = frequency * length/ 1000;
 for (long i=0; i < numCycles; i++){
    digitalWrite(targetPin,HIGH);
    delayMicroseconds(delayValue);
    digitalWrite(targetPin,LOW);
    delayMicroseconds(delayValue);
  }
}

Τι νέο θα χρειαστούμε σε αυτό το βήμα

Ένα ή και περισσότερα Photoresistors. (Αγορά)

Ένα ή περισσότερα LED και τις αντίστοιχες αντιστάσεις (Ebay)

  • hardware-arduino-led-photocell

Τι θέλουμε να καταφέρουμε

Σε αυτό το μέρος θέλουμε να φτιάξουμε ένα σύστημα, το οποίο θα μετράει το πόσο έντονο είναι το φως σε ένα δωμάτιο, και αν η μέτρηση πέσει κάτω από κάποιο όριο να ενεργοποιεί αυτόματα τα φώτα.

Σε πρώτη φάση στο κύκλωμα θα ενεργοποιούμε ένα Led, ενώ στην συνέχεια θα στέλνουμε trigger 5V σε ένα ac relay ώστε να ανάβει το φώτα σε ένα δωμάτιο.

Το κύκλωμά μας δηλαδή θα είναι ως εξής:

  • circuit-arduino-1
  • circuit-arduino-2

Ο κώδικας για το Arduino

Θα δούμε βήμα βήμα τον κώδικα (στην πιο απλή μορφή του) που χρησιμοποιήσαμε στο Arduino. Αρχικά δηλώνουμε τις μεταβητές light_sensor και yellow_led στις οποίες βάζουμε το αναλογικό Pin 0, και το ψηφιακό PIN 13 του Arduino. (τα Pin είναι αριθμημένα στην πλακέτα.)

Η συνάρτηση void setup εκτελείται μία φορά κατά την εκκίνηση, ενώ η void loop εκτελείται κατ’ επανάληψη.

Το Serial.begin(9600) ορίζει ότι θα χρησιμοποιήσουμε το Serial Monitor (κυρίως το θέλουμε για Debugging), με ταχύτητα 9600bps.

Στην συνέχεια στην μεταβλητή light_reading τύπου int, βάζουμε την μέτρηση που διαβάζουμε από τον αισθητήρα φωτός που είναι συνδεδεμένος στο αναλογικό Pin 0.

Ακόμα, ορίζουμε αν η τιμή της μεταβλητής πέσει κάτω από ένα όριο if (light_reading<600), να ανάβει το LED, αλλάζοντας την κατάστασή του σε HIGH.

Τέλος, βάζουμε να εμφανίζεται η τιμή της μεταβλητής light_reading στο Serial Monitor για Debugging.

  • arduino-code-1
int light_sensor = A0; //analogiko pin 0
int yellow_led = 13; //digital pin 13

void setup(){
  Serial.begin(9600); //serial gia debug
  pinMode(yellow_led, OUTPUT);
}

void loop(){
  int light_reading = analogRead(light_sensor); 
  if (light_reading<600) {
    digitalWrite(yellow_led, HIGH); //anavw to led
  }  
  else {
    digitalWrite(yellow_led,LOW); //svinw to led
  }  
  Serial.println(light_reading); //serial gia debug
  delay(300); //ena mikro delay gia kalitero output
}

Μεταφέροντας την ένδειξη στο Android

Έχουμε δείξει πώς να εμφανίσετε μία ένδειξη από έναν αισθητήρα στο Arduino, και σε Web Browser, αλλά και σε Android εφαρμογή.

Κάνουμε λοιπόν τις απαραίτητες αλλαγές στο project μας και παίρνουμε την ένδειξη στην Android εφαρμογή μας. Ο κώδικάς μας:

Κώδικας Arduino για Smart Home

  • arduino-web-server-1

Ο κώδικας για την Android εφαρμογή είναι ο ίδιος που είχαμε δει και σε προηγούμενο μέρος, καθότι αλλάξαμε μόνο το “server-side” κομμάτι.

Οπότε μέσα σ αυτήν παίρνουμε την ένδειξη του φωτός, αλλά και την κατάσταση του led.

  • android-app-1
  • android-app-2

Τι θέλουμε να πετύχουμε

Αυτό που θέλουμε, είναι να μπορούμε να στείλουμε μέσω της Android εφαρμογής δεδομένα στον Web-Server που έχουμε στήσει στο Arduino με την Ethernet Shield.

Μόλις ο Web Server “πάρει” την εντολή, θα την μεταφέρει στο Arduino, το οποίο με την σειρά του θα εκτελεί κάποια ενέργεια, όπως για παράδειγμα το να δώσει τάση σε κάποιο PIN.

Όπως βλέπουμε και παρακάτω, όταν βάζουμε στην εφαρμογή τον διακόπτη στο “ON” το PIN δίνει τάση. Όταν βάζουμε τον διακόπτη στο OFF η τάση διακόπτεται.

  • arduino-android-smart-home-1
  • arduino-android-smart-home-2

Ενδεικτικά σε αυτό το βήμα θα δώσουμε τάση σε ένα LED και σε ένα Buzzer. Παρ’ όλα αυτά η λογική θα είναι ΑΚΡΙΒΩΣ ίδια και όταν ελέγχουμε τον φωτισμό του σπιτιού (θα το δούμε στο μέρος 9ο). Η μόνη διαφορά θα είναι ότι αντί να δώσω τα 5V στο LED, θα τα μεταφέρω ως trigger σε ένα AC Relay.

Το κύκλωμα που χρησιμοποιήσαμε

Τα Pins τα οποία θα ενεργοποιούμε όταν στέλνουμε εντολή από το Arduino θα είναι τα 6, 5 και 3.

Στο PIN6 θα συνδέσουμε την άνοδο του LED (μπλε καλώδιο στο σχήμα), και την κάθοδο την οδηγούμε σε αντίσταση 100Ω, και στην συνέχεια στο GND του Arduino.

Στο PIN5 θα συνδέσουμε το “+” του Buzzer (κόκκινο καλώδιο στο σχήμα), και το “-” το οδηγούμε σε αντίσταση 4.7KΩ, και στην συνέχεια στο GND του Arduino.

Στο PIN3 (πράσινο καλώδιο στο σχήμα) το αφήνω να το χρησιμοποιήσετε εσείς με ότι hardware θέλετε, το οποίο να τροφοδοτείται με 5V DC.

  • arduino-schematic-circuit-1
  • arduino-schematic-circuit-2

Ο κώδικας στο Arduino που χρησιμοποιήσαμε

Κατεβάστε τον κώδικα που χρησιμοποιήσαμε από το παρακάτω link:

Download Android Smart Home Pard 8

  • arduino-code

Αλλαγές στην Android εφαρμογή

Η Android εφαρμογή που έχουμε φτιάξει παραμένει (σχεδόν) η ίδια, καθότι αρκεί που αλλάξαμε το Server Side κομμάτι.

Συνοπτικά η μόνη αλλαγή που κάναμε είναι να ορίσουμε στο WebView, πού πρέπει να “κοιτάει” για τον http server, και συγκεκριμένα στην περίπτωσή μας είναι το http://192.168.10.250/remote

package com.sql.greekapp;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.sql.greekapp.R;

public class GreekNewsActivity extends Activity {
	WebView webview;
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.main);    
        getWindow().setFeatureInt(	Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); 
        
        webview = (WebView) findViewById(R.id.web_engine); 
        webview.setWebViewClient(new HelloWebViewClient());
        webview.getSettings().setJavaScriptEnabled(true); 
        webview.getSettings().setPluginsEnabled(true);  //depriciated
        if (Integer.parseInt(Build.VERSION.SDK) >= Build.VERSION_CODES.FROYO)
        	webview.getSettings().setPluginState(WebSettings.PluginState.ON); 
        webview.getSettings().setAllowFileAccess(true);        
        webview.getSettings().setBuiltInZoomControls(true); //multitouch an ipostirizetai        
        webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        webview.loadUrl("http://192.168.10.250/remote"); //o server tou Arduino, 
        
        //webview.loadUrl("http://google.com"); //gia debug   
      
       final Activity MyActivity = this;
	   webview.setWebChromeClient(new WebChromeClient() {
       public void onProgressChanged(WebView view, int progress)   
       {
       	//Na svisw tin mpara afou fortwsei to url
       	MyActivity.setTitle("Φόρτωση...");
       	MyActivity.setProgress(progress * 100); //svisimo

       	// Kai na emfanisw to app name
           if(progress == 100)
           	MyActivity.setTitle(R.string.app_name);
         }
       });
   
    }

    //Na krataw ta clicks within the app
    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {        	 
                return false;            
        }    
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
            webview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }    
}

Το τελικό αποτέλεσμα

Το αποτέλεσμα στο τέλος είναι να έχουμε στην Android εφαρμογή τρεις διακόπτες, οι οποίοι δίνουν τάση +5V στα PIN 3,5,6 όταν ενεργοποιηθούν.

  • android-app-result-2
  • android-app-result

Πάμε σε Full Scale, προειδοποιήσεις και κίνδυνοι

Θα αναφέρω για χιλιοστή φορά πόσο επικίνδυνο είναι το A/C ρεύμα του δικτύου της Δ.Ε.Η., και να μην επιχειρήσετε οτιδήποτε από τα παρακάτω αν δεν ξέρετε ακριβώς τι κάνετε.

Λανθασμένος χειρισμός του A/C ρεύματος μπορεί να προκαλέσει θάνατο από ηλεκτροπληξία, πυρκαγιά και πολλά ακόμα δυσάρεστα. Δεν φέρω καμία ευθύνη για ό,τι προκύψει από την ανάγνωση αυτού του οδηγού.

Δεν θέλω τους αναγνώστες του GreeceAndroid.gr “ψημένους”, οπότε μην επιχειρήσετε τίποτα από τα παρακάτω αν δεν είστε 100% σίγουρος ότι ξέρετε τι κάνετε.

  • voltage-warning

Παραμετροποιώντας φωτιστικά σώματα για έλεγχο από το Android

Πριν ξεκινήσουμε βγάζουμε από την πρίζα το φωτιστικό που θέλουμε να “παραμετροποιήσουμε”, και κρατώντας το κάνουμε 5 βήματα πίσω. (Για να βεβαιωθείτε ότι έχετε βγάλει την σωστή πρίζα).

Όλα τα φωτιστικά έχουν μία βάση στο κάτω μέρος τους, την οποία μπορούμε να ανοίξουμε. Μόλις το κάνουμε, θα δούμε 2 καλώδια (συνήθως μπλε και καφέ) τα οποία κόβουμε στην μέση και απογυμνώνουμε τις άκρες τους.

  • ac-lamp-arduino-1
  • ac-lamp-arduino-2

(Σε αυτό το σημείο όσοι γνωρίζουν, ίσως θέλουν να βεβαιώσουν το “live” καλώδιο με πολύμετρο

Στις συσκευές με φις το ποιο καλώδιο είναι “live” αλλάζει αναλόγως πώς τοποθετούμε την πρίζα. Προσέχουμε λοιπόν “πώς” τις τοποθετούμε στην πρίζα.

Αφού βρούμε το live καλώδιο, ξαναενώνουμε και “ασφαλίζουμε” το neutral χρησιμοποιώντας κάποια προστατευτικά.

  • protect-wiring-2
  • protect-wiring

Ο χρωματικός κώδικας ορίζει το “live” καλώδιο να είναι το καφέ.Τις συσκευές με φις τις τοποθετούμε στην πρίζα αναλόγως.

Το A/C relay που χρησιμοποίησα είναι αυτό εδώ.

Το κύκλωμα θα δουλέψει ακόμα και αν συνδέσουμε το relay στο “neutral” καλώδιο, αλλά προτείνετε για λόγους ασφαλείας να το συνδέσετε στο live.

Συνδέουμε το A/C Relay

Το A/C Relay είναι μία συσκευή, η οποία ανοίγει ή κλείνει ένα A/C κύκλωμα, αναλόγως αν λαμβάνει (ή όχι) ένα (μικρότερο) DC σήμα.

Στην συγκεκριμένη περίπτωση το Relay απαιτεί 5V DC, τα οποία θα τα στέλνω από το Arduino. Η “άσπρη” μεριά του relay θα συνδέεται με το Arduino, ενώ η “πράσινη” με το καλώδιο μέσα στο φωτιστικό.

  • ac-relay-1

Συνοπτικά πρέπει να παρεμβάλουμε το AC relay ανάμεσα στο καφέ καλώδιο που έχουμε “κόψει”.

Στην πρώτη από τις τέσσερις υποδοχές (NO) θα ενώσουμε το καφέ τμήμα του καλώδιου που μεταφέρει την τάση εισόδου (το καλώδιο που είναι πιο κοντά στην πρίζα), ενώ στην τέταρτη (COM) θα συνδέσουμε το καφέ καλώδιο που είναι πιο κοντά στην λάμπα. (τα σφίγγουμε με τις βίδες από πάνω)

Στην συνέχεια, ασφαλίζουμε με μονωτική όλα τα καλώδια στο εσωτερικό του φωτιστικού.

  • connect-ac-relay-1
  • connect-ac-relay-2

Τέλος, στην “άσπρη” μεριά του ρελέ, ενώνω το άπρο βύσμα με το τρίχρωμο καλώδιο (περιλαμβάνεται), το οποίο πρέπει να μεταφέρουμε στο Arduino.

Βγάζοντας το καλώδιο από το λαμπατέρ

Μία “λύση” για να βγάλουμε το τρίχρωμο καλώδιο από το φωτιστικό είναι να κάνουμε μία μικρή τρύπα στην βάση του. Εναλλακτικά, μπορούμα να δοκιμάσουμε να το βγάλουμε από την τρύπα του καλωδίου τροφοδοσίας. Εκτιμάτε το “πώς” σας αρέσει περισσότερο.

Για την ώρα, πάντως προτείνω να μην το “κλείσετε” βάζοντας πάλι την βάση του φωτιστικού, τουλάχιστον όχι μέχρι να βεβαιωθούμε ότι όλα λειτουργούν σωστά.

  • arduino-trigger-wire-1
  • arduino-trigger-wire-2

Σύνδεση με το Arduino

Για αρχή συνδέουμε την έξοδο του τρίχρωμου καλωδίου με 3 jumper wires ίδιων χρωμάτων για να μπορούμε να τα συνδέσουμε στο Arduino.

Έπειτα συνδέσουμε το πράσινο καλώδιο στο PIN τροφοδοσίας +5V, το μαύρο στο GND, ενώ το κόκκινο στο PIN 6, το οποίο θα λειτουργεί ως “Trigger”.

Δηλαδή όταν το PIN 6 στείλει σήμα 5V, το ρελέ θα “κλείσει” το κύκλωμα, θα περάσει ρεύμα, και θα ενεργοποιηθεί το φως.

  • arduino-relay-connection-1
  • arduino-relay-connection-2

Χρησιμοποιώντας την Android εφαρμογή

Η Android εφαρμογή που έχουμε φτιάξει σε προηγούμενα βήματα χρησιμοποιείται αυτούσια, απλά αντί τα +5V αντί να τα πάμε στο LED, τα πάμε στο Relay.

Αφού λοιπόν συνδέσουμε το φωτιστικό στην πρίζα, και βεβαιωθούμε ότι ο hardware διακόπτης του είναι στο “ON”, τρέχουμε την Android εφαρμογή μας.

Προφανώς όταν στην εφαρμογή βάζουμε τον διακόπτη στο ON, το φως ανάβει, ενώ όταν τον βάζουμε στο “OFF” σβήνει.

Ορίστε λοιπόν το αποτέλεσμα!

  • android-app-android-arduino-1
  • android-app-android-arduino-2
  • android-app-android-arduino-3
  • android-app-android-arduino-4

Προειδοποιήσεις και Κίνδυνοι

Όλες οι προειδοποιήσεις που είδαμε στο προηγούμενο μέρος ισχύουν και εδώ, το A.C. ρεύμα της ΔΕΗ είναι επικίνδυνο και μπορεί να σκοτώσει.

Μην επιχειρήσετε τίποτα από τα παρακάτω αν δεν είστε 100% σίγουρος ότι ξέρετε τι κάνετε. Δεν φέρω καμία ευθύνη για ό,τι προκληθεί από την ανάγνωση του παρακάτω οδηγού.

  • warning-ac-voltage

Γιατί να βάλω το Relay στον διακόπτη;

Στο προηγούμενο βήμα είδαμε να ενσωματώνουμε το Relay στο εσωτερικό της συσκευής. Ανοίξαμε το κάτω μέρος της και παρακάμψαμε το καλώδιo φάσης, κόβοντάς το και συνδέοντάς το με το Relay.

Σε κάποιες συσκευές υπάρχει η εναλλακτική να το συνδέσουμε στον διακόπτη. Η τακτική αυτή είναι αρκετά πιο εύκολη, καθότι τα καλώδια είναι ήδη “κομμένα” με τις άκρες τους απογυμνωμένες, και πολλές φορές το relay χωράει και μέσα στην πλαστική θήκη του διακόπτη.

Η μόνη εμφανισιακή διαφορά στην συσκευή, θα είναι το σετ των τριών μικρών καλωδίων χαμηλής τάσης που θα φεύγουν από τον διακόπτη και θα πηγαίνουν στην “βάση” του έξυπνου σπιτιού, στο Arduino.

  • relay-inside-switch-case

Πώς συνδέω το Relay στον διακόπτη μίας ηλεκτρικής συσκευής;

Αρχικα αποσυνδέω την συσκευή από την τροφοδοσία. Στην συνέχεια ανοίγω την θήκη του διακόπτη (συνήθως είναι απλά 2 βίδες), και αφαιρώ τον μηχανισμό.

  • switch-1
  • switch-2

Έπειτα για συγκεκριμένη τοποθέτηση του φις, βρίσκω το καλώδιο φάσης και το neutral. (απαιτεί σύνδεση τροφοδοσίας, αν δεν είστε 100% σίγουροι καλέστε ηλεκτρολόγο)

Έπειτα πρέπει να “παρακάμψουμε” το καλώδιο φάσης, το οποίο συνδέουμε στο Relay. Το καλώδιο το οποίο “έρχεται” από την πρίζα, το συνδέω στο “NO”, ενώ αυτό που πηγαίνει στην συσκευή το συνδέω στο “COM”.

Στην συνέχεια τοποθετώ το Relay μέσα στο πλαστικό του διακόπτη και το ασφαλίζω.

  • install-ac-relay-1
  • install-ac-relay-2

Σύνδεση με το Arduino

Το Relay συνδέεται με 3 καλώδια στο Arduino. Το μαύρο καλώδιο το συνδέω στο PIN GND, το πράσινο στο PIN τροφοδοσίας +5V, ενώ το κόκκινο στο PIN 6 το οποίο θα λειτουργεί ως Trigger.

Όταν ορίζουμε την κατάσταση του PIN6 ως “HIGH”, το οποίο δίνει +5V, το Relay κλείνει το κύκλωμα, άρα αρχιζει να λειτουργεί η συσκευή μας. Αντίθετα ορίζοντας την κατάστασή του ώς “LOW”, το Relay ανοίγει το κύκλωμα, και η συσκευή μας απενεργοποιείται.

  • arduino-relay-connection

Έλεγχος από το Android

Η Android εφαρμογή μας παραμένει όπως έχει και στα προηγούμενα βήματα. Θυμίζω ότι η λογική είναι η εξής:

Η εφαρμογή μας στέλνει δεδομένα στον HTTP Server που έχουμε στήσει στο Arduino με την Ethernet Shield.

Όταν ο Server λάβει συγκεκριμένες εντολές, ενεργοποιεί ή απενεργοποιεί την τάση στο PIN 6. Τέλος, την τάση αυτή την οδηγούμε στο Relay, που έχουμε συνδέσει στο εσωτερικό, ή στον διακόπτη της συσκευής.

  • android-arduino-project-1
  • android-arduino-project-2

Έλεγχος της καφετιέρας από το Android

Ο έλεγχος της καφετιέρας από απόσταση είναι κάτι που ήθελα να υλοποιήσω, ώστε με το που ξυπνήσω, να μην χρειάζεται να σηκωθώ από το κρεβάτι για να πατήσω το κουμπί ενεργοποίησης της καφετιέρας, και μετά να περιμένω μέχρι να είναι έτοιμος ο καφές.

Επίσης το θεώρησα ευκαιρία να σας δείξω, πώς θα μπορείτε να ελέγξετε συσκευές από απόσταση μέσω του Android, χωρίς να χρειαστεί να τις “ανοίξετε/ξεβιδώσετε” για να τις παραμετροποιήσετε, όπως είδαμε σε προηγούμενα μέρη. Τις αντιμετωπίζουμε δηλαδή ως “Black Boxes”.

Πολλοί πιθανότατα να είναι διστακτικοί να ανοίξουν μία ακριβή ή πολύπλοκη ηλεκτρική συσκευή. Ευτυχώς έχουμε και για εσάς την λύση!

Η λογική της υλοποίησής μας

Σε προηγούμενα μέρη έχουμε εγκαταστήσει A/C Relay στο εσωτερικό ενός φωτιστικού, αλλά και μέσα στον διακόπτη του. Μία διαφορετική εναλλακτική, η οποία μας εγγυάται ότι οι συσκευές μας μένουν “ανέπαφες” είναι να εγκαταστήσω το A/C Relay είτε μέσα στην πρίζα, είτε σε πολύμπριζο!

Έτσι θα ελέγχουμε την τροφοδοσία τους, η οποία θα ξεκινάει μόλις το Arduino στείλει στο ρελέ μέσα στο πολύπριζο το σήμα των +5V.

Σας δίνεται λοιπόν η δυνατότητα να παραμετροποιήσετε ένα πάνφθηνο πολύπριζο, και μέσω αυτού να ελέγχετε άλλες συσκευές, όπως (στην συγκεκριμένη περίπτωση) η καφετιέρα!

  • surge-arduino-modified-1
  • surge-arduino-modified-2

Προειδοποιήσεις και Κίνδυνοι

Φυσικά θα τονίσω μία ακόμα φορά ότι δεν “παίζουμε” με το A/C ρεύμα της Δ.Ε.Η., λάθος χειρισμοί του οποίου μπορεί να προκαλέσουν φωτιά ή θάνατο.

Μην επιχειρήσετε τίποτα από τα παρακάτω αν δεν είστε 1000% σίγουρος ότι ξέρετε τι κάνετε.

  • warning-arduino-ac-project

Εγκατάσταση του A/C Relay στο πολύπριζο

Αρχικά βεβαιωνόμαστε ότι το πολύπριζο είναι εκτός πρίζας και στην συνέχεια το ξεβιδώνουμε αφαιρώντας το πλαστικό του καπάκι. Στην συνέχεια αποσυνδέουμε τα τρία καλώδια (φάσης, ουδέτερο, γείωση) από τις υποδοχές τους, στις οποίες ασφαλίζουν με βίδες.

Σ αυτό το σημείο πρέπει να βεβαιωθούμε ποιο είναι το καλώδιο φάσης για συγκεκριμένη τοποθέτηση του φις, κάτι το οποίο απαιτεί να συνδέσουμε την τροφοδοσία στο δίκτυο, και να μετρήσουμε με πολύμετρο. Άπειρη προσοχή, λοιπόν, σ’ αυτό το βήμα!

Έχοντας βρει το καλώδιο φάσης, (και έχοντας βγάλει την συσκευή από την πρίζα) το συνδέουμε με το “NO” του Relay. Στο “COM” συνδέουμε ένα ακόμα καλώδιο το οποίο έπειτα πηγαίνει στην υποδοχή της μεταλλικής πλάκας.

  • surge-relay-arduino-1
  • surge-relay-arduino-2

Έπειτα τοποθετούμε το Relay μέσα στο πλαστικό περίβλημα του πολύπριζου. Το καλώδιο σήματος, το βγάζω από το πλαστικό περίβλημα, από εκεί που “φεύγει” και το καλώδιο τροφοδοσίας. Ίσως για κάτι τέτοιο να απαιτείται να “ξύσουμε” λίγο το πλαστικό σε αυτό το σημείο.

  • surge-arduino-relay-1
  • surge-arduino-relay-2

Είναι πολύ σημαντικό το Relay που θα επιλέξετε, να μπορεί να “σηκώσει” το ρεύμα το οποίο απαιτούν οι ηλεκτρικές συσκευές που θέλετε να τροφοδοτήσετε. Αν για παράδειγμα οι συσκευές σας απαιτούν 7A, επιλέξτε relay πιστοποιημένο (τουλάχιστον) για 10A @ 220V AC.

Σύνδεση με το Arduino, και κώδικάς του

Η σύνδεση με το Arduino είναι η ίδια που έχουμε δει και σε προηγούμενα μέρη. Το μαύρο καλώδιο συνδέεται στο GND του Arduino, το πράσινο στα +5V, και το κόκκινο στο PIN που έχουμε ορίσει να λειτουργεί ως trigger, στέλνοντας είτε +5V είτε 0V.

Ο κώδικας είναι επίσης όμοιος με τα προηγούμενα μέρη, απλά ίσως θελήσετε να χρησιμοποιήσετε άλλο trigger PIN αντί για το 6 (στον κώδικα σας έχουμε έτοιμα και το 5 και το 3).

Μικρές βελτιώσεις μπορείτε φυσικά να κάνετε, ώστε ο Web Server να εμφανίζει και το εικονίδιο ενός καφέ, δίπλα από τον διακόπτη.

  • arduino-relay-connection-1

Αλλαγές στην Android εφαρμογή και αποτέλεσμα

Προς το παρόν δεν απαιτούνται αλλαγές στην Android εφαρμογή, στην οποία έχουμε ορίσει ένα WebView να “βλέπει” στον Web Server του Arduino με την Ethernet Shield.

Σε μελλοντικό tutorial θα δούμε πώς θα βελτιώσουμε την εφαρμογή, η οποία θα καλύπτει ό,τι έχουμε δει μέχρι σήμερα.

  • android-app-result-1
  • android-app-result-2

Κάμερα ασφαλείας και η Android εφαρμογή μας

Μία καλή λύση για κάμερα ασφαλείας στο σπίτι μας, την οποία θα μπορούμε να την ελέγξουμε από το Android, είναι μία IP Camera. Οι ενσύρματες λύσεις (που συνδέονται με καλώδιο ethernet στο router) αρχίζουν από 20 ευρώ, ενώ οι ασύρματες ξεκινάνε από τα 50.

Παρ’ όλα αυτά, εμείς, μιας και είχαμε παλιές Android συσκευές παρατημένες σε αχρηστία, είπαμε να τις χρησιμοποιήσουμε αυτές για IP Cameras! Γενικότερα με τις Android συσκευές να ξεκινάνε από λιγότερα από 70 ευρώ, είναι μία “καλή” λύση για αυτή την χρήση!

Ορίστε τι θα καταφέρουμε:

  • android-smart-home-camera-1
  • android-smart-home-camera-2

Χρησιμοποιώντας Android συσκευές ως Security Cameras

Κατεβάζουμε στην (παλιά) Android συσκευή μας την εφαρμογή IP Webcam, και ξεκινάμε τον Server, όπου σημειώνουμε την IP στην οποία τρέχει.

Download IP Webcam

  • android-ip-webcam

Στην συνέχεια τοποθετούμε την συσκευή σε “κρυφό” σημείο, στο οποίο όμως να υπάρχει και τροφοδοσία.

Παραμετροποιούμε την δική μας Android εφαρμογή

Την Android εφαρμογή που έχουμε φτιάξει, αρκεί να την παραμετροποιήσουμε με τέτοιο τρόπο ώστε το WebView να “βλέπει” στις IP που τρέχουν οι Servers.

Επ’ ευκαιρία, μιας και μπορεί να έχουμε περισσότερες από μία ip cameras, θα δώσουμε στην εφαρμογή την δυνατότητα να τις “βλέπει” όλες.

Ο πιο εύκολος τρόπος είναι μέσω του ίδιου του WebView και του jquery mobile να εμφανίσουμε την λίστα με τις επιλογές. Πιο συγκεκριμένα θα αλλάξουμε την java μας ώστε να βλέπει μέσα στα assets:

package com.sql.greekapp;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.sql.greekapp.R;

public class GreekNewsActivity extends Activity {
	WebView webview;
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.main);    
        getWindow().setFeatureInt(	Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
        webview = (WebView) findViewById(R.id.web_engine); 
        webview.setWebViewClient(new HelloWebViewClient());
        webview.getSettings().setJavaScriptEnabled(true); 
        webview.getSettings().setPluginsEnabled(true);  //depriciated
        if (Integer.parseInt(Build.VERSION.SDK) >= Build.VERSION_CODES.FROYO)
        	webview.getSettings().setPluginState(WebSettings.PluginState.ON); 
        webview.getSettings().setAllowFileAccess(true);        
        webview.getSettings().setBuiltInZoomControls(true); //multitouch an ipostirizetai        
        webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);      
        //webview.loadUrl("http://google.com"); //gia debug
	webview.loadUrl("file:///android_asset/content/a.html"); //update na vlepei sta assets
      
       final Activity MyActivity = this;
	   webview.setWebChromeClient(new WebChromeClient() {
       public void onProgressChanged(WebView view, int progress)   
       {
       	//Na svisw tin mpara afou fortwsei to url
       	MyActivity.setTitle("Φόρτωση...");
       	MyActivity.setProgress(progress * 100); //svisimo

       	// Kai na emfanisw to app name
           if(progress == 100)
           	MyActivity.setTitle(R.string.app_name);
         }
       });   
    }

    //Na krataw ta clicks within the app
    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {        	 
                return false;            
        }    
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
            webview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }    
}

Τα assets που χρησιμοποιήσαμε σας τα δίνουμε εδώ, κατεβάστε τα και αντικαταστήστε τα στο project σας.

Download Smart Home App Assets

Αυτά περιλαμβάνουν όλες τις εικόνες, αλλά και τις στατικές λίστες/μενού της εφαρμογής μας, η οποία θα γίνει ως εξής:

Βεβαιωθείτε ότι θα αλλάξετε μέσα στα assets την/τις IP στην οποία τρέχουν οι Servers από τις IP Cameras, εμείς έχουμε βάλει τα δικά μας, αλλά αλλάζουν από δίκτυο σε δίκτυο.

  • assets-code

Η εφαρμογή μας θα γίνει πλέον ως εξής:

  • ip-camera-android-app-1
  • ip-camera-android-app-2

Επιλέγοντας μία από αυτές τις κάμερες, εμφανίζουμε το live feed τους στην εφαρμογή μας! Για πρόσβαση όταν είμαστε εκτός σπιτιού απαιτείται να κάνουμε port forwaring. Αν έχουμε δυναμική IP απαιτείται και να χρησιμοποιήσουμε DynDNS στο router.

  • android-smart-home-camera-1
  • android-smart-home-camera-2

Λογική του ελέγχου του κεντρικού φωτός δωματίου

Όπως και στις υπόλοιπες ηλεκτρικές συσκευές που έχουμε ελέγξει από το Android, πρέπει να παρεμβάλουμε ένα AC Relay στην καλωδίωση. Κάτι τέτοιο μπορεί να γίνει εύκολα στην θέση του διακόπτη.

Στέλνοντας εντολή από την Android εφαρμογή που φτιάξαμε, στο Arduino, αυτό στέλνει ένα σήμα +5V στο Relay, το οποίο “κλείνει” το κύκλωμα. Αντίθετα, όταν το Relay δεν λαμβάνει το σήμα, και είναι συνδεδεμένο στην N/O (Normally Open) θέση, το κύκλωμα παραμένει ανοιχτό, οπότε το φως είναι σβηστό.

Τι θα κάνουμε σε αυτό το βήμα (βίντεο):

Πολύ σοβαρή προειδοποίηση

Για χιλιοστή φορά τονίζω ότι το A/C ρεύμα είναι επικίνδυνο. Μην επιχειρήσετε τίποτα από τα παρακάτω αν δεν είστε απολύτος σίγουρος τι κάνετε.

  • warning-arduino-ac-project

Εγκατάσταση Relay στην καλωδίωση του σπιτιού

Άνοιγμα του διακόπτη

Αρχικά κατεβάζουμε τον γενικό ή την ασφάλεια του αντιστοιχεί στον διακόπτη που θέλουμε να ανοίξουμε. Αφαιρούμε το πλαστικό του καπάκι βάζοντας το κατσαβίδι στις εγκοπές που έχει στις άκρες.

  • switch-1
  • switch-2
  • switch-3
  • switch-4

Στην συνέχεια ξεβιδώνουμε τις βίδες στις άκρες που ελέγχουν το πιάσιμο ώστε να ελευθερωθεί τελείως ο διακόπτης. Στην συγκεκριμένη περίπτωση ο διακόπτης μας ήταν aller-retour (2 διακόπτες σε ένα δωμάτιο να ελέγχουν ένα φως).

Στην πιο απλή περίπτωση θα είναι μόνο 2 καλώδια στις άκρες του διακόπτη.

  • how-to-open-switch-1
  • how-to-open-switch-2
  • how-to-open-switch-3
  • how-to-open-switch-4

Εγκατάσταση Relay

Το Relay μπαίνει ανάμεσα στα 2 καλώδια του διακόπτη που θα ενώνονταν όταν τον πατούσαμε, και συγκεκριμένα το ένα καλώδιο στο COM, ενώ το άλλο στο NO (Normally Open).

Από την άλλη μεριά του Relay συνδέονται με κλιπ 3 καλώδια, 2 για την τροφοδοσία του και ένα το οποίο θα μεταφέρει το Trigger των 5V.

Έτσι όταν αυτό λάβει το σήμα των 5V, θα κλείσει το κύκλωμα και θα ενεργοποιήσει τα φώτα.

  • relay-connection

Κύκλωμα στο Arduino

Το κύκλωμα στο Arduino είναι το ίδιο το οποίο είδαμε και σε προηγούμενα μέρη. Στην συγκεκριμένη περίπτωση τα 5V (πράσινο και μαύρο καλώδιο από +5V και GND) τα μεταφέραμε πρώτα στην breadboard, καθότι από εκεί θα οδηγηθούν και σε άλλα relays στην συνέχεια.

  • schematic

Στην συνέχεια συνδέονται με το πράσινο και μαύρο καλώδιο του Relay αντίστοιχα. Το κόκκινο καλώδιο από την άλλη φεύγει από το Arduino και πηγαίνει κατευθείαν στο Relay.

  • arduino-connection-1
  • arduino-connection-2
  • arduino-connection-3

Η Android εφαρμογή

Η Android εφαρμογή δεν χρειάζεται κάποια αλλαγή, και μπορεί να χρησιμοποιηθεί αυτούσια όπως έχουμε δει σε προηγούμενα βήματα.

  • android-smart-home-app-1
  • android-smart-home-app-2

Τι χρειαστήκαμε για το project και πόσο κόστισε:

Η πλακέτα στην οποία βασιστήκαμε είναι το Arduino για το οποίο χρειαστήκαμε και την Ethernet Shield του.

Σε περίπτωση που το Arduino πρέπει να τοποθετηθεί σε σημείο μακριά από το router του σπιτιού (και δεν θέλουμε να τραβάμε καλώδιο ethernet) τότε χρησιμοποιούμε ένα A/P το οποίο ρυθμίζουμε σε Client Mode.

Σε κάθε συσκευή (ή πρίζα/διακόπτη) που θέλουμε να μπορούμε να ελέγχουμε από το Android, θα χρειαστεί να τοποθετήσουμε ένα Relay, όπου ενδεικτικά χρησιμοποιήσαμε αυτό. Φυσικά βεβαιωθείτε ότι η αντοχή σε ρεύμα του Relay που θα επιλέξετε υπερκαλύπτει τις ανάγκες της συσκευής σε ρεύμα.

Λοιπά πράγματα που χρησιμοποιήσαμε: breadboard, jumper wires, αισθητήρας θερμοκρασίας LM35, photocells, λοιποί αιθητήρες, αντιστάσεις, μονωτική, πολύμετρο, κατσαβίδια κτλ.

Από εκεί και πέρα ο καθένας αναλόγως του budget που είναι διατεθειμένος να διαθέσει, μπορεί να το προχωρήσει όσο θέλει! Ο κώδικας που χρησιμοποιήσαμε τόσο στο Android, όσο και στο Arduino είναι διαθέσιμος σε προηγούμενα άρθρα.

  • arduino-equipment

Γιατί δεν πρόσθεσες το “χ” ή το “ψ” χαρακτηριστικό στο Smart Home;

Υπήρχαν πολλές καλές ιδέες εξέλιξης του project, αλλά ήδη νιώθω ότι κούρασε αρκετά πολλούς αναγνώστες. Σε 14 parts πιστεύω καλύψαμε παραπάνω από τα βασικά του Arduino, και του Android, ώστε να μπορέσετε και εσείς να το υλοποιήσετε καθώς και να το εξελίξετε.

Κάποιες από τις εφικτές ιδέες περιλαμβάνουν φωνητικές εντολές (να λες στο κινητό “φως άναψε” και να στέλνουμε έτσι την εντολή αντί να πατάμε “κουμπί” στο κινητό), έλεγχος θερμοσίφωνα (ίδια λογική με ό,τι είδαμε), άνοιγμα-κλείσιμο παραθύρων από το Android (ίδια λογική, χρήση relay σε actuators).

Βασισμένοι στις οδηγίες μας μπορείτε να εξελίξετε το project ώστε να φτιάξετε και όλα τα παραπάνω πολύ εύκολα!

  • android-smart-home-app

Φυσικά ο λόγος που “αφήνουμε” αυτό το project.. είναι το επόμενο! Το οποίο θα είναι ακόμα πιο ενδιαφέρον, και ακόμα πιο “τρελό!” Περισσότερα για αυτό σε επόμενο άρθρο! Update: Android Smart Car

Πηγη: http://www.greeceandroid.gr/

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s