Arduino通过串口透传ESP 13板与java程序交互

来源:互联网 发布:数据库概论答案 编辑:程序博客网 时间:2024/06/01 08:41

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);}

这个程序的效果,就是亮度低时自动开灯,亮度高时自动关机。

阅读全文
0 0
原创粉丝点击