文档章节

用树莓派通过Java实现远程控制电灯

亓根火柴
 亓根火柴
发布于 2014/01/02 22:39
字数 2432
阅读 1375
收藏 33

用树莓派通过Java实现远程控制电灯

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

传说,女娲娘娘炼就七根火柴,来帮助人类度过第一个冬季,从此,七根火柴散落人间,不见踪迹...

1、前言

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

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

2、准备工作

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

1) 树莓派

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


2) 电脑

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

3) 继电器

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


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

 

看到这里是不是很兴奋了,好的,依照国际惯例我们运行一个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

 

4、连接GPIO和继电器

 

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


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

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


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


下面来连接GPIO和继电器:

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


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


5、控制继电器

在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

运行结果如下图:


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

6、搭建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“,然后点击你的设备,使用开关来控制设备的状态。

 

7、完整的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的状态: 关");  
        }  
    }  
}

8、总结

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

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

传说,女娲娘娘炼就七根火柴,来帮助人类度过第一个冬季,从此,七根火柴散落人间,不见踪迹...

© 著作权归作者所有

共有 人打赏支持
亓根火柴
粉丝 1
博文 1
码字总数 2432
作品 0
枣庄
私信 提问
加载中

评论(2)

NickSoki
NickSoki

引用来自“NickSoki”的评论

树莓派链接打印机

@NickSoki 树莓派链接打印机的例子有吗?
NickSoki
NickSoki
树莓派链接打印机
树莓派使用DHT11温湿度传感器

一、相关介绍 DHT11介绍: DHT11是一款比较便宜的温湿度传感器模块。读取数据只需要占用一个IO口。能够同时测量温度和相对湿度。 DHT11的数据手册可以看这里:http://wenku.baidu.com/view/1...

李鱼跃龙门
2014/06/07
0
18
Java调用 新浪微博API 接口发微博,逐条讲解,绝对清晰

最近要做个课程设计,使用微博控制树莓派,树莓派再控制发光二极管的亮和灭,主要设计分两层,上层是用Java调用新浪微博API来实现对微博旳监听,当我的微博被回复时能够自动读取评论内容,并...

Kernel开发者
06/26
0
0
树莓派开启VNC,电脑远程实时操控树莓派桌面

一般远程控制树莓派,命令行使用SSH服务,但是有的时候,我们想远程控制树莓派的桌面。这时就要启用VNC了。 1.在树莓派上开启VNC服务: 这样在树莓派上就开启了VNC服务,开启成功后,在桌面右...

乐_然
03/07
0
0
Java控制树莓派GPIO口-Pi4J

Pi4J(http://pi4j.com/)是专门用来控制树莓派GPIO口以及通信的Java库。它有如下功能: Export & unexport GPIO pins Configure GPIO pin direction Configure GPIO pin edge detection Con......

李鱼跃龙门
2014/05/24
0
0
Windows系统监听键盘通过UDP协议控制树莓派小车

  树莓派小车硬件从淘宝买到手后已经鼓捣很长时间了,其中最喜欢的应用是控制小车运动了。我的小车控制系统在开发的过程中遇到了很多小问题,都被我一一修正了,将开发经验与大家分享,希望...

FreeBuf
07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 快捷键

快捷键图标。 官方的下载地址为:https://atlassianblog.wpengine.com/wp-content/uploads/2018/01/keyboard-shortcuts-infographics.pdf...

honeymose
29分钟前
0
0
Apache限定目录解析PHP,限制user_agent,PHP相关的配置

Apache限定目录解析PHP 配置前访问upload/index.php [root@test-a ~]# curl -x192.168.77.139:80 'www.test.com/upload/index.php'This is upload diretory 配置,/usr/local/apache2.4/......

野雪球
32分钟前
1
0
java.util.Concurrent.Exchanger源码

类图 源码: package java.util.concurrent;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent......

狼王黄师傅
今天
5
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
4
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部