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
相关产品推荐
相关产品推荐

