Мытарства или опять кнопки

  1. if это не функция
    2… У меня всё отлично компилируется
    unsigned long last_millis = 0;//объявить как глобальную переменную

1.Оператор, согласен.
2. Понятно, что глобальная
Мне пишет что btnState not declare in this scope , что-то подобное

#include <Stepper.h>

const uint8_t zoomPlusBtn = 4; // пины подключения кнопок
const uint8_t zoomMinusBtn = 5;
const uint8_t focusPlusBtn = 3;
const uint8_t focusMinusBtn = 2;

const uint8_t STEPS = 200;
bool flag = false;
uint32_t btnTimer = 0;
uint32_t last_millis = 0;

Stepper zoom(STEPS, 10, 11, 12, 13);
Stepper focus(STEPS, 6, 7, 8, 9);


void setup() {
  Serial.begin(9600);
  pinMode(zoomPlusBtn, INPUT);
  pinMode(zoomMinusBtn, INPUT);
  pinMode(focusPlusBtn, INPUT);
  pinMode(focusMinusBtn, INPUT);
  zoom.setSpeed(50);
  focus.setSpeed(50);

}

void loop() {
  if (millis() - last_millis > 10) {
    last_millis = millis();

    //Serial.println(btnState);
    bool btnState[] = {digitalRead(zoomPlusBtn), digitalRead(zoomMinusBtn), digitalRead(focusPlusBtn), digitalRead(focusMinusBtn)}; //массив для опроса кнопок



    if (btnState[0] && flag && millis() - btnTimer > 200) { // если кнопка zoom+ удерживается
      btnTimer = millis();
      Serial.println("press hold+");
      zoom.step(10);
    }

    if (btnState[1] && flag && millis() - btnTimer > 200) { // если кнопка zoom- удерживается
      btnTimer = millis();
      Serial.println("press hold-");
      zoom.step(-10);
    }

    if (btnState[2] && flag && millis() - btnTimer > 200) { // если кнопка focus+ удерживается
      btnTimer = millis();
      Serial.println("press hold+");
      focus.step(10);
    }

    if (btnState[3] && flag && millis() - btnTimer > 200) { // если кнопка focus- удерживается
      btnTimer = millis();
      Serial.println("press hold-");
      focus.step(-10);
    }

    if (btnState[0] && !flag && millis() - btnTimer > 50) { // если кнопка zoom+ нажата однократно
      flag = true;
      btnTimer = millis();
      Serial.println("press+");
      zoom.step(1); //делаем шаг
    }

    if (btnState[1] && !flag && millis() - btnTimer > 50) { // если кнопка zoom- нажата однократно
      flag = true;
      btnTimer = millis();
      Serial.println("press-");
      zoom.step(-1);
    }

    if (btnState[2] && !flag && millis() - btnTimer > 50) { // если кнопка focus+ нажата однократно
      flag = true;
      btnTimer = millis();
      Serial.println("press+");
      focus.step(1); //делаем шаг
    }

    if (btnState[3] && !flag && millis() - btnTimer > 50) { // если кнопка focus- нажата однократно
      flag = true;
      btnTimer = millis();
      Serial.println("press-");
      focus.step(-1);
    }

    if (!btnState[0] && flag && millis() - btnTimer > 200) { //если кнопка zoom+ отпущена
      flag = false;
      btnTimer = millis();
      Serial.println("release");
    }

    if (!btnState[1] && flag && millis() - btnTimer > 200) { // если кнопка zoom- отпущена
      flag = false;
      btnTimer = millis();
      Serial.println("release");
    }

    if (!btnState[2] && flag && millis() - btnTimer > 200) { //если кнопка focus+ отпущена
      flag = false;
      btnTimer = millis();
      Serial.println("release");
    }

    if (!btnState[3] && flag && millis() - btnTimer > 200) { // если кнопка focus- отпущена
      flag = false;
      btnTimer = millis();
      Serial.println("release");
    }
  }
}

Попробуйте

Скетч использует 4714 байт (14%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 295 байт (14%) динамической памяти, оставляя 1753 байт для локальных переменных. Максимум: 2048 байт.

P.S. IDE иногда сама скобки добавляет, надо следить за этим

Спасибо, попробую! Еще один вопрос какой смысл опрашивать все каждые 10мс? Я понял Вы сказали, что нужно только опрашивать кнопки каждые 10мс

а вас не смущает что вы упорством, достойным лучшего примнения создаете и инициализмрете массив каждый раз при прходе лупа

Это нормальная практика работы с кнопками. Меньше глюков и дребезга. Т.е не крутить с большой скоростью опрос кнопок в loop().

P.S. пока не врубился, вроде сработал лимит на сообщения,
но, видимо уже нет

Вот вапще нет.

Ну тогда немного изменю: это нормальная , для меня , практика работы с кнопками)))

P.S. Кнопки на прерываниях я здесь не считаю, т.к. у ТС этого нет

Вообще то, если по нормальному, то пишется функция опроса кнопок, которая вызывается раз в х времени. Дребезг кнопки, обычно, до 50 мс, поэтому вызов функции желательно делать хотя бы раз в 25 мс, с тем что бы этот дребезг отсеять. Т.е., в лупе это может выглядеть так:

void loop() {
  every(1) {                //регулярно  
    uint8_t key = getKey(); //опрашиваем кнопки
    if (key == KEY_UP)      //в зависимости от нажатой...
      ...
  }
}

Глупости, дребезг отсеивается в самой функции опроса кнопки.

static bool btnState[4];

Иначе этот массив создается заново при каждом проходе лупа, а в конце уничтожается

Я и попытался создать функцию опроса кнопок отдельно, но не получается вернуть массив из функции опроса в луп. Если знаете как это сделать подскажите пожалуйста!

спасибо за подсказку!

ответь себе на такой вопрос почему именно массив и как он помогает мне опрашивать кнопки?

Как по мне, несмотря на все косяки, код ТС должен работать.
Без разницы, кнопки в loop() обрабатывать, или в отдельной функции, массив состояний или 4 отдельных переменных, это лишь варианты написания . Даже то, что массив каждый раз создаётся заново - именно здесь не критично ИМХО

код и так работает , но работает как в заголовке - мытарство

Да особо ничем, я выше писал, что хочу научится ими пользоваться, и вот как раз повод. К тому же никто ещё толком не объяснил почему не получается вернуть массив из функций, присвоив возвращаемый результат другому массиву !

Никто? Всё ещё?
Ну а как вернуть из функции то, что уничтожается сразу как функция закончила работать?

“лезвие Оккама”-че привязался к этому массиву, тебе нужно 2 функции на 2 кнопки каждая (± zoom и± focus), в лупе только опрашивать состояния портов и вызывать соотв. функцию

ну если так охота тогда for(int k=0, k<=3,k++){array1[k]=array[k];}

Да мне то это зачем? )))

звиняйте с новым форумом путаюсь