You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何通过Arduino按钮控制Flash AS3跳转指定帧

需求:实现Arduino按钮反向控制Flash帧跳转

我已经完成了Flash AS3控制Arduino的功能,相关源码如下。现在需要实现反向控制:当按下Arduino引脚13连接的按钮时,让Flash跳转到并停止在帧1或帧2,恳请技术帮助。


现有可正常运行的代码

Flash端Arduino连接代码(AS3)

import flash.net.Socket;

var _socket:Socket = new Socket();
var _proxyAddress:String = "127.0.0.1";
var _proxyPort:uint = 5331;
_socket.addEventListener(Event.CONNECT, onConnect);
_socket.connect(_proxyAddress, _proxyPort);
      
function onConnect(event:Event):void{
        trace("Socket Connected");
    }

Flash控制Arduino开关的帧代码(AS3)

// 帧1代码
MovieClip(root)._socket.writeUTFBytes("f");
MovieClip(root)._socket.flush();

// 帧2代码
MovieClip(root)._socket.writeUTFBytes("n");
MovieClip(root)._socket.flush();

Flash按钮控制代码(AS3)

onBtn.addEventListener(MouseEvent.MOUSE_DOWN,btn1);
function btn1(evt:MouseEvent):void
{
    gotoAndStop(1);
}

offBtn.addEventListener(MouseEvent.MOUSE_DOWN,btn2);
function btn2(evt:MouseEvent):void
{
    gotoAndStop(2);
}

Arduino端代码

#define BULB 13
int incoming = LOW;

void setup(){
Serial.begin(57600);
Serial.println("INITALIZING");
pinMode(BULB, OUTPUT);
Serial.println("READY");
}

void loop(){
  
if(Serial.available () > LOW ){
incoming = Serial.read();

if(incoming == 'n'){
digitalWrite(BULB, LOW);
}
else if(incoming == 'f'){
digitalWrite(BULB, HIGH);
}

  }
}

反向控制实现方案

一、Arduino端代码修改

给引脚13连接按钮(建议使用内部上拉电阻简化接线),修改代码检测按钮状态并向串口发送帧跳转指令:

#define BULB 13
#define BUTTON_PIN 13  // 按钮连接至引脚13
int incoming = LOW;
int lastButtonState = HIGH;  // 内部上拉初始为高电平
int currentButtonState;
int targetFrame = 1;  // 初始跳转目标帧

void setup(){
  Serial.begin(57600);
  Serial.println("INITALIZING");
  pinMode(BULB, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // 启用内部上拉电阻
  Serial.println("READY");
}

void loop(){
  // 保留原有的Flash控制Arduino逻辑
  if(Serial.available () > LOW ){
    incoming = Serial.read();
    if(incoming == 'n'){
      digitalWrite(BULB, LOW);
    }
    else if(incoming == 'f'){
      digitalWrite(BULB, HIGH);
    }
  }

  // 检测按钮状态,发送帧跳转指令
  currentButtonState = digitalRead(BUTTON_PIN);
  if(currentButtonState != lastButtonState){
    delay(50);  // 按键消抖
    currentButtonState = digitalRead(BUTTON_PIN);
    if(currentButtonState == LOW){  // 按钮按下时电平为低
      // 交替发送帧1、帧2指令
      Serial.print(String(targetFrame));
      targetFrame = targetFrame == 1 ? 2 : 1;
    }
    lastButtonState = currentButtonState;
  }
}

二、Flash端(AS3)代码修改

给Socket添加数据接收监听,处理Arduino发来的指令实现帧跳转:

import flash.net.Socket;
import flash.events.ProgressEvent;
import flash.events.Event;

var _socket:Socket = new Socket();
var _proxyAddress:String = "127.0.0.1";
var _proxyPort:uint = 5331;
_socket.addEventListener(Event.CONNECT, onConnect);
_socket.addEventListener(ProgressEvent.SOCKET_DATA, onDataReceived);  // 新增数据接收监听
_socket.connect(_proxyAddress, _proxyPort);
      
function onConnect(event:Event):void{
        trace("Socket Connected");
    }

// 处理Arduino发来的指令
function onDataReceived(event:ProgressEvent):void{
    var receivedCmd:String = _socket.readUTFBytes(_socket.bytesAvailable);
    trace("Received from Arduino: " + receivedCmd);
    // 根据指令跳转对应帧
    switch(receivedCmd){
        case "1":
            gotoAndStop(1);
            break;
        case "2":
            gotoAndStop(2);
            break;
    }
}

关键注意事项

  • 按钮接线:一端接引脚13,另一端接GND(因启用内部上拉,无需额外电阻)
  • 确保串口波特率统一:Arduino、Flash代理工具均设为57600
  • 确认Flash代理工具正常转发串口数据至指定端口5331

内容的提问来源于stack exchange,提问作者Mohtadeen Mastoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:35:40