查看: 26493|回复: 4

[项目] 用树莓派通过Java实现远程控制电灯【转】

[复制链接]
  • TA的每日心情
    开心
    2016-8-15 09:30
  • 签到天数: 162 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-1-3 14:36:56 | 显示全部楼层 |阅读模式
    分享到:
    1、前言

    科幻电影里电脑特效总是令人兴奋,现在我们自己动手也能实现几个特别好玩的功能。比如说远程控制家里的电灯,虽然这已不是什么稀奇的高科技,而且市面上也有很多智能家居系统,但是有些人就是想自己动手做,我们这里是用Java来进行程序编写的,呵,万能的Java啊。

    先看看效果演示吧:


    2、准备工作
    在这个教程中要用到树莓派、电脑、继电器、智能手机,下面一一为大家简单介绍一下。
    1) 树莓派

    我的是树莓派raspberry pi 2代B版,(就让我说一句吧:树莓派是时下最流行的卡片式电脑,外形只有信用卡大小,却具有电脑的所有基本功能。开源的Linux系统,1080p的影片播放。。。)这是我在淘宝上买的(225羊):

    1.jpg

    2) 电脑
    没有显示器或者树莓派没有键盘和鼠标时,可以用电脑对树莓派进行远程命令和桌面控制(ssh和VNC)。具体可以看这里:http://tieba.baidu.com/p/2600192167

    3) 继电器

    继电器是一种电控制器件,它实际上是用小电流去控制大电流运作的一种“自动开关”。我们都知道家里的电灯是220V的,所以我们这里用它来控制电灯。控制了继电器就等于控制了电灯。对了,买树莓派和继电器的时候顺便买上杜邦线。

    2.jpg

    4) 智能手机

    用手机客户端控制来远程控制电灯,无论你在北京、上海还是乌鲁木齐,只要你的手机能联网就能远程控制。

    3、配置树莓派
    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系统吧。

    3.jpg

    看到这里是不是很兴奋了,好的,依照国际惯例我们运行一个HelloWorld程序:

    4.jpg

    作为Java程序员,看到这个在树莓派上运行,真是爽爆了。这意味着你以前在Windows上编写的程序都可以直接放到树莓派上运行,而不需要重新编译,Java嘛,跨平台地球人都知道。是不是很想试试呢,看看我的吧:

    5.jpg

    2) 安装Pi4j

    打开树莓派的控制台输入下面的命令下载Pi4j文件:
    1. wget http://pi4j.googlecode.com/files/pi4j-0.0.5.deb  
    复制代码
    (如果你已经安装了Pi4j的其他版本,请先执行如下命令将其卸载掉:sudo dpkg -r pi4j)

    下载完成后使用下面的命令安装:
    1.     sudo dpkg -i pi4j-0.0.5.deb  
    复制代码
    安装Pi4j库和示例文件:
    1. /opt/pi4j/lib   
    2. /opt/pi4j/examples  
    复制代码
    到这里就已经安装完成了,如果想要卸载Pi4j执行如下命令:
    1. sudo dpkg -r pi4j  
    复制代码
    3) Pi4j程序的编译与运行示例

    要想编译使用Pi4j的程序必须指明其包的路径比如说我在home/pi/code/java/下编写了一个叫Test.java的程序,应该执行如下命令:

    首先进入到程序的目录:
    1. cd code/java  
    复制代码
    编译:
    1. javac -classpath .:classes:/opt/pi4j/lib/'*' -d . Test.java  
    复制代码
    运行:
    1. sudo java -classpath .:classes:/opt/pi4j/lib/'*' Test  
    复制代码
    4、连接GPIO和继电器

    6.jpg

    这便是树莓派的GPIO针脚,来看一下pi4j官网提供的图片:

    7.jpg

    通过GPIO我们对继电器进行控制,控制了继电器就等于控制了电灯。

    继电器的这个地方有四个针脚:

    8.jpg

    分别为:GND(接地)、IN1(控制继电器1)、IN2(控制继电器2)、VCC(电源)放大来看:

    9.jpg

    下面来连接GPIO和继电器:

    GND接树莓派上的6号针脚,VCC接树莓派的2号针脚,因为继电器工作电压为5V,所以不需要电阻,IN1接在树莓派的12号针脚(GPIO1)。连接如下图:

    10.jpg

    连接好之后就是这个样子的(这个图片中IN1连接的是26号针脚):

    11.jpg

    5、控制继电器

    在home/pi/code/java/下新建java程序Test.java,功能就是让继电器每隔一秒就切换一下状态:
    1.   import com.pi4j.io.gpio.GpioController;  
    2.     import com.pi4j.io.gpio.GpioFactory;  
    3.     import com.pi4j.io.gpio.GpioPinDigitalOutput;  
    4.     import com.pi4j.io.gpio.PinState;  
    5.     import com.pi4j.io.gpio.RaspiPin;  
    6.       
    7.       
    8.     public class Test {  
    9.          
    10.         public static void main(String[] args) throws InterruptedException {  
    11.             // 创建一个GPIO控制器  
    12.            final GpioController gpio = GpioFactory.getInstance();  
    13.               
    14.             // 获取1号GPIO针脚并设置高电平状态,对应的是树莓派上的12号针脚,可以参考pi4j提供的图片。  
    15.            final GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, "LED", PinState.HIGH);  
    16.       
    17.         while(true){  
    18.             //设置高电平  
    19.             pin.high();  
    20.             System.out.println("打开继电器");  
    21.             //睡眠1秒  
    22.                Thread.sleep(1000);  
    23.             //设置低电平  
    24.             pin.low();  
    25.             System.out.println("关闭继电器");  
    26.                Thread.sleep(1000);  
    27.             //切换状态  
    28.                //pin.toggle();  
    29.         }  
    30.         }  
    31.     }  
    复制代码
    进入到程序的目录:
    1. cd code/java  
    复制代码
    编译:
    1. javac -classpath .:classes:/opt/pi4j/lib/'*' -d . Test.java  
    复制代码
    运行:
    1.     sudo java -classpath .:classes:/opt/pi4j/lib/'*' Test  
    复制代码
    运行结果如下图:

    12.jpg

    看着继电器一闪一闪地是不是很爽啊,呵呵。

    6、搭建Yeelink环境

    现在我们已经实现了用java控制树莓派的GPIO,要想在公网下控制树莓派,要么你有自己的服务器,要么你就用人家的。我们这里用的是Yeelink平台。

    先简单介绍一下流程:我们用Yeelink的手机客户端(浏览器也行)去改变服务上设备的状态(0/1),然后让树莓派检测该设备上的状态,最后根据获取到的状态控制继电器。

    1) 注册Yeelink账号

    访问Yeelink的官方网站(http://www.yeelink.net/),点击快速开始,按照步骤注册账号。

    2) 添加一个设备

    下面是Yeelink的官方向导:

    2.1 进入用户中心

    13.jpg
    2.2 增加新设备

    14.jpg
    15.jpg
    2.3 增加传感器

    16.jpg
    17.jpg
    18.jpg

    3) 下载Yeelink的客户端

    访问Yeelink的下载页面下载手机客户端来控制开关:http://www.yeelink.net/developer/tools

    打开后点击“我的Yeelink“,然后点击你的设备,使用开关来控制设备的状态。
    19.jpg
    20.jpg

    7、完整的Java代码

    搭建好Yeelink平台后,我们可以用树莓派访问设备的状态链接以获得设备的当前状态,然后根据得到的状态来控制GPIO。编写程序每2秒获取一次状态,访问时间间隔不建议设置的太短。在home/pi/code/java/下新建java程序ControlLed.java,代码没有什么算法,都是基本的操作。如有不足望高手指点一二。
    1. import java.io.BufferedReader;  
    2. import java.io.IOException;  
    3. import java.io.InputStream;  
    4. import java.io.InputStreamReader;  
    5. import java.net.HttpURLConnection;  
    6. import java.net.URL;  
    7. import com.pi4j.io.gpio.GpioController;  
    8. import com.pi4j.io.gpio.GpioFactory;  
    9. import com.pi4j.io.gpio.GpioPinDigitalOutput;  
    10. import com.pi4j.io.gpio.PinState;  
    11. import com.pi4j.io.gpio.RaspiPin;  
    12. /**
    13. * 远程控制树莓派上的GPIO实例
    14. * @author 亓根火柴
    15. */  
    16. public class ControlLed {  
    17.     GpioController gpio;  
    18.     GpioPinDigitalOutput pin;  
    19.     public static void main(String s[]){  
    20.         //下面的链接就是你在Yeelink的设备的状态URL  
    21.         String urlStr = "http://api.yeelink.net/v1.0/device/《这  
    22.   
    23. 里是你的设备编号》/sensor/《这里是你的传感器编号》/datapoints";  
    24.         ControlLed cl = new ControlLed();  
    25.         cl.gpio = GpioFactory.getInstance();  
    26.             cl.pin = cl.gpio.provisionDigitalOutputPin  
    27.   
    28. (RaspiPin.GPIO_01, "LED", PinState.HIGH);  
    29.         boolean current = cl.getStatus(urlStr);  
    30.         cl.setLedStatus(current);  
    31.         while(true){  
    32.             try{  
    33.                 if(cl.getStatus(urlStr) != current){  
    34.                     current = cl.getStatus(urlStr);  
    35.                     cl.setLedStatus(current);  
    36.                 }  
    37.                 Thread.sleep(2000);  
    38.             }catch(Exception e){e.printStackTrace();}  
    39.         }  
    40.     }  
    41.     public boolean getStatus(String urlStr){  
    42.         URL url;boolean on = false;  
    43.         try {  
    44.             url = new URL(urlStr);  
    45.             HttpURLConnection conn = (HttpURLConnection)   
    46.   
    47. url.openConnection();  
    48.             conn.setRequestMethod("GET");  
    49.             InputStream in = conn.getInputStream();  
    50.             BufferedReader rd = new BufferedReader(new   
    51.   
    52. InputStreamReader(in));  
    53.             StringBuilder tempStr = new StringBuilder();  
    54.             while (rd.read() != -1) {  
    55.                 tempStr.append(rd.readLine());  
    56.             }  
    57.             //System.out.print("--> 服务器上传感器的信息:");  
    58.             String status = tempStr.substring  
    59.   
    60. (tempStr.lastIndexOf(":")+1, tempStr.length()-1);  
    61.             //System.out.println(status);  
    62.             on = status.equals("1")? true:false;  
    63.             //System.out.println(on);  
    64.             return on;  
    65.         } catch (IOException e) {  
    66.             e.printStackTrace();  
    67.         }return on;  
    68.     }  
    69.     public void setLedStatus(boolean sta){  
    70.               if(sta){  
    71.             pin.low();  
    72.             //因为我的继电器是低电平有效  
    73.                 System.out.println("--> 更新GPIO的状态: 开");  
    74.         }else {  
    75.                 pin.high();  
    76.                 System.out.println("--> 更新GPIO的状态: 关");  
    77.         }  
    78.     }  
    79. }
    复制代码
    8、总结

    因为不是太懂Linux所以不知道如何将cd code/java和sudo java -classpath .:classes:/opt/pi4j/lib/'*' ControlLed命令开机的时候自动执行(谁会教我吧),所以我暂时将命令放到了记事本里面用来复制。其实本教程只是一个非常简单的实例,大家可以发挥自己的聪明才智打造自己的智能家居。好了,就说到这里了,有什么问题大家可以一起解决260383473@qq.com

    本文章由 亓根火柴 原创,转载请注明出处:http://blog.csdn.net/qigenhuochai/article/details/17661845

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2015-12-9 17:46
  • 签到天数: 536 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2014-1-3 15:20:45 | 显示全部楼层
    好教程啊,用自带的python做也不赖嘛
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 10:32
  • 签到天数: 295 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-1-3 17:38:24 | 显示全部楼层
    给力,顶一个~~~~~~~~~~~~·
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2014-4-15 09:55
  • 签到天数: 31 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2014-1-16 16:34:33 | 显示全部楼层
    我要的就是这种效果,学习了~今天买一个回来试试
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-9-29 18:50:04 | 显示全部楼层
    一直用Python,学习了,这个还结合了Yeelink!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 15:38 , Processed in 0.156174 second(s), 23 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.