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

Arduino对接Processing实现单次按键触发单张图片显示问题咨询

功能调整方案

你需要分别修改Arduino和Processing两端的代码,核心解决两个问题:Arduino端仅在按键按下的瞬间发送一次指令(长按不重复发),Processing端收到指令后仅绘制一次图片,且不清除历史绘制内容。

1. Arduino端代码修改

修改点:

  • 增加按键状态记录变量,检测按键按下的边沿(从松开到按下的瞬间)
  • 增加按键消抖逻辑,避免物理按键抖动导致误触发
  • 仅在有效按下触发时发送一次对应指令,不会长按重复发送

修改后代码:

int switchPin = 8;
int switchPin2 = 9;
// 按键上一次状态记录
int lastState8 = LOW;
int lastState9 = LOW;
// 消抖配置(20ms消抖时间,可根据实际按键调整)
unsigned long debounceDelay = 20;
unsigned long lastDebounceTime8 = 0;
unsigned long lastDebounceTime9 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(switchPin, INPUT);
  pinMode(switchPin2, INPUT);
  pinMode(13, OUTPUT);
}

void loop(){
  int currentState8 = digitalRead(switchPin);
  int currentState9 = digitalRead(switchPin2);

  // 处理引脚8的按键
  if (currentState8 != lastState8) {
    lastDebounceTime8 = millis();
  }
  if ((millis() - lastDebounceTime8) > debounceDelay) {
    if (currentState8 == HIGH && lastState8 == LOW) {
      // 仅在按键按下瞬间发送指令
      Serial.println("1");
    }
    lastState8 = currentState8;
  }

  // 处理引脚9的按键
  if (currentState9 != lastState9) {
    lastDebounceTime9 = millis();
  }
  if ((millis() - lastDebounceTime9) > debounceDelay) {
    if (currentState9 == HIGH && lastState9 == LOW) {
      // 仅在按键按下瞬间发送指令
      Serial.println("2");
    }
    lastState9 = currentState9;
  }

  // 两键同时按下/无按键按下的逻辑可自行在此补充
  // 不需要持续发送0/3,避免占用串口带宽
}

2. Processing端代码修改

修改点:

  • 优化串口数据读取逻辑,避免换行符/空格导致的解析错误
  • 绘制完图片后立刻重置状态值,避免重复绘制同一张图
  • 保留初始背景设置,不在draw中调用background(),确保历史绘制内容不被擦除

修改后代码:

import processing.serial.*;

Serial myPort;
PImage img;
PImage img2;
float value = 0;

void setup (){
 String portName = Serial.list()[0]; // 按需修改串口号序号
 myPort = new Serial(this, portName, 9600);
 myPort.bufferUntil('\n');

 size(1920, 1080);
 // 仅初始设置一次背景,后续不再调用,保留历史内容
 background(0);
 img = loadImage("CorBe.png");
 img2 = loadImage("CorMal.png");
}

void draw (){
  // 收到有效指令1时绘制CorBe
  if (value == 1){
    println("detectado1");
    image(img, random(1900), random(1000), 50, 50);
    // 绘制完成立刻重置value,避免重复绘制
    value = 0;
  }
  // 收到有效指令2时绘制CorMal
  if (value == 2){
    println("detectado2");
    image(img2, random(1900), random(1000), 50, 50);
    // 绘制完成立刻重置value,避免重复绘制
    value = 0;
  }
}

void serialEvent (Serial myPort) {
  String input = myPort.readStringUntil('\n');
  if (input != null) {
    // 去除首尾空格/换行符后再转成数值
    input = input.trim();
    try {
      value = float(input);
    } catch (Exception e) {
      value = 0;
    }
  }
}

内容的提问来源于stack exchange,提问作者Mayeli Varela Patrón

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:45:02