智慧城市让生活更美好!
物联网  >   传感器  >  正文

自制传感器教具:第五篇 用Flash绘制DIS实验图像

  上一篇讲到Flash动画可以和Arduino进行互动,这一篇,就使用这种互动来完成一个真实的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软件,虽然我们只学了一种传感器,但是其它的也都大同小异。

  下篇预告

  在之前的篇章中,都是用现成的传感器, 在下一篇,我们将要开始自己动手来做一个传感器——光电门!

上一篇:分析影响汽车毫米波雷达传感器性能一致性的原因

下一篇:传感器答辩