不断延迟移动鼠标光标,当模拟值超过 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()
来读取模拟值和点击,并使用中断来移动鼠标光标,但你的方法可能会有所不同。
我将 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()
来读取模拟值和点击,并使用中断来移动鼠标光标,但你的方法可能会有所不同。