1. 程式人生 > >Arduino通過串列埠透傳ESP 13板與java程式互動

Arduino通過串列埠透傳ESP 13板與java程式互動

Arduino通過串列埠透傳ESP13板與java程式互動

這個程式最基本的想法是用java把Arduino抽象出來,忙活了好幾天,雖然沒有達到最後的想法,但是學到了很多。

Main.java


public class Main {
    public static void main(String[] args) throws InterruptedException {
        WifiModel LED=new WifiModel("192.168.31.233",9002,9002);
        WifiModel sensor=new WifiModel("192.168.31.211"
,9001,9001); sensor.setMessageListener(m->{ System.out.print(m); if(Double.parseDouble(m)<500) { model.send("on"); }else { model.send("off"); } }); } }

main方法建立了兩WifiModel物件例項,引數為IP(Arduino在區域網的IP),remoteport(Arduino設定的remotePort),senderPort(Arduino的接受port,預設和remotePort一樣)。

除此之外main方法還為sensor亮度感測器設定了一監聽器,就是把收到的訊息列印到控制檯。

下面是兩個Ardunio板子的程式碼,都插上了Diot公司的ESP13透傳模組:
LEDArduino的程式碼

String message="";
String statu="off";
String s;
boolean connected1;
void setup(){
  Serial.begin(9600);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  connected1=false;
  }

void loop(){
  while
(Serial.available()>0){ delay(2); message+=char(Serial.read()); delay(2); } if (message=="on"){ digitalWrite(3,HIGH); digitalWrite(4,LOW); statu="on"; received(); } if (message=="disconnect"){ connected1=false; received(); } if (message=="test"){ received(); } if (message=="off"){ digitalWrite(3,LOW); digitalWrite(4,LOW); statu="off"; received(); } if (message=="statu"){ Serial.print(statu); delay(50); received(); } message=""; } void received(){ Serial.print("received"); delay(5); }

SensorArduino的程式碼

 int sensorPin=1;
void setup(){
  Serial.begin(9600);
  }
void loop(){
    double val = analogRead(sensorPin);
    Serial.print(val);
    delay(500);
}

我把亮度感測器的資料端插在arduino的模擬腳1,你可以根據需要自己設定。

ESP8266透傳板看上去非常好用,其實還需要使用者自己連上wifi設定,非常不友好,後期我會寫一些更好的解決方案。
為Arduino通電,電腦上會出現可用的wifi熱點 DoitWifi_config,
開啟瀏覽器 輸入192.168.4.1
192.168.4.1
AP name就是家裡路由器的wifi名字
AP Password當然就是密碼啦
其他選項如圖所示

下面是WifiModel.java 和 MessageListener.java

WifiModel.java

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class WifiModel {
    private DatagramSocket server;
    private DatagramSocket client;
    private boolean received;
    private boolean stoped=false;
    private MessageListener listener;
    private String remoteIP;
    private int remotePort;
    public WifiModel(String remoteIP,int serverPort,int remotePort){
        try {
            this.remoteIP=remoteIP;
            this.remotePort=remotePort;
            server = new DatagramSocket(serverPort);
            client=new DatagramSocket();
        } catch (SocketException e) {
            e.printStackTrace();
        }
        startServer();
    }

    private void startServer() {
        Thread serverThread=new Thread() {
            @Override
            public void run() {
                try {
                    while (true) {
                        if(!stoped) {
                            byte[] buf = new byte[1024];
                            DatagramPacket dp = new DatagramPacket(buf, buf.length);
                            server.receive(dp); 
                            String message = new String(dp.getData(), 0, dp.getLength());
                            if(message.startsWith("received")) {
                                received=true;
                            }else
                            if(listener!=null) {
                            listener.onReceiveMessage(message);
                            }
                        }
                    }
                }catch(Exception e) {
                    e.printStackTrace();    
                }
            }
        };
        serverThread.start();
    }

    public boolean isStoped() {
        return stoped;
    }

    public void setMessageListener(MessageListener listener) {
        this.listener = listener;
    }

    public void setStoped(boolean stoped) {
        this.stoped = stoped;
    }

    public void send(String message) {
        Thread clientThread=new Thread() {
            @Override
            public void run() {
                try {
                    byte[] buf = message.getBytes();
                    DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName(remoteIP),remotePort);
                    client.send(dp);
                } catch (Exception e) {
                    throw new RuntimeException("send failure");
                }
            }
        };
        clientThread.start();
    }
    public boolean send(String message,int delay) {
        received=false;
        send(message);
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return received;
    }
}

MessageListener.java

public interface MessageListener {
    public void onReceiveMessage(String s);
}

這個程式的效果,就是亮度低時自動開燈,亮度高時自動關機。