最好的电子音响科技diy制作网站

haoDIY_音响电子电脑科技DIY小制作发明

当前位置: 主页 > 电子DIY > 单片机 >

树莓派和Java一起打造远程控制电灯

时间:2017-05-10 21:42来源:网络整理 作者:haodiy 点击:
1、前言科幻电影里电脑特效总是令人兴奋,现在我们自己动手也能实现几个特别好玩的功能。比如说远程控制家里的电灯,虽然这已不是什么稀奇的高科技,而且市面上

1、前言
科幻电影里电脑特效总是令人兴奋,现在我们自己动手也能实现几个特别好玩的功能。比如说远程控制家里的电灯,虽然这已不是什么稀奇的高科技,而且市面上也有很多智能家居系统,但是有些人就是想自己动手做,我们这里是用Java来进行程序编写的,呵,万能的Java啊。
2、准备工作
在这个教程中要用到树莓派、电脑、继电器、智能手机,下面一一为大家简单介绍一下。
1) 树莓派
我的是树莓派raspberry pi 2代B版,这是我在淘宝上买的(225羊):

 

树莓派和Java一起打造远程控制电灯


2) 电脑
没有显示器或者树莓派没有键盘和鼠标时,可以用电脑对树莓派进行远程命令和桌面控制(ssh和VNC)。
3) 继电器
继电器是一种电控制器件,它实际上是用小电流去控制大电流运作的一种“自动开关”。我们都知道家里的电灯是220V的,所以我们这里用它来控制电灯。控制了继电器就等于控制了电灯。对了,买树莓派和继电器的时候顺便买上杜邦线。

 

 

树莓派和Java一起打造远程控制电灯


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系统吧。

 

 

树莓派和Java一起打造远程控制电灯


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

 

 

树莓派和Java一起打造远程控制电灯


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

 

 

树莓派和Java一起打造远程控制电灯


2) 安装Pi4j
打开树莓派的控制台输入下面的命令下载Pi4j文件:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片
    wget  
(如果你已经安装了Pi4j的其他版本,请先执行如下命令将其卸载掉:sudo dpkg -r pi4j)
下载完成后使用下面的命令安装:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片
    sudo dpkg -i pi4j-0.0.5.deb 
安装Pi4j库和示例文件:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片
    /opt/pi4j/lib  
    /opt/pi4j/examples 
到这里就已经安装完成了,如果想要卸载Pi4j执行如下命令:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片
    sudo dpkg -r pi4j 
3) Pi4j程序的编译与运行示例
要想编译使用Pi4j的程序必须指明其包的路径比如说我在home/pi/code/java/下编写了一个叫Test.java的程序,应该执行如下命令:
首先进入到程序的目录:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片
    cd code/java 
编译:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片
    javac -classpath .:classes:/opt/pi4j/lib/'*' -d . Test.java 
运行:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' Test 
4、连接GPIO和继电器

 

 

树莓派和Java一起打造远程控制电灯


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

 

 

树莓派和Java一起打造远程控制电灯


通过GPIO我们对继电器进行控制,控制了继电器就等于控制了电灯。
继电器的这个地方有四个针脚:

 

 

树莓派和Java一起打造远程控制电灯


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

 

 

树莓派和Java一起打造远程控制电灯


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

 

 

树莓派和Java一起打造远程控制电灯


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

 

 

树莓派和Java一起打造远程控制电灯


5、控制继电器
在home/pi/code/java/下新建java程序Test.java,功能就是让继电器每隔一秒就切换一下状态:
[java] view plain copy
在CODE上查看代码片派生到我的代码片
    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(); 
        } 
        } 
    } 
进入到程序的目录:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片
    cd code/java 
编译:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片
    javac -classpath .:classes:/opt/pi4j/lib/'*' -d . Test.java 
运行:
[plain] view plain copy
在CODE上查看代码片派生到我的代码片
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' Test 
运行结果如下图:

 

 

树莓派和Java一起打造远程控制电灯


看着继电器一闪一闪地是不是很爽啊,呵呵。
6、搭建Yeelink环境
现在我们已经实现了用java控制树莓派的GPIO,要想在公网下控制树莓派,要么你有自己的服务器,要么你就用人家的。我们这里用的是Yeelink平台。
先简单介绍一下流程:我们用Yeelink的手机客户端(浏览器也行)去改变服务上设备的状态(0/1),然后让树莓派检测该设备上的状态,最后根据获取到的状态控制继电器。
1) 注册Yeelink账号
访问Yeelink的官方网站(),点击快速开始,按照步骤注册账号。
2) 添加一个设备
下面是Yeelink的官方向导:
2.1 进入用户中心

 

 

树莓派和Java一起打造远程控制电灯


2.2 增加新设备

 

 

树莓派和Java一起打造远程控制电灯

 

 

树莓派和Java一起打造远程控制电灯


2.3 增加传感器

 

 

树莓派和Java一起打造远程控制电灯

 

 

树莓派和Java一起打造远程控制电灯

 

 

树莓派和Java一起打造远程控制电灯


3) 下载Yeelink的客户端
访问Yeelink的下载页面下载手机客户端来控制开关:
打开后点击“我的Yeelink“,然后点击你的设备,使用开关来控制设备的状态。

 

 

树莓派和Java一起打造远程控制电灯


7、完整的Java代码
搭建好Yeelink平台后,我们可以用树莓派访问设备的状态链接以获得设备的当前状态,然后根据得到的状态来控制GPIO。编写程序每2秒获取一次状态,访问时间间隔不建议设置的太短。在home/pi/code/java/下新建java程序ControlLed.java,代码没有什么算法,都是基本的操作。如有不足望高手指点一二。
[java] view plain copy
在CODE上查看代码片派生到我的代码片
    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 = "《这 
    里是你的设备编号》/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的状态: 关"); 
            } 
        } 
    } 
8、总结
因为不是太懂Linux所以不知道如何将cd code/java和sudo java -classpath .:classes:/opt/pi4j/lib/'*' ControlLed命令开机的时候自动执行(谁会教我吧),所以我暂时将命令放到了记事本里面用来复制。其实本教程只是一个非常简单的实例,大家可以发挥自己的聪明才智打造自己的智能家居。

 

 

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容