自制传感器教具:第五篇 用Flash绘制DIS实验图像
之前已经用做好的无线位移传感器做过这个实验,不过那时是将数据复制到excel表格里得到的图像。在这一篇,我们要用Flash动画实时的来绘制简谐运动的位移时间图像。
Flash图线绘制
首先来学习使用代码来绘制图线,首先先新建一个Flash文档,使用ActionScript3.0。然后直接进入动作栏开始编写程序。
***********以下是动作里的程序*******
addEventListener(Event.ENTER_FRAME, onEnterFrame);
var ly:int=0;
var tuxiang:Shape = new Shape();
//新建一个画图线(tuxiang)对象
tuxiang.graphics.lineStyle(2, 0x990000, 1);
//设置线条,第一个2表示线条宽,第二个表示颜色,第三个表示颜色的纯度
tuxiang.graphics.moveTo(100, 100);
//线条起笔位置
addChild(tuxiang);
//把tuxiang这个对象加载到场景中,这样才能看到
function onEnterFrame(event:Event):void { //每次画面加载时运行
tuxiang.graphics.lineTo(100, 100+ly);
//控制画笔画到具体的一个坐标,这里每次y坐标增加1
ly++; //ly变量每次增加1
}
**********以上为动作里的程序*******
写好后按下ctrl+enter运行程序,可以看到flash动画界面里开始自动画线了,当然比较慢,因为默认每秒图像是24幅,这样每秒只画了24像素。
接下去我们开始制作可以绘制图像的flash动画,具体硬件请使用番外篇中的无线位移传感器。由于位移传感器开机时并不会发送数据,而是在接收到字符a后开始发送数据,接收到字符b后停止发送数据,分隔字符前是位移,分隔字符后是时刻。根据这个传感器,来编写flash动画动作里的程序,另外继续绘制一个影片剪辑,之后放置在主场景中,命名为box:
*******以下是动作里的程序******
var tuxiang:Shape = new Shape();
//新建一个画图线(tuxiang)对象
tuxiang.graphics.lineStyle(2, 0x990000, 1);
//设置线条,第一个2表示线条宽,第二个表示颜色,第三个表示颜色的纯度
tuxiang.graphics.moveTo(100, 200);
//线条起笔位置
addChild(tuxiang);
//把tuxiang这个对象加载到场景中,这样才能看到
var i:int=0;
//新建一个变量i
var ztime:Number=0;
//新建一个记录接收到的初始时刻值的变量,因为接收到的时刻其实是arduino上的时间,并非运动的0时刻
var time:Number=0;
//新建一个记录运动时间的值的变量
var btime:Number=0;
//新建一个每次程序运动完后的值的变量,用于处理图像的整体移动
var buffer:String = "";
//新建一个记录收到的数据的变量
var nowtime:String;
//新建一个记录接收到的时刻数据的字符串变量,不能用于计算
var ntime:Number=0;
//新建一个记录接收到的时刻数据的变量,用于计算
var displacement:String;
//新建一个记录接收到的距离数据的字符串变量,不能用于计算
var dis:Number=0;
//新建一个记录接收到的距离数据的变量,用于计算
var zdis:Number=0;
//新建一个记录初始位置的距离值
var ndis:Number=0;
//新建一个此时位置的距离值
var endmsg:String="\n";
//接收到的数据中的结束字符
var minmsg:String=",";
//接收到的数据中的分隔字符
var _proxyAddress:String = "127.0.0.1";
//socket服务器地址,如果在本机上操作为127.0.0.1,如果作为服务器,则对应的服务器电脑的ip地址
var _proxyPort:uint = 5333;
//与socket代理服务器定义对应,这里使用serproxy作为串口转socket,需在serproxy中将所有串口的端口全定义成5333,这样这里就可以固定了
var _socket:Socket; //新建一个socket变量
_socket = new Socket(); //建立一个socket连接
_socket.addEventListener( Event.CONNECT, onConnect );
//侦听程序,当socket连接上时执行onConnect函数
_socket.addEventListener( Event.CLOSE, onClose );
//侦听程序,当socket关闭时执行onClose函数
_socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );
//侦听有无来自端口的数据,如果有数据执行onSocketData函数
_socket.addEventListener( IOErrorEvent.IO_ERROR, onIOError );
//侦听有无出错,出错时执行onIOError函数
_socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurityError );
//侦听有无安全性错误,如果有执行onSecurityError函数
_socket.endian = Endian.LITTLE_ENDIAN;
_socket.connect(_proxyAddress, _proxyPort);
//socket连接,本机的地址是“127.0.0.1”,端口号是5333,与serproxy中设置的相同
//下面的函数是主要的处理函数,所有动画程序都在里面
function onSocketData(event:ProgressEvent):void
{
var data:String = _socket.readUTFBytes(_socket.bytesAvailable);
//读取来自socket的数据
buffer += data;
//读取串口的数据,并合并到buffer字符串中
var index:int;
//新建一个记录结束字符位置的变量
var min:int;
//新建一个记录分隔字符位置的变量
while((index = buffer.indexOf(endmsg)) > -1)
//接收到endmsg时开始执行下面括号内的程序,endmsg字符即"\n"换行符,我们在Arduino每次输出数据结束时加了一个换行符,index变量记录了这个换行符在字符串中的位置
{
min=buffer.indexOf(minmsg);
//min变量记录接收到数据中的“,”的位置
displacement=buffer.substring(0,min);
//分隔号前的数据赋值为displacement变量
nowtime=buffer.substring(min+1,index);
//分隔号后的数据赋值为nowtime变量
ntime=Number(nowtime);
//将nowtime字符串变量变成用于计算的数字变量
dis=Number(displacement);
//将displacement字符串变量转换成数字
if(i<1&&ntime>0)
//如果i的值小于1并且ntime大于1执行下面的程序,由于i最初值是1,所以程序一运行就会执行下面的程序
{
ztime=ntime; //将此刻的时刻值赋值给ztime
i++; //i增加1
zdis=dis; //将此刻的位移值赋值给zdis
}
i++;
if(i>900)
//当i>900是,发送字符b给arduino,aduino会停止发送数据
{
_socket.writeUTF('b');
//发送一个字符b给Arduino,因为我们设计的位移传感器只有在接收到字符a之后才会发送数据
_socket.flush();//发送
}
time=(ntime-ztime)/10;
//由于页面长只有550,所以需要将时间进行处理,这样画线速度比较合适
if(time>300)
//从左到右画到400位置时(初始位置100+time值),需要将图像移动起来
{
tuxiang.x-=(time-btime);
//整体图像开始移动,这样图像最右端保持不变
}
if(dis<2000)
//有时超声波测距仪会出现乱码,这时可以忽略掉,只处理合理的数据
{
ndis=200+(dis-zdis)*2;
//计算坐标值
tuxiang.graphics.lineTo(100+time, ndis);
//控制画笔画到具体的一个坐标,横坐标由时间确定,纵坐标由位移确定
box.y=ndis;
//页面上的动画的坐标也有位移来确定
}
btime=time;
//一次程序结束时的时刻值,用在图像平移时
buffer=buffer.substring(index+1);
//把buffer这个变量清空,以便重新开始装入新的数据
}
}
//下面程序时处理通信建立时的
function onConnect(event:Event):void
{
trace("Socket Connected");
//连接上就输出一个消息“Socket Connected”,只在开发时观察用
_socket.writeUTF('a');
//发送一个字符a给Arduino,因为我们设计的位移传感器只有在接收到字符a之后才会发送数据
_socket.flush();//发送
}
//下面的程序是处理通信关闭时的
function onClose(event:Event):void
{
trace("Socket Closed"); //关闭时输出”Socket Closed"
}
//下面是出错时显示的消息的
function onIOError(event:IOErrorEvent):void
{
trace("IOErrorEvent : " + event.text);
}
//下面也是出错时的
function onSecurityError(event:SecurityErrorEvent):void
{
trace("SecurityErrorEvent : " + event.text);
}
*******以上为动作里的程序********
上面为具体的代码,有点长,但是其实很多代码和之前的都差不多,增加的部分并不多。希望不要被这段代码给难住,因为绘制图像是最复杂的部分了。当然这段代码只实现了最基本的功能。我把具体的flash文档共享给大家,大家可以在这个基础上做修改:
https://pan.baidu.com/s/12jHwY7lszoQXFKlTDAevmw
最后的flash动画运行效果:
上面这个动画有点简陋,下面是我稍微做了修改后的,添加了一些按钮可以控制。
链接:https://pan.baidu.com/s/1QFXIP63lAJ6U9A5fuUQkMA 密码:jdop
我把源文件也共享给大家
好了,这篇到这里就结束了。学到这里,你应该已经了解了如何使用Arduino来制作传感器教具,并且使用Flash动画来制作DIS软件,虽然我们只学了一种传感器,但是其它的也都大同小异。
下篇预告
在之前的篇章中,都是用现成的传感器, 在下一篇,我们将要开始自己动手来做一个传感器——光电门!
下一篇:传感器答辩