Arduino通过串口透传ESP13板与java程序交互
ESP13是一个无线板子,配置通过热点通信
Arduino通过串口透传ESP13板与java程序交互
这个程序最基本的想法是用java把Arduino抽象出来,忙活了好几天,虽然没有达到最后的想法,但是学到了很多。
Main。javapublicclassMain{publicstaticvoidmain(String〔〕args)throwsInterruptedException{WifiModelLEDnewWifiModel(192。168。31。233,9002,9002);WifiModelsensornewWifiModel(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的代码Stringmessage;Stringstatuoff;Strings;booleanconnected1;voidsetup(){Serial。begin(9600);pinMode(3,OUTPUT);pinMode(4,OUTPUT);connected1false;}voidloop(){while(Serial。available()0){delay(2);messagechar(Serial。read());delay(2);}if(messageon){digitalWrite(3,HIGH);digitalWrite(4,LOW);statuon;received();}if(messagedisconnect){connected1false;received();}if(messagetest){received();}if(messageoff){digitalWrite(3,LOW);digitalWrite(4,LOW);statuoff;received();}if(messagestatu){Serial。print(statu);delay(50);received();}message;}voidreceived(){Serial。print(received);delay(5);}
SensorArduino的代码intsensorPin1;voidsetup(){Serial。begin(9600);}voidloop(){doublevalanalogRead(sensorPin);Serial。print(val);delay(500);}我把亮度传感器的数据端插在arduino的模拟脚1,你可以根据需要自己设置。
ESP8266透传板看上去非常好用,其实还需要用户自己连上wifi设置,非常不友好,后期我会写一些更好的解决方案。
为Arduino通电,电脑上会出现可用的wifi热点DoitWificonfig,
打开浏览器输入192。168。4。1
APname就是家里路由器的wifi名字
APPassword当然就是密码啦
其他选项如图所示
下面是WifiModel。java和MessageListener。javaWifiModel。javaimportjava。net。DatagramPacket;importjava。net。DatagramSocket;importjava。net。InetAddress;importjava。net。SocketException;publicclassWifiModel{privateDatagramSocketserver;privateDatagramSocketclient;privatebooleanreceived;privatebooleanstopedfalse;privateMessageListenerlistener;privateStringremoteIP;privateintremotePort;publicWifiModel(StringremoteIP,intserverPort,intremotePort){try{this。remoteIPremoteIP;this。remotePortremotePort;servernewDatagramSocket(serverPort);clientnewDatagramSocket();}catch(SocketExceptione){e。printStackTrace();}startServer();}privatevoidstartServer(){ThreadserverThreadnewThread(){Overridepublicvoidrun(){try{while(true){if(!stoped){byte〔〕bufnewbyte〔1024〕;DatagramPacketdpnewDatagramPacket(buf,buf。length);server。receive(dp);StringmessagenewString(dp。getData(),0,dp。getLength());if(message。startsWith(received)){receivedtrue;}elseif(listener!null){listener。onReceiveMessage(message);}}}}catch(Exceptione){e。printStackTrace();}}};serverThread。start();}publicbooleanisStoped(){returnstoped;}publicvoidsetMessageListener(MessageListenerlistener){this。listenerlistener;}publicvoidsetStoped(booleanstoped){this。stopedstoped;}publicvoidsend(Stringmessage){ThreadclientThreadnewThread(){Overridepublicvoidrun(){try{byte〔〕bufmessage。getBytes();DatagramPacketdpnewDatagramPacket(buf,buf。length,InetAddress。getByName(remoteIP),remotePort);client。send(dp);}catch(Exceptione){thrownewRuntimeException(sendfailure);}}};clientThread。start();}publicbooleansend(Stringmessage,intdelay){receivedfalse;send(message);try{Thread。sleep(delay);}catch(InterruptedExceptione){e。printStackTrace();}returnreceived;}}MessageListener。javapublicinterfaceMessageListener{publicvoidonReceiveMessage(Strings);}
这个程序的效果,就是亮度低时自动开灯,亮度高时自动关机。