用樹莓派經過Java實現遠程控制電燈

用樹莓派經過Java實現遠程控制電燈html

本文章由 亓根火柴 原創,轉載請註明出處:http://blog.csdn.net/qigenhuochai/article/details/17661845java

傳說,女媧娘娘煉就七根火柴,來幫助人類度過第一個冬季,今後,七根火柴散落人間,不見蹤影...python

一、前言

科幻電影裏電腦特效老是使人興奮,如今咱們本身動手也能實現幾個特別好玩的功能。好比說遠程控制家裏的電燈,雖然這已不是什麼稀奇的高科技,並且市面上也有不少智能家居系統,可是有些人就是想本身動手作,咱們這裏是用Java來進行程序編寫的,呵,萬能的Java啊git

先看看效果演示吧:http://v.youku.com/v_show/id_XNjU2MTM3MTAw.html程序員

二、準備工做

在這個教程中要用到樹莓派、電腦、繼電器、智能手機,下面一一爲你們簡單介紹一下。web

1) 樹莓派

個人是樹莓派raspberry pi 2代B版,不知道什麼是樹莓派的請看這裏:樹莓派。(就讓我說一句吧:樹莓派是時下最流行的卡片式電腦,外形只有信用卡大小,卻具備電腦的全部基本功能。開源的Linux系統1080p的影片播放。。。)這是我在淘寶上買的(225羊):算法


2) 電腦

沒有顯示器或者樹莓派沒有鍵盤和鼠標時,能夠用電腦對樹莓派進行遠程命令和桌面控制(ssh和VNC)。具體能夠看這裏:http://tieba.baidu.com/p/2600192167shell

3) 繼電器

繼電器是一種電控制器件,它其實是用小電流去控制大電流運做的一種「自動開關」。咱們都知道家裏的電燈是220V的,因此咱們這裏用它來控制電燈。控制了繼電器就等於控制了電燈。對了,買樹莓派和繼電器的時候順便買上杜邦線。api


4) 智能手機

用手機客戶端控制來遠程控制電燈,不管你在北京、上海仍是烏魯木齊,只要你的手機能聯網就能遠程控制。瀏覽器

三、配置樹莓派

1) 安裝Java

要想控制繼電器,咱們必須先學會控制樹莓派上的GPIO,控制GPIO有不少方式:python、wiringPi、pi4j。前兩種方式的介紹網上有不少,因此咱們這裏介紹pi4j,該項目旨在爲全面進入Raspberry Pi的提供本地庫和Java之間的橋樑(This project is intended to provide a bridge between the native libraries and Java for full access to the Raspberry Pi.)。要想使用pi4j必須給樹莓派安裝Java,不過在最新的樹莓派系統Raspbian中已經內置了Java(2013-12-20-wheezy-raspbian.zip),若是不知道你的樹莓派中有沒有Java,你可使用javac -version 來查看是否有安裝了Java。以下圖出現了版本信息,就表示安裝了Java。若是沒有就去下載最新的Raspbian系統吧。

 

看到這裏是否是很興奮了,好的,依照國際慣例咱們運行一個HelloWorld程序:

 

做爲Java程序員,看到這個在樹莓派上運行,真是爽爆了。這意味着你之前在Windows上編寫的程序均可以直接放到樹莓派上運行,而不須要從新編譯,Java嘛,跨平臺地球人都知道。是否是很想試試呢,看看個人吧:

 

2) 安裝Pi4j

打開樹莓派的控制檯輸入下面的命令下載Pi4j文件:

wget http://pi4j.googlecode.com/files/pi4j-0.0.5.deb

(若是你已經安裝了Pi4j的其餘版本,請先執行以下命令將其卸載掉:sudo dpkg -r pi4j)

下載完成後使用下面的命令安裝:

sudo dpkg -i pi4j-0.0.5.deb

 安裝Pi4j庫和示例文件:

/opt/pi4j/lib
/opt/pi4j/examples

