Pi4j优雅的控制树莓派LED灯(Java版)

Java语言控制LED灯

  • 背景
    • 材料准备
    • 1.编排线路
    • 2.Java后端代码
      • 2.1 LED 开关代码
      • 2.2 LED闪烁 + 回写日志
    • 3.前端
    • 4.视频演示

背景

最近心血来潮突然对树莓派产生了浓厚的兴趣,网上查阅很多资料都没找到好文章,讲解Java如何控制LED,有人会问玩树莓派为什么不用C语言或者Python,本人认为Java是世界上最好的语言(笔者因为懒,不想学其他语言)

材料准备

  1. 树莓派4b
  2. 面包板(1个)
  3. LED灯(1个)
  4. 电阻(1个)
  5. 杜邦线 (2根公对公)

1.编排线路

线路:  GPIO05(BCM:24) --> 电组  -->  LED正极  --->   LED负极  --> GND

如图:
Pi4j优雅的控制树莓派LED灯(Java版)_第1张图片

2.Java后端代码

功能:

  1. LED开关
  2. LED闪烁
  3. 闪烁日志回写前端

2.1 LED 开关代码

案例代码写的比较粗糙
@GetMapping("/open")
    public R open(@RequestParam(required = false) Boolean onOff){
        GpioPinDigitalOutput pinOut = PiUtils.getPinOut(5);
        pinOut.setShutdownOptions(true, PinState.LOW);
        Map<String,Object> r =new HashMap<>(5);
        if(Objects.isNull(onOff)){
            r.put("msg","LED灯未打开");
            r.put("status",false);
            r.put("actionName","开灯");
            r.put("actionCode",true);
            return R.ok(r);
        }
        if(onOff){
            pinOut.high();
          
        }else {
            pinOut.low();
        }

        if(pinOut.isHigh()){
            r.put("msg","LED灯已打开");
            r.put("status",true);
            r.put("actionName","关灯");
            r.put("actionCode",false);
            return R.ok(r);
        }
        r.put("msg","LED灯已关闭");
        r.put("status",false);
        r.put("actionName","开灯");
        r.put("actionCode",true);
        return R.ok(r);
    }

2.2 LED闪烁 + 回写日志

闪烁功能: 使用了异步 + webSocket

@GetMapping("/flicker")
    public R flicker() throws InterruptedException {
        GpioPinDigitalOutput pinOut = PiUtils.getPinOut(5);
        asyncTaskService.executeAsyncTask(30,pinOut);
        //asyncTaskService.executeAsyncTask(30,null);
        return R.ok("开启任务");
    }
@Service
public class AsyncTaskService {
    @Autowired
    private WebSocketServer webSocketServer;

    @Async
    public void executeAsyncTask(int i, GpioPinDigitalOutput pinOut) throws InterruptedException {
        for (int j = 0; j < i; j++) {
            pinOut.high();
            Thread.sleep(1000);
            pinOut.low();
            Thread.sleep(1000);
            String msg = "执行第" + (j + 1) + "闪烁任务:" + "成功";
            webSocketServer.sendInfo("log", msg);
        }

    }
}
package com.pi.webSocket;

import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

@ServerEndpoint("/webSocket/{sid}")
@Component
public class WebSocketServer {
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static AtomicInteger onlineNum = new AtomicInteger();

    //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
    private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();

    //发送消息
    public void sendMessage(Session session, String message) throws IOException {
        if(session != null){
            synchronized (session) {
                session.getBasicRemote().sendText(message);
            }
        }
    }
    //给指定用户发送信息
    public void sendInfo(String userName, String message){
        Session session = sessionPools.get(userName);
        try {
            sendMessage(session, message);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //建立连接成功调用
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "sid") String userName){
        sessionPools.put(userName, session);
        addOnlineCount();
        System.out.println(userName + "加入webSocket!当前人数为" + onlineNum);
        try {
            sendMessage(session, "与树莓派成功建立连接");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //关闭连接时调用
    @OnClose
    public void onClose(@PathParam(value = "sid") String userName){
        sessionPools.remove(userName);
        subOnlineCount();
        System.out.println(userName + "断开webSocket连接!当前人数为" + onlineNum);
    }

    //收到客户端信息
    @OnMessage
    public void onMessage(String message) throws IOException{
        message = "客户端:" + message + ",已收到";
        System.out.println(message);
        for (Session session: sessionPools.values()) {
            try {
                sendMessage(session, message);
            } catch(Exception e){
                e.printStackTrace();
                continue;
            }
        }
    }

    //错误时调用
    @OnError
    public void onError(Session session, Throwable throwable){
        System.out.println("发生错误");
        throwable.printStackTrace();
    }

    public static void addOnlineCount(){
        onlineNum.incrementAndGet();
    }

    public static void subOnlineCount() {
        onlineNum.decrementAndGet();
    }

}

3.前端

前端使用uni-app,代码请自行去gitee拉取
如图:
Pi4j优雅的控制树莓派LED灯(Java版)_第2张图片
Pi4j优雅的控制树莓派LED灯(Java版)_第3张图片
Pi4j优雅的控制树莓派LED灯(Java版)_第4张图片
Pi4j优雅的控制树莓派LED灯(Java版)_第5张图片

4.视频演示

Pi4j优雅的控制树莓派LED灯(Java版)

你可能感兴趣的:(树莓派,pi4j,java,java,web,app)