Постоянно перемещайте курсор мыши с задержками и нажимайте, когда аналоговое значение превышает 300. Arduino Pro Micro - PullRequest
0 голосов
/ 05 марта 2019

Я использую 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);
    }
}

1 Ответ

0 голосов
/ 06 марта 2019

Реализация задержки в 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() для считывания аналогового значения и щелчка, а также прерывание для перемещения курсора мыши, но ваш подход может быть другим.

...