到這裏就已經安裝完成了,若是想要卸載Pi4j執行以下命令:

sudo dpkg -r pi4j

3) Pi4j程序的編譯與運行示例

要想編譯使用Pi4j的程序必須指明其包的路徑好比說我在home/pi/code/java/下編寫了一個叫Test.java的程序,應該執行以下命令:

首先進入到程序的目錄:

cd code/java

編譯:

javac -classpath .:classes:/opt/pi4j/lib/'*' -d . Test.java

運行:

sudo java -classpath .:classes:/opt/pi4j/lib/'*' Test

 

四、鏈接GPIO和繼電器

 

這即是樹莓派的GPIO針腳,來看一下pi4j官網提供的圖片:


經過GPIO咱們對繼電器進行控制,控制了繼電器就等於控制了電燈。

繼電器的這個地方有四個針腳:


分別爲:GND(接地)、IN1(控制繼電器1)、IN2(控制繼電器2)、VCC(電源)放大來看:


下面來鏈接GPIO和繼電器:

GND接樹莓派上的6號針腳,VCC接樹莓派的2號針腳,由於繼電器工做電壓爲5V,因此不須要電阻,IN1接在樹莓派的12號針腳(GPIO1)。鏈接以下圖:


鏈接好以後就是這個樣子的(這個圖片中IN1鏈接的是26號針腳):


五、控制繼電器

在home/pi/code/java/下新建java程序Test.java,功能就是讓繼電器每隔一秒就切換一下狀態:

import com.pi4j.io.gpio.GpioController;  
import com.pi4j.io.gpio.GpioFactory;  
import com.pi4j.io.gpio.GpioPinDigitalOutput;  
import com.pi4j.io.gpio.PinState;  
import com.pi4j.io.gpio.RaspiPin;  
  
/** 
 * 控制樹莓派上的GPIO實例 
 * @author 亓根火柴 
 */  
public class Test {  
      
    public static void main(String[] args) throws InterruptedException {  
        // 建立一個GPIO控制器  
       final GpioController gpio = GpioFactory.getInstance();  
          
        // 獲取1號GPIO針腳並設置高電平狀態,對應的是樹莓派上的12號針腳,能夠參考pi4j提供的圖片。  
       final GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, "LED", PinState.HIGH);  
  
    while(true){  
        //設置高電平  
        pin.high();  
        System.out.println("打開繼電器");  
        //睡眠1秒  
           Thread.sleep(1000);  
        //設置低電平  
        pin.low();  
        System.out.println("關閉繼電器");  
           Thread.sleep(1000);  
        //切換狀態  
           //pin.toggle();  
    }  
    }  
}

 進入到程序的目錄:

 cd code/java

編譯:

javac -classpath .:classes:/opt/pi4j/lib/'*' -d . Test.java

  運行:

sudo java -classpath .:classes:/opt/pi4j/lib/'*' Test

運行結果以下圖:


看着繼電器一閃一閃地是否是很爽啊,呵呵。

六、搭建Yeelink環境

如今咱們已經實現了用java控制樹莓派的GPIO,要想在公網下控制樹莓派,要麼你有本身的服務器,要麼你就用人家的。咱們這裏用的是Yeelink平臺。

先簡單介紹一下流程:咱們用Yeelink的手機客戶端(瀏覽器也行)去改變服務上設備的狀態(0/1),而後讓樹莓派檢測該設備上的狀態,最後根據獲取到的狀態控制繼電器。

1) 註冊Yeelink帳號

訪問Yeelink的官方網站(http://www.yeelink.net/),點擊快速開始,按照步驟註冊帳號。

2) 添加一個設備

下面是Yeelink的官方向導:

2.1 進入用戶中心


2.2 增長新設備



2.3 增長傳感器




3) 下載Yeelink的客戶端

訪問Yeelink的下載頁面下載手機客戶端來控制開關:http://www.yeelink.net/developer/tools

打開後點擊「個人Yeelink「,而後點擊你的設備,使用開關來控制設備的狀態。

 

