- 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];}
Да мне то это зачем? )))
звиняйте с новым форумом путаюсь