不断延迟移动鼠标光标,当模拟值超过 300 时单击。 Arduino Pro Micro

Move mouse cursor with delays constantly and click when analog value above 300. Arduino Pro Micro

我将 Pro Micro 用作 USB 主机,并将光标移动到屏幕上的预定义位置,延迟 5 秒。我将 AbsMouse 库用于鼠标光标的绝对位置。我想要的是,当模拟输入超过 300 时,我希望它执行 XYZ 功能。因为我使用了 5000 的延迟,所以我无法始终轮询模拟输入。

基本上,我希望光标在循环中连续移动到这些绝对位置。每当模拟值超过 300 时,它应该执行按下和释放功能。 我无法理解如何使用 Elapsed millis() 或中断。请准确说明如何在代码中完成。 帮助非常感谢。

#include <AbsMouse.h>
int sensorValue = 0;
void setup()
{
    AbsMouse.init(1920, 1080);
}

void loop()
{

    sensorValue = analogRead(A0);
    AbsMouse.move(640, 127);
    delay(5000);
    AbsMouse.move(640, 400);
    delay(5000);
    AbsMouse.move(640, 625);
    delay(5000);
    AbsMouse.move(1280, 127);
    delay(5000);
    AbsMouse.move(1280, 400);
    delay(5000);
    AbsMouse.move(1280, 625);
    delay(5000);

    if (sensorValue >= 300)
    {
        AbsMouse.press(MOUSE_LEFT);
        AbsMouse.release(MOUSE_LEFT);
    }
}

实现 5 秒的延迟,测量经过的毫秒数并在等待时读取模拟值,如下所示:

startTime = millis();
while(millis()-startTime < 5000) {
    sensorValue = analogRead(A0);
    if (sensorValue >= 300) {
        AbsMouse.press(MOUSE_LEFT);
        AbsMouse.release(MOUSE_LEFT);
    }
}

如果需要,您必须解决这两个缺点。第一个是点击事件将在值保持在 300 以上时执行(即它可以点击多次)。第二个问题是,这不是 5 秒的精确延迟,因为在 while 块内执行的代码可能会产生抖动。

正如您提到的,另一种选择是使用定时器中断来实现更精确的延迟。使用像 TimerOne 这样的库,它是这样的(灵感来自库示例并修改为每 5 秒执行一次):

#include <TimerOne.h>

void setup(void) {
  Timer1.initialize(5000000);
  Timer1.attachInterrupt(fiveSeconds);
}

void fiveSeconds(void) {
    // do stuff
}

函数 fiveSeconds 应该每 5 秒执行一次,比 millis() 方法更精确。

现在您应该向该函数添加代码,以实现您想要执行的操作。我建议使用 loop() 来读取模拟值和点击,并使用中断来移动鼠标光标,但你的方法可能会有所不同。