七、完整的Java代碼

搭建好Yeelink平臺後,咱們能夠用樹莓派訪問設備的狀態連接以得到設備的當前狀態,而後根據獲得的狀態來控制GPIO。編寫程序每2秒獲取一次狀態,訪問時間間隔不建議設置的過短。在home/pi/code/java/下新建java程序ControlLed.java,代碼沒有什麼算法,都是基本的操做。若有不足望高手指點一二。

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.net.HttpURLConnection;  
import java.net.URL;  
import com.pi4j.io.gpio.GpioController;  
import com.pi4j.io.gpio.GpioFactory;  
import com.pi4j.io.gpio.GpioPinDigitalOutput;  
import com.pi4j.io.gpio.PinState;  
import com.pi4j.io.gpio.RaspiPin;  
/** 
 * 遠程控制樹莓派上的GPIO實例 
 * @author 亓根火柴 
 */  
public class ControlLed {  
    GpioController gpio;  
    GpioPinDigitalOutput pin;  
    public static void main(String s[]){  
        //下面的連接就是你在Yeelink的設備的狀態URL  
        String urlStr = "http://api.yeelink.net/v1.0/device/《這  
  
裏是你的設備編號》/sensor/《這裏是你的傳感器編號》/datapoints";  
        ControlLed cl = new ControlLed();  
        cl.gpio = GpioFactory.getInstance();  
            cl.pin = cl.gpio.provisionDigitalOutputPin  
  
(RaspiPin.GPIO_01, "LED", PinState.HIGH);  
        boolean current = cl.getStatus(urlStr);  
        cl.setLedStatus(current);  
        while(true){  
            try{  
                if(cl.getStatus(urlStr) != current){  
                    current = cl.getStatus(urlStr);  
                    cl.setLedStatus(current);  
                }  
                Thread.sleep(2000);  
            }catch(Exception e){e.printStackTrace();}  
        }  
    }  
    public boolean getStatus(String urlStr){  
        URL url;boolean on = false;  
        try {  
            url = new URL(urlStr);  
            HttpURLConnection conn = (HttpURLConnection)   
  
url.openConnection();  
            conn.setRequestMethod("GET");  
            InputStream in = conn.getInputStream();  
            BufferedReader rd = new BufferedReader(new   
  
InputStreamReader(in));  
            StringBuilder tempStr = new StringBuilder();  
            while (rd.read() != -1) {  
                tempStr.append(rd.readLine());  
            }  
            //System.out.print("--> 服務器上傳感器的信息:");  
            String status = tempStr.substring  
  
(tempStr.lastIndexOf(":")+1, tempStr.length()-1);  
            //System.out.println(status);  
            on = status.equals("1")? true:false;  
            //System.out.println(on);  
            return on;  
        } catch (IOException e) {  
            e.printStackTrace();  
        }return on;  
    }  
    public void setLedStatus(boolean sta){  
              if(sta){  
            pin.low();  
            //由於個人繼電器是低電平有效  
                System.out.println("--> 更新GPIO的狀態: 開");  
        }else {  
                pin.high();  
                System.out.println("--> 更新GPIO的狀態: 關");  
        }  
    }  
}

八、總結

由於不是太懂Linux因此不知道如何將cd code/java和sudo java -classpath .:classes:/opt/pi4j/lib/'*' ControlLed命令開機的時候自動執行(誰會教我吧),因此我暫時將命令放到了記事本里面用來複制。其實本教程只是一個很是簡單的實例,你們能夠發揮本身的聰明才智打造本身的智能家居。好了,就說到這裏了,有什麼問題你們能夠一塊兒解決260383473@qq.com。

本文章由 亓根火柴 原創,轉載請註明出處:http://blog.csdn.net/qigenhuochai/article/details/17661845

傳說,女媧娘娘煉就七根火柴,來幫助人類度過第一個冬季,今後,七根火柴散落人間,不見蹤影...

相關文章
相關標籤/搜索