第三節(jié) Arduino和Flash的連接——Arduino接受來自Flash的數(shù)據(jù)
上一節(jié)我們講到讓Flash接受來自Arduino的數(shù)據(jù),不過有時(shí)候我們還需要在Flash端來控制一下Arduino,例如在Flash端單擊一個(gè)按鈕來告訴Arduino開始發(fā)送或者停止發(fā)送數(shù)據(jù)。當(dāng)然也可以在Flash端單擊一個(gè)按鈕來控制Arduino端的一個(gè)電磁鐵,讓它開始斷電從而讓小鐵球開始運(yùn)動(dòng)。當(dāng)然所有這些都依賴于讓Arduino接受來自Flash端的數(shù)據(jù),下面我們就來完成一個(gè)簡(jiǎn)單的控制實(shí)驗(yàn),在Flash端放一個(gè)按鈕,單擊按鈕時(shí)改變Arduino端的一個(gè)Led等的暗亮,為了簡(jiǎn)單起見,Arduino端的Led等就用D13端口也就是用板載的Led等。
**********************************以下是Arduino端的程序******************************
//此段程序由“桐桐老爸”編寫,如要引用請(qǐng)說明出處
#define LED_PIN 13
#define lianxi '@' //定義一個(gè)來自Flash端的聯(lián)系字符,隨意定,與Flash端一樣就可以
#define dataover "$" //定義一個(gè)發(fā)送字符結(jié)束標(biāo)記,也隨意定
char incoming ; //定義一個(gè)變量,用于接收數(shù)據(jù)時(shí)用
int i=0; //定義一個(gè)變量i,用于記錄燈的狀態(tài)
void setup()
{
pinMode(LED_PIN, OUTPUT); //定義LED_PIN端口為輸出端口
for(int i = 0; i < 3; i++) //接通電源后閃3下
{ digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
delay(500);}
Serial.begin(9600); //串口開始,波特率9600
Serial.print("Arduino to flash ready!"); //連接上電腦時(shí)發(fā)送一個(gè)字符串
Serial.print(dataover); //發(fā)送結(jié)束字符
}
void loop()
{ if(Serial.available() > 0) //如果arduino接受到電腦端來的字符
{incoming = Serial.read(); //變量incoming就等于受到的字符
if(incoming == lianxi) //假如收到的字符與定義的字符相同
{if(i==0) //如果燈是滅的
{digitalWrite(LED_PIN, HIGH); //就點(diǎn)亮
i=1; } //燈的狀態(tài)量變?yōu)?
else //否則即燈是亮的
{digitalWrite(LED_PIN, LOW); //就滅燈
i=0; //燈的狀態(tài)量變?yōu)?
}
} } }
**********************************************************************************
下面我們?cè)賮砭帉慒lash端的程序,只在動(dòng)畫中放一個(gè)按鈕,單擊按鈕來發(fā)送數(shù)據(jù)。
同樣用Flash cs來新建一個(gè)Actionscript 3.0類文件(flashtoarduino),程序內(nèi)容如下,注意.as文件名也要取名為flashtoarduino.as。
*******************************以下為Actionscript 3.0類文件*********************
package
{
import flash.events.Event;
import flash.display.Sprite;
import flash.display.MovieClip;;
import flash.net.Socket;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.utils.Endian;
import flash.events.MouseEvent;
import flash.text.*;
import flash.text.TextFieldAutoSize;
public class flashtoarduino extends Sprite
{
private static const lianxi:String = "@";//定義一個(gè)與arduino聯(lián)系字符
private static const dataover:String = "$";//定義一個(gè)結(jié)束字符,注意與arduino上一樣
private var _socket:Socket;
private var _proxyAddress:String = "127.0.0.1";
private var _proxyPort:uint = 5333;
var xsarduinotime:TextField = new TextField();//新建一個(gè)名為xsarduinotime的文本框
//gettime主程序
public function flashtoarduino()
{
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); //偵聽類是否被添加到舞臺(tái),每次添加時(shí)運(yùn)行onAddedToStage
}
private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); //移除偵聽
///////////////////////按鈕繪制 /////////////////////////////////
var s:Sprite = new Sprite();
s.graphics.beginFill(0x00FF00);
s.graphics.drawRect(0,0, 50,25);
s.graphics.endFill();
addChild(s);
s.x = 200;
s.y = 200;
//下面的程序是與arduino建立連接,如果連接上了怎么樣,如果斷了怎么樣等等
s.addEventListener(MouseEvent.CLICK, onClick);
_socket = new Socket();
_socket.addEventListener( Event.CONNECT, onConnect );
_socket.addEventListener( Event.CLOSE, onClose );
_socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData ); //偵聽有無來自端口的數(shù)據(jù)
_socket.addEventListener( IOErrorEvent.IO_ERROR, onIOError );
_socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurityError );
_socket.endian = Endian.LITTLE_ENDIAN;
_socket.connect(_proxyAddress, _proxyPort);
}
//連接上了執(zhí)行
private function onConnect(event:Event):void
{
trace("Socket Connected");//連接上就發(fā)送一個(gè)消息
}
private var buffer:String = "";//定義一個(gè)字符串緩存字符
//下面程序師接受來自arduino的數(shù)據(jù),一個(gè)字母一個(gè)字母接收的
private function onSocketData(event:ProgressEvent):void
{
var data:String = _socket.readUTFBytes( _socket.bytesAvailable );
buffer += data;
var msg:String;
var index:int;
//下面是把接受到的字符拼起來
while((index = buffer.indexOf(dataover)) > -1)
{
msg = buffer.substring(0, index);
buffer = buffer.substring(index + 1);
trace("Message Received from Arduino : " + msg);
xsarduinotime.width=400; //文本框的寬度200
xsarduinotime.x=100; //文本框的位置
xsarduinotime.y=10;
xsarduinotime.text=msg; //顯示time from arduino
var format:TextFormat = new TextFormat(); //新建文字格式format
format.size=24; //文字大小24
xsarduinotime.setTextFormat(format); //將文字格式賦予xsarduinotime文本框
addChild(xsarduinotime);
}
}
//下面就是onclick程序,就是點(diǎn)擊按鈕時(shí)要做的
private function onClick(event:MouseEvent):void
{
trace("onClick");
if(!_socket.connected) //假如沒有連接上,發(fā)送你要連什么的
{
trace("You must be connected to send a command to the Arduino.");
return;
}
_socket.writeUTFBytes(lianxi);//如果連接上,就發(fā)聯(lián)系字符給arduino
_socket.flush();//發(fā)送
}
//下面定義關(guān)掉arduino時(shí),顯示Socket Closed
private function onClose(event:Event):void
{
trace("Socket Closed");
}
//下面是出錯(cuò)時(shí)顯示的消息的
private function onIOError(event:IOErrorEvent):void
{
trace("IOErrorEvent : " + event.text);
}
//下面也是出錯(cuò)時(shí)的
private function onSecurityError(event:SecurityErrorEvent):void
{
trace("SecurityErrorEvent : " + event.text);
}
}
}
************************************************************************************
好了,下面在用Flash cs新建一個(gè)actionscript3.0文件,然后保存在和上面的flashtoarduino類文件flashtoarduino.as同一個(gè)文件夾內(nèi),在屬性——類中填入flashtoarduino。這樣就大功告成了。
先連上Arduino,打開serproxy.exe,然后點(diǎn)擊Ctrl+Enter,可以看到桌面中間有一個(gè)綠色方塊,單擊它,就可以控制arduino上的燈了,試試看!