我将Pro Micro用作USB主机,并以5秒钟的延迟将光标移动到屏幕上的预定义位置。我将AbsMouse库用于绝对鼠标光标位置。我想要的是,当模拟输入超过300时,我希望它执行XYZ功能。由于使用的延迟为5000,因此无法始终轮询模拟输入。
基本上,我希望光标连续循环移动到这些绝对位置。每当模拟值超过300时,它都应执行按下和释放功能。
我无法理解如何使用经过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);
}
}
答案 0 :(得分:0)
等待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()
来读取模拟值并单击,并使用中断来移动鼠标光标,但是您的方法可能有所不同。