用树莓派经过Java实现远程控制电灯html
本文章由 亓根火柴 原创,转载请注明出处:http://blog.csdn.net/qigenhuochai/article/details/17661845java
传说,女娲娘娘炼就七根火柴,来帮助人类度过第一个冬季,今后,七根火柴散落人间,不见踪影...python
科幻电影里电脑特效老是使人兴奋,如今咱们本身动手也能实现几个特别好玩的功能。好比说远程控制家里的电灯,虽然这已不是什么稀奇的高科技,并且市面上也有不少智能家居系统,可是有些人就是想本身动手作,咱们这里是用Java来进行程序编写的,呵,万能的Java啊。git
先看看效果演示吧:http://v.youku.com/v_show/id_XNjU2MTM3MTAw.html程序员
在这个教程中要用到树莓派、电脑、继电器、智能手机,下面一一为你们简单介绍一下。web
个人是树莓派raspberry pi 2代B版,不知道什么是树莓派的请看这里:树莓派。(就让我说一句吧:树莓派是时下最流行的卡片式电脑,外形只有信用卡大小,却具备电脑的全部基本功能。开源的Linux系统,1080p的影片播放。。。)这是我在淘宝上买的(225羊):算法
没有显示器或者树莓派没有键盘和鼠标时,能够用电脑对树莓派进行远程命令和桌面控制(ssh和VNC)。具体能够看这里:http://tieba.baidu.com/p/2600192167shell
继电器是一种电控制器件,它其实是用小电流去控制大电流运做的一种“自动开关”。咱们都知道家里的电灯是220V的,因此咱们这里用它来控制电灯。控制了继电器就等于控制了电灯。对了,买树莓派和继电器的时候顺便买上杜邦线。api
用手机客户端控制来远程控制电灯,不管你在北京、上海仍是乌鲁木齐,只要你的手机能联网就能远程控制。浏览器
要想控制继电器,咱们必须先学会控制树莓派上的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嘛,跨平台地球人都知道。是否是很想试试呢,看看个人吧:
打开树莓派的控制台输入下面的命令下载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
要想编译使用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针脚,来看一下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
运行结果以下图:
看着继电器一闪一闪地是否是很爽啊,呵呵。
如今咱们已经实现了用java控制树莓派的GPIO,要想在公网下控制树莓派,要么你有本身的服务器,要么你就用人家的。咱们这里用的是Yeelink平台。
先简单介绍一下流程:咱们用Yeelink的手机客户端(浏览器也行)去改变服务上设备的状态(0/1),而后让树莓派检测该设备上的状态,最后根据获取到的状态控制继电器。
访问Yeelink的官方网站(http://www.yeelink.net/),点击快速开始,按照步骤注册帐号。
下面是Yeelink的官方向导:
2.1 进入用户中心
2.2 增长新设备
2.3 增长传感器
访问Yeelink的下载页面下载手机客户端来控制开关:http://www.yeelink.net/developer/tools
打开后点击“个人Yeelink“,而后点击你的设备,使用开关来控制设备的状态。
搭建好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
传说,女娲娘娘炼就七根火柴,来帮助人类度过第一个冬季,今后,七根火柴散落人间,不见踪影...