RaspberryPi -使用Web控制LED亮燈與否

之前有提過RaspberryPi -串聯二個74HC595範例,範例執行時需要執行Java Application,這可以拿來當做shell指令,不過如果想遠端控制呢?

想法是利用Raspberry pi架設wifi ap,或是把pi接入區域網路,再連入tomcat server執行指令。

JSP control GPIO

PI在安裝完tomcat後,因為要使用GOIP,所以得把tomcat執行的權限及群組設成root。

可以參考Controlling the Raspberry Pi’s GPIO pins from a web browser




nano /etc/default/tomcat7
# TOMCAT7_USER=root
# TOMCAT7_GROUP=root
systemctl restart tomcat7

程式碼如下:

在控制IC時,記得每次控制完,要unprovisionPin GpioPinDigitalOutpu

package com.yslifes.ic;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.PinState;
import com.pi4j.wiringpi.Shift;
import java.lang.Thread;
/**
*
* @author Eric
*/
public class IC74CH595 {
private GpioPinDigitalOutput mr ;
private GpioPinDigitalOutput shcp ;
private GpioPinDigitalOutput stcp;
private GpioPinDigitalOutput ds;
private final GpioController gpio = GpioFactory.getInstance();;
private long ms ;
private int data;
public IC74CH595(Pin dspin,Pin mrpin,Pin stcppin,Pin shcppin)
{
mr = gpio.provisionDigitalOutputPin(mrpin,
PinState.HIGH);
ds = gpio.provisionDigitalOutputPin(dspin,
PinState.LOW);
shcp = gpio.provisionDigitalOutputPin(shcppin,
PinState.LOW);
stcp = gpio.provisionDigitalOutputPin(stcppin,
PinState.LOW);
ms = 300;
}
public void setLED(int i)
{
data = i;
stcp.setState(PinState.LOW);
Shift.shiftOut((byte)ds.getPin().getAddress(), (byte)shcp.getPin().getAddress(), (byte)Shift.MSBFIRST, (byte)(data>> 8));
Shift.shiftOut((byte) ds.getPin().getAddress(), (byte) shcp.getPin().getAddress(), (byte) Shift.MSBFIRST, (byte) data);
stcp.setState(PinState.HIGH);
delay();
}
public void shutdown()
{
gpio.shutdown();
gpio.unprovisionPin(mr);
gpio.unprovisionPin(ds);
gpio.unprovisionPin(shcp);
gpio.unprovisionPin(stcp);
}
public  void clear()
{
mr.setState(PinState.LOW);
mr.setState(PinState.HIGH);
}
private  void delay() {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
System.out.println(e.toString());
}
}
}
package com.yslifes.ic;
import com.pi4j.io.gpio.RaspiPin;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
/**
*
* @author Eric
*/
public class ICUtils {
private static Logger logger ;
static
{
logger = Logger.getLogger(ICUtils.class);
}
public static void setLED(HttpServletRequest req)
{
String[] params = {req.getParameter("p1"),req.getParameter("p2"),req.getParameter("p3"),req.getParameter("p4"),
req.getParameter("p5"),req.getParameter("p6"),req.getParameter("p7"),req.getParameter("p8"),
req.getParameter("p9"),req.getParameter("p10"),req.getParameter("p11"),req.getParameter("p12"),
req.getParameter("p13"),req.getParameter("p14"),req.getParameter("p15"),req.getParameter("p16")};
int data = 0;
for(int i=15;i>=0;i--)
{
logger.debug("i:"+i+"="+params[i] +";"+data);
if(params[i]!=null && params[i].equals("1"))
{
data += 1;
}
if(i!=0)
data = data<<1;
}
logger.debug("mydata:"+data);
IC74CH595 ic = new IC74CH595(RaspiPin.GPIO_23,RaspiPin.GPIO_27,RaspiPin.GPIO_24,RaspiPin.GPIO_25);
ic.setLED(data);
ic.shutdown();
}
}

web部份

LightLED.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
com.yslifes.ic.ICUtils.setLED(request);
%>
</body>
</html>

index.html

<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<!--<meta name="viewport" content="width=device-width, initial-scale=1.0">-->
<style type="text/css">
.btimg
{
background-image: url('Animals.jpg');
background-repeat: no-repeat;
width:200px;
height:200px;
}
input[type=checkbox]
{
width:50px;
height:50px;
}
</style>
</head>
<body>
<form action="LightLED.jsp" target="_iframe">
<table>
<tr>
<td><div class="btimg" style="background-position: -22px -22px; ">
<input type="checkbox" name="p1" value="1"></div></td>
<td><div class="btimg" style="background-position: -202px -22px; ">
<input type="checkbox" name="p2" value="1"></div></td>
<td><div class="btimg" style="background-position: -392px -22px; ">
<input type="checkbox" name="p3" value="1"></div></td>
<td><div class="btimg" style="background-position: -596px -22px; ">
<input type="checkbox" name="p4" value="1"></div></td>
<td><div class="btimg" style="background-position: -17px -202px; ">
<input type="checkbox" name="p5" value="1"></div></td>
<td><div class="btimg" style="background-position: -192px -202px; ">
<input type="checkbox" name="p6" value="1"></div></td>
<td><div class="btimg" style="background-position: -392px -202px; ">
<input type="checkbox" name="p7" value="1"></div></td>
<td><div class="btimg" style="background-position: -596px -202px; ">
<input type="checkbox" name="p8" value="1"></div></td>
</tr>
<tr>
<td><div class="btimg" style="background-position: -10px -382px; ">
<input type="checkbox" name="p9" value="1"></div></td>
<td><div class="btimg" style="background-position: -202px -382px; ">
<input type="checkbox" name="p10" value="1"></div></td>
<td><div class="btimg" style="background-position: -392px -382px; ">
<input type="checkbox" name="p11" value="1"></div></td>
<td><div class="btimg" style="background-position: -596px -382px; ">
<input type="checkbox" name="p12" value="1"></div></td>
<td><div class="btimg" style="background-position: -10px -577px; ">
<input type="checkbox" name="p13" value="1"></div></td>
<td><div class="btimg" style="background-position: -202px -577px; ">
<input type="checkbox" name="p14" value="1"></div></td>
<td><div class="btimg" style="background-position: -392px -577px; ">
<input type="checkbox" name="p15" value="1"></div></td>
<td><div class="btimg" style="background-position: -596px -577px; ">
<input type="checkbox" name="p16" value="1"></div></td>
</tr>
</table>
<div><button type="submit" style="width:100px;height:100px">亮燈</button></div>
</form>
<hr>
<form target="_iframe" action="LightLED.jsp">
<button type="submit"  style="width:100px;height:100px">清除</button>
</form>
<iframe name="_iframe" id="_iframe" frameborder="0" src="LightLED.jsp"></iframe>
</body>
</html>

選擇要亮的LED確認後Raspberry pi接收到指令就會亮燈了。

WhatsApp-Image-20160622

 

原始檔下載

 

發表迴響